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 }