Skip to content

Commit 251ff05

Browse files
committed
ready and backendset added, as well as cleanup
test added breaks GraphDFG
1 parent 9572f94 commit 251ff05

File tree

2 files changed

+58
-107
lines changed

2 files changed

+58
-107
lines changed

src/LightGraphsDFG/services/LightGraphsDFG.jl

Lines changed: 46 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,3 @@
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-
171
# Accessors
182
getLabelDict(dfg::LightGraphsDFG) = dfg.labelDict
193
getDescription(dfg::LightGraphsDFG) = dfg.description
@@ -47,37 +31,24 @@ function addVariable!(dfg::LightGraphsDFG, variable::DFGVariable)::Bool
4731
end
4832
dfg.nodeCounter += 1
4933

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
7445

7546
#TODO die ID gaan heeltyd verander, ek dink sover gebruik label direk as index
7647
push!(dfg.labelDict, variable.label=>variable._internalId)
7748
# Track insertion
7849
push!(dfg.addHistory, variable.label)
7950

80-
return retval
51+
return true
8152
end
8253

8354
"""
@@ -191,8 +162,6 @@ function getFactor(dfg::LightGraphsDFG, label::Union{Symbol, String})::DFGFactor
191162
return get_prop(dfg.g, dfg.g[label,:label], :factor)
192163
end
193164

194-
195-
## TODO UNTESTED!!!!!!!!!!!!!!
196165
"""
197166
$(SIGNATURES)
198167
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
366335
"""
367336
hasOrphans(dfg::LightGraphsDFG)::Bool = !isFullyConnected(dfg)
368337

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)
369342

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
370357
"""
371358
$(SIGNATURES)
372359
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
379366
# neighbors = in_neighbors(vert, dfg.g) #Don't use out_neighbors! It enforces directiveness even if we don't want it
380367
neighbors = map(idx->get_prop(dfg.g, idx, :label), LightGraphs.neighbors(dfg.g, dfg.g[node.label,:label]))
381368
# 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+
385372
# Variable sorting (order is important)
386373
if node isa DFGFactor
387374
order = intersect(node._variableOrderSymbols, neighbors)#map(v->v.dfgNode.label, neighbors))
@@ -398,21 +385,20 @@ function getNeighbors(dfg::LightGraphsDFG, label::Symbol; ready::Union{Nothing,
398385
if !haskey(dfg.labelDict, label)
399386
error("Variable/factor with label '$(label)' does not exist in the factor graph")
400387
end
401-
# vert = dfg.g.vertices[dfg.labelDict[label]]
388+
402389
# 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]))
403391
# 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+
407395
# 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
414401

415-
neighbors = map(idx->get_prop(dfg.g, idx, :label), LightGraphs.neighbors(dfg.g, dfg.g[label,:label]))
416402
return neighbors
417403

418404
end
@@ -492,29 +478,11 @@ function getSubgraphAroundNode(dfg::LightGraphsDFG{P}, node::T, distance::Int64=
492478
error("Variable/factor with label '$(node.label)' does not exist in the factor graph")
493479
end
494480

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'
515482
ns = neighborhood(dfg.g, dfg.g[node.label,:label], distance)
483+
484+
# Copy the section of graph we want
516485
# _copyIntoGraph!(dfg, addToDFG, map(n->get_prop(dfg.g, n, :label), ns), includeOrphanFactors)
517-
#TODO overwrite copyIntoGraph for speed with Int
518486
_copyIntoGraph!(dfg, addToDFG, ns, includeOrphanFactors)
519487
return addToDFG
520488
end
@@ -592,32 +560,3 @@ function toDotFile(dfg::LightGraphsDFG, fileName::String="/tmp/dfg.dot")::Nothin
592560
@error "toDotFile(dfg::LightGraphsDFG,filename) is not sopported yet"
593561
return nothing
594562
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

test/interfaceTests.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,18 @@ map(n -> addFactor!(dfg, [verts[n], verts[n+1]], DFGFactor{Int, :Symbol}(Symbol(
112112
# Testing aliases
113113
@test getNeighbors(dfg, getFactor(dfg, :x1x2f1)) == ls(dfg, getFactor(dfg, :x1x2f1))
114114
@test getNeighbors(dfg, :x1x2f1) == ls(dfg, :x1x2f1)
115+
116+
# TODO @Dehann, I don't know exactly what wil be in it, so testing with 0 and 1
117+
# ready and backendset
118+
@test getNeighbors(dfg, :x5, ready=1) == Symbol[]
119+
@test getNeighbors(dfg, :x5, ready=0) == [:x4x5f1,:x5x6f1]
120+
@test getNeighbors(dfg, :x5, backendset=1) == Symbol[]
121+
@test getNeighbors(dfg, :x5, backendset=0) == [:x4x5f1,:x5x6f1]
122+
@test getNeighbors(dfg, verts[1], ready=0) == [:x1x2f1]
123+
@test getNeighbors(dfg, verts[1], ready=1) == Symbol[]
124+
@test getNeighbors(dfg, verts[1], backendset=0) == [:x1x2f1]
125+
@test getNeighbors(dfg, verts[1], backendset=1) == Symbol[]
126+
115127
end
116128

117129
@testset "Getting Subgraphs" begin

0 commit comments

Comments
 (0)