// 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/VertexProgram.java
// public interface VertexProgram extends Serializable {
// 
//     public enum KeyType {
//         VARIABLE,
//         CONSTANT
//     }
// 
//     /**
//      * The method is called at the beginning of the computation.
//      * The method is global to the GraphComputer and as such, is not called for each vertex.
//      *
//      * @param graphMemory The global GraphMemory of the GraphComputer
//      */
//     public void setup(GraphMemory graphMemory);
// 
//     /**
//      * This method denotes the main body of computation.
//      *
//      * @param vertex      the vertex to execute the VertexProgram on
//      * @param graphMemory the shared state between all vertices in the computation
//      */
//     public void execute(Vertex vertex, GraphMemory graphMemory);
// 
//     /**
//      * The method is called at the end of a round to determine if the computation is complete.
//      * The method is global to the GraphComputer and as such, is not called for each vertex.
//      *
//      * @param graphMemory The global GraphMemory of the GraphComputer
//      * @return whether or not to halt the computation
//      */
//     public boolean terminate(GraphMemory graphMemory);
// 
//     public Map<String, KeyType> getComputeKeys();
// 
// 
// }


import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.furnace.algorithms.vertexcentric.GraphMemory;
import com.tinkerpop.furnace.algorithms.vertexcentric.VertexProgram;
import java.io.Serializable;
import java.util.Map;
package com.tinkerpop.furnace.algorithms.vertexcentric.programs.swarm;



/**
 * @author Marko A. Rodriguez (http://markorodriguez.com)
 */
public interface Particle extends Serializable {

    public Map<String, VertexProgram.KeyType> getComputeKeys();

// 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/VertexProgram.java
// public interface VertexProgram extends Serializable {
// 
//     public enum KeyType {
//         VARIABLE,
//         CONSTANT
//     }
// 
//     /**
//      * The method is called at the beginning of the computation.
//      * The method is global to the GraphComputer and as such, is not called for each vertex.
//      *
//      * @param graphMemory The global GraphMemory of the GraphComputer
//      */
//     public void setup(GraphMemory graphMemory);
// 
//     /**
//      * This method denotes the main body of computation.
//      *
//      * @param vertex      the vertex to execute the VertexProgram on
//      * @param graphMemory the shared state between all vertices in the computation
//      */
//     public void execute(Vertex vertex, GraphMemory graphMemory);
// 
//     /**
//      * The method is called at the end of a round to determine if the computation is complete.
//      * The method is global to the GraphComputer and as such, is not called for each vertex.
//      *
//      * @param graphMemory The global GraphMemory of the GraphComputer
//      * @return whether or not to halt the computation
//      */
//     public boolean terminate(GraphMemory graphMemory);
// 
//     public Map<String, KeyType> getComputeKeys();
// 
// 
// }


// Path: src/main/java/com/tinkerpop/furnace/algorithms/vertexcentric/programs/swarm/Particle.java
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.furnace.algorithms.vertexcentric.GraphMemory;
import com.tinkerpop.furnace.algorithms.vertexcentric.VertexProgram;
import java.io.Serializable;
import java.util.Map;

package com.tinkerpop.furnace.algorithms.vertexcentric.programs.swarm;



/**
 * @author Marko A. Rodriguez (http://markorodriguez.com)
 */
public interface Particle extends Serializable {

    public Map<String, VertexProgram.KeyType> getComputeKeys();

    public void execute(Vertex vertex, GraphMemory graphMemory, Long count, Map<Particle, Long> newParticles);