1
- # For visualization
2
- # import Graphs: attributes, vertex_index
3
- # # Export attributes, these are enumerates as properties for the variables and factors
4
- # # REF: http://www.graphviz.org/documentation/
5
- # function attributes(v::LightGraphsNode, g::T)::AttributeDict where T <:GenericIncidenceList
6
- # AttributeDict(
7
- # "label" => v.dfgNode.label,
8
- # "color" => v.dfgNode isa DFGVariable ? "red" : "blue",
9
- # "shape" => v.dfgNode isa DFGVariable ? "box" : "ellipse",
10
- # "fillcolor" => v.dfgNode isa DFGVariable ? "red" : "blue"
11
- # )
12
- # end
13
- #
14
- # # This is insanely important - if we don't provide a valid index, the edges don't work correctly.
15
- # vertex_index(v::LightGraphsNode) = v.index
16
-
17
1
# Accessors
18
2
getLabelDict (dfg:: LightGraphsDFG ) = dfg. labelDict
19
3
getDescription (dfg:: LightGraphsDFG ) = dfg. description
@@ -47,37 +31,24 @@ function addVariable!(dfg::LightGraphsDFG, variable::DFGVariable)::Bool
47
31
end
48
32
dfg. nodeCounter += 1
49
33
50
- # TODO kyk na nv(fg) dink nie die gaan in LightGraphs werk nie
51
- variable. _internalId = dfg. nodeCounter
52
- # ek dink die node id gaan verlore gaan
53
- # v = LightGraphsNode(dfg.nodeCounter, variable)
54
- # dalk eerder op die baseer?
55
-
56
- # TODO ons kan of aparte velde stoor of die variable net so
57
- if false
58
- props = Dict {Symbol, Any} ()
59
- props[:timestamp ] = variable. timestamp
60
- props[:tags ] = variable. tags
61
- props[:estimateDict ] = variable. estimateDict
62
- props[:solverDataDict ] = variable. solverDataDict
63
- props[:smallData ] = variable. smallData
64
- props[:ready ] = variable. ready
65
- props[:backendset ] = variable. backendset
66
- else
67
- # props = Dict{:Symbol, Any}()
68
- # props[:tags] = variable.tags
69
- # props[:variable] = variable
70
- props = Dict (:variable => variable)
71
- end
72
- retval = MetaGraphs. add_vertex! (dfg. g, :label , variable. label)
73
- retval && MetaGraphs. set_props! (dfg. g, nv (dfg. g), props)
34
+ # NOTE Internal ID always set to zero as it is not needed?
35
+ variable. _internalId = 0
36
+
37
+ # If other properties are needed in the graph itself, maybe :tags
38
+ # props = Dict{:Symbol, Any}()
39
+ # props[:tags] = variable.tags
40
+ # props[:variable] = variable
41
+ props = Dict (:variable => variable)
42
+
43
+ MetaGraphs. add_vertex! (dfg. g, :label , variable. label) || return false
44
+ MetaGraphs. set_props! (dfg. g, nv (dfg. g), props) || return false
74
45
75
46
# TODO die ID gaan heeltyd verander, ek dink sover gebruik label direk as index
76
47
push! (dfg. labelDict, variable. label=> variable. _internalId)
77
48
# Track insertion
78
49
push! (dfg. addHistory, variable. label)
79
50
80
- return retval
51
+ return true
81
52
end
82
53
83
54
"""
@@ -191,8 +162,6 @@ function getFactor(dfg::LightGraphsDFG, label::Union{Symbol, String})::DFGFactor
191
162
return get_prop (dfg. g, dfg. g[label,:label ], :factor )
192
163
end
193
164
194
-
195
- # # TODO UNTESTED!!!!!!!!!!!!!!
196
165
"""
197
166
$(SIGNATURES)
198
167
Update a complete DFGVariable in the DFG.
@@ -366,7 +335,25 @@ Checks if the graph is not fully connected, returns true if it is not contiguous
366
335
"""
367
336
hasOrphans (dfg:: LightGraphsDFG ):: Bool = ! isFullyConnected (dfg)
368
337
338
+ function _isready (dfg:: LightGraphsDFG , idx:: Int , ready:: Int ):: Bool
339
+ p = props (dfg. g, idx)
340
+ haskey (p, :variable ) && (return p[:variable ]. ready == ready)
341
+ haskey (p, :factor ) && (return p[:factor ]. ready == ready)
369
342
343
+ # TODO should this be an error?
344
+ @warn " Node not a factor or variable"
345
+ return false
346
+ end
347
+
348
+ function _isbackendset (dfg:: LightGraphsDFG , idx:: Int , backendset:: Int ):: Bool
349
+ p = props (dfg. g, idx)
350
+ haskey (p, :variable ) && (return p[:variable ]. ready == backendset)
351
+ haskey (p, :factor ) && (return p[:factor ]. ready == backendset)
352
+
353
+ # TODO should this be an error?
354
+ @warn " Node not a factor or variable"
355
+ return false
356
+ end
370
357
"""
371
358
$(SIGNATURES)
372
359
Retrieve a list of labels of the immediate neighbors around a given variable or factor.
@@ -379,9 +366,9 @@ function getNeighbors(dfg::LightGraphsDFG, node::T; ready::Union{Nothing, Int}=n
379
366
# neighbors = in_neighbors(vert, dfg.g) #Don't use out_neighbors! It enforces directiveness even if we don't want it
380
367
neighbors = map (idx-> get_prop (dfg. g, idx, :label ), LightGraphs. neighbors (dfg. g, dfg. g[node. label,:label ]))
381
368
# Additional filtering
382
- # TODO ready and backendset
383
- # neighbors = ready != nothing ? filter(v -> v.ready == ready , neighbors) : neighbors
384
- # neighbors = backendset != nothing ? filter(v -> v.backendset == backendset, neighbors) : neighbors
369
+ neighbors = ready != nothing ? filter (lbl -> _isready (dfg, dfg . g[lbl, :label ], ready), neighbors) : neighbors
370
+ neighbors = backendset != nothing ? filter (lbl -> _isbackendset (dfg, dfg . g[lbl, :label ], backendset) , neighbors) : neighbors
371
+
385
372
# Variable sorting (order is important)
386
373
if node isa DFGFactor
387
374
order = intersect (node. _variableOrderSymbols, neighbors)# map(v->v.dfgNode.label, neighbors))
@@ -398,21 +385,20 @@ function getNeighbors(dfg::LightGraphsDFG, label::Symbol; ready::Union{Nothing,
398
385
if ! haskey (dfg. labelDict, label)
399
386
error (" Variable/factor with label '$(label) ' does not exist in the factor graph" )
400
387
end
401
- # vert = dfg.g.vertices[dfg.labelDict[label]]
388
+
402
389
# neighbors = in_neighbors(vert, dfg.g) #Don't use out_neighbors! It enforces directiveness even if we don't want it
390
+ neighbors = map (idx-> get_prop (dfg. g, idx, :label ), LightGraphs. neighbors (dfg. g, dfg. g[label,:label ]))
403
391
# Additional filtering
404
- # TODO ready and backendset
405
- # neighbors = ready != nothing ? filter(v -> v.ready == ready , neighbors) : neighbors
406
- # neighbors = backendset != nothing ? filter(v -> v.backendset == backendset, neighbors) : neighbors
392
+ neighbors = ready != nothing ? filter (lbl -> _isready (dfg, dfg . g[lbl, :label ], ready), neighbors) : neighbors
393
+ neighbors = backendset != nothing ? filter (lbl -> _isbackendset (dfg, dfg . g[lbl, :label ], backendset) , neighbors) : neighbors
394
+
407
395
# Variable sorting when using a factor (function order is important)
408
- # if vert.dfgNode isa DFGFactor
409
- # vert.dfgNode._variableOrderSymbols
410
- # order = intersect(vert.dfgNode._variableOrderSymbols, map(v->v.dfgNode.label, neighbors))
411
- # return order
412
- # end
413
- # return map(n -> n.dfgNode.label, neighbors)
396
+ if has_prop (dfg. g, dfg. g[label,:label ], :factor )
397
+ node = get_prop (dfg. g, dfg. g[label,:label ], :factor )
398
+ order = intersect (node. _variableOrderSymbols, neighbors)
399
+ return order
400
+ end
414
401
415
- neighbors = map (idx-> get_prop (dfg. g, idx, :label ), LightGraphs. neighbors (dfg. g, dfg. g[label,:label ]))
416
402
return neighbors
417
403
418
404
end
@@ -492,29 +478,11 @@ function getSubgraphAroundNode(dfg::LightGraphsDFG{P}, node::T, distance::Int64=
492
478
error (" Variable/factor with label '$(node. label) ' does not exist in the factor graph" )
493
479
end
494
480
495
- # Build a list of all unique neighbors inside 'distance'
496
- # neighborList = Dict{Symbol, Any}()
497
- # push!(neighborList, node.label => dfg.g.vertices[dfg.labelDict[node.label]])
498
- # curList = Dict{Symbol, Any}(node.label => dfg.g.vertices[dfg.labelDict[node.label]])
499
- # for dist in 1:distance
500
- # newNeighbors = Dict{Symbol, Any}()
501
- # for (key, node) in curList
502
- # neighbors = in_neighbors(node, dfg.g) #Don't use out_neighbors! It enforces directiveness even if we don't want it
503
- # for neighbor in neighbors
504
- # if !haskey(neighborList, neighbor.dfgNode.label)
505
- # push!(neighborList, neighbor.dfgNode.label => neighbor)
506
- # push!(newNeighbors, neighbor.dfgNode.label => neighbor)
507
- # end
508
- # end
509
- # end
510
- # curList = newNeighbors
511
- # end
512
- # Copy the section of graph we want
513
- # _copyIntoGraph!(dfg, addToDFG, collect(keys(neighborList)), includeOrphanFactors)
514
-
481
+ # Get a list of all unique neighbors inside 'distance'
515
482
ns = neighborhood (dfg. g, dfg. g[node. label,:label ], distance)
483
+
484
+ # Copy the section of graph we want
516
485
# _copyIntoGraph!(dfg, addToDFG, map(n->get_prop(dfg.g, n, :label), ns), includeOrphanFactors)
517
- # TODO overwrite copyIntoGraph for speed with Int
518
486
_copyIntoGraph! (dfg, addToDFG, ns, includeOrphanFactors)
519
487
return addToDFG
520
488
end
@@ -592,32 +560,3 @@ function toDotFile(dfg::LightGraphsDFG, fileName::String="/tmp/dfg.dot")::Nothin
592
560
@error " toDotFile(dfg::LightGraphsDFG,filename) is not sopported yet"
593
561
return nothing
594
562
end
595
-
596
-
597
-
598
- # function __init__()
599
- # @require DataFrames="a93c6f00-e57d-5684-b7b6-d8193f3e46c0" begin
600
- # if isdefined(Main, :DataFrames)
601
- # """
602
- # $(SIGNATURES)
603
- # Get an adjacency matrix for the DFG as a DataFrame.
604
- # Rows are all factors, columns are all variables, and each cell contains either nothing or the symbol of the relating factor.
605
- # The first column is the factor headings.
606
- # """
607
- # function getAdjacencyMatrixDataFrame(dfg::LightGraphsDFG)::Main.DataFrames.DataFrame
608
- # varLabels = sort(map(v->v.label, getVariables(dfg)))
609
- # factLabels = sort(map(f->f.label, getFactors(dfg)))
610
- # adjDf = DataFrames.DataFrame(:Factor => Union{Missing, Symbol}[])
611
- # for varLabel in varLabels
612
- # adjDf[varLabel] = Union{Missing, Symbol}[]
613
- # end
614
- # for (i, factLabel) in enumerate(factLabels)
615
- # push!(adjDf, [factLabel, DataFrames.missings(length(varLabels))...])
616
- # factVars = getNeighbors(dfg, getFactor(dfg, factLabel))
617
- # map(vLabel -> adjDf[vLabel][i] = factLabel, factVars)
618
- # end
619
- # return adjDf
620
- # end
621
- # end
622
- # end
623
- # end
0 commit comments