@@ -362,36 +362,60 @@ addVariableSolverData!(dfg::AbstractDFG, sourceVariable::DFGVariable, solvekey::
362
362
$(SIGNATURES)
363
363
Update variable solver data if it exists, otherwise add it.
364
364
Notes:
365
- - `useDeepcopy =true` to copy solver data and keep separate memory.
365
+ - `useCopy =true` to copy solver data and keep separate memory.
366
366
"""
367
367
function updateVariableSolverData! (dfg:: AbstractDFG ,
368
368
variablekey:: Symbol ,
369
369
vnd:: VariableNodeData ,
370
370
solvekey:: Symbol = :default ,
371
- useDeepcopy:: Bool = true ):: VariableNodeData
371
+ useCopy:: Bool = true ,
372
+ fields:: Vector{Symbol} = Symbol[] ):: VariableNodeData
372
373
#
373
374
# This is basically just setSolverData
374
375
var = getVariable (dfg, variablekey)
375
376
if ! haskey (var. solverDataDict, solvekey)
376
377
@warn " VariableNodeData '$(solvekey) ' does not exist, adding"
377
378
end
378
- # for InMemoryDFGTypes, cloud would update here
379
- var. solverDataDict[solvekey] = useDeepcopy ? deepcopy (vnd) : vnd
380
- return vnd
379
+
380
+ # for InMemoryDFGTypes do memory copy or repointing, for cloud this would be an different kind of update.
381
+ usevnd = useCopy ? deepcopy (vnd) : vnd
382
+ # should just one, or many pointers be updated?
383
+ if haskey (var. solverDataDict, solvekey) && isa (var. solverDataDict[solvekey], VariableNodeData) && length (fields) != 0
384
+ # change multiple pointers inside the VND var.solverDataDict[solvekey]
385
+ for field in fields
386
+ destField = getfield (var. solverDataDict[solvekey], field)
387
+ srcField = getfield (usevnd, field)
388
+ if isa (destField, Array)
389
+ # use broadcast (in-place operation)
390
+ destField .= srcField
391
+ else
392
+ # change pointer of destination VND object member
393
+ setfield! (var. solverDataDict[solvekey], field, srcField)
394
+ end
395
+ end
396
+ else
397
+ # change a single pointer in var.solverDataDict
398
+ var. solverDataDict[solvekey] = usevnd
399
+ end
400
+
401
+ return var. solverDataDict[solvekey]
381
402
end
382
403
383
404
updateVariableSolverData! (dfg:: AbstractDFG ,
384
405
sourceVariable:: DFGVariable ,
385
- solvekey:: Symbol = :default , useDeepcopy:: Bool = true ) =
386
- updateVariableSolverData! (dfg, sourceVariable. label, getSolverData (sourceVariable, solvekey), solvekey, useDeepcopy)
406
+ solvekey:: Symbol = :default ,
407
+ useCopy:: Bool = true ,
408
+ fields:: Vector{Symbol} = Symbol[] ) =
409
+ updateVariableSolverData! (dfg, sourceVariable. label, getSolverData (sourceVariable, solvekey), solvekey, useCopy, fields)
387
410
388
411
function updateVariableSolverData! (dfg:: AbstractDFG ,
389
412
sourceVariables:: Vector{<:DFGVariable} ,
390
413
solvekey:: Symbol = :default ,
391
- useDeepcopy:: Bool = true )
414
+ useCopy:: Bool = true ,
415
+ fields:: Vector{Symbol} = Symbol[] )
392
416
# I think cloud would do this in bulk for speed
393
417
for var in sourceVariables
394
- updateVariableSolverData! (dfg, var. label, getSolverData (var, solvekey), solvekey, useDeepcopy )
418
+ updateVariableSolverData! (dfg, var. label, getSolverData (var, solvekey), solvekey, useCopy, fields )
395
419
end
396
420
end
397
421
0 commit comments