Skip to content

Commit fcb3212

Browse files
committed
merge
2 parents d33cec9 + cf2aa39 commit fcb3212

File tree

4 files changed

+33
-27
lines changed

4 files changed

+33
-27
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ FFTW = "1.4"
2929
LightGraphs = "1.3"
3030
Mods = "1.3"
3131
OMEinsum = "0.4, 0.5"
32-
OMEinsumContractionOrders = "0.2, 0.3, 0.4"
32+
OMEinsumContractionOrders = "0.5"
3333
Polynomials = "2.0"
3434
Primes = "0.5"
3535
Requires = "1"

src/bounding.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ function bounding_contract(@nospecialize(code::EinCode), @nospecialize(xsa), yma
9696
bounding_contract(NestedEinsum((1:length(xsa)), code), xsa, ymask, xsb; size_info=size_info)
9797
end
9898
function bounding_contract(code::NestedEinsum, @nospecialize(xsa), ymask, @nospecialize(xsb); size_info=nothing)
99-
size_dict = OMEinsum.get_size_dict(collect_ixs(code), xsa, size_info)
99+
size_dict = size_info===nothing ? Dict{OMEinsum.labeltype(code.eins),Int}() : copy(size_info)
100+
OMEinsum.get_size_dict!(code, xsa, size_dict)
100101
# compute intermediate tensors
101102
@debug "caching einsum..."
102103
c = cached_einsum(code, xsa, size_dict)
@@ -113,7 +114,8 @@ function solution_ad(@nospecialize(code::EinCode), @nospecialize(xsa), ymask; si
113114
end
114115

115116
function solution_ad(code::NestedEinsum, @nospecialize(xsa), ymask; size_info=nothing)
116-
size_dict = OMEinsum.get_size_dict(collect_ixs(code), xsa, size_info)
117+
size_dict = size_info===nothing ? Dict{OMEinsum.labeltype(code.eins),Int}() : copy(size_info)
118+
OMEinsum.get_size_dict!(code, xsa, size_dict)
117119
# compute intermediate tensors
118120
@debug "caching einsum..."
119121
c = cached_einsum(code, xsa, size_dict)

src/networks.jl

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ abstract type GraphProblem end
55

66
"""
77
Independence{CT<:EinTypes} <: GraphProblem
8-
Independence(graph; openvertices=(), optmethod=:tree, kwargs...)
8+
Independence(graph; openvertices=(), optmethod=:greedy, kwargs...)
99
1010
Independent set problem. `kwargs` is forwarded to `optimize_code`.
1111
"""
1212
struct Independence{CT<:EinTypes} <: GraphProblem
1313
code::CT
1414
end
1515

16-
function Independence(g::SimpleGraph; openvertices=(), optmethod=:tree, kwargs...)
16+
function Independence(g::SimpleGraph; openvertices=(), optmethod=:greedy, kwargs...)
1717
rawcode = EinCode(([(i,) for i in LightGraphs.vertices(g)]..., # labels for vertex tensors
1818
[minmax(e.src,e.dst) for e in LightGraphs.edges(g)]...), openvertices) # labels for edge tensors
1919
code = optimize_code(rawcode, Val(optmethod); kwargs...)
@@ -22,36 +22,36 @@ end
2222

2323
"""
2424
MaxCut{CT<:EinTypes} <: GraphProblem
25-
MaxCut(graph; openvertices=(), optmethod=:tree, kwargs...)
25+
MaxCut(graph; openvertices=(), optmethod=:greedy, kwargs...)
2626
2727
Max cut problem (or spin glass problem). `kwargs` is forwarded to `optimize_code`.
2828
"""
2929
struct MaxCut{CT<:EinTypes} <: GraphProblem
3030
code::CT
3131
end
32-
function MaxCut(g::SimpleGraph; openvertices=(), optmethod=:tree, kwargs...)
32+
function MaxCut(g::SimpleGraph; openvertices=(), optmethod=:greedy, kwargs...)
3333
rawcode = EinCode(([minmax(e.src,e.dst) for e in LightGraphs.edges(g)]...,), openvertices) # labels for edge tensors
3434
MaxCut(optimize_code(rawcode, Val(optmethod); kwargs...))
3535
end
3636

3737
"""
3838
MaximalIndependence{CT<:EinTypes} <: GraphProblem
39-
MaximalIndependence(graph; openvertices=(), optmethod=:tree, kwargs...)
39+
MaximalIndependence(graph; openvertices=(), optmethod=:greedy, kwargs...)
4040
4141
Maximal independent set problem. `kwargs` is forwarded to `optimize_code`.
4242
"""
4343
struct MaximalIndependence{CT<:EinTypes} <: GraphProblem
4444
code::CT
4545
end
4646

47-
function MaximalIndependence(g::SimpleGraph; openvertices=(), optmethod=:tree, kwargs...)
47+
function MaximalIndependence(g::SimpleGraph; openvertices=(), optmethod=:greedy, kwargs...)
4848
rawcode = EinCode(([(LightGraphs.neighbors(g, v)..., v) for v in LightGraphs.vertices(g)]...,), openvertices)
4949
MaximalIndependence(optimize_code(rawcode, Val(optmethod); kwargs...))
5050
end
5151

5252
"""
5353
Matching{CT<:EinTypes} <: GraphProblem
54-
Matching(graph; openvertices=(), optmethod=:tree, kwargs...)
54+
Matching(graph; openvertices=(), optmethod=:greedy, kwargs...)
5555
5656
Vertex matching problem. `kwargs` is forwarded to `optimize_code`.
5757
The matching polynomial adopts the first definition in wiki page: https://en.wikipedia.org/wiki/Matching_polynomial
@@ -64,15 +64,15 @@ struct Matching{CT<:EinTypes} <: GraphProblem
6464
code::CT
6565
end
6666

67-
function Matching(g::SimpleGraph; openvertices=(), optmethod=:tree, kwargs...)
67+
function Matching(g::SimpleGraph; openvertices=(), optmethod=:greedy, kwargs...)
6868
rawcode = EinCode(([(minmax(e.src,e.dst),) for e in LightGraphs.edges(g)]..., # labels for edge tensors
6969
[([minmax(i,j) for j in neighbors(g, i)]...,) for i in LightGraphs.vertices(g)]...,), openvertices) # labels for vertex tensors
7070
Matching(optimize_code(rawcode, Val(optmethod); kwargs...))
7171
end
7272

7373
"""
7474
Coloring{K,CT<:EinTypes} <: GraphProblem
75-
Coloring{K}(graph; openvertices=(), optmethod=:tree, kwargs...)
75+
Coloring{K}(graph; openvertices=(), optmethod=:greedy, kwargs...)
7676
7777
K-Coloring problem. `kwargs` is forwarded to `optimize_code`.
7878
"""
@@ -81,7 +81,7 @@ struct Coloring{K,CT<:EinTypes} <: GraphProblem
8181
end
8282
Coloring{K}(code::ET) where {K,ET<:EinTypes} = Coloring{K,ET}(code)
8383
# same network layout as independent set.
84-
Coloring{K}(g::SimpleGraph; openvertices=(), optmethod=:tree, kwargs...) where K = Coloring{K}(Independence(g; openvertices=openvertices, kwargs...).code)
84+
Coloring{K}(g::SimpleGraph; openvertices=(), optmethod=:greedy, kwargs...) where K = Coloring{K}(Independence(g; openvertices=openvertices, optmethod=optmethod, D=K, kwargs...).code)
8585

8686
"""
8787
labels(code)
@@ -103,7 +103,8 @@ end
103103
collect_ixs(ne::EinCode) = [collect(ix) for ix in getixs(ne)]
104104
function collect_ixs(ne::NestedEinsum)
105105
d = OMEinsum.collect_ixs!(ne, Dict{Int,Vector{OMEinsum.labeltype(ne.eins)}}())
106-
return [d[i] for i=1:length(d)]
106+
ks = sort!(collect(keys(d)))
107+
return @inbounds [d[i] for i in ks]
107108
end
108109

109110
"""
@@ -120,23 +121,26 @@ Optimize the contraction order.
120121
* `:sa`, the simulated annealing approach, takes kwargs [`rw_weight`, `βs`, `ntrials`, `niters`]. Check `optimize_sa` in package `OMEinsumContractionOrders`.
121122
* `:raw`, do nothing and return the raw EinCode.
122123
"""
123-
function optimize_code(@nospecialize(code::EinTypes), ::Val{optmethod}; sc_target=17, max_group_size=40, nrepeat=10, imbalances=0.0:0.001:0.8, initializer=:random, βs=0.01:0.05:10.0, ntrials=50, niters=1000, sc_weight=2.0, rw_weight=1.0) where optmethod
124-
size_dict = Dict([s=>2 for s in labels(code)])
125-
optcode = if optmethod == :kahypar
124+
function optimize_code(@nospecialize(code::EinTypes), ::Val{optmethod}; sc_target=17, max_group_size=40, nrepeat=10, imbalances=0.0:0.001:0.8, initializer=:random, βs=0.01:0.05:10.0, ntrials=50, niters=1000, sc_weight=2.0, rw_weight=1.0, D=2) where optmethod
125+
if optmethod === :raw
126+
return code
127+
end
128+
size_dict = Dict([s=>D for s in labels(code)])
129+
simplifier, code = merge_vectors(code)
130+
optcode = if optmethod === :kahypar
126131
optimize_kahypar(code, size_dict; sc_target=sc_target, max_group_size=max_group_size, imbalances=imbalances, greedy_nrepeat=nrepeat)
127-
elseif optmethod == :sa
132+
elseif optmethod === :sa
128133
optimize_sa(code, size_dict; sc_target=sc_target, max_group_size=max_group_size, βs=βs, ntrials=ntrials, niters=niters, initializer=initializer, greedy_nrepeat=nrepeat)
129-
elseif optmethod == :greedy
134+
elseif optmethod === :greedy
130135
optimize_greedy(code, size_dict; nrepeat=nrepeat)
131-
elseif optmethod == :tree
136+
elseif optmethod === :tree
132137
optimize_tree(code, size_dict; sc_target=sc_target, βs=βs, niters=niters, ntrials=ntrials, sc_weight=sc_weight, initializer=initializer, rw_weight=rw_weight)
133-
elseif optmethod == :auto
138+
elseif optmethod === :auto
134139
optimize_kahypar_auto(code, size_dict; max_group_size=max_group_size, effort=500, greedy_nrepeat=nrepeat)
135-
elseif optmethod == :raw
136-
code
137140
else
138141
ArgumentError("optimizer `$optmethod` not defined.")
139142
end
143+
optcode = embed_simplifier(optcode, simplifier)
140144
@info "time/space complexity is $(OMEinsum.timespace_complexity(optcode, size_dict))"
141145
return optcode
142146
end
@@ -149,7 +153,7 @@ end
149153
bondsize(gp::Coloring{K}) where K = K
150154

151155
"""
152-
set_packing(sets; openvertices=(), optmethod=:tree, kwargs...)
156+
set_packing(sets; openvertices=(), optmethod=:greedy, kwargs...)
153157
154158
Set packing is a generalization of independent set problem to hypergraphs.
155159
Calling this function will return you an `Independence` instance.
@@ -166,8 +170,8 @@ julia> res = best_solutions(gp; all=true)[]
166170
(2, {10010, 00110, 01100})ₜ
167171
```
168172
"""
169-
function set_packing(sets; openvertices=(), optmethod=:tree, kwargs...)
173+
function set_packing(sets; openvertices=(), optmethod=:greedy, kwargs...)
170174
n = length(sets)
171-
code = EinCode(([(i,) for i=1:n]..., [(i,j) for i=1:n,j=1:n if j>i && !isempty(sets[i] sets[j])]...), ())
175+
code = EinCode(([(i,) for i=1:n]..., [(i,j) for i=1:n,j=1:n if j>i && !isempty(sets[i] sets[j])]...), openvertices)
172176
Independence(optimize_code(code, Val(optmethod); kwargs...))
173177
end

test/configurations.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ end
3030

3131
@testset "enumerating" begin
3232
rawcode = Independence(random_regular_graph(10, 3); optmethod=:raw)
33-
optcode = Independence(optimize_code(rawcode.code; optmethod=:auto))
33+
optcode = Independence(optimize_code(rawcode.code, Val(:greedy)))
3434
for code in [rawcode, optcode]
3535
res0 = max_size(code)
3636
_, res1 = max_size_count(code)

0 commit comments

Comments
 (0)