BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
cache.cpp
Go to the documentation of this file.
1/*
2 * cache.h - cache classes
3 *
4 * this file is part of PJFry library
5 * Copyright 2011 Valery Yundin
6 */
7
8#include "cache.h"
9#include "integral.h"
10
11/* ------------------------------------------------------------
12 * ------------------------------------------------------------
13 * ICache section
14 * ------------------------------------------------------------
15 * ------------------------------------------------------------
16 */
17
18double ICache::mu2 = 1;
19
20double ICache::getMu2() { return mu2; }
21
22double ICache::setMu2( const double newmu2 ) {
23 if ( newmu2 > 0 && newmu2 != mu2 )
24 {
25 MinorBase::Rescale( newmu2 / mu2 );
26 mu2 = newmu2;
27#ifdef USE_ONELOOP
28 double mu = sqrt( mu2 );
29 F77_FUNC_( avh_olo_mu_set, AVH_OLO_MU_SET )( &mu );
30#endif
33 }
34 return mu2;
35}
36
38 ClearCC();
39 ClearIC();
40}
41
42/* clear coefficient cache */
44 ic5[0].reset();
45 ic5[1].reset();
46 ic4[0].reset();
47 ic4[1].reset();
48 ic3[0].reset();
49 ic3[1].reset();
50 ic2[0].reset();
51 ic2[1].reset();
52}
53
54/* clear scalar integral cache */
56 ics4.reset();
57 ics3.reset();
58 ics2.reset();
59 ics1.reset();
60}
61
62/* clear minor cache */
64 cm5.reset();
65 cm4.reset();
66 cm3.reset();
67 cm2.reset();
68}
69
70// const double ICache::sNan=std::numeric_limits<double>::signaling_NaN();
71// const int64_t ICache::sNAN=0x7ffc0000BA13BA13LL;
72// const double ICache::sNAN.d64=reinterpret_cast<const double&>(sNAN); // Bad because breaks
73// strict aliasing const double ICache::sNAN.d64=((const ICache::ID64&)sNAN).dbl;
74
75const ICache::ID64 ICache::sNAN = { 0x7ffc0000BA13BA13LL };
76
77ICache::Array5 ICache::ic5[3];
78ICache::Array4 ICache::ic4[3];
79ICache::Array3 ICache::ic3[3];
80ICache::Array2 ICache::ic2[3];
81
82ICache::ArrayS4 ICache::ics4;
83ICache::ArrayS3 ICache::ics3;
84ICache::ArrayS2 ICache::ics2;
85ICache::ArrayS1 ICache::ics1;
86
87/* ===========================================================
88 *
89 * PENTAGON: 5 point coefficients
90 *
91 * ===========================================================
92 */
93
94/* --------------------------------------------------------
95 Rank-5 PENTAGON
96 * --------------------------------------------------------
97 */
98ncomplex ICache::getE( int ep, int i, int j, int k, int l, int m, const Kinem5& kin ) {
99#ifdef USE_CACHE_HIGH
100 assert( ( i == 0 && j == 0 &&
101 ( ( k == 0 && l == 0 && m != 0 ) || ( k != 0 && l != 0 && m != 0 ) ) ) ||
102 ( i != 0 && j != 0 && k != 0 && l != 0 && m != 0 ) );
103 int coefn = 0;
104 if ( i == 0 && j == 0 )
105 {
106 if ( k == 0 && l == 0 ) coefn = ( m - 1 ) + ee00001;
107 else coefn = Minor5::is( k - 1, l - 1, m - 1 ) + ee00111;
108 }
109 else { coefn = Minor5::iss( i - 1, j - 1, k - 1, l - 1, m - 1 ) + ee11111; }
110 Save5* s5 = getS5( ep, kin, coefn );
111
112 ncomplex ivalue = ( *s5 )[coefn];
113 if ( ivalue.real() == sNAN )
114 {
115 ivalue = MCache::getMinor5( kin )->evalE( ep, i, j, k, l, m );
116 ( *s5 )[coefn] = ivalue;
117 }
118#else
119 ncomplex ivalue = MCache::getMinor5( kin )->evalE( ep, i, j, k, l, m );
120#endif /* USE_CACHE_HIGH */
121 return ivalue;
122}
123
124/* --------------------------------------------------------
125 Rank-4 PENTAGON
126 * --------------------------------------------------------
127 */
128ncomplex ICache::getE( int ep, int i, int j, int k, int l, const Kinem5& kin ) {
129#ifdef USE_CACHE_HIGH
130 assert( ( i == 0 && j == 0 && ( ( k == 0 && l == 0 ) || ( k != 0 && l != 0 ) ) ) ||
131 ( i != 0 && j != 0 && k != 0 && l != 0 ) );
132 int coefn = 0;
133 if ( i == 0 && j == 0 )
134 {
135 if ( k == 0 && l == 0 ) coefn = ee0000;
136 else coefn = Minor5::is( k - 1, l - 1 ) + ee0011;
137 }
138 else { coefn = Minor5::is( i - 1, j - 1, k - 1, l - 1 ) + ee1111; }
139 Save5* s5 = getS5( ep, kin, coefn );
140
141 ncomplex ivalue = ( *s5 )[coefn];
142 if ( ivalue.real() == sNAN )
143 {
144 ivalue = MCache::getMinor5( kin )->evalE( ep, i, j, k, l );
145 ( *s5 )[coefn] = ivalue;
146 }
147#else
148 ncomplex ivalue = MCache::getMinor5( kin )->evalE( ep, i, j, k, l );
149#endif /* USE_CACHE_HIGH */
150 return ivalue;
151}
152
153/* --------------------------------------------------------
154 Rank-3 PENTAGON
155 * --------------------------------------------------------
156 */
157ncomplex ICache::getE( int ep, int i, int j, int k, const Kinem5& kin ) {
158#ifdef USE_CACHE_HIGH
159 assert( ( i == 0 && j == 0 && k != 0 ) || ( i != 0 && j != 0 && k != 0 ) );
160 int coefn =
161 ( i == 0 && j == 0 ) ? ( k - 1 ) + ee001 : Minor5::is( i - 1, j - 1, k - 1 ) + ee111;
162 Save5* s5 = getS5( ep, kin, coefn );
163
164 ncomplex ivalue = ( *s5 )[coefn];
165 if ( ivalue.real() == sNAN )
166 {
167 ivalue = MCache::getMinor5( kin )->evalE( ep, i, j, k );
168 ( *s5 )[coefn] = ivalue;
169 }
170#else
171 ncomplex ivalue = MCache::getMinor5( kin )->evalE( ep, i, j, k );
172#endif /* USE_CACHE_HIGH */
173 return ivalue;
174}
175
176/* --------------------------------------------------------
177 Rank-2 PENTAGON
178 * --------------------------------------------------------
179 */
180ncomplex ICache::getE( int ep, int i, int j, const Kinem5& kin ) {
181#ifdef USE_CACHE_HIGH
182 assert( ( i == 0 && j == 0 ) || ( i != 0 && j != 0 ) );
183 int coefn = ( i == 0 && j == 0 ) ? ee00 : Minor5::is( i - 1, j - 1 ) + ee11;
184 Save5* s5 = getS5( ep, kin, coefn );
185
186 ncomplex ivalue = ( *s5 )[coefn];
187 if ( ivalue.real() == sNAN )
188 {
189 ivalue = MCache::getMinor5( kin )->evalE( ep, i, j );
190 ( *s5 )[coefn] = ivalue;
191 }
192#else
193 ncomplex ivalue = MCache::getMinor5( kin )->evalE( ep, i, j );
194#endif /* USE_CACHE_HIGH */
195 return ivalue;
196}
197
198/* --------------------------------------------------------
199 Rank-1 PENTAGON
200 * --------------------------------------------------------
201 */
202ncomplex ICache::getE( int ep, int i, const Kinem5& kin ) {
203#ifdef USE_CACHE_HIGH
204 int coefn = ( i - 1 ) + ee1;
205 Save5* s5 = getS5( ep, kin, coefn );
206
207 ncomplex ivalue = ( *s5 )[coefn];
208 if ( ivalue.real() == sNAN )
209 {
210 ivalue = MCache::getMinor5( kin )->evalE( ep, i );
211 ( *s5 )[coefn] = ivalue;
212 }
213#else
214 ncomplex ivalue = MCache::getMinor5( kin )->evalE( ep, i );
215#endif /* USE_CACHE_HIGH */
216 return ivalue;
217}
218
219/* --------------------------------------------------------
220 Rank-0 PENTAGON
221 * --------------------------------------------------------
222 */
223ncomplex ICache::getE( int ep, const Kinem5& kin ) {
224#ifdef USE_CACHE_HIGH
225 int coefn = ee0;
226 Save5* s5 = getS5( ep, kin, coefn );
227
228 ncomplex ivalue = ( *s5 )[coefn];
229 if ( ivalue.real() == sNAN )
230 {
231 ivalue = MCache::getMinor5( kin )->evalE( ep );
232 ( *s5 )[coefn] = ivalue;
233 }
234#else
235 ncomplex ivalue = MCache::getMinor5( kin )->evalE( ep );
236#endif /* USE_CACHE_HIGH */
237 return ivalue;
238}
239
240/* ===========================================================
241 *
242 * BOX: 4 point coefficients
243 *
244 * ===========================================================
245 */
246
247/* --------------------------------------------------------
248 Rank-4 BOX
249 * --------------------------------------------------------
250 */
251ncomplex ICache::getD( int ep, int i, int j, int k, int l, const Kinem4& kin ) {
252#ifdef USE_CACHE_LOW
253 assert( ( i == 0 && j == 0 && ( ( k == 0 && l == 0 ) || ( k != 0 && l != 0 ) ) ) ||
254 ( i != 0 && j != 0 && k != 0 && l != 0 ) );
255 int coefn = 0;
256 if ( i == 0 && j == 0 )
257 {
258 if ( k == 0 && l == 0 ) coefn = dd0000;
259 else coefn = Minor4::is( k - 1, l - 1 ) + dd0011;
260 }
261 else { coefn = Minor5::is( i - 1, j - 1, k - 1, l - 1 ) + dd1111; }
262 Save4* s4 = getS4( ep, kin, coefn );
263
264 ncomplex ivalue = ( *s4 )[coefn];
265 if ( ivalue.real() == sNAN )
266 {
267 ivalue = MCache::getMinor4( kin )->evalD( ep, i, j, k, l );
268 ( *s4 )[coefn] = ivalue;
269 }
270#else
271 ncomplex ivalue = MCache::getMinor4( kin )->evalD( ep, i, j, k, l );
272#endif /* USE_CACHE_LOW */
273 return ivalue;
274}
275
276/* --------------------------------------------------------
277 Rank-3 BOX
278 * --------------------------------------------------------
279 */
280ncomplex ICache::getD( int ep, int i, int j, int k, const Kinem4& kin ) {
281#ifdef USE_CACHE_LOW
282 assert( ( i == 0 && j == 0 && k != 0 ) || ( i != 0 && j != 0 && k != 0 ) );
283 int coefn =
284 ( i == 0 && j == 0 ) ? ( k - 1 ) + dd001 : Minor4::is( i - 1, j - 1, k - 1 ) + dd111;
285 Save4* s4 = getS4( ep, kin, coefn );
286
287 ncomplex ivalue = ( *s4 )[coefn];
288 if ( ivalue.real() == sNAN )
289 {
290 ivalue = MCache::getMinor4( kin )->evalD( ep, i, j, k );
291 ( *s4 )[coefn] = ivalue;
292 }
293#else
294 ncomplex ivalue = MCache::getMinor4( kin )->evalD( ep, i, j, k );
295#endif /* USE_CACHE_LOW */
296 return ivalue;
297}
298
299/* --------------------------------------------------------
300 Rank-2 BOX
301 * --------------------------------------------------------
302 */
303ncomplex ICache::getD( int ep, int i, int j, const Kinem4& kin ) {
304#ifdef USE_CACHE_LOW
305 assert( ( i == 0 && j == 0 ) || ( i != 0 && j != 0 ) );
306 int coefn = ( i == 0 && j == 0 ) ? dd00 : Minor4::is( i - 1, j - 1 ) + dd11;
307 Save4* s4 = getS4( ep, kin, coefn );
308
309 ncomplex ivalue = ( *s4 )[coefn];
310 if ( ivalue.real() == sNAN )
311 {
312 ivalue = MCache::getMinor4( kin )->evalD( ep, i, j );
313 ( *s4 )[coefn] = ivalue;
314 }
315#else
316 ncomplex ivalue = MCache::getMinor4( kin )->evalD( ep, i, j );
317#endif /* USE_CACHE_LOW */
318 return ivalue;
319}
320
321/* --------------------------------------------------------
322 Rank-1 BOX
323 * --------------------------------------------------------
324 */
325ncomplex ICache::getD( int ep, int i, const Kinem4& kin ) {
326#ifdef USE_CACHE_LOW
327 int coefn = ( i - 1 ) + dd1;
328 Save4* s4 = getS4( ep, kin, coefn );
329
330 ncomplex ivalue = ( *s4 )[coefn];
331 if ( ivalue.real() == sNAN )
332 {
333 ivalue = MCache::getMinor4( kin )->evalD( ep, i );
334 ( *s4 )[coefn] = ivalue;
335 }
336#else
337 ncomplex ivalue = MCache::getMinor4( kin )->evalD( ep, i );
338#endif /* USE_CACHE_LOW */
339 return ivalue;
340}
341
342/* ===========================================================
343 *
344 * TRIANGLE: 3 point coefficients
345 *
346 * ===========================================================
347 */
348
349/* --------------------------------------------------------
350 Rank-3 TRIANGLE
351 * --------------------------------------------------------
352 */
353ncomplex ICache::getC( int ep, int i, int j, int k, const Kinem3& kin ) {
354#ifdef USE_CACHE_LOW
355 assert( ( i == 0 && j == 0 && k != 0 ) || ( i != 0 && j != 0 && k != 0 ) );
356 int coefn =
357 ( i == 0 && j == 0 ) ? ( k - 1 ) + cc001 : Minor3::is( i - 1, j - 1, k - 1 ) + cc111;
358 Save3* s3 = getS3( ep, kin, coefn );
359
360 ncomplex ivalue = ( *s3 )[coefn];
361 Minor3::Ptr pm3;
362 if ( ivalue.real() == sNAN && ( pm3 = MCache::getMinor3( kin ) ) != 0 )
363 {
364 ivalue = pm3->evalC( ep, i, j, k );
365 ( *s3 )[coefn] = ivalue;
366 }
367#else
368 Minor3::Ptr pm3 = MCache::getMinor3( kin );
369 ncomplex ivalue = ( pm3 != 0 ? pm3->evalC( ep, i, j, k ) : sNAN.d64 );
370#endif /* USE_CACHE_LOW */
371#ifndef NDEBUG
372 if ( pm3 == 0 )
373 printf( "C%d%d%d(%.18e,%.18e,%.18e,%e,%e,%e)=%f\n", i, j, k, kin.p1(), kin.p2(), kin.p3(),
374 kin.m1(), kin.m2(), kin.m3(), ivalue.real() );
375#endif
376 return ivalue;
377}
378
379/* --------------------------------------------------------
380 Rank-2 TRIANGLE
381 * --------------------------------------------------------
382 */
383ncomplex ICache::getC( int ep, int i, int j, const Kinem3& kin ) {
384#ifdef USE_CACHE_LOW
385 assert( ( i == 0 && j == 0 ) || ( i != 0 && j != 0 ) );
386 int coefn = ( i == 0 && j == 0 ) ? cc00 : Minor3::is( i - 1, j - 1 ) + cc11;
387 Save3* s3 = getS3( ep, kin, coefn );
388
389 ncomplex ivalue = ( *s3 )[coefn];
390 Minor3::Ptr pm3;
391 if ( ivalue.real() == sNAN && ( pm3 = MCache::getMinor3( kin ) ) != 0 )
392 {
393 ivalue = pm3->evalC( ep, i, j );
394 ( *s3 )[coefn] = ivalue;
395 }
396#else
397 Minor3::Ptr pm3 = MCache::getMinor3( kin );
398 ncomplex ivalue = ( pm3 != 0 ? pm3->evalC( ep, i, j ) : sNAN.d64 );
399#endif /* USE_CACHE_LOW */
400#ifndef NDEBUG
401 if ( pm3 == 0 )
402 printf( "C%d%d(%.18e,%.18e,%.18e,%e,%e,%e)=%f\n", i, j, kin.p1(), kin.p2(), kin.p3(),
403 kin.m1(), kin.m2(), kin.m3(), ivalue.real() );
404#endif
405 return ivalue;
406}
407
408/* --------------------------------------------------------
409 Rank-1 TRIANGLE
410 * --------------------------------------------------------
411 */
412ncomplex ICache::getC( int ep, int i, const Kinem3& kin ) {
413#ifdef USE_CACHE_LOW
414 int coefn = ( i - 1 ) + cc1;
415 Save3* s3 = getS3( ep, kin, coefn );
416
417 ncomplex ivalue = ( *s3 )[coefn];
418 Minor3::Ptr pm3;
419 if ( ivalue.real() == sNAN && ( pm3 = MCache::getMinor3( kin ) ) != 0 )
420 {
421 ivalue = pm3->evalC( ep, i );
422 ( *s3 )[coefn] = ivalue;
423 }
424#else
425 Minor3::Ptr pm3 = MCache::getMinor3( kin );
426 ncomplex ivalue = ( pm3 != 0 ? pm3->evalC( ep, i ) : sNAN.d64 );
427#endif /* USE_CACHE_LOW */
428#ifndef NDEBUG
429 if ( pm3 == 0 )
430 printf( "C%d(%.18e,%.18e,%.18e,%e,%e,%e)=%f\n", i, kin.p1(), kin.p2(), kin.p3(), kin.m1(),
431 kin.m2(), kin.m3(), ivalue.real() );
432#endif
433 return ivalue;
434}
435
436/* ===========================================================
437 *
438 * BUBBLE: 2 point coefficients
439 *
440 * ===========================================================
441 */
442
443/* --------------------------------------------------------
444 Rank-2 BUBBLE
445 * --------------------------------------------------------
446 */
447ncomplex ICache::getB( int ep, int i, int j, const Kinem2& kin ) {
448#ifdef USE_CACHE_LOW
449 assert( ( i == 0 && j == 0 ) || ( i != 0 && j != 0 ) );
450 int coefn = ( i == 0 && j == 0 ) ? bb00 : Minor2::is( i - 1, j - 1 ) + bb11;
451 Save2* s2 = getS2( ep, kin, coefn );
452
453 ncomplex ivalue = ( *s2 )[coefn];
454 Minor2::Ptr pm2;
455 if ( ivalue.real() == sNAN && ( pm2 = MCache::getMinor2( kin ) ) != 0 )
456 {
457 ivalue = pm2->evalB( ep, i, j );
458 ( *s2 )[coefn] = ivalue;
459 }
460#else
461 Minor2::Ptr pm2 = MCache::getMinor2( kin );
462 ncomplex ivalue = ( pm2 != 0 ? pm2->evalB( ep, i, j ) : sNAN.d64 );
463#endif /* USE_CACHE_LOW */
464#ifndef NDEBUG
465 if ( pm2 == 0 )
466 printf( "B%d%d(%.18e,%.18e,%.18e)=%f\n", i, j, kin.p1(), kin.m1(), kin.m2(),
467 ivalue.real() );
468#endif
469 return ivalue;
470}
471
472/* --------------------------------------------------------
473 Rank-1 BUBBLE
474 * --------------------------------------------------------
475 */
476ncomplex ICache::getB( int ep, int i, const Kinem2& kin ) {
477#ifdef USE_CACHE_LOW
478 int coefn = ( i - 1 ) + bb1;
479 Save2* s2 = getS2( ep, kin, coefn );
480
481 ncomplex ivalue = ( *s2 )[coefn];
482 Minor2::Ptr pm2;
483 if ( ivalue.real() == sNAN && ( pm2 = MCache::getMinor2( kin ) ) != 0 )
484 {
485 ivalue = pm2->evalB( ep, i );
486 ( *s2 )[coefn] = ivalue;
487 }
488#else
489 Minor2::Ptr pm2 = MCache::getMinor2( kin );
490 ncomplex ivalue = ( pm2 != 0 ? pm2->evalB( ep, i ) : sNAN.d64 );
491#endif /* USE_CACHE_LOW */
492#ifndef NDEBUG
493 if ( pm2 == 0 )
494 printf( "B%d(%.18e,%.18e,%.18e)=%f\n", i, kin.p1(), kin.m1(), kin.m2(), ivalue.real() );
495#endif
496 return ivalue;
497}
498
499/* ===========================================================
500 *
501 * Get saved value
502 *
503 * ===========================================================
504 */
505
506// ICache::Save5* ICache::getS5(int ep, const Kinem5 &kin, int coefn)
507// {
508// Save5 *s5=0;
509// for (Array5::iterator it5=ic5[ep].begin(); it5 != ic5[ep].end(); ++it5) {
510// if (it5->key == kin) {
511// s5=it5->val.get();
512// break;
513// }
514// }
515// if (s5 == 0) {
516// Save5::Ptr sptr(new Save5(ncomplex(sNAN.d64, 0)));
517// s5=sptr.get();
518// ic5[ep].insert(Entry5(kin, sptr));
519// }
520// return s5;
521// }
522
523#define getSave( n ) \
524 ICache::Save##n* ICache::getS##n( int ep, const Kinem##n& kin, int coefn ) { \
525 Save##n* s##n = 0; \
526 for ( Array##n::iterator it##n = ic##n[ep].begin(); it##n != ic##n[ep].end(); ++it##n ) \
527 { \
528 if ( it##n->key == kin ) \
529 { \
530 s##n = it##n->val.get(); \
531 break; \
532 } \
533 } \
534 if ( s##n == 0 ) \
535 { \
536 Save##n::Ptr sptr( new Save##n( ncomplex( sNAN.d64, 0 ) ) ); \
537 s##n = sptr.get(); \
538 ic##n[ep].insert( Entry##n( kin, sptr ) ); \
539 } \
540 return s##n; \
541 }
542
543getSave( 5 ) getSave( 4 ) getSave( 3 ) getSave( 2 )
544
545#undef getSave
546
547// ncomplex ICache::getI2(int ep, const Kinem2 &k)
548// {
549// ncomplex ivalue(sNAN.d64, 0);
550// for (ArrayS2::iterator it2=ics2[ep].begin(); it2 != ics2[ep].end(); ++it2) {
551// if (it2->key == k) {
552// ivalue=it2->val;
553// break;
554// }
555// }
556// if (ivalue.real() == sNAN) {
557// ivalue=qlI2(k.p1(),
558// k.m1(), k.m2(),
559// -ep);
560// ics2[ep].insert(EntryS2(k,ivalue));
561// }
562// return ivalue;
563// }
564
565#define getIN( n ) \
566 ncomplex ICache::getI##n( int ep, const Kinem##n& k ) { \
567 Ival ivalue; \
568 bool found = false; \
569 for ( ArrayS##n::iterator it##n = ics##n.begin(); it##n != ics##n.end(); ++it##n ) \
570 { \
571 if ( it##n->key == k ) \
572 { \
573 ivalue = it##n->val; \
574 found = true; \
575 break; \
576 } \
577 } \
578 if ( !found ) \
579 { \
580 ivalue = qlI##n( k ); \
581 ics##n.insert( EntryS##n( k, ivalue ) ); \
582 } \
583 return ivalue.val[ep]; \
584 }
585
586 getIN( 1 ) getIN( 2 ) getIN( 3 ) getIN( 4 )
587
588#undef getIN
589
590 /* ------------------------------------------------------------
591 * ------------------------------------------------------------
592 * MCache section
593 * ------------------------------------------------------------
594 * ------------------------------------------------------------
595 */
596
597 MCache::Array5 MCache::cm5;
598MCache::Array4 MCache::cm4;
599MCache::Array3 MCache::cm3;
600MCache::Array2 MCache::cm2;
601
602// Minor5::Ptr MCache::getMinor5(const Kinem5 &k)
603// {
604// Minor5::Ptr minor;
605// for (Array5::iterator it5=cm5.begin(); it5!=cm5.end(); ++it5) {
606// if (it5->key == k) {
607// minor=it5->val;
608// break;
609// }
610// }
611// if (minor==0) {
612// minor=Minor5::create(k);
613// cm5.insert(Entry5(k,minor));
614// }
615// return minor;
616// }
617
618#define getMinorN( n ) \
619 Minor##n::Ptr MCache::getMinor##n( const Kinem##n& k ) { \
620 Minor##n::Ptr minor; \
621 for ( Array##n::iterator it##n = cm##n.begin(); it##n != cm##n.end(); ++it##n ) \
622 { \
623 if ( it##n->key == k ) \
624 { \
625 minor = it##n->val; \
626 break; \
627 } \
628 } \
629 /* if (minor==0) { \
630 minor=Minor##n::create(k); \
631 cm##n.insert(Entry##n(k,minor)); \
632 } \
633 assert(minor!=0); */ \
634 return minor; \
635 }
636
637getMinorN( 3 ) getMinorN( 2 )
638
639#undef getMinorN
640
642 Minor5::Ptr minor;
643 for ( Array5::iterator it5 = cm5.begin(); it5 != cm5.end(); ++it5 )
644 {
645 if ( it5->key == k )
646 {
647 minor = it5->val;
648 break;
649 }
650 }
651 if ( minor == 0 )
652 {
653 minor = Minor5::create( k );
654 cm5.insert( Entry5( k, minor ) );
655 }
656 assert( minor != 0 );
657 return minor;
658}
659
661 Minor4::Ptr minor;
662 for ( Array4::iterator it4 = cm4.begin(); it4 != cm4.end(); ++it4 )
663 {
664 if ( it4->key == k )
665 {
666 minor = it4->val;
667 break;
668 }
669 }
670 if ( minor == 0 )
671 {
672 Minor5::create( k );
673 minor = cm4.begin()->val;
674 cm4.insert( Entry4( k, minor ) );
675 }
676 assert( minor != 0 );
677 return minor;
679
680#ifdef USE_SMART_INSERT
681
682void MCache::smartinsertMinor3( const Kinem3& k, Minor3::Ptr& m ) {
683 for ( Array3::iterator it3 = cm3.begin(); it3 != cm3.end(); ++it3 )
684 {
685 if ( it3->key == k )
686 {
687 cm3.remove( it3 );
688 break;
689 }
691 insertMinor3( k, m );
692}
693
694void MCache::smartinsertMinor2( const Kinem2& k, Minor2::Ptr& m ) {
695 for ( Array2::iterator it2 = cm2.begin(); it2 != cm2.end(); ++it2 )
696 {
697 if ( it2->key == k )
698 {
699 cm2.remove( it2 );
700 break;
701 }
702 }
703 insertMinor2( k, m );
704}
705
706#endif
707
708// -------------------------------------------------------
std::complex< double > ncomplex
#define getMinorN(n)
Definition cache.cpp:618
#define getSave(n)
Definition cache.cpp:523
#define getIN(n)
NIter< Entry5, N > iterator
Definition pointer.h:85
iterator begin()
Definition pointer.h:86
T & insert(const T &el)
Definition pointer.h:89
iterator end()
Definition pointer.h:87
static void ClearIC()
Definition cache.cpp:55
static double setMu2(const double newmu2)
Definition cache.cpp:22
@ dd1
Definition cache.h:227
@ dd00
Definition cache.h:230
@ dd0000
Definition cache.h:250
@ dd111
Definition cache.h:240
@ dd1111
Definition cache.h:257
@ dd001
Definition cache.h:237
@ dd11
Definition cache.h:231
@ dd0011
Definition cache.h:251
static double getMu2()
Definition cache.cpp:20
static ncomplex getD(int ep, const Kinem4 &kin)
Definition cache.h:309
static void Clear()
Definition cache.cpp:37
@ ee11
Definition cache.h:62
@ ee00001
Definition cache.h:142
@ ee0
Definition cache.h:56
@ ee001
Definition cache.h:72
@ ee111
Definition cache.h:76
@ ee1
Definition cache.h:57
@ ee0011
Definition cache.h:97
@ ee1111
Definition cache.h:107
@ ee0000
Definition cache.h:96
@ ee00111
Definition cache.h:146
@ ee11111
Definition cache.h:166
@ ee00
Definition cache.h:61
static ncomplex getB(int ep, const Kinem2 &kin)
Definition cache.h:322
@ cc00
Definition cache.h:279
@ cc111
Definition cache.h:285
@ cc1
Definition cache.h:277
@ cc11
Definition cache.h:280
@ cc001
Definition cache.h:283
static ncomplex getC(int ep, const Kinem3 &kin)
Definition cache.h:316
@ bb1
Definition cache.h:292
@ bb00
Definition cache.h:292
@ bb11
Definition cache.h:292
static ncomplex getE(int ep, const Kinem5 &kin)
Definition cache.cpp:223
static void ClearCC()
Definition cache.cpp:43
double m2() const
Definition kinem.h:113
double m1() const
Definition kinem.h:112
double p1() const
Definition kinem.h:111
double m1() const
Definition kinem.h:132
double p1() const
Definition kinem.h:129
double p3() const
Definition kinem.h:131
double p2() const
Definition kinem.h:130
double m2() const
Definition kinem.h:133
double m3() const
Definition kinem.h:134
static void Clear()
Definition cache.cpp:63
static Minor5::Ptr getMinor5(const Kinem5 &k)
static Minor2::Ptr getMinor2(const Kinem2 &k)
static Minor3::Ptr getMinor3(const Kinem3 &k)
static void smartinsertMinor2(const Kinem2 &k, Minor2::Ptr &m)
Definition cache.cpp:690
static void insertMinor2(const Kinem2 &k, Minor2::Ptr &m)
static void insertMinor3(const Kinem3 &k, Minor3::Ptr &m)
static Minor4::Ptr getMinor4(const Kinem4 &k)
Definition cache.cpp:656
static void smartinsertMinor3(const Kinem3 &k, Minor3::Ptr &m)
Definition cache.cpp:678
SPtr< Minor2 > Ptr
Definition minor.h:565
ncomplex evalB(int ep)
SPtr< Minor3 > Ptr
Definition minor.h:533
ncomplex evalC(int ep)
SPtr< Minor4 > Ptr
Definition minor.h:498
ncomplex evalD(int ep)
SPtr< Minor5 > Ptr
Definition minor.h:192
static Ptr create(const Kinem5 &k)
Definition minor.h:193
ncomplex evalE(int ep)
Definition minoreval.cpp:24
static int iss(int i, int j) CONST
Definition minor.h:107
static void Rescale(double factor)
Definition minor.cpp:35
static int is(int i, int j) CONST
Definition minor.h:83
double int * ep
Definition qcdloop1.h:82