Skip to content

Commit e5b45ab

Browse files
authored
Merge pull request #225 from JuliaRobotics/feature/4Q19/setsolvable
add setSolvable!
2 parents 2139096 + 6d2be6e commit e5b45ab

File tree

3 files changed

+63
-2
lines changed

3 files changed

+63
-2
lines changed

src/DistributedFactorGraphs.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export pushUserData!, pushRobotData!, pushSessionData!, popUserData!, popRobotDa
3434

3535
# Services/AbstractDFG Exports
3636
export isInitialized, getFactorFunction, isVariable, isFactor
37-
export isSolvable, isSolveInProgress
37+
export isSolvable, isSolveInProgress, getSolvable, setSolvable!
3838
export mergeUpdateVariableSolverData!, mergeUpdateGraphSolverData!
3939

4040
# Solver (IIF) Exports

src/services/AbstractDFG.jl

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,30 @@ isSolveInProgress
341341
"""
342342
isSolvable(var::Union{DFGVariable, DFGFactor})::Int = var.solvable
343343

344+
"""
345+
$SIGNATURES
346+
347+
Variables or factors may or may not be 'solvable', depending on a user definition. Useful for ensuring atomic transactions.
348+
349+
Related
350+
351+
isSolveInProgress
352+
"""
353+
getSolvable(var::Union{DFGVariable, DFGFactor})::Int = var.solvable
354+
355+
"""
356+
$SIGNATURES
357+
358+
Get 'solvable' parameter for either a variable or factor.
359+
"""
360+
function getSolvable(dfg::AbstractDFG, sym::Symbol)
361+
if isVariable(dfg, sym)
362+
return getVariable(dfg, sym).solvable
363+
elseif isFactor(dfg, sym)
364+
return getFactor(dfg, sym).solvable
365+
end
366+
end
367+
344368
"""
345369
$SIGNATURES
346370
@@ -360,6 +384,30 @@ function isSolveInProgress(var::Union{DFGVariable, DFGFactor}; solveKey::Symbol=
360384
return solverData(var).solveInProgress
361385
end
362386

387+
"""
388+
$SIGNATURES
389+
390+
Set the `solvable` parameter for either a variable or factor.
391+
"""
392+
function setSolvable!(dfg::AbstractDFG, sym::Symbol, solvable::Int)::Int
393+
if isVariable(dfg, sym)
394+
getVariable(dfg, sym).solvable = solvable
395+
elseif isFactor(dfg, sym)
396+
getFactor(dfg, sym).solvable = solvable
397+
end
398+
return solvable
399+
end
400+
401+
"""
402+
$SIGNATURES
403+
404+
Set the `solvable` parameter for either a variable or factor.
405+
"""
406+
function setSolvable!(node::N, solvable::Int)::Int where N <: DFGNode
407+
node.solvable = solvable
408+
return solvable
409+
end
410+
363411
"""
364412
$(SIGNATURES)
365413
Gets an empty and unique CloudGraphsDFG derived from an existing DFG.

test/interfaceTests.jl

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# using DistributedFactorGraphs, Test
2+
# testDFGAPI = GraphsDFG
13
dfg = testDFGAPI{NoSolverParams}()
24

35
#add types for softtypes
@@ -20,7 +22,7 @@ solverData(v1).softtype = deepcopy(st1)
2022
solverData(v2).softtype = deepcopy(st2)
2123

2224
# set v2 solvable
23-
v2.solvable = 1
25+
setSolvable!(v2, 1)
2426
# set v1 and f1 solveInProgress
2527
solverData(v1).solveInProgress = 1
2628
solverData(f1).solveInProgress = 1
@@ -164,6 +166,17 @@ end
164166
@test isSolvable(f1) == 0
165167
@test isSolveInProgress(v1) == 1
166168
@test isSolveInProgress(f1) == 1
169+
# setSolvable, getSolvable, and variants
170+
v1 = getVariable(dfg, v1.label)
171+
f1 = getFactor(dfg, f1.label)
172+
@test setSolvable!(v1, 1) == 1
173+
@test isSolvable(v1) == 1
174+
@test setSolvable!(dfg, v1.label, 0) == 0
175+
@test isSolvable(v1) == 0
176+
@test setSolvable!(f1, 1) == 1
177+
@test getSolvable(dfg, f1.label) == 1
178+
@test setSolvable!(dfg, f1.label, 0) == 0
179+
@test getSolvable(f1) == 0
167180

168181
# isFactor and isVariable
169182
@test isFactor(dfg, f1.label)

0 commit comments

Comments
 (0)