Skip to content

Commit 38dfd7c

Browse files
authored
Merge pull request #967 from JuliaRobotics/tests/20Q4/marginal
Test basic marginalization and fix #966
2 parents 7919e56 + 8f27721 commit 38dfd7c

File tree

3 files changed

+112
-0
lines changed

3 files changed

+112
-0
lines changed

src/FGOSUtils.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ function fifoFreeze!(dfg::AbstractDFG)
111111

112112
# the fifo history
113113
tofreeze = DFG.getAddHistory(dfg)[1:(end-DFG.getSolverParams(dfg).qfl)]
114+
115+
# check that the variable to freeze exists fix issue #966
116+
filter!(v->exists(dfg,v), tofreeze)
117+
114118
if length(tofreeze) == 0
115119
@info "[fifoFreeze] QFL - no nodes to freeze."
116120
return nothing

test/runtests.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ using Test
55

66
include("testExpXstroke.jl")
77

8+
include("testBasicMargin.jl")
9+
810
include("TestModuleFunctions.jl")
911

1012
include("testStateMachine.jl")

test/testBasicMargin.jl

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
using Test
2+
using IncrementalInference
3+
4+
@testset "Testing basic marginalization" begin
5+
# linear hex
6+
N=6
7+
fg = generateCanonicalFG_lineStep(N;
8+
graphinit=false,
9+
poseEvery=1,
10+
landmarkEvery=N+1,
11+
posePriorsAt=[0],
12+
landmarkPriorsAt=[],
13+
sightDistance=N+1)
14+
15+
deleteFactor!.(fg, [Symbol("x$(i)lm0f1") for i=1:(N-1)])
16+
17+
# tree = resetBuildTree!(fg, show=true, drawpdf=true)
18+
tree, smtasks, hists = solveTree!(fg)
19+
20+
for var in sortDFG(ls(fg))
21+
sppe = getVariable(fg,var) |> getPPE |> IIF.getSuggestedPPE
22+
println("Testing ", var,": ", sppe)
23+
@test isapprox(sppe[1], parse(Int,string(var)[end]), atol=0.1)
24+
end
25+
26+
27+
defaultFixedLagOnTree!(fg, 6)
28+
# Back up data from these two poses so we can compare them once we solve again.
29+
lm0 = deepcopy(getVal(fg, :lm0))
30+
X0 = deepcopy(getVal(fg, :x0))
31+
X1 = deepcopy(getVal(fg, :x1))
32+
33+
fifoFreeze!(fg)
34+
35+
tree, smtasks, hists = solveTree!(fg)
36+
for var in sortDFG(ls(fg))
37+
sppe = getVariable(fg,var) |> getPPE |> IIF.getSuggestedPPE
38+
println("Testing ", var,": ", sppe)
39+
@test isapprox(sppe[1], parse(Int,string(var)[end]), atol=0.15)
40+
end
41+
42+
43+
lm0cmp = deepcopy(getVal(fg, :lm0))
44+
X0cmp = deepcopy(getVal(fg, :x0))
45+
X1cmp = deepcopy(getVal(fg, :x1))
46+
47+
@test X0 == X0cmp #Frozen
48+
@test lm0 == lm0cmp #Frozen
49+
@test X1 != X1cmp #Recalculated
50+
51+
deleteVariable!(fg, :x0)
52+
53+
addVariable!.(fg, [Symbol("x$i") for i = 7:9], ContinuousScalar)
54+
addFactor!(fg, [:x6,:x7], LinearRelative(Normal(1.0, 0.1)))
55+
addFactor!(fg, [:x7,:x8], LinearRelative(Normal(1.0, 0.1)))
56+
addFactor!(fg, [:x8,:x9], LinearRelative(Normal(1.0, 0.1)))
57+
addFactor!(fg, [:lm0, :x9], LinearRelative(Normal(9,0.1)))
58+
59+
tree, smtasks, hists = solveTree!(fg)
60+
61+
for var in sortDFG(ls(fg))
62+
sppe = getVariable(fg,var) |> getPPE |> IIF.getSuggestedPPE
63+
println("Testing ", var,": ", sppe)
64+
@test isapprox(sppe[1], parse(Int,string(var)[end]), atol=0.15)
65+
end
66+
67+
@test lm0 == getVal(fg, :lm0) #Still Frozen
68+
@test X1cmp == getVal(fg, :x1) #also now Frozen
69+
70+
unfreezeVariablesAll!(fg)
71+
72+
# freeze again
73+
defaultFixedLagOnTree!(fg, 9)
74+
75+
tree, smtasks, hists = solveTree!(fg)
76+
77+
@test lm0 == getVal(fg, :lm0) #Still Frozen
78+
@test X1cmp != getVal(fg, :x1) #not frozen
79+
80+
# freeze 2,4,6 to all marginalize clique 2
81+
setfreeze!(fg, [:x2, :x4, :x6])
82+
tree, smtasks, hists = solveTree!(fg)
83+
84+
@test areCliqVariablesAllMarginalized(fg, tree.cliques[2])
85+
86+
tree, smtasks, hists = solveTree!(fg, tree)#, recordcliqs=ls(fg));
87+
for var in sortDFG(ls(fg))
88+
sppe = getVariable(fg,var) |> getPPE |> IIF.getSuggestedPPE
89+
println("Testing ", var,": ", sppe)
90+
@test isapprox(sppe[1], parse(Int,string(var)[end]), atol=0.15)
91+
end
92+
93+
X1 = deepcopy(getVal(fg, :x1))
94+
95+
setfreeze!(fg, [:x3, :x5])
96+
tree, smtasks, hists = solveTree!(fg, tree)#, recordcliqs=ls(fg));
97+
# csmAnimate(tree, hists, frames=1)
98+
99+
@test lm0 == getVal(fg, :lm0) #Still Frozen
100+
@test X1 != getVal(fg, :x1) #not frozen
101+
102+
for i = [2,4,6]
103+
@test areCliqVariablesAllMarginalized(fg, tree.cliques[i])
104+
end
105+
106+
end

0 commit comments

Comments
 (0)