Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

packed factors are nested JSON only, #1476

Merged
merged 1 commit into from
Jan 31, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/Deprecated.jl
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,16 @@ export FunctorInferenceType, PackedInferenceType
## Deprecate code below before v0.28
##==============================================================================

function Base.convert(::Type{String},
obj::FluxModelsDistribution)
#
@error "Obsolete, FluxModelsSerialization should not return String for general cases of PackedSamplableBelief"
# convert to packed type first
packed = convert(PackedFluxModelsDistribution, obj)
# FIXME, should not return String for general cases of PackedSamplableBelief
return JSON2.write(packed)
end


# import IncrementalInference: decodefg, loadjld

Expand Down
2 changes: 2 additions & 0 deletions src/ExportAPI.jl
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,8 @@ export PackedZeroMeanDiagNormal, PackedZeroMeanFullNormal, PackedDiagNormal, Pac
export PackedManifoldKernelDensity
export PackedAliasingScalarSampler, PackedHeatmapGridDensity, PackedLevelSetGridNormal

export Mixture, PackedMixture

export sampleTangent
export samplePoint

Expand Down
20 changes: 8 additions & 12 deletions src/Factors/Circular.jl
Original file line number Diff line number Diff line change
Expand Up @@ -72,16 +72,14 @@ $(TYPEDEF)
Serialized object for storing PriorCircular.
"""
mutable struct PackedPriorCircular <: AbstractPackedFactor
datastr::String
# PackedPriorCircular() = new()
# PackedPriorCircular(x::String) = new(x)
Base.@kwdef struct PackedPriorCircular <: AbstractPackedFactor
Z::PackedSamplableBelief
end
function convert(::Type{PackedPriorCircular}, d::PriorCircular)
return PackedPriorCircular(convert(String, d.Z)) # TODO, PackedSamplableBelief
return PackedPriorCircular(convert(PackedSamplableBelief, d.Z))
end
function convert(::Type{PriorCircular}, d::PackedPriorCircular)
distr = convert(SamplableBelief, d.datastr)
distr = convert(SamplableBelief, d.Z)
return PriorCircular{typeof(distr)}(distr)
end

Expand All @@ -97,16 +95,14 @@ $(TYPEDEF)
Serialized object for storing CircularCircular.
"""
mutable struct PackedCircularCircular <: AbstractPackedFactor
datastr::String
# PackedCircularCircular() = new()
# PackedCircularCircular(x::String) = new(x)
Base.@kwdef struct PackedCircularCircular <: AbstractPackedFactor
Z::PackedSamplableBelief
end
function convert(::Type{CircularCircular}, d::PackedCircularCircular)
return CircularCircular(convert(SamplableBelief, d.datastr))
return CircularCircular(convert(SamplableBelief, d.Z))
end
function convert(::Type{PackedCircularCircular}, d::CircularCircular)
return PackedCircularCircular(convert(String, d.Z)) # TODO, PackedSamplableBelief
return PackedCircularCircular(convert(PackedSamplableBelief, d.Z))
end


Expand Down
6 changes: 3 additions & 3 deletions src/Factors/DefaultPrior.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ $(TYPEDEF)
Serialization type for Prior.
"""
mutable struct PackedPrior <: AbstractPackedFactor
Z::String
Base.@kwdef mutable struct PackedPrior <: AbstractPackedFactor
Z::PackedSamplableBelief
end
function convert(::Type{PackedPrior}, d::Prior)
PackedPrior(convert(String, d.Z)) # TODO, PackedSamplableBelief
PackedPrior(convert(PackedSamplableBelief, d.Z))
end
function convert(::Type{Prior}, d::PackedPrior)
Prior(convert(SamplableBelief, d.Z))
Expand Down
6 changes: 3 additions & 3 deletions src/Factors/EuclidDistance.jl
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ Base.convert(::Type{<:MB.AbstractManifold}, ::InstanceType{EuclidDistance}) = Ma
$(TYPEDEF)
Serialization type for `EuclidDistance` binary factor.
"""
mutable struct PackedEuclidDistance <: AbstractPackedFactor
Base.@kwdef mutable struct PackedEuclidDistance <: AbstractPackedFactor
_type::String
Z::String
Z::PackedSamplableBelief
end

function convert(::Type{PackedEuclidDistance}, d::EuclidDistance)
PackedEuclidDistance( "/application/JuliaLang/PackedSamplableBelief",
convert(String, d.Z) ) # TODO, PackedSamplableBelief
convert(PackedSamplableBelief, d.Z) )
end

function convert(::Type{<:EuclidDistance}, d::PackedEuclidDistance)
Expand Down
8 changes: 3 additions & 5 deletions src/Factors/GenericFunctions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -155,10 +155,10 @@ function mahalanobus_distance2(M, X, inv_Σ)
end


mutable struct PackedManifoldPrior <: AbstractPackedFactor
Base.@kwdef mutable struct PackedManifoldPrior <: AbstractPackedFactor
varType::String
p::Vector{Float64} #NOTE This is a fixed point from where the measurement `Z` likely stored as a coordinate
Z::String
Z::PackedSamplableBelief
end


Expand All @@ -171,8 +171,7 @@ function convert(::Union{Type{<:AbstractPackedFactor}, Type{<:PackedManifoldPrio
c = AMP.makeCoordsFromPoint(obj.M, obj.p)

# TODO convert all distributions to JSON
Zst = convert(String, obj.Z)
# Zst = string(obj.Z)
Zst = convert(PackedSamplableBelief, obj.Z) # String

PackedManifoldPrior(varT, c, Zst)
end
Expand All @@ -190,7 +189,6 @@ function convert(::Union{Type{<:AbstractFactor}, Type{<:ManifoldPrior}},
# u0 = getPointIdentity(obj.varType)
p = AMP.makePointFromCoords(M, obj.p, e0) #, u0)

@show obj.Z
Z = convert(SamplableBelief, obj.Z)

ManifoldPrior(M, p, Z)
Expand Down
2 changes: 1 addition & 1 deletion src/Factors/GenericMarginal.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ end

getSample(::CalcFactor{<:GenericMarginal}) = [0]

mutable struct PackedGenericMarginal <: AbstractPackedFactor
Base.@kwdef mutable struct PackedGenericMarginal <: AbstractPackedFactor
Zij::Array{Float64,1}
Cov::Array{Float64,1}
W::Array{Float64,1}
Expand Down
6 changes: 3 additions & 3 deletions src/Factors/LinearRelative.jl
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ Base.convert(::Type{<:MB.AbstractManifold}, ::InstanceType{LinearRelative{N}}) w
$(TYPEDEF)
Serialization type for `LinearRelative` binary factor.
"""
mutable struct PackedLinearRelative <: AbstractPackedFactor
Z::String
Base.@kwdef mutable struct PackedLinearRelative <: AbstractPackedFactor
Z::PackedSamplableBelief
end
function convert(::Type{PackedLinearRelative}, d::LinearRelative)
PackedLinearRelative(convert(String, d.Z)) # TODO, PackedSamplableBelief
PackedLinearRelative(convert(PackedSamplableBelief, d.Z))
end
function convert(::Type{LinearRelative}, d::PackedLinearRelative)
LinearRelative(convert(SamplableBelief, d.Z))
Expand Down
14 changes: 6 additions & 8 deletions src/Factors/Mixture.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@

export Mixture, PackedMixture


_defaultNamesMixtures(N::Int) = ((Symbol[Symbol("c$i") for i in 1:N])...,)
Expand Down Expand Up @@ -107,28 +106,27 @@ $(TYPEDEF)

Serialization type for `Mixture`.
"""
mutable struct PackedMixture <: AbstractPackedFactor
Base.@kwdef mutable struct PackedMixture <: AbstractPackedFactor
N::Int
# store the packed type for later unpacking
F_::String
S::Vector{String}
components::Vector{String}
diversity::String
components::Vector{PackedSamplableBelief}
diversity::PackedSamplableBelief
end


function convert(::Type{<:PackedMixture}, obj::Mixture{N,F,S,T}) where {N,F,S,T}
allcomp = String[]
allcomp = PackedSamplableBelief[]
for val in obj.components
dtr_ = convert(String, val) # PackedSamplableBelief
dtr_ = convert(PackedSamplableBelief, val)
# FIXME ON FIRE, likely to be difficult for non-standard "Samplable" types -- e.g. Flux models in RoME
# dtr_ = JSON2.write(packDistribution(val))
push!(allcomp, dtr_)
end
pm = DFG.convertPackedType(obj.mechanics)
pm_ = convert(pm, obj.mechanics)
sT = string(typeof(pm_))
dvst = convert(String, obj.diversity) # PackedSamplableBelief
dvst = convert(PackedSamplableBelief, obj.diversity)
PackedMixture( N, sT, string.(collect(S)), allcomp, dvst )
end

Expand Down
6 changes: 3 additions & 3 deletions src/Factors/MsgPrior.jl
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,13 @@ getManifold(mp::MsgPrior{<:ManifoldKernelDensity}) = mp.Z.manifold



struct PackedMsgPrior <: AbstractPackedFactor
Z::String
Base.@kwdef struct PackedMsgPrior <: AbstractPackedFactor
Z::PackedSamplableBelief
infoPerCoord::Vector{Float64}
end

function convert(::Type{PackedMsgPrior}, d::MsgPrior)
PackedMsgPrior(convert(String, d.Z), d.infoPerCoord) # TODO PackedSamplableBelief
PackedMsgPrior(convert(PackedSamplableBelief, d.Z), d.infoPerCoord)
end
function convert(::Type{<:MsgPrior}, d::PackedMsgPrior)
MsgPrior(convert(SamplableBelief, d.Z), d.infoPerCoord)
Expand Down
6 changes: 3 additions & 3 deletions src/Factors/PartialPrior.jl
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@ $(TYPEDEF)
Serialization type for `PartialPrior`.
"""
mutable struct PackedPartialPrior <: AbstractPackedFactor
Z::String
Base.@kwdef struct PackedPartialPrior <: AbstractPackedFactor
Z::PackedSamplableBelief
partials::Vector{Int}
end

function convert(::Type{PackedPartialPrior}, d::PartialPrior)
PackedPartialPrior(convert(String, d.Z), [d.partial...;]) # TODO, PackedSamplableBelief
PackedPartialPrior(convert(PackedSamplableBelief, d.Z), [d.partial...;])
end
function convert(::Type{PartialPrior}, d::PackedPartialPrior)
PartialPrior(convert(SamplableBelief, d.Z),(d.partials...,))
Expand Down
17 changes: 4 additions & 13 deletions src/Factors/PartialPriorPassThrough.jl
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ getSample(cf::CalcFactor{<:PartialPriorPassThrough}) = sampleTangent(getManifold
Required internal density to store its type
"""
mutable struct PackedPartialPriorPassThrough <: AbstractPackedFactor
Z::String # PackedHeatmapGridDensity
Base.@kwdef mutable struct PackedPartialPriorPassThrough <: AbstractPackedFactor
Z::PackedSamplableBelief # PackedHeatmapGridDensity
partial::Vector{Int}
end

Expand All @@ -34,25 +34,16 @@ function convert( ::Union{Type{<:AbstractPackedFactor}, Type{<:PackedPartialPrio
obj::PartialPriorPassThrough )
#

# TODO, PackedSamplableBelief
str = convert(String, obj.Z)
# po = convert(PackedSamplableBelief, obj.Z)
# str = JSON2.write(po)
PackedPartialPriorPassThrough(str, Int[obj.partial...])
po = convert(PackedSamplableBelief, obj.Z)
PackedPartialPriorPassThrough(po, Int[obj.partial...])
end


function convert( ::Union{Type{<:AbstractFactor}, Type{<:PartialPriorPassThrough}},
obj::PackedPartialPriorPassThrough )
#

# get as bland obj to extract type
dens = convert(SamplableBelief, obj.Z)
# _up = JSON2.read(obj.Z)
# _typ = DFG.getTypeFromSerializationModule(_up._type)
# # now redo with type
# pdens = JSON2.read(obj.Z, _typ)
# dens = convert(SamplableBelief, pdens)
PartialPriorPassThrough(dens, tuple(obj.partial...))
end

Expand Down
6 changes: 3 additions & 3 deletions src/Serialization/entities/AdditionalDensities.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@



struct PackedManifoldKernelDensity <: PackedSamplableBelief
Base.@kwdef struct PackedManifoldKernelDensity <: PackedSamplableBelief
_type::String
varType::String
pts::Vector{Vector{Float64}}
Expand All @@ -18,7 +18,7 @@ Base.@kwdef struct PackedAliasingScalarSampler <: PackedSamplableBelief
end


mutable struct PackedHeatmapGridDensity <: PackedSamplableBelief
Base.@kwdef mutable struct PackedHeatmapGridDensity <: PackedSamplableBelief
_type::String
data::Vector{Vector{Float64}}
domain::Tuple{Vector{Float64}, Vector{Float64}}
Expand All @@ -29,7 +29,7 @@ mutable struct PackedHeatmapGridDensity <: PackedSamplableBelief
end


mutable struct PackedLevelSetGridNormal <: PackedSamplableBelief
Base.@kwdef mutable struct PackedLevelSetGridNormal <: PackedSamplableBelief
_type::String
level::Float64
sigma::Float64
Expand Down
4 changes: 2 additions & 2 deletions src/Serialization/entities/FluxModelsSerialization.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
export PackedFluxModelsDistribution


mutable struct PackedFluxModelsDistribution <: IIF.PackedSamplableBelief
Base.@kwdef mutable struct PackedFluxModelsDistribution <: PackedSamplableBelief
# standardized _type field
_type::String
# shape of the input data
Expand All @@ -21,6 +21,6 @@ mutable struct PackedFluxModelsDistribution <: IIF.PackedSamplableBelief
serializeHollow::Bool
# TODO remove requirement and standardize sampler API
# specialSampler::Symbol
# field name usage to direct the IIF serialization towards JSON method
# TODO, only use ._type. Legacy, field name usage to direct the IIF serialization towards JSON method
PackedSamplableTypeJSON::String
end
22 changes: 11 additions & 11 deletions src/Serialization/services/FluxModelsSerialization.jl
Original file line number Diff line number Diff line change
Expand Up @@ -79,16 +79,6 @@ function packDistribution(obj::FluxModelsDistribution)
end


function Base.convert(::Type{String}, # ::Union{Type{<:PackedSamplableBelief},Type{<:PackedFluxModelsDistribution}},
obj::FluxModelsDistribution)
#
# convert to packed type first
packed = packDistribution(obj)
# FIXME, should not return String for general cases of PackedSamplableBelief
return JSON2.write(packed)
end



function unpackDistribution(obj::PackedFluxModelsDistribution)
#
Expand All @@ -111,10 +101,20 @@ end



function Base.convert(::Union{Type{<:PackedSamplableBelief},Type{<:PackedFluxModelsDistribution}},
obj::FluxModelsDistribution)
#
# convert to packed type first
return packDistribution(obj)
end



function convert( ::Union{Type{<:SamplableBelief},Type{<:FluxModelsDistribution}},
obj::PackedFluxModelsDistribution )
#
return unpackDistirbution(obj)
return unpackDistribution(obj)
end


#
22 changes: 22 additions & 0 deletions src/Serialization/services/SerializingDistributions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,24 @@ packDistribution(dtr::FullNormal) = PackedFullNormal(; mu=dtr.μ, cov=dtr.Σ.mat

packDistribution(dtr::AliasingScalarSampler) = PackedAliasingScalarSampler(; domain=dtr.domain, weights=dtr.weights.values )

# A more specialized constructor to help serialization processes reading Any[Any[1,2,3,..]] rather than floats.
function PackedHeatmapGridDensity(
_type::String,
data::AbstractVector, # {Any}
domain::AbstractVector, # {Any}
hint_callback::String,
bw_factor::Float64,
N::Int64 )
#
data_ = Vector{Vector{Float64}}(undef, length(data))
for (i,dat) in enumerate(data)
data_[i] = float.(dat)
end
domain_ = tuple(float.(domain[1]), float.(domain[2]))

PackedHeatmapGridDensity(_type, data_, domain_, hint_callback, bw_factor, N)
end

function packDistribution( obj::HeatmapGridDensity )
#
data_ = obj.data
Expand Down Expand Up @@ -101,6 +119,10 @@ unpackDistribution(dtr::PackedLevelSetGridNormal) = LevelSetGridNormal( dtr.leve
convert(::Type{<:PackedSamplableBelief}, obj::StringThemSamplableBeliefs) = packDistribution(obj)
convert(::Type{<:SamplableBelief}, obj::PackedSamplableBelief) = unpackDistribution(obj)

function convert(::Type{<:PackedSamplableBelief}, nt::NamedTuple)
distrType = DFG.getTypeFromSerializationModule(nt._type)
distrType(;nt...)
end

##===================================================================================

Expand Down
1 change: 1 addition & 0 deletions test/testCircular.jl
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ gt = rem2pi.(collect(0:4), RoundNearest)
d = "/tmp/caesar/random/testfg"
saveDFG(d,fg)
lfg = loadDFG(d)
##
Base.rm(d*".tar.gz")
# check loaded fg for all variable and factors
@test issetequal(ls(fg), ls(lfg))
Expand Down
Loading