jpayne@68: package kmer; jpayne@68: jpayne@68: import java.util.Arrays; jpayne@68: jpayne@68: import shared.Primes; jpayne@68: import shared.Shared; jpayne@68: import shared.Tools; jpayne@68: import structures.IntList; jpayne@68: jpayne@68: public class ScheduleMaker { jpayne@68: jpayne@68: public ScheduleMaker(int ways_, int bytesPerKmer_, boolean prealloc_, double memRatio_){ jpayne@68: this(ways_, bytesPerKmer_, prealloc_, memRatio_, 0, 0, 0, 0); jpayne@68: } jpayne@68: jpayne@68: public ScheduleMaker(int ways_, int bytesPerKmer_, boolean prealloc_, double memRatio_, int initialSize_){ jpayne@68: this(ways_, bytesPerKmer_, prealloc_, memRatio_, initialSize_, 0, 0, 0); jpayne@68: } jpayne@68: jpayne@68: public ScheduleMaker(int ways_, int bytesPerKmer_, boolean prealloc_, double memRatio_, int initialSize_, jpayne@68: int prepasses_, double prefilterFraction_, long filterMemoryOverride_){ jpayne@68: bytesPerKmer=bytesPerKmer_; jpayne@68: prealloc=prealloc_; jpayne@68: memRatio=(float)(memRatio_<=0 ? 1 : memRatio_); jpayne@68: prepasses=prepasses_; jpayne@68: prefilter=(prepasses>0); jpayne@68: prefilterFraction=prefilter ? prefilterFraction_ : 0; jpayne@68: assert(prefilter==prefilterFraction>0) : prefilter+", "+prefilterFraction_+", "+prefilterFraction; jpayne@68: // assert(false && prefilter==prefilterFraction>0) : prefilter+", "+prefilterFraction_+", "+prefilterFraction; jpayne@68: if(prepasses<1){ jpayne@68: filterMemory0=filterMemory1=0; jpayne@68: }else if(filterMemoryOverride>0){ jpayne@68: filterMemory0=filterMemory1=filterMemoryOverride; jpayne@68: }else{ jpayne@68: double low=Tools.min(prefilterFraction, 1-prefilterFraction); jpayne@68: double high=1-low; jpayne@68: if(prepasses<0 || (prepasses&1)==1){//odd passes jpayne@68: filterMemory0=(long)(usableMemory*low); jpayne@68: filterMemory1=(long)(usableMemory*high); jpayne@68: }else{//even passes jpayne@68: filterMemory0=(long)(usableMemory*high); jpayne@68: filterMemory1=(long)(usableMemory*low); jpayne@68: } jpayne@68: } jpayne@68: tableMemory=(long)(usableMemory*.95-Tools.min(filterMemory0, filterMemory1)); jpayne@68: jpayne@68: if(ways_<1){ jpayne@68: long maxKmers=(2*tableMemory)/bytesPerKmer; jpayne@68: long minWays=Tools.min(10000, maxKmers/Integer.MAX_VALUE); jpayne@68: ways_=(int)Tools.max(31, (int)(Tools.min(96, Shared.threads())*2.5), minWays); jpayne@68: ways_=(int)Primes.primeAtLeast(ways_); jpayne@68: assert(ways_>0); jpayne@68: // System.err.println("ways="+ways_); jpayne@68: } jpayne@68: ways=ways_; jpayne@68: jpayne@68: final double maxSize0=(tableMemory*0.95*memRatio)/(bytesPerKmer*ways); jpayne@68: assert(maxPrime>1 && maxSize0>2) : jpayne@68: "\nmaxPrime="+maxPrime+", maxSize0="+maxSize0+", tableMemory="+tableMemory+", usableMemory="+usableMemory+ jpayne@68: ", \nprepasses="+prepasses+", filterMemory0="+filterMemory0+", filterMemory1="+filterMemory1+", prefilterFraction="+prefilterFraction+ jpayne@68: ", \nmemRatio="+memRatio+", bytesPerKmer="+bytesPerKmer+", ways="+ways+ jpayne@68: ", \ninitialSize="+initialSize_+", initialSizeDefault="+initialSizeDefault+", prealloc="+prealloc; jpayne@68: jpayne@68: lastSizeFraction=prealloc ? 1.0 : resizeMult/(1.0+resizeMult); jpayne@68: maxSize=Primes.primeAtMost((int)Tools.min(maxPrime, maxSize0*lastSizeFraction)); jpayne@68: initialSize=(prealloc ? maxSize : Primes.primeAtMost(initialSize_>0 ? initialSize_ : initialSizeDefault)); jpayne@68: jpayne@68: estimatedKmerCapacity=(long)(maxSize*HashArray.maxLoadFactorFinal*0.97*ways); jpayne@68: jpayne@68: // System.err.println(Arrays.toString(makeSchedule())); jpayne@68: jpayne@68: // System.err.println("ways="+ways+", maxSize="+maxSize+", estimatedKmerCapacity="+estimatedKmerCapacity+", "+Arrays.toString(makeSchedule())); jpayne@68: // jpayne@68: // assert(false) : jpayne@68: // "\nmaxPrime="+maxPrime+", maxSize0="+maxSize0+", tableMemory="+tableMemory+", usableMemory="+usableMemory+ jpayne@68: // ", \nprepasses="+prepasses+", filterMemory0="+filterMemory0+", filterMemory1="+filterMemory1+", prefilterFraction="+prefilterFraction+ jpayne@68: // ", \nmemRatio="+memRatio+", bytesPerKmer="+bytesPerKmer+", ways="+ways+ jpayne@68: // ", \ninitialSize="+initialSize_+", initialSizeDefault="+initialSizeDefault+", prealloc="+prealloc+ jpayne@68: // ", \nmaxSize="+maxSize+", initialSize="+initialSize+", estimatedKmerCapacity="+estimatedKmerCapacity+ jpayne@68: // ", \n"+Arrays.toString(makeSchedule()); jpayne@68: // assert(false) : Arrays.toString(makeSchedule()); jpayne@68: } jpayne@68: jpayne@68: public int[] makeSchedule(){ jpayne@68: if(prealloc || maxSize<2L*initialSize){return new int[] {maxSize};} jpayne@68: IntList list=new IntList(10); jpayne@68: list.add(maxSize); jpayne@68: for(double x=maxSize*invResizeMult; x>=initialSize; x=x*invResizeMult2){ jpayne@68: list.add((int)x); jpayne@68: } jpayne@68: if(list.size()>1 && list.lastElement()>=2*initialSize){ jpayne@68: list.add(initialSize); jpayne@68: } jpayne@68: list.reverse(); jpayne@68: // if(list.lastElement()*2L2 && array.length>2 && array[0]>initialSize){array[0]=initialSize;} jpayne@68: assert(Tools.isSorted(array)) : Arrays.toString(array); jpayne@68: for(int i=0; i=maxSize){return null;} jpayne@68: // IntList list=new IntList(10); jpayne@68: // list.add((int)(maxSize*0.8)); jpayne@68: // for(long x=maxSize; x>=initialSize; x=x/5){ jpayne@68: // list.add((int)x); jpayne@68: // } jpayne@68: // if(list.size()>1 && list.lastElement()>=2*initialSize){ jpayne@68: // list.add(initialSize); jpayne@68: // } jpayne@68: // list.reverse(); jpayne@68: // int[] array=list.toArray(); jpayne@68: // for(int i=0; i0.97 ? 0.82 : 0.72)), memory*0.45); jpayne@68: jpayne@68: final long filterMemoryOverride=0; jpayne@68: jpayne@68: final long filterMemory0, filterMemory1; jpayne@68: final long tableMemory; jpayne@68: final double prefilterFraction; jpayne@68: final int prepasses; jpayne@68: final boolean prefilter; jpayne@68: final int bytesPerKmer; jpayne@68: public final long estimatedKmerCapacity; jpayne@68: jpayne@68: public final int ways; jpayne@68: jpayne@68: final int initialSize; jpayne@68: final int maxSize; jpayne@68: jpayne@68: final boolean prealloc; jpayne@68: final float memRatio; jpayne@68: jpayne@68: static final int initialSizeDefault=128000; jpayne@68: static final int maxPrime=(int)Primes.primeAtMost(Integer.MAX_VALUE-100-20); jpayne@68: jpayne@68: }