Skip to content

Commit be2ab1f

Browse files
authored
updated solveTree_X closer to solveTree API (#968)
1 parent 38dfd7c commit be2ab1f

File tree

4 files changed

+116
-40
lines changed

4 files changed

+116
-40
lines changed

src/AdditionalUtils.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ function drawGraph(fgl::AbstractDFG;
5858
#
5959
mkpath(joinpath( "/", (split(filepath, '/')[1:(end-1)])...) )
6060

61-
@info "Writing factor graph file"
61+
@debug "Writing factor graph file"
6262
fext = split(filepath, '.')[end]
6363
fpwoext = filepath[1:(end-length(fext)-1)] # split(filepath, '.')[end-1]
6464
dotfile = fpwoext*".dot"

src/CliqStateMachineUtils.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
export setVariablePosteriorEstimates!
33
export updateCliqSolvableDims!, fetchCliqSolvableDims
44

5+
# using Serialization
56

67
"""
78
$SIGNATURES
@@ -24,6 +25,8 @@ function _dbgCSMSaveSubFG(csmc::CliqStateMachineContainer, filename::String)
2425
if !ispath(folder)
2526
mkpath(folder)
2627
end
28+
# NOTE there was a bug using saveDFG, so used serialize, left for future use
29+
# serialize(joinpath(folder, filename), csmc.cliqSubFg)
2730
DFG.saveDFG(csmc.cliqSubFg, joinpath(folder, filename))
2831
drawGraph(csmc.cliqSubFg, show=false, filepath=joinpath(folder, "$(filename).pdf"))
2932
end

src/experimental/CliqStateMachine_X-stroke.jl

Lines changed: 57 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ function initStartCliqStateMachine_X!(dfg::AbstractDFG,
1313
drawtree::Bool=false,
1414
show::Bool=false,
1515
incremental::Bool=true,
16-
limititers::Int=100,
16+
limititers::Int=20,
1717
upsolve::Bool=true,
1818
downsolve::Bool=true,
1919
recordhistory::Bool=false,
2020
delay::Bool=false,
21-
logger::SimpleLogger=SimpleLogger(Base.stdout))
21+
logger::SimpleLogger=SimpleLogger(Base.stdout),
22+
solve_progressbar=nothing)
2223

2324
# NOTE use tree and messages for operations involving children and parents
2425
children = TreeClique[]
@@ -34,7 +35,7 @@ function initStartCliqStateMachine_X!(dfg::AbstractDFG,
3435

3536
nxt = buildCliqSubgraph_X_StateMachine
3637

37-
statemachine = StateMachine{CliqStateMachineContainer}(next=nxt)
38+
statemachine = StateMachine{CliqStateMachineContainer}(next=nxt, name="cliq$(cliq.index)")
3839

3940

4041
# store statemachine and csmc in task
@@ -45,7 +46,9 @@ function initStartCliqStateMachine_X!(dfg::AbstractDFG,
4546

4647
logCSM(csmc, "Clique $(csmc.cliq.index) starting", loglevel=Logging.Info)
4748

48-
while statemachine(csmc, verbose=verbose, iterlimit=limititers, recordhistory=recordhistory); end
49+
while statemachine(csmc, verbose=verbose, iterlimit=limititers, recordhistory=recordhistory)
50+
!isnothing(solve_progressbar) && next!(solve_progressbar)
51+
end
4952

5053
return statemachine.history
5154

@@ -100,7 +103,7 @@ function waitForUp_X_StateMachine(csmc::CliqStateMachineContainer)
100103
# Blocks until data is available
101104
beliefMsg = takeBeliefMessageUp!(csmc.tree, e)
102105
beliefMessages[thisEdge] = beliefMsg
103-
logCSM(csmc, "$(csmc.cliq.index): Belief message received with status $(beliefMsg.status)")
106+
logCSM(csmc, "$(csmc.cliq.index): Belief message received with status $(beliefMsg.status)"; msgvars = keys(beliefMsg.belief))
104107
end
105108
end
106109

@@ -148,8 +151,8 @@ function doCliqUpSolveInitialized!(csmc::CliqStateMachineContainer)
148151
logCSM(csmc, "8g, doCliqUpSolveInitialized_StateMachine -- clique status = $(status)")
149152
setCliqDrawColor(csmc.cliq, "red")
150153
# get Dict{Symbol, TreeBelief} of all updated variables in csmc.cliqSubFg
151-
retdict = approxCliqMarginalUp!(csmc; iters=4, logger=csmc.logger)
152-
# retdict = approxCliqMarginalUp!(csmc, LikelihoodMessage[]; iters=4)#, logger=csmc.logger)
154+
# retdict = approxCliqMarginalUp!(csmc; iters=4, logger=csmc.logger)
155+
retdict = approxCliqMarginalUp!(csmc, LikelihoodMessage[]; iters=4, logger=csmc.logger)
153156

154157
logCSM(csmc, "aproxCliqMarginalUp!"; retdict=retdict)
155158

@@ -159,7 +162,6 @@ function doCliqUpSolveInitialized!(csmc::CliqStateMachineContainer)
159162

160163
# notify of results (part of #459 consolidation effort)
161164
getCliqueData(csmc.cliq).upsolved = true
162-
status = :upsolved
163165

164166
# go to 8h
165167
return nothing
@@ -180,15 +182,21 @@ function solveUp_X_StateMachine(csmc::CliqStateMachineContainer)
180182
opts = getSolverParams(csmc.dfg)
181183

182184
# add message factors from upRx: cached messages taken from children saved in this clique
183-
upmsg = addMsgFactors!(csmc.cliqSubFg, messages(csmc.cliq).upRx, UpwardPass)
184-
logCSM(csmc, "adding messages for up"; upmsg=[m.label for m in upmsg])
185+
addMsgFactors!(csmc.cliqSubFg, messages(csmc.cliq).upRx, UpwardPass)
186+
logCSM(csmc, "messages for up"; upmsg=lsf(csmc.cliqSubFg, tags=[:LIKELIHOODMESSAGE]))
185187

186188
# store the cliqSubFg for later debugging
187189
_dbgCSMSaveSubFG(csmc, "fg_beforeupsolve")
188190

189191
#UPSOLVE here
190192
all_child_status = map(msg -> msg.status, values(messages(csmc.cliq).upRx))
191193

194+
if all(all_child_status .== :UPSOLVED) && !areCliqVariablesAllInitialized(csmc.cliqSubFg, csmc.cliq)
195+
logCSM(csmc, "All children upsolved, not init, try init then upsolve"; c=csmc.cliqKey)
196+
varorder = getCliqVarInitOrderUp(csmc.tree, csmc.cliq)
197+
someInit = cycleInitByVarOrder!(csmc.cliqSubFg, varorder, logger=csmc.logger)
198+
end
199+
192200
if all(all_child_status .== :UPSOLVED) && areCliqVariablesAllInitialized(csmc.cliqSubFg, csmc.cliq)
193201
logCSM(csmc, "X-3 doing upSolve -- all initialized")
194202

@@ -199,6 +207,27 @@ function solveUp_X_StateMachine(csmc::CliqStateMachineContainer)
199207
converged_and_happy = true
200208

201209
elseif !areCliqVariablesAllInitialized(csmc.cliqSubFg, csmc.cliq)
210+
211+
# FIXME experimental init to whatever is in frontals
212+
# should work if linear manifold
213+
# hardcoded off
214+
linear_on_manifold = false
215+
init_for_differential = begin
216+
allvars = getVariables(csmc.cliqSubFg)
217+
any_init = any(isInitialized.(allvars))
218+
is_root = isempty(getEdgesParent(csmc.tree, csmc.cliq))
219+
logCSM(csmc, "init_for_differential: "; c=csmc.cliqKey, is_root=is_root, any_init=any_init)
220+
linear_on_manifold && !is_root && !any_init
221+
end
222+
223+
if init_for_differential
224+
frontal_vars = getVariable.(csmc.cliqSubFg, getCliqFrontalVarIds(csmc.cliq))
225+
filter!(!isInitialized, frontal_vars)
226+
foreach(fvar->getSolverData(fvar).initialized = true, frontal_vars)
227+
logCSM(csmc, "init_for_differential: "; c=csmc.cliqKey,lbl=getLabel.(frontal_vars))
228+
end
229+
## END experimental
230+
202231
setCliqDrawColor(csmc.cliq, "green")
203232

204233
logCSM(csmc, "X-3, Trying up init -- all not initialized"; c=csmc.cliqKey)
@@ -209,11 +238,23 @@ function solveUp_X_StateMachine(csmc::CliqStateMachineContainer)
209238
# is clique fully upsolved or only partially?
210239
# print out the partial init status of all vars in clique
211240
printCliqInitPartialInfo(csmc.cliqSubFg, csmc.cliq, csmc.logger)
212-
logCSM(csmc, "X-3, tryInitCliq_StateMachine -- someInit=$someInit, varorder=$varorder"; c=csmc.cliqKey)
241+
logCSM(csmc, "X-3, solveUp_X try init -- someInit=$someInit, varorder=$varorder"; c=csmc.cliqKey)
242+
243+
someInit ? setCliqDrawColor(csmc.cliq, "darkgreen") : setCliqDrawColor(csmc.cliq, "lightgreen")
213244

214245
solveStatus = someInit ? :INIT : :NO_INIT
215246
converged_and_happy = true
216-
247+
248+
## FIXME init to whatever is in frontals
249+
# set frontals init back to false
250+
if init_for_differential #experimental_sommer_init_to_whatever_is_in_frontals
251+
foreach(fvar->getSolverData(fvar).initialized = false, frontal_vars)
252+
if someInit
253+
solveStatus = :UPSOLVED
254+
end
255+
end
256+
## END EXPERIMENTAL
257+
217258
else
218259
setCliqDrawColor(csmc.cliq, "brown")
219260
logCSM(csmc, "X-3, we are initialized but children need to init, don't do anything")
@@ -247,7 +288,9 @@ function solveUp_X_StateMachine(csmc::CliqStateMachineContainer)
247288
end
248289

249290
#fill in belief
250-
beliefMsg = prepCliqInitMsgsUp(csmc.cliqSubFg, csmc.cliq, solveStatus, logger=csmc.logger)
291+
beliefMsg = prepCliqueMsgUpConsolidated(csmc.cliqSubFg, csmc.cliq, solveStatus, logger=csmc.logger)
292+
293+
logCSM(csmc, "X-3, prepCliqueMsgUpConsolidated", msgon=keys(beliefMsg.belief), beliefMsg=beliefMsg)
251294

252295
setCliqueStatus!(csmc.cliq, solveStatus)
253296

@@ -365,6 +408,7 @@ function tryDownInit_X_StateMachine(csmc::CliqStateMachineContainer)
365408
deleteMsgFactors!(csmc.cliqSubFg, msgfcts) # msgfcts # TODO, use tags=[:LIKELIHOODMESSAGE], see #760
366409
logCSM(csmc, "tryDownInit_X_StateMachine - removing factors, length=$(length(msgfcts))")
367410

411+
someInit ? setCliqDrawColor(csmc.cliq, "seagreen") : setCliqDrawColor(csmc.cliq, "khaki")
368412

369413
else
370414
solveStatus = getCliqueStatus(csmc.cliq)

src/experimental/SolveTree_X.jl

Lines changed: 55 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11

22
function solveTree_X!(dfgl::AbstractDFG,
33
oldtree::AbstractBayesTree=emptyBayesTree();
4+
timeout::Union{Nothing, <:Real}=nothing,
45
storeOld::Bool=false,
56
verbose::Bool=false,
7+
verbosefid=stdout,
68
delaycliqs::Vector{Symbol}=Symbol[],
79
recordcliqs::Vector{Symbol}=Symbol[],
810
limititercliqs::Vector{Pair{Symbol, Int}}=Pair{Symbol, Int}[],
11+
injectDelayBefore::Union{Nothing,Vector{<:Pair{Int,<:Pair{<:Function, <:Real}}}}=nothing,
912
skipcliqids::Vector{Symbol}=Symbol[],
1013
maxparallel::Union{Nothing, Int}=nothing,
1114
variableOrder::Union{Nothing, Vector{Symbol}}=nothing,
1215
variableConstraints::Vector{Symbol}=Symbol[],
1316
smtasks::Vector{Task}=Task[],
17+
dotreedraw = Int[1;],
1418
runtaskmonitor::Bool=true,
19+
algorithm::Symbol=:default,
1520
multithread::Bool=false)
1621
#
17-
global dotreedraw
1822
# workaround in case isolated variables occur
1923
ensureSolvable!(dfgl)
2024
opt = getSolverParams(dfgl)
@@ -24,25 +28,28 @@ function solveTree_X!(dfgl::AbstractDFG,
2428

2529
# depcrecation
2630
if maxparallel !== nothing
27-
@warn "maxparallel keyword is deprecated, use getSolverParams(fg).maxincidence instead."
31+
@warn "`maxparallel` keyword is deprecated, use `getSolverParams(fg).maxincidence` instead."
2832
opt.maxincidence = maxparallel
2933
end
3034

3135
# update worker pool incase there are more or less
3236
setWorkerPool!()
3337
if opt.multiproc && nprocs() == 1
34-
@warn "Cannot use multiproc with only one process, setting `.multiproc=false`."
38+
@info "Setting `.multiproc=false` since `Distributed.nprocs() == 1`"
3539
opt.multiproc = false
3640
end
3741

3842
if opt.graphinit
39-
@info "ensure all initialized (using graphinit)"
43+
@info "Ensure variables are all initialized (graphinit)"
4044
ensureAllInitialized!(dfgl)
45+
if algorithm==:parametric
46+
@warn "Parametric is using default graphinit"
47+
initParametricFrom(dfgl)
48+
end
4149
end
42-
4350
# construct tree
4451
@info "Solving over the Bayes (Junction) tree."
45-
52+
4653
hist = Dict{Int, Vector{Tuple{DateTime, Int, Function, CliqStateMachineContainer}}}()
4754

4855
if opt.isfixedlag
@@ -66,25 +73,45 @@ function solveTree_X!(dfgl::AbstractDFG,
6673
orderMethod = 0 < length(variableConstraints) ? :ccolamd : :qr
6774

6875
# current incremental solver builds a new tree and matches against old tree for recycling.
69-
tree = wipeBuildNewTree!(dfgl, variableOrder=variableOrder, drawpdf=opt.drawtree, show=opt.showtree,ensureSolvable=false,filepath=joinpath(opt.logpath,"bt.pdf"), variableConstraints=variableConstraints, ordering=orderMethod)
76+
tree = resetBuildTree!(dfgl, variableOrder=variableOrder, drawpdf=opt.drawtree, show=opt.showtree,ensureSolvable=false,filepath=joinpath(opt.logpath,"bt.pdf"), variableConstraints=variableConstraints, ordering=orderMethod)
7077
# setAllSolveFlags!(tree, false)
7178

7279
initTreeMessageChannels!(tree)
7380

7481
# if desired, drawtree in a loop
75-
treetask, dotreedraw = drawTreeAsyncLoop(tree, opt)
82+
treetask, _dotreedraw = drawTreeAsyncLoop(tree, opt; dotreedraw = dotreedraw)
7683

7784
@info "Do tree based init-inference on tree"
78-
if opt.async
79-
error("not implemented")
80-
smtasks = asyncTreeInferUp!(dfgl, tree, oldtree=oldtree, N=opt.N, verbose=verbose, drawtree=opt.drawtree, recordcliqs=recordcliqs, limititers=opt.limititers, downsolve=opt.downsolve, incremental=opt.incremental, skipcliqids=skipcliqids, delaycliqs=delaycliqs, limititercliqs=limititercliqs )
81-
@info "Tree based init-inference progressing asynchronously, check all CSM clique tasks for completion."
82-
else
83-
# smtasks, hist = taskSolveTree_X!(dfgl, tree; alltasks=smtasks, oldtree=oldtree, N=opt.N, verbose=verbose, drawtree=opt.drawtree, recordcliqs=recordcliqs, limititers=opt.limititers, downsolve=opt.downsolve, incremental=opt.incremental, skipcliqids=skipcliqids, delaycliqs=delaycliqs, limititercliqs=limititercliqs, runtaskmonitor=runtaskmonitor )
84-
smtasks, hist = taskSolveTree_X!(dfgl, tree; multithread=multithread, alltasks=smtasks, oldtree=oldtree, verbose=verbose, drawtree=opt.drawtree, recordcliqs=recordcliqs, limititers=opt.limititers, downsolve=opt.downsolve, incremental=opt.incremental, skipcliqids=skipcliqids, delaycliqs=delaycliqs )
85-
@info "Finished tree based init-inference"
85+
86+
# choose algorithm
87+
if algorithm == :parametric
88+
@error "Under development, do not use, see #539"
89+
storeOld && @error("parametric storeOld keyword not wired up yet.")
90+
initTreeMessageChannels!(tree)
91+
alltasks, hist = taskSolveTreeParametric!(dfgl, tree; smtasks=smtasks, oldtree=tree, verbose=verbose, drawtree=opt.drawtree, recordcliqs=recordcliqs, limititers=opt.limititers, incremental=opt.incremental, skipcliqids=skipcliqids, delaycliqs=delaycliqs, multithread=multithread )
92+
@info "Finished tree based Parametric inference"
93+
elseif true # algorithm == :experimental
94+
if opt.async
95+
error("not implemented")
96+
else
97+
# smtasks, hist = taskSolveTree_X!(dfgl, tree; alltasks=smtasks, oldtree=oldtree, N=opt.N, verbose=verbose, drawtree=opt.drawtree, recordcliqs=recordcliqs, limititers=opt.limititers, downsolve=opt.downsolve, incremental=opt.incremental, skipcliqids=skipcliqids, delaycliqs=delaycliqs, limititercliqs=limititercliqs, runtaskmonitor=runtaskmonitor )
98+
smtasks, hist = taskSolveTree_X!(dfgl, tree ; multithread=multithread, alltasks=smtasks, oldtree=oldtree, verbose=verbose, drawtree=opt.drawtree, recordcliqs=recordcliqs, limititers=opt.limititers, downsolve=opt.downsolve, incremental=opt.incremental, skipcliqids=skipcliqids, delaycliqs=delaycliqs)
99+
# smtasks, hist = initInferTreeUp!(dfgl, tree, timeout; alltasks=smtasks, oldtree=oldtree, N=opt.N, verbose=verbose, verbosefid=verbosefid, drawtree=opt.drawtree, recordcliqs=recordcliqs, limititers=opt.limititers, downsolve=opt.downsolve, incremental=opt.incremental, skipcliqids=skipcliqids, delaycliqs=delaycliqs, limititercliqs=limititercliqs, injectDelayBefore=injectDelayBefore, runtaskmonitor=runtaskmonitor)
100+
@info "Finished tree based init-inference"
101+
end
102+
else #fall back is :default
103+
if opt.async
104+
smtasks = asyncTreeInferUp!(dfgl, tree, timeout, oldtree=oldtree, N=opt.N, verbose=verbose, verbosefid=verbosefid, drawtree=opt.drawtree, recordcliqs=recordcliqs, limititers=opt.limititers, downsolve=opt.downsolve, incremental=opt.incremental, skipcliqids=skipcliqids, delaycliqs=delaycliqs, limititercliqs=limititercliqs, injectDelayBefore=injectDelayBefore )
105+
@info "Tree based init-inference progressing asynchronously, check all CSM clique tasks for completion."
106+
else
107+
108+
smtasks, hist = initInferTreeUp!(dfgl, tree, timeout; alltasks=smtasks, oldtree=oldtree, N=opt.N, verbose=verbose, verbosefid=verbosefid, drawtree=opt.drawtree, recordcliqs=recordcliqs, limititers=opt.limititers, downsolve=opt.downsolve, incremental=opt.incremental, skipcliqids=skipcliqids, delaycliqs=delaycliqs, limititercliqs=limititercliqs, injectDelayBefore=injectDelayBefore, runtaskmonitor=runtaskmonitor)
109+
110+
@info "Finished tree based init-inference"
111+
end
86112
end
87-
113+
114+
88115
# NOTE copy of data from new tree in to replace outisde oldtree
89116
oldtree.bt = tree.bt
90117
oldtree.btid = tree.btid
@@ -104,8 +131,7 @@ function solveTree_X!(dfgl::AbstractDFG,
104131

105132
# if debugging and not async then also print the CSMHistory
106133
if opt.dbg && !opt.async
107-
#FIXME
108-
# printCliqHistorySequential(hist, joinLogPath(dfgl,"HistoryCSMAll.txt") )
134+
printCliqHistorySequential(hist, nothing, joinLogPath(dfgl,"HistoryCSMAll.txt") )
109135
end
110136

111137
return oldtree, smtasks, hist
@@ -127,10 +153,7 @@ function taskSolveTree_X!(dfg::AbstractDFG,
127153
alltasks = Task[])
128154
#
129155
# revert :downsolved status to :initialized in preparation for new upsolve
130-
#TODO JT die ene lyk reg
131156
resetTreeCliquesForUpSolve!(treel)
132-
#TODO JT needs to be updated
133-
# setTreeCliquesMarginalized!(dfg, treel)
134157

135158
drawtree ? drawTree(treel, show=true, filepath=joinpath(getSolverParams(dfg).logpath,"bt.pdf")) : nothing
136159

@@ -140,6 +163,9 @@ function taskSolveTree_X!(dfg::AbstractDFG,
140163

141164
resize!(alltasks, getNumCliqs(treel))
142165

166+
approx_iters = getNumCliqs(treel)*20
167+
solve_progressbar = ProgressUnknown("Solve Progress: approx max $approx_iters, at iter")
168+
143169
if !isTreeSolved(treel, skipinitialized=true)
144170
@sync begin
145171
monitortask = IIF.monitorCSMs(treel, alltasks)
@@ -148,9 +174,9 @@ function taskSolveTree_X!(dfg::AbstractDFG,
148174
scsym = getCliqFrontalVarIds(getClique(treel, i))
149175
if length(intersect(scsym, skipcliqids)) == 0
150176
if multithread
151-
alltasks[i] = Threads.@spawn tryCliqStateMachineSolve_X!(dfg, treel, i, oldtree=oldtree, verbose=verbose, drawtree=drawtree, limititers=limititers, downsolve=downsolve, incremental=incremental, delaycliqs=delaycliqs, recordcliqs=recordcliqs)
177+
alltasks[i] = Threads.@spawn tryCliqStateMachineSolve_X!(dfg, treel, i, oldtree=oldtree, verbose=verbose, drawtree=drawtree, limititers=limititers, downsolve=downsolve, incremental=incremental, delaycliqs=delaycliqs, recordcliqs=recordcliqs, solve_progressbar=solve_progressbar)
152178
else
153-
alltasks[i] = @async tryCliqStateMachineSolve_X!(dfg, treel, i, oldtree=oldtree, verbose=verbose, drawtree=drawtree, limititers=limititers, downsolve=downsolve, incremental=incremental, delaycliqs=delaycliqs, recordcliqs=recordcliqs)
179+
alltasks[i] = @async tryCliqStateMachineSolve_X!(dfg, treel, i, oldtree=oldtree, verbose=verbose, drawtree=drawtree, limititers=limititers, downsolve=downsolve, incremental=incremental, delaycliqs=delaycliqs, recordcliqs=recordcliqs, solve_progressbar=solve_progressbar)
154180
end
155181
end # if
156182
end # for
@@ -159,6 +185,8 @@ function taskSolveTree_X!(dfg::AbstractDFG,
159185

160186
# if record cliques is in use, else skip computational delay
161187
0 == length(recordcliqs) ? nothing : fetchCliqHistoryAll!(alltasks, cliqHistories)
188+
189+
finish!(solve_progressbar)
162190

163191
return alltasks, cliqHistories
164192
end
@@ -174,7 +202,8 @@ function tryCliqStateMachineSolve_X!(dfg::G,
174202
downsolve::Bool=false,
175203
incremental::Bool=false,
176204
delaycliqs::Vector{Symbol}=Symbol[],
177-
recordcliqs::Vector{Symbol}=Symbol[]) where G <: AbstractDFG
205+
recordcliqs::Vector{Symbol}=Symbol[],
206+
solve_progressbar=nothing) where G <: AbstractDFG
178207
#
179208
clst = :na
180209
cliq = getClique(treel, cliqKey) #treel.cliques[cliqKey]
@@ -195,7 +224,7 @@ function tryCliqStateMachineSolve_X!(dfg::G,
195224
drawtree=drawtree, verbose=verbose,
196225
limititers=limititers, downsolve=downsolve,
197226
recordhistory=recordthiscliq, incremental=incremental,
198-
delay=delaythiscliq, logger=logger )
227+
delay=delaythiscliq, logger=logger, solve_progressbar=solve_progressbar )
199228
#
200229
# cliqHistories[cliqKey] = history
201230
if length(history) >= limititers && limititers != -1

0 commit comments

Comments
 (0)