diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/kmer/KmerNode2D.java @ 68:5028fdace37b

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 16:23:26 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/kmer/KmerNode2D.java	Tue Mar 18 16:23:26 2025 -0400
@@ -0,0 +1,304 @@
+package kmer;
+
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicLong;
+
+import fileIO.ByteStreamWriter;
+import shared.KillSwitch;
+import shared.Shared;
+import shared.Tools;
+import structures.ByteBuilder;
+
+/**
+ * Allows multiple values per kmer.
+ * @author Brian Bushnell
+ * @date Nov 7, 2014
+ *
+ */
+public class KmerNode2D extends KmerNode {
+	
+	/*--------------------------------------------------------------*/
+	/*----------------        Initialization        ----------------*/
+	/*--------------------------------------------------------------*/
+
+	public KmerNode2D(long pivot_){
+		super(pivot_);
+	}
+	
+	public KmerNode2D(long pivot_, int value_){
+		super(pivot_);
+		assert(value_>=0 || value_==-1);
+		values=new int[] {value_, -1};
+		numValues=1;
+	}
+	
+	public KmerNode2D(long pivot_, int[] vals_, int vlen){
+		super(pivot_);
+		values=vals_;
+		numValues=vlen;
+		assert(values!=null || vlen==0);
+		assert(values==null || (vlen<=values.length && vlen>=0));
+//		assert(countValues(values)==vlen) : countValues(values)+", "+vlen; //TODO: Slow assertion //123
+	}
+	
+	@Override
+	public final KmerNode makeNode(long pivot_, int value_){
+		return new KmerNode2D(pivot_, value_);
+	}
+	
+	@Override
+	public final KmerNode makeNode(long pivot_, int[] values_, int vlen){
+		return new KmerNode2D(pivot_, values_, vlen);
+	}
+	
+	/*--------------------------------------------------------------*/
+	/*----------------        Public Methods        ----------------*/
+	/*--------------------------------------------------------------*/
+	
+//	public final int set_Test(final long kmer, final int v[]){
+//		assert(TESTMODE);
+//		final int x;
+//		if(TWOD()){
+//			int[] old=getValues(kmer, null);
+//			assert(old==null || contains(kmer, old));
+//			x=set0(kmer, v);
+//			assert(old==null || contains(kmer, old));
+//			assert(contains(kmer, v));
+//		}else{
+//			int old=getValue(kmer);
+//			assert(old==0 || old==-1 || contains(kmer, old));
+//			x=set0(kmer, v);
+//			assert(contains(kmer, v)) : "old="+old+", v="+v+", kmer="+kmer+", get(kmer)="+getValue(kmer);
+//			assert(v[0]==old || !contains(kmer, old));
+//		}
+//		return x;
+//	}
+	
+	/** Returns number of nodes added */
+	@Override
+	public int set(long kmer, int vals[], int vlen){
+		if(pivot<0){pivot=kmer; insertValue(vals, vlen); return 1;} //Allows initializing empty nodes to -1
+		if(kmer<pivot){
+			if(left==null){left=new KmerNode2D(kmer, vals, vlen); return 1;}
+			return left.set(kmer, vals, vlen);
+		}else if(kmer>pivot){
+			if(right==null){right=new KmerNode2D(kmer, vals, vlen); return 1;}
+			return right.set(kmer, vals, vlen);
+		}else{
+			insertValue(vals, vlen);
+		}
+		return 0;
+	}
+	
+	/*--------------------------------------------------------------*/
+	/*----------------      Nonpublic Methods       ----------------*/
+	/*--------------------------------------------------------------*/
+	
+	@Override
+	protected int value(){return values==null ? 0 : values[0];}
+	
+	@Override
+	protected int[] values(int[] singleton){
+		return values;
+	}
+	
+	@Override
+	public int set(int value_){
+		insertValue(value_);
+		return value_;
+	}
+	
+	@Override
+	protected int set(int[] values_, int vlen){
+		int ret=(values==null ? 1 : 0);
+		insertValue(values_, vlen);
+		return ret;
+	}
+	
+	@Override
+	int numValues(){
+//		assert(countValues(values)==numValues) : countValues(values)+", "+numValues; //TODO: Slow assertion //123
+		return numValues;
+//		asdf
+//		if(values==null){return 0;}
+//		for(int i=0; i<values.length; i++){
+//			if(values[i]==-1){return i;}
+//		}
+//		return values.length;
+	}
+	
+	/*--------------------------------------------------------------*/
+	/*----------------       Private Methods        ----------------*/
+	/*--------------------------------------------------------------*/
+	
+	/** Returns number of values added */
+	private int insertValue(int v){
+		return insertIntoList(v);
+	}
+	
+	/** Returns number of values added */
+	private int insertValue(int[] vals, int vlen){
+//		assert(countValues(vals)==vlen) : countValues(vals)+", "+vlen; //TODO: Slow assertion //123
+		assert(vals!=null || vlen==0);
+		assert(vals==null || (vlen<=vals.length && vlen>=0));
+		if(values==null){
+			values=vals;
+			numValues=vlen;
+			return 1;
+		}
+		for(int v : vals){
+			if(v<0){break;}
+			insertIntoList(v);
+		}
+		return 0;
+	}
+	
+	private final int countValues(int[] vals){
+		if(vals==null) {return 0;}
+		int count=0;
+		for(int v : vals){
+			if(v>=0){
+				count++;
+			}else{
+				break;
+			}
+		}
+		return count;
+	}
+	
+	private final int insertIntoList(final int v){
+//		assert(countValues(values)==numValues) : countValues(values)+", "+numValues; //TODO: Slow assertion //123
+		assert(v>=0);
+		
+		if(values==null){
+			values=new int[] {v, -1};
+			numValues=1;
+			return 1;
+		}
+		
+		for(int i=numValues-1, lim=Tools.max(0, numValues-slowAddLimit); i>=lim; i--){//This is the slow bit
+			if(values[i]==v){return 0;}
+			if(values[i]<0){
+				values[i]=v;
+				numValues++;
+				return 1;
+			}
+		}
+		//At this point the size is big, or the element was not found
+		
+		if(numValues>=values.length){//resize
+			assert(numValues==values.length);
+			final int oldSize=values.length;
+			final int newSize=(int)Tools.min(Shared.MAX_ARRAY_LEN, oldSize*2L);
+			assert(newSize>values.length) : "Overflow.";
+			values=KillSwitch.copyOf(values, newSize);
+			Arrays.fill(values, oldSize, newSize, -1);
+		}
+		
+		//quick add
+		assert(values[numValues]<0);
+		values[numValues]=v;
+		numValues++;
+
+//		assert(countValues(values)==numValues) : countValues(values)+", "+numValues; //TODO: Slow assertion //123
+		return 1;
+	}
+	
+	/*--------------------------------------------------------------*/
+	/*----------------   Resizing and Rebalancing   ----------------*/
+	/*--------------------------------------------------------------*/
+	
+	@Override
+	boolean canResize() {
+		return false;
+	}
+	
+	@Override
+	public boolean canRebalance() {
+		return true;
+	}
+
+	@Deprecated
+	@Override
+	public int arrayLength() {
+		throw new RuntimeException("Unsupported.");
+	}
+
+	@Deprecated
+	@Override
+	void resize() {
+		throw new RuntimeException("Unsupported.");
+	}
+
+	@Deprecated
+	@Override
+	public void rebalance() {
+		throw new RuntimeException("Please call rebalance(ArrayList<KmerNode>) instead, with an empty list.");
+	}
+	
+	/*--------------------------------------------------------------*/
+	/*----------------         Info Dumping         ----------------*/
+	/*--------------------------------------------------------------*/
+	
+	@Override
+	public final boolean dumpKmersAsBytes(ByteStreamWriter bsw, int k, int mincount, int maxcount, AtomicLong remaining){
+		if(values==null){return true;}
+		if(remaining!=null && remaining.decrementAndGet()<0){return true;}
+		bsw.printlnKmer(pivot, values, k);
+		if(left!=null){left.dumpKmersAsBytes(bsw, k, mincount, maxcount, remaining);}
+		if(right!=null){right.dumpKmersAsBytes(bsw, k, mincount, maxcount, remaining);}
+		return true;
+	}
+	
+	@Override
+	public final boolean dumpKmersAsBytes_MT(final ByteStreamWriter bsw, final ByteBuilder bb, final int k, final int mincount, int maxcount, AtomicLong remaining){
+		if(values==null){return true;}
+		if(remaining!=null && remaining.decrementAndGet()<0){return true;}
+		toBytes(pivot, values, k, bb);
+		bb.nl();
+		if(bb.length()>=16000){
+			ByteBuilder bb2=new ByteBuilder(bb);
+			synchronized(bsw){bsw.addJob(bb2);}
+			bb.clear();
+		}
+		if(left!=null){left.dumpKmersAsBytes_MT(bsw, bb, k, mincount, maxcount, remaining);}
+		if(right!=null){right.dumpKmersAsBytes_MT(bsw, bb, k, mincount, maxcount, remaining);}
+		return true;
+	}
+	
+	@Override
+	protected final StringBuilder dumpKmersAsText(StringBuilder sb, int k, int mincount, int maxcount){
+		if(values==null){return sb;}
+		if(sb==null){sb=new StringBuilder(32);}
+		sb.append(AbstractKmerTable.toText(pivot, values, k)).append('\n');
+		if(left!=null){left.dumpKmersAsText(sb, k, mincount, maxcount);}
+		if(right!=null){right.dumpKmersAsText(sb, k, mincount, maxcount);}
+		return sb;
+	}
+	
+	@Override
+	protected final ByteBuilder dumpKmersAsText(ByteBuilder bb, int k, int mincount, int maxcount){
+		if(values==null){return bb;}
+		if(bb==null){bb=new ByteBuilder(32);}
+		bb.append(AbstractKmerTable.toBytes(pivot, values, k)).append('\n');
+		if(left!=null){left.dumpKmersAsText(bb, k, mincount, maxcount);}
+		if(right!=null){right.dumpKmersAsText(bb, k, mincount, maxcount);}
+		return bb;
+	}
+	
+	@Override
+	final boolean TWOD(){return true;}
+	
+	/*--------------------------------------------------------------*/
+	/*----------------       Invalid Methods        ----------------*/
+	/*--------------------------------------------------------------*/
+	
+	/*--------------------------------------------------------------*/
+	/*----------------            Fields            ----------------*/
+	/*--------------------------------------------------------------*/
+	
+	int[] values;
+	private int numValues;
+	private static final int slowAddLimit=4;
+	
+}