diff --git a/src/DistributedFactorGraphs.jl b/src/DistributedFactorGraphs.jl index 9b1c47a5..416ec603 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 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)