// Path: src/main/java/com/tinkerpop/furnace/algorithms/vertexcentric/GraphMemory.java
// public interface GraphMemory {
// 
//     public <R> R get(final String key);
// 
//     public void setIfAbsent(String key, Object value);
// 
//     public long increment(String key, long delta);
// 
//     public long decrement(String key, long delta);
// 
//     public int getIteration();
// 
//     public long getRuntime();
// 
//     public boolean isInitialIteration();
// 
//     /*public void min(String key, double value);
// 
//     public void max(String key, double value);
// 
//     public void avg(String key, double value);
// 
//     public <V> void update(String key, Function<V, V> update, V defaultValue);*/
// 
//     // public Map<String, Object> getCurrentState();
// }
// 
// Path: src/main/java/com/tinkerpop/furnace/algorithms/vertexcentric/programs/AbstractVertexProgram.java
// public abstract class AbstractVertexProgram implements VertexProgram {
// 
//     protected final Map<String, KeyType> computeKeys = new HashMap<String, KeyType>();
// 
//     public Map<String, KeyType> getComputeKeys() {
//         return computeKeys;
//     }
// 
//     public void setup(final GraphMemory graphMemory) {
// 
//     }
// 
//     public String toString() {
//         return this.getClass().getSimpleName() + "[" + computeKeys.keySet() + "]";
//     }
// }
// 
// Path: src/main/java/com/tinkerpop/furnace/util/VertexQueryBuilder.java
// public class VertexQueryBuilder extends DefaultVertexQuery {
// 
//     public VertexQueryBuilder() {
//         super(null);
//     }
// 
//     public VertexQueryBuilder has(final String key) {
//         super.has(key);
//         return this;
//     }
// 
//     public VertexQueryBuilder hasNot(final String key) {
//         super.hasNot(key);
//         return this;
//     }
// 
//     public VertexQueryBuilder has(final String key, final Object value) {
//         super.has(key, value);
//         return this;
//     }
// 
//     public VertexQueryBuilder hasNot(final String key, final Object value) {
//         super.hasNot(key, value);
//         return this;
//     }
// 
//     @Deprecated
//     public <T extends Comparable<T>> VertexQueryBuilder has(final String key, final T value, final Query.Compare compare) {
//         return this.has(key, compare, value);
//     }
// 
//     public VertexQueryBuilder has(final String key, final Predicate compare, final Object value) {
//         super.has(key, compare, value);
//         return this;
//     }
// 
//     public <T extends Comparable<?>> VertexQueryBuilder interval(final String key, final T startValue, final T endValue) {
//         super.interval(key, startValue, endValue);
//         return this;
//     }
// 
//     public VertexQueryBuilder direction(final Direction direction) {
//         super.direction(direction);
//         return this;
//     }
// 
//     public VertexQueryBuilder labels(final String... labels) {
//         super.labels(labels);
//         return this;
//     }
// 
//     public VertexQueryBuilder limit(final int limit) {
//         super.limit(limit);
//         return this;
//     }
// 
//     public Iterable<Edge> edges() {
//         throw new UnsupportedOperationException();
//     }
// 
//     public Iterable<Vertex> vertices() {
//         throw new UnsupportedOperationException();
//     }
// 
//     public Object vertexIds() {
//         throw new UnsupportedOperationException();
//     }
// 
//     public long count() {
//         throw new UnsupportedOperationException();
//     }
// 
//     public VertexQuery build(final Vertex vertex) {
//         VertexQuery query = vertex.query();
//         for (final HasContainer hasContainer : this.hasContainers) {
//             query = query.has(hasContainer.key, hasContainer.predicate, hasContainer.value);
//         }
//         return query.limit(this.limit).labels(this.labels).direction(this.direction);
//     }
// }


import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.furnace.algorithms.vertexcentric.GraphMemory;
import com.tinkerpop.furnace.algorithms.vertexcentric.programs.AbstractVertexProgram;
import com.tinkerpop.furnace.util.VertexQueryBuilder;
    public static Builder create() {
        return new Builder();
    }

    //////////////////////////////

    public static class Builder {

        private final PageRankProgram vertexProgram = new PageRankProgram();

        public Builder iterations(final int iterations) {
            this.vertexProgram.totalIterations = iterations;
            return this;
        }

        public Builder alpha(final double alpha) {
            this.vertexProgram.alpha = alpha;
            return this;
        }

        public Builder outgoing(final VertexQueryBuilder outgoingQuery) {
            this.vertexProgram.outgoingQuery = outgoingQuery;
            return this;
        }

        public Builder incoming(final VertexQueryBuilder incomingQuery) {
            this.vertexProgram.incomingQuery = incomingQuery;
            return this;
        }

// Path: src/main/java/com/tinkerpop/furnace/algorithms/vertexcentric/GraphMemory.java
// public interface GraphMemory {
// 
//     public <R> R get(final String key);
// 
//     public void setIfAbsent(String key, Object value);
// 
//     public long increment(String key, long delta);
// 
//     public long decrement(String key, long delta);
// 
//     public int getIteration();
// 
//     public long getRuntime();
// 
//     public boolean isInitialIteration();
// 
//     /*public void min(String key, double value);
// 
//     public void max(String key, double value);
// 
//     public void avg(String key, double value);
// 
//     public <V> void update(String key, Function<V, V> update, V defaultValue);*/
// 
//     // public Map<String, Object> getCurrentState();
// }
// 
// Path: src/main/java/com/tinkerpop/furnace/algorithms/vertexcentric/programs/AbstractVertexProgram.java
// public abstract class AbstractVertexProgram implements VertexProgram {
// 
//     protected final Map<String, KeyType> computeKeys = new HashMap<String, KeyType>();
// 
//     public Map<String, KeyType> getComputeKeys() {
//         return computeKeys;
//     }
// 
//     public void setup(final GraphMemory graphMemory) {
// 
//     }
// 
//     public String toString() {
//         return this.getClass().getSimpleName() + "[" + computeKeys.keySet() + "]";
//     }
// }
// 
// Path: src/main/java/com/tinkerpop/furnace/util/VertexQueryBuilder.java
// public class VertexQueryBuilder extends DefaultVertexQuery {
// 
//     public VertexQueryBuilder() {
//         super(null);
//     }
// 
//     public VertexQueryBuilder has(final String key) {
//         super.has(key);
//         return this;
//     }
// 
//     public VertexQueryBuilder hasNot(final String key) {
//         super.hasNot(key);
//         return this;
//     }
// 
//     public VertexQueryBuilder has(final String key, final Object value) {
//         super.has(key, value);
//         return this;
//     }
// 
//     public VertexQueryBuilder hasNot(final String key, final Object value) {
//         super.hasNot(key, value);
//         return this;
//     }
// 
//     @Deprecated
//     public <T extends Comparable<T>> VertexQueryBuilder has(final String key, final T value, final Query.Compare compare) {
//         return this.has(key, compare, value);
//     }
// 
//     public VertexQueryBuilder has(final String key, final Predicate compare, final Object value) {
//         super.has(key, compare, value);
//         return this;
//     }
// 
//     public <T extends Comparable<?>> VertexQueryBuilder interval(final String key, final T startValue, final T endValue) {
//         super.interval(key, startValue, endValue);
//         return this;
//     }
// 
//     public VertexQueryBuilder direction(final Direction direction) {
//         super.direction(direction);
//         return this;
//     }
// 
//     public VertexQueryBuilder labels(final String... labels) {
//         super.labels(labels);
//         return this;
//     }
// 
//     public VertexQueryBuilder limit(final int limit) {
//         super.limit(limit);
//         return this;
//     }
// 
//     public Iterable<Edge> edges() {
//         throw new UnsupportedOperationException();
//     }
// 
//     public Iterable<Vertex> vertices() {
//         throw new UnsupportedOperationException();
//     }
// 
//     public Object vertexIds() {
//         throw new UnsupportedOperationException();
//     }
// 
//     public long count() {
//         throw new UnsupportedOperationException();
//     }
// 
//     public VertexQuery build(final Vertex vertex) {
//         VertexQuery query = vertex.query();
//         for (final HasContainer hasContainer : this.hasContainers) {
//             query = query.has(hasContainer.key, hasContainer.predicate, hasContainer.value);
//         }
//         return query.limit(this.limit).labels(this.labels).direction(this.direction);
//     }
// }


// Path: src/main/java/com/tinkerpop/furnace/algorithms/vertexcentric/programs/ranking/PageRankProgram.java
import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.furnace.algorithms.vertexcentric.GraphMemory;
import com.tinkerpop.furnace.algorithms.vertexcentric.programs.AbstractVertexProgram;
import com.tinkerpop.furnace.util.VertexQueryBuilder;

    public static Builder create() {
        return new Builder();
    }

    //////////////////////////////

    public static class Builder {

        private final PageRankProgram vertexProgram = new PageRankProgram();

        public Builder iterations(final int iterations) {
            this.vertexProgram.totalIterations = iterations;
            return this;
        }

        public Builder alpha(final double alpha) {
            this.vertexProgram.alpha = alpha;
            return this;
        }

        public Builder outgoing(final VertexQueryBuilder outgoingQuery) {
            this.vertexProgram.outgoingQuery = outgoingQuery;
            return this;
        }

        public Builder incoming(final VertexQueryBuilder incomingQuery) {
            this.vertexProgram.incomingQuery = incomingQuery;
            return this;
        }

        public Builder vertexCount(final int count) {