@@ -5,55 +5,59 @@ abstract type GraphProblem end
55
66"""
77 Independence{CT<:EinTypes} <: GraphProblem
8- Independence(graph; openvertices=(), optmethod=:greedy, kwargs... )
8+ Independence(graph; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
99
10- Independent set problem. `kwargs` is forwarded to `optimize_code`.
10+ Independent set problem. `openvertices` specifies the output tensor.
11+ `optimizer` and `simplifier` are for tensor network optimization, check `optimize_code` for details.
1112"""
1213struct Independence{CT<: EinTypes } <: GraphProblem
1314 code:: CT
1415end
1516
16- function Independence (g:: SimpleGraph ; openvertices= (), optmethod = :greedy , kwargs ... )
17+ function Independence (g:: SimpleGraph ; openvertices= (), optimizer = GreedyMethod (), simplifier = nothing )
1718 rawcode = EinCode (([(i,) for i in LightGraphs. vertices (g)]. .. , # labels for vertex tensors
1819 [minmax (e. src,e. dst) for e in LightGraphs. edges (g)]. .. ), openvertices) # labels for edge tensors
19- code = optimize_code (rawcode, Val (optmethod); kwargs ... )
20+ code = _optimize_code (rawcode, uniformsize (rawcode, 2 ), optimizer, simplifier )
2021 Independence (code)
2122end
2223
2324"""
2425 MaxCut{CT<:EinTypes} <: GraphProblem
25- MaxCut(graph; openvertices=(), optmethod=:greedy, kwargs... )
26+ MaxCut(graph; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
2627
27- Max cut problem (or spin glass problem). `kwargs` is forwarded to `optimize_code`.
28+ Max cut problem (or spin glass problem).
29+ `optimizer` and `simplifier` are for tensor network optimization, check `optimize_code` for details.
2830"""
2931struct MaxCut{CT<: EinTypes } <: GraphProblem
3032 code:: CT
3133end
32- function MaxCut (g:: SimpleGraph ; openvertices= (), optmethod = :greedy , kwargs ... )
34+ function MaxCut (g:: SimpleGraph ; openvertices= (), optimizer = GreedyMethod (), simplifier = nothing )
3335 rawcode = EinCode (([minmax (e. src,e. dst) for e in LightGraphs. edges (g)]. .. ,), openvertices) # labels for edge tensors
34- MaxCut (optimize_code (rawcode, Val (optmethod); kwargs ... ))
36+ MaxCut (_optimize_code (rawcode, uniformsize (rawcode, 2 ), optimizer, simplifier ))
3537end
3638
3739"""
3840 MaximalIndependence{CT<:EinTypes} <: GraphProblem
39- MaximalIndependence(graph; openvertices=(), optmethod=:greedy, kwargs... )
41+ MaximalIndependence(graph; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
4042
41- Maximal independent set problem. `kwargs` is forwarded to `optimize_code`.
43+ Maximal independent set problem.
44+ `optimizer` and `simplifier` are for tensor network optimization, check `optimize_code` for details.
4245"""
4346struct MaximalIndependence{CT<: EinTypes } <: GraphProblem
4447 code:: CT
4548end
4649
47- function MaximalIndependence (g:: SimpleGraph ; openvertices= (), optmethod = :greedy , kwargs ... )
50+ function MaximalIndependence (g:: SimpleGraph ; openvertices= (), optimizer = GreedyMethod (), simplifier = nothing )
4851 rawcode = EinCode (([(LightGraphs. neighbors (g, v)... , v) for v in LightGraphs. vertices (g)]. .. ,), openvertices)
49- MaximalIndependence (optimize_code (rawcode, Val (optmethod); kwargs ... ))
52+ MaximalIndependence (_optimize_code (rawcode, uniformsize (rawcode, 2 ), optimizer, simplifier ))
5053end
5154
5255"""
5356 Matching{CT<:EinTypes} <: GraphProblem
54- Matching(graph; openvertices=(), optmethod=:greedy, kwargs... )
57+ Matching(graph; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
5558
56- Vertex matching problem. `kwargs` is forwarded to `optimize_code`.
59+ Vertex matching problem.
60+ `optimizer` and `simplifier` are for tensor network optimization, check `optimize_code` for details.
5761The matching polynomial adopts the first definition in wiki page: https://en.wikipedia.org/wiki/Matching_polynomial
5862```math
5963m_G(x) := \\ sum_{k\\ geq 0}m_kx^k,
@@ -64,24 +68,25 @@ struct Matching{CT<:EinTypes} <: GraphProblem
6468 code:: CT
6569end
6670
67- function Matching (g:: SimpleGraph ; openvertices= (), optmethod = :greedy , kwargs ... )
71+ function Matching (g:: SimpleGraph ; openvertices= (), optimizer = GreedyMethod (), simplifier = nothing )
6872 rawcode = EinCode (([(minmax (e. src,e. dst),) for e in LightGraphs. edges (g)]. .. , # labels for edge tensors
6973 [([minmax (i,j) for j in neighbors (g, i)]. .. ,) for i in LightGraphs. vertices (g)]. .. ,), openvertices) # labels for vertex tensors
70- Matching (optimize_code (rawcode, Val (optmethod); kwargs ... ))
74+ Matching (_optimize_code (rawcode, uniformsize (rawcode, 2 ), optimizer, simplifier ))
7175end
7276
7377"""
7478 Coloring{K,CT<:EinTypes} <: GraphProblem
75- Coloring{K}(graph; openvertices=(), optmethod=:greedy, kwargs... )
79+ Coloring{K}(graph; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
7680
77- K-Coloring problem. `kwargs` is forwarded to `optimize_code`.
81+ K-Coloring problem.
82+ `optimizer` and `simplifier` are for tensor network optimization, check `optimize_code` for details.
7883"""
7984struct Coloring{K,CT<: EinTypes } <: GraphProblem
8085 code:: CT
8186end
8287Coloring {K} (code:: ET ) where {K,ET<: EinTypes } = Coloring {K,ET} (code)
8388# same network layout as independent set.
84- Coloring {K} (g:: SimpleGraph ; openvertices= (), optmethod = :greedy , kwargs ... ) where K = Coloring {K} (Independence (g; openvertices= openvertices, optmethod = optmethod, D = K, kwargs ... ). code)
89+ Coloring {K} (g:: SimpleGraph ; openvertices= (), optimizer = GreedyMethod (), simplifier = nothing ) where K = Coloring {K} (Independence (g; openvertices= openvertices, optimizer = optimizer, simplifier = simplifier ). code)
8590
8691"""
8792 labels(code)
@@ -100,44 +105,6 @@ function labels(code::EinTypes)
100105 return res
101106end
102107
103- """
104- optimize_code(code; optmethod=:kahypar, sc_target=17, max_group_size=40, nrepeat=10, imbalances=0.0:0.001:0.8, βs=0.01:0.05:10.0, ntrials=50, niters=1000, sc_weight=2.0, rw_weight=1.0)
105-
106- Optimize the contraction order.
107-
108- * `optmethod` can be one of
109- * `:kahypar`, the kahypar + greedy approach, takes kwargs [`sc_target`, `max_group_size`, `imbalances`, `nrepeat`].
110- Check `optimize_kahypar` method in package `OMEinsumContractionOrders`.
111- * `:auto`, also the kahypar + greedy approach, but determines `sc_target` automatically. It is slower!
112- * `:greedy`, the greedy approach. Check `optimize_greedy` in package `OMEinsum`.
113- * `:tree`, the approach of running simulated annealing on expression tree, takes kwargs [`sc_target`, `sc_weight`, `rw_weight`, `βs`, `ntrials`, `niters`]. Check `optimize_tree` in package `OMEinsumContractionOrders`.
114- * `:sa`, the simulated annealing approach, takes kwargs [`rw_weight`, `βs`, `ntrials`, `niters`]. Check `optimize_sa` in package `OMEinsumContractionOrders`.
115- * `:raw`, do nothing and return the raw EinCode.
116- """
117- 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
118- if optmethod === :raw
119- return code
120- end
121- size_dict = Dict ([s=> D for s in labels (code)])
122- simplifier, code = merge_vectors (code)
123- optcode = if optmethod === :kahypar
124- optimize_kahypar (code, size_dict; sc_target= sc_target, max_group_size= max_group_size, imbalances= imbalances, greedy_nrepeat= nrepeat)
125- elseif optmethod === :sa
126- 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)
127- elseif optmethod === :greedy
128- optimize_greedy (code, size_dict; nrepeat= nrepeat)
129- elseif optmethod === :tree
130- 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)
131- elseif optmethod === :auto
132- optimize_kahypar_auto (code, size_dict; max_group_size= max_group_size, effort= 500 , greedy_nrepeat= nrepeat)
133- else
134- ArgumentError (" optimizer `$optmethod ` not defined." )
135- end
136- optcode = embed_simplifier (optcode, simplifier)
137- @info " time/space complexity is $(OMEinsum. timespace_complexity (optcode, size_dict)) "
138- return optcode
139- end
140-
141108OMEinsum. timespace_complexity (gp:: GraphProblem ) = timespace_complexity (gp. code, uniformsize (gp. code, bondsize (gp)))
142109
143110for T in [:Independence , :Matching , :MaximalIndependence , :MaxCut ]
@@ -146,25 +113,28 @@ end
146113bondsize (gp:: Coloring{K} ) where K = K
147114
148115"""
149- set_packing(sets; openvertices=(), optmethod=:greedy, kwargs... )
116+ set_packing(sets; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
150117
151118Set packing is a generalization of independent set problem to hypergraphs.
152119Calling this function will return you an `Independence` instance.
153120`sets` are a vector of vectors, each element being a vertex in the independent set problem.
154- `kwargs` is forwarded to `optimize_code`.
121+ `optimizer` and `simplifier` are for tensor network optimization, check `optimize_code` for details .
155122
156123### Example
157124```julia
158125julia> sets = [[1, 2, 5], [1, 3], [2, 4], [3, 6], [2, 3, 6]]; # each set is a vertex
159126
160- julia> gp = set_packing(sets; optmethod=:auto );
127+ julia> gp = set_packing(sets);
161128
162129julia> res = best_solutions(gp; all=true)[]
163130(2, {10010, 00110, 01100})ₜ
164131```
165132"""
166- function set_packing (sets; openvertices= (), optmethod = :greedy , kwargs ... )
133+ function set_packing (sets; openvertices= (), optimizer = GreedyMethod (), simplifier = nothing )
167134 n = length (sets)
168135 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)
169- Independence (optimize_code (code, Val (optmethod); kwargs ... ))
136+ Independence (_optimize_code (code, uniformsize (code, 2 ), optimizer, simplifier ))
170137end
138+
139+ _optimize_code (code, size_dict, optimizer:: Nothing , simplifier) = code
140+ _optimize_code (code, size_dict, optimizer, simplifier) = optimize_code (code, size_dict, optimizer, simplifier)
0 commit comments