diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeOutputFormat.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeOutputFormat.java
index 29c5ccb..8075238 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeOutputFormat.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeOutputFormat.java
@@ -39,10 +39,7 @@
             public void writeVertex(Vertex<KmerBytesWritable, ValueStateWritable, NullWritable, ?> vertex) throws IOException,
                     InterruptedException {
             	if(vertex.getVertexValue().getState() != State.FINAL_DELETE
-            			&& vertex.getVertexValue().getState() != State.END_VERTEX
-            			&& vertex.getVertexValue().getState() != State.TODELETE
-            			&& vertex.getVertexValue().getState() != State.KILL_SELF
-            			&& vertex.getVertexValue().getState() != State.NON_EXIST)
+            			&& vertex.getVertexValue().getState() != State.END_VERTEX)
                     getRecordWriter().write(vertex.getVertexId(),vertex.getVertexValue());
             }
         }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeOutputFormat.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeOutputFormat.java
index 482014e..983112b 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeOutputFormat.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeOutputFormat.java
@@ -8,7 +8,6 @@
 
 import edu.uci.ics.genomix.pregelix.api.io.binary.BinaryVertexOutputFormat;
 import edu.uci.ics.genomix.pregelix.io.ValueStateWritable;
-import edu.uci.ics.genomix.pregelix.type.State;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.pregelix.api.graph.Vertex;
 import edu.uci.ics.pregelix.api.io.VertexWriter;
@@ -36,8 +35,7 @@
             @Override
             public void writeVertex(Vertex<KmerBytesWritable, ValueStateWritable, NullWritable, ?> vertex) throws IOException,
                     InterruptedException {
-            	if(vertex.getVertexValue().getState() != State.NON_EXIST)
-            		getRecordWriter().write(vertex.getVertexId(),vertex.getVertexValue());
+                getRecordWriter().write(vertex.getVertexId(),vertex.getVertexValue());
             }
         }
 }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/LogAlgorithmMessageWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/LogAlgorithmMessageWritable.java
index 108a2d5..739bacb 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/LogAlgorithmMessageWritable.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/LogAlgorithmMessageWritable.java
@@ -10,51 +10,41 @@
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 
-public class LogAlgorithmMessageWritable implements
-		WritableComparable<LogAlgorithmMessageWritable> {
+public class LogAlgorithmMessageWritable implements WritableComparable<LogAlgorithmMessageWritable>{
 	/**
 	 * sourceVertexId stores source vertexId when headVertex sends the message
-	 * stores neighber vertexValue when pathVertex sends the message
-	 * chainVertexId stores the chains of connected DNA file stores the point to
-	 * the file that stores the chains of connected DNA
+	 * 				  stores neighber vertexValue when pathVertex sends the message
+	 * chainVertexId stores the chains of connected DNA
+	 * file stores the point to the file that stores the chains of connected DNA
 	 */
-	private VKmerBytesWritable sourceVertexId;
+	private KmerBytesWritable sourceVertexId;
 	private VKmerBytesWritable chainVertexId;
 	private byte adjMap;
 	private int message;
 	private int sourceVertexState;
-
-	public LogAlgorithmMessageWritable() {
-		if (LogAlgorithmForPathMergeVertex.kmerSize > 0) {
-			sourceVertexId = new VKmerBytesWritable(
-					LogAlgorithmForPathMergeVertex.kmerSize);
-			chainVertexId = new VKmerBytesWritable(
-					LogAlgorithmForPathMergeVertex.kmerSize);
-		} else {
-			sourceVertexId = new VKmerBytesWritable(55);
-			chainVertexId = new VKmerBytesWritable(55);
-		}
+	
+	public LogAlgorithmMessageWritable(){
+		sourceVertexId = new VKmerBytesWritable(LogAlgorithmForPathMergeVertex.kmerSize);
+		chainVertexId = new VKmerBytesWritable(LogAlgorithmForPathMergeVertex.kmerSize);
 	}
-
-	public void set(KmerBytesWritable sourceVertexId,
-			KmerBytesWritable chainVertexId, byte adjMap, int message,
-			int sourceVertexState) {
+	
+	public void set(KmerBytesWritable sourceVertexId, VKmerBytesWritable chainVertexId, byte adjMap, int message, int sourceVertexState){
 		this.sourceVertexId.set(sourceVertexId);
 		this.chainVertexId.set(chainVertexId);
 		this.adjMap = adjMap;
 		this.message = message;
 		this.sourceVertexState = sourceVertexState;
 	}
-
-	public void reset() {
-		// sourceVertexId.reset(LogAlgorithmForPathMergeVertex.kmerSize);
-		chainVertexId.reset(0);
-		adjMap = (byte) 0;
+	
+	public void reset(){
+		//sourceVertexId.reset(LogAlgorithmForPathMergeVertex.kmerSize);
+		chainVertexId.reset(LogAlgorithmForPathMergeVertex.kmerSize);
+		adjMap = (byte)0;
 		message = 0;
 		sourceVertexState = 0;
 	}
 
-	public VKmerBytesWritable getSourceVertexId() {
+	public KmerBytesWritable getSourceVertexId() {
 		return sourceVertexId;
 	}
 
@@ -97,7 +87,7 @@
 	public int getLengthOfChain() {
 		return chainVertexId.getKmerLength();
 	}
-
+	
 	@Override
 	public void write(DataOutput out) throws IOException {
 		sourceVertexId.write(out);
@@ -116,25 +106,25 @@
 		sourceVertexState = in.readInt();
 	}
 
-	@Override
-	public int hashCode() {
-		return chainVertexId.hashCode();
-	}
-
-	@Override
-	public boolean equals(Object o) {
-		if (o instanceof LogAlgorithmMessageWritable) {
-			LogAlgorithmMessageWritable tp = (LogAlgorithmMessageWritable) o;
-			return chainVertexId.equals(tp.chainVertexId);
-		}
-		return false;
-	}
-
-	@Override
-	public String toString() {
-		return chainVertexId.toString();
-	}
-
+	 @Override
+    public int hashCode() {
+        return chainVertexId.hashCode();
+    }
+	 
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof NaiveAlgorithmMessageWritable) {
+        	LogAlgorithmMessageWritable tp = (LogAlgorithmMessageWritable) o;
+            return chainVertexId.equals(tp.chainVertexId);
+        }
+        return false;
+    }
+    
+    @Override
+    public String toString() {
+        return chainVertexId.toString();
+    }
+    
 	@Override
 	public int compareTo(LogAlgorithmMessageWritable tp) {
 		return chainVertexId.compareTo(tp.chainVertexId);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/ValueStateWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/ValueStateWritable.java
index a10014a..769277c 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/ValueStateWritable.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/ValueStateWritable.java
@@ -19,11 +19,7 @@
 
 	public ValueStateWritable() {
 		state = State.NON_VERTEX;
-		if (NaiveAlgorithmForPathMergeVertex.kmerSize > 0){
-			mergeChain = new VKmerBytesWritable(NaiveAlgorithmForPathMergeVertex.kmerSize);
-		}else{
-			mergeChain = new VKmerBytesWritable(55);
-		}
+		mergeChain = new VKmerBytesWritable(NaiveAlgorithmForPathMergeVertex.kmerSize);
 	}
 
 	public ValueStateWritable(byte adjMap, int state, VKmerBytesWritable mergeChain) {
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/LogAlgorithmForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/LogAlgorithmForPathMergeVertex.java
index 7b2f2ca..398d7ff 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/LogAlgorithmForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/LogAlgorithmForPathMergeVertex.java
@@ -24,13 +24,13 @@
  * vertexValue: ValueStateWritable
  * edgeValue: NullWritable
  * message: LogAlgorithmMessageWritable
- *
+ * 
  * DNA:
  * A: 00
  * C: 01
  * G: 10
  * T: 11
- *
+ * 
  * succeed node
  *  A 00000001 1
  *  G 00000010 2
@@ -42,83 +42,69 @@
  *  C 01000000 64
  *  T 10000000 128
  *  
- * For example, ONE LINE in input file: 00,01,10        0001,0010,
+ * For example, ONE LINE in input file: 00,01,10	0001,0010,
  * That means that vertexId is ACG, its succeed node is A and its precursor node is C.
  * The succeed node and precursor node will be stored in vertexValue and we don't use edgeValue.
- * The details about message are in edu.uci.ics.pregelix.example.io.MessageWritable.
+ * The details about message are in edu.uci.ics.pregelix.example.io.MessageWritable. 
  */
-public class LogAlgorithmForPathMergeVertex
-		extends
-		Vertex<KmerBytesWritable, ValueStateWritable, NullWritable, LogAlgorithmMessageWritable> {
-
+public class LogAlgorithmForPathMergeVertex extends Vertex<KmerBytesWritable, ValueStateWritable, NullWritable, LogAlgorithmMessageWritable>{	
+	
 	public static final String KMER_SIZE = "LogAlgorithmForPathMergeVertex.kmerSize";
+	public static final String ITERATIONS = "LogAlgorithmForPathMergeVertex.iteration";
 	public static int kmerSize = -1;
-	public static final String ITERATIONS = "NaiveAlgorithmForPathMergeVertex.iteration";
 	private int maxIteration = -1;
-
+	
 	private LogAlgorithmMessageWritable msg = new LogAlgorithmMessageWritable();
-
-	private VKmerBytesWritableFactory kmerFactory = new VKmerBytesWritableFactory(
-			1);
-	private VKmerBytesWritable destVertexId = new VKmerBytesWritable(1);
+	
+	private VKmerBytesWritableFactory kmerFactory = new VKmerBytesWritableFactory(1);
+	private VKmerBytesWritable destVertexId = new VKmerBytesWritable(1); 
 	private VKmerBytesWritable chainVertexId = new VKmerBytesWritable(1);
 	private VKmerBytesWritable lastKmer = new VKmerBytesWritable(1);
-
 	/**
 	 * initiate kmerSize, maxIteration
 	 */
-	public void initVertex() {
-		if (kmerSize == -1)
+	public void initVertex(){
+		if(kmerSize == -1)
 			kmerSize = getContext().getConfiguration().getInt(KMER_SIZE, 5);
-		if (maxIteration < 0)
-			maxIteration = getContext().getConfiguration().getInt(ITERATIONS,
-					100);
+        if (maxIteration < 0) 
+            maxIteration = getContext().getConfiguration().getInt(ITERATIONS, 100);
 	}
 	/**
 	 * get destination vertex
 	 */
-	public VKmerBytesWritable getNextDestVertexId(KmerBytesWritable vertexId,
-			byte geneCode) {
+	public VKmerBytesWritable getNextDestVertexId(KmerBytesWritable vertexId, byte geneCode){
 		return kmerFactory.shiftKmerWithNextCode(vertexId, geneCode);
 	}
-
-	public VKmerBytesWritable getPreDestVertexId(KmerBytesWritable vertexId,
-			byte geneCode) {
+	
+	public VKmerBytesWritable getPreDestVertexId(KmerBytesWritable vertexId, byte geneCode){
 		return kmerFactory.shiftKmerWithPreCode(vertexId, geneCode);
 	}
-
-	public VKmerBytesWritable getNextDestVertexIdFromBitmap(
-			KmerBytesWritable chainVertexId, byte adjMap) {
-		return getDestVertexIdFromChain(chainVertexId, adjMap);// GeneCode.getGeneCodeFromBitMap((byte)(adjMap
-																// & 0x0F)
-	}
-
-	public VKmerBytesWritable getDestVertexIdFromChain(
-			KmerBytesWritable chainVertexId, byte adjMap) {
-		lastKmer.set(kmerFactory.getLastKmerFromChain(kmerSize, chainVertexId));
-		return getNextDestVertexId(lastKmer,
-				GeneCode.getGeneCodeFromBitMap((byte) (adjMap & 0x0F)));
+	
+	public VKmerBytesWritable getNextDestVertexIdFromBitmap(KmerBytesWritable chainVertexId, byte adjMap){
+		return getDestVertexIdFromChain(chainVertexId, adjMap);//GeneCode.getGeneCodeFromBitMap((byte)(adjMap & 0x0F)
 	}
 	
+	public VKmerBytesWritable getDestVertexIdFromChain(KmerBytesWritable chainVertexId, byte adjMap){
+		lastKmer.set(kmerFactory.getLastKmerFromChain(kmerSize, chainVertexId));
+		return getNextDestVertexId(lastKmer, GeneCode.getGeneCodeFromBitMap((byte)(adjMap & 0x0F)));
+	}
 	/**
 	 * head send message to all next nodes
 	 */
-	public void sendMsgToAllNextNodes(KmerBytesWritable vertexId, byte adjMap) {
-		for (byte x = GeneCode.A; x <= GeneCode.T; x++) {
-			if ((adjMap & (1 << x)) != 0) {
+	public void sendMsgToAllNextNodes(KmerBytesWritable vertexId, byte adjMap){
+		for(byte x = GeneCode.A; x<= GeneCode.T ; x++){
+			if((adjMap & (1 << x)) != 0){
 				destVertexId.set(getNextDestVertexId(vertexId, x));
 				sendMsg(destVertexId, msg);
 			}
 		}
 	}
-
 	/**
 	 * head send message to all previous nodes
 	 */
-	public void sendMsgToAllPreviousNodes(KmerBytesWritable vertexId,
-			byte adjMap) {
-		for (byte x = GeneCode.A; x <= GeneCode.T; x++) {
-			if (((adjMap >> 4) & (1 << x)) != 0) {
+	public void sendMsgToAllPreviousNodes(KmerBytesWritable vertexId, byte adjMap){
+		for(byte x = GeneCode.A; x<= GeneCode.T ; x++){
+			if(((adjMap >> 4) & (1 << x)) != 0){
 				destVertexId.set(getPreDestVertexId(vertexId, x));
 				sendMsg(destVertexId, msg);
 			}
@@ -128,282 +114,245 @@
 	/**
 	 * set vertex state
 	 */
-	public void setState() {
-		if (msg.getMessage() == Message.START
-				&& (getVertexValue().getState() == State.MID_VERTEX || getVertexValue()
-						.getState() == State.END_VERTEX)) {
+	public void setState(){
+		if(msg.getMessage() == Message.START && 
+				(getVertexValue().getState() == State.MID_VERTEX || getVertexValue().getState() == State.END_VERTEX)){
 			getVertexValue().setState(State.START_VERTEX);
 			setVertexValue(getVertexValue());
-		} else if (msg.getMessage() == Message.END
-				&& getVertexValue().getState() == State.MID_VERTEX) {
+		}
+		else if(msg.getMessage() == Message.END && getVertexValue().getState() == State.MID_VERTEX){
 			getVertexValue().setState(State.END_VERTEX);
 			setVertexValue(getVertexValue());
 			voteToHalt();
-		} else
+		}
+		else
 			voteToHalt();
 	}
-
 	/**
 	 * send start message to next node
 	 */
-	public void sendStartMsgToNextNode() {
+	public void sendStartMsgToNextNode(){
 		msg.setMessage(Message.START);
 		msg.setSourceVertexId(getVertexId());
 		sendMsg(destVertexId, msg);
 		voteToHalt();
 	}
-
 	/**
 	 * send end message to next node
 	 */
-	public void sendEndMsgToNextNode() {
+	public void sendEndMsgToNextNode(){
 		msg.setMessage(Message.END);
 		msg.setSourceVertexId(getVertexId());
 		sendMsg(destVertexId, msg);
 		voteToHalt();
 	}
-
 	/**
 	 * send non message to next node
 	 */
-	public void sendNonMsgToNextNode() {
+	public void sendNonMsgToNextNode(){
 		msg.setMessage(Message.NON);
 		msg.setSourceVertexId(getVertexId());
 		sendMsg(destVertexId, msg);
 	}
-
 	/**
 	 * head send message to path
 	 */
-	public void sendMsgToPathVertex(KmerBytesWritable chainVertexId,
-			byte adjMap) {
-		if (GeneCode
-				.getGeneCodeFromBitMap((byte) (getVertexValue().getAdjMap() & 0x0F)) == -1) // ||// lastKmer == null
-
+	public void sendMsgToPathVertex(KmerBytesWritable chainVertexId, byte adjMap){
+		if(GeneCode.getGeneCodeFromBitMap((byte)(getVertexValue().getAdjMap() & 0x0F)) == -1) //|| lastKmer == null
 			voteToHalt();
-		else {
-			destVertexId.set(getNextDestVertexIdFromBitmap(chainVertexId,
-					adjMap));
-			if (getVertexValue().getState() == State.START_VERTEX) {
+		else{
+			destVertexId.set(getNextDestVertexIdFromBitmap(chainVertexId, adjMap));
+			if(getVertexValue().getState() == State.START_VERTEX){
 				sendStartMsgToNextNode();
-			} else if (getVertexValue().getState() != State.END_VERTEX
-					&& getVertexValue().getState() != State.FINAL_DELETE) {
+			}
+			else if(getVertexValue().getState() != State.END_VERTEX && getVertexValue().getState() != State.FINAL_DELETE){
 				sendEndMsgToNextNode();
 			}
 		}
 	}
-
 	/**
-	 * path send message to head
+	 * path send message to head 
 	 */
-	public void responseMsgToHeadVertex() {
-		if (getVertexValue().getLengthOfMergeChain() == -1) {
+	public void responseMsgToHeadVertex(){
+		if(getVertexValue().getLengthOfMergeChain() == -1){
 			getVertexValue().setMergeChain(getVertexId());
 			setVertexValue(getVertexValue());
 		}
-		msg.set(msg.getSourceVertexId(), getVertexValue().getMergeChain(),
-				getVertexValue().getAdjMap(), msg.getMessage(), getVertexValue().getState());
+		msg.set(msg.getSourceVertexId(), getVertexValue().getMergeChain(), getVertexValue().getAdjMap(), msg.getMessage(), getVertexValue().getState());
 		setMessageType(msg.getMessage());
 		destVertexId.set(msg.getSourceVertexId());
-		sendMsg(destVertexId, msg);
+		sendMsg(destVertexId,msg);
 	}
-
 	/**
 	 * set message type
 	 */
-	public void setMessageType(int message) {
-		// kill Message because it has been merged by the head
-		if (getVertexValue().getState() == State.END_VERTEX
-				|| getVertexValue().getState() == State.FINAL_DELETE) {
+	public void setMessageType(int message){
+		//kill Message because it has been merged by the head
+		if(getVertexValue().getState() == State.END_VERTEX || getVertexValue().getState() == State.FINAL_DELETE){
 			msg.setMessage(Message.END);
 			getVertexValue().setState(State.FINAL_DELETE);
 			setVertexValue(getVertexValue());
-			// deleteVertex(getVertexId());
-		} else
+			//deleteVertex(getVertexId());
+		}
+		else
 			msg.setMessage(Message.NON);
-
-		if (message == Message.START) {
+		
+		if(message == Message.START){
 			getVertexValue().setState(State.TODELETE);
 			setVertexValue(getVertexValue());
 		}
 	}
-
 	/**
-	 * set vertexValue's state chainVertexId, value
+	 *  set vertexValue's state chainVertexId, value
 	 */
-	public void setVertexValueAttributes() {
-		if (msg.getMessage() == Message.END) {
-			if (getVertexValue().getState() != State.START_VERTEX)
+	public void setVertexValueAttributes(){
+		if(msg.getMessage() == Message.END){
+			if(getVertexValue().getState() != State.START_VERTEX)
 				getVertexValue().setState(State.END_VERTEX);
 			else
 				getVertexValue().setState(State.FINAL_VERTEX);
 		}
-
-		if (getSuperstep() == 5)
+			
+		if(getSuperstep() == 5)
 			chainVertexId.set(getVertexId());
 		else
 			chainVertexId.set(getVertexValue().getMergeChain());
-		lastKmer.set(kmerFactory.getLastKmerFromChain(msg.getLengthOfChain()
-				- kmerSize + 1, msg.getChainVertexId()));
+		lastKmer.set(kmerFactory.getLastKmerFromChain(msg.getLengthOfChain() - kmerSize + 1, msg.getChainVertexId()));
 		chainVertexId.set(kmerFactory.mergeTwoKmer(chainVertexId, lastKmer));
 		getVertexValue().setMergeChain(chainVertexId);
-
-		byte tmpVertexValue = GraphVertexOperation.updateRightNeighber(
-				getVertexValue().getAdjMap(), msg.getAdjMap());
+		
+		byte tmpVertexValue = GraphVertexOperation.updateRightNeighber(getVertexValue().getAdjMap(), msg.getAdjMap());
 		getVertexValue().setAdjMap(tmpVertexValue);
 	}
-
 	/**
-	 * send message to self
+	 *  send message to self
 	 */
-	public void sendMsgToSelf() {
-		if (msg.getMessage() != Message.END) {
+	public void sendMsgToSelf(){
+		if(msg.getMessage() != Message.END){
 			setVertexValue(getVertexValue());
-			msg.reset(); // reset
+			msg.reset(); //reset
 			msg.setAdjMap(getVertexValue().getAdjMap());
-			sendMsg(getVertexId(), msg);
+			sendMsg(getVertexId(),msg);
 		}
 	}
-
 	/**
 	 * start sending message
 	 */
-	public void startSendMsg() {
-		if (GraphVertexOperation.isHeadVertex(getVertexValue().getAdjMap())) {
-			msg.set(getVertexId(), chainVertexId, (byte) 0, Message.START,
-					State.NON_VERTEX); // msg.set(null, (byte)0, chainVertexId,
-										// Message.START, State.NON_VERTEX);
+	public void startSendMsg(){
+		if(GraphVertexOperation.isHeadVertex(getVertexValue().getAdjMap())){
+			msg.set(getVertexId(), chainVertexId, (byte)0, Message.START, State.NON_VERTEX); //msg.set(null, (byte)0, chainVertexId, Message.START, State.NON_VERTEX);
 			sendMsgToAllNextNodes(getVertexId(), getVertexValue().getAdjMap());
 			voteToHalt();
 		}
-		if (GraphVertexOperation.isRearVertex(getVertexValue().getAdjMap())) {
-			msg.set(getVertexId(), chainVertexId, (byte) 0, Message.END,
-					State.NON_VERTEX);
+		if(GraphVertexOperation.isRearVertex(getVertexValue().getAdjMap())){
+			msg.set(getVertexId(), chainVertexId, (byte)0, Message.END, State.NON_VERTEX);
 			sendMsgToAllPreviousNodes(getVertexId(), getVertexValue().getAdjMap());
 			voteToHalt();
 		}
-		if (GraphVertexOperation.isPathVertex(getVertexValue().getAdjMap())) {
+		if(GraphVertexOperation.isPathVertex(getVertexValue().getAdjMap())){
 			getVertexValue().setState(State.MID_VERTEX);
 			setVertexValue(getVertexValue());
 		}
 	}
-
 	/**
-	 * initiate head, rear and path node
+	 *  initiate head, rear and path node
 	 */
-	public void initState(Iterator<LogAlgorithmMessageWritable> msgIterator) {
-		while (msgIterator.hasNext()) {
-			if (!GraphVertexOperation.isPathVertex(getVertexValue().getAdjMap())) {
+	public void initState(Iterator<LogAlgorithmMessageWritable> msgIterator){
+		while(msgIterator.hasNext()){
+			if(!GraphVertexOperation.isPathVertex(getVertexValue().getAdjMap())){
 				msgIterator.next();
 				voteToHalt();
-			} else {
+			}
+			else{
 				msg = msgIterator.next();
 				setState();
 			}
 		}
 	}
-
 	/**
 	 * head send message to path
 	 */
-	public void sendMsgToPathVertex(
-			Iterator<LogAlgorithmMessageWritable> msgIterator) {
-		if (getSuperstep() == 3) {
+	public void sendMsgToPathVertex(Iterator<LogAlgorithmMessageWritable> msgIterator){
+		if(getSuperstep() == 3){
 			msg.reset();
 			sendMsgToPathVertex(getVertexId(), getVertexValue().getAdjMap());
-		} else {
-			if (msgIterator.hasNext()) {
+		}
+		else{
+			if(msgIterator.hasNext()){
 				msg = msgIterator.next();
 				sendMsgToPathVertex(getVertexValue().getMergeChain(), msg.getAdjMap());
 			}
 		}
 	}
-
 	/**
 	 * path response message to head
 	 */
-	public void responseMsgToHeadVertex(
-			Iterator<LogAlgorithmMessageWritable> msgIterator) {
-		if (msgIterator.hasNext()) {
+	public void responseMsgToHeadVertex(Iterator<LogAlgorithmMessageWritable> msgIterator){
+		if(msgIterator.hasNext()){
 			msg = msgIterator.next();
 			responseMsgToHeadVertex();
-			// voteToHalt();
-		} else {
-			if (getVertexValue().getState() != State.START_VERTEX
-					&& getVertexValue().getState() != State.END_VERTEX
-					&& getVertexValue().getState() != State.FINAL_DELETE) {
-				// vertexVal.setState(State.KILL_SELF);
-				// setVertexValue(vertexVal);
-				// voteToHalt();
-				deleteVertex(getVertexId());// killSelf because it doesn't
-											// receive any message
+			//voteToHalt();
+		}
+		else{
+			if(getVertexValue().getState() != State.START_VERTEX 
+					&& getVertexValue().getState() != State.END_VERTEX && getVertexValue().getState() != State.FINAL_DELETE){
+				deleteVertex(getVertexId());//killSelf because it doesn't receive any message
 			}
 		}
 	}
-
 	/**
 	 * merge chainVertex and store in vertexVal.chainVertexId
 	 */
-	public void mergeChainVertex(
-			Iterator<LogAlgorithmMessageWritable> msgIterator) {
-		if (msgIterator.hasNext()) {
+	public void mergeChainVertex(Iterator<LogAlgorithmMessageWritable> msgIterator){
+		if(msgIterator.hasNext()){
 			msg = msgIterator.next();
 			setVertexValueAttributes();
 			sendMsgToSelf();
 		}
-		if (getVertexValue().getState() == State.END_VERTEX
-				|| getVertexValue().getState() == State.FINAL_DELETE) {
+		if(getVertexValue().getState() == State.END_VERTEX || getVertexValue().getState() == State.FINAL_DELETE){
 			voteToHalt();
 		}
-		if (getVertexValue().getState() == State.FINAL_VERTEX) {
-			//String source = vertexVal.getMergeChain().toString();
+		if(getVertexValue().getState() == State.FINAL_VERTEX){
+			//String source = getVertexValue().getMergeChain().toString();
 			voteToHalt();
 		}
 	}
-
 	@Override
 	public void compute(Iterator<LogAlgorithmMessageWritable> msgIterator) {
 		initVertex();
-		if (getVertexValue().getState() != State.NON_EXIST
-				&& getVertexValue().getState() != State.KILL_SELF) {
-			if (getSuperstep() == 1)
-				startSendMsg();
-			else if (getSuperstep() == 2)
-				initState(msgIterator);
-			else if (getSuperstep() % 3 == 0 && getSuperstep() <= maxIteration) {
-				sendMsgToPathVertex(msgIterator);
-			} else if (getSuperstep() % 3 == 1
-					&& getSuperstep() <= maxIteration) {
-				responseMsgToHeadVertex(msgIterator);
-			} else if (getSuperstep() % 3 == 2
-					&& getSuperstep() <= maxIteration) {
-				if (getVertexValue().getState() == State.TODELETE) { // || vertexVal.getState() == State.KILL_SELF)
-					// vertexVal.setState(State.NON_EXIST);
-					// setVertexValue(vertexVal);
-					// voteToHalt();
-					deleteVertex(getVertexId()); // killSelf
-				} else {
-					mergeChainVertex(msgIterator);
-				}
+		if (getSuperstep() == 1) 
+			startSendMsg();
+		else if(getSuperstep() == 2)
+			initState(msgIterator);
+		else if(getSuperstep()%3 == 0 && getSuperstep() <= maxIteration){
+			sendMsgToPathVertex(msgIterator);
+		}
+		else if(getSuperstep()%3 == 1 && getSuperstep() <= maxIteration){
+			responseMsgToHeadVertex(msgIterator);
+		}
+		else if(getSuperstep()%3 == 2 && getSuperstep() <= maxIteration){
+			if(getVertexValue().getState() == State.TODELETE){ 
+				deleteVertex(getVertexId()); //killSelf
+			}
+			else{
+				mergeChainVertex(msgIterator);
 			}
 		}
 	}
-
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
-		PregelixJob job = new PregelixJob(
-				LogAlgorithmForPathMergeVertex.class.getSimpleName());
-		job.setVertexClass(LogAlgorithmForPathMergeVertex.class);
-		/**
-		 * BinaryInput and BinaryOutput~/
-		 */
-		job.setVertexInputFormatClass(LogAlgorithmForPathMergeInputFormat.class);
-		job.setVertexOutputFormatClass(LogAlgorithmForPathMergeOutputFormat.class);
-		job.setOutputKeyClass(KmerBytesWritable.class);
-		job.setOutputValueClass(ValueStateWritable.class);
-		job.setDynamicVertexValueSize(true);
-		Client.run(args, job);
+        PregelixJob job = new PregelixJob(LogAlgorithmForPathMergeVertex.class.getSimpleName());
+        job.setVertexClass(LogAlgorithmForPathMergeVertex.class);
+        /**
+         * BinaryInput and BinaryOutput~/
+         */
+        job.setVertexInputFormatClass(LogAlgorithmForPathMergeInputFormat.class); 
+        job.setVertexOutputFormatClass(LogAlgorithmForPathMergeOutputFormat.class); 
+        job.setOutputKeyClass(KmerBytesWritable.class);
+        job.setOutputValueClass(ValueStateWritable.class);
+        job.setDynamicVertexValueSize(true);
+        Client.run(args, job);
 	}
 }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/NaiveAlgorithmForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/NaiveAlgorithmForPathMergeVertex.java
index 6941865..04b8525 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/NaiveAlgorithmForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/NaiveAlgorithmForPathMergeVertex.java
@@ -56,8 +56,6 @@
 	public static final String ITERATIONS = "NaiveAlgorithmForPathMergeVertex.iteration";
 	public static int kmerSize = -1;
 	private int maxIteration = -1;
-	
-	private ValueStateWritable vertexVal = new ValueStateWritable();
 
 	private NaiveAlgorithmMessageWritable msg = new NaiveAlgorithmMessageWritable();
 
@@ -74,7 +72,6 @@
 			kmerSize = getContext().getConfiguration().getInt(KMER_SIZE, 5);
         if (maxIteration < 0) 
             maxIteration = getContext().getConfiguration().getInt(ITERATIONS, 100);
-		vertexVal = getVertexValue();
 	}
 	public void findDestination(){
 		destVertexId.set(msg.getSourceVertexId());
@@ -107,11 +104,11 @@
 	public void initChainVertex(){
 		if(!msg.isRear()){
 			findDestination();
-			if(GraphVertexOperation.isPathVertex(vertexVal.getAdjMap())){
+			if(GraphVertexOperation.isPathVertex(getVertexValue().getAdjMap())){
 				chainVertexId.set(getVertexId());
-				msg.set(getVertexId(), chainVertexId, getVertexId(), vertexVal.getAdjMap(), false);
+				msg.set(getVertexId(), chainVertexId, getVertexId(), getVertexValue().getAdjMap(), false);
 				sendMsg(destVertexId,msg);
-			}else if(GraphVertexOperation.isRearVertex(vertexVal.getAdjMap()))
+			}else if(GraphVertexOperation.isRearVertex(getVertexValue().getAdjMap()))
 				voteToHalt();
 		}
 	}
@@ -133,22 +130,22 @@
 	public void responseMsgToHeadVertex(){
 		if(!msg.isRear()){
 			findDestination();
-			if(GraphVertexOperation.isPathVertex(vertexVal.getAdjMap())){
+			if(GraphVertexOperation.isPathVertex(getVertexValue().getAdjMap())){
 				chainVertexId = kmerFactory.mergeKmerWithNextCode(msg.getChainVertexId(),
 						getVertexId().getGeneCodeAtPosition(kmerSize - 1));
 				deleteVertex(getVertexId());
-				msg.set(getVertexId(), chainVertexId, msg.getHeadVertexId(), vertexVal.getAdjMap(), false);
+				msg.set(getVertexId(), chainVertexId, msg.getHeadVertexId(), getVertexValue().getAdjMap(), false);
 				sendMsg(destVertexId,msg);
 			}
-			else if(GraphVertexOperation.isRearVertex(vertexVal.getAdjMap())){
+			else if(GraphVertexOperation.isRearVertex(getVertexValue().getAdjMap())){
 				msg.set(getVertexId(), msg.getChainVertexId(), msg.getHeadVertexId(), (byte)0, true);
 				sendMsg(destVertexId,msg);
 			}
 		}else{// is Rear
 			chainVertexId.set(msg.getSourceVertexId());
-			vertexVal.set(GraphVertexOperation.updateRightNeighberByVertexId(vertexVal.getAdjMap(), chainVertexId, kmerSize),
+			getVertexValue().set(GraphVertexOperation.updateRightNeighberByVertexId(getVertexValue().getAdjMap(), chainVertexId, kmerSize),
 					State.START_VERTEX, msg.getChainVertexId());
-			setVertexValue(vertexVal);
+			setVertexValue(getVertexValue());
 			//String source = msg.getChainVertexId().toString();
 			//System.out.print("");
 		}
@@ -158,9 +155,9 @@
 	public void compute(Iterator<NaiveAlgorithmMessageWritable> msgIterator) {
 		initVertex();
 		if (getSuperstep() == 1) {
-			if(GraphVertexOperation.isHeadVertex(vertexVal.getAdjMap())){ 
+			if(GraphVertexOperation.isHeadVertex(getVertexValue().getAdjMap())){ 
 				msg.set(getVertexId(), chainVertexId, getVertexId(), (byte)0, false);
-				sendMsgToAllNextNodes(getVertexId(), vertexVal.getAdjMap());
+				sendMsgToAllNextNodes(getVertexId(), getVertexValue().getAdjMap());
 			}
 		}
 		else if(getSuperstep() == 2){
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateSmallFile.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateSmallFile.java
index 1f90dbd..d97a2fd 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateSmallFile.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateSmallFile.java
@@ -40,9 +40,9 @@
 	public static void main(String[] args) throws IOException {
 		// TODO Auto-generated method stub
 		Path dir = new Path("data");
-		Path inFile = new Path(dir, "part-1");
-		Path outFile = new Path(dir, "part-1-out-3000000");
-		generateNumOfLinesFromBigFile(inFile,outFile,3000000);
+		Path inFile = new Path(dir, "part-0");
+		Path outFile = new Path(dir, "part-0-out-5000000");
+		generateNumOfLinesFromBigFile(inFile,outFile,5000000);
 	}
 
 }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/State.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/State.java
index ae3c621..61bcb0c 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/State.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/State.java
@@ -9,7 +9,6 @@
 	public static final int FINAL_VERTEX = 5;
 	public static final int FINAL_DELETE = 6;
 	public static final int KILL_SELF = 7;
-	public static final int NON_EXIST = 8;
 	
 	public final static class STATE_CONTENT{
 
@@ -40,9 +39,6 @@
 			case KILL_SELF:
 				r = "KILL_SELF";
 				break;
-			case NON_EXIST:
-				r = "NON_EXIST";
-				break;
 			}
 			return r;
 		}
