12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743 |
- // -*- C++ -*-
- //===--------------------------- random -----------------------------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #ifndef _LIBCPP_RANDOM
- #define _LIBCPP_RANDOM
- /*
- random synopsis
- #include <initializer_list>
- namespace std
- {
- // Engines
- template <class UIntType, UIntType a, UIntType c, UIntType m>
- class linear_congruential_engine
- {
- public:
- // types
- typedef UIntType result_type;
- // engine characteristics
- static constexpr result_type multiplier = a;
- static constexpr result_type increment = c;
- static constexpr result_type modulus = m;
- static constexpr result_type min() { return c == 0u ? 1u: 0u;}
- static constexpr result_type max() { return m - 1u;}
- static constexpr result_type default_seed = 1u;
- // constructors and seeding functions
- explicit linear_congruential_engine(result_type s = default_seed);
- template<class Sseq> explicit linear_congruential_engine(Sseq& q);
- void seed(result_type s = default_seed);
- template<class Sseq> void seed(Sseq& q);
- // generating functions
- result_type operator()();
- void discard(unsigned long long z);
- };
- template <class UIntType, UIntType a, UIntType c, UIntType m>
- bool
- operator==(const linear_congruential_engine<UIntType, a, c, m>& x,
- const linear_congruential_engine<UIntType, a, c, m>& y);
- template <class UIntType, UIntType a, UIntType c, UIntType m>
- bool
- operator!=(const linear_congruential_engine<UIntType, a, c, m>& x,
- const linear_congruential_engine<UIntType, a, c, m>& y);
- template <class charT, class traits,
- class UIntType, UIntType a, UIntType c, UIntType m>
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const linear_congruential_engine<UIntType, a, c, m>& x);
- template <class charT, class traits,
- class UIntType, UIntType a, UIntType c, UIntType m>
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- linear_congruential_engine<UIntType, a, c, m>& x);
- template <class UIntType, size_t w, size_t n, size_t m, size_t r,
- UIntType a, size_t u, UIntType d, size_t s,
- UIntType b, size_t t, UIntType c, size_t l, UIntType f>
- class mersenne_twister_engine
- {
- public:
- // types
- typedef UIntType result_type;
- // engine characteristics
- static constexpr size_t word_size = w;
- static constexpr size_t state_size = n;
- static constexpr size_t shift_size = m;
- static constexpr size_t mask_bits = r;
- static constexpr result_type xor_mask = a;
- static constexpr size_t tempering_u = u;
- static constexpr result_type tempering_d = d;
- static constexpr size_t tempering_s = s;
- static constexpr result_type tempering_b = b;
- static constexpr size_t tempering_t = t;
- static constexpr result_type tempering_c = c;
- static constexpr size_t tempering_l = l;
- static constexpr result_type initialization_multiplier = f;
- static constexpr result_type min () { return 0; }
- static constexpr result_type max() { return 2^w - 1; }
- static constexpr result_type default_seed = 5489u;
- // constructors and seeding functions
- explicit mersenne_twister_engine(result_type value = default_seed);
- template<class Sseq> explicit mersenne_twister_engine(Sseq& q);
- void seed(result_type value = default_seed);
- template<class Sseq> void seed(Sseq& q);
- // generating functions
- result_type operator()();
- void discard(unsigned long long z);
- };
- template <class UIntType, size_t w, size_t n, size_t m, size_t r,
- UIntType a, size_t u, UIntType d, size_t s,
- UIntType b, size_t t, UIntType c, size_t l, UIntType f>
- bool
- operator==(
- const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x,
- const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& y);
- template <class UIntType, size_t w, size_t n, size_t m, size_t r,
- UIntType a, size_t u, UIntType d, size_t s,
- UIntType b, size_t t, UIntType c, size_t l, UIntType f>
- bool
- operator!=(
- const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x,
- const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& y);
- template <class charT, class traits,
- class UIntType, size_t w, size_t n, size_t m, size_t r,
- UIntType a, size_t u, UIntType d, size_t s,
- UIntType b, size_t t, UIntType c, size_t l, UIntType f>
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x);
- template <class charT, class traits,
- class UIntType, size_t w, size_t n, size_t m, size_t r,
- UIntType a, size_t u, UIntType d, size_t s,
- UIntType b, size_t t, UIntType c, size_t l, UIntType f>
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x);
- template<class UIntType, size_t w, size_t s, size_t r>
- class subtract_with_carry_engine
- {
- public:
- // types
- typedef UIntType result_type;
- // engine characteristics
- static constexpr size_t word_size = w;
- static constexpr size_t short_lag = s;
- static constexpr size_t long_lag = r;
- static constexpr result_type min() { return 0; }
- static constexpr result_type max() { return m-1; }
- static constexpr result_type default_seed = 19780503u;
- // constructors and seeding functions
- explicit subtract_with_carry_engine(result_type value = default_seed);
- template<class Sseq> explicit subtract_with_carry_engine(Sseq& q);
- void seed(result_type value = default_seed);
- template<class Sseq> void seed(Sseq& q);
- // generating functions
- result_type operator()();
- void discard(unsigned long long z);
- };
- template<class UIntType, size_t w, size_t s, size_t r>
- bool
- operator==(
- const subtract_with_carry_engine<UIntType, w, s, r>& x,
- const subtract_with_carry_engine<UIntType, w, s, r>& y);
- template<class UIntType, size_t w, size_t s, size_t r>
- bool
- operator!=(
- const subtract_with_carry_engine<UIntType, w, s, r>& x,
- const subtract_with_carry_engine<UIntType, w, s, r>& y);
- template <class charT, class traits,
- class UIntType, size_t w, size_t s, size_t r>
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const subtract_with_carry_engine<UIntType, w, s, r>& x);
- template <class charT, class traits,
- class UIntType, size_t w, size_t s, size_t r>
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- subtract_with_carry_engine<UIntType, w, s, r>& x);
- template<class Engine, size_t p, size_t r>
- class discard_block_engine
- {
- public:
- // types
- typedef typename Engine::result_type result_type;
- // engine characteristics
- static constexpr size_t block_size = p;
- static constexpr size_t used_block = r;
- static constexpr result_type min() { return Engine::min(); }
- static constexpr result_type max() { return Engine::max(); }
- // constructors and seeding functions
- discard_block_engine();
- explicit discard_block_engine(const Engine& e);
- explicit discard_block_engine(Engine&& e);
- explicit discard_block_engine(result_type s);
- template<class Sseq> explicit discard_block_engine(Sseq& q);
- void seed();
- void seed(result_type s);
- template<class Sseq> void seed(Sseq& q);
- // generating functions
- result_type operator()();
- void discard(unsigned long long z);
- // property functions
- const Engine& base() const noexcept;
- };
- template<class Engine, size_t p, size_t r>
- bool
- operator==(
- const discard_block_engine<Engine, p, r>& x,
- const discard_block_engine<Engine, p, r>& y);
- template<class Engine, size_t p, size_t r>
- bool
- operator!=(
- const discard_block_engine<Engine, p, r>& x,
- const discard_block_engine<Engine, p, r>& y);
- template <class charT, class traits,
- class Engine, size_t p, size_t r>
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const discard_block_engine<Engine, p, r>& x);
- template <class charT, class traits,
- class Engine, size_t p, size_t r>
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- discard_block_engine<Engine, p, r>& x);
- template<class Engine, size_t w, class UIntType>
- class independent_bits_engine
- {
- public:
- // types
- typedef UIntType result_type;
- // engine characteristics
- static constexpr result_type min() { return 0; }
- static constexpr result_type max() { return 2^w - 1; }
- // constructors and seeding functions
- independent_bits_engine();
- explicit independent_bits_engine(const Engine& e);
- explicit independent_bits_engine(Engine&& e);
- explicit independent_bits_engine(result_type s);
- template<class Sseq> explicit independent_bits_engine(Sseq& q);
- void seed();
- void seed(result_type s);
- template<class Sseq> void seed(Sseq& q);
- // generating functions
- result_type operator()(); void discard(unsigned long long z);
- // property functions
- const Engine& base() const noexcept;
- };
- template<class Engine, size_t w, class UIntType>
- bool
- operator==(
- const independent_bits_engine<Engine, w, UIntType>& x,
- const independent_bits_engine<Engine, w, UIntType>& y);
- template<class Engine, size_t w, class UIntType>
- bool
- operator!=(
- const independent_bits_engine<Engine, w, UIntType>& x,
- const independent_bits_engine<Engine, w, UIntType>& y);
- template <class charT, class traits,
- class Engine, size_t w, class UIntType>
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const independent_bits_engine<Engine, w, UIntType>& x);
- template <class charT, class traits,
- class Engine, size_t w, class UIntType>
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- independent_bits_engine<Engine, w, UIntType>& x);
- template<class Engine, size_t k>
- class shuffle_order_engine
- {
- public:
- // types
- typedef typename Engine::result_type result_type;
- // engine characteristics
- static constexpr size_t table_size = k;
- static constexpr result_type min() { return Engine::min; }
- static constexpr result_type max() { return Engine::max; }
- // constructors and seeding functions
- shuffle_order_engine();
- explicit shuffle_order_engine(const Engine& e);
- explicit shuffle_order_engine(Engine&& e);
- explicit shuffle_order_engine(result_type s);
- template<class Sseq> explicit shuffle_order_engine(Sseq& q);
- void seed();
- void seed(result_type s);
- template<class Sseq> void seed(Sseq& q);
- // generating functions
- result_type operator()();
- void discard(unsigned long long z);
- // property functions
- const Engine& base() const noexcept;
- };
- template<class Engine, size_t k>
- bool
- operator==(
- const shuffle_order_engine<Engine, k>& x,
- const shuffle_order_engine<Engine, k>& y);
- template<class Engine, size_t k>
- bool
- operator!=(
- const shuffle_order_engine<Engine, k>& x,
- const shuffle_order_engine<Engine, k>& y);
- template <class charT, class traits,
- class Engine, size_t k>
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const shuffle_order_engine<Engine, k>& x);
- template <class charT, class traits,
- class Engine, size_t k>
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- shuffle_order_engine<Engine, k>& x);
- typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>
- minstd_rand0;
- typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647>
- minstd_rand;
- typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31,
- 0x9908b0df,
- 11, 0xffffffff,
- 7, 0x9d2c5680,
- 15, 0xefc60000,
- 18, 1812433253> mt19937;
- typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31,
- 0xb5026f5aa96619e9,
- 29, 0x5555555555555555,
- 17, 0x71d67fffeda60000,
- 37, 0xfff7eee000000000,
- 43, 6364136223846793005> mt19937_64;
- typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base;
- typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base;
- typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
- typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
- typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;
- typedef minstd_rand default_random_engine;
- // Generators
- class random_device
- {
- public:
- // types
- typedef unsigned int result_type;
- // generator characteristics
- static constexpr result_type min() { return numeric_limits<result_type>::min(); }
- static constexpr result_type max() { return numeric_limits<result_type>::max(); }
- // constructors
- explicit random_device(const string& token = "/dev/urandom");
- // generating functions
- result_type operator()();
- // property functions
- double entropy() const noexcept;
- // no copy functions
- random_device(const random_device& ) = delete;
- void operator=(const random_device& ) = delete;
- };
- // Utilities
- class seed_seq
- {
- public:
- // types
- typedef uint_least32_t result_type;
- // constructors
- seed_seq();
- template<class T>
- seed_seq(initializer_list<T> il);
- template<class InputIterator>
- seed_seq(InputIterator begin, InputIterator end);
- // generating functions
- template<class RandomAccessIterator>
- void generate(RandomAccessIterator begin, RandomAccessIterator end);
- // property functions
- size_t size() const;
- template<class OutputIterator>
- void param(OutputIterator dest) const;
- // no copy functions
- seed_seq(const seed_seq&) = delete;
- void operator=(const seed_seq& ) = delete;
- };
- template<class RealType, size_t bits, class URNG>
- RealType generate_canonical(URNG& g);
- // Distributions
- template<class IntType = int>
- class uniform_int_distribution
- {
- public:
- // types
- typedef IntType result_type;
- class param_type
- {
- public:
- typedef uniform_int_distribution distribution_type;
- explicit param_type(IntType a = 0,
- IntType b = numeric_limits<IntType>::max());
- result_type a() const;
- result_type b() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructors and reset functions
- explicit uniform_int_distribution(IntType a = 0,
- IntType b = numeric_limits<IntType>::max());
- explicit uniform_int_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type a() const;
- result_type b() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const uniform_int_distribution& x,
- const uniform_int_distribution& y);
- friend bool operator!=(const uniform_int_distribution& x,
- const uniform_int_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const uniform_int_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- uniform_int_distribution& x);
- };
- template<class RealType = double>
- class uniform_real_distribution
- {
- public:
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef uniform_real_distribution distribution_type;
- explicit param_type(RealType a = 0,
- RealType b = 1);
- result_type a() const;
- result_type b() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructors and reset functions
- explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
- explicit uniform_real_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type a() const;
- result_type b() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const uniform_real_distribution& x,
- const uniform_real_distribution& y);
- friend bool operator!=(const uniform_real_distribution& x,
- const uniform_real_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const uniform_real_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- uniform_real_distribution& x);
- };
- class bernoulli_distribution
- {
- public:
- // types
- typedef bool result_type;
- class param_type
- {
- public:
- typedef bernoulli_distribution distribution_type;
- explicit param_type(double p = 0.5);
- double p() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructors and reset functions
- explicit bernoulli_distribution(double p = 0.5);
- explicit bernoulli_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- double p() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const bernoulli_distribution& x,
- const bernoulli_distribution& y);
- friend bool operator!=(const bernoulli_distribution& x,
- const bernoulli_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const bernoulli_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- bernoulli_distribution& x);
- };
- template<class IntType = int>
- class binomial_distribution
- {
- public:
- // types
- typedef IntType result_type;
- class param_type
- {
- public:
- typedef binomial_distribution distribution_type;
- explicit param_type(IntType t = 1, double p = 0.5);
- IntType t() const;
- double p() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructors and reset functions
- explicit binomial_distribution(IntType t = 1, double p = 0.5);
- explicit binomial_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- IntType t() const;
- double p() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const binomial_distribution& x,
- const binomial_distribution& y);
- friend bool operator!=(const binomial_distribution& x,
- const binomial_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const binomial_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- binomial_distribution& x);
- };
- template<class IntType = int>
- class geometric_distribution
- {
- public:
- // types
- typedef IntType result_type;
- class param_type
- {
- public:
- typedef geometric_distribution distribution_type;
- explicit param_type(double p = 0.5);
- double p() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructors and reset functions
- explicit geometric_distribution(double p = 0.5);
- explicit geometric_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- double p() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const geometric_distribution& x,
- const geometric_distribution& y);
- friend bool operator!=(const geometric_distribution& x,
- const geometric_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const geometric_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- geometric_distribution& x);
- };
- template<class IntType = int>
- class negative_binomial_distribution
- {
- public:
- // types
- typedef IntType result_type;
- class param_type
- {
- public:
- typedef negative_binomial_distribution distribution_type;
- explicit param_type(result_type k = 1, double p = 0.5);
- result_type k() const;
- double p() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructor and reset functions
- explicit negative_binomial_distribution(result_type k = 1, double p = 0.5);
- explicit negative_binomial_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type k() const;
- double p() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const negative_binomial_distribution& x,
- const negative_binomial_distribution& y);
- friend bool operator!=(const negative_binomial_distribution& x,
- const negative_binomial_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const negative_binomial_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- negative_binomial_distribution& x);
- };
- template<class IntType = int>
- class poisson_distribution
- {
- public:
- // types
- typedef IntType result_type;
- class param_type
- {
- public:
- typedef poisson_distribution distribution_type;
- explicit param_type(double mean = 1.0);
- double mean() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructors and reset functions
- explicit poisson_distribution(double mean = 1.0);
- explicit poisson_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- double mean() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const poisson_distribution& x,
- const poisson_distribution& y);
- friend bool operator!=(const poisson_distribution& x,
- const poisson_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const poisson_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- poisson_distribution& x);
- };
- template<class RealType = double>
- class exponential_distribution
- {
- public:
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef exponential_distribution distribution_type;
- explicit param_type(result_type lambda = 1.0);
- result_type lambda() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructors and reset functions
- explicit exponential_distribution(result_type lambda = 1.0);
- explicit exponential_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type lambda() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const exponential_distribution& x,
- const exponential_distribution& y);
- friend bool operator!=(const exponential_distribution& x,
- const exponential_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const exponential_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- exponential_distribution& x);
- };
- template<class RealType = double>
- class gamma_distribution
- {
- public:
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef gamma_distribution distribution_type;
- explicit param_type(result_type alpha = 1, result_type beta = 1);
- result_type alpha() const;
- result_type beta() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructors and reset functions
- explicit gamma_distribution(result_type alpha = 1, result_type beta = 1);
- explicit gamma_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type alpha() const;
- result_type beta() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const gamma_distribution& x,
- const gamma_distribution& y);
- friend bool operator!=(const gamma_distribution& x,
- const gamma_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const gamma_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- gamma_distribution& x);
- };
- template<class RealType = double>
- class weibull_distribution
- {
- public:
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef weibull_distribution distribution_type;
- explicit param_type(result_type alpha = 1, result_type beta = 1);
- result_type a() const;
- result_type b() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructor and reset functions
- explicit weibull_distribution(result_type a = 1, result_type b = 1);
- explicit weibull_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type a() const;
- result_type b() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const weibull_distribution& x,
- const weibull_distribution& y);
- friend bool operator!=(const weibull_distribution& x,
- const weibull_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const weibull_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- weibull_distribution& x);
- };
- template<class RealType = double>
- class extreme_value_distribution
- {
- public:
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef extreme_value_distribution distribution_type;
- explicit param_type(result_type a = 0, result_type b = 1);
- result_type a() const;
- result_type b() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructor and reset functions
- explicit extreme_value_distribution(result_type a = 0, result_type b = 1);
- explicit extreme_value_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type a() const;
- result_type b() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const extreme_value_distribution& x,
- const extreme_value_distribution& y);
- friend bool operator!=(const extreme_value_distribution& x,
- const extreme_value_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const extreme_value_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- extreme_value_distribution& x);
- };
- template<class RealType = double>
- class normal_distribution
- {
- public:
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef normal_distribution distribution_type;
- explicit param_type(result_type mean = 0, result_type stddev = 1);
- result_type mean() const;
- result_type stddev() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructors and reset functions
- explicit normal_distribution(result_type mean = 0, result_type stddev = 1);
- explicit normal_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type mean() const;
- result_type stddev() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const normal_distribution& x,
- const normal_distribution& y);
- friend bool operator!=(const normal_distribution& x,
- const normal_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const normal_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- normal_distribution& x);
- };
- template<class RealType = double>
- class lognormal_distribution
- {
- public:
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef lognormal_distribution distribution_type;
- explicit param_type(result_type m = 0, result_type s = 1);
- result_type m() const;
- result_type s() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructor and reset functions
- explicit lognormal_distribution(result_type m = 0, result_type s = 1);
- explicit lognormal_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type m() const;
- result_type s() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const lognormal_distribution& x,
- const lognormal_distribution& y);
- friend bool operator!=(const lognormal_distribution& x,
- const lognormal_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const lognormal_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- lognormal_distribution& x);
- };
- template<class RealType = double>
- class chi_squared_distribution
- {
- public:
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef chi_squared_distribution distribution_type;
- explicit param_type(result_type n = 1);
- result_type n() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructor and reset functions
- explicit chi_squared_distribution(result_type n = 1);
- explicit chi_squared_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type n() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const chi_squared_distribution& x,
- const chi_squared_distribution& y);
- friend bool operator!=(const chi_squared_distribution& x,
- const chi_squared_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const chi_squared_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- chi_squared_distribution& x);
- };
- template<class RealType = double>
- class cauchy_distribution
- {
- public:
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef cauchy_distribution distribution_type;
- explicit param_type(result_type a = 0, result_type b = 1);
- result_type a() const;
- result_type b() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructor and reset functions
- explicit cauchy_distribution(result_type a = 0, result_type b = 1);
- explicit cauchy_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type a() const;
- result_type b() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const cauchy_distribution& x,
- const cauchy_distribution& y);
- friend bool operator!=(const cauchy_distribution& x,
- const cauchy_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const cauchy_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- cauchy_distribution& x);
- };
- template<class RealType = double>
- class fisher_f_distribution
- {
- public:
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef fisher_f_distribution distribution_type;
- explicit param_type(result_type m = 1, result_type n = 1);
- result_type m() const;
- result_type n() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructor and reset functions
- explicit fisher_f_distribution(result_type m = 1, result_type n = 1);
- explicit fisher_f_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type m() const;
- result_type n() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const fisher_f_distribution& x,
- const fisher_f_distribution& y);
- friend bool operator!=(const fisher_f_distribution& x,
- const fisher_f_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const fisher_f_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- fisher_f_distribution& x);
- };
- template<class RealType = double>
- class student_t_distribution
- {
- public:
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef student_t_distribution distribution_type;
- explicit param_type(result_type n = 1);
- result_type n() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructor and reset functions
- explicit student_t_distribution(result_type n = 1);
- explicit student_t_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- result_type n() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const student_t_distribution& x,
- const student_t_distribution& y);
- friend bool operator!=(const student_t_distribution& x,
- const student_t_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const student_t_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- student_t_distribution& x);
- };
- template<class IntType = int>
- class discrete_distribution
- {
- public:
- // types
- typedef IntType result_type;
- class param_type
- {
- public:
- typedef discrete_distribution distribution_type;
- param_type();
- template<class InputIterator>
- param_type(InputIterator firstW, InputIterator lastW);
- param_type(initializer_list<double> wl);
- template<class UnaryOperation>
- param_type(size_t nw, double xmin, double xmax, UnaryOperation fw);
- vector<double> probabilities() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructor and reset functions
- discrete_distribution();
- template<class InputIterator>
- discrete_distribution(InputIterator firstW, InputIterator lastW);
- discrete_distribution(initializer_list<double> wl);
- template<class UnaryOperation>
- discrete_distribution(size_t nw, double xmin, double xmax,
- UnaryOperation fw);
- explicit discrete_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- vector<double> probabilities() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const discrete_distribution& x,
- const discrete_distribution& y);
- friend bool operator!=(const discrete_distribution& x,
- const discrete_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const discrete_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- discrete_distribution& x);
- };
- template<class RealType = double>
- class piecewise_constant_distribution
- {
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef piecewise_constant_distribution distribution_type;
- param_type();
- template<class InputIteratorB, class InputIteratorW>
- param_type(InputIteratorB firstB, InputIteratorB lastB,
- InputIteratorW firstW);
- template<class UnaryOperation>
- param_type(initializer_list<result_type> bl, UnaryOperation fw);
- template<class UnaryOperation>
- param_type(size_t nw, result_type xmin, result_type xmax,
- UnaryOperation fw);
- vector<result_type> intervals() const;
- vector<result_type> densities() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructor and reset functions
- piecewise_constant_distribution();
- template<class InputIteratorB, class InputIteratorW>
- piecewise_constant_distribution(InputIteratorB firstB,
- InputIteratorB lastB,
- InputIteratorW firstW);
- template<class UnaryOperation>
- piecewise_constant_distribution(initializer_list<result_type> bl,
- UnaryOperation fw);
- template<class UnaryOperation>
- piecewise_constant_distribution(size_t nw, result_type xmin,
- result_type xmax, UnaryOperation fw);
- explicit piecewise_constant_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- vector<result_type> intervals() const;
- vector<result_type> densities() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const piecewise_constant_distribution& x,
- const piecewise_constant_distribution& y);
- friend bool operator!=(const piecewise_constant_distribution& x,
- const piecewise_constant_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const piecewise_constant_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- piecewise_constant_distribution& x);
- };
- template<class RealType = double>
- class piecewise_linear_distribution
- {
- // types
- typedef RealType result_type;
- class param_type
- {
- public:
- typedef piecewise_linear_distribution distribution_type;
- param_type();
- template<class InputIteratorB, class InputIteratorW>
- param_type(InputIteratorB firstB, InputIteratorB lastB,
- InputIteratorW firstW);
- template<class UnaryOperation>
- param_type(initializer_list<result_type> bl, UnaryOperation fw);
- template<class UnaryOperation>
- param_type(size_t nw, result_type xmin, result_type xmax,
- UnaryOperation fw);
- vector<result_type> intervals() const;
- vector<result_type> densities() const;
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
- // constructor and reset functions
- piecewise_linear_distribution();
- template<class InputIteratorB, class InputIteratorW>
- piecewise_linear_distribution(InputIteratorB firstB,
- InputIteratorB lastB,
- InputIteratorW firstW);
- template<class UnaryOperation>
- piecewise_linear_distribution(initializer_list<result_type> bl,
- UnaryOperation fw);
- template<class UnaryOperation>
- piecewise_linear_distribution(size_t nw, result_type xmin,
- result_type xmax, UnaryOperation fw);
- explicit piecewise_linear_distribution(const param_type& parm);
- void reset();
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
- // property functions
- vector<result_type> intervals() const;
- vector<result_type> densities() const;
- param_type param() const;
- void param(const param_type& parm);
- result_type min() const;
- result_type max() const;
- friend bool operator==(const piecewise_linear_distribution& x,
- const piecewise_linear_distribution& y);
- friend bool operator!=(const piecewise_linear_distribution& x,
- const piecewise_linear_distribution& y);
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const piecewise_linear_distribution& x);
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- piecewise_linear_distribution& x);
- };
- } // std
- */
- #include <__config>
- #include <cstddef>
- #include <cstdint>
- #include <cmath>
- #include <type_traits>
- #include <initializer_list>
- #include <limits>
- #include <algorithm>
- #include <numeric>
- #include <vector>
- #include <string>
- #include <istream>
- #include <ostream>
- #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
- #pragma GCC system_header
- #endif
- _LIBCPP_PUSH_MACROS
- #include <__undef_macros>
- _LIBCPP_BEGIN_NAMESPACE_STD
- // __is_seed_sequence
- template <class _Sseq, class _Engine>
- struct __is_seed_sequence
- {
- static _LIBCPP_CONSTEXPR const bool value =
- !is_convertible<_Sseq, typename _Engine::result_type>::value &&
- !is_same<typename remove_cv<_Sseq>::type, _Engine>::value;
- };
- // linear_congruential_engine
- template <unsigned long long __a, unsigned long long __c,
- unsigned long long __m, unsigned long long _Mp,
- bool _MightOverflow = (__a != 0 && __m != 0 && __m-1 > (_Mp-__c)/__a)>
- struct __lce_ta;
- // 64
- template <unsigned long long __a, unsigned long long __c, unsigned long long __m>
- struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), true>
- {
- typedef unsigned long long result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- // Schrage's algorithm
- const result_type __q = __m / __a;
- const result_type __r = __m % __a;
- const result_type __t0 = __a * (__x % __q);
- const result_type __t1 = __r * (__x / __q);
- __x = __t0 + (__t0 < __t1) * __m - __t1;
- __x += __c - (__x >= __m - __c) * __m;
- return __x;
- }
- };
- template <unsigned long long __a, unsigned long long __m>
- struct __lce_ta<__a, 0, __m, (unsigned long long)(~0), true>
- {
- typedef unsigned long long result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- // Schrage's algorithm
- const result_type __q = __m / __a;
- const result_type __r = __m % __a;
- const result_type __t0 = __a * (__x % __q);
- const result_type __t1 = __r * (__x / __q);
- __x = __t0 + (__t0 < __t1) * __m - __t1;
- return __x;
- }
- };
- template <unsigned long long __a, unsigned long long __c, unsigned long long __m>
- struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), false>
- {
- typedef unsigned long long result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- return (__a * __x + __c) % __m;
- }
- };
- template <unsigned long long __a, unsigned long long __c>
- struct __lce_ta<__a, __c, 0, (unsigned long long)(~0), false>
- {
- typedef unsigned long long result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- return __a * __x + __c;
- }
- };
- // 32
- template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp>
- struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), true>
- {
- typedef unsigned result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- const result_type __a = static_cast<result_type>(_Ap);
- const result_type __c = static_cast<result_type>(_Cp);
- const result_type __m = static_cast<result_type>(_Mp);
- // Schrage's algorithm
- const result_type __q = __m / __a;
- const result_type __r = __m % __a;
- const result_type __t0 = __a * (__x % __q);
- const result_type __t1 = __r * (__x / __q);
- __x = __t0 + (__t0 < __t1) * __m - __t1;
- __x += __c - (__x >= __m - __c) * __m;
- return __x;
- }
- };
- template <unsigned long long _Ap, unsigned long long _Mp>
- struct __lce_ta<_Ap, 0, _Mp, unsigned(~0), true>
- {
- typedef unsigned result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- const result_type __a = static_cast<result_type>(_Ap);
- const result_type __m = static_cast<result_type>(_Mp);
- // Schrage's algorithm
- const result_type __q = __m / __a;
- const result_type __r = __m % __a;
- const result_type __t0 = __a * (__x % __q);
- const result_type __t1 = __r * (__x / __q);
- __x = __t0 + (__t0 < __t1) * __m - __t1;
- return __x;
- }
- };
- template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp>
- struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), false>
- {
- typedef unsigned result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- const result_type __a = static_cast<result_type>(_Ap);
- const result_type __c = static_cast<result_type>(_Cp);
- const result_type __m = static_cast<result_type>(_Mp);
- return (__a * __x + __c) % __m;
- }
- };
- template <unsigned long long _Ap, unsigned long long _Cp>
- struct __lce_ta<_Ap, _Cp, 0, unsigned(~0), false>
- {
- typedef unsigned result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- const result_type __a = static_cast<result_type>(_Ap);
- const result_type __c = static_cast<result_type>(_Cp);
- return __a * __x + __c;
- }
- };
- // 16
- template <unsigned long long __a, unsigned long long __c, unsigned long long __m, bool __b>
- struct __lce_ta<__a, __c, __m, (unsigned short)(~0), __b>
- {
- typedef unsigned short result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- return static_cast<result_type>(__lce_ta<__a, __c, __m, unsigned(~0)>::next(__x));
- }
- };
- template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- class _LIBCPP_TEMPLATE_VIS linear_congruential_engine;
- template <class _CharT, class _Traits,
- class _Up, _Up _Ap, _Up _Cp, _Up _Np>
- _LIBCPP_INLINE_VISIBILITY
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&);
- template <class _CharT, class _Traits,
- class _Up, _Up _Ap, _Up _Cp, _Up _Np>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x);
- template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- class _LIBCPP_TEMPLATE_VIS linear_congruential_engine
- {
- public:
- // types
- typedef _UIntType result_type;
- private:
- result_type __x_;
- static _LIBCPP_CONSTEXPR const result_type _Mp = result_type(~0);
- static_assert(__m == 0 || __a < __m, "linear_congruential_engine invalid parameters");
- static_assert(__m == 0 || __c < __m, "linear_congruential_engine invalid parameters");
- public:
- static _LIBCPP_CONSTEXPR const result_type _Min = __c == 0u ? 1u: 0u;
- static _LIBCPP_CONSTEXPR const result_type _Max = __m - 1u;
- static_assert(_Min < _Max, "linear_congruential_engine invalid parameters");
- // engine characteristics
- static _LIBCPP_CONSTEXPR const result_type multiplier = __a;
- static _LIBCPP_CONSTEXPR const result_type increment = __c;
- static _LIBCPP_CONSTEXPR const result_type modulus = __m;
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
- static _LIBCPP_CONSTEXPR const result_type default_seed = 1u;
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- explicit linear_congruential_engine(result_type __s = default_seed)
- {seed(__s);}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit linear_congruential_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, linear_congruential_engine>::value>::type* = 0)
- {seed(__q);}
- _LIBCPP_INLINE_VISIBILITY
- void seed(result_type __s = default_seed)
- {seed(integral_constant<bool, __m == 0>(),
- integral_constant<bool, __c == 0>(), __s);}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, linear_congruential_engine>::value,
- void
- >::type
- seed(_Sseq& __q)
- {__seed(__q, integral_constant<unsigned,
- 1 + (__m == 0 ? (sizeof(result_type) * __CHAR_BIT__ - 1)/32
- : (__m > 0x100000000ull))>());}
- // generating functions
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()()
- {return __x_ = static_cast<result_type>(__lce_ta<__a, __c, __m, _Mp>::next(__x_));}
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const linear_congruential_engine& __x,
- const linear_congruential_engine& __y)
- {return __x.__x_ == __y.__x_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const linear_congruential_engine& __x,
- const linear_congruential_engine& __y)
- {return !(__x == __y);}
- private:
- _LIBCPP_INLINE_VISIBILITY
- void seed(true_type, true_type, result_type __s) {__x_ = __s == 0 ? 1 : __s;}
- _LIBCPP_INLINE_VISIBILITY
- void seed(true_type, false_type, result_type __s) {__x_ = __s;}
- _LIBCPP_INLINE_VISIBILITY
- void seed(false_type, true_type, result_type __s) {__x_ = __s % __m == 0 ?
- 1 : __s % __m;}
- _LIBCPP_INLINE_VISIBILITY
- void seed(false_type, false_type, result_type __s) {__x_ = __s % __m;}
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 1>);
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 2>);
- template <class _CharT, class _Traits,
- class _Up, _Up _Ap, _Up _Cp, _Up _Np>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&);
- template <class _CharT, class _Traits,
- class _Up, _Up _Ap, _Up _Cp, _Up _Np>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x);
- };
- template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
- linear_congruential_engine<_UIntType, __a, __c, __m>::multiplier;
- template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
- linear_congruential_engine<_UIntType, __a, __c, __m>::increment;
- template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
- linear_congruential_engine<_UIntType, __a, __c, __m>::modulus;
- template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
- linear_congruential_engine<_UIntType, __a, __c, __m>::default_seed;
- template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- template<class _Sseq>
- void
- linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q,
- integral_constant<unsigned, 1>)
- {
- const unsigned __k = 1;
- uint32_t __ar[__k+3];
- __q.generate(__ar, __ar + __k + 3);
- result_type __s = static_cast<result_type>(__ar[3] % __m);
- __x_ = __c == 0 && __s == 0 ? result_type(1) : __s;
- }
- template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- template<class _Sseq>
- void
- linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q,
- integral_constant<unsigned, 2>)
- {
- const unsigned __k = 2;
- uint32_t __ar[__k+3];
- __q.generate(__ar, __ar + __k + 3);
- result_type __s = static_cast<result_type>((__ar[3] +
- ((uint64_t)__ar[4] << 32)) % __m);
- __x_ = __c == 0 && __s == 0 ? result_type(1) : __s;
- }
- template <class _CharT, class _Traits,
- class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- inline _LIBCPP_INLINE_VISIBILITY
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const linear_congruential_engine<_UIntType, __a, __c, __m>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- __os.fill(__os.widen(' '));
- return __os << __x.__x_;
- }
- template <class _CharT, class _Traits,
- class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- linear_congruential_engine<_UIntType, __a, __c, __m>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- _UIntType __t;
- __is >> __t;
- if (!__is.fail())
- __x.__x_ = __t;
- return __is;
- }
- typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>
- minstd_rand0;
- typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647>
- minstd_rand;
- typedef minstd_rand default_random_engine;
- // mersenne_twister_engine
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine;
- template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- bool
- operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
- template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine
- {
- public:
- // types
- typedef _UIntType result_type;
- private:
- result_type __x_[__n];
- size_t __i_;
- static_assert( 0 < __m, "mersenne_twister_engine invalid parameters");
- static_assert(__m <= __n, "mersenne_twister_engine invalid parameters");
- static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits;
- static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters");
- static_assert( 2 <= __w, "mersenne_twister_engine invalid parameters");
- static_assert(__r <= __w, "mersenne_twister_engine invalid parameters");
- static_assert(__u <= __w, "mersenne_twister_engine invalid parameters");
- static_assert(__s <= __w, "mersenne_twister_engine invalid parameters");
- static_assert(__t <= __w, "mersenne_twister_engine invalid parameters");
- static_assert(__l <= __w, "mersenne_twister_engine invalid parameters");
- public:
- static _LIBCPP_CONSTEXPR const result_type _Min = 0;
- static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) :
- (result_type(1) << __w) - result_type(1);
- static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters");
- static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters");
- static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters");
- static_assert(__c <= _Max, "mersenne_twister_engine invalid parameters");
- static_assert(__d <= _Max, "mersenne_twister_engine invalid parameters");
- static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters");
- // engine characteristics
- static _LIBCPP_CONSTEXPR const size_t word_size = __w;
- static _LIBCPP_CONSTEXPR const size_t state_size = __n;
- static _LIBCPP_CONSTEXPR const size_t shift_size = __m;
- static _LIBCPP_CONSTEXPR const size_t mask_bits = __r;
- static _LIBCPP_CONSTEXPR const result_type xor_mask = __a;
- static _LIBCPP_CONSTEXPR const size_t tempering_u = __u;
- static _LIBCPP_CONSTEXPR const result_type tempering_d = __d;
- static _LIBCPP_CONSTEXPR const size_t tempering_s = __s;
- static _LIBCPP_CONSTEXPR const result_type tempering_b = __b;
- static _LIBCPP_CONSTEXPR const size_t tempering_t = __t;
- static _LIBCPP_CONSTEXPR const result_type tempering_c = __c;
- static _LIBCPP_CONSTEXPR const size_t tempering_l = __l;
- static _LIBCPP_CONSTEXPR const result_type initialization_multiplier = __f;
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
- static _LIBCPP_CONSTEXPR const result_type default_seed = 5489u;
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- explicit mersenne_twister_engine(result_type __sd = default_seed)
- {seed(__sd);}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit mersenne_twister_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value>::type* = 0)
- {seed(__q);}
- void seed(result_type __sd = default_seed);
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, mersenne_twister_engine>::value,
- void
- >::type
- seed(_Sseq& __q)
- {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());}
- // generating functions
- result_type operator()();
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
- template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- friend
- bool
- operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
- template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- friend
- bool
- operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
- private:
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 1>);
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 2>);
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- __count < __w,
- result_type
- >::type
- __lshift(result_type __x) {return (__x << __count) & _Max;}
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- (__count >= __w),
- result_type
- >::type
- __lshift(result_type) {return result_type(0);}
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- __count < _Dt,
- result_type
- >::type
- __rshift(result_type __x) {return __x >> __count;}
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- (__count >= _Dt),
- result_type
- >::type
- __rshift(result_type) {return result_type(0);}
- };
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::word_size;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::state_size;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::shift_size;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::mask_bits;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::xor_mask;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_u;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_d;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_s;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_b;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_t;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_c;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_l;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::initialization_multiplier;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::default_seed;
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- void
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
- __t, __c, __l, __f>::seed(result_type __sd)
- _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
- { // __w >= 2
- __x_[0] = __sd & _Max;
- for (size_t __i = 1; __i < __n; ++__i)
- __x_[__i] = (__f * (__x_[__i-1] ^ __rshift<__w - 2>(__x_[__i-1])) + __i) & _Max;
- __i_ = 0;
- }
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- template<class _Sseq>
- void
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
- __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 1>)
- {
- const unsigned __k = 1;
- uint32_t __ar[__n * __k];
- __q.generate(__ar, __ar + __n * __k);
- for (size_t __i = 0; __i < __n; ++__i)
- __x_[__i] = static_cast<result_type>(__ar[__i] & _Max);
- const result_type __mask = __r == _Dt ? result_type(~0) :
- (result_type(1) << __r) - result_type(1);
- __i_ = 0;
- if ((__x_[0] & ~__mask) == 0)
- {
- for (size_t __i = 1; __i < __n; ++__i)
- if (__x_[__i] != 0)
- return;
- __x_[0] = result_type(1) << (__w - 1);
- }
- }
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- template<class _Sseq>
- void
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
- __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 2>)
- {
- const unsigned __k = 2;
- uint32_t __ar[__n * __k];
- __q.generate(__ar, __ar + __n * __k);
- for (size_t __i = 0; __i < __n; ++__i)
- __x_[__i] = static_cast<result_type>(
- (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max);
- const result_type __mask = __r == _Dt ? result_type(~0) :
- (result_type(1) << __r) - result_type(1);
- __i_ = 0;
- if ((__x_[0] & ~__mask) == 0)
- {
- for (size_t __i = 1; __i < __n; ++__i)
- if (__x_[__i] != 0)
- return;
- __x_[0] = result_type(1) << (__w - 1);
- }
- }
- template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _UIntType
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
- __t, __c, __l, __f>::operator()()
- {
- const size_t __j = (__i_ + 1) % __n;
- const result_type __mask = __r == _Dt ? result_type(~0) :
- (result_type(1) << __r) - result_type(1);
- const result_type _Yp = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask);
- const size_t __k = (__i_ + __m) % __n;
- __x_[__i_] = __x_[__k] ^ __rshift<1>(_Yp) ^ (__a * (_Yp & 1));
- result_type __z = __x_[__i_] ^ (__rshift<__u>(__x_[__i_]) & __d);
- __i_ = __j;
- __z ^= __lshift<__s>(__z) & __b;
- __z ^= __lshift<__t>(__z) & __c;
- return __z ^ __rshift<__l>(__z);
- }
- template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- bool
- operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y)
- {
- if (__x.__i_ == __y.__i_)
- return _VSTD::equal(__x.__x_, __x.__x_ + _Np, __y.__x_);
- if (__x.__i_ == 0 || __y.__i_ == 0)
- {
- size_t __j = _VSTD::min(_Np - __x.__i_, _Np - __y.__i_);
- if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j,
- __y.__x_ + __y.__i_))
- return false;
- if (__x.__i_ == 0)
- return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Np, __y.__x_);
- return _VSTD::equal(__x.__x_, __x.__x_ + (_Np - __j), __y.__x_ + __j);
- }
- if (__x.__i_ < __y.__i_)
- {
- size_t __j = _Np - __y.__i_;
- if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j),
- __y.__x_ + __y.__i_))
- return false;
- if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Np,
- __y.__x_))
- return false;
- return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_,
- __y.__x_ + (_Np - (__x.__i_ + __j)));
- }
- size_t __j = _Np - __x.__i_;
- if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j),
- __x.__x_ + __x.__i_))
- return false;
- if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Np,
- __x.__x_))
- return false;
- return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_,
- __x.__x_ + (_Np - (__y.__i_ + __j)));
- }
- template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y)
- {
- return !(__x == __y);
- }
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.__x_[__x.__i_];
- for (size_t __j = __x.__i_ + 1; __j < _Np; ++__j)
- __os << __sp << __x.__x_[__j];
- for (size_t __j = 0; __j < __x.__i_; ++__j)
- __os << __sp << __x.__x_[__j];
- return __os;
- }
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- _UInt __t[_Np];
- for (size_t __i = 0; __i < _Np; ++__i)
- __is >> __t[__i];
- if (!__is.fail())
- {
- for (size_t __i = 0; __i < _Np; ++__i)
- __x.__x_[__i] = __t[__i];
- __x.__i_ = 0;
- }
- return __is;
- }
- typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31,
- 0x9908b0df, 11, 0xffffffff,
- 7, 0x9d2c5680,
- 15, 0xefc60000,
- 18, 1812433253> mt19937;
- typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31,
- 0xb5026f5aa96619e9ULL, 29, 0x5555555555555555ULL,
- 17, 0x71d67fffeda60000ULL,
- 37, 0xfff7eee000000000ULL,
- 43, 6364136223846793005ULL> mt19937_64;
- // subtract_with_carry_engine
- template<class _UIntType, size_t __w, size_t __s, size_t __r>
- class _LIBCPP_TEMPLATE_VIS subtract_with_carry_engine;
- template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- bool
- operator==(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y);
- template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y);
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x);
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x);
- template<class _UIntType, size_t __w, size_t __s, size_t __r>
- class _LIBCPP_TEMPLATE_VIS subtract_with_carry_engine
- {
- public:
- // types
- typedef _UIntType result_type;
- private:
- result_type __x_[__r];
- result_type __c_;
- size_t __i_;
- static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits;
- static_assert( 0 < __w, "subtract_with_carry_engine invalid parameters");
- static_assert(__w <= _Dt, "subtract_with_carry_engine invalid parameters");
- static_assert( 0 < __s, "subtract_with_carry_engine invalid parameters");
- static_assert(__s < __r, "subtract_with_carry_engine invalid parameters");
- public:
- static _LIBCPP_CONSTEXPR const result_type _Min = 0;
- static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) :
- (result_type(1) << __w) - result_type(1);
- static_assert(_Min < _Max, "subtract_with_carry_engine invalid parameters");
- // engine characteristics
- static _LIBCPP_CONSTEXPR const size_t word_size = __w;
- static _LIBCPP_CONSTEXPR const size_t short_lag = __s;
- static _LIBCPP_CONSTEXPR const size_t long_lag = __r;
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
- static _LIBCPP_CONSTEXPR const result_type default_seed = 19780503u;
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- explicit subtract_with_carry_engine(result_type __sd = default_seed)
- {seed(__sd);}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit subtract_with_carry_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, subtract_with_carry_engine>::value>::type* = 0)
- {seed(__q);}
- _LIBCPP_INLINE_VISIBILITY
- void seed(result_type __sd = default_seed)
- {seed(__sd, integral_constant<unsigned, 1 + (__w - 1) / 32>());}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, subtract_with_carry_engine>::value,
- void
- >::type
- seed(_Sseq& __q)
- {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());}
- // generating functions
- result_type operator()();
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
- template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- friend
- bool
- operator==(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y);
- template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- friend
- bool
- operator!=(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y);
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x);
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x);
- private:
- void seed(result_type __sd, integral_constant<unsigned, 1>);
- void seed(result_type __sd, integral_constant<unsigned, 2>);
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 1>);
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 2>);
- };
- template<class _UIntType, size_t __w, size_t __s, size_t __r>
- _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::word_size;
- template<class _UIntType, size_t __w, size_t __s, size_t __r>
- _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::short_lag;
- template<class _UIntType, size_t __w, size_t __s, size_t __r>
- _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::long_lag;
- template<class _UIntType, size_t __w, size_t __s, size_t __r>
- _LIBCPP_CONSTEXPR const typename subtract_with_carry_engine<_UIntType, __w, __s, __r>::result_type
- subtract_with_carry_engine<_UIntType, __w, __s, __r>::default_seed;
- template<class _UIntType, size_t __w, size_t __s, size_t __r>
- void
- subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd,
- integral_constant<unsigned, 1>)
- {
- linear_congruential_engine<result_type, 40014u, 0u, 2147483563u>
- __e(__sd == 0u ? default_seed : __sd);
- for (size_t __i = 0; __i < __r; ++__i)
- __x_[__i] = static_cast<result_type>(__e() & _Max);
- __c_ = __x_[__r-1] == 0;
- __i_ = 0;
- }
- template<class _UIntType, size_t __w, size_t __s, size_t __r>
- void
- subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd,
- integral_constant<unsigned, 2>)
- {
- linear_congruential_engine<result_type, 40014u, 0u, 2147483563u>
- __e(__sd == 0u ? default_seed : __sd);
- for (size_t __i = 0; __i < __r; ++__i)
- {
- result_type __e0 = __e();
- __x_[__i] = static_cast<result_type>(
- (__e0 + ((uint64_t)__e() << 32)) & _Max);
- }
- __c_ = __x_[__r-1] == 0;
- __i_ = 0;
- }
- template<class _UIntType, size_t __w, size_t __s, size_t __r>
- template<class _Sseq>
- void
- subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q,
- integral_constant<unsigned, 1>)
- {
- const unsigned __k = 1;
- uint32_t __ar[__r * __k];
- __q.generate(__ar, __ar + __r * __k);
- for (size_t __i = 0; __i < __r; ++__i)
- __x_[__i] = static_cast<result_type>(__ar[__i] & _Max);
- __c_ = __x_[__r-1] == 0;
- __i_ = 0;
- }
- template<class _UIntType, size_t __w, size_t __s, size_t __r>
- template<class _Sseq>
- void
- subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q,
- integral_constant<unsigned, 2>)
- {
- const unsigned __k = 2;
- uint32_t __ar[__r * __k];
- __q.generate(__ar, __ar + __r * __k);
- for (size_t __i = 0; __i < __r; ++__i)
- __x_[__i] = static_cast<result_type>(
- (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max);
- __c_ = __x_[__r-1] == 0;
- __i_ = 0;
- }
- template<class _UIntType, size_t __w, size_t __s, size_t __r>
- _UIntType
- subtract_with_carry_engine<_UIntType, __w, __s, __r>::operator()()
- {
- const result_type& __xs = __x_[(__i_ + (__r - __s)) % __r];
- result_type& __xr = __x_[__i_];
- result_type __new_c = __c_ == 0 ? __xs < __xr : __xs != 0 ? __xs <= __xr : 1;
- __xr = (__xs - __xr - __c_) & _Max;
- __c_ = __new_c;
- __i_ = (__i_ + 1) % __r;
- return __xr;
- }
- template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- bool
- operator==(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y)
- {
- if (__x.__c_ != __y.__c_)
- return false;
- if (__x.__i_ == __y.__i_)
- return _VSTD::equal(__x.__x_, __x.__x_ + _Rp, __y.__x_);
- if (__x.__i_ == 0 || __y.__i_ == 0)
- {
- size_t __j = _VSTD::min(_Rp - __x.__i_, _Rp - __y.__i_);
- if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j,
- __y.__x_ + __y.__i_))
- return false;
- if (__x.__i_ == 0)
- return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Rp, __y.__x_);
- return _VSTD::equal(__x.__x_, __x.__x_ + (_Rp - __j), __y.__x_ + __j);
- }
- if (__x.__i_ < __y.__i_)
- {
- size_t __j = _Rp - __y.__i_;
- if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j),
- __y.__x_ + __y.__i_))
- return false;
- if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Rp,
- __y.__x_))
- return false;
- return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_,
- __y.__x_ + (_Rp - (__x.__i_ + __j)));
- }
- size_t __j = _Rp - __x.__i_;
- if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j),
- __x.__x_ + __x.__i_))
- return false;
- if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Rp,
- __x.__x_))
- return false;
- return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_,
- __x.__x_ + (_Rp - (__y.__i_ + __j)));
- }
- template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y)
- {
- return !(__x == __y);
- }
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.__x_[__x.__i_];
- for (size_t __j = __x.__i_ + 1; __j < _Rp; ++__j)
- __os << __sp << __x.__x_[__j];
- for (size_t __j = 0; __j < __x.__i_; ++__j)
- __os << __sp << __x.__x_[__j];
- __os << __sp << __x.__c_;
- return __os;
- }
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- _UInt __t[_Rp+1];
- for (size_t __i = 0; __i < _Rp+1; ++__i)
- __is >> __t[__i];
- if (!__is.fail())
- {
- for (size_t __i = 0; __i < _Rp; ++__i)
- __x.__x_[__i] = __t[__i];
- __x.__c_ = __t[_Rp];
- __x.__i_ = 0;
- }
- return __is;
- }
- typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base;
- typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base;
- // discard_block_engine
- template<class _Engine, size_t __p, size_t __r>
- class _LIBCPP_TEMPLATE_VIS discard_block_engine
- {
- _Engine __e_;
- int __n_;
- static_assert( 0 < __r, "discard_block_engine invalid parameters");
- static_assert(__r <= __p, "discard_block_engine invalid parameters");
- static_assert(__r <= INT_MAX, "discard_block_engine invalid parameters");
- public:
- // types
- typedef typename _Engine::result_type result_type;
- // engine characteristics
- static _LIBCPP_CONSTEXPR const size_t block_size = __p;
- static _LIBCPP_CONSTEXPR const size_t used_block = __r;
- #ifdef _LIBCPP_CXX03_LANG
- static const result_type _Min = _Engine::_Min;
- static const result_type _Max = _Engine::_Max;
- #else
- static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min();
- static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max();
- #endif
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Engine::min(); }
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Engine::max(); }
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- discard_block_engine() : __n_(0) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit discard_block_engine(const _Engine& __e)
- : __e_(__e), __n_(0) {}
- #ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit discard_block_engine(_Engine&& __e)
- : __e_(_VSTD::move(__e)), __n_(0) {}
- #endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit discard_block_engine(result_type __sd) : __e_(__sd), __n_(0) {}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit discard_block_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, discard_block_engine>::value &&
- !is_convertible<_Sseq, _Engine>::value>::type* = 0)
- : __e_(__q), __n_(0) {}
- _LIBCPP_INLINE_VISIBILITY
- void seed() {__e_.seed(); __n_ = 0;}
- _LIBCPP_INLINE_VISIBILITY
- void seed(result_type __sd) {__e_.seed(__sd); __n_ = 0;}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, discard_block_engine>::value,
- void
- >::type
- seed(_Sseq& __q) {__e_.seed(__q); __n_ = 0;}
- // generating functions
- result_type operator()();
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- const _Engine& base() const _NOEXCEPT {return __e_;}
- template<class _Eng, size_t _Pp, size_t _Rp>
- friend
- bool
- operator==(
- const discard_block_engine<_Eng, _Pp, _Rp>& __x,
- const discard_block_engine<_Eng, _Pp, _Rp>& __y);
- template<class _Eng, size_t _Pp, size_t _Rp>
- friend
- bool
- operator!=(
- const discard_block_engine<_Eng, _Pp, _Rp>& __x,
- const discard_block_engine<_Eng, _Pp, _Rp>& __y);
- template <class _CharT, class _Traits,
- class _Eng, size_t _Pp, size_t _Rp>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const discard_block_engine<_Eng, _Pp, _Rp>& __x);
- template <class _CharT, class _Traits,
- class _Eng, size_t _Pp, size_t _Rp>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- discard_block_engine<_Eng, _Pp, _Rp>& __x);
- };
- template<class _Engine, size_t __p, size_t __r>
- _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::block_size;
- template<class _Engine, size_t __p, size_t __r>
- _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::used_block;
- template<class _Engine, size_t __p, size_t __r>
- typename discard_block_engine<_Engine, __p, __r>::result_type
- discard_block_engine<_Engine, __p, __r>::operator()()
- {
- if (__n_ >= static_cast<int>(__r))
- {
- __e_.discard(__p - __r);
- __n_ = 0;
- }
- ++__n_;
- return __e_();
- }
- template<class _Eng, size_t _Pp, size_t _Rp>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(const discard_block_engine<_Eng, _Pp, _Rp>& __x,
- const discard_block_engine<_Eng, _Pp, _Rp>& __y)
- {
- return __x.__n_ == __y.__n_ && __x.__e_ == __y.__e_;
- }
- template<class _Eng, size_t _Pp, size_t _Rp>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(const discard_block_engine<_Eng, _Pp, _Rp>& __x,
- const discard_block_engine<_Eng, _Pp, _Rp>& __y)
- {
- return !(__x == __y);
- }
- template <class _CharT, class _Traits,
- class _Eng, size_t _Pp, size_t _Rp>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const discard_block_engine<_Eng, _Pp, _Rp>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.__e_ << __sp << __x.__n_;
- }
- template <class _CharT, class _Traits,
- class _Eng, size_t _Pp, size_t _Rp>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- discard_block_engine<_Eng, _Pp, _Rp>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- _Eng __e;
- int __n;
- __is >> __e >> __n;
- if (!__is.fail())
- {
- __x.__e_ = __e;
- __x.__n_ = __n;
- }
- return __is;
- }
- typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
- typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
- // independent_bits_engine
- template<class _Engine, size_t __w, class _UIntType>
- class _LIBCPP_TEMPLATE_VIS independent_bits_engine
- {
- template <class _UInt, _UInt _R0, size_t _Wp, size_t _Mp>
- class __get_n
- {
- static _LIBCPP_CONSTEXPR const size_t _Dt = numeric_limits<_UInt>::digits;
- static _LIBCPP_CONSTEXPR const size_t _Np = _Wp / _Mp + (_Wp % _Mp != 0);
- static _LIBCPP_CONSTEXPR const size_t _W0 = _Wp / _Np;
- static _LIBCPP_CONSTEXPR const _UInt _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0;
- public:
- static _LIBCPP_CONSTEXPR const size_t value = _R0 - _Y0 > _Y0 / _Np ? _Np + 1 : _Np;
- };
- public:
- // types
- typedef _UIntType result_type;
- private:
- _Engine __e_;
- static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits;
- static_assert( 0 < __w, "independent_bits_engine invalid parameters");
- static_assert(__w <= _Dt, "independent_bits_engine invalid parameters");
- typedef typename _Engine::result_type _Engine_result_type;
- typedef typename conditional
- <
- sizeof(_Engine_result_type) <= sizeof(result_type),
- result_type,
- _Engine_result_type
- >::type _Working_result_type;
- #ifdef _LIBCPP_CXX03_LANG
- static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min
- + _Working_result_type(1);
- #else
- static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
- + _Working_result_type(1);
- #endif
- static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value;
- static _LIBCPP_CONSTEXPR const size_t __n = __get_n<_Working_result_type, _Rp, __w, __m>::value;
- static _LIBCPP_CONSTEXPR const size_t __w0 = __w / __n;
- static _LIBCPP_CONSTEXPR const size_t __n0 = __n - __w % __n;
- static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits;
- static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
- static _LIBCPP_CONSTEXPR const _Working_result_type __y0 = __w0 >= _WDt ? 0 :
- (_Rp >> __w0) << __w0;
- static _LIBCPP_CONSTEXPR const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 :
- (_Rp >> (__w0+1)) << (__w0+1);
- static _LIBCPP_CONSTEXPR const _Engine_result_type __mask0 = __w0 > 0 ?
- _Engine_result_type(~0) >> (_EDt - __w0) :
- _Engine_result_type(0);
- static _LIBCPP_CONSTEXPR const _Engine_result_type __mask1 = __w0 < _EDt - 1 ?
- _Engine_result_type(~0) >> (_EDt - (__w0 + 1)) :
- _Engine_result_type(~0);
- public:
- static _LIBCPP_CONSTEXPR const result_type _Min = 0;
- static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) :
- (result_type(1) << __w) - result_type(1);
- static_assert(_Min < _Max, "independent_bits_engine invalid parameters");
- // engine characteristics
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- independent_bits_engine() {}
- _LIBCPP_INLINE_VISIBILITY
- explicit independent_bits_engine(const _Engine& __e)
- : __e_(__e) {}
- #ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit independent_bits_engine(_Engine&& __e)
- : __e_(_VSTD::move(__e)) {}
- #endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit independent_bits_engine(result_type __sd) : __e_(__sd) {}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit independent_bits_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, independent_bits_engine>::value &&
- !is_convertible<_Sseq, _Engine>::value>::type* = 0)
- : __e_(__q) {}
- _LIBCPP_INLINE_VISIBILITY
- void seed() {__e_.seed();}
- _LIBCPP_INLINE_VISIBILITY
- void seed(result_type __sd) {__e_.seed(__sd);}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, independent_bits_engine>::value,
- void
- >::type
- seed(_Sseq& __q) {__e_.seed(__q);}
- // generating functions
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- const _Engine& base() const _NOEXCEPT {return __e_;}
- template<class _Eng, size_t _Wp, class _UInt>
- friend
- bool
- operator==(
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __y);
- template<class _Eng, size_t _Wp, class _UInt>
- friend
- bool
- operator!=(
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __y);
- template <class _CharT, class _Traits,
- class _Eng, size_t _Wp, class _UInt>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x);
- template <class _CharT, class _Traits,
- class _Eng, size_t _Wp, class _UInt>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- independent_bits_engine<_Eng, _Wp, _UInt>& __x);
- private:
- _LIBCPP_INLINE_VISIBILITY
- result_type __eval(false_type);
- result_type __eval(true_type);
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- __count < _Dt,
- result_type
- >::type
- __lshift(result_type __x) {return __x << __count;}
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- (__count >= _Dt),
- result_type
- >::type
- __lshift(result_type) {return result_type(0);}
- };
- template<class _Engine, size_t __w, class _UIntType>
- inline
- _UIntType
- independent_bits_engine<_Engine, __w, _UIntType>::__eval(false_type)
- {
- return static_cast<result_type>(__e_() & __mask0);
- }
- template<class _Engine, size_t __w, class _UIntType>
- _UIntType
- independent_bits_engine<_Engine, __w, _UIntType>::__eval(true_type)
- {
- result_type _Sp = 0;
- for (size_t __k = 0; __k < __n0; ++__k)
- {
- _Engine_result_type __u;
- do
- {
- __u = __e_() - _Engine::min();
- } while (__u >= __y0);
- _Sp = static_cast<result_type>(__lshift<__w0>(_Sp) + (__u & __mask0));
- }
- for (size_t __k = __n0; __k < __n; ++__k)
- {
- _Engine_result_type __u;
- do
- {
- __u = __e_() - _Engine::min();
- } while (__u >= __y1);
- _Sp = static_cast<result_type>(__lshift<__w0+1>(_Sp) + (__u & __mask1));
- }
- return _Sp;
- }
- template<class _Eng, size_t _Wp, class _UInt>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __y)
- {
- return __x.base() == __y.base();
- }
- template<class _Eng, size_t _Wp, class _UInt>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __y)
- {
- return !(__x == __y);
- }
- template <class _CharT, class _Traits,
- class _Eng, size_t _Wp, class _UInt>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x)
- {
- return __os << __x.base();
- }
- template <class _CharT, class _Traits,
- class _Eng, size_t _Wp, class _UInt>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- independent_bits_engine<_Eng, _Wp, _UInt>& __x)
- {
- _Eng __e;
- __is >> __e;
- if (!__is.fail())
- __x.__e_ = __e;
- return __is;
- }
- // shuffle_order_engine
- template <uint64_t _Xp, uint64_t _Yp>
- struct __ugcd
- {
- static _LIBCPP_CONSTEXPR const uint64_t value = __ugcd<_Yp, _Xp % _Yp>::value;
- };
- template <uint64_t _Xp>
- struct __ugcd<_Xp, 0>
- {
- static _LIBCPP_CONSTEXPR const uint64_t value = _Xp;
- };
- template <uint64_t _Np, uint64_t _Dp>
- class __uratio
- {
- static_assert(_Dp != 0, "__uratio divide by 0");
- static _LIBCPP_CONSTEXPR const uint64_t __gcd = __ugcd<_Np, _Dp>::value;
- public:
- static _LIBCPP_CONSTEXPR const uint64_t num = _Np / __gcd;
- static _LIBCPP_CONSTEXPR const uint64_t den = _Dp / __gcd;
- typedef __uratio<num, den> type;
- };
- template<class _Engine, size_t __k>
- class _LIBCPP_TEMPLATE_VIS shuffle_order_engine
- {
- static_assert(0 < __k, "shuffle_order_engine invalid parameters");
- public:
- // types
- typedef typename _Engine::result_type result_type;
- private:
- _Engine __e_;
- result_type _V_[__k];
- result_type _Y_;
- public:
- // engine characteristics
- static _LIBCPP_CONSTEXPR const size_t table_size = __k;
- #ifdef _LIBCPP_CXX03_LANG
- static const result_type _Min = _Engine::_Min;
- static const result_type _Max = _Engine::_Max;
- #else
- static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min();
- static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max();
- #endif
- static_assert(_Min < _Max, "shuffle_order_engine invalid parameters");
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
- static _LIBCPP_CONSTEXPR const unsigned long long _Rp = _Max - _Min + 1ull;
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- shuffle_order_engine() {__init();}
- _LIBCPP_INLINE_VISIBILITY
- explicit shuffle_order_engine(const _Engine& __e)
- : __e_(__e) {__init();}
- #ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit shuffle_order_engine(_Engine&& __e)
- : __e_(_VSTD::move(__e)) {__init();}
- #endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit shuffle_order_engine(result_type __sd) : __e_(__sd) {__init();}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit shuffle_order_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, shuffle_order_engine>::value &&
- !is_convertible<_Sseq, _Engine>::value>::type* = 0)
- : __e_(__q) {__init();}
- _LIBCPP_INLINE_VISIBILITY
- void seed() {__e_.seed(); __init();}
- _LIBCPP_INLINE_VISIBILITY
- void seed(result_type __sd) {__e_.seed(__sd); __init();}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, shuffle_order_engine>::value,
- void
- >::type
- seed(_Sseq& __q) {__e_.seed(__q); __init();}
- // generating functions
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- const _Engine& base() const _NOEXCEPT {return __e_;}
- private:
- template<class _Eng, size_t _Kp>
- friend
- bool
- operator==(
- const shuffle_order_engine<_Eng, _Kp>& __x,
- const shuffle_order_engine<_Eng, _Kp>& __y);
- template<class _Eng, size_t _Kp>
- friend
- bool
- operator!=(
- const shuffle_order_engine<_Eng, _Kp>& __x,
- const shuffle_order_engine<_Eng, _Kp>& __y);
- template <class _CharT, class _Traits,
- class _Eng, size_t _Kp>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const shuffle_order_engine<_Eng, _Kp>& __x);
- template <class _CharT, class _Traits,
- class _Eng, size_t _Kp>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- shuffle_order_engine<_Eng, _Kp>& __x);
- _LIBCPP_INLINE_VISIBILITY
- void __init()
- {
- for (size_t __i = 0; __i < __k; ++__i)
- _V_[__i] = __e_();
- _Y_ = __e_();
- }
- _LIBCPP_INLINE_VISIBILITY
- result_type __eval(false_type) {return __eval2(integral_constant<bool, __k & 1>());}
- _LIBCPP_INLINE_VISIBILITY
- result_type __eval(true_type) {return __eval(__uratio<__k, _Rp>());}
- _LIBCPP_INLINE_VISIBILITY
- result_type __eval2(false_type) {return __eval(__uratio<__k/2, 0x8000000000000000ull>());}
- _LIBCPP_INLINE_VISIBILITY
- result_type __eval2(true_type) {return __evalf<__k, 0>();}
- template <uint64_t _Np, uint64_t _Dp>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- (__uratio<_Np, _Dp>::num > 0xFFFFFFFFFFFFFFFFull / (_Max - _Min)),
- result_type
- >::type
- __eval(__uratio<_Np, _Dp>)
- {return __evalf<__uratio<_Np, _Dp>::num, __uratio<_Np, _Dp>::den>();}
- template <uint64_t _Np, uint64_t _Dp>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __uratio<_Np, _Dp>::num <= 0xFFFFFFFFFFFFFFFFull / (_Max - _Min),
- result_type
- >::type
- __eval(__uratio<_Np, _Dp>)
- {
- const size_t __j = static_cast<size_t>(__uratio<_Np, _Dp>::num * (_Y_ - _Min)
- / __uratio<_Np, _Dp>::den);
- _Y_ = _V_[__j];
- _V_[__j] = __e_();
- return _Y_;
- }
- template <uint64_t __n, uint64_t __d>
- _LIBCPP_INLINE_VISIBILITY
- result_type __evalf()
- {
- const double _Fp = __d == 0 ?
- __n / (2. * 0x8000000000000000ull) :
- __n / (double)__d;
- const size_t __j = static_cast<size_t>(_Fp * (_Y_ - _Min));
- _Y_ = _V_[__j];
- _V_[__j] = __e_();
- return _Y_;
- }
- };
- template<class _Engine, size_t __k>
- _LIBCPP_CONSTEXPR const size_t shuffle_order_engine<_Engine, __k>::table_size;
- template<class _Eng, size_t _Kp>
- bool
- operator==(
- const shuffle_order_engine<_Eng, _Kp>& __x,
- const shuffle_order_engine<_Eng, _Kp>& __y)
- {
- return __x._Y_ == __y._Y_ && _VSTD::equal(__x._V_, __x._V_ + _Kp, __y._V_) &&
- __x.__e_ == __y.__e_;
- }
- template<class _Eng, size_t _Kp>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(
- const shuffle_order_engine<_Eng, _Kp>& __x,
- const shuffle_order_engine<_Eng, _Kp>& __y)
- {
- return !(__x == __y);
- }
- template <class _CharT, class _Traits,
- class _Eng, size_t _Kp>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const shuffle_order_engine<_Eng, _Kp>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.__e_ << __sp << __x._V_[0];
- for (size_t __i = 1; __i < _Kp; ++__i)
- __os << __sp << __x._V_[__i];
- return __os << __sp << __x._Y_;
- }
- template <class _CharT, class _Traits,
- class _Eng, size_t _Kp>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- shuffle_order_engine<_Eng, _Kp>& __x)
- {
- typedef typename shuffle_order_engine<_Eng, _Kp>::result_type result_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- _Eng __e;
- result_type _Vp[_Kp+1];
- __is >> __e;
- for (size_t __i = 0; __i < _Kp+1; ++__i)
- __is >> _Vp[__i];
- if (!__is.fail())
- {
- __x.__e_ = __e;
- for (size_t __i = 0; __i < _Kp; ++__i)
- __x._V_[__i] = _Vp[__i];
- __x._Y_ = _Vp[_Kp];
- }
- return __is;
- }
- typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;
- // random_device
- class _LIBCPP_TYPE_VIS random_device
- {
- #ifdef _LIBCPP_USING_DEV_RANDOM
- int __f_;
- #endif // defined(_LIBCPP_USING_DEV_RANDOM)
- public:
- // types
- typedef unsigned result_type;
- // generator characteristics
- static _LIBCPP_CONSTEXPR const result_type _Min = 0;
- static _LIBCPP_CONSTEXPR const result_type _Max = 0xFFFFFFFFu;
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Min;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Max;}
- // constructors
- explicit random_device(const string& __token = "/dev/urandom");
- ~random_device();
- // generating functions
- result_type operator()();
- // property functions
- double entropy() const _NOEXCEPT;
- private:
- // no copy functions
- random_device(const random_device&); // = delete;
- random_device& operator=(const random_device&); // = delete;
- };
- // seed_seq
- class _LIBCPP_TEMPLATE_VIS seed_seq
- {
- public:
- // types
- typedef uint32_t result_type;
- private:
- vector<result_type> __v_;
- template<class _InputIterator>
- void init(_InputIterator __first, _InputIterator __last);
- public:
- // constructors
- _LIBCPP_INLINE_VISIBILITY
- seed_seq() _NOEXCEPT {}
- #ifndef _LIBCPP_CXX03_LANG
- template<class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- seed_seq(initializer_list<_Tp> __il) {init(__il.begin(), __il.end());}
- #endif // _LIBCPP_CXX03_LANG
- template<class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- seed_seq(_InputIterator __first, _InputIterator __last)
- {init(__first, __last);}
- // generating functions
- template<class _RandomAccessIterator>
- void generate(_RandomAccessIterator __first, _RandomAccessIterator __last);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const _NOEXCEPT {return __v_.size();}
- template<class _OutputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void param(_OutputIterator __dest) const
- {_VSTD::copy(__v_.begin(), __v_.end(), __dest);}
- private:
- // no copy functions
- seed_seq(const seed_seq&); // = delete;
- void operator=(const seed_seq&); // = delete;
- _LIBCPP_INLINE_VISIBILITY
- static result_type _Tp(result_type __x) {return __x ^ (__x >> 27);}
- };
- template<class _InputIterator>
- void
- seed_seq::init(_InputIterator __first, _InputIterator __last)
- {
- for (_InputIterator __s = __first; __s != __last; ++__s)
- __v_.push_back(*__s & 0xFFFFFFFF);
- }
- template<class _RandomAccessIterator>
- void
- seed_seq::generate(_RandomAccessIterator __first, _RandomAccessIterator __last)
- {
- if (__first != __last)
- {
- _VSTD::fill(__first, __last, 0x8b8b8b8b);
- const size_t __n = static_cast<size_t>(__last - __first);
- const size_t __s = __v_.size();
- const size_t __t = (__n >= 623) ? 11
- : (__n >= 68) ? 7
- : (__n >= 39) ? 5
- : (__n >= 7) ? 3
- : (__n - 1) / 2;
- const size_t __p = (__n - __t) / 2;
- const size_t __q = __p + __t;
- const size_t __m = _VSTD::max(__s + 1, __n);
- // __k = 0;
- {
- result_type __r = 1664525 * _Tp(__first[0] ^ __first[__p]
- ^ __first[__n - 1]);
- __first[__p] += __r;
- __r += __s;
- __first[__q] += __r;
- __first[0] = __r;
- }
- for (size_t __k = 1; __k <= __s; ++__k)
- {
- const size_t __kmodn = __k % __n;
- const size_t __kpmodn = (__k + __p) % __n;
- result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn]
- ^ __first[(__k - 1) % __n]);
- __first[__kpmodn] += __r;
- __r += __kmodn + __v_[__k-1];
- __first[(__k + __q) % __n] += __r;
- __first[__kmodn] = __r;
- }
- for (size_t __k = __s + 1; __k < __m; ++__k)
- {
- const size_t __kmodn = __k % __n;
- const size_t __kpmodn = (__k + __p) % __n;
- result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn]
- ^ __first[(__k - 1) % __n]);
- __first[__kpmodn] += __r;
- __r += __kmodn;
- __first[(__k + __q) % __n] += __r;
- __first[__kmodn] = __r;
- }
- for (size_t __k = __m; __k < __m + __n; ++__k)
- {
- const size_t __kmodn = __k % __n;
- const size_t __kpmodn = (__k + __p) % __n;
- result_type __r = 1566083941 * _Tp(__first[__kmodn] +
- __first[__kpmodn] +
- __first[(__k - 1) % __n]);
- __first[__kpmodn] ^= __r;
- __r -= __kmodn;
- __first[(__k + __q) % __n] ^= __r;
- __first[__kmodn] = __r;
- }
- }
- }
- // generate_canonical
- template<class _RealType, size_t __bits, class _URNG>
- _RealType
- generate_canonical(_URNG& __g)
- {
- const size_t _Dt = numeric_limits<_RealType>::digits;
- const size_t __b = _Dt < __bits ? _Dt : __bits;
- #ifdef _LIBCPP_CXX03_LANG
- const size_t __logR = __log2<uint64_t, _URNG::_Max - _URNG::_Min + uint64_t(1)>::value;
- #else
- const size_t __logR = __log2<uint64_t, _URNG::max() - _URNG::min() + uint64_t(1)>::value;
- #endif
- const size_t __k = __b / __logR + (__b % __logR != 0) + (__b == 0);
- const _RealType _Rp = static_cast<_RealType>(_URNG::max() - _URNG::min()) + _RealType(1);
- _RealType __base = _Rp;
- _RealType _Sp = __g() - _URNG::min();
- for (size_t __i = 1; __i < __k; ++__i, __base *= _Rp)
- _Sp += (__g() - _URNG::min()) * __base;
- return _Sp / __base;
- }
- // uniform_int_distribution
- // in <algorithm>
- template <class _CharT, class _Traits, class _IT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const uniform_int_distribution<_IT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.a() << __sp << __x.b();
- }
- template <class _CharT, class _Traits, class _IT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- uniform_int_distribution<_IT>& __x)
- {
- typedef uniform_int_distribution<_IT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __a;
- result_type __b;
- __is >> __a >> __b;
- if (!__is.fail())
- __x.param(param_type(__a, __b));
- return __is;
- }
- // uniform_real_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS uniform_real_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __a_;
- result_type __b_;
- public:
- typedef uniform_real_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __a = 0,
- result_type __b = 1)
- : __a_(__a), __b_(__b) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __a_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit uniform_real_distribution(result_type __a = 0, result_type __b = 1)
- : __p_(param_type(__a, __b)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit uniform_real_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __p_.a();}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __p_.b();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return a();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return b();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const uniform_real_distribution& __x,
- const uniform_real_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const uniform_real_distribution& __x,
- const uniform_real_distribution& __y)
- {return !(__x == __y);}
- };
- template<class _RealType>
- template<class _URNG>
- inline
- typename uniform_real_distribution<_RealType>::result_type
- uniform_real_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
- {
- return (__p.b() - __p.a())
- * _VSTD::generate_canonical<_RealType, numeric_limits<_RealType>::digits>(__g)
- + __p.a();
- }
- template <class _CharT, class _Traits, class _RT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const uniform_real_distribution<_RT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.a() << __sp << __x.b();
- }
- template <class _CharT, class _Traits, class _RT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- uniform_real_distribution<_RT>& __x)
- {
- typedef uniform_real_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __a;
- result_type __b;
- __is >> __a >> __b;
- if (!__is.fail())
- __x.param(param_type(__a, __b));
- return __is;
- }
- // bernoulli_distribution
- class _LIBCPP_TEMPLATE_VIS bernoulli_distribution
- {
- public:
- // types
- typedef bool result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- double __p_;
- public:
- typedef bernoulli_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(double __p = 0.5) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit bernoulli_distribution(double __p = 0.5)
- : __p_(param_type(__p)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit bernoulli_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_.p();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return false;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return true;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const bernoulli_distribution& __x,
- const bernoulli_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const bernoulli_distribution& __x,
- const bernoulli_distribution& __y)
- {return !(__x == __y);}
- };
- template<class _URNG>
- inline
- bernoulli_distribution::result_type
- bernoulli_distribution::operator()(_URNG& __g, const param_type& __p)
- {
- uniform_real_distribution<double> __gen;
- return __gen(__g) < __p.p();
- }
- template <class _CharT, class _Traits>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os, const bernoulli_distribution& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.p();
- }
- template <class _CharT, class _Traits>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is, bernoulli_distribution& __x)
- {
- typedef bernoulli_distribution _Eng;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- double __p;
- __is >> __p;
- if (!__is.fail())
- __x.param(param_type(__p));
- return __is;
- }
- // binomial_distribution
- template<class _IntType = int>
- class _LIBCPP_TEMPLATE_VIS binomial_distribution
- {
- public:
- // types
- typedef _IntType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __t_;
- double __p_;
- double __pr_;
- double __odds_ratio_;
- result_type __r0_;
- public:
- typedef binomial_distribution distribution_type;
- explicit param_type(result_type __t = 1, double __p = 0.5);
- _LIBCPP_INLINE_VISIBILITY
- result_type t() const {return __t_;}
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__t_ == __y.__t_ && __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- friend class binomial_distribution;
- };
- private:
- param_type __p_;
- public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit binomial_distribution(result_type __t = 1, double __p = 0.5)
- : __p_(param_type(__t, __p)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit binomial_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type t() const {return __p_.t();}
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_.p();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return t();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const binomial_distribution& __x,
- const binomial_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const binomial_distribution& __x,
- const binomial_distribution& __y)
- {return !(__x == __y);}
- };
- #ifndef _LIBCPP_MSVCRT
- extern "C" double lgamma_r(double, int *);
- #endif
- inline _LIBCPP_INLINE_VISIBILITY double __libcpp_lgamma(double __d) {
- #if defined(_LIBCPP_MSVCRT)
- return lgamma(__d);
- #else
- int __sign;
- return lgamma_r(__d, &__sign);
- #endif
- }
- template<class _IntType>
- binomial_distribution<_IntType>::param_type::param_type(const result_type __t, const double __p)
- : __t_(__t), __p_(__p)
- {
- if (0 < __p_ && __p_ < 1)
- {
- __r0_ = static_cast<result_type>((__t_ + 1) * __p_);
- __pr_ = _VSTD::exp(__libcpp_lgamma(__t_ + 1.) -
- __libcpp_lgamma(__r0_ + 1.) -
- __libcpp_lgamma(__t_ - __r0_ + 1.) + __r0_ * _VSTD::log(__p_) +
- (__t_ - __r0_) * _VSTD::log(1 - __p_));
- __odds_ratio_ = __p_ / (1 - __p_);
- }
- }
- // Reference: Kemp, C.D. (1986). `A modal method for generating binomial
- // variables', Commun. Statist. - Theor. Meth. 15(3), 805-813.
- template<class _IntType>
- template<class _URNG>
- _IntType
- binomial_distribution<_IntType>::operator()(_URNG& __g, const param_type& __pr)
- {
- if (__pr.__t_ == 0 || __pr.__p_ == 0)
- return 0;
- if (__pr.__p_ == 1)
- return __pr.__t_;
- uniform_real_distribution<double> __gen;
- double __u = __gen(__g) - __pr.__pr_;
- if (__u < 0)
- return __pr.__r0_;
- double __pu = __pr.__pr_;
- double __pd = __pu;
- result_type __ru = __pr.__r0_;
- result_type __rd = __ru;
- while (true)
- {
- if (__rd >= 1)
- {
- __pd *= __rd / (__pr.__odds_ratio_ * (__pr.__t_ - __rd + 1));
- __u -= __pd;
- if (__u < 0)
- return __rd - 1;
- }
- if ( __rd != 0 )
- --__rd;
- ++__ru;
- if (__ru <= __pr.__t_)
- {
- __pu *= (__pr.__t_ - __ru + 1) * __pr.__odds_ratio_ / __ru;
- __u -= __pu;
- if (__u < 0)
- return __ru;
- }
- }
- }
- template <class _CharT, class _Traits, class _IntType>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const binomial_distribution<_IntType>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.t() << __sp << __x.p();
- }
- template <class _CharT, class _Traits, class _IntType>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- binomial_distribution<_IntType>& __x)
- {
- typedef binomial_distribution<_IntType> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __t;
- double __p;
- __is >> __t >> __p;
- if (!__is.fail())
- __x.param(param_type(__t, __p));
- return __is;
- }
- // exponential_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS exponential_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __lambda_;
- public:
- typedef exponential_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __lambda = 1) : __lambda_(__lambda) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type lambda() const {return __lambda_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__lambda_ == __y.__lambda_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit exponential_distribution(result_type __lambda = 1)
- : __p_(param_type(__lambda)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit exponential_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type lambda() const {return __p_.lambda();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const exponential_distribution& __x,
- const exponential_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const exponential_distribution& __x,
- const exponential_distribution& __y)
- {return !(__x == __y);}
- };
- template <class _RealType>
- template<class _URNG>
- _RealType
- exponential_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
- {
- return -_VSTD::log
- (
- result_type(1) -
- _VSTD::generate_canonical<result_type,
- numeric_limits<result_type>::digits>(__g)
- )
- / __p.lambda();
- }
- template <class _CharT, class _Traits, class _RealType>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const exponential_distribution<_RealType>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- return __os << __x.lambda();
- }
- template <class _CharT, class _Traits, class _RealType>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- exponential_distribution<_RealType>& __x)
- {
- typedef exponential_distribution<_RealType> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __lambda;
- __is >> __lambda;
- if (!__is.fail())
- __x.param(param_type(__lambda));
- return __is;
- }
- // normal_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS normal_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __mean_;
- result_type __stddev_;
- public:
- typedef normal_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __mean = 0, result_type __stddev = 1)
- : __mean_(__mean), __stddev_(__stddev) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type mean() const {return __mean_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type stddev() const {return __stddev_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__mean_ == __y.__mean_ && __x.__stddev_ == __y.__stddev_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- result_type _V_;
- bool _V_hot_;
- public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit normal_distribution(result_type __mean = 0, result_type __stddev = 1)
- : __p_(param_type(__mean, __stddev)), _V_hot_(false) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit normal_distribution(const param_type& __p)
- : __p_(__p), _V_hot_(false) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {_V_hot_ = false;}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type mean() const {return __p_.mean();}
- _LIBCPP_INLINE_VISIBILITY
- result_type stddev() const {return __p_.stddev();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return -numeric_limits<result_type>::infinity();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const normal_distribution& __x,
- const normal_distribution& __y)
- {return __x.__p_ == __y.__p_ && __x._V_hot_ == __y._V_hot_ &&
- (!__x._V_hot_ || __x._V_ == __y._V_);}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const normal_distribution& __x,
- const normal_distribution& __y)
- {return !(__x == __y);}
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const normal_distribution<_RT>& __x);
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- normal_distribution<_RT>& __x);
- };
- template <class _RealType>
- template<class _URNG>
- _RealType
- normal_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
- {
- result_type _Up;
- if (_V_hot_)
- {
- _V_hot_ = false;
- _Up = _V_;
- }
- else
- {
- uniform_real_distribution<result_type> _Uni(-1, 1);
- result_type __u;
- result_type __v;
- result_type __s;
- do
- {
- __u = _Uni(__g);
- __v = _Uni(__g);
- __s = __u * __u + __v * __v;
- } while (__s > 1 || __s == 0);
- result_type _Fp = _VSTD::sqrt(-2 * _VSTD::log(__s) / __s);
- _V_ = __v * _Fp;
- _V_hot_ = true;
- _Up = __u * _Fp;
- }
- return _Up * __p.stddev() + __p.mean();
- }
- template <class _CharT, class _Traits, class _RT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const normal_distribution<_RT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.mean() << __sp << __x.stddev() << __sp << __x._V_hot_;
- if (__x._V_hot_)
- __os << __sp << __x._V_;
- return __os;
- }
- template <class _CharT, class _Traits, class _RT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- normal_distribution<_RT>& __x)
- {
- typedef normal_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __mean;
- result_type __stddev;
- result_type _Vp = 0;
- bool _V_hot = false;
- __is >> __mean >> __stddev >> _V_hot;
- if (_V_hot)
- __is >> _Vp;
- if (!__is.fail())
- {
- __x.param(param_type(__mean, __stddev));
- __x._V_hot_ = _V_hot;
- __x._V_ = _Vp;
- }
- return __is;
- }
- // lognormal_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS lognormal_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- normal_distribution<result_type> __nd_;
- public:
- typedef lognormal_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __m = 0, result_type __s = 1)
- : __nd_(__m, __s) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type m() const {return __nd_.mean();}
- _LIBCPP_INLINE_VISIBILITY
- result_type s() const {return __nd_.stddev();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__nd_ == __y.__nd_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- friend class lognormal_distribution;
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const lognormal_distribution<_RT>& __x);
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- lognormal_distribution<_RT>& __x);
- };
- private:
- param_type __p_;
- public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit lognormal_distribution(result_type __m = 0, result_type __s = 1)
- : __p_(param_type(__m, __s)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit lognormal_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {__p_.__nd_.reset();}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g, const param_type& __p)
- {return _VSTD::exp(const_cast<normal_distribution<result_type>&>(__p.__nd_)(__g));}
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type m() const {return __p_.m();}
- _LIBCPP_INLINE_VISIBILITY
- result_type s() const {return __p_.s();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const lognormal_distribution& __x,
- const lognormal_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const lognormal_distribution& __x,
- const lognormal_distribution& __y)
- {return !(__x == __y);}
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const lognormal_distribution<_RT>& __x);
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- lognormal_distribution<_RT>& __x);
- };
- template <class _CharT, class _Traits, class _RT>
- inline _LIBCPP_INLINE_VISIBILITY
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const lognormal_distribution<_RT>& __x)
- {
- return __os << __x.__p_.__nd_;
- }
- template <class _CharT, class _Traits, class _RT>
- inline _LIBCPP_INLINE_VISIBILITY
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- lognormal_distribution<_RT>& __x)
- {
- return __is >> __x.__p_.__nd_;
- }
- // poisson_distribution
- template<class _IntType = int>
- class _LIBCPP_TEMPLATE_VIS poisson_distribution
- {
- public:
- // types
- typedef _IntType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- double __mean_;
- double __s_;
- double __d_;
- double __l_;
- double __omega_;
- double __c0_;
- double __c1_;
- double __c2_;
- double __c3_;
- double __c_;
- public:
- typedef poisson_distribution distribution_type;
- explicit param_type(double __mean = 1.0);
- _LIBCPP_INLINE_VISIBILITY
- double mean() const {return __mean_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__mean_ == __y.__mean_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- friend class poisson_distribution;
- };
- private:
- param_type __p_;
- public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit poisson_distribution(double __mean = 1.0) : __p_(__mean) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit poisson_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- double mean() const {return __p_.mean();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::max();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const poisson_distribution& __x,
- const poisson_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const poisson_distribution& __x,
- const poisson_distribution& __y)
- {return !(__x == __y);}
- };
- template<class _IntType>
- poisson_distribution<_IntType>::param_type::param_type(double __mean)
- : __mean_(__mean)
- {
- if (__mean_ < 10)
- {
- __s_ = 0;
- __d_ = 0;
- __l_ = _VSTD::exp(-__mean_);
- __omega_ = 0;
- __c3_ = 0;
- __c2_ = 0;
- __c1_ = 0;
- __c0_ = 0;
- __c_ = 0;
- }
- else
- {
- __s_ = _VSTD::sqrt(__mean_);
- __d_ = 6 * __mean_ * __mean_;
- __l_ = static_cast<result_type>(__mean_ - 1.1484);
- __omega_ = .3989423 / __s_;
- double __b1_ = .4166667E-1 / __mean_;
- double __b2_ = .3 * __b1_ * __b1_;
- __c3_ = .1428571 * __b1_ * __b2_;
- __c2_ = __b2_ - 15. * __c3_;
- __c1_ = __b1_ - 6. * __b2_ + 45. * __c3_;
- __c0_ = 1. - __b1_ + 3. * __b2_ - 15. * __c3_;
- __c_ = .1069 / __mean_;
- }
- }
- template <class _IntType>
- template<class _URNG>
- _IntType
- poisson_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr)
- {
- result_type __x;
- uniform_real_distribution<double> __urd;
- if (__pr.__mean_ < 10)
- {
- __x = 0;
- for (double __p = __urd(__urng); __p > __pr.__l_; ++__x)
- __p *= __urd(__urng);
- }
- else
- {
- double __difmuk;
- double __g = __pr.__mean_ + __pr.__s_ * normal_distribution<double>()(__urng);
- double __u;
- if (__g > 0)
- {
- __x = static_cast<result_type>(__g);
- if (__x >= __pr.__l_)
- return __x;
- __difmuk = __pr.__mean_ - __x;
- __u = __urd(__urng);
- if (__pr.__d_ * __u >= __difmuk * __difmuk * __difmuk)
- return __x;
- }
- exponential_distribution<double> __edist;
- for (bool __using_exp_dist = false; true; __using_exp_dist = true)
- {
- double __e;
- if (__using_exp_dist || __g < 0)
- {
- double __t;
- do
- {
- __e = __edist(__urng);
- __u = __urd(__urng);
- __u += __u - 1;
- __t = 1.8 + (__u < 0 ? -__e : __e);
- } while (__t <= -.6744);
- __x = __pr.__mean_ + __pr.__s_ * __t;
- __difmuk = __pr.__mean_ - __x;
- __using_exp_dist = true;
- }
- double __px;
- double __py;
- if (__x < 10)
- {
- const double __fac[] = {1, 1, 2, 6, 24, 120, 720, 5040,
- 40320, 362880};
- __px = -__pr.__mean_;
- __py = _VSTD::pow(__pr.__mean_, (double)__x) / __fac[__x];
- }
- else
- {
- double __del = .8333333E-1 / __x;
- __del -= 4.8 * __del * __del * __del;
- double __v = __difmuk / __x;
- if (_VSTD::abs(__v) > 0.25)
- __px = __x * _VSTD::log(1 + __v) - __difmuk - __del;
- else
- __px = __x * __v * __v * (((((((.1250060 * __v + -.1384794) *
- __v + .1421878) * __v + -.1661269) * __v + .2000118) *
- __v + -.2500068) * __v + .3333333) * __v + -.5) - __del;
- __py = .3989423 / _VSTD::sqrt(__x);
- }
- double __r = (0.5 - __difmuk) / __pr.__s_;
- double __r2 = __r * __r;
- double __fx = -0.5 * __r2;
- double __fy = __pr.__omega_ * (((__pr.__c3_ * __r2 + __pr.__c2_) *
- __r2 + __pr.__c1_) * __r2 + __pr.__c0_);
- if (__using_exp_dist)
- {
- if (__pr.__c_ * _VSTD::abs(__u) <= __py * _VSTD::exp(__px + __e) -
- __fy * _VSTD::exp(__fx + __e))
- break;
- }
- else
- {
- if (__fy - __u * __fy <= __py * _VSTD::exp(__px - __fx))
- break;
- }
- }
- }
- return __x;
- }
- template <class _CharT, class _Traits, class _IntType>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const poisson_distribution<_IntType>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- return __os << __x.mean();
- }
- template <class _CharT, class _Traits, class _IntType>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- poisson_distribution<_IntType>& __x)
- {
- typedef poisson_distribution<_IntType> _Eng;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- double __mean;
- __is >> __mean;
- if (!__is.fail())
- __x.param(param_type(__mean));
- return __is;
- }
- // weibull_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS weibull_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __a_;
- result_type __b_;
- public:
- typedef weibull_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __a = 1, result_type __b = 1)
- : __a_(__a), __b_(__b) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __a_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit weibull_distribution(result_type __a = 1, result_type __b = 1)
- : __p_(param_type(__a, __b)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit weibull_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g, const param_type& __p)
- {return __p.b() *
- _VSTD::pow(exponential_distribution<result_type>()(__g), 1/__p.a());}
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __p_.a();}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __p_.b();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const weibull_distribution& __x,
- const weibull_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const weibull_distribution& __x,
- const weibull_distribution& __y)
- {return !(__x == __y);}
- };
- template <class _CharT, class _Traits, class _RT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const weibull_distribution<_RT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.a() << __sp << __x.b();
- return __os;
- }
- template <class _CharT, class _Traits, class _RT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- weibull_distribution<_RT>& __x)
- {
- typedef weibull_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __a;
- result_type __b;
- __is >> __a >> __b;
- if (!__is.fail())
- __x.param(param_type(__a, __b));
- return __is;
- }
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS extreme_value_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __a_;
- result_type __b_;
- public:
- typedef extreme_value_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __a = 0, result_type __b = 1)
- : __a_(__a), __b_(__b) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __a_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit extreme_value_distribution(result_type __a = 0, result_type __b = 1)
- : __p_(param_type(__a, __b)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit extreme_value_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __p_.a();}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __p_.b();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return -numeric_limits<result_type>::infinity();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const extreme_value_distribution& __x,
- const extreme_value_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const extreme_value_distribution& __x,
- const extreme_value_distribution& __y)
- {return !(__x == __y);}
- };
- template<class _RealType>
- template<class _URNG>
- _RealType
- extreme_value_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
- {
- return __p.a() - __p.b() *
- _VSTD::log(-_VSTD::log(1-uniform_real_distribution<result_type>()(__g)));
- }
- template <class _CharT, class _Traits, class _RT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const extreme_value_distribution<_RT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.a() << __sp << __x.b();
- return __os;
- }
- template <class _CharT, class _Traits, class _RT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- extreme_value_distribution<_RT>& __x)
- {
- typedef extreme_value_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __a;
- result_type __b;
- __is >> __a >> __b;
- if (!__is.fail())
- __x.param(param_type(__a, __b));
- return __is;
- }
- // gamma_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS gamma_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __alpha_;
- result_type __beta_;
- public:
- typedef gamma_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __alpha = 1, result_type __beta = 1)
- : __alpha_(__alpha), __beta_(__beta) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type alpha() const {return __alpha_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type beta() const {return __beta_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__alpha_ == __y.__alpha_ && __x.__beta_ == __y.__beta_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit gamma_distribution(result_type __alpha = 1, result_type __beta = 1)
- : __p_(param_type(__alpha, __beta)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit gamma_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type alpha() const {return __p_.alpha();}
- _LIBCPP_INLINE_VISIBILITY
- result_type beta() const {return __p_.beta();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const gamma_distribution& __x,
- const gamma_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const gamma_distribution& __x,
- const gamma_distribution& __y)
- {return !(__x == __y);}
- };
- template <class _RealType>
- template<class _URNG>
- _RealType
- gamma_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
- {
- result_type __a = __p.alpha();
- uniform_real_distribution<result_type> __gen(0, 1);
- exponential_distribution<result_type> __egen;
- result_type __x;
- if (__a == 1)
- __x = __egen(__g);
- else if (__a > 1)
- {
- const result_type __b = __a - 1;
- const result_type __c = 3 * __a - result_type(0.75);
- while (true)
- {
- const result_type __u = __gen(__g);
- const result_type __v = __gen(__g);
- const result_type __w = __u * (1 - __u);
- if (__w != 0)
- {
- const result_type __y = _VSTD::sqrt(__c / __w) *
- (__u - result_type(0.5));
- __x = __b + __y;
- if (__x >= 0)
- {
- const result_type __z = 64 * __w * __w * __w * __v * __v;
- if (__z <= 1 - 2 * __y * __y / __x)
- break;
- if (_VSTD::log(__z) <= 2 * (__b * _VSTD::log(__x / __b) - __y))
- break;
- }
- }
- }
- }
- else // __a < 1
- {
- while (true)
- {
- const result_type __u = __gen(__g);
- const result_type __es = __egen(__g);
- if (__u <= 1 - __a)
- {
- __x = _VSTD::pow(__u, 1 / __a);
- if (__x <= __es)
- break;
- }
- else
- {
- const result_type __e = -_VSTD::log((1-__u)/__a);
- __x = _VSTD::pow(1 - __a + __a * __e, 1 / __a);
- if (__x <= __e + __es)
- break;
- }
- }
- }
- return __x * __p.beta();
- }
- template <class _CharT, class _Traits, class _RT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const gamma_distribution<_RT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.alpha() << __sp << __x.beta();
- return __os;
- }
- template <class _CharT, class _Traits, class _RT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- gamma_distribution<_RT>& __x)
- {
- typedef gamma_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __alpha;
- result_type __beta;
- __is >> __alpha >> __beta;
- if (!__is.fail())
- __x.param(param_type(__alpha, __beta));
- return __is;
- }
- // negative_binomial_distribution
- template<class _IntType = int>
- class _LIBCPP_TEMPLATE_VIS negative_binomial_distribution
- {
- public:
- // types
- typedef _IntType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __k_;
- double __p_;
- public:
- typedef negative_binomial_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __k = 1, double __p = 0.5)
- : __k_(__k), __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type k() const {return __k_;}
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__k_ == __y.__k_ && __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit negative_binomial_distribution(result_type __k = 1, double __p = 0.5)
- : __p_(__k, __p) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit negative_binomial_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type k() const {return __p_.k();}
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_.p();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::max();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const negative_binomial_distribution& __x,
- const negative_binomial_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const negative_binomial_distribution& __x,
- const negative_binomial_distribution& __y)
- {return !(__x == __y);}
- };
- template <class _IntType>
- template<class _URNG>
- _IntType
- negative_binomial_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr)
- {
- result_type __k = __pr.k();
- double __p = __pr.p();
- if (__k <= 21 * __p)
- {
- bernoulli_distribution __gen(__p);
- result_type __f = 0;
- result_type __s = 0;
- while (__s < __k)
- {
- if (__gen(__urng))
- ++__s;
- else
- ++__f;
- }
- return __f;
- }
- return poisson_distribution<result_type>(gamma_distribution<double>
- (__k, (1-__p)/__p)(__urng))(__urng);
- }
- template <class _CharT, class _Traits, class _IntType>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const negative_binomial_distribution<_IntType>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.k() << __sp << __x.p();
- }
- template <class _CharT, class _Traits, class _IntType>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- negative_binomial_distribution<_IntType>& __x)
- {
- typedef negative_binomial_distribution<_IntType> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __k;
- double __p;
- __is >> __k >> __p;
- if (!__is.fail())
- __x.param(param_type(__k, __p));
- return __is;
- }
- // geometric_distribution
- template<class _IntType = int>
- class _LIBCPP_TEMPLATE_VIS geometric_distribution
- {
- public:
- // types
- typedef _IntType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- double __p_;
- public:
- typedef geometric_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(double __p = 0.5) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit geometric_distribution(double __p = 0.5) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit geometric_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g, const param_type& __p)
- {return negative_binomial_distribution<result_type>(1, __p.p())(__g);}
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_.p();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::max();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const geometric_distribution& __x,
- const geometric_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const geometric_distribution& __x,
- const geometric_distribution& __y)
- {return !(__x == __y);}
- };
- template <class _CharT, class _Traits, class _IntType>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const geometric_distribution<_IntType>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- return __os << __x.p();
- }
- template <class _CharT, class _Traits, class _IntType>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- geometric_distribution<_IntType>& __x)
- {
- typedef geometric_distribution<_IntType> _Eng;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- double __p;
- __is >> __p;
- if (!__is.fail())
- __x.param(param_type(__p));
- return __is;
- }
- // chi_squared_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS chi_squared_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __n_;
- public:
- typedef chi_squared_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __n = 1) : __n_(__n) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __n_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__n_ == __y.__n_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit chi_squared_distribution(result_type __n = 1)
- : __p_(param_type(__n)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit chi_squared_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g, const param_type& __p)
- {return gamma_distribution<result_type>(__p.n() / 2, 2)(__g);}
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __p_.n();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const chi_squared_distribution& __x,
- const chi_squared_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const chi_squared_distribution& __x,
- const chi_squared_distribution& __y)
- {return !(__x == __y);}
- };
- template <class _CharT, class _Traits, class _RT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const chi_squared_distribution<_RT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- __os << __x.n();
- return __os;
- }
- template <class _CharT, class _Traits, class _RT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- chi_squared_distribution<_RT>& __x)
- {
- typedef chi_squared_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __n;
- __is >> __n;
- if (!__is.fail())
- __x.param(param_type(__n));
- return __is;
- }
- // cauchy_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS cauchy_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __a_;
- result_type __b_;
- public:
- typedef cauchy_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __a = 0, result_type __b = 1)
- : __a_(__a), __b_(__b) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __a_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit cauchy_distribution(result_type __a = 0, result_type __b = 1)
- : __p_(param_type(__a, __b)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit cauchy_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __p_.a();}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __p_.b();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return -numeric_limits<result_type>::infinity();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const cauchy_distribution& __x,
- const cauchy_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const cauchy_distribution& __x,
- const cauchy_distribution& __y)
- {return !(__x == __y);}
- };
- template <class _RealType>
- template<class _URNG>
- inline
- _RealType
- cauchy_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
- {
- uniform_real_distribution<result_type> __gen;
- // purposefully let tan arg get as close to pi/2 as it wants, tan will return a finite
- return __p.a() + __p.b() * _VSTD::tan(3.1415926535897932384626433832795 * __gen(__g));
- }
- template <class _CharT, class _Traits, class _RT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const cauchy_distribution<_RT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.a() << __sp << __x.b();
- return __os;
- }
- template <class _CharT, class _Traits, class _RT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- cauchy_distribution<_RT>& __x)
- {
- typedef cauchy_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __a;
- result_type __b;
- __is >> __a >> __b;
- if (!__is.fail())
- __x.param(param_type(__a, __b));
- return __is;
- }
- // fisher_f_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS fisher_f_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __m_;
- result_type __n_;
- public:
- typedef fisher_f_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __m = 1, result_type __n = 1)
- : __m_(__m), __n_(__n) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type m() const {return __m_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __n_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__m_ == __y.__m_ && __x.__n_ == __y.__n_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit fisher_f_distribution(result_type __m = 1, result_type __n = 1)
- : __p_(param_type(__m, __n)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit fisher_f_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type m() const {return __p_.m();}
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __p_.n();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const fisher_f_distribution& __x,
- const fisher_f_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const fisher_f_distribution& __x,
- const fisher_f_distribution& __y)
- {return !(__x == __y);}
- };
- template <class _RealType>
- template<class _URNG>
- _RealType
- fisher_f_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
- {
- gamma_distribution<result_type> __gdm(__p.m() * result_type(.5));
- gamma_distribution<result_type> __gdn(__p.n() * result_type(.5));
- return __p.n() * __gdm(__g) / (__p.m() * __gdn(__g));
- }
- template <class _CharT, class _Traits, class _RT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const fisher_f_distribution<_RT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.m() << __sp << __x.n();
- return __os;
- }
- template <class _CharT, class _Traits, class _RT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- fisher_f_distribution<_RT>& __x)
- {
- typedef fisher_f_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __m;
- result_type __n;
- __is >> __m >> __n;
- if (!__is.fail())
- __x.param(param_type(__m, __n));
- return __is;
- }
- // student_t_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS student_t_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __n_;
- public:
- typedef student_t_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __n = 1) : __n_(__n) {}
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __n_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__n_ == __y.__n_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
- private:
- param_type __p_;
- normal_distribution<result_type> __nd_;
- public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit student_t_distribution(result_type __n = 1)
- : __p_(param_type(__n)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit student_t_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {__nd_.reset();}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __p_.n();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return -numeric_limits<result_type>::infinity();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const student_t_distribution& __x,
- const student_t_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const student_t_distribution& __x,
- const student_t_distribution& __y)
- {return !(__x == __y);}
- };
- template <class _RealType>
- template<class _URNG>
- _RealType
- student_t_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
- {
- gamma_distribution<result_type> __gd(__p.n() * .5, 2);
- return __nd_(__g) * _VSTD::sqrt(__p.n()/__gd(__g));
- }
- template <class _CharT, class _Traits, class _RT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const student_t_distribution<_RT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- __os << __x.n();
- return __os;
- }
- template <class _CharT, class _Traits, class _RT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- student_t_distribution<_RT>& __x)
- {
- typedef student_t_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __n;
- __is >> __n;
- if (!__is.fail())
- __x.param(param_type(__n));
- return __is;
- }
- // discrete_distribution
- template<class _IntType = int>
- class _LIBCPP_TEMPLATE_VIS discrete_distribution
- {
- public:
- // types
- typedef _IntType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- vector<double> __p_;
- public:
- typedef discrete_distribution distribution_type;
- _LIBCPP_INLINE_VISIBILITY
- param_type() {}
- template<class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- param_type(_InputIterator __f, _InputIterator __l)
- : __p_(__f, __l) {__init();}
- #ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- param_type(initializer_list<double> __wl)
- : __p_(__wl.begin(), __wl.end()) {__init();}
- #endif // _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- param_type(size_t __nw, double __xmin, double __xmax,
- _UnaryOperation __fw);
- vector<double> probabilities() const;
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- private:
- void __init();
- friend class discrete_distribution;
- template <class _CharT, class _Traits, class _IT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const discrete_distribution<_IT>& __x);
- template <class _CharT, class _Traits, class _IT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- discrete_distribution<_IT>& __x);
- };
- private:
- param_type __p_;
- public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- discrete_distribution() {}
- template<class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- discrete_distribution(_InputIterator __f, _InputIterator __l)
- : __p_(__f, __l) {}
- #ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- discrete_distribution(initializer_list<double> __wl)
- : __p_(__wl) {}
- #endif // _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- _LIBCPP_INLINE_VISIBILITY
- discrete_distribution(size_t __nw, double __xmin, double __xmax,
- _UnaryOperation __fw)
- : __p_(__nw, __xmin, __xmax, __fw) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit discrete_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- vector<double> probabilities() const {return __p_.probabilities();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return __p_.__p_.size();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const discrete_distribution& __x,
- const discrete_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const discrete_distribution& __x,
- const discrete_distribution& __y)
- {return !(__x == __y);}
- template <class _CharT, class _Traits, class _IT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const discrete_distribution<_IT>& __x);
- template <class _CharT, class _Traits, class _IT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- discrete_distribution<_IT>& __x);
- };
- template<class _IntType>
- template<class _UnaryOperation>
- discrete_distribution<_IntType>::param_type::param_type(size_t __nw,
- double __xmin,
- double __xmax,
- _UnaryOperation __fw)
- {
- if (__nw > 1)
- {
- __p_.reserve(__nw - 1);
- double __d = (__xmax - __xmin) / __nw;
- double __d2 = __d / 2;
- for (size_t __k = 0; __k < __nw; ++__k)
- __p_.push_back(__fw(__xmin + __k * __d + __d2));
- __init();
- }
- }
- template<class _IntType>
- void
- discrete_distribution<_IntType>::param_type::__init()
- {
- if (!__p_.empty())
- {
- if (__p_.size() > 1)
- {
- double __s = _VSTD::accumulate(__p_.begin(), __p_.end(), 0.0);
- for (_VSTD::vector<double>::iterator __i = __p_.begin(), __e = __p_.end();
- __i < __e; ++__i)
- *__i /= __s;
- vector<double> __t(__p_.size() - 1);
- _VSTD::partial_sum(__p_.begin(), __p_.end() - 1, __t.begin());
- swap(__p_, __t);
- }
- else
- {
- __p_.clear();
- __p_.shrink_to_fit();
- }
- }
- }
- template<class _IntType>
- vector<double>
- discrete_distribution<_IntType>::param_type::probabilities() const
- {
- size_t __n = __p_.size();
- _VSTD::vector<double> __p(__n+1);
- _VSTD::adjacent_difference(__p_.begin(), __p_.end(), __p.begin());
- if (__n > 0)
- __p[__n] = 1 - __p_[__n-1];
- else
- __p[0] = 1;
- return __p;
- }
- template<class _IntType>
- template<class _URNG>
- _IntType
- discrete_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
- {
- uniform_real_distribution<double> __gen;
- return static_cast<_IntType>(
- _VSTD::upper_bound(__p.__p_.begin(), __p.__p_.end(), __gen(__g)) -
- __p.__p_.begin());
- }
- template <class _CharT, class _Traits, class _IT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const discrete_distribution<_IT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- size_t __n = __x.__p_.__p_.size();
- __os << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__p_[__i];
- return __os;
- }
- template <class _CharT, class _Traits, class _IT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- discrete_distribution<_IT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- size_t __n;
- __is >> __n;
- vector<double> __p(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __p[__i];
- if (!__is.fail())
- swap(__x.__p_.__p_, __p);
- return __is;
- }
- // piecewise_constant_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS piecewise_constant_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- vector<result_type> __b_;
- vector<result_type> __densities_;
- vector<result_type> __areas_;
- public:
- typedef piecewise_constant_distribution distribution_type;
- param_type();
- template<class _InputIteratorB, class _InputIteratorW>
- param_type(_InputIteratorB __fB, _InputIteratorB __lB,
- _InputIteratorW __fW);
- #ifndef _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- param_type(initializer_list<result_type> __bl, _UnaryOperation __fw);
- #endif // _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- param_type(size_t __nw, result_type __xmin, result_type __xmax,
- _UnaryOperation __fw);
- param_type & operator=(const param_type& __rhs);
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> intervals() const {return __b_;}
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> densities() const {return __densities_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- private:
- void __init();
- friend class piecewise_constant_distribution;
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_constant_distribution<_RT>& __x);
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_constant_distribution<_RT>& __x);
- };
- private:
- param_type __p_;
- public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- piecewise_constant_distribution() {}
- template<class _InputIteratorB, class _InputIteratorW>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_constant_distribution(_InputIteratorB __fB,
- _InputIteratorB __lB,
- _InputIteratorW __fW)
- : __p_(__fB, __lB, __fW) {}
- #ifndef _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_constant_distribution(initializer_list<result_type> __bl,
- _UnaryOperation __fw)
- : __p_(__bl, __fw) {}
- #endif // _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_constant_distribution(size_t __nw, result_type __xmin,
- result_type __xmax, _UnaryOperation __fw)
- : __p_(__nw, __xmin, __xmax, __fw) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit piecewise_constant_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> intervals() const {return __p_.intervals();}
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> densities() const {return __p_.densities();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return __p_.__b_.front();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return __p_.__b_.back();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const piecewise_constant_distribution& __x,
- const piecewise_constant_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const piecewise_constant_distribution& __x,
- const piecewise_constant_distribution& __y)
- {return !(__x == __y);}
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_constant_distribution<_RT>& __x);
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_constant_distribution<_RT>& __x);
- };
- template<class _RealType>
- typename piecewise_constant_distribution<_RealType>::param_type &
- piecewise_constant_distribution<_RealType>::param_type::operator=
- (const param_type& __rhs)
- {
- // These can throw
- __b_.reserve (__rhs.__b_.size ());
- __densities_.reserve(__rhs.__densities_.size());
- __areas_.reserve (__rhs.__areas_.size());
- // These can not throw
- __b_ = __rhs.__b_;
- __densities_ = __rhs.__densities_;
- __areas_ = __rhs.__areas_;
- return *this;
- }
- template<class _RealType>
- void
- piecewise_constant_distribution<_RealType>::param_type::__init()
- {
- // __densities_ contains non-normalized areas
- result_type __total_area = _VSTD::accumulate(__densities_.begin(),
- __densities_.end(),
- result_type());
- for (size_t __i = 0; __i < __densities_.size(); ++__i)
- __densities_[__i] /= __total_area;
- // __densities_ contains normalized areas
- __areas_.assign(__densities_.size(), result_type());
- _VSTD::partial_sum(__densities_.begin(), __densities_.end() - 1,
- __areas_.begin() + 1);
- // __areas_ contains partial sums of normalized areas: [0, __densities_ - 1]
- __densities_.back() = 1 - __areas_.back(); // correct round off error
- for (size_t __i = 0; __i < __densities_.size(); ++__i)
- __densities_[__i] /= (__b_[__i+1] - __b_[__i]);
- // __densities_ now contains __densities_
- }
- template<class _RealType>
- piecewise_constant_distribution<_RealType>::param_type::param_type()
- : __b_(2),
- __densities_(1, 1.0),
- __areas_(1, 0.0)
- {
- __b_[1] = 1;
- }
- template<class _RealType>
- template<class _InputIteratorB, class _InputIteratorW>
- piecewise_constant_distribution<_RealType>::param_type::param_type(
- _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW)
- : __b_(__fB, __lB)
- {
- if (__b_.size() < 2)
- {
- __b_.resize(2);
- __b_[0] = 0;
- __b_[1] = 1;
- __densities_.assign(1, 1.0);
- __areas_.assign(1, 0.0);
- }
- else
- {
- __densities_.reserve(__b_.size() - 1);
- for (size_t __i = 0; __i < __b_.size() - 1; ++__i, ++__fW)
- __densities_.push_back(*__fW);
- __init();
- }
- }
- #ifndef _LIBCPP_CXX03_LANG
- template<class _RealType>
- template<class _UnaryOperation>
- piecewise_constant_distribution<_RealType>::param_type::param_type(
- initializer_list<result_type> __bl, _UnaryOperation __fw)
- : __b_(__bl.begin(), __bl.end())
- {
- if (__b_.size() < 2)
- {
- __b_.resize(2);
- __b_[0] = 0;
- __b_[1] = 1;
- __densities_.assign(1, 1.0);
- __areas_.assign(1, 0.0);
- }
- else
- {
- __densities_.reserve(__b_.size() - 1);
- for (size_t __i = 0; __i < __b_.size() - 1; ++__i)
- __densities_.push_back(__fw((__b_[__i+1] + __b_[__i])*.5));
- __init();
- }
- }
- #endif // _LIBCPP_CXX03_LANG
- template<class _RealType>
- template<class _UnaryOperation>
- piecewise_constant_distribution<_RealType>::param_type::param_type(
- size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw)
- : __b_(__nw == 0 ? 2 : __nw + 1)
- {
- size_t __n = __b_.size() - 1;
- result_type __d = (__xmax - __xmin) / __n;
- __densities_.reserve(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- {
- __b_[__i] = __xmin + __i * __d;
- __densities_.push_back(__fw(__b_[__i] + __d*.5));
- }
- __b_[__n] = __xmax;
- __init();
- }
- template<class _RealType>
- template<class _URNG>
- _RealType
- piecewise_constant_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
- {
- typedef uniform_real_distribution<result_type> _Gen;
- result_type __u = _Gen()(__g);
- ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(),
- __u) - __p.__areas_.begin() - 1;
- return (__u - __p.__areas_[__k]) / __p.__densities_[__k] + __p.__b_[__k];
- }
- template <class _CharT, class _Traits, class _RT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_constant_distribution<_RT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- size_t __n = __x.__p_.__b_.size();
- __os << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__b_[__i];
- __n = __x.__p_.__densities_.size();
- __os << __sp << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__densities_[__i];
- __n = __x.__p_.__areas_.size();
- __os << __sp << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__areas_[__i];
- return __os;
- }
- template <class _CharT, class _Traits, class _RT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_constant_distribution<_RT>& __x)
- {
- typedef piecewise_constant_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- size_t __n;
- __is >> __n;
- vector<result_type> __b(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __b[__i];
- __is >> __n;
- vector<result_type> __densities(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __densities[__i];
- __is >> __n;
- vector<result_type> __areas(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __areas[__i];
- if (!__is.fail())
- {
- swap(__x.__p_.__b_, __b);
- swap(__x.__p_.__densities_, __densities);
- swap(__x.__p_.__areas_, __areas);
- }
- return __is;
- }
- // piecewise_linear_distribution
- template<class _RealType = double>
- class _LIBCPP_TEMPLATE_VIS piecewise_linear_distribution
- {
- public:
- // types
- typedef _RealType result_type;
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- vector<result_type> __b_;
- vector<result_type> __densities_;
- vector<result_type> __areas_;
- public:
- typedef piecewise_linear_distribution distribution_type;
- param_type();
- template<class _InputIteratorB, class _InputIteratorW>
- param_type(_InputIteratorB __fB, _InputIteratorB __lB,
- _InputIteratorW __fW);
- #ifndef _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- param_type(initializer_list<result_type> __bl, _UnaryOperation __fw);
- #endif // _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- param_type(size_t __nw, result_type __xmin, result_type __xmax,
- _UnaryOperation __fw);
- param_type & operator=(const param_type& __rhs);
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> intervals() const {return __b_;}
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> densities() const {return __densities_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- private:
- void __init();
- friend class piecewise_linear_distribution;
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_linear_distribution<_RT>& __x);
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_linear_distribution<_RT>& __x);
- };
- private:
- param_type __p_;
- public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- piecewise_linear_distribution() {}
- template<class _InputIteratorB, class _InputIteratorW>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_linear_distribution(_InputIteratorB __fB,
- _InputIteratorB __lB,
- _InputIteratorW __fW)
- : __p_(__fB, __lB, __fW) {}
- #ifndef _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_linear_distribution(initializer_list<result_type> __bl,
- _UnaryOperation __fw)
- : __p_(__bl, __fw) {}
- #endif // _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_linear_distribution(size_t __nw, result_type __xmin,
- result_type __xmax, _UnaryOperation __fw)
- : __p_(__nw, __xmin, __xmax, __fw) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit piecewise_linear_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> intervals() const {return __p_.intervals();}
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> densities() const {return __p_.densities();}
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return __p_.__b_.front();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return __p_.__b_.back();}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const piecewise_linear_distribution& __x,
- const piecewise_linear_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const piecewise_linear_distribution& __x,
- const piecewise_linear_distribution& __y)
- {return !(__x == __y);}
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_linear_distribution<_RT>& __x);
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_linear_distribution<_RT>& __x);
- };
- template<class _RealType>
- typename piecewise_linear_distribution<_RealType>::param_type &
- piecewise_linear_distribution<_RealType>::param_type::operator=
- (const param_type& __rhs)
- {
- // These can throw
- __b_.reserve (__rhs.__b_.size ());
- __densities_.reserve(__rhs.__densities_.size());
- __areas_.reserve (__rhs.__areas_.size());
- // These can not throw
- __b_ = __rhs.__b_;
- __densities_ = __rhs.__densities_;
- __areas_ = __rhs.__areas_;
- return *this;
- }
- template<class _RealType>
- void
- piecewise_linear_distribution<_RealType>::param_type::__init()
- {
- __areas_.assign(__densities_.size() - 1, result_type());
- result_type _Sp = 0;
- for (size_t __i = 0; __i < __areas_.size(); ++__i)
- {
- __areas_[__i] = (__densities_[__i+1] + __densities_[__i]) *
- (__b_[__i+1] - __b_[__i]) * .5;
- _Sp += __areas_[__i];
- }
- for (size_t __i = __areas_.size(); __i > 1;)
- {
- --__i;
- __areas_[__i] = __areas_[__i-1] / _Sp;
- }
- __areas_[0] = 0;
- for (size_t __i = 1; __i < __areas_.size(); ++__i)
- __areas_[__i] += __areas_[__i-1];
- for (size_t __i = 0; __i < __densities_.size(); ++__i)
- __densities_[__i] /= _Sp;
- }
- template<class _RealType>
- piecewise_linear_distribution<_RealType>::param_type::param_type()
- : __b_(2),
- __densities_(2, 1.0),
- __areas_(1, 0.0)
- {
- __b_[1] = 1;
- }
- template<class _RealType>
- template<class _InputIteratorB, class _InputIteratorW>
- piecewise_linear_distribution<_RealType>::param_type::param_type(
- _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW)
- : __b_(__fB, __lB)
- {
- if (__b_.size() < 2)
- {
- __b_.resize(2);
- __b_[0] = 0;
- __b_[1] = 1;
- __densities_.assign(2, 1.0);
- __areas_.assign(1, 0.0);
- }
- else
- {
- __densities_.reserve(__b_.size());
- for (size_t __i = 0; __i < __b_.size(); ++__i, ++__fW)
- __densities_.push_back(*__fW);
- __init();
- }
- }
- #ifndef _LIBCPP_CXX03_LANG
- template<class _RealType>
- template<class _UnaryOperation>
- piecewise_linear_distribution<_RealType>::param_type::param_type(
- initializer_list<result_type> __bl, _UnaryOperation __fw)
- : __b_(__bl.begin(), __bl.end())
- {
- if (__b_.size() < 2)
- {
- __b_.resize(2);
- __b_[0] = 0;
- __b_[1] = 1;
- __densities_.assign(2, 1.0);
- __areas_.assign(1, 0.0);
- }
- else
- {
- __densities_.reserve(__b_.size());
- for (size_t __i = 0; __i < __b_.size(); ++__i)
- __densities_.push_back(__fw(__b_[__i]));
- __init();
- }
- }
- #endif // _LIBCPP_CXX03_LANG
- template<class _RealType>
- template<class _UnaryOperation>
- piecewise_linear_distribution<_RealType>::param_type::param_type(
- size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw)
- : __b_(__nw == 0 ? 2 : __nw + 1)
- {
- size_t __n = __b_.size() - 1;
- result_type __d = (__xmax - __xmin) / __n;
- __densities_.reserve(__b_.size());
- for (size_t __i = 0; __i < __n; ++__i)
- {
- __b_[__i] = __xmin + __i * __d;
- __densities_.push_back(__fw(__b_[__i]));
- }
- __b_[__n] = __xmax;
- __densities_.push_back(__fw(__b_[__n]));
- __init();
- }
- template<class _RealType>
- template<class _URNG>
- _RealType
- piecewise_linear_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
- {
- typedef uniform_real_distribution<result_type> _Gen;
- result_type __u = _Gen()(__g);
- ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(),
- __u) - __p.__areas_.begin() - 1;
- __u -= __p.__areas_[__k];
- const result_type __dk = __p.__densities_[__k];
- const result_type __dk1 = __p.__densities_[__k+1];
- const result_type __deltad = __dk1 - __dk;
- const result_type __bk = __p.__b_[__k];
- if (__deltad == 0)
- return __u / __dk + __bk;
- const result_type __bk1 = __p.__b_[__k+1];
- const result_type __deltab = __bk1 - __bk;
- return (__bk * __dk1 - __bk1 * __dk +
- _VSTD::sqrt(__deltab * (__deltab * __dk * __dk + 2 * __deltad * __u))) /
- __deltad;
- }
- template <class _CharT, class _Traits, class _RT>
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_linear_distribution<_RT>& __x)
- {
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- size_t __n = __x.__p_.__b_.size();
- __os << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__b_[__i];
- __n = __x.__p_.__densities_.size();
- __os << __sp << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__densities_[__i];
- __n = __x.__p_.__areas_.size();
- __os << __sp << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__areas_[__i];
- return __os;
- }
- template <class _CharT, class _Traits, class _RT>
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_linear_distribution<_RT>& __x)
- {
- typedef piecewise_linear_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- size_t __n;
- __is >> __n;
- vector<result_type> __b(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __b[__i];
- __is >> __n;
- vector<result_type> __densities(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __densities[__i];
- __is >> __n;
- vector<result_type> __areas(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __areas[__i];
- if (!__is.fail())
- {
- swap(__x.__p_.__b_, __b);
- swap(__x.__p_.__densities_, __densities);
- swap(__x.__p_.__areas_, __areas);
- }
- return __is;
- }
- _LIBCPP_END_NAMESPACE_STD
- _LIBCPP_POP_MACROS
- #endif // _LIBCPP_RANDOM
|