Mercurial > repos > rliterman > csp2
comparison CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/kmer/HashBuffer.java @ 68:5028fdace37b
planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author | jpayne |
---|---|
date | Tue, 18 Mar 2025 16:23:26 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
67:0e9998148a16 | 68:5028fdace37b |
---|---|
1 package kmer; | |
2 | |
3 import java.util.concurrent.atomic.AtomicLong; | |
4 | |
5 import fileIO.ByteStreamWriter; | |
6 import fileIO.TextStreamWriter; | |
7 import structures.ByteBuilder; | |
8 import structures.SuperLongList; | |
9 | |
10 /** | |
11 * @author Brian Bushnell | |
12 * @date Nov 22, 2013 | |
13 * | |
14 */ | |
15 public class HashBuffer extends AbstractKmerTable { | |
16 | |
17 /*--------------------------------------------------------------*/ | |
18 /*---------------- Initialization ----------------*/ | |
19 /*--------------------------------------------------------------*/ | |
20 | |
21 public HashBuffer(AbstractKmerTable[] tables_, int buflen_, int k_, boolean initValues, boolean setIfNotPresent_){ | |
22 tables=tables_; | |
23 buflen=buflen_; | |
24 halflen=(int)Math.ceil(buflen*0.5); | |
25 ways=tables.length; | |
26 buffers=new KmerBuffer[ways]; | |
27 setIfNotPresent=setIfNotPresent_; | |
28 useValues=initValues; | |
29 coreMask=(AbstractKmerTableSet.MASK_CORE ? ~(((-1L)<<(2*(k_-1)))|3) : -1L); | |
30 for(int i=0; i<ways; i++){ | |
31 buffers[i]=new KmerBuffer(buflen, k_, useValues); | |
32 } | |
33 } | |
34 | |
35 /*--------------------------------------------------------------*/ | |
36 /*---------------- Public Methods ----------------*/ | |
37 /*--------------------------------------------------------------*/ | |
38 | |
39 public final int kmerToWay(final long kmer){ | |
40 final int way=(int)((kmer&coreMask)%ways); | |
41 return way; | |
42 } | |
43 | |
44 @Override | |
45 public int incrementAndReturnNumCreated(final long kmer, final int incr) { | |
46 assert(incr==1); //I could just add the kmer multiple times if not true, with addMulti | |
47 final int way=kmerToWay(kmer); | |
48 KmerBuffer buffer=buffers[way]; | |
49 // final int size=buffer.addMulti(kmer, incr); | |
50 final int size=buffer.add(kmer); | |
51 if(size>=halflen && (size>=buflen || (size&SIZEMASK)==0)){ | |
52 return dumpBuffer(way, size>=buflen); | |
53 } | |
54 return 0; | |
55 } | |
56 | |
57 @Override | |
58 public final long flush(){ | |
59 long added=0; | |
60 for(int i=0; i<ways; i++){added+=dumpBuffer(i, true);} | |
61 return added; | |
62 } | |
63 | |
64 @Override | |
65 public int set(long kmer, int value) { | |
66 final int way=kmerToWay(kmer); | |
67 KmerBuffer buffer=buffers[way]; | |
68 final int size=buffer.add(kmer, value); | |
69 if(size>=halflen && (size>=buflen || (size&SIZEMASK)==0)){ | |
70 return dumpBuffer(way, size>=buflen); | |
71 } | |
72 return 0; | |
73 } | |
74 | |
75 @Override | |
76 public int set(long kmer, int[] vals, int vlen) { | |
77 throw new RuntimeException("Unimplemented method; this class lacks value buffers"); | |
78 } | |
79 | |
80 @Override | |
81 public int setIfNotPresent(long kmer, int value) { | |
82 throw new RuntimeException("Unimplemented method; this class lacks value buffers"); | |
83 } | |
84 | |
85 @Override | |
86 public int getValue(long kmer) { | |
87 final int way=kmerToWay(kmer); | |
88 return tables[way].getValue(kmer); | |
89 } | |
90 | |
91 @Override | |
92 public int[] getValues(long kmer, int[] singleton){ | |
93 final int way=kmerToWay(kmer); | |
94 return tables[way].getValues(kmer, singleton); | |
95 } | |
96 | |
97 @Override | |
98 public boolean contains(long kmer) { | |
99 final int way=kmerToWay(kmer); | |
100 return tables[way].contains(kmer); | |
101 } | |
102 | |
103 | |
104 | |
105 /*--------------------------------------------------------------*/ | |
106 /*---------------- Ownership ----------------*/ | |
107 /*--------------------------------------------------------------*/ | |
108 | |
109 @Override | |
110 public final void initializeOwnership(){ | |
111 for(AbstractKmerTable t : tables){t.initializeOwnership();} | |
112 } | |
113 | |
114 @Override | |
115 public final void clearOwnership(){ | |
116 for(AbstractKmerTable t : tables){t.clearOwnership();} | |
117 } | |
118 | |
119 @Override | |
120 public final int setOwner(final long kmer, final int newOwner){ | |
121 final int way=kmerToWay(kmer); | |
122 return tables[way].setOwner(kmer, newOwner); | |
123 } | |
124 | |
125 @Override | |
126 public final boolean clearOwner(final long kmer, final int owner){ | |
127 final int way=kmerToWay(kmer); | |
128 return tables[way].clearOwner(kmer, owner); | |
129 } | |
130 | |
131 @Override | |
132 public final int getOwner(final long kmer){ | |
133 final int way=kmerToWay(kmer); | |
134 return tables[way].getOwner(kmer); | |
135 } | |
136 | |
137 /*--------------------------------------------------------------*/ | |
138 /*---------------- Nonpublic Methods ----------------*/ | |
139 /*--------------------------------------------------------------*/ | |
140 | |
141 @Override | |
142 Object get(long kmer) { | |
143 final int way=kmerToWay(kmer); | |
144 return tables[way].get(kmer); | |
145 } | |
146 | |
147 /*--------------------------------------------------------------*/ | |
148 /*---------------- Private Methods ----------------*/ | |
149 /*--------------------------------------------------------------*/ | |
150 | |
151 private int dumpBuffer(final int way, boolean force){ | |
152 final KmerBuffer buffer=buffers[way]; | |
153 final AbstractKmerTable table=tables[way]; | |
154 final int lim=buffer.size(); | |
155 if(lim<0){return 0;} | |
156 | |
157 if(force){table.lock();} | |
158 else if(!table.tryLock()){return 0;} | |
159 | |
160 if(SORT_BUFFERS && buffer.values==null){//Can go before or after lock; neither helps much | |
161 buffer.kmers.sortSerial(); | |
162 } | |
163 | |
164 final int x=dumpBuffer_inner(way); | |
165 table.unlock(); | |
166 return x; | |
167 } | |
168 | |
169 private int dumpBuffer_inner(final int way){ | |
170 if(verbose){System.err.println("Dumping buffer for way "+way+" of "+ways);} | |
171 final KmerBuffer buffer=buffers[way]; | |
172 final int lim=buffer.size(); | |
173 if(lim<1){return 0;} | |
174 final long[] kmers=buffer.kmers.array; | |
175 final int[] values=(buffer.values==null ? null : buffer.values.array); | |
176 if(lim<1){return 0;} | |
177 int added=0; | |
178 final AbstractKmerTable table=tables[way]; | |
179 // synchronized(table){ | |
180 if(values==null){ | |
181 // Arrays.sort(kmers, 0, lim); //Makes it slower | |
182 if(SORT_BUFFERS){ | |
183 long prev=-1; | |
184 int sum=0; | |
185 for(int i=0; i<lim; i++){ | |
186 final long kmer=kmers[i]; | |
187 if(kmer==prev){ | |
188 sum++; | |
189 }else{ | |
190 if(sum>0){added+=table.incrementAndReturnNumCreated(prev, sum);} | |
191 prev=kmer; | |
192 sum=1; | |
193 } | |
194 } | |
195 if(sum>0){added+=table.incrementAndReturnNumCreated(prev, sum);} | |
196 }else{ | |
197 for(int i=0; i<lim; i++){ | |
198 final long kmer=kmers[i]; | |
199 added+=table.incrementAndReturnNumCreated(kmer, 1); | |
200 } | |
201 } | |
202 }else{ | |
203 if(setIfNotPresent){ | |
204 for(int i=0; i<lim; i++){ | |
205 final long kmer=kmers[i]; | |
206 final int value=values[i]; | |
207 added+=table.setIfNotPresent(kmer, value); | |
208 } | |
209 }else{ | |
210 for(int i=0; i<lim; i++){ | |
211 final long kmer=kmers[i]; | |
212 final int value=values[i]; | |
213 added+=table.set(kmer, value); | |
214 // System.err.println("B: "+kmer+", "+Arrays.toString(((HashArrayHybrid)table).getValues(kmer, new int[1]))); | |
215 } | |
216 } | |
217 } | |
218 // } | |
219 buffer.clear(); | |
220 uniqueAdded+=added; | |
221 return added; | |
222 } | |
223 | |
224 /*--------------------------------------------------------------*/ | |
225 /*---------------- Resizing and Rebalancing ----------------*/ | |
226 /*--------------------------------------------------------------*/ | |
227 | |
228 @Override | |
229 final boolean canResize() {return false;} | |
230 | |
231 @Override | |
232 public final boolean canRebalance() {return false;} | |
233 | |
234 @Deprecated | |
235 @Override | |
236 public long size() { | |
237 throw new RuntimeException("Unimplemented."); | |
238 } | |
239 | |
240 @Deprecated | |
241 @Override | |
242 public int arrayLength() { | |
243 throw new RuntimeException("Unimplemented."); | |
244 } | |
245 | |
246 @Deprecated | |
247 @Override | |
248 void resize() { | |
249 throw new RuntimeException("Unimplemented."); | |
250 } | |
251 | |
252 @Deprecated | |
253 @Override | |
254 public void rebalance() { | |
255 throw new RuntimeException("Unimplemented."); | |
256 } | |
257 | |
258 @Override | |
259 public long regenerate(final int limit){ | |
260 long sum=0; | |
261 for(AbstractKmerTable table : tables){ | |
262 sum+=table.regenerate(limit); | |
263 } | |
264 return sum; | |
265 } | |
266 | |
267 /*--------------------------------------------------------------*/ | |
268 /*---------------- Info Dumping ----------------*/ | |
269 /*--------------------------------------------------------------*/ | |
270 | |
271 @Override | |
272 public boolean dumpKmersAsText(TextStreamWriter tsw, int k, int mincount, int maxcount){ | |
273 for(AbstractKmerTable table : tables){ | |
274 table.dumpKmersAsText(tsw, k, mincount, maxcount); | |
275 } | |
276 return true; | |
277 } | |
278 | |
279 @Override | |
280 public boolean dumpKmersAsBytes(ByteStreamWriter bsw, int k, int mincount, int maxcount, AtomicLong remaining){ | |
281 for(AbstractKmerTable table : tables){ | |
282 table.dumpKmersAsBytes(bsw, k, mincount, maxcount, remaining); | |
283 } | |
284 return true; | |
285 } | |
286 | |
287 @Override | |
288 @Deprecated | |
289 public boolean dumpKmersAsBytes_MT(final ByteStreamWriter bsw, final ByteBuilder bb, final int k, final int mincount, int maxcount, AtomicLong remaining){ | |
290 throw new RuntimeException("Unsupported."); | |
291 } | |
292 | |
293 @Override | |
294 @Deprecated | |
295 public void fillHistogram(long[] ca, int max){ | |
296 throw new RuntimeException("Unsupported."); | |
297 } | |
298 | |
299 @Override | |
300 @Deprecated | |
301 public void fillHistogram(SuperLongList sll){ | |
302 throw new RuntimeException("Unsupported."); | |
303 } | |
304 | |
305 @Override | |
306 public void countGC(long[] gcCounts, int max){ | |
307 for(AbstractKmerTable table : tables){ | |
308 table.countGC(gcCounts, max); | |
309 } | |
310 } | |
311 | |
312 /*--------------------------------------------------------------*/ | |
313 /*---------------- Invalid Methods ----------------*/ | |
314 /*--------------------------------------------------------------*/ | |
315 | |
316 @Override | |
317 public int increment(final long kmer, final int incr) { | |
318 throw new RuntimeException("Unsupported"); | |
319 } | |
320 | |
321 /*--------------------------------------------------------------*/ | |
322 /*---------------- Fields ----------------*/ | |
323 /*--------------------------------------------------------------*/ | |
324 | |
325 private final AbstractKmerTable[] tables; | |
326 private final int buflen; | |
327 private final int halflen; | |
328 private final int ways; | |
329 private final boolean useValues; | |
330 private final KmerBuffer[] buffers; | |
331 private final long coreMask; | |
332 public long uniqueAdded=0; | |
333 | |
334 private static final int SIZEMASK=15; | |
335 private final boolean setIfNotPresent; | |
336 | |
337 public static boolean SORT_BUFFERS=false; | |
338 | |
339 } |