Skip to content

Commit cf6e407

Browse files
committed
use constructor and not convert
1 parent e657cac commit cf6e407

File tree

9 files changed

+132
-31
lines changed

9 files changed

+132
-31
lines changed

src/Deprecated.jl

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,23 @@ Base.setproperty!(x::DFGFactor,f::Symbol, val) = begin
9595
end
9696

9797

98-
#
98+
#NOTE deprecate in favor of constructors because its not lossless: https://docs.julialang.org/en/v1/manual/conversion-and-promotion/#Conversion-vs.-Construction-1
99+
function Base.convert(::Type{DFGVariableSummary}, v::DFGVariable)
100+
Base.depwarn("convert to type DFGVariableSummary is deprecated use the constructor", :convert)
101+
return DFGVariableSummary(v)
102+
end
103+
104+
function Base.convert(::Type{SkeletonDFGVariable}, v::VariableDataLevel1)
105+
Base.depwarn("convert to type SkeletonDFGVariable is deprecated use the constructor", :convert)
106+
return SkeletonDFGVariable(v)
107+
end
108+
109+
function Base.convert(::Type{DFGFactorSummary}, f::DFGFactor)
110+
Base.depwarn("convert to type DFGFactorSummary is deprecated use the constructor", :convert)
111+
return DFGFactorSummary(f)
112+
end
113+
114+
function Base.convert(::Type{SkeletonDFGFactor}, f::FactorDataLevel1)
115+
Base.depwarn("convert to type SkeletonDFGFactor is deprecated use the constructor", :convert)
116+
return SkeletonDFGFactor(f)
117+
end

src/LightDFG/entities/LightDFG.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,14 @@ LightDFG(description::String,
6666
sessionData::Dict{Symbol, String},
6767
solverParams::AbstractParams) =
6868
LightDFG(FactorGraph{Int,DFGVariable,DFGFactor}(), description, userId, robotId, sessionId, userData, robotData, sessionData, Symbol[], solverParams)
69+
70+
71+
LightDFG{T,V,F}(description::String,
72+
userId::String,
73+
robotId::String,
74+
sessionId::String,
75+
userData::Dict{Symbol, String},
76+
robotData::Dict{Symbol, String},
77+
sessionData::Dict{Symbol, String},
78+
solverParams::T) where {T <: AbstractParams, V <:AbstractDFGVariable, F<:AbstractDFGFactor} =
79+
LightDFG(FactorGraph{Int,V,F}(), description, userId, robotId, sessionId, userData, robotData, sessionData, Symbol[], solverParams)

src/LightDFG/services/LightDFG.jl

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ function addVariable!(dfg::LightDFG{<:AbstractParams, V, <:AbstractDFGFactor}, v
3838
return variable
3939
end
4040

41+
function addVariable!(dfg::LightDFG{<:AbstractParams, VD, <:AbstractDFGFactor},
42+
variable::AbstractDFGVariable)::VD where VD <: AbstractDFGVariable
43+
return addVariable!(dfg, VD(variable))
44+
end
45+
46+
4147
#moved to abstract
4248
# function addFactor!(dfg::LightDFG{<:AbstractParams, V, F}, variables::Vector{<:V}, factor::F)::F where {V <: AbstractDFGVariable, F <: AbstractDFGFactor}
4349
#
@@ -86,6 +92,11 @@ function addFactor!(dfg::LightDFG{<:AbstractParams, <:AbstractDFGVariable, F}, f
8692
return factor
8793
end
8894

95+
function addFactor!(dfg::LightDFG{<:AbstractParams, <:AbstractDFGVariable, F},
96+
factor::AbstractDFGFactor)::F where F <: AbstractDFGFactor
97+
return addFactor!(dfg, F(factor))
98+
end
99+
89100
function getVariable(dfg::LightDFG, label::Symbol)::AbstractDFGVariable
90101
if !haskey(dfg.g.variables, label)
91102
error("Variable label '$(label)' does not exist in the factor graph")
@@ -257,7 +268,7 @@ end
257268
function _copyIntoGraph!(sourceDFG::LightDFG{<:AbstractParams, V, F}, destDFG::LightDFG{<:AbstractParams, V, F}, ns::Vector{Int}, includeOrphanFactors::Bool=false)::Nothing where {V <: AbstractDFGVariable, F <: AbstractDFGFactor}
258269

259270
includeOrphanFactors && (@error "Adding orphaned factors is not supported")
260-
271+
261272
#kan ek die in bulk copy, soos graph en dan nuwe map maak
262273
# Add all variables first,
263274
labels = [sourceDFG.g.labels[i] for i in ns]

src/entities/DFGFactor.jl

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -183,13 +183,11 @@ const FactorDataLevel1 = Union{DFGFactor, DFGFactorSummary}
183183
const FactorDataLevel2 = Union{DFGFactor}
184184

185185
##==============================================================================
186-
## Convert
186+
## Convertion constructors
187187
##==============================================================================
188-
function Base.convert(::Type{DFGFactorSummary}, f::DFGFactor)
189-
return DFGFactorSummary(f.label, f.timestamp, deepcopy(f.tags), f._dfgNodeParams._internalId, deepcopy(f._variableOrderSymbols))
190-
end
191188

192-
#TODO TEST
193-
function Base.convert(::Type{SkeletonDFGFactor}, f::FactorDataLevel1)
194-
return SkeletonDFGFactor(f.label, deepcopy(f.tags), deepcopy(f._variableOrderSymbols))
195-
end
189+
DFGFactorSummary(f::DFGFactor) =
190+
DFGFactorSummary(f.label, f.timestamp, deepcopy(f.tags), f._dfgNodeParams._internalId, deepcopy(f._variableOrderSymbols))
191+
192+
SkeletonDFGFactor(f::FactorDataLevel1) =
193+
SkeletonDFGFactor(f.label, deepcopy(f.tags), deepcopy(f._variableOrderSymbols))

src/entities/DFGVariable.jl

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -309,14 +309,11 @@ const VariableDataLevel1 = Union{DFGVariable, DFGVariableSummary}
309309
const VariableDataLevel2 = Union{DFGVariable}
310310

311311
##==============================================================================
312-
## converters
312+
## Convertion constructors
313313
##==============================================================================
314314

315-
function Base.convert(::Type{DFGVariableSummary}, v::DFGVariable)
316-
return DFGVariableSummary(v.label, v.timestamp, deepcopy(v.tags), deepcopy(v.ppeDict), Symbol(typeof(getSofttype(v))), v.bigData, v._internalId)
317-
end
315+
DFGVariableSummary(v::DFGVariable) =
316+
DFGVariableSummary(v.label, v.timestamp, deepcopy(v.tags), deepcopy(v.ppeDict), Symbol(typeof(getSofttype(v))), v.bigData, v._internalId)
318317

319-
#TODO Test
320-
function Base.convert(::Type{SkeletonDFGVariable}, v::VariableDataLevel1)
321-
return SkeletonDFGVariable(v.label, deepcopy(v.tags))
322-
end
318+
SkeletonDFGVariable(v::VariableDataLevel1) =
319+
SkeletonDFGVariable(v.label, deepcopy(v.tags))

src/services/AbstractDFG.jl

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,9 +1023,8 @@ Produces a dot-format of the graph for visualization.
10231023
"""
10241024
function toDot(dfg::AbstractDFG)::String
10251025
#TODO implement convert
1026-
# graphsdfg = GraphsDFG{NoSolverParams}()
1027-
# DistributedFactorGraphs._copyIntoGraph!(dfg, graphsdfg, union(listVariables(dfg), listFactors(dfg)), true)
1028-
graphsdfg = convert(GraphsDFG{NoSolverParams}, dfg)
1026+
graphsdfg = GraphsDFG{NoSolverParams}()
1027+
DistributedFactorGraphs._copyIntoGraph!(dfg, graphsdfg, union(listVariables(dfg), listFactors(dfg)), true)
10291028
# Calls down to GraphsDFG.toDot
10301029
return toDot(graphsdfg)
10311030
end
@@ -1065,8 +1064,8 @@ Get a summary of the graph (first-class citizens of variables and factors).
10651064
Returns a DFGSummary.
10661065
"""
10671066
function getSummary(dfg::G)::DFGSummary where {G <: AbstractDFG}
1068-
vars = map(v -> convert(DFGVariableSummary, v), getVariables(dfg))
1069-
facts = map(f -> convert(DFGFactorSummary, f), getFactors(dfg))
1067+
vars = map(v -> DFGVariableSummary(v), getVariables(dfg))
1068+
facts = map(f -> DFGFactorSummary(f), getFactors(dfg))
10701069
return DFGSummary(
10711070
Dict(map(v->v.label, vars) .=> vars),
10721071
Dict(map(f->f.label, facts) .=> facts),
@@ -1087,11 +1086,12 @@ function getSummaryGraph(dfg::G)::LightDFG{NoSolverParams, DFGVariableSummary, D
10871086
userId=dfg.userId,
10881087
robotId=dfg.robotId,
10891088
sessionId=dfg.sessionId)
1090-
for v in getVariables(dfg)
1091-
newV = addVariable!(summaryDfg, convert(DFGVariableSummary, v))
1092-
end
1093-
for f in getFactors(dfg)
1094-
addFactor!(summaryDfg, getNeighbors(dfg, f), convert(DFGFactorSummary, f))
1095-
end
1089+
deepcopyGraph!(summaryDfg, dfg)
1090+
# for v in getVariables(dfg)
1091+
# newV = addVariable!(summaryDfg, DFGVariableSummary(v))
1092+
# end
1093+
# for f in getFactors(dfg)
1094+
# addFactor!(summaryDfg, getNeighbors(dfg, f), DFGFactorSummary(f))
1095+
# end
10961096
return summaryDfg
10971097
end

src/services/copyFunctions.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,3 @@ function deepcopyGraph( ::Type{T},
7777
copyGraph!(destDFG, sourceDFG, variableFactorLabels; deepcopyNodes=true, kwargs...)
7878
return destDFG
7979
end
80-
81-
Base.convert(::Type{T}, fg::AbstractDFG) where T <: AbstractDFG = deepcopyGraph(T, fg)

test/interfaceTests.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,13 @@ end
9494

9595
fgcopy = testDFGAPI()
9696
DFG._copyIntoGraph!(fg, fgcopy, union(ls(fg), lsf(fg)))
97+
@test getVariableOrder(fg,:f1) == getVariableOrder(fgcopy,:f1)
9798

99+
#test copyGraph, deepcopyGraph[!]
100+
fgcopy = testDFGAPI()
101+
DFG.deepcopyGraph!(fgcopy, fg)
98102
@test getVariableOrder(fg,:f1) == getVariableOrder(fgcopy,:f1)
99103

104+
CopyFunctionsTest(testDFGAPI)
100105

101106
end

test/testBlocks.jl

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,3 +1083,65 @@ function ConnectivityTest(testDFGAPI; kwargs...)
10831083
@test hasOrphans(dfg) == true
10841084
end
10851085
end
1086+
1087+
1088+
function CopyFunctionsTest(testDFGAPI; kwargs...)
1089+
1090+
# testDFGAPI = LightDFG
1091+
# kwargs = ()
1092+
1093+
dfg, verts, facs = connectivityTestGraph(testDFGAPI; kwargs...)
1094+
1095+
varlbls = ls(dfg)
1096+
faclbls = lsf(dfg)
1097+
1098+
dcdfg = DFG.deepcopyGraph(LightDFG, dfg)
1099+
1100+
@test issetequal(ls(dcdfg), varlbls)
1101+
@test issetequal(lsf(dcdfg), faclbls)
1102+
1103+
lbls = [:x2, :x3, :x2x3f1]
1104+
dcdfg_part = DFG.deepcopyGraph(LightDFG, dfg, lbls)
1105+
1106+
@test issetequal(union(ls(dcdfg_part), lsf(dcdfg_part)), lbls)
1107+
1108+
# deepcopy subgraph ignoring orphans
1109+
@test_logs (:warn, r"orphan") dcdfg_part = DFG.deepcopyGraph(LightDFG, dfg, union(lbls, [:x1x2f1]))
1110+
@test issetequal(union(ls(dcdfg_part), lsf(dcdfg_part)), lbls)
1111+
1112+
# deepcopy subgraph with 2 parts
1113+
lbls = [:x2, :x3, :x2x3f1, :x5, :x6, :x5x6f1, :x10]
1114+
dcdfg_part = DFG.deepcopyGraph(LightDFG, dfg, lbls)
1115+
@test issetequal(union(ls(dcdfg_part), lsf(dcdfg_part)), lbls)
1116+
@test !isFullyConnected(dcdfg_part)
1117+
# dfgplot(dcdfg_part)
1118+
1119+
# not found errors
1120+
@test_throws ErrorException DFG.deepcopyGraph(LightDFG, dfg, [:x0, :a])
1121+
1122+
# already exists errors
1123+
dcdfg_part = DFG.deepcopyGraph(LightDFG, dfg, [:x1, :x2, :x3, :x1x2f1, :x2x3f1])
1124+
@test_throws ErrorException DFG.deepcopyGraph!(dcdfg_part, dfg, [:x4, :x2, :x3, :x1x2f1, :x2x3f1])
1125+
@test_throws ErrorException DFG.deepcopyGraph!(dcdfg_part, dfg, [:x1x2f1])
1126+
1127+
# same but overwrite destination
1128+
DFG.deepcopyGraph!(dcdfg_part, dfg, [:x4, :x2, :x3, :x1x2f1, :x2x3f1]; overwriteDest = true)
1129+
1130+
DFG.deepcopyGraph!(dcdfg_part, dfg, [:x1x2f1]; overwriteDest=true)
1131+
1132+
1133+
# convert to...
1134+
# condfg = convert(GraphsDFG, dfg)
1135+
# @test condfg isa GraphsDFG
1136+
# @test issetequal(ls(condfg), varlbls)
1137+
# @test issetequal(lsf(condfg), faclbls)
1138+
#
1139+
# condfg = convert(LightDFG, dfg)
1140+
# @test condfg isa LightDFG
1141+
# @test issetequal(ls(condfg), varlbls)
1142+
# @test issetequal(lsf(condfg), faclbls)
1143+
1144+
# GraphsDFG(dfg::AbstractDFG) = convert(GraphsDFG,dfg)
1145+
# GraphsDFG(dfg)
1146+
1147+
end

0 commit comments

Comments
 (0)