comparison CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/kmer/KmerNode.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.ArrayList;
4 import java.util.Arrays;
5
6 import fileIO.TextStreamWriter;
7 import shared.Tools;
8 import structures.ByteBuilder;
9 import structures.SuperLongList;
10
11 /**
12 * @author Brian Bushnell
13 * @date Oct 22, 2013
14 *
15 */
16 public abstract class KmerNode extends AbstractKmerTable {
17
18 /*--------------------------------------------------------------*/
19 /*---------------- Initialization ----------------*/
20 /*--------------------------------------------------------------*/
21
22 protected KmerNode(long pivot_){
23 pivot=pivot_;
24 }
25
26 public abstract KmerNode makeNode(long pivot_, int value_);
27 public abstract KmerNode makeNode(long pivot_, int[] values_, int vlen_);
28
29 /*--------------------------------------------------------------*/
30 /*---------------- Public Methods ----------------*/
31 /*--------------------------------------------------------------*/
32
33 @Override
34 public final int increment(final long kmer, final int incr){
35 if(pivot<0){pivot=kmer; return set(incr);} //Allows initializing empty nodes to -1
36 if(kmer<pivot){
37 if(left==null){left=makeNode(kmer, incr); return incr;}
38 return left.increment(kmer, incr);
39 }else if(kmer>pivot){
40 if(right==null){right=makeNode(kmer, incr); return incr;}
41 return right.increment(kmer, incr);
42 }else{
43 if(value()<Integer.MAX_VALUE){set(value()+incr);}
44 return value();
45 }
46 }
47
48 @Override
49 public final int incrementAndReturnNumCreated(final long kmer, final int incr) {
50 int x=increment(kmer, incr);
51 return x==1 ? 1 : 0;
52 }
53
54 // public final int set_Test(final long kmer, final int v){
55 // assert(TESTMODE);
56 // final int x;
57 // if(TWOD()){
58 // int[] old=getValues(kmer, null);
59 // assert(old==null || contains(kmer, old));
60 // x=set0(kmer, v);
61 // assert(old==null || contains(kmer, old));
62 // assert(contains(kmer, v));
63 // }else{
64 // int old=getValue(kmer);
65 // assert(old==0 || old==-1 || contains(kmer, old));
66 // x=set0(kmer, v);
67 // assert(contains(kmer, v)) : "old="+old+", v="+v+", kmer="+kmer+", get(kmer)="+getValue(kmer);
68 // assert(v==old || !contains(kmer, old));
69 // }
70 // return x;
71 // }
72 //
73 // public final int setIfNotPresent_Test(long kmer, int v){
74 // assert(TESTMODE);
75 // final int x;
76 // if(TWOD()){
77 //// int[] vals=getValues(kmer, null);
78 //// assert(vals==null || contains(kmer, vals));
79 //// x=setIfNotPresent(kmer, v);
80 //// assert(contains(kmer, vals));
81 //// assert(contains(kmer, v));
82 // x=0;
83 // assert(false);
84 // }else{
85 // int old=getValue(kmer);
86 // assert(old==0 || old==-1 || contains(kmer, old));
87 // x=setIfNotPresent0(kmer, v);
88 // assert((old<1 && contains(kmer, v)) || (old>0 && contains(kmer, old))) : kmer+", "+old+", "+v;
89 // }
90 // return x;
91 // }
92
93
94 /** Returns number of nodes added */
95 @Override
96 public final int set(long kmer, int value){
97 if(verbose){System.err.println("Set0: kmer="+kmer+", v="+value+", old="+Arrays.toString(values(new int[1])));}
98 if(pivot<0){pivot=kmer; set(value); return 1;} //Allows initializing empty nodes to -1
99 if(verbose){System.err.println("A");}
100 if(kmer<pivot){
101 if(verbose){System.err.println("B");}
102 if(left==null){left=makeNode(kmer, value); return 1;}
103 if(verbose){System.err.println("C");}
104 return left.set(kmer, value);
105 }else if(kmer>pivot){
106 if(verbose){System.err.println("D");}
107 if(right==null){right=makeNode(kmer, value); return 1;}
108 if(verbose){System.err.println("E");}
109 return right.set(kmer, value);
110 }else{
111 if(verbose){System.err.println("F");}
112 set(value);
113 }
114 if(verbose){System.err.println("G");}
115 return 0;
116 }
117
118
119 /** Returns number of nodes added */
120 @Override
121 public final int setIfNotPresent(long kmer, int value){
122 if(verbose){System.err.println("setIfNotPresent0: kmer="+kmer+", v="+value+", old="+Arrays.toString(values(new int[0])));}
123 if(pivot<0){pivot=kmer; set(value); return 1;} //Allows initializing empty nodes to -1
124 if(kmer<pivot){
125 if(left==null){left=makeNode(kmer, value); return 1;}
126 return left.setIfNotPresent(kmer, value);
127 }else if(kmer>pivot){
128 if(right==null){right=makeNode(kmer, value); return 1;}
129 return right.setIfNotPresent(kmer, value);
130 }
131 return 0;
132 }
133
134 @Override
135 public final int getValue(long kmer){
136 KmerNode n=get(kmer);
137 return n==null ? -1 : n.value();
138 }
139
140 @Override
141 public final int[] getValues(long kmer, int[] singleton){
142 KmerNode n=get(kmer);
143 return n==null ? null : n.values(singleton);
144 }
145
146 @Override
147 public final boolean contains(long kmer){
148 KmerNode node=get(kmer);
149 return node!=null;
150 }
151
152 /*--------------------------------------------------------------*/
153 /*---------------- Nonpublic Methods ----------------*/
154 /*--------------------------------------------------------------*/
155
156 public KmerNode left(){return left;}
157 public KmerNode right(){return right;}
158 public long pivot(){return pivot;}
159 public int owner(){return owner;}
160
161 public int count(){return value();}
162 protected abstract int value();
163 protected abstract int[] values(int[] singleton);
164 /** Returns new value */
165 public abstract int set(int value_);
166 protected abstract int set(int[] values_, int vlen);
167
168 @Override
169 final KmerNode get(long kmer){
170 // if(kmer<pivot){
171 // return left==null ? null : left.get(kmer);
172 // }else if(kmer>pivot){
173 // return right==null ? null : right.get(kmer);
174 // }else{
175 // return this;
176 // }
177 KmerNode n=this;
178 while(n!=null && n.pivot!=kmer){
179 n=(kmer<n.pivot ? n.left : n.right);
180 }
181 return n;
182 }
183
184 final KmerNode getNodeOrParent(long kmer){
185 if(pivot==kmer || pivot<0){return this;}
186 if(kmer<pivot){return left==null ? this : left.getNodeOrParent(kmer);}
187 return right==null ? this : right.getNodeOrParent(kmer);
188 }
189
190 final boolean insert(KmerNode n){
191 assert(pivot!=-1);
192 if(n.pivot<pivot){
193 if(left==null){left=n; return true;}
194 return left.insert(n);
195 }else if(n.pivot>pivot){
196 if(right==null){right=n; return true;}
197 return right.insert(n);
198 }else{
199 return false;
200 }
201 }
202
203 final void traversePrefix(ArrayList<KmerNode> list){
204 if(left!=null){left.traversePrefix(list);}
205 list.add(this);
206 if(right!=null){right.traversePrefix(list);}
207 }
208
209 final void traverseInfix(ArrayList<KmerNode> list){
210 list.add(this);
211 if(left!=null){left.traverseInfix(list);}
212 if(right!=null){right.traverseInfix(list);}
213 }
214
215 /*--------------------------------------------------------------*/
216 /*---------------- Private Methods ----------------*/
217 /*--------------------------------------------------------------*/
218
219 /*--------------------------------------------------------------*/
220 /*---------------- Resizing and Rebalancing ----------------*/
221 /*--------------------------------------------------------------*/
222
223 @Override
224 public final long size() {
225 if(value()<1){return 0;}
226 long size=1;
227 if(left!=null){size+=left.size();}
228 if(right!=null){size+=right.size();}
229 return size;
230 }
231
232 final KmerNode rebalance(ArrayList<KmerNode> list){
233 assert(list.isEmpty());
234 traversePrefix(list);
235 KmerNode n=this;
236 if(list.size()>2){
237 n=rebalance(list, 0, list.size()-1);
238 }
239 list.clear();
240 return n;
241 }
242
243 private static final KmerNode rebalance(ArrayList<KmerNode> list, int a, int b){
244 final int size=b-a+1;
245 final int middle=a+size/2;
246 final KmerNode n=list.get(middle);
247 if(size<4){
248 if(size==1){
249 n.left=n.right=null;
250 }else if(size==2){
251 KmerNode n1=list.get(a);
252 n.left=n1;
253 n.right=null;
254 n1.left=n1.right=null;
255 }else{
256 assert(size==3);
257 KmerNode n1=list.get(a), n2=list.get(b);
258 n.left=n1;
259 n.right=n2;
260 n1.left=n1.right=null;
261 n2.left=n2.right=null;
262 }
263 }else{
264 n.left=rebalance(list, a, middle-1);
265 n.right=rebalance(list, middle+1, b);
266 }
267 return n;
268 }
269
270 @Override
271 public long regenerate(final int limit){
272 throw new RuntimeException("Not supported.");
273 }
274
275 /*--------------------------------------------------------------*/
276 /*---------------- Info Dumping ----------------*/
277 /*--------------------------------------------------------------*/
278
279 @Override
280 public final boolean dumpKmersAsText(TextStreamWriter tsw, int k, int mincount, int maxcount) {
281 tsw.print(dumpKmersAsText(new StringBuilder(32), k, mincount, maxcount));
282 return true;
283 }
284
285 protected abstract StringBuilder dumpKmersAsText(StringBuilder sb, int k, int mincount, int maxcount);
286
287 protected abstract ByteBuilder dumpKmersAsText(ByteBuilder bb, int k, int mincount, int maxcount);
288
289 @Override
290 public final void fillHistogram(long[] ca, int max){
291 final int value=value();
292 if(value<1){return;}
293 ca[Tools.min(value, max)]++;
294 if(left!=null){left.fillHistogram(ca, max);}
295 if(right!=null){right.fillHistogram(ca, max);}
296 }
297
298 @Override
299 public final void fillHistogram(SuperLongList sll){
300 final int value=value();
301 if(value<1){return;}
302 sll.add(value);
303 if(left!=null){left.fillHistogram(sll);}
304 if(right!=null){right.fillHistogram(sll);}
305 }
306
307 @Override
308 public void countGC(long[] gcCounts, int max){
309 final int value=value();
310 if(value<1){return;}
311 gcCounts[Tools.min(value, max)]+=gc(pivot);
312 if(left!=null){left.countGC(gcCounts, max);}
313 if(right!=null){right.countGC(gcCounts, max);}
314 }
315
316 abstract boolean TWOD();
317 abstract int numValues();
318
319 /*--------------------------------------------------------------*/
320 /*---------------- Ownership ----------------*/
321 /*--------------------------------------------------------------*/
322
323 @Override
324 public final void initializeOwnership(){
325 owner=-1;
326 if(left!=null){left.initializeOwnership();}
327 if(right!=null){right.initializeOwnership();}
328 }
329
330 @Override
331 public final void clearOwnership(){initializeOwnership();}
332
333 @Override
334 public final int setOwner(final long kmer, final int newOwner){
335 KmerNode n=get(kmer);
336 assert(n!=null);
337 if(n.owner<=newOwner){
338 synchronized(n){
339 if(n.owner<newOwner){
340 n.owner=newOwner;
341 }
342 }
343 }
344 return n.owner;
345 }
346
347 @Override
348 public final boolean clearOwner(final long kmer, final int owner){
349 KmerNode n=get(kmer);
350 assert(n!=null);
351 synchronized(n){
352 if(n.owner==owner){
353 n.owner=-1;
354 return true;
355 }
356 }
357 return false;
358 }
359
360 @Override
361 public final int getOwner(final long kmer){
362 KmerNode n=get(kmer);
363 assert(n!=null);
364 return n.owner;
365 }
366
367 public long calcMem() {//48 is a guess
368 return 48+(left==null ? 0 : left.calcMem())+(right==null ? 0 : right.calcMem());
369 }
370
371 /*--------------------------------------------------------------*/
372 /*---------------- Invalid Methods ----------------*/
373 /*--------------------------------------------------------------*/
374
375 /*--------------------------------------------------------------*/
376 /*---------------- Fields ----------------*/
377 /*--------------------------------------------------------------*/
378
379 long pivot;
380 int owner=-1;
381 KmerNode left, right;
382
383 }