Skip to content

Commit f0a4857

Browse files
authored
Merge pull request #386 from JuliaRobotics/2Q20/378_cloudsolving
Fixing cloud solving functions
2 parents 0d5c545 + af1b1eb commit f0a4857

File tree

3 files changed

+64
-13
lines changed

3 files changed

+64
-13
lines changed

src/CloudGraphsDFG/services/CloudGraphsDFG.jl

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -582,14 +582,18 @@ end
582582
### Updated functions from AbstractDFG
583583
### These functions write back as you add the data.
584584

585-
function addVariableSolverData!(dfg::CloudGraphsDFG, variablekey::Symbol, vnd::VariableNodeData, solvekey::Symbol=:default)::VariableNodeData
585+
function addVariableSolverData!(dfg::CloudGraphsDFG,
586+
variablekey::Symbol,
587+
vnd::VariableNodeData,
588+
solvekey::Symbol=:default)::VariableNodeData
586589
# TODO: Switch out to their own nodes, don't get the whole variable
587590
var = getVariable(dfg, variablekey)
588591
if haskey(var.solverDataDict, solvekey)
589592
error("VariableNodeData '$(solvekey)' already exists")
590593
end
591594
var.solverDataDict[solvekey] = vnd
592-
# TODO: Cleanup
595+
596+
# TODO: Cleanup and consolidate as one function.
593597
solverDataDict = JSON2.write(Dict(keys(var.solverDataDict) .=> map(vnd -> packVariableNodeData(dfg, vnd), values(var.solverDataDict))))
594598
_setNodeProperty(
595599
dfg.neo4jInstance,
@@ -599,28 +603,58 @@ function addVariableSolverData!(dfg::CloudGraphsDFG, variablekey::Symbol, vnd::V
599603
return vnd
600604
end
601605

602-
function updateVariableSolverData!(dfg::CloudGraphsDFG, variablekey::Symbol, vnd::VariableNodeData, solvekey::Symbol=:default)::VariableNodeData
606+
function updateVariableSolverData!(dfg::CloudGraphsDFG,
607+
variablekey::Symbol,
608+
vnd::VariableNodeData,
609+
solvekey::Symbol=:default,
610+
useCopy::Bool=true,
611+
fields::Vector{Symbol}=Symbol[])::VariableNodeData
603612
# TODO: Switch out to their own nodes, don't get the whole variable
604613
var = getVariable(dfg, variablekey)
605614
if !haskey(var.solverDataDict, solvekey)
606615
@warn "VariableNodeData '$(solvekey)' does not exist, adding"
607616
end
608-
var.solverDataDict[solvekey] = vnd
609-
# TODO: Cleanup
617+
618+
# Unnecessary for cloud, but (probably) being (too) conservative (just because).
619+
usevnd = useCopy ? deepcopy(vnd) : vnd
620+
# should just one, or many pointers be updated?
621+
if haskey(var.solverDataDict, solvekey) && isa(var.solverDataDict[solvekey], VariableNodeData) && length(fields) != 0
622+
# change multiple pointers inside the VND var.solverDataDict[solvekey]
623+
for field in fields
624+
destField = getfield(var.solverDataDict[solvekey], field)
625+
srcField = getfield(usevnd, field)
626+
if isa(destField, Array) && size(destField) == size(srcField)
627+
# use broadcast (in-place operation)
628+
destField .= srcField
629+
else
630+
# change pointer of destination VND object member
631+
setfield!(var.solverDataDict[solvekey], field, srcField)
632+
end
633+
end
634+
else
635+
# change a single pointer in var.solverDataDict
636+
var.solverDataDict[solvekey] = usevnd
637+
end
638+
639+
# TODO: Cleanup and consolidate
610640
solverDataDict = JSON2.write(Dict(keys(var.solverDataDict) .=> map(vnd -> packVariableNodeData(dfg, vnd), values(var.solverDataDict))))
611641
_setNodeProperty(
612642
dfg.neo4jInstance,
613643
_getLabelsForInst(dfg, var),
614644
"solverDataDict",
615645
solverDataDict)
616-
return vnd
646+
return var.solverDataDict[solvekey]
617647
end
618648

619-
function updateVariableSolverData!(dfg::CloudGraphsDFG, sourceVariables::Vector{<:DFGVariable}, solvekey::Symbol=:default)
649+
function updateVariableSolverData!(dfg::CloudGraphsDFG,
650+
sourceVariables::Vector{<:DFGVariable},
651+
solvekey::Symbol=:default,
652+
useCopy::Bool=true,
653+
fields::Vector{Symbol}=Symbol[] )
620654
# TODO: Switch out to their own nodes, don't get the whole variable
621655
#TODO: Do in bulk for speed.
622656
for var in sourceVariables
623-
updateVariableSolverData!(dfg, var.label, getSolverData(var, solvekey), solvekey)
657+
updateVariableSolverData!(dfg, var.label, getSolverData(var, solvekey), solvekey, useCopy, fields)
624658
end
625659
end
626660

@@ -632,7 +666,7 @@ function deleteVariableSolverData!(dfg::CloudGraphsDFG, variablekey::Symbol, sol
632666
error("VariableNodeData '$(solvekey)' does not exist")
633667
end
634668
vnd = pop!(var.solverDataDict, solvekey)
635-
# TODO: Cleanup
669+
# TODO: Cleanup and consolidate... yadda yadda just do it already :)
636670
solverDataDict = JSON2.write(Dict(keys(var.solverDataDict) .=> map(vnd -> packVariableNodeData(dfg, vnd), values(var.solverDataDict))))
637671
_setNodeProperty(
638672
dfg.neo4jInstance,
@@ -642,6 +676,22 @@ function deleteVariableSolverData!(dfg::CloudGraphsDFG, variablekey::Symbol, sol
642676
return vnd
643677
end
644678

679+
function mergeVariableSolverData!(dfg::CloudGraphsDFG, sourceVariable::DFGVariable)
680+
# TODO: Switch out to their own nodes, don't get the whole variable
681+
var = getVariable(dfg, sourceVariable.label)
682+
683+
merge!(var.solverDataDict, deepcopy(sourceVariable.solverDataDict))
684+
685+
# TODO: Cleanup and consolidate
686+
solverDataDict = JSON2.write(Dict(keys(var.solverDataDict) .=> map(vnd -> packVariableNodeData(dfg, vnd), values(var.solverDataDict))))
687+
_setNodeProperty(
688+
dfg.neo4jInstance,
689+
_getLabelsForInst(dfg, var),
690+
"solverDataDict",
691+
solverDataDict)
692+
return var
693+
end
694+
645695
function getSolvable(dfg::CloudGraphsDFG, sym::Symbol)
646696
prop = _getNodeProperty(
647697
dfg.neo4jInstance,

src/services/AbstractDFG.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
##------------------------------------------------------------------------------
1919
"""
2020
$(SIGNATURES)
21-
Convenience function to get all the matadata of a DFG
21+
Convenience function to get all the metadata of a DFG
2222
"""
23-
getDFGInfo(dfg::AbstractDFG) = (dfg.description, dfg.userId, dfg.robotId, dfg.sessionId, dfg.userData, dfg.robotData, dfg.sessionData, dfg.solverParams)
23+
getDFGInfo(dfg::AbstractDFG) = (getDescription(dfg), getUserId(dfg), getRobotId(dfg), getSessionId(dfg), getUserData(dfg), getRobotData(dfg), getSessionData(dfg), getSolverParams(dfg))
2424

2525
"""
2626
$(SIGNATURES)

test/runtests.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ using Dates
77

88
## To run the IIF tests, you need a local Neo4j with user/pass neo4j:test
99
# To run a Docker image
10-
# Install: docker pull neo4j
11-
# Run: docker run -d --publish=7474:7474 --publish=7687:7687 --env NEO4J_AUTH=neo4j/test neo4j
10+
# NOTE: that Neo4j.jl doesn't currently support > Neo4j 3.x
11+
# Install: docker pull neo4j:3.5.6
12+
# Run: docker run -d --publish=7474:7474 --publish=7687:7687 --env NEO4J_AUTH=neo4j/test neo4j:3.5.6
1213
##
1314

1415
# If you want to enable debugging logging (very verbose!)

0 commit comments

Comments
 (0)