151 lines
3.3 KiB
Plaintext
151 lines
3.3 KiB
Plaintext
/*
|
|
//paragraph [10] Title: [{\Large \bf ] [}]
|
|
//[@] [\verb+@+]
|
|
//[%] [\%]
|
|
//[&] [\&]
|
|
//[ue] [\"{u}]
|
|
//[=~] [$\approx$]
|
|
//[->] [$\rightarrow$]
|
|
|
|
[10] Approximate kNN-Graph Construction in Secondo-Pregel
|
|
|
|
Ralf Hartmut G[ue]ting, September 2020.
|
|
|
|
Part 2
|
|
|
|
3 Running the Algorithm in Pregel
|
|
|
|
This part can be run repeatedly, each time starting a new session.
|
|
|
|
*/
|
|
query setupPregel(Workers);
|
|
|
|
/*
|
|
Create main memory structures:
|
|
|
|
*/
|
|
|
|
query remotePregelCommand('query meminit(3000)')
|
|
|
|
query remotePregelCommand('let G = EdgesPersistent feed
|
|
createmgraph3[Id, Id_t, Distance, Size]')
|
|
|
|
query remotePregelCommand('let Nodes = NodesPersistent feed
|
|
extend[Active: TRUE, Iterations: 0, SumD: k * 2000000.0,
|
|
SumDNew: k * 1800000.0] mconsume')
|
|
|
|
query remotePregelCommand('let Nodes_Id = Nodes mcreateAVLtree[Id]')
|
|
|
|
/*
|
|
Create the same structures on the master, to be able to run *setPregelFunction* which does type checking. These structures can be made small; only their types are evaluted.
|
|
|
|
*/
|
|
|
|
let G = EdgesP feed head[1] createmgraph3[Id, Id_t, Distance, Size]
|
|
|
|
let Nodes = NodesP feed head[1] extend[Active: TRUE, Iterations: 0,
|
|
SumD: k * 2000000.0, SumDNew: k * 1800000.0] mconsume
|
|
|
|
let Nodes_Id = Nodes mcreateAVLtree[Id]
|
|
|
|
/*
|
|
Set function and run.
|
|
|
|
*/
|
|
|
|
query setPregelFunction(Compute, NodePartition)
|
|
|
|
query InitialMessages feed initPregelMessages;
|
|
|
|
query startPregel(-1)
|
|
|
|
# 37 seconds for germany, 1456 nodes
|
|
# 85:47 minutes for dortmund on newton (6 Workers), 331024 nodes
|
|
|
|
|
|
|
|
|
|
/*
|
|
Run with explicit Secondo loop.
|
|
|
|
Here termination is controlled outside pregel. Therefore, from the ~Compute~ function,
|
|
|
|
----
|
|
filter[.Active_n]
|
|
----
|
|
|
|
must be removed.
|
|
|
|
----
|
|
query remotePregelCommand('let AvgSumD = Nodes mfeed avg[SumD]')
|
|
|
|
let AvgArray = createSDArray("AvgSumD", Workers)
|
|
|
|
let AvgSumD = AvgArray getValue tie[. + ..]
|
|
|
|
let N = 10
|
|
|
|
while N > 0 do
|
|
{
|
|
query simpleMessage(num2string(N))
|
|
|
|
|
query startPregel(2)
|
|
|
|
|
query remotePregelCommand('update AvgSumD := Nodes mfeed avg[SumD]')
|
|
|
|
|
update AvgSumD := AvgArray getValue tie[. + ..]
|
|
|
|
|
query simpleMessage(num2string(AvgSumD))
|
|
|
|
|
update N := N - 1
|
|
}
|
|
endwhile
|
|
----
|
|
|
|
*/
|
|
|
|
|
|
/*
|
|
Look at results. Can be done in the Javagui.
|
|
|
|
*/
|
|
|
|
if not(isDBObject("NodeResults")) then
|
|
{
|
|
query remotePregelCommand('let NodeResults = Nodes mfeed consume') |
|
|
let NodeResults = createSDArray("NodeResults", Workers) dsummarize consume
|
|
|
|
|
query remotePregelCommand('let GraphResult = G mg3feed consume') |
|
|
let GraphResult = createSDArray("GraphResult", Workers) dsummarize consume
|
|
}
|
|
else
|
|
{
|
|
query remotePregelCommand('update NodeResults := Nodes mfeed consume') |
|
|
update NodeResults := createSDArray("NodeResults", Workers) dsummarize consume
|
|
|
|
|
query remotePregelCommand('update GraphResult := G mg3feed consume') |
|
|
update GraphResult := createSDArray("GraphResult", Workers) dsummarize consume
|
|
}
|
|
endif
|
|
|
|
/*
|
|
----
|
|
query GraphResult feed extend[Curve: create_sline(.Value, .Value_t)]
|
|
extend[SourcePos: .Value, TargetPos: .Value_t] remove[Value, Value_t] consume
|
|
----
|
|
|
|
*/
|
|
|
|
let G = GraphResult feed createmgraph3[Id, Id_t, Distance, Size]
|
|
|
|
query G mg3successors[70] extend[Curve: create_sline(.Value, .Value_t)]
|
|
extend[SourcePos: .Value, TargetPos: .Value_t] remove[Value, Value_t] consume
|
|
|
|
query NodesP feed some[20] loopsel[
|
|
G mg3successors[.Id] extend[Curve: create_sline(.Value, .Value_t)]
|
|
extend[SourcePos: .Value, TargetPos: .Value_t] remove[Value, Value_t]
|
|
] consume
|
|
|
|
|
|
|