Fix nodewritable merge logic
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/pmcommon/NodeWithFlagWritable.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/pmcommon/NodeWithFlagWritable.java
index 3ed0e4e..6729c78 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/pmcommon/NodeWithFlagWritable.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/pmcommon/NodeWithFlagWritable.java
@@ -57,7 +57,7 @@
     /*
      * Returns the edge dir for B->A when the A->B edge is type @dir
      */
-    public byte mirrorDirection(byte dir) {
+    public static byte mirrorDirection(byte dir) {
         switch (dir) {
             case MessageFlag.DIR_FF:
                 return MessageFlag.DIR_RR;
@@ -76,7 +76,7 @@
      * When A->B edge type is @neighborDir and B will merge towards C along a @mergeDir edge, 
      * returns the new edge type for A->C
      */
-    public byte flipDirection(byte neighborDir, byte mergeDir) {
+    public static byte flipDirection(byte neighborDir, byte mergeDir) {
         switch (mergeDir) {
 
             case MessageFlag.DIR_FF:
@@ -134,20 +134,32 @@
             // the merge and if it's my predecessor or successor
             switch (updateFlag & MessageFlag.DIR_MASK) {
                 case MessageFlag.DIR_FF:
+                    // node merging with me is FF to me
                     node.getFFList().set(updateNode.getFFList());
                     node.getFRList().set(updateNode.getFRList());
+                    // update isn't allowed to have any other successors (mirror & flip)
+                    if (updateNode.getRFList().getCountOfPosition() > 0)
+                        throw new IOException("Invalid merge detected!  Node: " + node + " merging towards " + updateNode + "along" + (updateFlag & MessageFlag.DIR_MASK));
                     break;
                 case MessageFlag.DIR_FR:
-                    // FIXME not sure if this should be reverse-complement or just reverse...
-                    node.getKmer().mergeWithFFKmer(kmerSize, updateNode.getKmer());
-                    node.getFRList().set(updateNode.getFRList());
+                    // flip edges
+                    node.getFFList().set(updateNode.getRFList());
+                    node.getFRList().set(updateNode.getRRList());
+                    if (updateNode.getFFList().getCountOfPosition() > 0)
+                        throw new IOException("Invalid merge detected!  Node: " + node + " merging towards " + updateNode + "along" + (updateFlag & MessageFlag.DIR_MASK));
                     break;
                 case MessageFlag.DIR_RF:
-
+                    // flip edges
+                    node.getRFList().set(updateNode.getFFList());
+                    node.getRRList().set(updateNode.getFRList());
+                    if (updateNode.getRRList().getCountOfPosition() > 0)
+                        throw new IOException("Invalid merge detected!  Node: " + node + " merging towards " + updateNode + "along" + (updateFlag & MessageFlag.DIR_MASK));
                     break;
                 case MessageFlag.DIR_RR:
-                    node.getKmer().mergeWithRRKmer(kmerSize, updateNode.getKmer());
+                    node.getRFList().set(updateNode.getRFList());
                     node.getRRList().set(updateNode.getRRList());
+                    if (updateNode.getFRList().getCountOfPosition() > 0)
+                        throw new IOException("Invalid merge detected!  Node: " + node + " merging towards " + updateNode + "along" + (updateFlag & MessageFlag.DIR_MASK));
                     break;
                 default:
                     throw new IOException("Unrecognized direction in updateFlag: " + updateFlag);