1
0
Fork 0
arangodb/tests/js/server/shell/shell-pregel-grey.js

259 lines
9.2 KiB
JavaScript

/*jshint globalstrict:false, strict:false */
/*global assertEqual, assertTrue, JSON */
'use strict';
// //////////////////////////////////////////////////////////////////////////////
// / @brief Spec for Foxx manager
// /
// / @file
// /
// / DISCLAIMER
// /
// / Copyright 2014 ArangoDB GmbH, Cologne, Germany
// /
// / Licensed under the Apache License, Version 2.0 (the "License")
// / you may not use this file except in compliance with the License.
// / You may obtain a copy of the License at
// /
// / http://www.apache.org/licenses/LICENSE-2.0
// /
// / Unless required by applicable law or agreed to in writing, software
// / distributed under the License is distributed on an "AS IS" BASIS,
// / WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// / See the License for the specific language governing permissions and
// / limitations under the License.
// /
// / Copyright holder is ArangoDB GmbH, Cologne, Germany
// /
// / @author Simon Grätzer
// / @author Copyright 2017, ArangoDB GmbH, Cologne, Germany
// //////////////////////////////////////////////////////////////////////////////
var jsunity = require("jsunity");
var db = require("@arangodb").db;
var graph_module = require("@arangodb/general-graph");
var internal = require("internal");
var console = require("console");
var EPS = 0.0001;
let pregel = require("@arangodb/pregel");
const graphName = "UnitTest_pregel";
var vColl = "UnitTest_pregel_v", eColl = "UnitTest_pregel_e";
function testAlgo(a, p) {
var pid = pregel.start(a, graphName, p);
var i = 10000;
let stats = pregel.status(pid);
console.debug("topic=pregel", "initial stats: " + JSON.stringify(stats));
do {
internal.wait(0.2, false);
stats = pregel.status(pid);
if (stats.state !== "running") {
assertEqual(stats.vertexCount, 11, stats);
assertEqual(stats.edgeCount, 17, stats);
db[vColl].all().toArray()
.forEach(function(d) {
if (d[a] && d[a] !== -1) {
var diff = Math.abs(d[a] - d.result);
if (diff > EPS) {
console.log("Error on " + JSON.stringify(d));
assertTrue(false);// peng
}
}
});
break;
}
if (i % 100 === 0) {
console.info("topic=pregel", "pregel stats: " + JSON.stringify(stats));
}
} while (i-- >= 0);
if (i === 0) {
assertTrue(false, "timeout in pregel execution");
}
}
function basicTestSuite () {
'use strict';
return {
////////////////////////////////////////////////////////////////////////////////
/// @brief set up
////////////////////////////////////////////////////////////////////////////////
setUp : function () {
var exists = graph_module._list().indexOf("demo") !== -1;
if (exists || db.demo_v) {
return;
}
var graph = graph_module._create(graphName);
db._create(vColl, {numberOfShards: 4});
graph._addVertexCollection(vColl);
db._createEdgeCollection(eColl, {
numberOfShards: 4,
replicationFactor: 1,
shardKeys:["vertex"],
distributeShardsLike:vColl});
var rel = graph_module._relation(eColl, [vColl], [vColl]);
graph._extendEdgeDefinitions(rel);
var vertices = db[vColl];
var edges = db[eColl];
var A = vertices.insert({_key:'A', sssp:3, pagerank:0.027645934})._id;
var B = vertices.insert({_key:'B', sssp:2, pagerank:0.3241496})._id;
var C = vertices.insert({_key:'C', sssp:3, pagerank:0.289220})._id;
var D = vertices.insert({_key:'D', sssp:2, pagerank:0.0329636})._id;
var E = vertices.insert({_key:'E', sssp:1, pagerank:0.0682141})._id;
var F = vertices.insert({_key:'F', sssp:2, pagerank:0.0329636})._id;
var G = vertices.insert({_key:'G', sssp:-1, pagerank:0.0136363})._id;
var H = vertices.insert({_key:'H', sssp:-1, pagerank:0.01363636})._id;
var I = vertices.insert({_key:'I', sssp:-1, pagerank:0.01363636})._id;
var J = vertices.insert({_key:'J', sssp:-1, pagerank:0.01363636})._id;
var K = vertices.insert({_key:'K', sssp:0, pagerank:0.013636363})._id;
edges.insert({_from:B, _to:C, vertex:'B'});
edges.insert({_from:C, _to:B, vertex:'C'});
edges.insert({_from:D, _to:A, vertex:'D'});
edges.insert({_from:D, _to:B, vertex:'D'});
edges.insert({_from:E, _to:B, vertex:'E'});
edges.insert({_from:E, _to:D, vertex:'E'});
edges.insert({_from:E, _to:F, vertex:'E'});
edges.insert({_from:F, _to:B, vertex:'F'});
edges.insert({_from:F, _to:E, vertex:'F'});
edges.insert({_from:G, _to:B, vertex:'G'});
edges.insert({_from:G, _to:E, vertex:'G'});
edges.insert({_from:H, _to:B, vertex:'H'});
edges.insert({_from:H, _to:E, vertex:'H'});
edges.insert({_from:I, _to:B, vertex:'I'});
edges.insert({_from:I, _to:E, vertex:'I'});
edges.insert({_from:J, _to:E, vertex:'J'});
edges.insert({_from:K, _to:E, vertex:'K'});
},
////////////////////////////////////////////////////////////////////////////////
/// @brief tear down
////////////////////////////////////////////////////////////////////////////////
tearDown : function () {
graph_module._drop(graphName, true);
},
testSSSPNormal: function () {
testAlgo("sssp", {async:false, source:vColl + "/K", resultField: "result"});
},
testSSSPAsync: function () {
testAlgo("sssp", {async:true, source:vColl + "/K", resultField: "result"});
},
testPageRank: function () {
// should test correct convergence behaviour, might fail if EPS is too low
testAlgo("pagerank", {threshold:EPS / 10, resultField: "result"});
},
testPageRankSeeded: function() {
// test that pagerank picks the seed value
testAlgo("pagerank", {maxGSS:1, sourceField: "pagerank", resultField: "result"});
// since we already use converged values this should not change anything
testAlgo("pagerank", {maxGSS:5, sourceField: "pagerank", resultField: "result"});
},
// test the PREGEL_RESULT AQL function
testPageRankAQLResult: function() {
var pid = pregel.start("pagerank", graphName, {threshold:EPS / 10, store:false});
var i = 10000;
let stats = pregel.status(pid);
console.debug("topic=pregel", "initial stats: " + JSON.stringify(stats));
do {
internal.wait(0.2, false);
stats = pregel.status(pid);
if (stats.state !== "running") {
assertEqual(stats.vertexCount, 11, stats);
assertEqual(stats.edgeCount, 17, stats);
let vertices = db._collection(vColl);
// no result was written to the default result field
vertices.all().toArray().forEach( d => assertTrue(!d.result));
let cursor = db._query("RETURN PREGEL_RESULT(@id)", {"id": pid});
let array = cursor.toArray();
assertEqual(array.length, 1);
let results = array[0];
assertEqual(results.length, 11);
// verify results
results.forEach(function(d) {
let v = vertices.document(d._key);
assertTrue(v !== null);
assertTrue(Math.abs(v.pagerank - d.result) < EPS);
});
break;
}
if (i % 100 === 0) {
console.info("topic=pregel", "pregel stats: " + JSON.stringify(stats));
}
} while (i-- >= 0);
if (i === 0) {
assertTrue(false, "timeout in pregel execution");
}
}
};
};
function exampleTestSuite () {
'use strict';
return {
////////////////////////////////////////////////////////////////////////////////
/// @brief set up
////////////////////////////////////////////////////////////////////////////////
setUp : function () {
var examples = require("@arangodb/graph-examples/example-graph.js");
var graph = examples.loadGraph("social");
},
////////////////////////////////////////////////////////////////////////////////
/// @brief tear down
////////////////////////////////////////////////////////////////////////////////
tearDown : function () {
graph_module._drop("social", true);
},
testSocial: function () {
var key = db._pregelStart("effectivecloseness",
['female', 'male'], ['relation'],
{resultField: "closeness"});
var i = 10000;
let stats = db._pregelStatus(key);
console.debug("topic=pregel", "initial stats: " + JSON.stringify(stats));
do {
internal.wait(0.2, false);
stats = db._pregelStatus(key);
if (stats.state !== "running") {
assertEqual(stats.vertexCount, 4, stats);
assertEqual(stats.edgeCount, 4, stats);
break;
}
if (i % 100 === 0) {
console.info("topic=pregel", "pregel stats: " + JSON.stringify(stats));
}
} while(i-- >= 0);
if (i === 0) {
assertTrue(false, "timeout in pregel execution");
}
}
};
};
jsunity.run(basicTestSuite);
jsunity.run(exampleTestSuite);
return jsunity.done();