|
From: <mrp...@us...> - 2014-04-03 21:15:38
|
Revision: 8034
http://sourceforge.net/p/bigdata/code/8034
Author: mrpersonick
Date: 2014-04-03 21:15:33 +0000 (Thu, 03 Apr 2014)
Log Message:
-----------
added a predecessor field and implemented the IPredecessor interface
Modified Paths:
--------------
branches/RDR/bigdata-gas/src/java/com/bigdata/rdf/graph/analytics/SSSP.java
Modified: branches/RDR/bigdata-gas/src/java/com/bigdata/rdf/graph/analytics/SSSP.java
===================================================================
--- branches/RDR/bigdata-gas/src/java/com/bigdata/rdf/graph/analytics/SSSP.java 2014-04-03 13:23:17 UTC (rev 8033)
+++ branches/RDR/bigdata-gas/src/java/com/bigdata/rdf/graph/analytics/SSSP.java 2014-04-03 21:15:33 UTC (rev 8034)
@@ -15,7 +15,9 @@
*/
package com.bigdata.rdf.graph.analytics;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import org.apache.log4j.Logger;
@@ -31,6 +33,7 @@
import com.bigdata.rdf.graph.IGASContext;
import com.bigdata.rdf.graph.IGASScheduler;
import com.bigdata.rdf.graph.IGASState;
+import com.bigdata.rdf.graph.IPredecessor;
import com.bigdata.rdf.graph.impl.BaseGASProgram;
/**
@@ -46,7 +49,8 @@
* so we need a different data structure to collect them (we need to
* store the predecesor when we run SSSP to do this).
*/
-public class SSSP extends BaseGASProgram<SSSP.VS, SSSP.ES, Integer/* dist */> {
+public class SSSP extends BaseGASProgram<SSSP.VS, SSSP.ES, Integer/* dist */>
+ implements IPredecessor<SSSP.VS, SSSP.ES, Integer/* dist */> {
private static final Logger log = Logger.getLogger(SSSP.class);
@@ -101,6 +105,15 @@
*/
private final AtomicReference<Value> predecessor = new AtomicReference<Value>();
+ /**
+ * Return the vertex preceding this vertex on the shortest path.
+ */
+ public Value predecessor() {
+
+ return predecessor.get();
+
+ }
+
// /**
// * Set the distance for the vertex to ZERO. This is done for the
// * starting vertex.
@@ -445,6 +458,22 @@
}
});
+ tmp.add(new IBinder<SSSP.VS, SSSP.ES, Integer>() {
+
+ @Override
+ public int getIndex() {
+ return Bindings.PREDECESSOR;
+ }
+
+ @Override
+ public Value bind(final ValueFactory vf,
+ final IGASState<SSSP.VS, SSSP.ES, Integer> state, final Value u) {
+
+ return state.getState(u).predecessor.get();
+
+ }
+ });
+
return tmp;
}
@@ -461,6 +490,58 @@
*/
int DISTANCE = 1;
+ /**
+ * The predecessor vertex on a shortest path.
+ *
+ */
+ int PREDECESSOR = 2;
+
}
+ @Override
+ public void prunePaths(IGASContext<VS, ES, Integer> ctx,
+ Value[] targetVertices) {
+
+ if (ctx == null)
+ throw new IllegalArgumentException();
+
+ if (targetVertices == null)
+ throw new IllegalArgumentException();
+
+ final IGASState<SSSP.VS, SSSP.ES, Integer> gasState = ctx.getGASState();
+
+ final Set<Value> retainSet = new HashSet<Value>();
+
+ for (Value v : targetVertices) {
+
+ if (!gasState.isVisited(v)) {
+
+ // This target was not reachable.
+ continue;
+
+ }
+
+ /*
+ * Walk the precessors back to a starting vertex.
+ */
+ Value current = v;
+
+ while (current != null) {
+
+ retainSet.add(current);
+
+ final SSSP.VS currentState = gasState.getState(current);
+
+ final Value predecessor = currentState.predecessor();
+
+ current = predecessor;
+
+ }
+
+ } // next target vertex.
+
+ gasState.retainAll(retainSet);
+
+ }
+
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|