// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // INCL++ intra-nuclear cascade model // Pekka Kaitaniemi, CEA and Helsinki Institute of Physics // Davide Mancusi, CEA // Alain Boudard, CEA // Sylvie Leray, CEA // Joseph Cugnon, University of Liege // #define INCLXX_IN_GEANT4_MODE 1 #include "globals.hh" /** \file G4INCLHashing.hh * \brief Functions for hashing a collection of NucleonItems. * * \date 12th October 2012 * \author Davide Mancusi */ #ifndef G4INCLHASHING_HH_ #define G4INCLHASHING_HH_ #ifdef INCLXX_IN_GEANT4_MODE #define INCL_CACHING_CLUSTERING_MODEL_INTERCOMPARISON_Set 1 #endif // INCLXX_IN_GEANT4_MODE #ifdef INCL_CACHING_CLUSTERING_MODEL_INTERCOMPARISON_HashMask #include #include #include // #include namespace G4INCL { namespace Hashing { typedef G4int NucleonItem; // the C++ standard guarantees that unsigned long is at least 32-bit long typedef unsigned long HashType; /* Depending on the size of the HashType type, we use 32-bit or 64-bit * binary masks. 64-bit masks guarantee lower collision rates (about a * factor of 3). Checks are done using compile-time constants defined in * the standard header. */ namespace { const G4int maskTableSize = 500; HashType mask[maskTableSize] = { #if ULONG_MAX >= 18446744073709551615UL // 2^64-1 // unsigned longs have at least 64 bits here 4702504706864814267UL, 15867743096752998125UL, 1925133831785711339UL, 3063678697824149615UL, 3234475698548538313UL, 7917662962824220875UL, 9924018995951912525UL, 4682901166658838314UL, 981361508296534881UL, 18376824469534567556UL, 5343971687892173674UL, 10169451505660710328UL, 7865786236744900341UL, 10279352445822536091UL, 7089630702066408548UL, 4808534960882600398UL, 12538238618753707399UL, 16091508301730012097UL, 14073498192850855514UL, 9966250765115558375UL, 5718582854016674314UL, 5837057680281951483UL, 1596870119086046964UL, 15866877264435719977UL, 12743659579234384899UL, 13589152059793213451UL, 3364441792317801205UL, 17190534087980602002UL, 2252844317879582875UL, 16883577324406774376UL, 15985239218161130895UL, 3661288085782215193UL, 17294313791381397188UL, 9405115097872546015UL, 2834208340246893214UL, 15589349083551097162UL, 7475687940900359446UL, 2706367355862311522UL, 17987211229193808759UL, 6863833750504706813UL, 3685392250678121047UL, 11759380240055300923UL, 13403449794574083242UL, 1985973959990096358UL, 15223952677867744295UL, 6118509595165778043UL, 815155895778500187UL, 18185573450595916074UL, 5501350898920817482UL, 382043392356382894UL, 7212372096396984419UL, 17216082813533838272UL, 11664929762302443627UL, 12742534429666211769UL, 10885936672907243422UL, 7408809357861601856UL, 7235809803254354851UL, 10923449527984005964UL, 11846584293234382222UL, 10656509822128626836UL, 2129734486054336774UL, 4595091378435214061UL, 9874818728883580365UL, 5946304945334907747UL, 10039693308935676801UL, 13281974385330546238UL, 18100260506304059768UL, 2874169620796400411UL, 7108218580097801290UL, 1609767302727070556UL, 11296708194993589343UL, 13937355006285948174UL, 4714440178991372538UL, 16551309706022489963UL, 10000176812340548792UL, 11878058786115320873UL, 17227685596830233118UL, 6913194524255335692UL, 8581157771211862326UL, 7692516248830269819UL, 4834805303668841320UL, 17683695285788382628UL, 3163270552620053128UL, 7501354178009882428UL, 18032292064795682158UL, 14903091228667847945UL, 12658813769564311973UL, 11071671991853641692UL, 1898680911275368123UL, 11850012838739454071UL, 11605340059702017433UL, 1993475538032240150UL, 14225643076178260981UL, 6073746146812460969UL, 10427646200541715974UL, 8534830515125041658UL, 12137748989343460832UL, 401619354176178507UL, 10566842722928406433UL, 2726007197202736953UL, 12070986965363522186UL, 14306741808513945796UL, 9411600548893210409UL, 10677814577847517837UL, 2524629524427176799UL, 13769537677295179355UL, 2202164469715649820UL, 18048299992904550974UL, 11620367199819191275UL, 12863789957300408274UL, 9470331939464407385UL, 1530202837192022943UL, 8835064955139736011UL, 8145200231008682998UL, 7839809942742909916UL, 9138434136821323472UL, 14559393378324131957UL, 17365140272468484867UL, 12986052322695094991UL, 15032117076709947810UL, 3710476151324188272UL, 1301282554894996635UL, 10667152340954078766UL, 6983777770664759713UL, 16611664140947488647UL, 12136122930610106551UL, 15900825787656229127UL, 10248132639811024681UL, 11698219706208598358UL, 12307261434875431124UL, 14365082098869236341UL, 7765033571440697089UL, 14810290195054154855UL, 9618298383970391972UL, 5541541247731255102UL, 16567733959804019203UL, 17600930129818672877UL, 5232016726685772558UL, 226023602797856284UL, 3268675878373668427UL, 15412168229420758040UL, 9483353024934253554UL, 12957711733854877641UL, 13202855362863795860UL, 14659098127488639325UL, 5642266569510167780UL, 8405185641276686415UL, 12567678120796482638UL, 5572663458795121052UL, 11292924459778654315UL, 12907130784326268258UL, 2781503111506861655UL, 14052031913630628463UL, 7662091316495917798UL, 12388345726433231307UL, 2855096782092770172UL, 143760647337486211UL, 5268378935483038729UL, 14347085534022186031UL, 8226804542313416051UL, 503042565036387930UL, 13277939264481364629UL, 4807934385534294767UL, 6554792055682376182UL, 3505789456125861647UL, 17485983928210687457UL, 6551825177685364660UL, 6530399878351375719UL, 11618616536378075323UL, 8710939588645435621UL, 15913776342681996234UL, 12975832615100357766UL, 11385194348110364656UL, 7334273726237402463UL, 18215307287507846020UL, 108052987233117093UL, 14819872198639686030UL, 7651108032227837181UL, 7326148382022660565UL, 15520843621422491193UL, 14890169031248899249UL, 3302880341533628710UL, 17509231796729795392UL, 6938974810266312299UL, 9904104728819873047UL, 10277854813228565819UL, 8062859346560164933UL, 11953220042241400520UL, 8905905195342696566UL, 8620925171331846539UL, 15354008279539346333UL, 16255477929425666651UL, 15625465014312179739UL, 6560194503171884780UL, 458508474659358201UL, 11178141379033004711UL, 7025589002713530514UL, 6196040542056180472UL, 1771599404396005753UL, 490848885681539136UL, 15438702070227423706UL, 8790555204480314499UL, 6572556090639551862UL, 3282457245646221158UL, 4239195535437592000UL, 16001734625059485025UL, 14396081511655033925UL, 10261432601192522025UL, 9247260218125952769UL, 16080570631414044686UL, 15656989589485934942UL, 10761254633620277391UL, 1363122333823743651UL, 14847079675279608117UL, 6077849015756077442UL, 15290828636077500470UL, 220281240092237795UL, 15760968530563963031UL, 1364939791854189821UL, 5997510653682588941UL, 2006088633984038082UL, 1383498232486134285UL, 17859041093815211104UL, 15894184107946313879UL, 18173079296415961736UL, 3443997055549483358UL, 5294019672823936930UL, 1341830676613088487UL, 581727297735446503UL, 18219577357392561487UL, 17639313299012264080UL, 14222133713791167321UL, 5879505043799386532UL, 7557129766625449226UL, 13360075610958017985UL, 12724115904336527780UL, 16753075547920915484UL, 4116411708112171871UL, 16025692682808517910UL, 4003328942103420939UL, 9811320057930109787UL, 3576072849789367484UL, 17075748046009610792UL, 12833406223291392866UL, 9648248336540660688UL, 17476583957989300837UL, 16827359136787046510UL, 4345039153564047180UL, 1224716260729000059UL, 13959598322342824445UL, 10743140873520517726UL, 13340880620026565045UL, 9192556363923792986UL, 3841907957831078749UL, 246438482871824834UL, 4260787342534664069UL, 17100720253388227686UL, 11544966922599678750UL, 9293075407897592921UL, 1610905992411273162UL, 2239787421847352995UL, 15182496755963432304UL, 1823665993529743824UL, 7263153004799849282UL, 11497980475724160945UL, 1274355111868335897UL, 15057972526005432563UL, 11823052640709049475UL, 15927429045819933119UL, 14618154733049321749UL, 16861991482751749049UL, 5936874228331837512UL, 15290754097890487720UL, 9191375772889979508UL, 6816129633576113785UL, 12923817606396645484UL, 8875993281327238816UL, 123714282527043508UL, 7179882084825590703UL, 3925024599322075567UL, 2426048646574757412UL, 10665962527629258587UL, 12646312850531314143UL, 528129165734836933UL, 3701120955488573646UL, 15861534485058814280UL, 14022467189115595098UL, 9502851142036471883UL, 12432213096681522867UL, 751500370320404802UL, 1606345595406828785UL, 10313713517508959984UL, 6565609239876268324UL, 8654149379457545096UL, 6548830896464452248UL, 1464368532414012445UL, 4302937696445584032UL, 17063664947863781419UL, 8038577586991861682UL, 10951259595021013980UL, 7709630466255725074UL, 609806407111517279UL, 13860208046684354033UL, 15140303568956907423UL, 4803057729274452412UL, 4367455766719288283UL, 320027280359511727UL, 16020877306388137190UL, 3764882323315346488UL, 11972546313392727283UL, 7977601566213555124UL, 15148378244947865280UL, 4483722253329626321UL, 16560836625841776840UL, 14666077208671482135UL, 9298193298119711211UL, 12015014023744623893UL, 10191703760489555596UL, 1316913070589847725UL, 15881746492947991011UL, 13665807677473998048UL, 14390309917106480591UL, 17231567872468478469UL, 4562957401728953232UL, 11501454621029854493UL, 10252134323451005656UL, 12021948387925309670UL, 3525149157835967069UL, 10292558937206299109UL, 13725724605985217856UL, 175033751151696127UL, 14720951489402332470UL, 11927624343611332814UL, 567437266624809204UL, 14161392585443694227UL, 8725463779420655722UL, 12063468735510140344UL, 12026523736635889408UL, 16565599419781878456UL, 7086470817660744490UL, 14809513609573064984UL, 10898762682820885052UL, 13982083571459739493UL, 15656618354974864372UL, 4239583100143107224UL, 4322769551545487304UL, 13825585217369415084UL, 5136324433139686016UL, 8179080547263771206UL, 8279259187088296150UL, 6381371846375303738UL, 3142014871877744388UL, 3417815453103862427UL, 5556557018553548625UL, 7788492627093668219UL, 2446537327809742760UL, 7165731799178534002UL, 10969060298437286606UL, 16392640790529049402UL, 4905600830298563047UL, 12442106640046578583UL, 7139041375816724964UL, 18098103947732186633UL, 2078238351823174321UL, 9929562085097862277UL, 14231090695955652612UL, 16914810114016502414UL, 9172887937989634160UL, 10057184693043820912UL, 8739867056556181319UL, 1879322488574672564UL, 6706469496298082633UL, 17962793280504692541UL, 2796622365685518391UL, 14206454203780509608UL, 11911505185092294091UL, 13188421404411005493UL, 1002631262698104372UL, 16116424222649594941UL, 731059841323644991UL, 16630196285890835221UL, 6275370517569960592UL, 2762335813606797964UL, 1550415195017045798UL, 8084777285994689863UL, 4858045103923411134UL, 13517076072140006105UL, 16656029182431041189UL, 6076064496187725305UL, 15281271591975529160UL, 2275428871306187428UL, 15396744606475751109UL, 15460778948302864604UL, 6107847787338713474UL, 9357621545767658217UL, 4805014239018879550UL, 17869119773972988965UL, 17868495682315323441UL, 10660808254721474616UL, 7308276872489783138UL, 4234856545479982050UL, 1223334879029033304UL, 10995800624761949288UL, 16283797325974965665UL, 12410167362078398820UL, 12918484557456873081UL, 14423314551522087679UL, 4967867692111402622UL, 16197846038770304940UL, 11809884480603742831UL, 16802686488973843640UL, 2354077987008574056UL, 9978003576519895777UL, 5506048811554826358UL, 18433781523380564149UL, 4302137793340917657UL, 978195094879846769UL, 2377823329880292548UL, 3464291122006072777UL, 18046845603455616162UL, 13944776942598500463UL, 4000590694056817931UL, 496833875371241644UL, 16247695245933522501UL, 1505779951058046438UL, 11430822963532124358UL, 4729903064888922231UL, 8864507718425611027UL, 14643598183997536338UL, 4480511581250357378UL, 11133239898726463704UL, 17471052555928421508UL, 15541989708583753235UL, 7461560065837635158UL, 13956421526574063689UL, 3743280538841219763UL, 12020611143801404565UL, 6618703997501212010UL, 3729371474666129836UL, 17869245751809494685UL, 1833331385744685838UL, 1506104207003999508UL, 8158509169843256229UL, 10212507222875597491UL, 7211593336579637715UL, 14341253648497092530UL, 4511202703905924031UL, 8043833010361144102UL, 2512875450160943286UL, 18235665817864664213UL, 8317446467730476132UL, 11182884000969346056UL, 548357546399462395UL, 1960628024952592835UL, 4650095513901192085UL, 12679676177772217157UL, 3487733703240934135UL, 6446640077094538365UL, 1114715573562175630UL, 16622874083185883281UL, 17081932748524927392UL, 17192402071367355968UL, 15013800339030843048UL, 3718961432784285989UL, 14953817216655866296UL, 11410118254031919487UL, 17718071771819733200UL, 6970769915355275987UL, 14244261541942962860UL, 295778071941084510UL, 553041658124347434UL, 571128341496031343UL, 6867891970504820807UL, 16515587447694198371UL, 3932569386063656416UL, 15542525920467376967UL, 4513384432419818675UL, 7336705434792969335UL, 1342984449178439078UL, 10672151960711459277UL, 11668091039787926587UL, 15308742994910314323UL, 8337161158579684228UL, 5390473811288298369UL, 444117188512458090UL, 8602531868090961223UL, 1632809043568697774UL, 11829254858211213981UL, 4634227867572760505UL, 16086237486731074061UL, 4844172753138751369UL, 4992022238300904271UL, 11132360655811360102UL, 11660714643785469458UL, 2468480999090126185UL, 10912054708474512716UL, 12659667168896228555UL, 11988368921832936489UL, 5116996783249524791UL, 253818271896405507UL #else // ULONG_MAX >= 18446744073709551615 // unsigned longs have less than 64 bits here 4218046471UL, 1917139952UL, 2103556369UL, 1588695878UL, 4215491346UL, 216507845UL, 2296134958UL, 1868314761UL, 3228779327UL, 1785085484UL, 4228225705UL, 1165369009UL, 3142089765UL, 431503981UL, 3369606777UL, 745480828UL, 2744780773UL, 689045082UL, 1900506313UL, 2497498204UL, 368683604UL, 2225005389UL, 781333974UL, 4132002528UL, 2847677322UL, 343783736UL, 2901322050UL, 3337243677UL, 1665993590UL, 233599841UL, 1022462535UL, 1680112766UL, 500144658UL, 3013714463UL, 1102944137UL, 424404167UL, 1616048503UL, 3058072676UL, 2626558419UL, 2270217197UL, 1042360030UL, 1406615072UL, 2817651072UL, 3066388841UL, 3595996753UL, 2530300747UL, 1068533293UL, 3850615434UL, 2000952241UL, 500251219UL, 2785863467UL, 116749905UL, 2534901578UL, 2762569636UL, 441176494UL, 3611264136UL, 708254627UL, 3107133154UL, 3498823450UL, 3710248321UL, 3408201403UL, 2483680087UL, 1593406496UL, 2358632005UL, 1113775647UL, 1296788200UL, 866750108UL, 1511795181UL, 2007682240UL, 1383572622UL, 2747177348UL, 751086457UL, 3862498228UL, 1330825518UL, 1893848486UL, 3716728436UL, 257714096UL, 1129572537UL, 3411765329UL, 1445308638UL, 1675128925UL, 1177771214UL, 610662193UL, 308703855UL, 3766028156UL, 2406778266UL, 1614133721UL, 3094138658UL, 644181699UL, 3585820756UL, 228354647UL, 3895845225UL, 837654579UL, 2423338235UL, 3626844735UL, 4004795529UL, 1966777404UL, 4099992662UL, 561993057UL, 478026097UL, 2726060916UL, 160900471UL, 4067242522UL, 2107667107UL, 2291883857UL, 3366222014UL, 804030225UL, 815232690UL, 4173469665UL, 3680594736UL, 1812916838UL, 953829049UL, 645064420UL, 893103776UL, 1484445384UL, 1704310224UL, 3169988691UL, 994674462UL, 3348302238UL, 420911742UL, 3997852732UL, 3006569532UL, 244288857UL, 3012303255UL, 3091414730UL, 3919806716UL, 815658776UL, 396540369UL, 2296675021UL, 3199014033UL, 2569108436UL, 3862344457UL, 4058338881UL, 1161706542UL, 2972997031UL, 2099532487UL, 160888949UL, 427549488UL, 3061518659UL, 66373532UL, 3444886884UL, 2530414305UL, 3380064368UL, 937051782UL, 1302891919UL, 2463653477UL, 3547879633UL, 2260320717UL, 832678359UL, 2453616965UL, 2193052461UL, 799622604UL, 3629014225UL, 1522933084UL, 2498150583UL, 1976833008UL, 1725662928UL, 1733324678UL, 3374380020UL, 818903650UL, 718472891UL, 411252729UL, 3187730653UL, 798673927UL, 1222802842UL, 1985038219UL, 1623995355UL, 2603784033UL, 4261727525UL, 3939193905UL, 2256923068UL, 507372076UL, 229897092UL, 3447212333UL, 1015331998UL, 1624914646UL, 3270616777UL, 1922996004UL, 2303929294UL, 3083527264UL, 3511924852UL, 651582997UL, 2830297570UL, 2541981492UL, 3229134142UL, 535111766UL, 2531439891UL, 1176474835UL, 1746643607UL, 196953906UL, 190859135UL, 1471944757UL, 3764050027UL, 2300961517UL, 1200836119UL, 1934885757UL, 1017153529UL, 864626426UL, 65215191UL, 3649915955UL, 2649000649UL, 3056185941UL, 2895789221UL, 2705123786UL, 3486894128UL, 1764275188UL, 800856520UL, 1121637219UL, 3470689154UL, 2031015368UL, 1799564405UL, 412027838UL, 3505785501UL, 819633830UL, 2841515279UL, 397789381UL, 3850545068UL, 4038096561UL, 702453020UL, 298184560UL, 1331143206UL, 3832472400UL, 483752162UL, 3365506546UL, 2403178818UL, 2588604760UL, 3630868707UL, 2672754775UL, 3834743541UL, 625254315UL, 3404805826UL, 2758773926UL, 3539158313UL, 1304746437UL, 4228336097UL, 1790470857UL, 2017211747UL, 2823780770UL, 1361022238UL, 2442638132UL, 3465700788UL, 2602256049UL, 61072285UL, 1290754848UL, 1365538365UL, 2885926246UL, 3366937675UL, 1976271220UL, 4274857987UL, 2846551234UL, 3730952612UL, 785655762UL, 2640747064UL, 2479569674UL, 2988213501UL, 238402214UL, 2736968438UL, 1273211556UL, 2993298676UL, 2076907296UL, 169664466UL, 3590743418UL, 2853715414UL, 1494116982UL, 3408636076UL, 1354085945UL, 2121174096UL, 557203192UL, 2005947221UL, 2790204730UL, 3673048078UL, 2710286579UL, 2759941695UL, 2554805430UL, 1565053908UL, 1516728908UL, 457211737UL, 4053842378UL, 1926452932UL, 121166907UL, 1884552326UL, 2050083102UL, 783329973UL, 1002934724UL, 2916755028UL, 1574390275UL, 4246041184UL, 112940213UL, 4213344814UL, 3831377539UL, 3593710048UL, 184196123UL, 62388243UL, 1824724968UL, 1553056630UL, 2471314862UL, 1580248726UL, 1641907471UL, 4182117804UL, 244827601UL, 2673787044UL, 1245428424UL, 1254024234UL, 1944146503UL, 2068525708UL, 1452126855UL, 1368763640UL, 2063660828UL, 306042674UL, 668216774UL, 2002594576UL, 3192370193UL, 4189750176UL, 1815590529UL, 2838559664UL, 3322933511UL, 708460425UL, 3093499804UL, 219970021UL, 2136064297UL, 1281979964UL, 3437613761UL, 544003806UL, 2998811936UL, 1481470929UL, 2880899873UL, 3617899122UL, 2269535287UL, 2964733041UL, 1437018425UL, 4136436935UL, 2892386937UL, 2312588208UL, 3470825412UL, 3048839250UL, 3124535567UL, 74106735UL, 740534715UL, 780483498UL, 1703009387UL, 3908417545UL, 2925498568UL, 570244170UL, 768611579UL, 2561901277UL, 3369289022UL, 298430172UL, 3399976658UL, 2781253163UL, 2203229433UL, 4083764265UL, 1813739940UL, 2495956219UL, 1733876904UL, 2961522297UL, 2806638528UL, 210215678UL, 3179651913UL, 3488143624UL, 2162063032UL, 2230441611UL, 3104777333UL, 1901009578UL, 2357529595UL, 1661659881UL, 2275001257UL, 1089779619UL, 1019581619UL, 3676689000UL, 2363224232UL, 3087179246UL, 2521585396UL, 1172580989UL, 3363959227UL, 1379171244UL, 2568664929UL, 2716951910UL, 634711458UL, 1881366407UL, 2339310622UL, 1437137856UL, 775517573UL, 2403816337UL, 3643691625UL, 2796142813UL, 2636271743UL, 3548645335UL, 2401818065UL, 1430955355UL, 1529261488UL, 2672050975UL, 1824816344UL, 437321422UL, 1010469737UL, 975873927UL, 3808619211UL, 1306922849UL, 2306306586UL, 3492263153UL, 915764428UL, 4049080639UL, 2584666827UL, 2248503228UL, 1156685342UL, 3545089377UL, 2927987815UL, 1188340469UL, 1983809416UL, 2359080396UL, 3026745995UL, 1020085481UL, 2455748822UL, 2973731428UL, 1685598150UL, 2459914554UL, 222412187UL, 1550326895UL, 3808681066UL, 910364646UL, 4011483211UL, 3449464402UL, 3094973082UL, 3370230650UL, 1693151952UL, 3574854040UL, 3557103099UL, 4108399894UL, 3762036621UL, 2337346271UL, 1005455572UL, 3860207735UL, 1771002576UL, 199004943UL, 1578846676UL, 2676995104UL, 4076948954UL, 830057378UL, 459065499UL, 3804368733UL, 3499868406UL, 852696530UL, 514613423UL, 1584281952UL, 985799155UL, 1895009366UL, 3825253357UL, 1782693174UL, 2196979238UL, 1308429445UL, 2960767408UL, 2285337396UL, 2065293874UL, 1306724979UL, 4056398081UL, 4047112430UL, 3606840914UL, 3117829644UL, 3877872838UL, 3297977849UL, 336255855UL, 3794593369UL, 2534532716UL, 3726226824UL, 2067902083UL, 1289138711UL, 615241845UL, 3711156810UL, 4069284324UL, 3829237942UL, 3615667378UL, 750506440UL, 3851304132UL, 1159089146UL, 2459260597UL, 2955574874UL, 1775846339UL, 1872505027UL, 3021810567UL, 2498812392UL, 2388439890UL, 3509540924UL, 4132084900UL, 1762358900UL, 3005639020UL, 961559514UL, 5499771UL, 2114442568UL, 2725996306UL, 2213448586UL, 3041192141UL, 2318358424UL, 4199956637UL, 508024672UL, 2898231491UL, 985807031UL, 3712119117UL, 487464412UL, 1443950379UL, 2897942828UL, 2942321529UL #endif }; /// \brief Helper function for hashing inline HashType xorrer(HashType const &l, NucleonItem const &r) { return l^mask[r]; } } /** \brief Compute the hash of a nucleon configuration * * The hash is computed as * * \f[ \mathrm{mask}_{i_1} \oplus \mathrm{mask}_{i_2} \oplus \ldots \oplus \mathrm{mask}_{i_n} \f] * * where \f$\oplus\f$ represents logical exclusive OR (XOR), \f$i_1,\ldots, * i_n\f$ represent the indices of the nucleons in the * ClusteringModelIntercomparison::consideredPartners * array, and \f$\mathrm{mask}_i\f$ is a static look-up table of 500 * \f$n\f$-bit integers such that their binary representations have exactly * \f$n/2\f$ true bits and \f$n/2\f$ false bits, at random positions. The * value of \f$n\f$ is 32 if unsigned longs are less than 64-bit wide, and * 64 otherwise. * * Folding the mask values using XOR has two advantages: first, XOR is a * commutative operation, so the result is independent of the order in * which the nucleons appear in the configuration (which is what we want). * Second, it's very fast. Profiling shows that the time spent hashing * configurations is negligible compared to the time spent evaluating * phase-space proximity. */ inline HashType hashConfig(NucleonItem *config, G4int n) { // assert(n