This is an automated email from the ASF dual-hosted git repository.
jin pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/incubator-hugegraph-computer.git
The following commit(s) were added to refs/heads/master by this push:
new 2be0c287 feat(algorithm): support biased second order random walk
(#280)
2be0c287 is described below
commit 2be0c28716fc2c3a34ea905a03f1def04294dc39
Author: diaohancai <[email protected]>
AuthorDate: Mon Dec 4 20:12:34 2023 +0800
feat(algorithm): support biased second order random walk (#280)
- implement #279
- follow-up #274 (V1 version)
The current random walk algorithm requires 2 additional features.
- Biased random walk.
- Second order random walk.
---------
Co-authored-by: diaohancai <[email protected]>
Co-authored-by: imbajin <[email protected]>
---
.../computer/algorithm/sampling/RandomWalk.java | 253 ++++++++++++++++++---
.../algorithm/sampling/RandomWalkMessage.java | 27 ++-
.../algorithm/sampling/RandomWalkOutput.java | 16 +-
.../algorithm/sampling/RandomWalkParams.java | 14 +-
.../algorithm/sampling/RandomWalkTest.java | 79 +++++--
5 files changed, 317 insertions(+), 72 deletions(-)
diff --git
a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalk.java
b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalk.java
index 2fdf2dde..a74cd488 100644
---
a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalk.java
+++
b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalk.java
@@ -17,43 +17,90 @@
package org.apache.hugegraph.computer.algorithm.sampling;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+
import org.apache.hugegraph.computer.core.common.exception.ComputerException;
import org.apache.hugegraph.computer.core.config.Config;
import org.apache.hugegraph.computer.core.graph.edge.Edge;
import org.apache.hugegraph.computer.core.graph.edge.Edges;
import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
import org.apache.hugegraph.computer.core.graph.value.IdList;
import org.apache.hugegraph.computer.core.graph.value.IdListList;
+import org.apache.hugegraph.computer.core.graph.value.Value;
import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
import org.apache.hugegraph.computer.core.worker.Computation;
import org.apache.hugegraph.computer.core.worker.ComputationContext;
import org.apache.hugegraph.util.Log;
import org.slf4j.Logger;
-import java.util.Iterator;
-import java.util.Random;
-
public class RandomWalk implements Computation<RandomWalkMessage> {
private static final Logger LOG = Log.logger(RandomWalk.class);
- public static final String OPTION_WALK_PER_NODE =
"randomwalk.walk_per_node";
- public static final String OPTION_WALK_LENGTH = "randomwalk.walk_length";
+ public static final String OPTION_WALK_PER_NODE =
"random_walk.walk_per_node";
+ public static final String OPTION_WALK_LENGTH = "random_walk.walk_length";
+
+ public static final String OPTION_WEIGHT_PROPERTY =
"random_walk.weight_property";
+ public static final String OPTION_DEFAULT_WEIGHT =
"random_walk.default_weight";
+ public static final String OPTION_MIN_WEIGHT_THRESHOLD =
"random_walk.min_weight_threshold";
+ public static final String OPTION_MAX_WEIGHT_THRESHOLD =
"random_walk.max_weight_threshold";
+
+ public static final String OPTION_RETURN_FACTOR =
"random_walk.return_factor";
+ public static final String OPTION_INOUT_FACTOR =
"random_walk.inout_factor";
/**
- * number of times per vertex(source vertex) walks
+ * Random
+ */
+ private Random random;
+
+ /**
+ * Number of times per vertex(source vertex) walks
*/
private Integer walkPerNode;
/**
- * walk length
+ * Walk length
*/
private Integer walkLength;
/**
- * random
+ * Weight property, related to the walking probability
*/
- private Random random;
+ private String weightProperty;
+
+ /**
+ * Biased walk
+ * Default 1
+ */
+ private Double defaultWeight;
+
+ /**
+ * Weight less than this threshold will be truncated.
+ * Default 0
+ */
+ private Double minWeightThreshold;
+
+ /**
+ * Weight greater than this threshold will be truncated.
+ * Default Integer.MAX_VALUE
+ */
+ private Double maxWeightThreshold;
+
+ /**
+ * Controls the probability of re-walk to a previously walked vertex.
+ * Default 1
+ */
+ private Double returnFactor;
+
+ /**
+ * Controls whether to walk inward or outward.
+ * Default 1
+ */
+ private Double inOutFactor;
@Override
public String category() {
@@ -67,23 +114,63 @@ public class RandomWalk implements
Computation<RandomWalkMessage> {
@Override
public void init(Config config) {
+ this.random = new Random();
+
this.walkPerNode = config.getInt(OPTION_WALK_PER_NODE, 3);
if (this.walkPerNode <= 0) {
throw new ComputerException("The param %s must be greater than 0,
" +
- "actual got '%s'",
- OPTION_WALK_PER_NODE, this.walkPerNode);
+ "actual got '%s'",
+ OPTION_WALK_PER_NODE,
this.walkPerNode);
}
- LOG.info("[RandomWalk] algorithm param, {}: {}", OPTION_WALK_PER_NODE,
walkPerNode);
this.walkLength = config.getInt(OPTION_WALK_LENGTH, 3);
if (this.walkLength <= 0) {
throw new ComputerException("The param %s must be greater than 0,
" +
- "actual got '%s'",
- OPTION_WALK_LENGTH, this.walkLength);
+ "actual got '%s'",
+ OPTION_WALK_LENGTH, this.walkLength);
}
- LOG.info("[RandomWalk] algorithm param, {}: {}", OPTION_WALK_LENGTH,
walkLength);
- this.random = new Random();
+ this.weightProperty = config.getString(OPTION_WEIGHT_PROPERTY, "");
+
+ this.defaultWeight = config.getDouble(OPTION_DEFAULT_WEIGHT, 1);
+ if (this.defaultWeight <= 0) {
+ throw new ComputerException("The param %s must be greater than 0,
" +
+ "actual got '%s'",
+ OPTION_DEFAULT_WEIGHT,
this.defaultWeight);
+ }
+
+ this.minWeightThreshold =
config.getDouble(OPTION_MIN_WEIGHT_THRESHOLD, 0.0);
+ if (this.minWeightThreshold < 0) {
+ throw new ComputerException("The param %s must be greater than or
equal 0, " +
+ "actual got '%s'",
+ OPTION_MIN_WEIGHT_THRESHOLD,
this.minWeightThreshold);
+ }
+
+ this.maxWeightThreshold =
config.getDouble(OPTION_MAX_WEIGHT_THRESHOLD, Double.MAX_VALUE);
+ if (this.maxWeightThreshold < 0) {
+ throw new ComputerException("The param %s must be greater than or
equal 0, " +
+ "actual got '%s'",
+ OPTION_MAX_WEIGHT_THRESHOLD,
this.maxWeightThreshold);
+ }
+
+ if (this.minWeightThreshold > this.maxWeightThreshold) {
+ throw new ComputerException("%s must be greater than or equal %s,
",
+ OPTION_MAX_WEIGHT_THRESHOLD,
OPTION_MIN_WEIGHT_THRESHOLD);
+ }
+
+ this.returnFactor = config.getDouble(OPTION_RETURN_FACTOR, 1);
+ if (this.returnFactor <= 0) {
+ throw new ComputerException("The param %s must be greater than 0,
" +
+ "actual got '%s'",
+ OPTION_RETURN_FACTOR,
this.returnFactor);
+ }
+
+ this.inOutFactor = config.getDouble(OPTION_INOUT_FACTOR, 1);
+ if (this.inOutFactor <= 0) {
+ throw new ComputerException("The param %s must be greater than 0,
" +
+ "actual got '%s'",
+ OPTION_INOUT_FACTOR, this.inOutFactor);
+ }
}
@Override
@@ -95,14 +182,16 @@ public class RandomWalk implements
Computation<RandomWalkMessage> {
if (vertex.numEdges() <= 0) {
// isolated vertex
- this.savePath(vertex, message.path()); // save result
+ this.savePath(vertex, message.path());
vertex.inactivate();
return;
}
+ vertex.edges().forEach(edge ->
message.addToPreVertexAdjacence(edge.targetId()));
+
for (int i = 0; i < walkPerNode; ++i) {
// random select one edge and walk
- Edge selectedEdge = this.randomSelectEdge(vertex.edges());
+ Edge selectedEdge = this.randomSelectEdge(null, null,
vertex.edges());
context.sendMessage(selectedEdge.targetId(), message);
}
}
@@ -112,9 +201,11 @@ public class RandomWalk implements
Computation<RandomWalkMessage> {
Iterator<RandomWalkMessage> messages) {
while (messages.hasNext()) {
RandomWalkMessage message = messages.next();
+ // the last id of path is the previous id
+ Id preVertexId = message.path().getLast();
if (message.isFinish()) {
- this.savePath(vertex, message.path()); // save result
+ this.savePath(vertex, message.path());
vertex.inactivate();
continue;
@@ -123,7 +214,7 @@ public class RandomWalk implements
Computation<RandomWalkMessage> {
message.addToPath(vertex);
if (vertex.numEdges() <= 0) {
- // there is nowhere to walk,finish eariler
+ // there is nowhere to walk, finish eariler
message.finish();
context.sendMessage(this.getSourceId(message.path()), message);
@@ -137,7 +228,7 @@ public class RandomWalk implements
Computation<RandomWalkMessage> {
if (vertex.id().equals(sourceId)) {
// current vertex is the source vertex,no need to send
message once more
- this.savePath(vertex, message.path()); // save result
+ this.savePath(vertex, message.path());
} else {
context.sendMessage(sourceId, message);
}
@@ -146,8 +237,11 @@ public class RandomWalk implements
Computation<RandomWalkMessage> {
continue;
}
+ vertex.edges().forEach(edge ->
message.addToPreVertexAdjacence(edge.targetId()));
+
// random select one edge and walk
- Edge selectedEdge = this.randomSelectEdge(vertex.edges());
+ Edge selectedEdge = this.randomSelectEdge(preVertexId,
message.preVertexAdjacence(),
+ vertex.edges());
context.sendMessage(selectedEdge.targetId(), message);
}
}
@@ -155,20 +249,121 @@ public class RandomWalk implements
Computation<RandomWalkMessage> {
/**
* random select one edge
*/
- private Edge randomSelectEdge(Edges edges) {
- Edge selectedEdge = null;
- int randomNum = random.nextInt(edges.size());
+ private Edge randomSelectEdge(Id preVertexId, IdList
preVertexAdjacenceIdList, Edges edges) {
+ // TODO: use primitive array instead, like DoubleArray,
+ // in order to reduce memory fragmentation generated during
calculations
+ List<Double> weightList = new ArrayList<>();
- int i = 0;
Iterator<Edge> iterator = edges.iterator();
while (iterator.hasNext()) {
- selectedEdge = iterator.next();
- if (i == randomNum) {
+ Edge edge = iterator.next();
+ // calculate edge weight
+ double weight = this.getEdgeWeight(edge);
+ double finalWeight = this.calculateEdgeWeight(preVertexId,
preVertexAdjacenceIdList,
+ edge.targetId(),
weight);
+ // TODO: improve to avoid OOM
+ weightList.add(finalWeight);
+ }
+
+ int selectedIndex = this.randomSelectIndex(weightList);
+ Edge selectedEdge = this.selectEdge(edges.iterator(), selectedIndex);
+ return selectedEdge;
+ }
+
+ /**
+ * get the weight of an edge by its weight property
+ */
+ private double getEdgeWeight(Edge edge) {
+ double weight = this.defaultWeight;
+
+ Value property = edge.property(this.weightProperty);
+ if (property != null) {
+ if (!property.isNumber()) {
+ throw new ComputerException("The value of %s must be a numeric
value, " +
+ "actual got '%s'",
+ this.weightProperty,
property.string());
+ }
+
+ weight = ((DoubleValue) property).doubleValue();
+ }
+
+ // weight threshold truncation
+ if (weight < this.minWeightThreshold) {
+ weight = this.minWeightThreshold;
+ }
+ if (weight > this.maxWeightThreshold) {
+ weight = this.maxWeightThreshold;
+ }
+ return weight;
+ }
+
+ /**
+ * calculate edge weight
+ */
+ private double calculateEdgeWeight(Id preVertexId, IdList
preVertexAdjacenceIdList,
+ Id nextVertexId, double weight) {
+ /*
+ * 3 types of vertices.
+ * 1. current vertex, called v
+ * 2. previous vertex, called t
+ * 3. current vertex outer vertex, called x(x1, x2.. xn)
+ *
+ * Definition of weight correction coefficient α:
+ * if distance(t, x) = 0, then α = 1.0 / returnFactor
+ * if distance(t, x) = 1, then α = 1.0
+ * if distance(t, x) = 2, then α = 1.0 / inOutFactor
+ *
+ * Final edge weight π(v, x) = α * edgeWeight
+ */
+ double finalWeight = 0.0;
+ if (preVertexId != null && preVertexId.equals(nextVertexId)) {
+ // distance(t, x) = 0
+ finalWeight = 1.0 / this.returnFactor * weight;
+ } else if (preVertexAdjacenceIdList != null &&
+ preVertexAdjacenceIdList.contains(nextVertexId)) {
+ // distance(t, x) = 1
+ finalWeight = 1.0 * weight;
+ } else {
+ // distance(t, x) = 2
+ finalWeight = 1.0 / this.inOutFactor * weight;
+ }
+ return finalWeight;
+ }
+
+ /**
+ * random select index
+ */
+ private int randomSelectIndex(List<Double> weightList) {
+ int selectedIndex = 0;
+ double totalWeight =
weightList.stream().mapToDouble(Double::doubleValue).sum();
+ double randomNum = random.nextDouble() * totalWeight; // [0,
totalWeight)
+
+ // determine which interval the random number falls into
+ double cumulativeWeight = 0;
+ for (int i = 0; i < weightList.size(); ++i) {
+ cumulativeWeight += weightList.get(i);
+ if (randomNum < cumulativeWeight) {
+ selectedIndex = i;
break;
}
- i++;
}
+ return selectedIndex;
+ }
+
+ /**
+ * select edge from iterator by index
+ */
+ private Edge selectEdge(Iterator<Edge> iterator, int selectedIndex) {
+ Edge selectedEdge = null;
+ int index = 0;
+ while (iterator.hasNext()) {
+ selectedEdge = iterator.next();
+ if (index == selectedIndex) {
+ break;
+ }
+ index++;
+ }
return selectedEdge;
}
diff --git
a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkMessage.java
b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkMessage.java
index bf32ee75..6d92781a 100644
---
a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkMessage.java
+++
b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkMessage.java
@@ -17,6 +17,10 @@
package org.apache.hugegraph.computer.algorithm.sampling;
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.hugegraph.computer.core.graph.id.Id;
import org.apache.hugegraph.computer.core.graph.value.BooleanValue;
import org.apache.hugegraph.computer.core.graph.value.IdList;
import org.apache.hugegraph.computer.core.graph.value.Value;
@@ -24,34 +28,39 @@ import
org.apache.hugegraph.computer.core.graph.vertex.Vertex;
import org.apache.hugegraph.computer.core.io.RandomAccessInput;
import org.apache.hugegraph.computer.core.io.RandomAccessOutput;
-import java.io.IOException;
-import java.util.List;
-
public class RandomWalkMessage implements Value.CustomizeValue<List<Object>> {
/**
- * random walk path
+ * Previous vertex adjacent(out edge) vertex id list
+ */
+ private final IdList preVertexAdjacence;
+
+ /**
+ * Random walk path
*/
private final IdList path;
/**
- * finish flag
+ * Finish flag
*/
private BooleanValue isFinish;
public RandomWalkMessage() {
+ this.preVertexAdjacence = new IdList();
this.path = new IdList();
this.isFinish = new BooleanValue(false);
}
@Override
public void read(RandomAccessInput in) throws IOException {
+ this.preVertexAdjacence.read(in);
this.path.read(in);
this.isFinish.read(in);
}
@Override
public void write(RandomAccessOutput out) throws IOException {
+ this.preVertexAdjacence.write(out);
this.path.write(out);
this.isFinish.write(out);
}
@@ -61,6 +70,14 @@ public class RandomWalkMessage implements
Value.CustomizeValue<List<Object>> {
return this.path.value();
}
+ public IdList preVertexAdjacence() {
+ return this.preVertexAdjacence;
+ }
+
+ public void addToPreVertexAdjacence(Id vertexId) {
+ this.preVertexAdjacence.add(vertexId);
+ }
+
public IdList path() {
return this.path;
}
diff --git
a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkOutput.java
b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkOutput.java
index ad43d5bd..47ef2d58 100644
---
a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkOutput.java
+++
b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkOutput.java
@@ -17,23 +17,23 @@
package org.apache.hugegraph.computer.algorithm.sampling;
+import java.util.ArrayList;
+import java.util.List;
+
import org.apache.hugegraph.computer.core.graph.value.IdListList;
import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
import org.apache.hugegraph.computer.core.output.hg.HugeGraphOutput;
-import java.util.ArrayList;
-import java.util.List;
-
public class RandomWalkOutput extends HugeGraphOutput<List<String>> {
@Override
protected void prepareSchema() {
this.client().schema().propertyKey(this.name())
- .asText()
- .writeType(this.writeType())
- .valueList()
- .ifNotExist()
- .create();
+ .asText()
+ .writeType(this.writeType())
+ .valueList()
+ .ifNotExist()
+ .create();
}
@Override
diff --git
a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkParams.java
b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkParams.java
index 273d7fd6..a8d9fd81 100644
---
a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkParams.java
+++
b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkParams.java
@@ -17,24 +17,26 @@
package org.apache.hugegraph.computer.algorithm.sampling;
+import java.util.Map;
+
import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
import org.apache.hugegraph.computer.core.config.ComputerOptions;
import org.apache.hugegraph.computer.core.graph.value.IdListList;
-import java.util.Map;
-
public class RandomWalkParams implements AlgorithmParams {
@Override
public void setAlgorithmParameters(Map<String, String> params) {
this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
- RandomWalk.class.getName());
+ RandomWalk.class.getName());
this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
- RandomWalkMessage.class.getName());
+ RandomWalkMessage.class.getName());
this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
- IdListList.class.getName());
+ IdListList.class.getName());
+ this.setIfAbsent(params, ComputerOptions.INPUT_FILTER_CLASS,
+ EXTRACTALLPROPERTYINPUTFILTER_CLASS_NAME);
this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
- RandomWalkOutput.class.getName());
+ RandomWalkOutput.class.getName());
this.setIfAbsent(params, RandomWalk.OPTION_WALK_PER_NODE, "3");
this.setIfAbsent(params, RandomWalk.OPTION_WALK_LENGTH, "3");
diff --git
a/computer-test/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkTest.java
b/computer-test/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkTest.java
index 5c09af0a..2d1a00c6 100644
---
a/computer-test/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkTest.java
+++
b/computer-test/src/main/java/org/apache/hugegraph/computer/algorithm/sampling/RandomWalkTest.java
@@ -17,8 +17,11 @@
package org.apache.hugegraph.computer.algorithm.sampling;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
import org.apache.hugegraph.computer.algorithm.AlgorithmTestBase;
import org.apache.hugegraph.computer.core.config.ComputerOptions;
import org.apache.hugegraph.computer.core.graph.id.Id;
@@ -34,13 +37,13 @@ import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
public class RandomWalkTest extends AlgorithmTestBase {
+ private static final String PROPERTY_KEY = "frequency";
+
private static final Map<String, List<String>> EXPECT_WALK_PATH =
ImmutableMap.of(
"F", ImmutableList.of(
@@ -58,15 +61,21 @@ public class RandomWalkTest extends AlgorithmTestBase {
HugeClient client = client();
SchemaManager schema = client.schema();
+ schema.propertyKey(PROPERTY_KEY)
+ .asDouble()
+ .ifNotExist()
+ .create();
schema.vertexLabel("user")
- .useCustomizeStringId()
- .ifNotExist()
- .create();
+ .useCustomizeStringId()
+ .ifNotExist()
+ .create();
schema.edgeLabel("know")
- .sourceLabel("user")
- .targetLabel("user")
- .ifNotExist()
- .create();
+ .sourceLabel("user")
+ .targetLabel("user")
+ .properties(PROPERTY_KEY)
+ .nullableKeys(PROPERTY_KEY)
+ .ifNotExist()
+ .create();
GraphManager graph = client.graph();
Vertex vA = graph.addVertex(T.LABEL, "user", T.ID, "A");
@@ -80,17 +89,17 @@ public class RandomWalkTest extends AlgorithmTestBase {
Vertex vF = graph.addVertex(T.LABEL, "user", T.ID, "F");
Vertex vG = graph.addVertex(T.LABEL, "user", T.ID, "G");
- vA.addEdge("know", vB);
+ vA.addEdge("know", vB, PROPERTY_KEY, 9);
vA.addEdge("know", vC);
- vA.addEdge("know", vD);
- vB.addEdge("know", vC);
+ vA.addEdge("know", vD, PROPERTY_KEY, 3);
+ vB.addEdge("know", vC, PROPERTY_KEY, 2);
vC.addEdge("know", vA);
- vC.addEdge("know", vE);
- vD.addEdge("know", vA);
- vD.addEdge("know", vC);
- vE.addEdge("know", vD);
+ vC.addEdge("know", vE, PROPERTY_KEY, 2);
+ vD.addEdge("know", vA, PROPERTY_KEY, 7);
+ vD.addEdge("know", vC, PROPERTY_KEY, 1);
+ vE.addEdge("know", vD, PROPERTY_KEY, 8);
- vF.addEdge("know", vG);
+ vF.addEdge("know", vG, PROPERTY_KEY, 5);
}
@AfterClass
@@ -108,14 +117,36 @@ public class RandomWalkTest extends AlgorithmTestBase {
private static Integer WALK_PER_NODE = 3;
private static Integer WALK_LENGTH = 3;
+ private static String WEIGHT_PROPERTY = PROPERTY_KEY;
+ private static Double DEFAULT_WEIGHT = 1.0;
+ private static Double MIN_WEIGHT_THRESHOLD = 3.0;
+ private static Double MAX_WEIGHT_THRESHOLD = 7.0;
+
+ private static Double RETURN_FACTOR = 2.0;
+ private static Double INOUT_FACTOR = 1.0 / 2.0;
+
@Override
public void setAlgorithmParameters(Map<String, String> params) {
this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
- RandomWalkTest.RandomWalkTestOutput.class.getName());
+
RandomWalkTest.RandomWalkTestOutput.class.getName());
this.setIfAbsent(params, RandomWalk.OPTION_WALK_PER_NODE,
- WALK_PER_NODE.toString());
+ WALK_PER_NODE.toString());
this.setIfAbsent(params, RandomWalk.OPTION_WALK_LENGTH,
- WALK_LENGTH.toString());
+ WALK_LENGTH.toString());
+
+ this.setIfAbsent(params, RandomWalk.OPTION_WEIGHT_PROPERTY,
+ WEIGHT_PROPERTY);
+ this.setIfAbsent(params, RandomWalk.OPTION_DEFAULT_WEIGHT,
+ DEFAULT_WEIGHT.toString());
+ this.setIfAbsent(params, RandomWalk.OPTION_MIN_WEIGHT_THRESHOLD,
+ MIN_WEIGHT_THRESHOLD.toString());
+ this.setIfAbsent(params, RandomWalk.OPTION_MAX_WEIGHT_THRESHOLD,
+ MAX_WEIGHT_THRESHOLD.toString());
+
+ this.setIfAbsent(params, RandomWalk.OPTION_RETURN_FACTOR,
+ RETURN_FACTOR.toString());
+ this.setIfAbsent(params, RandomWalk.OPTION_INOUT_FACTOR,
+ INOUT_FACTOR.toString());
super.setAlgorithmParameters(params);
}