Move extra logic(check if it is a valid head) to inside of the function
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java
index b8870a0..e329289 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java
@@ -58,11 +58,11 @@
     protected VKmerBytesWritable repeatKmer = null; //for detect tandemRepeat
     protected byte repeatDir; //for detect tandemRepeat
     protected VKmerBytesWritable tmpKmer = null;
-    protected byte headFlag;
+//    protected byte headFlag;
     protected byte outFlag;
     protected byte inFlag;
     protected byte selfFlag;
-    protected byte headMergeDir;
+//    protected byte headMergeDir;
     
     protected EdgeListWritable incomingEdgeList = null; //SplitRepeat
     protected EdgeListWritable outgoingEdgeList = null; //SplitRepeat
@@ -81,12 +81,12 @@
         GenomixJobConf.setGlobalStaticConstants(getContext().getConfiguration());
     }
     
-    /**
-     * reset headFlag
-     */
-    public void resetHeadFlag(){
-        headFlag = (byte)(getVertexValue().getState() & State.IS_HEAD);
-    }
+//    /**
+//     * reset headFlag
+//     */
+//    public void resetHeadFlag(){
+//        headFlag = (byte)(getVertexValue().getState() & State.IS_HEAD);
+//    }
     
     //TODO make it correct
     public byte getHeadFlag(){
@@ -587,7 +587,7 @@
      */
     public void setStateAsNoMerge(){
     	byte state = getVertexValue().getState();
-    	//state |= State.SHOULD_MERGE_CLEAR;
+    	state &= State.SHOULD_MERGE_CLEAR;
         state |= State.NO_MERGE;
         getVertexValue().setState(state);
         activate();  //could we be more careful about activate?
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java
index 98269a4..c64edf3 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java
@@ -352,9 +352,9 @@
      * send merge message to neighber for P4
      */
     public void broadcastMergeMsg(boolean deleteSelf){
-        if(headFlag > 0){
+        if(isHeadNode()){
             outFlag |= MessageFlag.IS_HEAD;
-            outFlag |= headMergeDir;
+            outFlag |= getHeadMergeDir();
         }
         switch(getVertexValue().getState() & State.SHOULD_MERGE_MASK) {
             case State.SHOULD_MERGEWITHNEXT:
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
index 56fd837..5629295 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
@@ -65,8 +65,7 @@
         outFlag = (byte)0;
         inFlag = (byte)0;
         // Node may be marked as head b/c it's a real head or a real tail
-        headFlag = getHeadFlag(); // TODO be a boolean?
-        headMergeDir = getHeadMergeDir();
+//        headFlag = getHeadFlag(); // TODO be a boolean?
         if(repeatKmer == null)
             repeatKmer = new VKmerBytesWritable();
         tmpValue.reset();
@@ -90,6 +89,8 @@
      * set nextKmer to the element that's next (in the node's FF or FR list), returning true when there is a next neighbor
      */
     protected boolean setNextInfo(VertexValueWritable value) {
+        if((!isHeadNode() || (isHeadNode() && getHeadMergeDir() == MessageFlag.HEAD_SHOULD_MERGEWITHNEXT)))
+            return false;
     	// TODO make sure the degree is correct
         for(byte dir : OutgoingListFlag.values){
             if(value.getEdgeList(dir).getCountOfPosition() > 0){
@@ -105,6 +106,8 @@
      * set prevKmer to the element that's previous (in the node's RR or RF list), returning true when there is a previous neighbor
      */
     protected boolean setPrevInfo(VertexValueWritable value) {
+        if((!isHeadNode() || (isHeadNode() && getHeadMergeDir() == MessageFlag.HEAD_SHOULD_MERGEWITHPREV)))
+            return false;
         for(byte dir : IncomingListFlag.values){
             if(value.getEdgeList(dir).getCountOfPosition() > 0){
                 prevKmer = value.getEdgeList(dir).get(0).getKey(); 
@@ -124,19 +127,19 @@
         else if (getSuperstep() == 2)
             initState(msgIterator);
         else if (getSuperstep() % 4 == 3){
-            outFlag |= headFlag; // TODO are these necessary?
-            outFlag |= State.NO_MERGE;
+//            outFlag |= headFlag; // TODO are these necessary?
+//            outFlag |= State.NO_MERGE;
             setStateAsNoMerge();
             
             // only PATH vertices are present. Find the ID's for my neighbors
-            curKmer = getVertexId();  // TODO make a reference
+            curKmer = getVertexId();
             
             curHead = isNodeRandomHead(curKmer);
             
             // the headFlag and tailFlag's indicate if the node is at the beginning or end of a simple path. 
             // We prevent merging towards non-path nodes
-            hasNext = setNextInfo(getVertexValue()) && (headFlag == 0 || (headFlag > 0 && headMergeDir == MessageFlag.HEAD_SHOULD_MERGEWITHNEXT)); // TODO HEAD CAN MERGE // TODO headFlag compare not equals, not == 0
-            hasPrev = setPrevInfo(getVertexValue()) && (headFlag == 0 || (headFlag > 0 && headMergeDir == MessageFlag.HEAD_SHOULD_MERGEWITHPREV)); // TODO this extra logic should go inside the function
+            hasNext = setNextInfo(getVertexValue()); // TODO HEAD CAN MERGE // TODO headFlag compare not equals, not == 0
+            hasPrev = setPrevInfo(getVertexValue()); // TODO this extra logic should go inside the function
             if (hasNext || hasPrev) {
                 if (curHead) {
                     if (hasNext && !nextHead) {