From 4fd10c4d75c3063e7dc816091ad84b876590ccf4 Mon Sep 17 00:00:00 2001 From: Johannes Terblanche Date: Mon, 13 Jul 2026 12:31:26 +0200 Subject: [PATCH] sum init = 0 fixes, delete bugfix, maintanace on Agent Blobentry --- src/DistributedFactorGraphs.jl | 3 +- src/GraphsDFG/services/blobentry_ops.jl | 43 +++++++++---------------- src/GraphsDFG/services/factor_ops.jl | 8 ++--- src/GraphsDFG/services/state_ops.jl | 8 ++--- src/GraphsDFG/services/variable_ops.jl | 7 ++-- src/entities/Blobentry.jl | 8 ++--- src/entities/Bloblet.jl | 2 +- src/entities/Multihash.jl | 2 ++ src/services/blob_save_load.jl | 2 +- 9 files changed, 35 insertions(+), 48 deletions(-) diff --git a/src/DistributedFactorGraphs.jl b/src/DistributedFactorGraphs.jl index 4e1e92b3..bf867689 100644 --- a/src/DistributedFactorGraphs.jl +++ b/src/DistributedFactorGraphs.jl @@ -331,7 +331,6 @@ const unstable_functions::Vector{Symbol} = [ :unpackBlob, :getMimetype, :getDataFormat, - :getMimetype, :emptyTags!, :ls, :lsf, @@ -370,7 +369,7 @@ const unstable_functions::Vector{Symbol} = [ # :emptyBlobstore!, #TODO maybe deprecate for just deleteBlobstore! :MetadataTypes, #maybe make public after metadata stable :getVariableTypeName, - :getStateKind, + # NOTE :getStateKind is declared `public` above, not unstable :setTimestamp, :setAgentMetadata!, :setGraphMetadata!, diff --git a/src/GraphsDFG/services/blobentry_ops.jl b/src/GraphsDFG/services/blobentry_ops.jl index fade3796..06590614 100644 --- a/src/GraphsDFG/services/blobentry_ops.jl +++ b/src/GraphsDFG/services/blobentry_ops.jl @@ -3,11 +3,7 @@ # ============================================================================== function DFG.addAgentBlobentry!(fg::GraphsDFG, agentlabel::Symbol, entry::Blobentry) - if haskey(fg.agents[agentlabel].blobentries, entry.label) - throw(LabelExistsError("Blobentry", entry.label)) - end - push!(fg.agents[agentlabel].blobentries, entry.label => entry) - return entry + return DFG.addBlobentry!(getAgent(fg, agentlabel), entry) end function DFG.addAgentBlobentries!( @@ -21,25 +17,20 @@ function DFG.addAgentBlobentries!( end function DFG.getAgentBlobentry(fg::GraphsDFG, agentlabel::Symbol, label::Symbol) - if !haskey(fg.agents[agentlabel].blobentries, label) - throw(LabelNotFoundError("Blobentry", label)) - end - return fg.agents[agentlabel].blobentries[label] + return DFG.getBlobentry(getAgent(fg, agentlabel), label) end function DFG.getAgentBlobentries( fg::GraphsDFG, agentlabel::Symbol; whereLabel::Union{Nothing, Function} = nothing, + whereMultihash::Union{Nothing, Function} = nothing, ) - entries = collect(values(fg.agents[agentlabel].blobentries)) - filterDFG!(entries, whereLabel, getLabel) - return entries + return DFG.getBlobentries(getAgent(fg, agentlabel); whereLabel, whereMultihash) end function DFG.mergeAgentBlobentry!(dfg::GraphsDFG, agentlabel::Symbol, entry::Blobentry) - DFG.refBlobentries(dfg.agents[agentlabel])[getLabel(entry)] = entry - return 1 + return DFG.mergeBlobentry!(getAgent(dfg, agentlabel), entry) end function DFG.mergeAgentBlobentries!( @@ -50,13 +41,11 @@ function DFG.mergeAgentBlobentries!( cnts = map(entries) do entry return DFG.mergeAgentBlobentry!(dfg, agentlabel, entry) end - return sum(cnts) + return sum(cnts; init = 0) end function DFG.deleteAgentBlobentry!(dfg::GraphsDFG, agentlabel::Symbol, label::Symbol) - !haskey(dfg.agents[agentlabel].blobentries, label) && return 0 - delete!(dfg.agents[agentlabel].blobentries, label) - return 1 + return DFG.deleteBlobentry!(getAgent(dfg, agentlabel), label) end function DFG.deleteAgentBlobentries!( @@ -67,15 +56,15 @@ function DFG.deleteAgentBlobentries!( cnts = map(labels) do label return deleteAgentBlobentry!(dfg, agentlabel, label) end - return sum(cnts) + return sum(cnts; init = 0) end function DFG.listAgentBlobentries(fg::GraphsDFG, agentlabel::Symbol) - return collect(keys(fg.agents[agentlabel].blobentries)) + return DFG.listBlobentries(getAgent(fg, agentlabel)) end function DFG.hasAgentBlobentry(dfg::GraphsDFG, agentlabel::Symbol, label::Symbol) - return haskey(dfg.agents[agentlabel].blobentries, label) + return DFG.hasBlobentry(getAgent(dfg, agentlabel), label) end # ============================================================================== @@ -120,7 +109,7 @@ function DFG.mergeGraphBlobentries!(dfg::GraphsDFG, entries::Vector{Blobentry}) cnts = map(entries) do entry return DFG.mergeGraphBlobentry!(dfg, entry) end - return sum(cnts) + return sum(cnts; init = 0) end function DFG.deleteGraphBlobentry!(dfg::GraphsDFG, label::Symbol) @@ -133,7 +122,7 @@ function DFG.deleteGraphBlobentries!(dfg::GraphsDFG, labels::Vector{Symbol}) cnts = map(labels) do label return deleteGraphBlobentry!(dfg, label) end - return sum(cnts) + return sum(cnts; init = 0) end function DFG.listGraphBlobentries( @@ -193,7 +182,7 @@ function DFG.mergeVariableBlobentries!( cnts = map(entries) do entry return DFG.mergeVariableBlobentry!(dfg, vLbl, entry) end - return sum(cnts) + return sum(cnts; init = 0) end function DFG.deleteVariableBlobentry!(dfg::GraphsDFG, label::Symbol, entryLabel::Symbol) @@ -208,7 +197,7 @@ function DFG.deleteVariableBlobentries!( cnts = map(labels) do label return deleteVariableBlobentry!(dfg, varLabel, label) end - return sum(cnts) + return sum(cnts; init = 0) end function DFG.listVariableBlobentries(dfg::GraphsDFG, variableLabel::Symbol) @@ -259,7 +248,7 @@ function DFG.mergeFactorBlobentries!( cnts = map(entries) do entry return DFG.mergeFactorBlobentry!(dfg, fLbl, entry) end - return sum(cnts) + return sum(cnts; init = 0) end function DFG.deleteFactorBlobentry!(dfg::GraphsDFG, label::Symbol, entryLabel::Symbol) @@ -274,7 +263,7 @@ function DFG.deleteFactorBlobentries!( cnts = map(labels) do label return DFG.deleteFactorBlobentry!(dfg, facLabel, label) end - return sum(cnts) + return sum(cnts; init = 0) end function DFG.listFactorBlobentries(dfg::GraphsDFG, factorLabel::Symbol) diff --git a/src/GraphsDFG/services/factor_ops.jl b/src/GraphsDFG/services/factor_ops.jl index 686d1d56..95a22f90 100644 --- a/src/GraphsDFG/services/factor_ops.jl +++ b/src/GraphsDFG/services/factor_ops.jl @@ -73,10 +73,10 @@ function DFG.deleteFactor!(dfg::GraphsDFG, label::Symbol) return 1 end -function DFG.deleteFactors!(dfg::AbstractDFG, labels::Vector{Symbol}) - count = sum(map(l->hasFactor(dfg, l), labels); init = 0) - rem_vertices!(dfg.g, map(l->dfg.g.labels[l], labels)) - return count +function DFG.deleteFactors!(dfg::GraphsDFG, labels::Vector{Symbol}) + fac_labels = filter(l -> hasFactor(dfg, l), labels) + rem_vertices!(dfg.g, map(l -> dfg.g.labels[l], fac_labels)) + return length(fac_labels) end function DFG.deleteFactors!(dfg::AbstractDFG; kwargs...) diff --git a/src/GraphsDFG/services/state_ops.jl b/src/GraphsDFG/services/state_ops.jl index 5983bc9d..79772b22 100644 --- a/src/GraphsDFG/services/state_ops.jl +++ b/src/GraphsDFG/services/state_ops.jl @@ -49,14 +49,14 @@ function DFG.mergeStates!( cnt = asyncmap(varLabel_state_pairs) do (varLabel, state) return mergeState!(dfg, varLabel, state) end - return sum(cnt) + return sum(cnt; init = 0) end function DFG.mergeStates!(dfg::GraphsDFG, variableLabel::Symbol, states::Vector{<:State}) cnt = asyncmap(states) do state return mergeState!(dfg, variableLabel, state) end - return sum(cnt) + return sum(cnt; init = 0) end # ============================================================================= @@ -72,7 +72,7 @@ function DFG.deleteStates!(dfg::GraphsDFG, variableLabel::Symbol, labels::Vector cnt = asyncmap(labels) do label return deleteState!(dfg, variableLabel, label) end - return sum(cnt) + return sum(cnt; init = 0) end function DFG.deleteStates!( @@ -82,7 +82,7 @@ function DFG.deleteStates!( cnt = asyncmap(varLabel_stateLabel_pairs) do (varLabel, stateLabel) return deleteState!(dfg, varLabel, stateLabel) end - return sum(cnt) + return sum(cnt; init = 0) end # ============================================================================= diff --git a/src/GraphsDFG/services/variable_ops.jl b/src/GraphsDFG/services/variable_ops.jl index 99b741e8..12868918 100644 --- a/src/GraphsDFG/services/variable_ops.jl +++ b/src/GraphsDFG/services/variable_ops.jl @@ -84,12 +84,13 @@ function DFG.deleteVariable!(dfg::GraphsDFG, label::Symbol)#::Tuple{AbstractGrap end function DFG.deleteVariables!(dfg::GraphsDFG, labels::Vector{Symbol}) + # skip labels that do not exist, consistent with deleteVariable! + var_labels = filter(l -> hasVariable(dfg, l), labels) + # collect factor neighbors for all variables before any deletion - fac_labels = mapreduce(l -> listNeighbors(dfg, l), union, labels; init = Symbol[]) + fac_labels = mapreduce(l -> listNeighbors(dfg, l), union, var_labels; init = Symbol[]) fac_labels = filter(l -> hasFactor(dfg, l), fac_labels) - var_labels = filter(l -> hasVariable(dfg, l), labels) - count = length(var_labels) + length(fac_labels) vs = map(l -> dfg.g.labels[l], [var_labels; fac_labels]) rem_vertices!(dfg.g, vs) diff --git a/src/entities/Blobentry.jl b/src/entities/Blobentry.jl index 9510f32e..a3ab8f10 100644 --- a/src/entities/Blobentry.jl +++ b/src/entities/Blobentry.jl @@ -30,7 +30,6 @@ StructUtils.@kwarg struct Blobentry metadata::JSONText = JSONText("{}") """ When the Blob itself was first created. Serialized as an ISO 8601 string.""" timestamp::TimeDateZone = now_tdz() - """ DFG serialization format version.""" """ DFG types serialization format version.""" version::VersionNumber = DFG.DFG_TYPES_VERSION end @@ -162,7 +161,7 @@ end deleteBlobentry!(node, entry) = deleteBlobentry!(node, getLabel(entry)) function deleteBlobentries!(node, labels::Vector{Symbol}) - return sum(deleteBlobentry!.(node, labels)) + return sum(deleteBlobentry!.(node, labels); init = 0) end """ @@ -197,11 +196,8 @@ Checks the integrity of a blob against the hashes stored in the given `Blobentry - Returns `nothing` if the multihash algorithm is unregistered. """ function verifyBlob(entry::Blobentry, blob) - # Reverse lookup: multicodec code -> hash function - code_to_func = Dict{UInt64, Function}(v => k for (k, v) in MULTIHASH_FUNCTIONS) - code, stored_digest = decode(entry.multihash) - func = get(code_to_func, code, nothing) + func = get(MULTIHASH_CODES, code, nothing) if isnothing(func) @warn "verifyBlob: unregistered multihash algorithm code $(repr(code)), skipping multihash check" return nothing diff --git a/src/entities/Bloblet.jl b/src/entities/Bloblet.jl index 192e4a4a..d4b7e37b 100644 --- a/src/entities/Bloblet.jl +++ b/src/entities/Bloblet.jl @@ -98,7 +98,7 @@ function deleteBloblet!(node, label::Symbol) end function deleteBloblets!(node, labels::Vector{Symbol}) - return sum(l -> deleteBloblet!(node, l), labels) + return sum(l -> deleteBloblet!(node, l), labels; init = 0) end """ diff --git a/src/entities/Multihash.jl b/src/entities/Multihash.jl index fbb2a3ba..4177b8f4 100644 --- a/src/entities/Multihash.jl +++ b/src/entities/Multihash.jl @@ -9,6 +9,8 @@ const MULTIHASH_FUNCTIONS = Dict{Function, UInt64}( sha3_512 => 0x14, sha3_256 => 0x16, ) +# Reverse lookup: multicodec code -> hash function +const MULTIHASH_CODES = Dict{UInt64, Function}(v => k for (k, v) in MULTIHASH_FUNCTIONS) @nonstruct struct Multihash bytes::Vector{UInt8} diff --git a/src/services/blob_save_load.jl b/src/services/blob_save_load.jl index 5d0555c4..f9d75b26 100644 --- a/src/services/blob_save_load.jl +++ b/src/services/blob_save_load.jl @@ -227,7 +227,7 @@ function saveImage_Variable!( provider::Symbol = :default; entry_kwargs..., ) - mimetype = get(entry_kwargs, :mimeType, MIME("image/png")) + mimetype = get(entry_kwargs, :mimetype, MIME("image/png")) format = getDataFormat(mimetype) isnothing(format) && throw(ArgumentError("Unsupported MIME type for image: $(mimetype)"))