Skip to content

Commit 9e181a9

Browse files
committed
Updated for other drivers, other functions, and included in tests. WIP on CGDFG
1 parent 424c23b commit 9e181a9

File tree

8 files changed

+120
-118
lines changed

8 files changed

+120
-118
lines changed

src/GraphsDFG/services/GraphsDFG.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,9 @@ Optionally specify a label regular expression to retrieves a subset of the varia
238238
function getVariables(dfg::GraphsDFG,
239239
regexFilter::Union{Nothing, Regex}=nothing;
240240
tags::Vector{Symbol}=Symbol[],
241-
solvable::Int=0 )::Vector{DFGVariable}
241+
solvable::Union{Nothing, Int}=nothing)::Vector{DFGVariable}
242242
#
243-
variables = map(v -> v.dfgNode, filter(n -> (n.dfgNode isa DFGVariable) && (solvable <= isSolvable(n.dfgNode)), Graphs.vertices(dfg.g)))
243+
variables = map(v -> v.dfgNode, filter(n -> (n.dfgNode isa DFGVariable) && (solvable != nothing ? solvable <= isSolvable(n.dfgNode) : true), Graphs.vertices(dfg.g)))
244244
# filter on solvable
245245

246246
# filter on regex
@@ -261,8 +261,8 @@ end
261261
List the DFGFactors in the DFG.
262262
Optionally specify a label regular expression to retrieves a subset of the factors.
263263
"""
264-
function getFactors(dfg::GraphsDFG, regexFilter::Union{Nothing, Regex}=nothing; solvable::Int=0)::Vector{DFGFactor}
265-
factors = map(v -> v.dfgNode, filter(n -> (n.dfgNode isa DFGFactor) && solvable <= isSolvable(n.dfgNode), Graphs.vertices(dfg.g)))
264+
function getFactors(dfg::GraphsDFG, regexFilter::Union{Nothing, Regex}=nothing; solvable::Union{Nothing, Int}=nothing)::Vector{DFGFactor}
265+
factors = map(v -> v.dfgNode, filter(n -> (n.dfgNode isa DFGFactor) && (solvable != nothing ? solvable <= isSolvable(n.dfgNode) : true), Graphs.vertices(dfg.g)))
266266

267267
if regexFilter != nothing
268268
factors = filter(f -> occursin(regexFilter, String(f.label)), factors)

src/LightDFG/services/LightDFG.jl

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,16 @@ end
194194
List the DFGVariables in the DFG.
195195
Optionally specify a label regular expression to retrieves a subset of the variables.
196196
"""
197-
function getVariables(dfg::LightDFG, regexFilter::Union{Nothing, Regex}=nothing; tags::Vector{Symbol}=Symbol[])::Vector{AbstractDFGVariable}
197+
function getVariables(dfg::LightDFG, regexFilter::Union{Nothing, Regex}=nothing; tags::Vector{Symbol}=Symbol[], solvable::Union{Nothing, Int}=nothing)::Vector{AbstractDFGVariable}
198198

199199
# variables = map(v -> v.dfgNode, filter(n -> n.dfgNode isa DFGVariable, vertices(dfg.g)))
200200
variables = collect(values(dfg.g.variables))
201201
if regexFilter != nothing
202202
variables = filter(v -> occursin(regexFilter, String(v.label)), variables)
203203
end
204+
if solvable != nothing
205+
variables = filter(v -> _isSolvable(dfg, v.label, solvable), variables)
206+
end
204207
if length(tags) > 0
205208
mask = map(v -> length(intersect(v.tags, tags)) > 0, variables )
206209
return variables[mask]
@@ -223,14 +226,15 @@ Related
223226
ls
224227
"""
225228

226-
function getVariableIds(dfg::LightDFG, regexFilter::Union{Nothing, Regex}=nothing; tags::Vector{Symbol}=Symbol[])::Vector{Symbol}
229+
function getVariableIds(dfg::LightDFG, regexFilter::Union{Nothing, Regex}=nothing; tags::Vector{Symbol}=Symbol[], solvable::Union{Nothing, Int}=nothing)::Vector{Symbol}
227230

228231
# variables = map(v -> v.dfgNode, filter(n -> n.dfgNode isa DFGVariable, vertices(dfg.g)))
229232
if length(tags) > 0
230-
return map(v -> v.label, getVariables(dfg, regexFilter, tags=tags))
233+
return map(v -> v.label, getVariables(dfg, regexFilter, tags=tags, solvable=solvable))
231234
else
232235
variables = collect(keys(dfg.g.variables))
233236
regexFilter != nothing && (variables = filter(v -> occursin(regexFilter, String(v)), variables))
237+
solvable != nothing && (variables = filter(vId -> _isSolvable(dfg, vId, solvable), variables))
234238
return variables
235239
end
236240
end
@@ -240,12 +244,15 @@ end
240244
List the DFGFactors in the DFG.
241245
Optionally specify a label regular expression to retrieves a subset of the factors.
242246
"""
243-
function getFactors(dfg::LightDFG, regexFilter::Union{Nothing, Regex}=nothing)::Vector{AbstractDFGFactor}
247+
function getFactors(dfg::LightDFG, regexFilter::Union{Nothing, Regex}=nothing; solvable::Union{Nothing, Int}=nothing)::Vector{AbstractDFGFactor}
244248
# factors = map(v -> v.dfgNode, filter(n -> n.dfgNode isa DFGFactor, vertices(dfg.g)))
245249
factors = collect(values(dfg.g.factors))
246250
if regexFilter != nothing
247251
factors = filter(f -> occursin(regexFilter, String(f.label)), factors)
248252
end
253+
if solvable != nothing
254+
factors = filter(f -> _isSolvable(dfg, f.label, solvable), factors)
255+
end
249256
return factors
250257
end
251258

@@ -254,12 +261,15 @@ end
254261
Get a list of the IDs of the DFGFactors in the DFG.
255262
Optionally specify a label regular expression to retrieves a subset of the factors.
256263
"""
257-
function getFactorIds(dfg::LightDFG, regexFilter::Union{Nothing, Regex}=nothing)::Vector{Symbol}
264+
function getFactorIds(dfg::LightDFG, regexFilter::Union{Nothing, Regex}=nothing; solvable::Union{Nothing, Int}=nothing)::Vector{Symbol}
258265
# factors = map(v -> v.dfgNode, filter(n -> n.dfgNode isa DFGFactor, vertices(dfg.g)))
259266
factors = collect(keys(dfg.g.factors))
260267
if regexFilter != nothing
261268
factors = filter(f -> occursin(regexFilter, String(f)), factors)
262269
end
270+
if solvable != nothing
271+
factors = filter(fId -> _isSolvable(dfg, fId, solvable), factors)
272+
end
263273
return factors
264274
end
265275

@@ -271,7 +281,7 @@ function isFullyConnected(dfg::LightDFG)::Bool
271281
return length(LightGraphs.connected_components(dfg.g)) == 1
272282
end
273283

274-
function _isready(dfg::LightDFG, label::Symbol, ready::Int)::Bool
284+
function _isSolvable(dfg::LightDFG, label::Symbol, ready::Int)::Bool
275285

276286
haskey(dfg.g.variables, label) && (return dfg.g.variables[label].solvable >= ready)
277287
haskey(dfg.g.factors, label) && (return dfg.g.factors[label].solvable >= ready)
@@ -294,7 +304,7 @@ end
294304
$(SIGNATURES)
295305
Retrieve a list of labels of the immediate neighbors around a given variable or factor.
296306
"""
297-
function getNeighbors(dfg::LightDFG, node::DFGNode; ready::Union{Nothing, Int}=nothing, backendset::Union{Nothing, Int}=nothing)::Vector{Symbol}
307+
function getNeighbors(dfg::LightDFG, node::DFGNode; solvable::Union{Nothing, Int}=nothing, backendset::Union{Nothing, Int}=nothing)::Vector{Symbol}
298308
label = node.label
299309
if !exists(dfg, label)
300310
error("Variable/factor with label '$(node.label)' does not exist in the factor graph")
@@ -303,7 +313,7 @@ function getNeighbors(dfg::LightDFG, node::DFGNode; ready::Union{Nothing, Int}=n
303313
neighbors_il = FactorGraphs.outneighbors(dfg.g, dfg.g.labels[label])
304314
neighbors_ll = [dfg.g.labels[i] for i in neighbors_il]
305315
# Additional filtering
306-
ready != nothing && filter!(lbl -> _isready(dfg, lbl, ready), neighbors_ll)
316+
solvable != nothing && filter!(lbl -> _isSolvable(dfg, lbl, solvable), neighbors_ll)
307317
backendset != nothing && filter!(lbl -> _isbackendset(dfg, lbl, backendset), neighbors_ll)
308318

309319
# Variable sorting (order is important)
@@ -320,15 +330,15 @@ end
320330
$(SIGNATURES)
321331
Retrieve a list of labels of the immediate neighbors around a given variable or factor specified by its label.
322332
"""
323-
function getNeighbors(dfg::LightDFG, label::Symbol; ready::Union{Nothing, Int}=nothing, backendset::Union{Nothing, Int}=nothing)::Vector{Symbol}
333+
function getNeighbors(dfg::LightDFG, label::Symbol; solvable::Union{Nothing, Int}=nothing, backendset::Union{Nothing, Int}=nothing)::Vector{Symbol}
324334
if !exists(dfg, label)
325335
error("Variable/factor with label '$(label)' does not exist in the factor graph")
326336
end
327337

328338
neighbors_il = FactorGraphs.outneighbors(dfg.g, dfg.g.labels[label])
329339
neighbors_ll = [dfg.g.labels[i] for i in neighbors_il]
330340
# Additional filtering
331-
ready != nothing && filter!(lbl -> _isready(dfg, lbl, ready), neighbors_ll)
341+
solvable != nothing && filter!(lbl -> _isSolvable(dfg, lbl, solvable), neighbors_ll)
332342
backendset != nothing && filter!(lbl -> _isbackendset(dfg, lbl, backendset), neighbors_ll)
333343

334344
# Variable sorting (order is important)
@@ -426,10 +436,10 @@ Get an adjacency matrix for the DFG, returned as a Matrix{Union{Nothing, Symbol}
426436
Rows are all factors, columns are all variables, and each cell contains either nothing or the symbol of the relating factor.
427437
The first row and first column are factor and variable headings respectively.
428438
"""
429-
function getAdjacencyMatrix(dfg::LightDFG)::Matrix{Union{Nothing, Symbol}}
439+
function getAdjacencyMatrix(dfg::LightDFG; solvable::Union{Nothing, Int}=nothing)::Matrix{Union{Nothing, Symbol}}
430440
#TODO Why does it need to be sorted?
431-
varLabels = sort(collect(keys(dfg.g.variables)))#ort(map(v->v.label, getVariables(dfg)))
432-
factLabels = sort(collect(keys(dfg.g.factors)))#sort(map(f->f.label, getFactors(dfg)))
441+
varLabels = sort(collect(getVariableIds(dfg, solvable=solvable)))#ort(map(v->v.label, getVariables(dfg)))
442+
factLabels = sort(collect(getFactorIds(dfg, solvable=solvable)))#sort(map(f->f.label, getFactors(dfg)))
433443
vDict = Dict(varLabels .=> [1:length(varLabels)...].+1)
434444

435445
adjMat = Matrix{Union{Nothing, Symbol}}(nothing, length(factLabels)+1, length(varLabels)+1)
@@ -443,9 +453,9 @@ function getAdjacencyMatrix(dfg::LightDFG)::Matrix{Union{Nothing, Symbol}}
443453
return adjMat
444454
end
445455

446-
function getAdjacencyMatrixSparse(dfg::LightDFG)::Tuple{LightGraphs.SparseMatrixCSC, Vector{Symbol}, Vector{Symbol}}
447-
varLabels = collect(keys(dfg.g.variables))
448-
factLabels = collect(keys(dfg.g.factors))
456+
function getAdjacencyMatrixSparse(dfg::LightDFG; solvable::Union{Nothing, Int}=nothing)::Tuple{LightGraphs.SparseMatrixCSC, Vector{Symbol}, Vector{Symbol}}
457+
varLabels = collect(getVariableIds(dfg, solvable=solvable))
458+
factLabels = collect(getFactorIds(dfg, solvable=solvable))
449459
varIndex = [dfg.g.labels[s] for s in varLabels]
450460
factIndex = [dfg.g.labels[s] for s in factLabels]
451461

src/SymbolDFG/SymbolDFG.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ using SparseArrays
55
using DocStringExtensions
66

77
import ...DistributedFactorGraphs: AbstractDFG, DFGNode, AbstractParams, NoSolverParams, DFGVariable, DFGFactor
8-
# import DFG functions to exstend
8+
# import DFG functions to extend
99
import ...DistributedFactorGraphs: setSolverParams,
1010
getFactor,
1111
setDescription,

src/SymbolDFG/services/SymbolDFG.jl

Lines changed: 24 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -183,13 +183,16 @@ deleteFactor!(dfg::SymbolDFG, factor::DFGFactor)::DFGFactor = deleteFactor!(dfg,
183183
List the DFGVariables in the DFG.
184184
Optionally specify a label regular expression to retrieves a subset of the variables.
185185
"""
186-
function getVariables(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing; tags::Vector{Symbol}=Symbol[])::Vector{DFGVariable}
186+
function getVariables(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing; tags::Vector{Symbol}=Symbol[], solvable::Union{Nothing, Int}=nothing)::Vector{DFGVariable}
187187

188188
# variables = map(v -> v.dfgNode, filter(n -> n.dfgNode isa DFGVariable, vertices(dfg.g)))
189189
variables = collect(values(dfg.g.variables))
190190
if regexFilter != nothing
191191
variables = filter(v -> occursin(regexFilter, String(v.label)), variables)
192192
end
193+
if solvable != nothing
194+
variables = filter(v -> _isSolvable(dfg, v.label, solvable), variables)
195+
end
193196
if length(tags) > 0
194197
mask = map(v -> length(intersect(v.tags, tags)) > 0, variables )
195198
return variables[mask]
@@ -211,27 +214,30 @@ Related
211214
212215
ls
213216
"""
214-
getVariableIds(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing; tags::Vector{Symbol}=Symbol[])::Vector{Symbol} = map(v -> v.label, getVariables(dfg, regexFilter, tags=tags))
217+
getVariableIds(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing; tags::Vector{Symbol}=Symbol[], solvable::Union{Nothing, Int}=nothing)::Vector{Symbol} = map(v -> v.label, getVariables(dfg, regexFilter, tags=tags, solvable=solvable))
215218

216219
# Alias
217220
"""
218221
$(SIGNATURES)
219222
List the DFGVariables in the DFG.
220223
Optionally specify a label regular expression to retrieves a subset of the variables.
221224
"""
222-
ls(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing; tags::Vector{Symbol}=Symbol[])::Vector{Symbol} = getVariableIds(dfg, regexFilter, tags=tags)
225+
ls(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing; tags::Vector{Symbol}=Symbol[], solvable::Union{Nothing, Int}=nothing)::Vector{Symbol} = getVariableIds(dfg, regexFilter, tags=tags, solvable=solvable)
223226

224227
"""
225228
$(SIGNATURES)
226229
List the DFGFactors in the DFG.
227230
Optionally specify a label regular expression to retrieves a subset of the factors.
228231
"""
229-
function getFactors(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing)::Vector{DFGFactor}
232+
function getFactors(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing; solvable::Union{Nothing, Int}=nothing)::Vector{DFGFactor}
230233
# factors = map(v -> v.dfgNode, filter(n -> n.dfgNode isa DFGFactor, vertices(dfg.g)))
231234
factors = collect(values(dfg.g.factors))
232235
if regexFilter != nothing
233236
factors = filter(f -> occursin(regexFilter, String(f.label)), factors)
234237
end
238+
if solvable != nothing
239+
factors = filter(f -> _isSolvable(dfg, f.label, solvable), factors)
240+
end
235241
return factors
236242
end
237243

@@ -240,23 +246,7 @@ end
240246
Get a list of the IDs of the DFGFactors in the DFG.
241247
Optionally specify a label regular expression to retrieves a subset of the factors.
242248
"""
243-
getFactorIds(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing)::Vector{Symbol} = map(f -> f.label, getFactors(dfg, regexFilter))
244-
245-
"""
246-
$(SIGNATURES)
247-
List the DFGFactors in the DFG.
248-
Optionally specify a label regular expression to retrieves a subset of the factors.
249-
"""
250-
# Alias
251-
lsf(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing)::Vector{Symbol} = getFactorIds(dfg, regexFilter)
252-
253-
"""
254-
$(SIGNATURES)
255-
Alias for getNeighbors - returns neighbors around a given node label.
256-
"""
257-
function lsf(dfg::SymbolDFG, label::Symbol)::Vector{Symbol}
258-
return getNeighbors(dfg, label)
259-
end
249+
getFactorIds(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing; solvable::Union{Nothing, Int}=nothing)::Vector{Symbol} = map(f -> f.label, getFactors(dfg, regexFilter, solvable=solvable))
260250

261251
"""
262252
$(SIGNATURES)
@@ -273,10 +263,10 @@ Checks if the graph is not fully connected, returns true if it is not contiguous
273263
"""
274264
hasOrphans(dfg::SymbolDFG)::Bool = !isFullyConnected(dfg)
275265

276-
function _isready(dfg::SymbolDFG, label::Symbol, ready::Int)::Bool
266+
function _isSolvable(dfg::SymbolDFG, label::Symbol, solvable::Int)::Bool
277267

278-
haskey(dfg.g.variables, label) && (return dfg.g.variables[label].solvable >= ready)
279-
haskey(dfg.g.factors, label) && (return dfg.g.factors[label].solvable >= ready)
268+
haskey(dfg.g.variables, label) && (return dfg.g.variables[label].solvable >= solvable)
269+
haskey(dfg.g.factors, label) && (return dfg.g.factors[label].solvable >= solvable)
280270

281271
#TODO should this be a breaking error?
282272
@error "Node not in factor or variable"
@@ -296,15 +286,15 @@ end
296286
$(SIGNATURES)
297287
Retrieve a list of labels of the immediate neighbors around a given variable or factor.
298288
"""
299-
function getNeighbors(dfg::SymbolDFG, node::DFGNode; ready::Union{Nothing, Int}=nothing, backendset::Union{Nothing, Int}=nothing)::Vector{Symbol}
289+
function getNeighbors(dfg::SymbolDFG, node::DFGNode; solvable::Union{Nothing, Int}=nothing, backendset::Union{Nothing, Int}=nothing)::Vector{Symbol}
300290
label = node.label
301291
if !haskey(dfg.g.fadjdict, label)
302292
error("Variable/factor with label '$(node.label)' does not exist in the factor graph")
303293
end
304294

305295
neighbors_ll = copy(outneighbors(dfg.g, label))
306296
# Additional filtering
307-
ready != nothing && filter!(lbl -> _isready(dfg, lbl, ready), neighbors_ll)
297+
solvable != nothing && filter!(lbl -> _isSolvable(dfg, lbl, solvable), neighbors_ll)
308298
backendset != nothing && filter!(lbl -> _isbackendset(dfg, lbl, backendset), neighbors_ll)
309299

310300
# Variable sorting (order is important)
@@ -321,14 +311,14 @@ end
321311
$(SIGNATURES)
322312
Retrieve a list of labels of the immediate neighbors around a given variable or factor specified by its label.
323313
"""
324-
function getNeighbors(dfg::SymbolDFG, label::Symbol; ready::Union{Nothing, Int}=nothing, backendset::Union{Nothing, Int}=nothing)::Vector{Symbol} where T <: DFGNode
314+
function getNeighbors(dfg::SymbolDFG, label::Symbol; solvable::Union{Nothing, Int}=nothing, backendset::Union{Nothing, Int}=nothing)::Vector{Symbol} where T <: DFGNode
325315
if !haskey(dfg.g.fadjdict, label)
326316
error("Variable/factor with label '$(label)' does not exist in the factor graph")
327317
end
328318

329319
neighbors_ll = copy(outneighbors(dfg.g, label))
330320
# Additional filtering
331-
ready != nothing && filter!(lbl -> _isready(dfg, lbl, ready), neighbors_ll)
321+
solvable != nothing && filter!(lbl -> _isSolvable(dfg, lbl, solvable), neighbors_ll)
332322
backendset != nothing && filter!(lbl -> _isbackendset(dfg, lbl, backendset), neighbors_ll)
333323

334324
# Variable sorting (order is important)
@@ -341,22 +331,6 @@ function getNeighbors(dfg::SymbolDFG, label::Symbol; ready::Union{Nothing, Int}=
341331

342332
end
343333

344-
# Aliases
345-
"""
346-
$(SIGNATURES)
347-
Retrieve a list of labels of the immediate neighbors around a given variable or factor.
348-
"""
349-
function ls(dfg::SymbolDFG, node::T)::Vector{Symbol} where T <: DFGNode
350-
return getNeighbors(dfg, node)
351-
end
352-
"""
353-
$(SIGNATURES)
354-
Retrieve a list of labels of the immediate neighbors around a given variable or factor specified by its label.
355-
"""
356-
function ls(dfg::SymbolDFG, label::Symbol)::Vector{Symbol} where T <: DFGNode
357-
return getNeighbors(dfg, label)
358-
end
359-
360334
# function _copyIntoGraph!(sourceDFG{AbstractParam,DFGVariable,DFGFactor}::SymbolDFG, destDFG{AbstractParam,DFGVariable,DFGFactor}::SymbolDFG, labels::Vector{Symbol}, includeOrphanFactors::Bool=false)::Nothing
361335
function _copyIntoGraph!(sourceDFG::SymbolDFG, destDFG::SymbolDFG, labels::Vector{Symbol}, includeOrphanFactors::Bool=false)::Nothing
362336

@@ -454,9 +428,9 @@ Get an adjacency matrix for the DFG, returned as a Matrix{Union{Nothing, Symbol}
454428
Rows are all factors, columns are all variables, and each cell contains either nothing or the symbol of the relating factor.
455429
The first row and first column are factor and variable headings respectively.
456430
"""
457-
function getAdjacencyMatrix(dfg::SymbolDFG)::Matrix{Union{Nothing, Symbol}}
458-
varLabels = map(v->v.label, getVariables(dfg))
459-
factLabels = map(f->f.label, getFactors(dfg))
431+
function getAdjacencyMatrix(dfg::SymbolDFG; solvable::Union{Nothing, Int}=nothing)::Matrix{Union{Nothing, Symbol}}
432+
varLabels = map(v->v.label, getVariables(dfg, solvable=solvable))
433+
factLabels = map(f->f.label, getFactors(dfg, solvable=solvable))
460434
vDict = Dict(varLabels .=> [1:length(varLabels)...].+1)
461435

462436
adjMat = Matrix{Union{Nothing, Symbol}}(nothing, length(factLabels)+1, length(varLabels)+1)
@@ -471,9 +445,9 @@ function getAdjacencyMatrix(dfg::SymbolDFG)::Matrix{Union{Nothing, Symbol}}
471445
end
472446

473447

474-
function getAdjacencyMatrixSparse(dfg::SymbolDFG)::Tuple{LightGraphs.SparseMatrixCSC, Vector{Symbol}, Vector{Symbol}}
475-
varLabels = collect(keys(dfg.g.variables))
476-
factLabels = collect(keys(dfg.g.factors))
448+
function getAdjacencyMatrixSparse(dfg::SymbolDFG; solvable::Union{Nothing, Int}=nothing)::Tuple{LightGraphs.SparseMatrixCSC, Vector{Symbol}, Vector{Symbol}}
449+
varLabels = getVariableIds(dfg, solvable=solvable)
450+
factLabels = getFactorIds(dfg, solvable=solvable)
477451

478452
vDict = Dict(varLabels .=> [1:length(varLabels)...])
479453

0 commit comments

Comments
 (0)