1
1
import ... DistributedFactorGraphs: DFGVariable, DFGFactor
2
2
3
3
# Accessors
4
- getLabelDict (dfg:: SymbolDFG ) = dfg. g . labelDict
4
+ getLabelDict (dfg:: SymbolDFG ) = dfg. labelDict
5
5
getDescription (dfg:: SymbolDFG ) = dfg. description
6
6
setDescription (dfg:: SymbolDFG , description:: String ) = dfg. description = description
7
7
getInnerGraph (dfg:: SymbolDFG ) = dfg. g
@@ -38,6 +38,10 @@ exists(dfg::SymbolDFG, nId::Symbol) = haskey(dfg.g.fadjdict, nId)
38
38
Add a DFGVariable to a DFG.
39
39
"""
40
40
function addVariable! (dfg:: SymbolDFG , variable:: DFGVariable ):: Bool
41
+ # TODO should this be an error
42
+ if haskey (dfg. g. variables, variable. label)
43
+ error (" Variable '$(variable. label) ' already exists in the factor graph" )
44
+ end
41
45
42
46
# NOTE Internal ID always set to zero as it is not needed?
43
47
variable. _internalId = 0
@@ -58,6 +62,10 @@ function addFactor!(dfg::SymbolDFG, variables::Vector{DFGVariable}, factor::DFGF
58
62
# if haskey(dfg.g.metaindex[:label], factor.label)
59
63
# error("Factor '$(factor.label)' already exists in the factor graph")
60
64
# end
65
+ # TODO should this be an error
66
+ if haskey (dfg. g. factors, factor. label)
67
+ error (" Factor '$(factor. label) ' already exists in the factor graph" )
68
+ end
61
69
# for v in variables
62
70
# if !(v.label in keys(dfg.g.metaindex[:label]))
63
71
# error("Variable '$(v.label)' not found in graph when creating Factor '$(factor.label)'")
80
88
Add a DFGFactor to a DFG.
81
89
"""
82
90
function addFactor! (dfg:: SymbolDFG , variableLabels:: Vector{Symbol} , factor:: DFGFactor ):: Bool
83
-
91
+ # TODO should this be an error
92
+ if haskey (dfg. g. factors, factor. label)
93
+ error (" Factor '$(factor. label) ' already exists in the factor graph" )
94
+ end
84
95
factor. _internalId = 0
85
96
86
97
factor. _variableOrderSymbols = variableLabels
@@ -110,16 +121,15 @@ end
110
121
getFactor (dfg:: SymbolDFG , label:: String ) = getFactor (dfg, Symbol (label))
111
122
112
123
113
- #=
114
124
"""
115
125
$(SIGNATURES)
116
126
Update a complete DFGVariable in the DFG.
117
127
"""
118
128
function updateVariable! (dfg:: SymbolDFG , variable:: DFGVariable ):: DFGVariable
119
- if !haskey(dfg.g.metaindex[:label] , variable.label)
129
+ if ! haskey (dfg. g. variables , variable. label)
120
130
error (" Variable label '$(variable. label) ' does not exist in the factor graph" )
121
131
end
122
- set_prop!( dfg.g, dfg.g [variable.label,:label], :variable, variable)
132
+ dfg. g. variables [variable. label] = variable
123
133
return variable
124
134
end
125
135
@@ -128,10 +138,10 @@ end
128
138
Update a complete DFGFactor in the DFG.
129
139
"""
130
140
function updateFactor! (dfg:: SymbolDFG , factor:: DFGFactor ):: DFGFactor
131
- if !haskey(dfg.g.metaindex[:label] , factor.label)
141
+ if ! haskey (dfg. g. factors , factor. label)
132
142
error (" Factor label '$(factor. label) ' does not exist in the factor graph" )
133
143
end
134
- set_prop!( dfg.g, dfg.g [factor.label,:label], :factor, factor)
144
+ dfg. g. factors [factor. label] = factor
135
145
return factor
136
146
end
137
147
@@ -140,11 +150,11 @@ end
140
150
Delete a DFGVariable from the DFG using its label.
141
151
"""
142
152
function deleteVariable! (dfg:: SymbolDFG , label:: Symbol ):: DFGVariable
143
- if !haskey(dfg.g.metaindex[:label] , label)
153
+ if ! haskey (dfg. g. variables , label)
144
154
error (" Variable label '$(label) ' does not exist in the factor graph" )
145
155
end
146
- variable = get_prop( dfg.g, dfg.g [label,:label], :variable)
147
- rem_vertex!(dfg.g, dfg.g[ label,:label] )
156
+ variable = dfg. g. variables [label]
157
+ rem_vertex! (dfg. g, label)
148
158
149
159
return variable
150
160
end
@@ -161,11 +171,11 @@ deleteVariable!(dfg::SymbolDFG, variable::DFGVariable)::DFGVariable = deleteVari
161
171
Delete a DFGFactor from the DFG using its label.
162
172
"""
163
173
function deleteFactor! (dfg:: SymbolDFG , label:: Symbol ):: DFGFactor
164
- if !haskey(dfg.g.metaindex[:label] , label)
174
+ if ! haskey (dfg. g. factors , label)
165
175
error (" Factor label '$(label) ' does not exist in the factor graph" )
166
176
end
167
- factor = get_prop( dfg.g, dfg.g [label,:label], :factor)
168
- MetaGraphs. rem_vertex!(dfg.g, dfg.g[ label,:label] )
177
+ factor = dfg. g. factors [label]
178
+ variable = rem_vertex! (dfg. g, label)
169
179
return factor
170
180
end
171
181
@@ -184,8 +194,7 @@ Optionally specify a label regular expression to retrieves a subset of the varia
184
194
function getVariables (dfg:: SymbolDFG , regexFilter:: Union{Nothing, Regex} = nothing ; tags:: Vector{Symbol} = Symbol[]):: Vector{DFGVariable}
185
195
186
196
# variables = map(v -> v.dfgNode, filter(n -> n.dfgNode isa DFGVariable, vertices(dfg.g)))
187
- variableIds = collect(filter_vertices(dfg.g, :variable))
188
- variables = map(vId->getVariable(dfg, vId), variableIds)
197
+ variables = collect (values (dfg. g. variables))
189
198
if regexFilter != nothing
190
199
variables = filter (v -> occursin (regexFilter, String (v. label)), variables)
191
200
end
@@ -210,11 +219,7 @@ Related
210
219
211
220
ls
212
221
"""
213
- function getVariableIds(dfg::SymbolDFG, regexFilter::Union{Nothing, Regex}=nothing; tags::Vector{Symbol}=Symbol[])::Vector{Symbol}
214
- vars = getVariables(dfg, regexFilter, tags=tags)
215
- # mask = map(v -> length(intersect(v.tags, tags)) > 0, vars )
216
- map(v -> v.label, vars)
217
- end
222
+ getVariableIds (dfg:: SymbolDFG , regexFilter:: Union{Nothing, Regex} = nothing ; tags:: Vector{Symbol} = Symbol[]):: Vector{Symbol} = map (v -> v. label, getVariables (dfg, regexFilter, tags= tags))
218
223
219
224
# Alias
220
225
"""
@@ -231,8 +236,7 @@ Optionally specify a label regular expression to retrieves a subset of the facto
231
236
"""
232
237
function getFactors (dfg:: SymbolDFG , regexFilter:: Union{Nothing, Regex} = nothing ):: Vector{DFGFactor}
233
238
# factors = map(v -> v.dfgNode, filter(n -> n.dfgNode isa DFGFactor, vertices(dfg.g)))
234
- factorIds = collect(filter_vertices(dfg.g, :factor))
235
- factors = map(vId->getFactor(dfg, vId), factorIds)
239
+ factors = collect (values (dfg. g. factors))
236
240
if regexFilter != nothing
237
241
factors = filter (f -> occursin (regexFilter, String (f. label)), factors)
238
242
end
267
271
Checks if the graph is fully connected, returns true if so.
268
272
"""
269
273
function isFullyConnected (dfg:: SymbolDFG ):: Bool
270
- return length(LightGraphs. connected_components(dfg.g)) == 1
274
+ return length (connected_components (dfg. g)) == 1
271
275
end
272
276
273
277
# Alias
@@ -277,70 +281,71 @@ Checks if the graph is not fully connected, returns true if it is not contiguous
277
281
"""
278
282
hasOrphans (dfg:: SymbolDFG ):: Bool = ! isFullyConnected (dfg)
279
283
280
- function _isready(dfg::SymbolDFG, idx::Int , ready::Int)::Bool
281
- p = props(dfg.g, idx)
282
- haskey(p, :variable ) && (return p[:variable ].ready == ready)
283
- haskey(p, :factor ) && (return p[:factor ].ready == ready)
284
+ function _isready (dfg:: SymbolDFG , label :: Symbol , ready:: Int ):: Bool
285
+
286
+ haskey (dfg . g . variables, label ) && (return dfg . g . variables[label ]. ready == ready)
287
+ haskey (dfg . g . factors, label ) && (return dfg . g . factors[label ]. ready == ready)
284
288
285
- #TODO should this be an error?
286
- @warn "Node not a factor or variable"
289
+ # TODO should this be a breaking error?
290
+ @error " Node not in factor or variable"
287
291
return false
288
292
end
289
293
290
- function _isbackendset(dfg::SymbolDFG, idx::Int, backendset::Int)::Bool
291
- p = props(dfg.g, idx)
292
- haskey(p, :variable) && (return p[:variable].ready == backendset)
293
- haskey(p, :factor) && (return p[:factor].ready == backendset)
294
+ function _isbackendset (dfg:: SymbolDFG , label:: Symbol , backendset:: Int ):: Bool
295
+ haskey (dfg. g. variables, label) && (return dfg. g. variables[label]. backendset == backendset)
296
+ haskey (dfg. g. factors, label) && (return dfg. g. factors[label]. backendset == backendset)
294
297
295
- #TODO should this be an error?
296
- @warn "Node not a factor or variable"
298
+ # TODO should this be a breaking error?
299
+ @error " Node not a factor or variable"
297
300
return false
298
301
end
302
+
299
303
"""
300
304
$(SIGNATURES)
301
305
Retrieve a list of labels of the immediate neighbors around a given variable or factor.
302
306
"""
303
- function getNeighbors(dfg::SymbolDFG, node::T; ready::Union{Nothing, Int}=nothing, backendset::Union{Nothing, Int}=nothing)::Vector{Symbol} where T <: DFGNode
304
- if !haskey(dfg.g.metaindex[:label], node.label)
307
+ function getNeighbors (dfg:: SymbolDFG , node:: DFGNode ; ready:: Union{Nothing, Int} = nothing , backendset:: Union{Nothing, Int} = nothing ):: Vector{Symbol}
308
+ label = node. label
309
+ if ! haskey (dfg. g. fadjdict, label)
305
310
error (" Variable/factor with label '$(node. label) ' does not exist in the factor graph" )
306
311
end
307
312
308
- neighbors = map(idx->get_prop(dfg.g, idx, :label), LightGraphs.neighbors (dfg.g, dfg.g[node. label,:label]) )
313
+ neighbors_ll = outneighbors (dfg. g, label)
309
314
# Additional filtering
310
- neighbors = ready != nothing ? filter(lbl -> _isready(dfg, dfg.g[ lbl,:label], ready), neighbors) : neighbors
311
- neighbors = backendset != nothing ? filter(lbl -> _isbackendset(dfg, dfg.g[ lbl,:label], backendset), neighbors) : neighbors
315
+ ready != nothing && filter! (lbl -> _isready (dfg, lbl, ready), neighbors_ll)
316
+ backendset != nothing && filter! (lbl -> _isbackendset (dfg, lbl, backendset), neighbors_ll)
312
317
313
318
# Variable sorting (order is important)
314
319
if node isa DFGFactor
315
- order = intersect(node._variableOrderSymbols, neighbors )#map(v->v.dfgNode.label, neighbors))
320
+ order = intersect (node. _variableOrderSymbols, neighbors_ll )# map(v->v.dfgNode.label, neighbors))
316
321
return order
317
322
end
318
323
319
- return neighbors
324
+ return neighbors_ll
320
325
end
326
+
327
+
321
328
"""
322
329
$(SIGNATURES)
323
330
Retrieve a list of labels of the immediate neighbors around a given variable or factor specified by its label.
324
331
"""
325
332
function getNeighbors (dfg:: SymbolDFG , label:: Symbol ; ready:: Union{Nothing, Int} = nothing , backendset:: Union{Nothing, Int} = nothing ):: Vector{Symbol} where T <: DFGNode
326
- if !haskey(dfg.g.metaindex[:label] , label)
333
+ if ! haskey (dfg. g. fadjdict , label)
327
334
error (" Variable/factor with label '$(label) ' does not exist in the factor graph" )
328
335
end
329
336
330
- # neighbors = in_neighbors(vert, dfg.g) #Don't use out_neighbors! It enforces directiveness even if we don't want it
331
- neighbors = map(idx->get_prop(dfg.g, idx, :label), LightGraphs.neighbors(dfg.g, dfg.g[label,:label]))
337
+ neighbors_ll = outneighbors (dfg. g, label)
332
338
# Additional filtering
333
- neighbors = ready != nothing ? filter(lbl -> _isready(dfg, dfg.g[ lbl,:label], ready), neighbors) : neighbors
334
- neighbors = backendset != nothing ? filter(lbl -> _isbackendset(dfg, dfg.g[ lbl,:label], backendset), neighbors) : neighbors
339
+ ready != nothing && filter! (lbl -> _isready (dfg, lbl, ready), neighbors_ll)
340
+ backendset != nothing && filter! (lbl -> _isbackendset (dfg, lbl, backendset), neighbors_ll)
335
341
336
- # Variable sorting when using a factor (function order is important)
337
- if has_prop(dfg.g, dfg.g[label,:label], :factor)
338
- node = get_prop(dfg.g, dfg.g[label,:label], :factor)
339
- order = intersect(node._variableOrderSymbols, neighbors)
342
+ # Variable sorting (order is important)
343
+ if haskey (dfg. g. factors, label)
344
+ order = intersect (dfg. g. factors[label]. _variableOrderSymbols, neighbors_ll)# map(v->v.dfgNode.label, neighbors))
340
345
return order
341
346
end
342
347
343
- return neighbors
348
+ return neighbors_ll
344
349
345
350
end
346
351
@@ -360,6 +365,7 @@ function ls(dfg::SymbolDFG, label::Symbol)::Vector{Symbol} where T <: DFGNode
360
365
return getNeighbors (dfg, label)
361
366
end
362
367
368
+ #=
363
369
function _copyIntoGraph!(sourceDFG::SymbolDFG, destDFG::SymbolDFG, ns::Vector{Int}, includeOrphanFactors::Bool=false)::Nothing
364
370
# Split into variables and factors
365
371
subgraph = sourceDFG.g[ns]
0 commit comments