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

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 16:23:26 -0400
parents
children
rev   line source
jpayne@68 1 package kmer;
jpayne@68 2
jpayne@68 3 import java.util.Arrays;
jpayne@68 4
jpayne@68 5 import shared.Primes;
jpayne@68 6 import shared.Shared;
jpayne@68 7 import shared.Tools;
jpayne@68 8 import structures.IntList;
jpayne@68 9
jpayne@68 10 public class ScheduleMaker {
jpayne@68 11
jpayne@68 12 public ScheduleMaker(int ways_, int bytesPerKmer_, boolean prealloc_, double memRatio_){
jpayne@68 13 this(ways_, bytesPerKmer_, prealloc_, memRatio_, 0, 0, 0, 0);
jpayne@68 14 }
jpayne@68 15
jpayne@68 16 public ScheduleMaker(int ways_, int bytesPerKmer_, boolean prealloc_, double memRatio_, int initialSize_){
jpayne@68 17 this(ways_, bytesPerKmer_, prealloc_, memRatio_, initialSize_, 0, 0, 0);
jpayne@68 18 }
jpayne@68 19
jpayne@68 20 public ScheduleMaker(int ways_, int bytesPerKmer_, boolean prealloc_, double memRatio_, int initialSize_,
jpayne@68 21 int prepasses_, double prefilterFraction_, long filterMemoryOverride_){
jpayne@68 22 bytesPerKmer=bytesPerKmer_;
jpayne@68 23 prealloc=prealloc_;
jpayne@68 24 memRatio=(float)(memRatio_<=0 ? 1 : memRatio_);
jpayne@68 25 prepasses=prepasses_;
jpayne@68 26 prefilter=(prepasses>0);
jpayne@68 27 prefilterFraction=prefilter ? prefilterFraction_ : 0;
jpayne@68 28 assert(prefilter==prefilterFraction>0) : prefilter+", "+prefilterFraction_+", "+prefilterFraction;
jpayne@68 29 // assert(false && prefilter==prefilterFraction>0) : prefilter+", "+prefilterFraction_+", "+prefilterFraction;
jpayne@68 30 if(prepasses<1){
jpayne@68 31 filterMemory0=filterMemory1=0;
jpayne@68 32 }else if(filterMemoryOverride>0){
jpayne@68 33 filterMemory0=filterMemory1=filterMemoryOverride;
jpayne@68 34 }else{
jpayne@68 35 double low=Tools.min(prefilterFraction, 1-prefilterFraction);
jpayne@68 36 double high=1-low;
jpayne@68 37 if(prepasses<0 || (prepasses&1)==1){//odd passes
jpayne@68 38 filterMemory0=(long)(usableMemory*low);
jpayne@68 39 filterMemory1=(long)(usableMemory*high);
jpayne@68 40 }else{//even passes
jpayne@68 41 filterMemory0=(long)(usableMemory*high);
jpayne@68 42 filterMemory1=(long)(usableMemory*low);
jpayne@68 43 }
jpayne@68 44 }
jpayne@68 45 tableMemory=(long)(usableMemory*.95-Tools.min(filterMemory0, filterMemory1));
jpayne@68 46
jpayne@68 47 if(ways_<1){
jpayne@68 48 long maxKmers=(2*tableMemory)/bytesPerKmer;
jpayne@68 49 long minWays=Tools.min(10000, maxKmers/Integer.MAX_VALUE);
jpayne@68 50 ways_=(int)Tools.max(31, (int)(Tools.min(96, Shared.threads())*2.5), minWays);
jpayne@68 51 ways_=(int)Primes.primeAtLeast(ways_);
jpayne@68 52 assert(ways_>0);
jpayne@68 53 // System.err.println("ways="+ways_);
jpayne@68 54 }
jpayne@68 55 ways=ways_;
jpayne@68 56
jpayne@68 57 final double maxSize0=(tableMemory*0.95*memRatio)/(bytesPerKmer*ways);
jpayne@68 58 assert(maxPrime>1 && maxSize0>2) :
jpayne@68 59 "\nmaxPrime="+maxPrime+", maxSize0="+maxSize0+", tableMemory="+tableMemory+", usableMemory="+usableMemory+
jpayne@68 60 ", \nprepasses="+prepasses+", filterMemory0="+filterMemory0+", filterMemory1="+filterMemory1+", prefilterFraction="+prefilterFraction+
jpayne@68 61 ", \nmemRatio="+memRatio+", bytesPerKmer="+bytesPerKmer+", ways="+ways+
jpayne@68 62 ", \ninitialSize="+initialSize_+", initialSizeDefault="+initialSizeDefault+", prealloc="+prealloc;
jpayne@68 63
jpayne@68 64 lastSizeFraction=prealloc ? 1.0 : resizeMult/(1.0+resizeMult);
jpayne@68 65 maxSize=Primes.primeAtMost((int)Tools.min(maxPrime, maxSize0*lastSizeFraction));
jpayne@68 66 initialSize=(prealloc ? maxSize : Primes.primeAtMost(initialSize_>0 ? initialSize_ : initialSizeDefault));
jpayne@68 67
jpayne@68 68 estimatedKmerCapacity=(long)(maxSize*HashArray.maxLoadFactorFinal*0.97*ways);
jpayne@68 69
jpayne@68 70 // System.err.println(Arrays.toString(makeSchedule()));
jpayne@68 71
jpayne@68 72 // System.err.println("ways="+ways+", maxSize="+maxSize+", estimatedKmerCapacity="+estimatedKmerCapacity+", "+Arrays.toString(makeSchedule()));
jpayne@68 73 //
jpayne@68 74 // assert(false) :
jpayne@68 75 // "\nmaxPrime="+maxPrime+", maxSize0="+maxSize0+", tableMemory="+tableMemory+", usableMemory="+usableMemory+
jpayne@68 76 // ", \nprepasses="+prepasses+", filterMemory0="+filterMemory0+", filterMemory1="+filterMemory1+", prefilterFraction="+prefilterFraction+
jpayne@68 77 // ", \nmemRatio="+memRatio+", bytesPerKmer="+bytesPerKmer+", ways="+ways+
jpayne@68 78 // ", \ninitialSize="+initialSize_+", initialSizeDefault="+initialSizeDefault+", prealloc="+prealloc+
jpayne@68 79 // ", \nmaxSize="+maxSize+", initialSize="+initialSize+", estimatedKmerCapacity="+estimatedKmerCapacity+
jpayne@68 80 // ", \n"+Arrays.toString(makeSchedule());
jpayne@68 81 // assert(false) : Arrays.toString(makeSchedule());
jpayne@68 82 }
jpayne@68 83
jpayne@68 84 public int[] makeSchedule(){
jpayne@68 85 if(prealloc || maxSize<2L*initialSize){return new int[] {maxSize};}
jpayne@68 86 IntList list=new IntList(10);
jpayne@68 87 list.add(maxSize);
jpayne@68 88 for(double x=maxSize*invResizeMult; x>=initialSize; x=x*invResizeMult2){
jpayne@68 89 list.add((int)x);
jpayne@68 90 }
jpayne@68 91 if(list.size()>1 && list.lastElement()>=2*initialSize){
jpayne@68 92 list.add(initialSize);
jpayne@68 93 }
jpayne@68 94 list.reverse();
jpayne@68 95 // if(list.lastElement()*2L<maxPrime){list.add(2*maxSize);}//This ensures that the program will crash rather than garbage-collecting for a long time
jpayne@68 96 int[] array=list.toArray();
jpayne@68 97 // if(initialSize>2 && array.length>2 && array[0]>initialSize){array[0]=initialSize;}
jpayne@68 98 assert(Tools.isSorted(array)) : Arrays.toString(array);
jpayne@68 99 for(int i=0; i<array.length; i++){
jpayne@68 100 array[i]=array[i]==1 ? 1 : (int)Tools.min(maxPrime, Primes.primeAtLeast(array[i]));
jpayne@68 101 }
jpayne@68 102 return array;
jpayne@68 103 }
jpayne@68 104
jpayne@68 105 // public static int[] makeScheduleStatic(int initialSize, int maxSize, boolean autoResize){
jpayne@68 106 // if(!autoResize || initialSize>=maxSize){return null;}
jpayne@68 107 // IntList list=new IntList(10);
jpayne@68 108 // list.add((int)(maxSize*0.8));
jpayne@68 109 // for(long x=maxSize; x>=initialSize; x=x/5){
jpayne@68 110 // list.add((int)x);
jpayne@68 111 // }
jpayne@68 112 // if(list.size()>1 && list.lastElement()>=2*initialSize){
jpayne@68 113 // list.add(initialSize);
jpayne@68 114 // }
jpayne@68 115 // list.reverse();
jpayne@68 116 // int[] array=list.toArray();
jpayne@68 117 // for(int i=0; i<array.length; i++){
jpayne@68 118 // array[i]=array[i]==1 ? 1 : (int)Tools.min(maxPrime, Primes.primeAtLeast(array[i]));
jpayne@68 119 // }
jpayne@68 120 // return array;
jpayne@68 121 // }
jpayne@68 122
jpayne@68 123 final double resizeMult=5.0;
jpayne@68 124 final double resizeMult2=3.0;
jpayne@68 125 final double invResizeMult=1/resizeMult;
jpayne@68 126 final double invResizeMult2=1/resizeMult2;
jpayne@68 127 final double lastSizeFraction;
jpayne@68 128
jpayne@68 129 final long memory=Runtime.getRuntime().maxMemory();
jpayne@68 130 final double xmsRatio=Shared.xmsRatio();
jpayne@68 131
jpayne@68 132 //TODO: Add term for JDK (Oracle/Open) and version.
jpayne@68 133 final long usableMemory=(long)Tools.max(((memory-96000000)*
jpayne@68 134 (xmsRatio>0.97 ? 0.82 : 0.72)), memory*0.45);
jpayne@68 135
jpayne@68 136 final long filterMemoryOverride=0;
jpayne@68 137
jpayne@68 138 final long filterMemory0, filterMemory1;
jpayne@68 139 final long tableMemory;
jpayne@68 140 final double prefilterFraction;
jpayne@68 141 final int prepasses;
jpayne@68 142 final boolean prefilter;
jpayne@68 143 final int bytesPerKmer;
jpayne@68 144 public final long estimatedKmerCapacity;
jpayne@68 145
jpayne@68 146 public final int ways;
jpayne@68 147
jpayne@68 148 final int initialSize;
jpayne@68 149 final int maxSize;
jpayne@68 150
jpayne@68 151 final boolean prealloc;
jpayne@68 152 final float memRatio;
jpayne@68 153
jpayne@68 154 static final int initialSizeDefault=128000;
jpayne@68 155 static final int maxPrime=(int)Primes.primeAtMost(Integer.MAX_VALUE-100-20);
jpayne@68 156
jpayne@68 157 }