@@ -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
1010Independent set problem. `kwargs` is forwarded to `optimize_code`.
1111"""
1212struct Independence{CT<: EinTypes } <: GraphProblem
1313 code:: CT
1414end
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... )
2222
2323"""
2424 MaxCut{CT<:EinTypes} <: GraphProblem
25- MaxCut(graph; openvertices=(), optmethod=:tree , kwargs...)
25+ MaxCut(graph; openvertices=(), optmethod=:greedy , kwargs...)
2626
2727Max cut problem (or spin glass problem). `kwargs` is forwarded to `optimize_code`.
2828"""
2929struct MaxCut{CT<: EinTypes } <: GraphProblem
3030 code:: CT
3131end
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... ))
3535end
3636
3737"""
3838 MaximalIndependence{CT<:EinTypes} <: GraphProblem
39- MaximalIndependence(graph; openvertices=(), optmethod=:tree , kwargs...)
39+ MaximalIndependence(graph; openvertices=(), optmethod=:greedy , kwargs...)
4040
4141Maximal independent set problem. `kwargs` is forwarded to `optimize_code`.
4242"""
4343struct MaximalIndependence{CT<: EinTypes } <: GraphProblem
4444 code:: CT
4545end
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... ))
5050end
5151
5252"""
5353 Matching{CT<:EinTypes} <: GraphProblem
54- Matching(graph; openvertices=(), optmethod=:tree , kwargs...)
54+ Matching(graph; openvertices=(), optmethod=:greedy , kwargs...)
5555
5656Vertex matching problem. `kwargs` is forwarded to `optimize_code`.
5757The 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
6565end
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... ))
7171end
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
7777K-Coloring problem. `kwargs` is forwarded to `optimize_code`.
7878"""
@@ -81,7 +81,7 @@ struct Coloring{K,CT<:EinTypes} <: GraphProblem
8181end
8282Coloring {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)
103103collect_ixs (ne:: EinCode ) = [collect (ix) for ix in getixs (ne)]
104104function 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]
107108end
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
142146end
149153bondsize (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
154158Set packing is a generalization of independent set problem to hypergraphs.
155159Calling 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... ))
173177end
0 commit comments