From 80ebd032b68d4a788a5cf671270d752b1368ccf0 Mon Sep 17 00:00:00 2001 From: gearsad Date: Sun, 13 Oct 2019 22:41:45 -0500 Subject: [PATCH 1/2] Example using a blend of hard type metadata and dicts for adding new estimates --- src/DistributedFactorGraphs.jl | 3 ++- src/entities/DFGVariable.jl | 26 +++++++++----------------- src/services/DFGVariable.jl | 6 ++++++ test/LightDFGSummaryTypes.jl | 28 +++++++++++----------------- test/interfaceTests.jl | 26 ++++++++++---------------- 5 files changed, 38 insertions(+), 51 deletions(-) diff --git a/src/DistributedFactorGraphs.jl b/src/DistributedFactorGraphs.jl index 9b1c47a5..cb97a7a7 100644 --- a/src/DistributedFactorGraphs.jl +++ b/src/DistributedFactorGraphs.jl @@ -23,13 +23,14 @@ export InferenceType, PackedInferenceType, FunctorInferenceType, InferenceVariab export FunctorSingleton, FunctorPairwise, FunctorPairwiseMinimize export label, timestamp, tags, estimates, estimate, data, softtype, solverData, getData, solverDataDict, setSolverData, internalId, smallData, bigData export DFGVariableSummary, DFGFactorSummary, AbstractDFGSummary +export PointParametricEstimates # Services/AbstractDFG Exports export hasFactor, hasVariable, isInitialized, getFactorFunction, isVariable, isFactor export updateGraphSolverData! # Solver (IIF) Exports -export VariableNodeData, PackedVariableNodeData, VariableEstimate +export VariableNodeData, PackedVariableNodeData, timate export GenericFunctionNodeData#, FunctionNodeData export getSerializationModule, setSerializationModule! export pack, unpack diff --git a/src/entities/DFGVariable.jl b/src/entities/DFGVariable.jl index ab638b5b..c313168c 100644 --- a/src/entities/DFGVariable.jl +++ b/src/entities/DFGVariable.jl @@ -78,24 +78,16 @@ mutable struct PackedVariableNodeData end -abstract type AbstractVariableEstimate end """ $TYPEDEF Data container to store Parameteric Point Estimate (PPE) from a variety of types. - -Notes -- `ppeType` is something like `:max/:mean/:modefit` etc. -- `solveKey` is from super-solve concept, starting with `:default`, -- `estimate` is the actual numerical estimate value, -- Additional information such as how the data is represented (ie softtype) is stored alongside this data container in the `DFGVariableSummary` container. -""" -struct VariableEstimate <: AbstractVariableEstimate - solverKey::Symbol - ppeType::Symbol - estimate::Vector{Float64} +""" +struct PointParametricEstimates + # Put other fields here. + estimates::Dict{Symbol, Vector{Float64}} lastUpdatedTimestamp::DateTime - VariableEstimate(solverKey::Symbol, type::Symbol, estimate::Vector{Float64}, lastUpdatedTimestamp::DateTime=now()) = new(solverKey, type, estimate, lastUpdatedTimestamp) + PointParametricEstimates(lastUpdatedTimestamp::DateTime=now()) = new(Dict{Symbol, Vector{Float64}}(), lastUpdatedTimestamp) end """ @@ -106,15 +98,15 @@ mutable struct DFGVariable <: AbstractDFGVariable label::Symbol timestamp::DateTime tags::Vector{Symbol} - estimateDict::Dict{Symbol, Dict{Symbol, <: AbstractVariableEstimate}} + estimateDict::Dict{Symbol, PointParametricEstimates} solverDataDict::Dict{Symbol, VariableNodeData} smallData::Dict{String, String} bigData::Any ready::Int backendset::Int _internalId::Int64 - DFGVariable(label::Symbol, _internalId::Int64) = new(label, now(), Symbol[], Dict{Symbol, Dict{Symbol, VariableEstimate}}(), Dict{Symbol, VariableNodeData}(:default => VariableNodeData()), Dict{String, String}(), nothing, 0, 0, _internalId) - DFGVariable(label::Symbol) = new(label, now(), Symbol[], Dict{Symbol, VariableEstimate}(), Dict{Symbol, VariableNodeData}(:default => VariableNodeData()), Dict{String, String}(), nothing, 0, 0, 0) + DFGVariable(label::Symbol, _internalId::Int64) = new(label, now(), Symbol[], Dict{Symbol, PointParametricEstimates}(), Dict{Symbol, VariableNodeData}(:default => VariableNodeData()), Dict{String, String}(), nothing, 0, 0, _internalId) + DFGVariable(label::Symbol) = new(label, now(), Symbol[], Dict{Symbol, PointParametricEstimates}(), Dict{Symbol, VariableNodeData}(:default => VariableNodeData()), Dict{String, String}(), nothing, 0, 0, 0) end # Accessors @@ -166,7 +158,7 @@ mutable struct DFGVariableSummary <: AbstractDFGVariable label::Symbol timestamp::DateTime tags::Vector{Symbol} - estimateDict::Dict{Symbol, Dict{Symbol, <:AbstractVariableEstimate}} + estimateDict::Dict{Symbol, PointParametricEstimates} softtypename::Symbol _internalId::Int64 end diff --git a/src/services/DFGVariable.jl b/src/services/DFGVariable.jl index f9363049..b3a6c41f 100644 --- a/src/services/DFGVariable.jl +++ b/src/services/DFGVariable.jl @@ -102,6 +102,12 @@ function ==(a::VariableNodeData,b::VariableNodeData, nt::Symbol=:var) return DistributedFactorGraphs.compare(a,b) end +function ==(a::PointParametricEstimates, b::PointParametricEstimates)::Bool + a.estimates != b.estimates && return false + a.lastUpdatedTimestamp != b.lastUpdatedTimestamp && return false + return true +end + function convert(::Type{DFGVariableSummary}, v::DFGVariable) return DFGVariableSummary(v.label, v.timestamp, deepcopy(v.tags), deepcopy(v.estimateDict), Symbol(typeof(getSofttype(v))), v._internalId) end diff --git a/test/LightDFGSummaryTypes.jl b/test/LightDFGSummaryTypes.jl index bab3f36e..de8d85b2 100644 --- a/test/LightDFGSummaryTypes.jl +++ b/test/LightDFGSummaryTypes.jl @@ -1,6 +1,6 @@ dfg = LightDFG{NoSolverParams, DFGVariableSummary, DFGFactorSummary}() -DistributedFactorGraphs.DFGVariableSummary(label::Symbol) = DFGVariableSummary(label, DistributedFactorGraphs.now(), Symbol[], Dict{Symbol, VariableEstimate}(), :NA, 0) +DistributedFactorGraphs.DFGVariableSummary(label::Symbol) = DFGVariableSummary(label, DistributedFactorGraphs.now(), Symbol[], Dict{Symbol, PointParametricEstimates}(), :NA, 0) DistributedFactorGraphs.DFGFactorSummary(label::Symbol) = DFGFactorSummary(label, Symbol[], 0, Symbol[]) @@ -124,30 +124,24 @@ end var = getVariable(dfg, :a) #make a copy and simulate external changes newvar = deepcopy(var) - estimates(newvar)[:default] = Dict{Symbol, VariableEstimate}( - :max => VariableEstimate(:default, :max, [100.0]), - :mean => VariableEstimate(:default, :mean, [50.0]), - :modefit => VariableEstimate(:default, :modefit, [75.0])) + ppe = PointParametricEstimates() + ppe.estimates[:max] = [100.0] + ppe.estimates[:mean] = [50.0] + ppe.estimates[:modefit] = [75.0] + estimates(newvar)[:default] = ppe #update updateVariableSolverData!(dfg, newvar) - #TODO maybe implement ==; @test newvar==var - Base.:(==)(varest1::VariableEstimate, varest2::VariableEstimate) = begin - varest1.lastUpdatedTimestamp == varest2.lastUpdatedTimestamp || return false - varest1.ppeType == varest2.ppeType || return false - varest1.solverKey == varest2.solverKey || return false - varest1.estimate == varest2.estimate || return false - return true - end #For now spot check # @test solverDataDict(newvar) == solverDataDict(var) @test estimates(newvar) == estimates(var) # Delete :default and replace to see if new ones can be added delete!(estimates(newvar), :default) - estimates(newvar)[:second] = Dict{Symbol, VariableEstimate}( - :max => VariableEstimate(:default, :max, [10.0]), - :mean => VariableEstimate(:default, :mean, [5.0]), - :ppe => VariableEstimate(:default, :ppe, [7.0])) + ppe = PointParametricEstimates() + ppe.estimates[:max] = [10.0] + ppe.estimates[:mean] = [5.0] + ppe.estimates[:modefit] = [7.0] + estimates(newvar)[:second] = ppe # Persist to the original variable. updateVariableSolverData!(dfg, newvar) diff --git a/test/interfaceTests.jl b/test/interfaceTests.jl index 67829c8e..eefdf2f5 100644 --- a/test/interfaceTests.jl +++ b/test/interfaceTests.jl @@ -146,30 +146,24 @@ end var = getVariable(dfg, :a) #make a copy and simulate external changes newvar = deepcopy(var) - estimates(newvar)[:default] = Dict{Symbol, VariableEstimate}( - :max => VariableEstimate(:default, :max, [100.0]), - :mean => VariableEstimate(:default, :mean, [50.0]), - :modefit => VariableEstimate(:default, :modefit, [75.0])) + ppe = PointParametricEstimates() + ppe.estimates[:max] = [100.0] + ppe.estimates[:mean] = [50.0] + ppe.estimates[:modefit] = [75.0] + estimates(newvar)[:default] = ppe #update updateVariableSolverData!(dfg, newvar) - #TODO maybe implement ==; @test newvar==var - Base.:(==)(varest1::VariableEstimate, varest2::VariableEstimate) = begin - varest1.lastUpdatedTimestamp == varest2.lastUpdatedTimestamp || return false - varest1.ppeType == varest2.ppeType || return false - varest1.solverKey == varest2.solverKey || return false - varest1.estimate == varest2.estimate || return false - return true - end #For now spot check @test solverDataDict(newvar) == solverDataDict(var) @test estimates(newvar) == estimates(var) # Delete :default and replace to see if new ones can be added delete!(estimates(newvar), :default) - estimates(newvar)[:second] = Dict{Symbol, VariableEstimate}( - :max => VariableEstimate(:default, :max, [10.0]), - :mean => VariableEstimate(:default, :mean, [5.0]), - :modefit => VariableEstimate(:default, :modefit, [7.0])) + ppe = PointParametricEstimates() + ppe.estimates[:max] = [10.0] + ppe.estimates[:mean] = [5.0] + ppe.estimates[:modefit] = [7.0] + estimates(newvar)[:second] = ppe # Persist to the original variable. updateVariableSolverData!(dfg, newvar) From e45186eeeafa64df29d5a36e11f29bc86dcdee16 Mon Sep 17 00:00:00 2001 From: gearsad Date: Sun, 13 Oct 2019 22:44:32 -0500 Subject: [PATCH 2/2] Minor cleanup --- src/DistributedFactorGraphs.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DistributedFactorGraphs.jl b/src/DistributedFactorGraphs.jl index cb97a7a7..416ec603 100644 --- a/src/DistributedFactorGraphs.jl +++ b/src/DistributedFactorGraphs.jl @@ -30,7 +30,7 @@ export hasFactor, hasVariable, isInitialized, getFactorFunction, isVariable, isF export updateGraphSolverData! # Solver (IIF) Exports -export VariableNodeData, PackedVariableNodeData, timate +export VariableNodeData, PackedVariableNodeData export GenericFunctionNodeData#, FunctionNodeData export getSerializationModule, setSerializationModule! export pack, unpack