@@ -5,55 +5,59 @@ abstract type GraphProblem end
5
5
6
6
"""
7
7
Independence{CT<:EinTypes} <: GraphProblem
8
- Independence(graph; openvertices=(), optmethod=:greedy, kwargs... )
8
+ Independence(graph; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
9
9
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.
11
12
"""
12
13
struct Independence{CT<: EinTypes } <: GraphProblem
13
14
code:: CT
14
15
end
15
16
16
- function Independence (g:: SimpleGraph ; openvertices= (), optmethod = :greedy , kwargs ... )
17
+ function Independence (g:: SimpleGraph ; openvertices= (), optimizer = GreedyMethod (), simplifier = nothing )
17
18
rawcode = EinCode (([(i,) for i in LightGraphs. vertices (g)]. .. , # labels for vertex tensors
18
19
[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 )
20
21
Independence (code)
21
22
end
22
23
23
24
"""
24
25
MaxCut{CT<:EinTypes} <: GraphProblem
25
- MaxCut(graph; openvertices=(), optmethod=:greedy, kwargs... )
26
+ MaxCut(graph; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
26
27
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.
28
30
"""
29
31
struct MaxCut{CT<: EinTypes } <: GraphProblem
30
32
code:: CT
31
33
end
32
- function MaxCut (g:: SimpleGraph ; openvertices= (), optmethod = :greedy , kwargs ... )
34
+ function MaxCut (g:: SimpleGraph ; openvertices= (), optimizer = GreedyMethod (), simplifier = nothing )
33
35
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 ))
35
37
end
36
38
37
39
"""
38
40
MaximalIndependence{CT<:EinTypes} <: GraphProblem
39
- MaximalIndependence(graph; openvertices=(), optmethod=:greedy, kwargs... )
41
+ MaximalIndependence(graph; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
40
42
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.
42
45
"""
43
46
struct MaximalIndependence{CT<: EinTypes } <: GraphProblem
44
47
code:: CT
45
48
end
46
49
47
- function MaximalIndependence (g:: SimpleGraph ; openvertices= (), optmethod = :greedy , kwargs ... )
50
+ function MaximalIndependence (g:: SimpleGraph ; openvertices= (), optimizer = GreedyMethod (), simplifier = nothing )
48
51
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 ))
50
53
end
51
54
52
55
"""
53
56
Matching{CT<:EinTypes} <: GraphProblem
54
- Matching(graph; openvertices=(), optmethod=:greedy, kwargs... )
57
+ Matching(graph; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
55
58
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.
57
61
The matching polynomial adopts the first definition in wiki page: https://en.wikipedia.org/wiki/Matching_polynomial
58
62
```math
59
63
m_G(x) := \\ sum_{k\\ geq 0}m_kx^k,
@@ -64,24 +68,25 @@ struct Matching{CT<:EinTypes} <: GraphProblem
64
68
code:: CT
65
69
end
66
70
67
- function Matching (g:: SimpleGraph ; openvertices= (), optmethod = :greedy , kwargs ... )
71
+ function Matching (g:: SimpleGraph ; openvertices= (), optimizer = GreedyMethod (), simplifier = nothing )
68
72
rawcode = EinCode (([(minmax (e. src,e. dst),) for e in LightGraphs. edges (g)]. .. , # labels for edge tensors
69
73
[([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 ))
71
75
end
72
76
73
77
"""
74
78
Coloring{K,CT<:EinTypes} <: GraphProblem
75
- Coloring{K}(graph; openvertices=(), optmethod=:greedy, kwargs... )
79
+ Coloring{K}(graph; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
76
80
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.
78
83
"""
79
84
struct Coloring{K,CT<: EinTypes } <: GraphProblem
80
85
code:: CT
81
86
end
82
87
Coloring {K} (code:: ET ) where {K,ET<: EinTypes } = Coloring {K,ET} (code)
83
88
# 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)
85
90
86
91
"""
87
92
labels(code)
@@ -100,44 +105,6 @@ function labels(code::EinTypes)
100
105
return res
101
106
end
102
107
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
-
141
108
OMEinsum. timespace_complexity (gp:: GraphProblem ) = timespace_complexity (gp. code, uniformsize (gp. code, bondsize (gp)))
142
109
143
110
for T in [:Independence , :Matching , :MaximalIndependence , :MaxCut ]
@@ -146,25 +113,28 @@ end
146
113
bondsize (gp:: Coloring{K} ) where K = K
147
114
148
115
"""
149
- set_packing(sets; openvertices=(), optmethod=:greedy, kwargs... )
116
+ set_packing(sets; openvertices=(), optimizer=GreedyMethod(), simplifier=nothing )
150
117
151
118
Set packing is a generalization of independent set problem to hypergraphs.
152
119
Calling this function will return you an `Independence` instance.
153
120
`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 .
155
122
156
123
### Example
157
124
```julia
158
125
julia> sets = [[1, 2, 5], [1, 3], [2, 4], [3, 6], [2, 3, 6]]; # each set is a vertex
159
126
160
- julia> gp = set_packing(sets; optmethod=:auto );
127
+ julia> gp = set_packing(sets);
161
128
162
129
julia> res = best_solutions(gp; all=true)[]
163
130
(2, {10010, 00110, 01100})ₜ
164
131
```
165
132
"""
166
- function set_packing (sets; openvertices= (), optmethod = :greedy , kwargs ... )
133
+ function set_packing (sets; openvertices= (), optimizer = GreedyMethod (), simplifier = nothing )
167
134
n = length (sets)
168
135
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 ))
170
137
end
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