63 lines
2.2 KiB
Plaintext
63 lines
2.2 KiB
Plaintext
### final phase: contract all nodes with negative score (CEdges - Deleted)
|
|
#
|
|
# to be called from a master script such as ContractionK
|
|
|
|
if isDBObject("NContracted") then delete NContracted endif
|
|
|
|
let NContracted = 1
|
|
|
|
|
|
while (NContracted > 0) do
|
|
{
|
|
update NContracted := "NodesX" mfeedpq
|
|
extend[
|
|
In: pwrap("EdgesX_Target") pwrap("EdgesX") mexactmatch[.Node] count,
|
|
Out: pwrap("EdgesX_Source") pwrap("EdgesX") mexactmatch[.Node] count]
|
|
extend[CEdges: fun(t: TUPLE)
|
|
pwrap("EdgesX_Target") pwrap("EdgesX") mexactmatch[attr(t, Node)]
|
|
sortby[Source, Cost] krdup[Source] {i}
|
|
pwrap("EdgesX_Source") pwrap("EdgesX") mexactmatch[attr(t, Node)]
|
|
sortby[Target, Cost] krdup[Target] {o}
|
|
product
|
|
filter[.Source_i # .Target_o]
|
|
filter[ ( fun(node: int) pwrap("EdgesX_Source") pwrap("EdgesX")
|
|
mexactmatch[node] )
|
|
minPathCost1[Target, .Source_i, .Target_o, Cost, 4] >= (.Cost_i + .Cost_o)]
|
|
groupby[; Added: fun(g: GROUP) ifthenelse(g count <= (attr(t, In) + attr(t, Out)),
|
|
g feed
|
|
projectextend[; Source: .Source_i, Target: .Target_o,
|
|
SourcePos: .SourcePos_i, TargetPos: .TargetPos_o,
|
|
Cost: .Cost_i + .Cost_o, Middle: attr(t, Node),
|
|
NEdges: .NEdges_i + .NEdges_o]
|
|
minsert[pwrap("EdgesX")]
|
|
minsertavltree[pwrap("EdgesX_Source"), Source]
|
|
minsertavltree[pwrap("EdgesX_Target"), Target] remove[TID]
|
|
minsert[pwrap("ContractionX")] count,
|
|
-10)]
|
|
extractDef[Added, 0]
|
|
]
|
|
filter[.CEdges >= 0]
|
|
extend[Deleted:
|
|
pwrap("EdgesX_Target") pwrap("EdgesX") mexactmatch[.Node]
|
|
pwrap("EdgesX_Source") pwrap("EdgesX") mexactmatch[.Node]
|
|
concat mblock pwrap("EdgesX") mdeletedirect
|
|
mdeleteavltree[pwrap("EdgesX_Target"), Target]
|
|
mdeleteavltree[pwrap("EdgesX_Source"), Source]
|
|
count
|
|
]
|
|
# printstream
|
|
minsert[pwrap("DeletedNodes")]
|
|
count
|
|
|
|
|
query memdelete("NodesX")
|
|
|
|
|
query
|
|
"EdgesX" mfeed project[Source, SourcePos] renameattr[Node: Source, Pos: SourcePos]
|
|
"EdgesX" mfeed project[Target, TargetPos] renameattr[Node: Target, Pos: TargetPos] concat sort rdup
|
|
extend[Prio: 0.0]
|
|
mcreatepqueue[Prio, "NodesX"] count
|
|
}
|
|
endwhile
|
|
|
|
|