add path merge test case
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 0934227..69352a1 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
@@ -28,6 +28,8 @@
 	public LogAlgorithmMessageWritable(){
 		sourceVertexId = new VKmerBytesWritable(ThreeStepLogAlgorithmForPathMergeVertex.kmerSize);
 		chainVertexId = new VKmerBytesWritable(ThreeStepLogAlgorithmForPathMergeVertex.kmerSize);
+		adjMap = 0;
+		message = 0;
 		checkMessage = 0;
 	}
 	
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 c1be540..057ab08 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
@@ -91,8 +91,8 @@
 			return GeneCode.getSymbolFromBitMap(adjMap);
 		return 	GeneCode.getSymbolFromBitMap(adjMap) + "\t" +
 				getLengthOfMergeChain() + "\t" +
-				mergeChain.toString() + "\t" +
-				state;
+				mergeChain.toString();
+				//+ "\t" + state;
 	}
 	
 }
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 04b8525..6eb6717 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
@@ -118,10 +118,11 @@
 	public void sendMsgToPathVertex(){
 		if(!msg.isRear()){
 			destVertexId.set(getDestVertexIdFromChain(msg.getChainVertexId(), msg.getAdjMap()));
+			msg.set(getVertexId(), msg.getChainVertexId(), msg.getHeadVertexId(), (byte)0, msg.isRear());
 		}else{
 			destVertexId.set(msg.getHeadVertexId());
+			msg.set(msg.getSourceVertexId(), msg.getChainVertexId(), msg.getHeadVertexId(), (byte)0, msg.isRear());
 		}
-		msg.set(getVertexId(), msg.getChainVertexId(), msg.getHeadVertexId(), (byte)0, msg.isRear());
 		sendMsg(destVertexId,msg);
 	}
 	/**
@@ -144,7 +145,7 @@
 		}else{// is Rear
 			chainVertexId.set(msg.getSourceVertexId());
 			getVertexValue().set(GraphVertexOperation.updateRightNeighberByVertexId(getVertexValue().getAdjMap(), chainVertexId, kmerSize),
-					State.START_VERTEX, msg.getChainVertexId());
+					State.FINAL_VERTEX, msg.getChainVertexId());
 			setVertexValue(getVertexValue());
 			//String source = msg.getChainVertexId().toString();
 			//System.out.print("");
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/TwoStepLogAlgorithmForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/TwoStepLogAlgorithmForPathMergeVertex.java
index ca5d56f..b613ec1 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/TwoStepLogAlgorithmForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/TwoStepLogAlgorithmForPathMergeVertex.java
@@ -275,7 +275,6 @@
 	 */
 	public void sendMsgToPathVertex(Iterator<LogAlgorithmMessageWritable> msgIterator){
 		if(getSuperstep() == 3){
-			//msg.reset();
 			sendMsgToPathVertex(getVertexId(), getVertexValue().getAdjMap());
 		}
 		else{
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/CombineSequenceFile.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/CombineSequenceFile.java
index c7349dd..55ddcff 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/CombineSequenceFile.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/CombineSequenceFile.java
@@ -25,7 +25,7 @@
 		
 		Path p = new Path("output");
 		//Path p2 = new Path("data/result");
-		Path outFile = new Path("output"); 
+		Path outFile = new Path("output2"); 
 		SequenceFile.Reader reader;
 	    SequenceFile.Writer writer = SequenceFile.createWriter(fileSys, conf,
 	         outFile, KmerBytesWritable.class, KmerCountValue.class, 
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 d97a2fd..c17abc9 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
@@ -41,8 +41,8 @@
 		// TODO Auto-generated method stub
 		Path dir = new Path("data");
 		Path inFile = new Path(dir, "part-0");
-		Path outFile = new Path(dir, "part-0-out-5000000");
-		generateNumOfLinesFromBigFile(inFile,outFile,5000000);
+		Path outFile = new Path(dir, "part-0-out-20000000");
+		generateNumOfLinesFromBigFile(inFile,outFile,20000000);
 	}
 
 }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateTextFile.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateTextFile.java
index 0729b96..249c293 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateTextFile.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateTextFile.java
@@ -10,19 +10,20 @@
 import org.apache.hadoop.io.SequenceFile;
 
 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.genomix.type.KmerCountValue;
 
 public class GenerateTextFile {
 
 	public static void generateFromPathmergeResult() throws IOException{
-		BufferedWriter bw = new BufferedWriter(new FileWriter("text/naive_LongPath"));
+		BufferedWriter bw = new BufferedWriter(new FileWriter("output2"));
 		Configuration conf = new Configuration();
 		FileSystem fileSys = FileSystem.get(conf);
 		for(int i = 0; i < 2; i++){
 			Path path = new Path("output/part-" + i);
 			SequenceFile.Reader reader = new SequenceFile.Reader(fileSys, path, conf);
-			KmerBytesWritable key = new KmerBytesWritable(5);
+			KmerBytesWritable key = new KmerBytesWritable(55);
 		    ValueStateWritable value = new ValueStateWritable();
 		    
 		    while(reader.next(key, value)){
@@ -37,6 +38,55 @@
 		}
 		bw.close();
 	}
+	public static void generateSpecificLengthChainFromNaivePathmergeResult(int maxLength) throws IOException{
+		BufferedWriter bw = new BufferedWriter(new FileWriter("naive_text_" + maxLength));
+		Configuration conf = new Configuration();
+		FileSystem fileSys = FileSystem.get(conf);
+		for(int i = 0; i < 2; i++){
+			Path path = new Path("/home/anbangx/genomix_result/final_naive/part-" + i);
+			SequenceFile.Reader reader = new SequenceFile.Reader(fileSys, path, conf);
+			KmerBytesWritable key = new KmerBytesWritable(55);
+		    ValueStateWritable value = new ValueStateWritable();
+		    
+		    while(reader.next(key, value)){
+				if (key == null || value == null){
+					break;
+				} 
+				if(value.getLengthOfMergeChain() != -1 && value.getLengthOfMergeChain() <= maxLength){
+					bw.write(value.toString());
+					bw.newLine();
+				}
+		    }
+		    reader.close();
+		}
+		bw.close();
+	}
+	
+	public static void generateSpecificLengthChainFromLogPathmergeResult(int maxLength) throws IOException{
+		BufferedWriter bw = new BufferedWriter(new FileWriter("log_text_" + maxLength));
+		Configuration conf = new Configuration();
+		FileSystem fileSys = FileSystem.get(conf);
+		for(int i = 0; i < 2; i++){
+			Path path = new Path("/home/anbangx/genomix_result/improvelog2/part-" + i);
+			SequenceFile.Reader reader = new SequenceFile.Reader(fileSys, path, conf);
+			KmerBytesWritable key = new KmerBytesWritable(55);
+		    ValueStateWritable value = new ValueStateWritable();
+		    
+		    while(reader.next(key, value)){
+				if (key == null || value == null){
+					break;
+				} 
+				if(value.getLengthOfMergeChain() != -1 && value.getLengthOfMergeChain() <= maxLength
+						&& value.getState() == State.FINAL_VERTEX){
+					bw.write(key.toString()
+							+ "\t" + value.toString());
+					bw.newLine();
+				}
+		    }
+		    reader.close();
+		}
+		bw.close();
+	}
 	public static void generateFromGraphbuildResult() throws IOException{
 		BufferedWriter bw = new BufferedWriter(new FileWriter("textfile"));
 		Configuration conf = new Configuration();
@@ -63,6 +113,8 @@
 	public static void main(String[] args) throws IOException {
 		generateFromPathmergeResult();
 		//generateFromGraphbuildResult();
+		//generateSpecificLengthChainFromPathmergeResult(68);
+		//generateSpecificLengthChainFromLogPathmergeResult(68);
 	}
 
 }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/ProcessFinalResult.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/ProcessFinalResult.java
index a07cff2..358b99d 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/ProcessFinalResult.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/ProcessFinalResult.java
@@ -14,8 +14,8 @@
 	 */
 	public static void main(String[] args) throws Exception {
 		DecimalFormat df = new DecimalFormat("0.00");
-		BufferedReader br = new BufferedReader(new FileReader("log2_unfinite"));
-		BufferedWriter bw = new BufferedWriter(new FileWriter("report3"));
+		BufferedReader br = new BufferedReader(new FileReader("log2_unfinite_improve"));
+		BufferedWriter bw = new BufferedWriter(new FileWriter("report4"));
 		String line;
 		int i = 0;
 		double totalTime = 0;
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/util/GraphVertexOperation.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/util/GraphVertexOperation.java
index 5cb0c2b..1b4217f 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/util/GraphVertexOperation.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/util/GraphVertexOperation.java
@@ -4,18 +4,6 @@
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 
 public class GraphVertexOperation {
-	
-	/**
-	 *  generate the valid data(byte[]) from BytesWritable
-	 */
-	public static byte[] generateValidDataFromBytesWritable(VKmerBytesWritable bw){
-		byte[] wholeBytes = bw.getBytes();
-		int validNum = bw.getLength();
-		byte[] validBytes = new byte[validNum];
-		for(int i = 0; i < validNum; i++)
-			validBytes[i] = wholeBytes[i];
-		return validBytes;
-	}
 	/**
 	 * Single Vertex: in-degree = out-degree = 1
 	 * @param vertexValue 
@@ -49,7 +37,7 @@
 	public static byte updateRightNeighberByVertexId(byte oldVertexValue, VKmerBytesWritable neighberVertex, int k){
 		byte geneCode = neighberVertex.getGeneCodeAtPosition(k-1);
 		
-		byte newBit = GeneCode.getAdjBit(geneCode);
+		byte newBit = GeneCode.getBitMapFromGeneCode(geneCode); //getAdjBit
 		return (byte) ((byte)(oldVertexValue & 0xF0) | (byte) (newBit & 0x0F));
 	}
 	/**
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/CompareTest.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/CompareTest.java
new file mode 100644
index 0000000..2c7c7e6
--- /dev/null
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/CompareTest.java
@@ -0,0 +1,19 @@
+package edu.uci.ics.genomix.pregelix.pathmerge;
+
+import java.io.File;
+
+import org.junit.Test;
+
+import edu.uci.ics.pregelix.core.util.TestUtils;
+
+public class CompareTest {
+	public static final String PATH_TO_TESTSTORE = "testcase/pathmerge";
+	public static final String CHAIN_OUTPUT = PATH_TO_TESTSTORE + "chain";
+	
+	@Test
+	public void test() throws Exception {
+		File naive = new File(CHAIN_OUTPUT + "/naive-sort");
+		File log = new File(CHAIN_OUTPUT + "/log-sort");
+		TestUtils.compareWithResult(naive, log);
+	}
+}
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/MergePathTest.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/MergePathTest.java
new file mode 100644
index 0000000..98eb03a
--- /dev/null
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/MergePathTest.java
@@ -0,0 +1,120 @@
+package edu.uci.ics.genomix.pregelix.pathmerge;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.io.SequenceFile;
+import org.junit.Test;
+
+import edu.uci.ics.genomix.pregelix.io.ValueStateWritable;
+import edu.uci.ics.genomix.pregelix.type.State;
+import edu.uci.ics.genomix.type.KmerBytesWritable;
+
+public class MergePathTest {
+	public static final String PATH_TO_TESTSTORE = "testcase/pathmerge/"; 
+	public static final String NAIVE_DATA_INPUT = "genomix_result/pathmerge/final_naive";
+	public static final String LOG_DATA_INPUT = "genomix_result/pathmerge/final_log";
+	public static final String TEXT_OUTPUT = PATH_TO_TESTSTORE + "textfile";
+	public static final String CHAIN_OUTPUT = PATH_TO_TESTSTORE + "chain";
+	
+	private static int nc = 4;
+	private static int kmerSize = 55;
+	private static int maxLength = 68; 
+	
+	@Test
+	public void test() throws Exception {
+		FileUtils.forceMkdir(new File(PATH_TO_TESTSTORE));
+		FileUtils.cleanDirectory(new File(PATH_TO_TESTSTORE));
+		FileUtils.forceMkdir(new File(TEXT_OUTPUT));
+		FileUtils.cleanDirectory(new File(TEXT_OUTPUT));
+		FileUtils.forceMkdir(new File(CHAIN_OUTPUT));
+		FileUtils.cleanDirectory(new File(CHAIN_OUTPUT));
+		generateTextFromPathmergeResult(NAIVE_DATA_INPUT, TEXT_OUTPUT, "/naive");
+		generateTextFromPathmergeResult(LOG_DATA_INPUT, TEXT_OUTPUT, "/log");
+		generateSpecificLengthChainFromNaivePathmergeResult(NAIVE_DATA_INPUT, CHAIN_OUTPUT, maxLength);
+		generateSpecificLengthChainFromLogPathmergeResult(LOG_DATA_INPUT, CHAIN_OUTPUT, maxLength);
+	} 
+	
+	public static void generateTextFromPathmergeResult(String input, String outputDir, String fileName) throws IOException{
+		BufferedWriter bw = new BufferedWriter(new FileWriter(new File(outputDir + fileName)));
+		Configuration conf = new Configuration();
+		FileSystem fileSys = FileSystem.get(conf);
+		for(int i = 0; i < nc; i++){
+			Path path = new Path(input + "/part-" + i);
+			SequenceFile.Reader reader = new SequenceFile.Reader(fileSys, path, conf);
+			KmerBytesWritable key = new KmerBytesWritable(kmerSize);
+		    ValueStateWritable value = new ValueStateWritable();
+		    
+		    while(reader.next(key, value)){
+				if (key == null || value == null){
+					break;
+				}
+				if(value.getLengthOfMergeChain() != -1){
+					bw.write(value.getLengthOfMergeChain() + "\t" +
+							value.getMergeChain().toString());
+					
+					bw.newLine();
+				}
+		    }
+		    reader.close();
+		}
+		bw.close();
+	}
+	
+	public static void generateSpecificLengthChainFromNaivePathmergeResult(String input, String output, int maxLength) throws IOException{
+		BufferedWriter bw = new BufferedWriter(new FileWriter(new File(output + "/naive")));
+		Configuration conf = new Configuration();
+		FileSystem fileSys = FileSystem.get(conf);
+		for(int i = 0; i < nc; i++){
+			Path path = new Path(input + "/part-" + i);
+			SequenceFile.Reader reader = new SequenceFile.Reader(fileSys, path, conf);
+			KmerBytesWritable key = new KmerBytesWritable(kmerSize);
+		    ValueStateWritable value = new ValueStateWritable();
+		    
+		    while(reader.next(key, value)){
+				if (key == null || value == null){
+					break;
+				} 
+				if(value.getLengthOfMergeChain() != -1 && value.getLengthOfMergeChain() <= maxLength){
+					bw.write(value.getLengthOfMergeChain() + "\t" +
+							value.getMergeChain().toString());
+					bw.newLine();
+				}
+		    }
+		    reader.close();
+		}
+		bw.close();
+	}
+	
+	public static void generateSpecificLengthChainFromLogPathmergeResult(String input, String output, int maxLength) throws IOException{
+		BufferedWriter bw = new BufferedWriter(new FileWriter(new File(output + "/log")));
+		Configuration conf = new Configuration();
+		FileSystem fileSys = FileSystem.get(conf);
+		for(int i = 0; i < nc; i++){
+			Path path = new Path(input + "/part-" + i);
+			SequenceFile.Reader reader = new SequenceFile.Reader(fileSys, path, conf);
+			KmerBytesWritable key = new KmerBytesWritable(kmerSize);
+		    ValueStateWritable value = new ValueStateWritable();
+		    
+		    while(reader.next(key, value)){
+				if (key == null || value == null){
+					break;
+				} 
+				if(value.getLengthOfMergeChain() != -1 && value.getLengthOfMergeChain() <= maxLength
+						&& value.getState() == State.FINAL_VERTEX){
+					bw.write(value.getLengthOfMergeChain() + "\t" +
+							value.getMergeChain().toString());
+					bw.newLine();
+				}
+		    }
+		    reader.close();
+		}
+		bw.close();
+	}
+}