Skip to content

Reducing the contraction order optimization time (quantum circuit as an example) #58

@samuelsonric

Description

@samuelsonric

This is a copy of this issue.

original

optimizer = TreeSA(ntrials=10, niters=20, sc_target=52)
time_elapsed = @elapsed net = yao2einsum(c; initial_state=Dict(zip(1:nqubits(c), zeros(Int,nqubits(c)))), final_state=Dict(zip(1:nqubits(c), zeros(Int,nqubits(c)))), optimizer)
@info "contraction complexity: $(contraction_complexity(net)), time cost: $(time_elapsed)s"

The output is

┌ Info: contraction complexity: Time complexity: 2^67.01176482416963
│ Space complexity: 2^52.0
└ Read-write complexity: 2^58.43881862537142, time cost: 52.74190275s

improved

using AbstractTrees, CliqueTrees, Graphs, OMEinsumContractionOrders, OMEinsum

struct TestAlg{A} <: CliqueTrees.EliminationAlgorithm
    alg::A
end

function eincode2order(code::NestedEinsum{L}) where {L}
    elimination_order = Vector{L}()
    OMEinsum.isleaf(code) && return elimination_order
    
    for node in PostOrderDFS(code)
        (node isa OMEinsum.LeafString) && continue
        for id in setdiff(vcat(getixsv(node.eins)...), getiyv(node.eins))
            push!(elimination_order, id)
        end
    end
    
    return elimination_order
end

function CliqueTrees.permutation(weights::AbstractVector, graph, alg::TestAlg)
    # reduce graph
    kernel, stack, label, width = CliqueTrees.pr4(graph, lowerbound(graph))
    
    # feed reduced graph back to OMEinsumContractionOrders
    code = EinCode(maximal_cliques(kernel), Int[])
    sizes = Dict{Int, Int}(v => round(Int, 2^weights[label[v]]) for v in vertices(kernel))
    opt = optimize_code(code, sizes, alg.alg).eins
    
    # compute ordering
    append!(stack, label[eincode2order(opt)])
    return stack, invperm(stack)
end

optimizer = Treewidth(; alg=TestAlg(TreeSA(ntrials=10, niters=20, sc_target=52)))
time_elapsed = @elapsed net = yao2einsum(c; initial_state=Dict(zip(1:nqubits(c), zeros(Int,nqubits(c)))), final_state=Dict(zip(1:nqubits(c), zeros(Int,nqubits(c)))), optimizer)
@info "contraction complexity: $(contraction_complexity(net)), time cost: $(time_elapsed)s"

The output is

┌ Info: contraction complexity: Time complexity: 2^60.20080142774071
│ Space complexity: 2^52.0
└ Read-write complexity: 2^58.2827569012071, time cost: 27.224232333s

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions