Mercurial > repos > rliterman > csp2
diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/kmer/HashArray2D.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/HashArray2D.java Tue Mar 18 16:23:26 2025 -0400 @@ -0,0 +1,239 @@ +package kmer; + +import java.util.ArrayList; +import java.util.Arrays; + +import shared.KillSwitch; +import shared.Primes; +import shared.Shared; +import shared.Tools; + +/** + * Stores kmers in a long[] and values in an int[][], with a victim cache. + * @author Brian Bushnell + * @date Nov 7, 2014 + * + */ +public final class HashArray2D extends HashArray { + + /*--------------------------------------------------------------*/ + /*---------------- Initialization ----------------*/ + /*--------------------------------------------------------------*/ + + public HashArray2D(int[] schedule_, long coreMask_){ + super(schedule_, coreMask_, true); + values=allocInt2D(prime+extra); + } + +// public HashArray2D(int initialSize, int maxSize, long mask, boolean autoResize_){ +// super(initialSize, maxSize, mask, autoResize_, true); +// values=allocInt2D(prime+extra); +// } + + /*--------------------------------------------------------------*/ + /*---------------- Public Methods ----------------*/ + /*--------------------------------------------------------------*/ + + @Deprecated + @Override + public int increment(final long kmer, final int incr){ + throw new RuntimeException("Unsupported."); + } + + @Deprecated + @Override + public int incrementAndReturnNumCreated(final long kmer, final int incr){ + throw new RuntimeException("Unsupported."); + } + + /*--------------------------------------------------------------*/ + /*---------------- Nonpublic Methods ----------------*/ + /*--------------------------------------------------------------*/ + + @Override + protected final int readCellValue(int cell) { + int[] set=values[cell]; + return set==null ? 0 : set[0]; + } + + @Override + protected final int[] readCellValues(int cell, int[] singleton) { + return values[cell]; + } + + /** Returns number of values added */ + @Override + protected final void insertValue(final long kmer, final int v, final int cell){ + assert(array[cell]==kmer); + if(values[cell]==null){ + values[cell]=new int[] {v, NOT_PRESENT}; + return; + } + int[] set=values[cell]; + assert(set!=null); + + for(int i=0; i<set.length; i++){ + if(set[i]==v){return;} + else if(set[i]<0){set[i]=v;return;} + } + final int oldSize=set.length; + final int newSize=(int)Tools.min(Shared.MAX_ARRAY_LEN, oldSize*2L); + assert(newSize>set.length) : "Overflow."; + set=KillSwitch.copyOf(set, newSize); + set[oldSize]=v; + Arrays.fill(set, oldSize+1, newSize, NOT_PRESENT); + values[cell]=set; + } + + /** Returns number of values added */ + @Override + protected final void insertValue(final long kmer, final int[] vals, final int cell, final int vlen){ + assert(array[cell]==kmer); + if(values[cell]==null){ + values[cell]=vals; + }else{ + for(int v : vals){ + if(v<0){break;} + insertValue(kmer, v, cell); + } + } + } + + /*--------------------------------------------------------------*/ + /*---------------- Resizing and Rebalancing ----------------*/ + /*--------------------------------------------------------------*/ + + @Override + public final boolean canRebalance() {return false;} + + @Override + protected synchronized void resize(){ +// assert(false); +// System.err.println("Resizing from "+prime+"; load="+(size*1f/prime)); + if(prime>=maxPrime){ +// sizeLimit=0xFFFFFFFFFFFFL; +// return; + KillSwitch.memKill(new OutOfMemoryError()); + } + + final long oldSize=size, oldVSize=victims.size; + if(schedule!=null){ + final long oldPrime=prime; + prime=nextScheduleSize(); + if(prime<=oldPrime){KillSwitch.memKill(new OutOfMemoryError());} + sizeLimit=(long)((atMaxSize() ? maxLoadFactorFinal : maxLoadFactor)*prime); + }else{//Old method + final long totalSize=oldSize+oldVSize; + + final long maxAllowedByLoadFactor=(long)(totalSize*minLoadMult); + final long minAllowedByLoadFactor=(long)(totalSize*maxLoadMult); + + // sizeLimit=Tools.min((long)(maxLoadFactor*prime), maxPrime); + + assert(maxAllowedByLoadFactor>=minAllowedByLoadFactor); + if(maxAllowedByLoadFactor<prime){ + sizeLimit=(long)(maxLoadFactor*prime); + return; + } + + long x=10+(long)(prime*resizeMult); + x=Tools.max(x, minAllowedByLoadFactor); + x=Tools.min(x, maxAllowedByLoadFactor); + + int prime2=(int)Tools.min(maxPrime, Primes.primeAtLeast(x)); + + if(prime2<=prime){ + sizeLimit=(long)(maxLoadFactor*prime); + assert(prime2==prime) : "Resizing to smaller array? "+totalSize+", "+prime+", "+x; + return; + } + // System.err.println("Resizing from "+prime+" to "+prime2+"; size="+size); + + prime=prime2; + sizeLimit=(long)(maxLoadFactor*prime); + } + +// System.err.println("Resized to "+prime+"; load="+(size*1f/prime)); + long[] oldk=array; + int[][] oldc=values; + KmerNode[] oldv=victims.array; + array=allocLong1D(prime+extra); + Arrays.fill(array, NOT_PRESENT); + values=allocInt2D(prime+extra); + ArrayList<KmerNode> list=new ArrayList<KmerNode>((int)(victims.size)); //Can fail if more than Integer.MAX_VALUE + for(int i=0; i<oldv.length; i++){ + if(oldv[i]!=null){oldv[i].traverseInfix(list);} + } + Arrays.fill(oldv, null); + victims.size=0; + size=0; + + final int[] singleton=new int[] {NOT_PRESENT}; + + for(int i=0; i<oldk.length; i++){ + if(oldk[i]>NOT_PRESENT){ +// assert(!contains(oldk[i])); + set(oldk[i], oldc[i], -1); +// assert(contains(oldk[i])); +// assert(Tools.equals(getValues(oldk[i], singleton), oldc[i])); + } + } + + for(KmerNode n : list){ + if(n.pivot>NOT_PRESENT){ +// assert(!contains(n.pivot)); + set(n.pivot, n.values(singleton), n.numValues()); +// assert(contains(n.pivot)); +// assert(Tools.equals(getValues(n.pivot, singleton), n.values(singleton))); + } + } + + assert(oldSize+oldVSize==size+victims.size) : oldSize+", "+oldVSize+" -> "+size+", "+victims.size; + } + + @Deprecated + @Override + public void rebalance(){ + throw new RuntimeException("Unimplemented."); + } + + @Deprecated + @Override + public long regenerate(final int limit){ + assert(false) : "This is not tested or intended for use."; + long sum=0; + assert(owners==null) : "Clear ownership before regeneration."; + for(int pos=0; pos<values.length; pos++){ + final long key=array[pos]; + if(key>=0){ + final int[] value=values[pos]; + values[pos]=null; + array[pos]=NOT_PRESENT; + size--; + if(value!=null){ + assert(value[0]>0); + set(key, value, -1); + }else{ + sum++; + } + } + } + + ArrayList<KmerNode> nodes=victims.toList(); + victims.clear(); + for(KmerNode node : nodes){ + set(node.pivot, node.values(null), node.numValues());//TODO: Probably unsafe or unwise. Should test for singletons, etc. + } + + return sum; + } + + /*--------------------------------------------------------------*/ + /*---------------- Fields ----------------*/ + /*--------------------------------------------------------------*/ + + private int[][] values; + + + +}