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 }
|