Skip to content

Commit 1605f07

Browse files
authored
Merge pull request #371 from JuliaRobotics/feature/20Q1/orphans296
Remove orphaned factors on deleteVariable!
2 parents d33150c + c007f01 commit 1605f07

File tree

8 files changed

+56
-15
lines changed

8 files changed

+56
-15
lines changed

src/CloudGraphsDFG/services/CloudGraphsDFG.jl

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -304,22 +304,27 @@ function updateFactor!(dfg::CloudGraphsDFG, factor::DFGFactor)::DFGFactor
304304
return factor
305305
end
306306

307-
function deleteVariable!(dfg::CloudGraphsDFG, label::Symbol)::DFGVariable
307+
function deleteVariable!(dfg::CloudGraphsDFG, label::Symbol)#::Tuple{AbstractDFGVariable, Vector{<:AbstractDFGFactor}}
308308
variable = getVariable(dfg, label)
309309
if variable == nothing
310310
error("Unable to retrieve the ID for variable '$label'. Please check your connection to the database and that the variable exists.")
311311
end
312312

313+
deleteNeighbors = true # reserved, orphaned factors are not supported at this time
314+
if deleteNeighbors
315+
neigfacs = map(l->deleteFactor!(dfg, l), getNeighbors(dfg, label))
316+
end
317+
313318
# Perform detach+deletion
314319
_getNeoNodesFromCyphonQuery(dfg.neo4jInstance, "(node:$label:$(join(_getLabelsForType(dfg, DFGVariable),':'))) detach delete node ")
315320

316321
# Clearing history
317322
dfg.addHistory = symdiff(dfg.addHistory, [label])
318-
return variable
323+
return variable, neigfacs
319324
end
320325

321326
#Alias
322-
deleteVariable!(dfg::CloudGraphsDFG, variable::DFGVariable)::DFGVariable = deleteVariable!(dfg, variable.label)
327+
deleteVariable!(dfg::CloudGraphsDFG, variable::DFGVariable) = deleteVariable!(dfg, variable.label)
323328

324329
function deleteFactor!(dfg::CloudGraphsDFG, label::Symbol)::DFGFactor
325330
factor = getFactor(dfg, label)
@@ -397,7 +402,7 @@ function isConnected(dfg::CloudGraphsDFG)::Bool
397402
end
398403

399404
function getNeighbors(dfg::CloudGraphsDFG, node::T; solvable::Int=0)::Vector{Symbol} where T <: DFGNode
400-
query = "(n:$(dfg.userId):$(dfg.robotId):$(dfg.sessionId):$(node.label))--(node) where (node:VARIABLE or node:FACTOR) and node.solvable >= $solvable"
405+
query = "(n:$(dfg.userId):$(dfg.robotId):$(dfg.sessionId):$(node.label))-[r:FACTORGRAPH]-(node) where (node:VARIABLE or node:FACTOR) and node.solvable >= $solvable"
401406
@debug "[Query] $query"
402407
neighbors = _getLabelsFromCyphonQuery(dfg.neo4jInstance, query)
403408
# If factor, need to do variable ordering TODO, Do we? does it matter if we always use _variableOrderSymbols in calculations?
@@ -408,7 +413,7 @@ function getNeighbors(dfg::CloudGraphsDFG, node::T; solvable::Int=0)::Vector{Sym
408413
end
409414

410415
function getNeighbors(dfg::CloudGraphsDFG, label::Symbol; solvable::Int=0)::Vector{Symbol}
411-
query = "(n:$(dfg.userId):$(dfg.robotId):$(dfg.sessionId):$(label))--(node) where (node:VARIABLE or node:FACTOR) and node.solvable >= $solvable"
416+
query = "(n:$(dfg.userId):$(dfg.robotId):$(dfg.sessionId):$(label))-[r:FACTORGRAPH]-(node) where (node:VARIABLE or node:FACTOR) and node.solvable >= $solvable"
412417
@debug "[Query] $query"
413418
neighbors = _getLabelsFromCyphonQuery(dfg.neo4jInstance, query)
414419
# If factor, need to do variable ordering TODO, Do we? does it matter if we always use _variableOrderSymbols in calculations?

src/GraphsDFG/services/GraphsDFG.jl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,21 @@ function updateFactor!(dfg::GraphsDFG, factor::DFGFactor)::DFGFactor
165165
return factor
166166
end
167167

168-
function deleteVariable!(dfg::GraphsDFG, label::Symbol)::DFGVariable
168+
function deleteVariable!(dfg::GraphsDFG, label::Symbol)#::Tuple{AbstractDFGVariable, Vector{<:AbstractDFGFactor}}
169169
if !haskey(dfg.labelDict, label)
170170
error("Variable label '$(label)' does not exist in the factor graph")
171171
end
172+
173+
deleteNeighbors = true # reserved, orphaned factors are not supported at this time
174+
if deleteNeighbors
175+
neigfacs = map(l->deleteFactor!(dfg, l), getNeighbors(dfg, label))
176+
end
177+
178+
172179
variable = dfg.g.vertices[dfg.labelDict[label]].dfgNode
173180
delete_vertex!(dfg.g.vertices[dfg.labelDict[label]], dfg.g)
174181
delete!(dfg.labelDict, label)
175-
return variable
182+
return variable, neigfacs
176183
end
177184

178185
function deleteFactor!(dfg::GraphsDFG, label::Symbol)::DFGFactor

src/LightDFG/services/LightDFG.jl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,19 @@ function updateFactor!(dfg::LightDFG, factor::F)::F where F <: AbstractDFGFactor
130130
return factor
131131
end
132132

133-
function deleteVariable!(dfg::LightDFG, label::Symbol)::AbstractDFGVariable
133+
function deleteVariable!(dfg::LightDFG, label::Symbol)#::Tuple{AbstractDFGVariable, Vector{<:AbstractDFGFactor}}
134134
if !haskey(dfg.g.variables, label)
135135
error("Variable label '$(label)' does not exist in the factor graph")
136136
end
137+
138+
deleteNeighbors = true # reserved, orphaned factors are not supported at this time
139+
if deleteNeighbors
140+
neigfacs = map(l->deleteFactor!(dfg, l), getNeighbors(dfg, label))
141+
end
137142
variable = dfg.g.variables[label]
138143
rem_vertex!(dfg.g, dfg.g.labels[label])
139144

140-
return variable
145+
return variable, neigfacs
141146
end
142147

143148
function deleteFactor!(dfg::LightDFG, label::Symbol)::AbstractDFGFactor

src/services/AbstractDFG.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ end
226226
$(SIGNATURES)
227227
Delete a DFGVariable from the DFG using its label.
228228
"""
229-
function deleteVariable!(dfg::G, label::Symbol)::AbstractDFGVariable where G <: AbstractDFG
229+
function deleteVariable!(dfg::AbstractDFG, label::Symbol)#::Tuple{AbstractDFGVariable, Vector{<:AbstractDFGFactor}}
230230
error("deleteVariable! not implemented for $(typeof(dfg))")
231231
end
232232
"""
@@ -389,7 +389,7 @@ end
389389
$(SIGNATURES)
390390
Delete a referenced DFGVariable from the DFG.
391391
"""
392-
function deleteVariable!(dfg::G, variable::V)::AbstractDFGVariable where {G <: AbstractDFG, V <: AbstractDFGVariable}
392+
function deleteVariable!(dfg::AbstractDFG, variable::AbstractDFGVariable)#::Tuple{AbstractDFGVariable, Vector{<:AbstractDFGFactor}}
393393
return deleteVariable!(dfg, variable.label)
394394
end
395395

test/LightDFGSummaryTypes.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ v3 = VARTYPE(:c)
1717
f0 = FACTYPE(:af1)
1818
f1 = FACTYPE(:abf1)
1919
f2 = FACTYPE(:bcf1)
20+
append!(f2._variableOrderSymbols, [:b,:c])
2021

2122
union!(v1.tags, [:VARIABLE, :POSE])
2223
union!(v2.tags, [:VARIABLE, :LANDMARK])

test/iifInterfaceTests.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,14 @@ end
6666
@test updateFactor!(dfg2, f2) == f2
6767
@test_throws ErrorException addFactor!(dfg2, [:b, :c], f2)
6868

69-
dv3 = deleteVariable!(dfg2, v3)
69+
dv3, dv3facs = deleteVariable!(dfg2, v3)
7070
#TODO write compare if we want to compare complete one, for now just label
7171
# @test dv3 == v3
7272
@test dv3.label == v3.label
7373
@test_throws ErrorException deleteVariable!(dfg2, v3)
7474

7575
@test issetequal(ls(dfg2),[:a,:b])
76-
df2 = deleteFactor!(dfg2, f2)
76+
df2 = dv3facs[1]
7777
#TODO write compare if we want to compare complete one, for now just label
7878
# @test df2 == f2
7979
@test df2.label == f2.label

test/interfaceTests.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ end
4444
BigDataEntriesTestBlock!(fg1, var2)
4545
end
4646

47+
# fg = fg1
48+
# v1 = var1
49+
# v2 = var2
50+
# v3 = var3
51+
# f0 = fac0
52+
# f1 = fac1
53+
# f2 = fac2
4754
@testset "TODO Sorteer groep" begin
4855
testGroup!(fg1, var1, var2, fac0, fac1)
4956
end

test/testBlocks.jl

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,9 @@ function DFGFactorSCA()
311311
f1 = DFGFactor(f1_lbl, [:a,:b], gfnd, tags = f1_tags, solvable=0)
312312

313313
f2 = DFGFactor{TestCCW{TestFunctorInferenceType1}, Symbol}(:bcf1)
314+
#TODO add tests for mutating vos in updateFactor and orphan related checks.
315+
# we should perhaps prevent an empty vos
316+
f2._variableOrderSymbols = [:b, :c]
314317

315318
@test getLabel(f1) == f1_lbl
316319
@test getTags(f1) == f1_tags
@@ -406,14 +409,27 @@ function VariablesandFactorsCRUD_SET!(fg, v1, v2, v3, f0, f1, f2)
406409
@test getFactor(fg, :bcf1) |> getTimestamp == newtimestamp
407410
end
408411
#deletions
409-
@test getVariable(fg, :c) == deleteVariable!(fg, v3)
412+
delvarCompare = getVariable(fg, :c)
413+
delfacCompare = getFactor(fg, :bcf1)
414+
delvar, delfacs = deleteVariable!(fg, v3)
415+
@test delvarCompare == delvar
416+
@test delfacCompare == delfacs[1]
410417
@test_throws ErrorException deleteVariable!(fg, v3)
411-
@test issetequal(ls(fg),[:a,:b])
418+
@test setdiff(ls(fg),[:a,:b]) == []
419+
420+
@test addVariable!(fg, v3) === v3
421+
@test addFactor!(fg, f2) === f2
412422

413423
@test getFactor(fg, :bcf1) == deleteFactor!(fg, f2)
414424
@test_throws ErrorException deleteFactor!(fg, f2)
415425
@test lsf(fg) == [:abf1]
416426

427+
delvarCompare = getVariable(fg, :c)
428+
delfacCompare = []
429+
delvar, delfacs = deleteVariable!(fg, v3)
430+
@test delvarCompare == delvar
431+
@test delfacCompare == []
432+
417433
@test getVariable(fg, :a) == v1
418434
@test getVariable(fg, :a, :default) == v1
419435

0 commit comments

Comments
 (0)