Mercurial > repos > rliterman > csp2
diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/kmer/KmerNode.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/KmerNode.java Tue Mar 18 16:23:26 2025 -0400 @@ -0,0 +1,383 @@ +package kmer; + +import java.util.ArrayList; +import java.util.Arrays; + +import fileIO.TextStreamWriter; +import shared.Tools; +import structures.ByteBuilder; +import structures.SuperLongList; + +/** + * @author Brian Bushnell + * @date Oct 22, 2013 + * + */ +public abstract class KmerNode extends AbstractKmerTable { + + /*--------------------------------------------------------------*/ + /*---------------- Initialization ----------------*/ + /*--------------------------------------------------------------*/ + + protected KmerNode(long pivot_){ + pivot=pivot_; + } + + public abstract KmerNode makeNode(long pivot_, int value_); + public abstract KmerNode makeNode(long pivot_, int[] values_, int vlen_); + + /*--------------------------------------------------------------*/ + /*---------------- Public Methods ----------------*/ + /*--------------------------------------------------------------*/ + + @Override + public final int increment(final long kmer, final int incr){ + if(pivot<0){pivot=kmer; return set(incr);} //Allows initializing empty nodes to -1 + if(kmer<pivot){ + if(left==null){left=makeNode(kmer, incr); return incr;} + return left.increment(kmer, incr); + }else if(kmer>pivot){ + if(right==null){right=makeNode(kmer, incr); return incr;} + return right.increment(kmer, incr); + }else{ + if(value()<Integer.MAX_VALUE){set(value()+incr);} + return value(); + } + } + + @Override + public final int incrementAndReturnNumCreated(final long kmer, final int incr) { + int x=increment(kmer, incr); + return x==1 ? 1 : 0; + } + +// 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==old || !contains(kmer, old)); +// } +// return x; +// } +// +// public final int setIfNotPresent_Test(long kmer, int v){ +// assert(TESTMODE); +// final int x; +// if(TWOD()){ +//// int[] vals=getValues(kmer, null); +//// assert(vals==null || contains(kmer, vals)); +//// x=setIfNotPresent(kmer, v); +//// assert(contains(kmer, vals)); +//// assert(contains(kmer, v)); +// x=0; +// assert(false); +// }else{ +// int old=getValue(kmer); +// assert(old==0 || old==-1 || contains(kmer, old)); +// x=setIfNotPresent0(kmer, v); +// assert((old<1 && contains(kmer, v)) || (old>0 && contains(kmer, old))) : kmer+", "+old+", "+v; +// } +// return x; +// } + + + /** Returns number of nodes added */ + @Override + public final int set(long kmer, int value){ + if(verbose){System.err.println("Set0: kmer="+kmer+", v="+value+", old="+Arrays.toString(values(new int[1])));} + if(pivot<0){pivot=kmer; set(value); return 1;} //Allows initializing empty nodes to -1 + if(verbose){System.err.println("A");} + if(kmer<pivot){ + if(verbose){System.err.println("B");} + if(left==null){left=makeNode(kmer, value); return 1;} + if(verbose){System.err.println("C");} + return left.set(kmer, value); + }else if(kmer>pivot){ + if(verbose){System.err.println("D");} + if(right==null){right=makeNode(kmer, value); return 1;} + if(verbose){System.err.println("E");} + return right.set(kmer, value); + }else{ + if(verbose){System.err.println("F");} + set(value); + } + if(verbose){System.err.println("G");} + return 0; + } + + + /** Returns number of nodes added */ + @Override + public final int setIfNotPresent(long kmer, int value){ + if(verbose){System.err.println("setIfNotPresent0: kmer="+kmer+", v="+value+", old="+Arrays.toString(values(new int[0])));} + if(pivot<0){pivot=kmer; set(value); return 1;} //Allows initializing empty nodes to -1 + if(kmer<pivot){ + if(left==null){left=makeNode(kmer, value); return 1;} + return left.setIfNotPresent(kmer, value); + }else if(kmer>pivot){ + if(right==null){right=makeNode(kmer, value); return 1;} + return right.setIfNotPresent(kmer, value); + } + return 0; + } + + @Override + public final int getValue(long kmer){ + KmerNode n=get(kmer); + return n==null ? -1 : n.value(); + } + + @Override + public final int[] getValues(long kmer, int[] singleton){ + KmerNode n=get(kmer); + return n==null ? null : n.values(singleton); + } + + @Override + public final boolean contains(long kmer){ + KmerNode node=get(kmer); + return node!=null; + } + + /*--------------------------------------------------------------*/ + /*---------------- Nonpublic Methods ----------------*/ + /*--------------------------------------------------------------*/ + + public KmerNode left(){return left;} + public KmerNode right(){return right;} + public long pivot(){return pivot;} + public int owner(){return owner;} + + public int count(){return value();} + protected abstract int value(); + protected abstract int[] values(int[] singleton); + /** Returns new value */ + public abstract int set(int value_); + protected abstract int set(int[] values_, int vlen); + + @Override + final KmerNode get(long kmer){ +// if(kmer<pivot){ +// return left==null ? null : left.get(kmer); +// }else if(kmer>pivot){ +// return right==null ? null : right.get(kmer); +// }else{ +// return this; +// } + KmerNode n=this; + while(n!=null && n.pivot!=kmer){ + n=(kmer<n.pivot ? n.left : n.right); + } + return n; + } + + final KmerNode getNodeOrParent(long kmer){ + if(pivot==kmer || pivot<0){return this;} + if(kmer<pivot){return left==null ? this : left.getNodeOrParent(kmer);} + return right==null ? this : right.getNodeOrParent(kmer); + } + + final boolean insert(KmerNode n){ + assert(pivot!=-1); + if(n.pivot<pivot){ + if(left==null){left=n; return true;} + return left.insert(n); + }else if(n.pivot>pivot){ + if(right==null){right=n; return true;} + return right.insert(n); + }else{ + return false; + } + } + + final void traversePrefix(ArrayList<KmerNode> list){ + if(left!=null){left.traversePrefix(list);} + list.add(this); + if(right!=null){right.traversePrefix(list);} + } + + final void traverseInfix(ArrayList<KmerNode> list){ + list.add(this); + if(left!=null){left.traverseInfix(list);} + if(right!=null){right.traverseInfix(list);} + } + + /*--------------------------------------------------------------*/ + /*---------------- Private Methods ----------------*/ + /*--------------------------------------------------------------*/ + + /*--------------------------------------------------------------*/ + /*---------------- Resizing and Rebalancing ----------------*/ + /*--------------------------------------------------------------*/ + + @Override + public final long size() { + if(value()<1){return 0;} + long size=1; + if(left!=null){size+=left.size();} + if(right!=null){size+=right.size();} + return size; + } + + final KmerNode rebalance(ArrayList<KmerNode> list){ + assert(list.isEmpty()); + traversePrefix(list); + KmerNode n=this; + if(list.size()>2){ + n=rebalance(list, 0, list.size()-1); + } + list.clear(); + return n; + } + + private static final KmerNode rebalance(ArrayList<KmerNode> list, int a, int b){ + final int size=b-a+1; + final int middle=a+size/2; + final KmerNode n=list.get(middle); + if(size<4){ + if(size==1){ + n.left=n.right=null; + }else if(size==2){ + KmerNode n1=list.get(a); + n.left=n1; + n.right=null; + n1.left=n1.right=null; + }else{ + assert(size==3); + KmerNode n1=list.get(a), n2=list.get(b); + n.left=n1; + n.right=n2; + n1.left=n1.right=null; + n2.left=n2.right=null; + } + }else{ + n.left=rebalance(list, a, middle-1); + n.right=rebalance(list, middle+1, b); + } + return n; + } + + @Override + public long regenerate(final int limit){ + throw new RuntimeException("Not supported."); + } + + /*--------------------------------------------------------------*/ + /*---------------- Info Dumping ----------------*/ + /*--------------------------------------------------------------*/ + + @Override + public final boolean dumpKmersAsText(TextStreamWriter tsw, int k, int mincount, int maxcount) { + tsw.print(dumpKmersAsText(new StringBuilder(32), k, mincount, maxcount)); + return true; + } + + protected abstract StringBuilder dumpKmersAsText(StringBuilder sb, int k, int mincount, int maxcount); + + protected abstract ByteBuilder dumpKmersAsText(ByteBuilder bb, int k, int mincount, int maxcount); + + @Override + public final void fillHistogram(long[] ca, int max){ + final int value=value(); + if(value<1){return;} + ca[Tools.min(value, max)]++; + if(left!=null){left.fillHistogram(ca, max);} + if(right!=null){right.fillHistogram(ca, max);} + } + + @Override + public final void fillHistogram(SuperLongList sll){ + final int value=value(); + if(value<1){return;} + sll.add(value); + if(left!=null){left.fillHistogram(sll);} + if(right!=null){right.fillHistogram(sll);} + } + + @Override + public void countGC(long[] gcCounts, int max){ + final int value=value(); + if(value<1){return;} + gcCounts[Tools.min(value, max)]+=gc(pivot); + if(left!=null){left.countGC(gcCounts, max);} + if(right!=null){right.countGC(gcCounts, max);} + } + + abstract boolean TWOD(); + abstract int numValues(); + + /*--------------------------------------------------------------*/ + /*---------------- Ownership ----------------*/ + /*--------------------------------------------------------------*/ + + @Override + public final void initializeOwnership(){ + owner=-1; + if(left!=null){left.initializeOwnership();} + if(right!=null){right.initializeOwnership();} + } + + @Override + public final void clearOwnership(){initializeOwnership();} + + @Override + public final int setOwner(final long kmer, final int newOwner){ + KmerNode n=get(kmer); + assert(n!=null); + if(n.owner<=newOwner){ + synchronized(n){ + if(n.owner<newOwner){ + n.owner=newOwner; + } + } + } + return n.owner; + } + + @Override + public final boolean clearOwner(final long kmer, final int owner){ + KmerNode n=get(kmer); + assert(n!=null); + synchronized(n){ + if(n.owner==owner){ + n.owner=-1; + return true; + } + } + return false; + } + + @Override + public final int getOwner(final long kmer){ + KmerNode n=get(kmer); + assert(n!=null); + return n.owner; + } + + public long calcMem() {//48 is a guess + return 48+(left==null ? 0 : left.calcMem())+(right==null ? 0 : right.calcMem()); + } + + /*--------------------------------------------------------------*/ + /*---------------- Invalid Methods ----------------*/ + /*--------------------------------------------------------------*/ + + /*--------------------------------------------------------------*/ + /*---------------- Fields ----------------*/ + /*--------------------------------------------------------------*/ + + long pivot; + int owner=-1; + KmerNode left, right; + +}