Add mergeInDir for kmers
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
index 17f1a11..7d1738e 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
@@ -25,6 +25,7 @@
import org.apache.hadoop.io.WritableComparator;
import edu.uci.ics.genomix.data.KmerUtil;
+import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
/**
* Variable kmer length byteswritable
@@ -503,6 +504,25 @@
appendOneByteAtPosition(preKmer.kmerlength - initialKmerSize + k - 4 + 1, cacheByte, bytes, offset, size);
clearLeadBit();
}
+
+ public void mergeWithKmerInDir(byte dir, int initialKmerSize, KmerBytesWritable kmer) {
+ switch(dir & DirectionFlag.DIR_MASK) {
+ case DirectionFlag.DIR_FF:
+ mergeWithFFKmer(initialKmerSize, kmer);
+ break;
+ case DirectionFlag.DIR_FR:
+ mergeWithFRKmer(initialKmerSize, kmer);
+ break;
+ case DirectionFlag.DIR_RF:
+ mergeWithRFKmer(initialKmerSize, kmer);
+ break;
+ case DirectionFlag.DIR_RR:
+ mergeWithRRKmer(initialKmerSize, kmer);
+ break;
+ default:
+ throw new RuntimeException("Direciotn not recognized: " + dir);
+ }
+ }
public static void appendOneByteAtPosition(int k, byte onebyte, byte[] buffer, int start, int length) {
int position = start + length - 1 - k / 4;
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 a7e8157..3ed0e4e 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
@@ -38,7 +38,8 @@
public static final byte EXTRA_FLAG = 1 << 6;
}
- public void setAsUpdateMessage(byte mergeDir, byte neighborDir, PositionWritable nodeToDelete, PositionWritable nodeToAdd) {
+ public void setAsUpdateMessage(byte mergeDir, byte neighborDir, PositionWritable nodeToDelete,
+ PositionWritable nodeToAdd) {
byte neighborToMeDir = mirrorDirection(neighborDir);
byte neighborToMergeDir = flipDirection(neighborToMeDir, mergeDir);
@@ -53,8 +54,6 @@
node.getListFromDir(neighborToMergeDir).append(nodeToAdd);
}
-
-
/*
* Returns the edge dir for B->A when the A->B edge is type @dir
*/
@@ -118,22 +117,7 @@
// remove position and merge its position lists with node
if (!updateNode.equals(NodeWritable.EMPTY_NODE)) {
// need to remove updateNode from the specified PositionList
- switch (updateFlag & MessageFlag.DIR_MASK) {
- case MessageFlag.DIR_FF:
- node.getFFList().remove(updateNode.getNodeID());
- break;
- case MessageFlag.DIR_FR:
- node.getFRList().remove(updateNode.getNodeID());
- break;
- case MessageFlag.DIR_RF:
- node.getRFList().remove(updateNode.getNodeID());
- break;
- case MessageFlag.DIR_RR:
- node.getRRList().remove(updateNode.getNodeID());
- break;
- default:
- throw new IOException("Unrecognized direction in updateFlag: " + updateFlag);
- }
+ node.getListFromDir(updateFlag).remove(updateNode.getNodeID());
}
// now merge positionlists from update and node
node.getFFList().appendList(updateNode.getFFList());
@@ -142,13 +126,16 @@
node.getRRList().appendList(updateNode.getRRList());
} else if ((updateFlag & MessageFlag.MSG_UPDATE_MERGE) == MessageFlag.MSG_UPDATE_MERGE) {
// this message wants to merge node with updateNode.
- // the direction flag indicates how the merge should take place.
- // TODO send update or remove edge that I merge with
+ // the direction flag indicates node's relationship with updateNode
+ node.getListFromDir(updateFlag).remove(updateNode.getNodeID()); // remove the node from my edges
+ node.getKmer().mergeWithKmerInDir(updateFlag, kmerSize, updateNode.getKmer()); // merge with its kmer
+
+ // merge my edges with the incoming node's edges, accounting for if the node flipped in
+ // the merge and if it's my predecessor or successor
switch (updateFlag & MessageFlag.DIR_MASK) {
case MessageFlag.DIR_FF:
- node.getKmer().mergeWithFFKmer(kmerSize, updateNode.getKmer());
node.getFFList().set(updateNode.getFFList());
- // TODO not just FF list here-- FR as well
+ node.getFRList().set(updateNode.getFRList());
break;
case MessageFlag.DIR_FR:
// FIXME not sure if this should be reverse-complement or just reverse...