diff --git a/bootstrap_data/data_shots_1000_costTolerance_0.01_learningRate_1.csv b/bootstrap_data/data_shots_1000_costTolerance_0.01_learningRate_1.csv new file mode 100644 index 0000000..27910d5 --- /dev/null +++ b/bootstrap_data/data_shots_1000_costTolerance_0.01_learningRate_1.csv @@ -0,0 +1,1001 @@ +start_param_1,start_param_2,final_param_1,final_param_2 +2.7281087681875107,2.0898479496680564,1.5761087681875108,3.0574584869737134 +5.364799989125644,4.927042506589171,1.5876146819460573,3.108060360160681 +4.783755237329268,5.8302446304756605,1.5445699301496822,3.181882023499466 +6.0828032626368636,5.952472898989666,1.5516179554572775,3.2946855140527007 +4.6596111147617885,5.310217090974462,1.5476111147617881,3.1550845306118642 +2.533016458952021,1.434670021383695,1.6050164589520217,3.171970758818851 +0.399169131017916,2.941549701358915,1.525169131017916,3.1614611871102007 +3.422663338458467,0.6281623858283781,1.5726633384584667,3.197985176464829 +6.049468028460657,2.5279416040841554,1.6022827212810713,2.9646229829331365 +4.128145796538348,5.162384058179496,1.5541457965383478,3.2177382056074144 +0.19542139265589964,4.355111573730487,1.5734213926558998,3.1016161049481594 +3.9503503414885244,3.140547017714176,1.5683503414885243,3.0808567572959698 +1.4299001310139094,1.1235613304154732,1.5959001310139094,2.929977106229604 +4.368410487665081,4.399420156955138,1.610410487665081,3.2181813192053754 +2.0770228920079505,3.6490187699211574,1.5950228920079506,3.3003019853726903 +3.3084814432137306,5.466421224041634,1.5764814432137306,3.261023181221599 +4.365239844378442,2.454834419642602,1.5652398443784423,3.21509984181133 +5.343277216442558,5.345227855329407,1.5340919092629712,3.2246528141562965 +0.5792344547826695,0.39600232254265894,1.5652344547826693,3.3114003050739873 +3.3613915051386747,6.185072332561017,1.5753915051386744,2.996355789167377 +4.315666206509092,3.4658379998856366,1.5856662065090916,3.1988026243305043 +3.2955946756739887,1.6668083254812498,1.6075946756739887,3.2030471330866583 +1.9231360330468126,0.1982859426802777,1.5911360330468125,3.393285671381097 +6.143420775211949,0.6879635476256474,1.604235468032362,3.2734943015300466 +1.2105412583991373,3.261416274257906,1.5805412583991374,3.2205755697612384 +2.535867092191182,5.400916026932216,1.549867092191182,3.20494276207295 +1.4553281418338953,2.7956475532308573,1.5713281418338954,3.2009130055439408 +4.586206104127195,1.2267181307405355,1.5722061041271953,3.023709128593898 +2.7388979512704386,4.6555208373926185,1.5528979512704386,3.053308584061824 +6.259089856878274,4.863369260063553,1.5499045496986874,3.1637676344714736 +3.4418280034270476,2.7476063303177267,1.5698280034270478,3.184287709166708 +3.5940888289705386,6.154382760244775,1.5440888289705386,2.9625246241975454 +5.5114569181043835,0.5716575867913432,1.5382716109247974,3.0817901170095867 +0.6523040673355655,1.663346848886613,1.5563040673355655,3.1870192858776627 +3.724384435681764,0.35962554092642673,1.5603844356817642,3.237324411614678 +4.85606671889758,5.032522937053471,1.6108814117179944,3.0658859359062616 +5.11375754132594,5.212065037360532,1.5545722341463537,3.248569628866912 +2.296351344346032,4.3492850377694765,1.5463513443460322,3.246586016359459 +2.6331938778937247,5.1763035592316164,1.571193877893725,3.0431621474441473 +0.18627327155014026,2.3101839470141368,1.5522732715501402,3.236953779823126 +1.98337196463563,0.6486990317578589,1.54537196463563,3.315911194655593 +6.177304639567566,1.4706819741090893,1.55411933238798,3.1011685613221913 +5.053520863952706,5.211792137306848,1.5403355567731198,3.097500281440916 +1.9817290582464446,3.1631159615689377,1.5857290582464445,3.0123195141966277 +1.0646075701012174,5.645000824965761,1.5686075701012174,3.2448240376231587 +3.7136419118950297,0.8721174100565958,1.5836419118950298,3.146630491255606 +5.837039170235038,0.056669887788667175,1.5638538630554524,3.1951209487248704 +5.563076898273213,2.5198923226623835,1.6058915910936267,2.9942728133544425 +1.4473236731995376,0.6932112948255678,1.5613236731995377,3.2473261221940697 +6.19992480970981,5.4130528769538335,1.5367395025302237,3.129115017794054 +0.10102590225238832,1.5570677731221834,1.5350259022523882,3.0116251717342575 +3.829702006404895,2.800678145023265,1.559702006404895,3.16824448549327 +2.503337052674221,0.8217460011250708,1.5653370526742212,3.234489159082031 +6.2287196094958475,0.07605001680234554,1.5775343023162613,3.0794125936341876 +3.3118472347627677,2.7636041542031347,1.5898472347627677,2.9081174162682655 +3.054589329210981,2.6452381764455213,1.540589329210981,3.235857595320402 +2.081411311969535,1.9925422336997676,1.5674113119695352,3.1329403669528633 +4.870632227432806,5.501954923817637,1.5554469202532208,3.142618840971702 +4.139602894251847,4.7500785600790305,1.5836028942518467,3.025344193258234 +6.194893261082329,2.888596188226654,1.5657079539027428,3.051959006213323 +2.4258599484546353,5.136739718151151,1.5858599484546352,3.2989080158011226 +5.9389069318810535,5.013709334697666,1.5817216247014672,3.062780296818405 +0.18478331495180822,6.109411865517998,1.5787833149518085,3.234854587483337 +3.7871975773136435,1.2780722399149198,1.5951975773136433,3.1755942026831545 +3.898286049661464,3.217170003327751,1.562286049661464,3.104072667798518 +0.16221585522110407,5.978372060810805,1.5422158552211043,3.2891687493379416 +1.4532640635806573,4.68061408761182,1.6152640635806574,3.103534575509743 +0.7185944869896205,4.858089621178964,1.574594486989621,3.123930476397398 +1.100551243430255,2.942659203102142,1.5685512434302549,3.0588981312849644 +0.18604404923567525,0.5968859268522496,1.580044049235675,3.3332131281289596 +4.544690698344898,4.313760582272926,1.5466906983448971,3.19221200494137 +3.162824859709437,4.9342424253785175,1.5548248597094372,2.980171794845666 +3.080020977254927,3.799873753305128,1.5920209772549268,3.206112741776657 +0.3599136369199258,3.6993523416580683,1.5999136369199258,3.2658125554626767 +3.620130939344473,1.394770670913069,1.5821309393444731,2.9561422197471954 +4.666148135808343,5.7499514443197945,1.560148135808343,3.1518543198010347 +6.160874606588333,1.2789908789951663,1.559689299408747,3.1576632858418625 +4.972281172228049,0.09204881021919194,1.5510958650484623,3.142535276854881 +0.17688147281727998,5.081918137972941,1.5688814728172802,3.0712988396754723 +5.076732103680693,1.0666943643472555,1.5275467965011076,3.0113402169193364 +0.20744016551413758,6.055740562782343,1.5694401655141375,3.071227541872039 +0.32602427320985755,6.250650007710616,1.6040242732098575,3.0839246128921047 +4.508748282209726,3.8211397985646176,1.5847482822097259,3.155122156003581 +2.172917993550345,1.11878223682425,1.552917993550345,3.0822776453178724 +5.039170787430712,1.3442185482907933,1.5719854802511257,3.116076804915434 +0.5375413452659095,4.361466492632545,1.5835413452659093,3.2399179153009885 +3.6663465875079466,5.039836081761231,1.5403465875079465,3.117181377764277 +5.532805475914931,5.563695372124164,1.5176201687353446,3.229492030506948 +4.503421505024923,2.1454068877529404,1.5654215050249227,3.292088206313214 +3.2824913403853544,0.5503997462776172,1.5764913403853542,3.24274465040407 +2.602100120407472,5.282266931965449,1.5641001204074723,3.2276653365177235 +5.556300671304968,0.08562444266431889,1.5691153641253823,3.145535687260777 +6.172425301253766,1.2151817226608477,1.5992399940741802,3.357747912409086 +2.442902003601251,0.3097139106302606,1.5869020036012509,3.3319260433836413 +2.8454409487473082,1.6973088374160346,1.5374409487473082,3.2115564964463146 +1.7618740155261994,3.184445332278409,1.5918740155261992,3.1373214424745623 +0.19935281301816524,5.174910620155097,1.577352813018165,3.010353281831731 +0.3706812988368342,0.6997218951661289,1.5806812988368342,3.228703981305913 +2.263361903484165,3.1137319069151435,1.553361903484165,3.0823159803792457 +4.524300883790673,1.7079343791116501,1.5583008837906724,3.2598811499850084 +3.412351185976149,2.7663458498314566,1.6083511859761488,3.0082484841578716 +0.7083019668914105,0.41823759186898773,1.5323019668914104,3.1671311637600565 +5.72381822538655,4.567461999682816,1.5726329182069638,3.185161232103307 +2.3376894443775584,0.272551860760509,1.5796894443775582,3.184808250638247 +1.6765935027936312,2.2245770838920977,1.562593502793631,3.075948693014932 +5.470641985676947,1.6792845951431565,1.5554566784973602,3.1935322541734363 +4.143310092647044,4.621494131510356,1.5913100926470443,3.0632641753298184 +1.1910143614707411,1.6082638777191827,1.5230143614707412,3.1916265751284385 +6.075414870603744,4.173170471273659,1.5822295634241577,3.1898519707000537 +1.286918980231456,6.026937219242449,1.574918980231456,3.083264902828813 +0.4583948603761305,1.5183651677843408,1.5983948603761304,2.985488937010774 +4.548482736876491,5.371446471959813,1.5684827368764915,3.213172318943624 +3.6599716062019847,3.127105761626484,1.5999716062019846,2.929185424450327 +3.7322685055689875,2.5396550801609066,1.5582685055689873,3.2810709464080983 +5.619343441588972,1.5629458108224887,1.5861581344093862,3.089759840467128 +4.978628938682764,6.275452608201237,1.5414436315031774,3.086736064807597 +1.9164445336287523,4.52383449017423,1.5424445336287522,3.235781502202415 +3.019614803431766,0.4044838821813818,1.549614803431766,3.121961527536553 +2.8417126438697213,3.005714672381436,1.571712643869721,3.2507588993614402 +1.5335284968727207,2.1922397383214727,1.5595284968727208,3.015337013561998 +2.0873132262290923,4.012349613190337,1.5373132262290923,3.299208080825454 +3.125524170475097,3.233351048233259,1.599524170475097,3.085696193514538 +0.38080587435975194,4.02502488840622,1.542805874359752,3.2113523911264634 +4.443058676912978,5.864056242085843,1.579058676912977,3.0083485199727207 +2.605556755981168,2.0949520972233877,1.5735567559811678,3.2447750084372515 +1.9502473680091479,0.8208220152292007,1.5902473680091478,3.1832996907287248 +1.6808185646351281,2.181203077331249,1.560818564635128,3.2367782089374204 +5.177930245351373,1.926252872655954,1.6067449381717873,3.1043501177521264 +5.2360936325420475,5.70055925277952,1.590908325362461,2.9453824955812715 +0.2006271208456963,4.773374081709387,1.5766271208456963,2.995232639777564 +0.9289357447602604,1.9318703002954818,1.5889357447602603,3.02514454374473 +0.7387442648047969,3.483533528673935,1.5967442648047971,3.2918963768049574 +3.680909057698226,0.7963579589291022,1.6009090576982261,3.0645878548209327 +5.559534051081992,6.014660212519571,1.5523487439024062,3.174660453674398 +3.144683582028327,1.8614766765293063,1.576683582028327,3.3160340751413804 +5.0525009563273064,0.7025892605615955,1.5613156491477191,3.1781642715903526 +1.7320097262322702,0.3264207215724036,1.5960097262322703,3.12557977592091 +2.522155010064102,1.9469992016996296,1.5601550100641022,3.2381937823250344 +1.8569109699021862,1.1460759810793884,1.5789109699021862,3.200677576527113 +5.463097888339452,5.5176249849039065,1.587912581159866,3.199129606554638 +2.7169275897212004,1.3599223743664413,1.5589275897212003,3.235453188559548 +4.467769636657403,0.8699273893685998,1.507769636657403,3.13187409995325 +3.6534877361685294,4.8417313107486395,1.5094877361685293,3.0918642026991243 +4.932134046343568,4.026847679759066,1.562948739163981,3.172334477982642 +1.7073741759159018,1.5662535303970744,1.5593741759159017,3.2281560441460746 +3.5551176385784937,0.47767521820137,1.5531176385784935,3.2014360488637204 +3.209172363265093,1.2436930215323014,1.5631723632650925,3.021834463464124 +4.5352424306033265,4.7917283180442825,1.5832424306033268,3.098409877759383 +4.050815771936724,2.099667577918199,1.5608157719367244,3.246348896478473 +3.6818172592777336,5.0032877287125945,1.5418172592777335,3.2031551382056445 +1.0102449898561368,5.522494075891207,1.5502449898561368,3.0814765840519374 +3.472935028611534,0.06617114163331964,1.6109350286115343,3.182631053994394 +4.322035727505012,5.176935125962198,1.560035727505012,3.191448568893448 +2.4424761860271422,1.4565196243214729,1.520476186027142,3.143554879299192 +2.180651669477124,0.3781930136593554,1.5886516694771242,3.101953844321706 +2.6958869856768914,3.3707456914543568,1.5358869856768913,3.1571173910102504 +3.3824883037817406,4.635541775452618,1.6204883037817404,3.1464268576510555 +2.9111613511828027,5.369870417482731,1.4931613511828026,3.1927467085450023 +1.316816978509743,6.193190122475895,1.568816978509743,3.061022246846871 +3.2385107043430033,5.519607025896448,1.5665107043430035,3.160270943050514 +1.1587901726083245,0.8695851728583742,1.5607901726083244,3.2163548850899493 +4.755906362351947,4.68952454786879,1.5187210551723593,3.131294591688253 +2.04680223572466,4.41871082891349,1.5208022357246598,3.206056064627829 +1.8091901000995367,3.3165529323673666,1.5451901000995367,3.2725706352171096 +5.0508885430163994,4.2230335075473775,1.5837032358368135,3.239715006973772 +6.282585862809858,4.02826011665419,1.569400555630272,3.293127435714178 +3.365072834513117,4.263482498625073,1.5530728345131166,3.2016241817117224 +5.1697017437506725,2.7331062052579176,1.6285164365710865,3.3331504020935685 +5.454775347581945,1.1109509678333866,1.553590040402359,3.1718357485882893 +0.1516518788413995,6.180436042034924,1.5116518788413993,3.0419849810987207 +0.7345586173385958,1.6608225349664063,1.580558617338596,3.12480471153925 +5.45218845125186,1.2061053356559992,1.547003144072274,3.3235387841755206 +0.9309213883278006,3.948810913004206,1.6089213883278006,3.3330587529006066 +3.149199594306909,1.2017746773947424,1.579199594306909,3.3160665332606736 +4.521020558099626,1.473732258713916,1.571020558099626,2.9659887691690674 +2.73295368768085,6.170049177359118,1.5369536876808498,3.0347397090765043 +3.1446604613866733,1.485178963498162,1.594660461386673,3.1407982919399826 +2.5460104375075594,1.605961678764558,1.5740104375075596,3.195607561480993 +3.527256426484749,4.241757956165805,1.5732564264847488,3.1233509714878385 +4.309900785422849,0.6557069301917651,1.5039007854228492,3.2035385722530876 +0.8476285478047219,1.8189162340255012,1.585628547804722,3.1729426677227015 +5.648400608989843,2.2026159147243733,1.6132153018102566,3.217350341833875 +0.5298235720889911,5.6866358785885485,1.613823572088991,3.2330520161349203 +4.674176312997546,3.764000919701064,1.5441763129975472,3.141965574290285 +2.4329845406638304,5.244210059767048,1.5689845406638305,2.9791217565288064 +2.013783818922805,2.3248773327889154,1.5297838189228048,3.2108064611012366 +3.116237638301573,0.4979157641207708,1.5662376383015726,3.212251816822352 +0.5980587442410982,3.1678289408593954,1.588058744241098,3.1489793849378565 +1.8355986808333542,3.5205018014610485,1.5195986808333541,3.215767314062839 +5.259947708945138,5.655088192646118,1.5987624017655517,2.9878760297483837 +5.020744338101369,0.36668212713245674,1.5995590309217824,3.165841181480962 +4.957932124550647,1.0391315657655529,1.5767468173710608,3.2916534983894317 +0.3078383726400447,2.652586090244977,1.5738383726400447,3.2494886944270363 +4.55667337395451,0.41587489858864846,1.5986733739545098,3.2495914721266423 +4.844648818334154,4.729265483464004,1.557463511154568,3.0862125256365434 +5.576184993399248,0.09369715005316133,1.5769996862196611,3.2132986550678253 +5.082759544418615,1.434864261763676,1.5895742372390291,3.1533154432772923 +5.365592678520187,4.7387212787190345,1.6224073713406004,3.070535579662854 +5.375473759403917,5.94369312575453,1.5362884522243299,3.210507517131409 +0.6813783145592981,2.267855821039407,1.5393783145592979,3.2825902481489098 +3.2450864923898375,1.899414935906647,1.5430864923898375,3.237733406335899 +6.151115135780901,5.866321683797837,1.4999298286013143,3.2053927062072822 +6.06836115821294,2.134115833055032,1.5171758510333537,3.1488502601645347 +3.9055346107574236,3.2689719076681047,1.6035346107574235,3.1778657207140006 +1.7271955607778509,3.8750361584740975,1.585195560777851,3.3158326661351145 +5.817557720182153,0.43291297208243246,1.556372413002567,3.147249024784013 +4.6466287004808065,2.153975771129136,1.552628700480806,3.269241163153513 +5.375951335819682,3.5139890771498563,1.5707660286400953,3.162130699947799 +2.796369093912223,4.24819593496555,1.5823690939122232,3.2994349535814327 +6.1463662733453885,3.143106405117853,1.5731809661658023,3.1054072932747756 +4.358279212907242,0.3549239210828228,1.5662792129072414,3.1980652725815855 +5.413328103522991,3.003980673548993,1.578142796343405,3.258449678489765 +1.7541297572755357,1.493282726874488,1.5441297572755357,2.9823976446760496 +2.9954008180464844,2.969338423526003,1.5734008180464845,3.2206658358131866 +2.748683975769703,5.6789435846229175,1.6086839757697031,2.8703597523136417 +3.7480905745795314,5.817766914570425,1.582090574579532,2.9997583043003813 +0.8615197764947601,3.9757932855921183,1.51951977649476,3.2563685679200556 +3.50221319703641,6.238808994848072,1.5862131970364102,3.2888534931272555 +4.070272325559304,2.353261158004908,1.5562723255593038,3.280030990813897 +0.2920282932097024,5.5106221645581455,1.5440282932097025,3.072746265372466 +0.5872206822505931,5.87891722345661,1.5432206822505932,3.0640502058401546 +4.300170599536924,5.367648911395659,1.6601705995369236,3.313047315947935 +0.5215103847923791,4.2731106331926805,1.573510384792379,3.3055000958870244 +4.211217695164589,3.9326525654297173,1.5792176951645889,3.247785366947142 +4.4554132552296295,0.8390414753192152,1.5854132552296296,3.060147481407199 +1.8471453834671097,2.492482948543143,1.5571453834671096,3.1050935159931523 +2.0164797059685102,1.2134598806313923,1.5604797059685103,2.9067783209162896 +3.5962148992351803,4.546713959460942,1.56821489923518,3.173837969842203 +0.6392164168793906,2.789855650843052,1.5132164168793905,3.0568910263981843 +3.6482935928965508,5.3005762065888025,1.5862935928965505,3.173717980108513 +2.80080293343157,2.7179099756622493,1.5968029334315699,3.2519807267725143 +5.992042295940273,1.2975957801873441,1.588856988760687,3.2202504841842967 +4.417542753500085,0.8476548935626,1.5635427535000845,3.241548495598022 +4.077382523671768,2.8460508717469257,1.5653825236717678,3.109944654648469 +0.755298799434902,2.072620899758517,1.541298799434902,3.2978420346585358 +0.8866803755602559,4.166721939553991,1.574680375560256,3.1928282169411544 +0.0640435046825377,0.32054167340289746,1.5560435046825376,3.3678865473849964 +1.2261250503526668,0.8043860795223663,1.602125050352667,3.1951380889041987 +2.153255347165541,1.0442632614308145,1.5732553471655408,3.054882559728282 +0.7652423347891201,5.67259315194155,1.57124233478912,3.2252924747951 +4.9541375505669025,0.9165351251553703,1.606952243387316,3.087375648785917 +0.4586713330601023,2.210065999530446,1.5586713330601023,3.2499331678686674 +2.1263555071924607,0.6724934970082261,1.5623555071924606,3.242316287644677 +0.5930311554045242,6.159612733733119,1.5410311554045242,3.011736894836146 +5.752121682638559,6.134487253054041,1.5709363754589722,3.1405494541829695 +4.754134849394001,4.109128864595147,1.5849495422144149,3.00642984318513 +3.482498634835871,3.0978334476781817,1.6024986348358712,3.1198245962533075 +0.5861494024239364,2.0973218040065316,1.5921494024239367,3.080640304580136 +1.2577032579004657,1.1658831803328829,1.5917032579004657,3.1859272565911203 +1.922115321546243,3.4900940956170103,1.578115321546243,3.204209164140339 +5.49155976039461,3.750316604034823,1.5343744532150232,3.134564443931224 +5.878063235743107,0.47861006337773326,1.5728779285635204,3.2117956720008527 +2.962741548811049,2.951282602634814,1.592741548811049,3.1837604590004576 +3.2418419055763334,5.093411363335851,1.5558419055763335,3.1896062152604365 +4.1341593933483605,4.938327614375201,1.5521593933483602,3.144478209175428 +5.925444935476746,3.918034859561094,1.546259628297159,3.132636696163646 +3.9670879009186018,3.7116526626956725,1.6110879009186019,3.0550597980954053 +3.9293638272780336,2.764437712320844,1.6153638272780337,2.9497916788826415 +1.8170942870717146,3.0795120487887524,1.5790942870717146,3.0606624928672135 +3.951772387892422,1.1158636061809624,1.5757723878924217,3.2647129812363804 +1.858777394288676,1.6672824983013272,1.618777394288676,3.2223708618282743 +0.1377268988991727,3.19608082226243,1.5477268988991726,3.158381710419352 +5.284350006005938,5.459605006851208,1.6051646988263513,3.0311538856262983 +2.503138140769098,3.915575547805294,1.583138140769098,3.139602162368615 +0.40854846141727325,4.1808230651368286,1.5625484614172733,3.184938193948864 +1.6599071473937042,5.441318528557561,1.5699071473937043,3.283044375541374 +5.888170710990605,2.8800552051151387,1.5969854038110187,3.1973560631277063 +2.865384631748593,0.05922931673116556,1.5793846317485933,3.1756892290922405 +2.2453628158274688,3.9644163931437237,1.5613628158274686,3.138177525249608 +5.236217443450546,2.2087877024148153,1.5890321362709596,2.9533451613155965 +3.084970225218075,1.763161809566388,1.5709702252180753,3.24913513471436 +3.201534635086486,0.8810809414094506,1.5875346350864863,3.045638279732818 +6.144524138824471,2.0871329007890806,1.5513388316448842,3.174123958931148 +1.7026131367385737,1.7738443778367787,1.5686131367385738,3.28180885155988 +2.949702764373629,5.514217152919036,1.5477027643736292,3.245987257027205 +0.3850022689427877,0.6748039314612014,1.5890022689427878,3.3074585751694476 +1.6119583949199408,3.7331261107860017,1.5679583949199407,3.2336128788652245 +2.8414654886727133,6.207063578301656,1.5814654886727133,3.181709852894685 +3.2216804673035773,3.948041924890862,1.5876804673035774,3.206626058643671 +1.4842829236802748,1.1293348373572687,1.5562829236802747,3.240485100569609 +2.0695906241166084,5.005784422919992,1.5795906241166084,3.0517137923871407 +5.261339835143061,3.0265136789049194,1.572154527963474,3.1050534952446647 +5.795850162754907,0.002529557335454708,1.5306648555753204,3.106423099082171 +4.957787170920174,0.1734664903300898,1.5486018637405878,3.195678623083471 +3.84503949741442,5.296253682509173,1.5510394974144202,2.996607860081444 +1.547455468236227,6.151525436985244,1.535455468236227,3.207853120571608 +4.255446092480115,4.5121886370809525,1.569446092480115,3.1738701666517004 +1.2955028127428263,4.052690900592696,1.5195028127428263,3.2327352180057596 +5.716471056884563,1.164044032634031,1.5872857497049766,3.265769517885603 +2.23392041945814,3.4475026711126073,1.54992041945814,3.221308000054142 +1.9549943103860499,3.490630396886584,1.5669943103860497,3.3021348376711965 +2.703532257053781,6.031346031212783,1.575532257053781,3.282452459321714 +1.5260642700294726,0.6479597565628764,1.5660642700294727,3.2900391782318916 +5.882028891787695,1.6725122032893434,1.522843584608109,3.1616271210909055 +4.704411128817231,3.595080335978909,1.5292258216376435,3.1175582526332604 +5.7053234926714405,4.161365014796003,1.5781381854918544,3.272294293830091 +4.418316031578218,0.33061239204257564,1.5363160315782187,3.220877633345185 +2.4172641479704517,2.443390295023402,1.5992641479704517,3.150248642081104 +1.3975719555675044,4.780901511011101,1.5635719555675043,3.150414923797998 +3.5734069011939815,5.588845716642753,1.5814069011939815,3.1698193733786124 +6.126303269266146,3.5579845637645753,1.5931179620865596,3.1872766306409797 +5.611541852206871,5.920447661650967,1.5663565450272845,3.29093461059631 +5.2976537324613515,2.9142079978328335,1.5484684252817649,3.1969513366559146 +0.6126728391341894,4.274304711594544,1.5806728391341893,3.196738431413245 +0.24421306050794117,5.59381005147682,1.5622130605079412,3.247040339245245 +1.5281155797883403,0.8564966247096087,1.5721155797883404,3.228399078169903 +3.869654086268401,2.206928390624633,1.5776540862684005,3.1776805205838796 +3.974207255580576,4.569101215137104,1.5802072555805757,3.045428778146055 +4.426939331471518,5.650699178085772,1.5929393314715181,3.241097612782401 +4.511178316921574,5.616461495054069,1.5411783169215734,3.065488260339156 +0.013575103401999003,5.46588719765154,1.547575103401999,3.1662413752238106 +1.2881934616768083,0.3856077475717114,1.5741934616768083,3.1470676900771393 +4.567150387405596,0.4102835019971926,1.5651503874055968,3.2314337049208266 +0.682157315884348,1.8046683019456742,1.606157315884348,3.2843584417864666 +4.805396208239701,0.8433777077072236,1.5882109010601144,3.1838642346316197 +4.212002839330292,6.258200229276276,1.5620028393302925,3.078908463843405 +1.2391487818276055,5.531652503976216,1.5511487818276055,3.269705793391565 +1.550991251706637,4.435263692196617,1.5929912517066371,3.219467335257367 +3.960771185375799,5.329623175382942,1.5767711853757989,3.1713490223667535 +4.548684265167312,0.49350115650127385,1.5346842651673118,3.2172619871636243 +4.636069223470975,2.412740561544806,1.584069223470975,3.0065015730732765 +2.039998434315124,4.962818474713766,1.545998434315124,3.0872876605206585 +2.8684377164240087,3.0464106385927376,1.6004377164240087,3.341720348030178 +4.685836355026992,0.1322799595228331,1.5638363550269918,3.1136513877795475 +0.17973725501744256,3.323858755681011,1.5277372550174424,3.1573543450407526 +2.7870344388756343,0.4782568612077087,1.5610344388756343,3.2208672477915985 +4.537021623405629,1.7295490321634885,1.5290216234056289,3.202955986697101 +2.458967561044502,3.1933795125291575,1.582967561044502,3.0614326210783864 +3.8118382903348627,4.270516995006949,1.5818382903348631,3.1521100103289816 +6.006676370348306,2.5494091724964982,1.57749106316872,2.9735241807311206 +2.2348336527792094,6.16962387448042,1.5808336527792095,3.024889628237037 +1.0537877672469484,4.5133759608884745,1.5657877672469485,3.1624911198448635 +6.034519909680337,0.48132595405948747,1.589334602500751,3.283626601061583 +0.2698279949755797,2.184217431164997,1.5418279949755798,3.004173113751933 +4.651662097156544,0.9973097628015751,1.545662097156544,3.1838582497000703 +3.1977435000096675,4.093593181789494,1.5557435000096673,3.286203869816917 +2.9372038273400096,5.65272897947276,1.5172038273400095,3.2808265260124676 +1.7081429719883292,1.7835346606863138,1.5201429719883293,3.263224800527107 +0.9597368325682698,5.797601983348112,1.56973683256827,3.23720397067243 +5.6943246412797315,2.767092394791197,1.5311393341001447,3.1378003279147926 +2.650353283900155,0.9954761020566193,1.558353283900155,3.0155201783148566 +4.820155456686895,1.8420614854627833,1.5429701495073087,3.25891977223178 +5.068967208934925,4.930013234396974,1.5557819017553385,2.9665178259033533 +2.0130718898404636,4.121130161496497,1.6070718898404637,3.285466515641612 +1.6393444312497305,5.274323958477824,1.5973444312497305,2.9306958388998385 +1.9929500727008935,3.222974618482197,1.5489500727008934,3.16956754337117 +3.4143189176570163,1.6913054310452813,1.5403189176570162,3.057898235356842 +1.0683164544681858,1.1417710348900718,1.6023164544681858,3.1963726303377964 +5.492072609941908,5.67989406754206,1.5788873027623223,3.0598057944481725 +2.903220309677715,5.947062562259674,1.5852203096777153,3.182461027100656 +6.26612330386101,1.3960050758870408,1.5749379966814236,3.208704037008351 +2.5641030589021647,5.680511025251857,1.5621030589021647,3.19865282891592 +4.519120115203521,5.9253420803796235,1.5991201152035215,3.229855583599581 +1.6822805326606127,5.259926464754749,1.5862805326606126,3.2870062783003586 +2.681891097666642,4.565674275637802,1.571891097666642,3.035718653339573 +5.300789478401767,6.195512440291223,1.5756041712221809,3.1638755295770715 +1.53372078588763,1.3100095470814754,1.56172078588763,3.264080177614324 +1.7547395260412413,0.06641713813759283,1.5867395260412414,3.214292977034565 +5.936994960465724,2.3816418507268913,1.5898096532861377,3.1199161243204934 +4.404133300313226,3.429550089775806,1.5421333003132263,3.22220497463888 +2.260159345425661,2.97635255963118,1.5741593454256613,3.1177242290427207 +1.1609211226247282,1.6776839401419188,1.5969211226247282,3.191931599172199 +0.8568872122173451,0.7687148907639518,1.5888872122173452,3.3196881254788635 +4.679749472254142,4.970213606328045,1.585749472254143,3.3271606485005827 +2.7959708692594583,2.386311772730859,1.519970869259458,3.184276306742668 +2.0770856363915375,2.099341226650168,1.6050856363915376,3.242880952556853 +5.110291376530962,2.9370420908770387,1.5711060693513756,3.0375730557919125 +3.5926421943332474,0.09935480252780489,1.5626421943332471,3.2032483442745208 +5.961146187789316,3.7067015635921914,1.5539608806097294,3.257453814128851 +2.6280664505892486,5.944856107372987,1.5520664505892487,2.9729094570770433 +1.3192108687026178,0.5341798592360758,1.5632108687026178,3.2893566164343238 +2.4266774319933453,0.7717414253136037,1.5746774319933452,3.203334139192104 +4.776994923281208,4.5849887694588105,1.5618096161016226,3.0424667765462217 +2.221186696255507,2.2972103060837727,1.593186696255507,3.2176969535855817 +4.67634146252217,4.876579337117719,1.5363414625221694,3.142420192336153 +1.560117576740895,5.259535526790869,1.576117576740895,3.2080755239967336 +2.189424658177522,3.424631198207411,1.6014246581775222,3.0759144136589436 +3.9588081191085536,3.5758734188515544,1.5808081191085535,3.2271566343030873 +3.5454512978777637,2.415410409174841,1.545451297877764,3.238507684415367 +1.9624198756754376,1.282522882360382,1.5464198756754375,3.148628918592719 +2.22729631451506,2.5488257180157086,1.57929631451506,3.2556840650734116 +3.697383252784571,5.329527499631122,1.581383252784571,3.2183772364187813 +6.083031053316457,1.9002297581251257,1.5478457461368706,3.197707524057711 +1.2553190632077826,5.393762571329319,1.5913190632077827,3.191506121162874 +5.499450609402208,1.763580613871149,1.5822653022226225,3.1772973079865565 +4.152534438774204,2.2511219503536775,1.5825344387742035,3.3192634525742064 +3.4248082230076906,5.727300724368202,1.5888082230076908,3.273716861914574 +3.9763868327444607,0.8505972412250131,1.6043868327444601,3.1062607665024844 +4.557148518541589,3.588817554369556,1.5751485185415885,3.22125121389955 +2.273355378094092,3.8341912313650948,1.5433553780940918,3.2184390712614954 +3.3777038868885305,1.9864365634507297,1.599703886888531,2.9823214346386937 +2.1925334789524262,3.206371046825642,1.548533478952426,3.1686719349825645 +5.67277108123959,1.7852724177611077,1.573585774060004,3.2178386677980533 +6.237060273782735,2.041603451919576,1.5778749666031486,2.977798062689334 +0.2512568366754026,4.033295446440195,1.5812568366754025,3.159932688742232 +4.910593788529032,1.8288760149695242,1.5654084813494464,3.2865750062351884 +3.6081040822467108,5.791038036702124,1.5901040822467105,3.1929409121833645 +5.46054594834365,0.09777181278813905,1.5793606411640637,3.028877758587416 +1.483702495765411,4.7061981463615545,1.525702495765411,3.1228354489522987 +3.463391578081695,1.2834449377765862,1.5853915780816952,3.096143898897897 +1.0620382635724865,3.304372677501696,1.5820382635724866,3.2007001199332326 +0.3191941505544413,1.2493930887591953,1.5871941505544414,3.231738053174355 +2.944714749812744,2.921722213649132,1.5567147498127443,3.2170319230865725 +1.8426663339507847,3.612415060107986,1.5966663339507847,3.2574150902523398 +1.3836536802667996,1.863936753615131,1.5836536802667995,3.221104779965921 +2.4470409569348344,0.11096521885891505,1.5330409569348344,3.252557872448708 +2.532893154822936,2.6027299964325223,1.5308931548229359,3.205915785921763 +4.761905087707539,6.024599458690817,1.592719780527953,3.011812103898205 +6.115963768336095,3.846648115513942,1.5407784611565083,3.205763214181624 +6.277913907680564,4.938324714978754,1.5667286005009782,3.1350505318182127 +1.390231308475158,4.690463464162509,1.6142313084751583,3.122808730021202 +0.16319713712772568,0.1876425322502001,1.5511971371277256,3.1470228119317847 +3.022409783803931,1.1304666329944042,1.5944097838039313,3.1348027459846928 +1.668176934484715,4.1171811316739655,1.570176934484715,3.209260854786516 +4.601915452211567,4.903312036723078,1.583915452211567,3.1031794462161266 +2.7130873861604736,6.139604617476175,1.5510873861604737,3.2493393761735656 +3.731710348350567,0.9327441929152414,1.5977103483505672,3.106726309199378 +4.595843103957474,1.9524826357833114,1.5678431039574743,2.920093173088967 +1.8042546609640757,5.4876597170541395,1.5702546609640757,2.9681024088751253 +4.72241620045261,0.07980728630727693,1.5412308932730245,3.039187565988862 +2.324555577114452,3.9295544638684383,1.618555577114452,3.228979302117914 +2.5168311092179927,1.4004347972492366,1.5868311092179928,3.266540833481573 +1.4539610897724062,6.108729705228635,1.5979610897724064,2.9545706810244825 +3.9289423393070306,3.4439134596119674,1.5629423393070307,3.0732055264883713 +2.110479229832342,3.699776679922449,1.5584792298323418,3.247387337805519 +4.346330409290773,0.39826185007147624,1.6043304092907724,3.1188810880802365 +4.439703899636584,2.118815294940388,1.5677038996365837,3.2152311310432253 +3.2591075383528607,1.9101652745274846,1.5891075383528603,3.207643040460069 +4.641687969337817,0.37273559713389337,1.5536879693378165,3.1907442074039376 +2.199221162700465,5.094913834601263,1.5532211627004653,3.3167723926694395 +5.923954962648142,1.6413338456788935,1.6007696554685553,3.193280616552251 +0.8003289556628994,1.1612454596510806,1.5623289556628994,3.27553731551701 +0.8413762869337147,1.1950921047301308,1.609376286933715,3.2496937001778554 +5.619404531475288,2.6540903766906907,1.5602192242957016,3.266700944140701 +5.270217685938372,1.4662298072113915,1.5750323787587848,3.093574801770905 +3.7928436710302886,4.546118289757272,1.602843671030289,3.173242300138533 +1.712006616215776,2.4879347548898094,1.560006616215776,3.0974037296862287 +1.6031996122095309,0.49939405336053805,1.5771996122095309,3.2608539958659657 +5.3405022350178255,5.498580106984074,1.5813169278382395,3.2774741008960904 +1.7016171496002843,6.057020151809502,1.5716171496002844,2.9562682027163767 +5.772901870195699,5.124134670115536,1.5137165630161127,3.2297543000008893 +3.1276948360917967,2.869704783235396,1.5656948360917966,2.9670941554966794 +4.842040130939778,2.712078205316656,1.5388548237601918,3.1613259547799957 +0.3687232722882419,2.6331448709293097,1.542723272288242,3.3682775518693213 +5.8820123874746,4.759345780032769,1.5608270802950137,2.9780627454473563 +3.4552196563926056,5.35400364414304,1.5572196563926057,3.362233901767112 +1.4484403773969066,1.4934476721494239,1.6004403773969067,3.2118988536630395 +1.397930556980026,2.1216901161456576,1.543930556980026,3.224389137555674 +4.942947827741706,4.880069276419173,1.56976252056212,3.0736535006050407 +1.3472665181545005,1.300972870466106,1.5712665181545005,3.113671831587416 +2.485500152125354,2.2091357014433353,1.581500152125354,3.117055978330785 +5.106323707532065,4.239322953027325,1.5971384003524782,3.136623931617307 +5.1294402242931385,2.165013712778061,1.576254917113553,3.120057879469358 +4.2274449019867575,1.54595946948088,1.5774449019867574,2.991092090132186 +4.1606206253547064,1.1278976138490229,1.5706206253547066,3.1793576166431574 +4.21486464454661,0.6360674366034013,1.54686464454661,3.293854821540366 +1.1022107416503446,3.1699900037092346,1.5802107416503446,3.129149299212567 +1.9819364532173522,2.4681598236897,1.563936453217352,3.38550487853792 +4.0769265066003815,5.696965530820922,1.5309265066003817,3.171125037334729 +5.169244658112987,0.3878970294055539,1.5820593509334018,3.212188824982778 +1.3419658316154397,5.824135753867557,1.6159658316154397,3.2103306660808473 +5.6260785507285735,0.7137807374083113,1.5648932435489877,3.01342655983604 +1.0895547212791874,4.0074798321721,1.5695547212791874,3.209515298160293 +0.11092175998643457,0.5868139128929506,1.5229217599864344,3.17234466679735 +6.108572650767348,1.81039700939053,1.5633873435877617,3.280662371270553 +0.9340786262118301,2.1443166230833195,1.60607862621183,3.269006793068465 +4.382362807686271,5.49195127296529,1.5963628076862717,3.1200488195049956 +1.864134534552947,4.119734810763163,1.622134534552947,3.2432304604116102 +0.6466961321997351,3.3655117100899616,1.5706961321997353,3.155025002299445 +0.47731539148200586,0.5987725262998141,1.579315391482006,3.372798839419602 +3.8621647368194783,3.1807901622561774,1.5661647368194782,3.1022503459164326 +0.6612820691769513,3.740706694396573,1.5892820691769511,3.3668571686193873 +2.910583212354325,4.070311578781603,1.576583212354325,3.1655328945477432 +5.1568824198021055,0.7410247634392194,1.5976971126225188,3.0752281050564347 +3.9013631119995904,3.293702360525755,1.54536311199959,3.1806050249965225 +0.018264788324648645,1.1826818031973094,1.5742647883246488,3.278124103141701 +3.434238618395587,3.2899556667489422,1.6022386183955866,3.1737167385661196 +6.183729325295208,5.332025911913262,1.5505440181156218,3.0386632747927136 +1.6551176123437799,6.031931512094711,1.52511761234378,2.9594538968838933 +3.5452060557136917,2.880042267307582,1.5932060557136918,3.0999537530588674 +4.512945086850081,0.29095685885590244,1.5509450868500805,3.2220628046551796 +5.5804294468093785,3.3024447514065183,1.5412441396297925,3.189347415877285 +5.414001495417151,2.8634571775467355,1.5328161882375642,3.117926182487508 +0.9837765965106376,0.21458867105033477,1.5917765965106376,3.2368008038037153 +4.249816759225517,0.4648148550238718,1.6018167592255166,3.135168610575196 +6.031044303081378,4.736443918946526,1.5458589959017919,3.15936440684445 +6.041131018670633,2.4804598329240717,1.5679457114910464,3.2281588844784417 +2.38950630361005,6.000740822399147,1.5895063036100499,3.217289731318592 +1.6263565652993104,4.015915452758113,1.5643565652993103,3.1362695097529723 +2.297630655705519,2.3569131306154283,1.5436306557055188,3.3842139283392907 +2.9116237925353317,3.130285386520014,1.5636237925353318,3.1899756469382208 +4.879774208450091,5.496793993254852,1.5865889012705043,3.1751570222519945 +5.080034191458316,1.1168056221602798,1.5728488842787298,3.322203664980313 +3.392354706481991,3.4871103725388446,1.5523547064819905,3.2326413675980716 +4.789920721373452,5.448806001228946,1.5587354141938654,3.083186733075831 +4.830653861964777,3.2006468430391166,1.53946855478519,3.087549507509884 +0.7304391880683814,5.155465963209731,1.5684391880683815,3.267368778402265 +4.051423647212285,3.6519180866360625,1.5514236472122855,3.2089535224799017 +1.0775093715322337,3.332561547245524,1.5595093715322337,3.181765099873214 +2.8626859306210024,1.1181046371995498,1.5626859306210024,3.2418212710262506 +2.1864609136174353,3.499149487408949,1.5744609136174352,3.1378663322461224 +4.532805279719574,3.7616203932502006,1.5428052797195742,3.15215141845378 +1.7625668643992345,4.066109056469037,1.5685668643992345,3.2838524857251787 +2.1072822185179523,1.8800045526079967,1.5832822185179523,3.1994734671157095 +3.9061319138211203,0.5086163017960936,1.5861319138211207,3.3454744679876764 +3.531087122249119,4.332541319298773,1.581087122249119,3.179576815431319 +3.8982229022201684,2.164392416196758,1.6062229022201684,3.223109140456519 +2.9661108180133042,2.0654806215576063,1.5841108180133043,3.171321235621214 +2.300896545528867,1.8393788951660581,1.5988965455288668,3.1965469215168487 +0.43461369056522664,2.755870620085535,1.5966136905652266,3.239675888738363 +1.107915156800012,2.3693031944972063,1.561915156800012,3.179834099123373 +1.5070142725017213,0.7319268241549913,1.5670142725017213,3.2514841323340056 +0.6069526690261392,5.6722419491746034,1.5689526690261395,3.2060917161066156 +6.115416927730887,3.3923584086650496,1.560231620551301,3.1975796641424825 +3.6153678787842685,5.957398609828606,1.5513678787842686,3.2273545938590744 +3.278020949181489,5.839202129980464,1.588020949181489,3.1374324478932425 +3.036510229543241,3.2919055333125127,1.5825102295432412,3.222790494933537 +2.9757940256542317,0.998943197351005,1.515794025654232,3.1603589430207824 +2.1028207520268047,1.2902959643081826,1.5608207520268047,3.2318002242266743 +2.4575455599472815,1.4896878561527156,1.6315455599472815,2.988227551915047 +2.1306487016886884,4.070594642273749,1.5606487016886883,3.1720991433470678 +2.1907712552641714,5.832163399462184,1.6087712552641713,3.1649512365644488 +3.8861334599485846,0.17645383009876084,1.5581334599485845,3.1389757024339353 +3.878634794563708,1.3710593551597752,1.628634794563708,3.2245990207777533 +1.3867667050294612,2.051113283660713,1.6107667050294612,3.2983255671358607 +1.034786066400785,2.0569582382062124,1.5947860664007851,3.2947457437205907 +1.8210046107042275,2.3076323567396386,1.5690046107042273,3.224977411587858 +5.849950094276385,2.944473904820005,1.5447647870967987,3.2869075040612934 +5.39115104804032,0.536584500964671,1.5679657408607337,3.2006550712088155 +4.320734325740027,0.22882772314342273,1.580734325740027,3.232190299975265 +0.7812133950139604,0.47823192321771224,1.5592133950139604,3.333939645330834 +0.29402442102621784,2.805839204114186,1.564024421026218,3.167122359277012 +5.505678840620896,6.034013720052984,1.5624935334413097,3.278836962854736 +5.330821016351673,5.988893422050332,1.539635709172087,3.11433614401567 +1.4503123376268237,1.5170549369369961,1.5563123376268235,3.062718522503174 +5.0640443485732245,5.817528302462983,1.5668590413936385,3.2131479926370443 +4.531184165979933,5.626076275097112,1.581184165979932,3.169350819989893 +5.366219892466869,1.9088666759216462,1.545034585287284,3.1372294034752555 +2.3149304012435925,1.7014761656583497,1.5749304012435925,3.2062990467278607 +2.921489314975242,1.910424425374841,1.5474893149752422,3.1733446721179384 +2.541526744574524,2.85045515301584,1.5695267445745238,3.2337294567537946 +0.6286628439668944,6.277937617266169,1.5586628439668946,3.1300617783691966 +4.296753906665849,4.022051095215851,1.5847539066658487,3.236652931818402 +5.186763739432111,0.024977347389710768,1.5995784322525242,3.0880301846397584 +1.2313473743313215,4.6045500343055,1.5473473743313215,3.149992635693426 +1.3190451101853653,1.826977365220361,1.5610451101853653,3.1998533548391004 +2.24055416657073,3.7009237399760124,1.5825541665707301,3.1605698035585683 +0.0995594594899577,1.0255494830023562,1.5895594594899576,3.023602410685464 +3.9464758959357216,3.40814480400148,1.5964758959357217,3.188233318250194 +4.8656144985881795,3.605909810155995,1.542429191408593,3.2132107284572706 +2.6062818781371426,3.6528799345748415,1.5682818781371428,3.2067737777650906 +4.580243095915155,3.5787126806018312,1.5682430959151554,3.0980490046025926 +2.7030227822291084,3.3246084434127923,1.5630227822291085,3.2492102197266375 +2.021939092815897,5.031229871998614,1.557939092815897,3.064592870851405 +4.835531559347203,1.7858800587718757,1.5783462521676166,3.2153047161552317 +2.929402828967587,3.6249084177421937,1.5714028289675872,3.263625262579368 +6.084646757723996,4.760092188568771,1.55346145054441,3.145313564623617 +2.0752192914185468,6.250559920406856,1.5612192914185468,3.102684081509883 +5.512568406849188,0.3632060520287365,1.5433830996696014,3.19063944025955 +0.02342291170332259,4.545224051534296,1.5534229117033227,3.0906666529222218 +5.2114305839462896,5.370788793024948,1.5802452767667037,3.278488085734145 +3.6445139660425765,0.3105287601905319,1.5445139660425764,3.2102187794539114 +3.5287533435259277,3.136484886336502,1.626753343525928,3.101927367147014 +2.6410970033693713,0.6384094354793305,1.563097003369371,3.2302233746909095 +2.4616065364251516,6.233797517727939,1.5636065364251517,3.0984880494453253 +1.4173826417992197,3.45058899740993,1.5913826417992196,3.2149695483906955 +4.121748565698592,5.997472688317813,1.5777485656985917,3.3428268960344374 +4.600663164868429,6.032050872636667,1.546663164868429,3.220325447673802 +1.1040226780852842,1.0783572189092718,1.578022678085284,3.180082704160844 +2.671561412897968,4.496672491708515,1.547561412897968,3.246318615579777 +5.305152005140908,2.0304725399114436,1.5179666979613216,3.1048972274391518 +0.49997684438019974,3.8966559299521304,1.5759768443801998,3.265195806580582 +0.18838342010865816,0.2584002402603086,1.5503834201086584,3.1518070742165083 +1.9206799000854013,4.929987665982313,1.5486799000854012,3.101580741593054 +3.5481266389208423,2.363478109135975,1.5841266389208424,3.1017523827295754 +4.135017092979522,2.6021582988305347,1.553017092979522,3.243043200162852 +5.703549145422518,1.2098297325230443,1.600363838242932,2.9471304699581995 +6.008465376750778,1.3922938078601006,1.5812800695711922,3.21441754694218 +4.626394416387657,4.074081672994589,1.5763944163876573,3.1755861740679077 +5.119381079406629,0.49403043573869954,1.6241957722270426,3.2774815268192574 +4.217389921721124,4.093783483165973,1.5593899217211242,3.1921463915857022 +5.184398062422164,1.3879481060587826,1.5652127552425776,3.2414877716767605 +3.085313308581361,4.913090548843469,1.6033133085813611,2.9872942521929255 +3.8523830208270584,4.215399003028259,1.5843830208270586,3.181815019997217 +2.0578364747863716,4.588348653197617,1.5858364747863716,3.237463812154006 +0.31119692087293,2.408525466857745,1.5611969208729302,3.2944545951700674 +5.692266716104359,5.049869529391433,1.5810814089247724,3.0738077502834527 +0.619102296215936,2.5005356618225445,1.5331022962159362,3.1100046366189624 +3.251051293124963,4.140605140048277,1.5530512931249625,3.1195875276315936 +3.0256864023441716,6.219443569527968,1.5556864023441714,2.9898863216376603 +1.6192840439363878,3.3242129623699177,1.6012840439363878,3.1168678472329914 +2.8309613955766006,0.5163963181772943,1.5789613955766004,3.2244491855716957 +2.899966062348761,1.6771236690189375,1.5539660623487608,3.181946550088448 +2.563648199336889,1.5337150413136922,1.5736481993368892,3.0385379223832025 +1.3563299050906887,1.8662234022410267,1.5883299050906887,3.185692316748741 +4.663012980560612,2.003474546420362,1.5990129805606124,3.156439050287815 +6.025874451134927,2.6517789832378282,1.5846891439553408,3.214124068230401 +2.565565058543565,3.608671608235198,1.607565058543565,3.1908397853077552 +3.5208922041570805,1.6604948565332343,1.6308922041570804,3.2187248127137713 +3.5629048278437163,4.515022759162856,1.5829048278437161,3.189270659347963 +3.4928833477342134,5.552544369038328,1.5508833477342132,3.1869251008852144 +3.9118462926764273,2.753099244603966,1.5698462926764276,3.1112408071132016 +1.7506827485658802,4.074004766332527,1.57668274856588,3.389137567849952 +0.47727303707269797,5.878573133450057,1.573273037072698,3.1987945999379632 +2.9144222835105307,1.1562824447165685,1.5644222835105308,3.3176981903863467 +3.1545842794173105,5.518698380964277,1.5465842794173104,3.1279463715824436 +1.832027550307044,0.9557913838485111,1.548027550307044,3.0700832397144424 +3.595111576681566,3.041058634281287,1.5911115766815658,3.1635807477712885 +1.4645563759173443,5.312222705325291,1.5545563759173444,3.059700772701409 +5.692839147124229,3.4697605911138303,1.5596538399446422,3.1053358432974143 +2.8474263369927484,3.294728785290638,1.5754263369927484,3.225613746911663 +2.203752347913544,6.1164643275672566,1.5677523479135438,2.996862822552592 +5.688976673730288,5.823415376477999,1.5697913665507015,3.2850085123774457 +1.7582946913454545,3.8217309106916386,1.6002946913454545,3.240536269777527 +2.725576048707711,1.0873169153280202,1.549576048707711,3.1796176226188226 +0.0865585321062703,3.1744137654220235,1.5865585321062703,3.105298727043048 +3.0630058853811257,3.460596424895702,1.559005885381126,2.970507970935693 +0.3784413464085877,2.4778815298214845,1.5784413464085878,3.040226614814059 +0.38491597823501816,0.685630701327837,1.5549159782350181,3.286869418500185 +1.3432150201103696,4.460729464629769,1.6292150201103697,3.2009508105402618 +3.636004399633834,3.711469386236664,1.5620043996338338,3.2213809322766562 +5.2362109630675455,4.759044962981031,1.5810256558879592,3.040593781467414 +1.173540204402406,2.960482559714058,1.517540204402406,3.0892878585112404 +5.894296411692841,0.9739230711968025,1.5891111045132555,3.1102060756378624 +6.0197039234803205,3.075121271845758,1.5985186163007343,3.3201654988257614 +3.2226936591401336,3.169498219667193,1.5846936591401335,3.021843364948472 +2.4855719187527927,3.5652107916749114,1.5955719187527928,3.28560904550542 +1.7388071228310216,2.690644410593267,1.5468071228310216,3.130467382095838 +0.42152009573038834,5.3118555588247105,1.5895200957303883,3.0216345143577517 +5.310436110168667,5.693448443644928,1.587250802989081,3.2712805077271976 +4.691486739476622,2.0548608950865526,1.549486739476623,3.113577619346314 +5.992182187664243,0.5170979339430091,1.5769968804846564,3.262849913180486 +1.7623885334230047,0.8816627502041781,1.5703885334230048,3.149892646096009 +2.010334176026477,3.525805894875422,1.5703341760264766,3.2085050368628525 +2.5037089770966916,1.3084226202142675,1.5917089770966915,3.25306847278635 +0.2103696569536811,1.5059172758427446,1.5663696569536811,3.08613838059841 +4.612330077003724,1.1559973024780612,1.5843300770037245,3.15719182281476 +3.3933375588331467,1.7339940311684965,1.5693375588331466,3.1508523179374923 +3.7745969488449145,5.828496211413004,1.5765969488449143,3.120443344018602 +5.414110537955499,6.2055047352397885,1.552925230775913,2.9853722653102506 +0.05320786781941406,1.699069049058878,1.5912078678194141,3.119068928481464 +4.888037761136201,3.572869979769302,1.5868524539566145,3.189595676031347 +1.304926566025465,4.949026366484574,1.600926566025465,2.9384070681871064 +1.5588229287755526,4.5602313291511996,1.6008229287755527,3.174788968918101 +1.7603364893059839,1.6979779869183398,1.592336489305984,3.2939070549419545 +4.395821682508702,3.9204934283499777,1.5938216825087015,3.147661635566889 +2.369058866993217,4.7495040746880095,1.5890588669932173,3.2258316376969596 +1.2873583484107098,5.96993614683075,1.5633583484107099,3.177060277789424 +1.1223163917939325,0.42181524927196556,1.5983163917939327,3.293230934653036 +4.259733333925213,2.4688281700359123,1.5777333339252124,3.119137849328999 +6.236550457021372,5.696229333034154,1.5773651498417862,3.1923799881230877 +4.245552476662064,1.2607713614667009,1.597552476662064,3.305948178953656 +4.294617904520191,1.3983361476191052,1.6026179045201911,3.173335996897338 +5.101306776079321,1.0582108527276495,1.5821214688997343,3.0751133363322953 +5.42607888914654,5.340003821009478,1.5648935819669538,3.253986299025854 +4.530223485928881,3.3326886615283775,1.5862234859288806,3.1190603610842706 +2.0672977242160564,4.218801171166873,1.5412977242160564,3.1066773717960854 +1.3688585304458984,1.5637809297791843,1.5728585304458984,3.106302922691773 +3.9043652299614133,4.272580051633013,1.5623652299614128,3.235854475948381 +0.1469860625826093,5.56805243016549,1.5649860625826093,3.1553092722085285 +3.236174922605785,6.240346944693252,1.5721749226057853,3.0484888086460225 +1.4746653098334725,0.7670738427744753,1.5826653098334726,3.1986665566529755 +0.21309499007692476,3.5626292371201305,1.5570949900769246,3.3018770468721774 +3.1934261490645284,0.6019795411650743,1.5474261490645287,3.1906518877230634 +0.09948205290840771,1.0238552444582756,1.5714820529084077,2.9496515411088184 +0.2965261731841638,4.424955733827458,1.6025261731841638,3.1620354870843608 +4.239540379990127,3.4143949003064313,1.5715403799901269,3.2070497851695046 +4.76390189001063,5.537208958207762,1.5787165828310434,3.108757836982851 +1.4714236102203968,5.963212785666856,1.6074236102203965,3.0101156912924516 +1.7076530233533034,3.0261219172709675,1.5976530233533035,3.0009891760422494 +3.6668136522242514,3.9968905129198444,1.6168136522242513,3.2963153511693206 +2.4528956405083155,4.173671461108656,1.5548956405083156,3.1369458854240233 +1.560823512919811,4.860900511984596,1.5748235129198112,3.139307737817388 +5.142080757620847,2.969707226891222,1.5768954504412607,3.2555921583678935 +6.0822036525538214,1.0366076811631482,1.6090183453742355,3.0126694602711273 +2.1559361076925008,2.171280065350213,1.5559361076925007,3.0100853038586877 +2.3179352719058444,2.597111937776356,1.5939352719058444,3.1940145419584165 +2.3617272692710642,2.7765245211565217,1.5497272692710642,3.200639529391144 +3.6802143502305014,0.9993643374674934,1.5702143502305013,3.0665323035295775 +2.7363868104792997,1.41445946321551,1.5863868104792995,3.0669371990037413 +0.1435317187301097,6.140505161972338,1.61153171873011,3.306788588434345 +4.224943388590803,1.0104764972200109,1.5869433885908026,3.316405504954919 +2.3199410307701256,2.2560452647778346,1.6159410307701256,3.273921284540927 +5.945450672949134,3.494658584061773,1.5282653657695473,3.2024904672779217 +6.160337545282239,5.479801431754375,1.583152238102653,3.2932529448558787 +5.591495724910752,0.3107156507390722,1.6083104177311656,3.1946977067345017 +5.862892586834099,3.0541633681168583,1.5437072796545126,2.912791698705318 +2.3039367586410964,5.3729292020222585,1.5239367586410966,3.132973640012736 +2.591223637999895,0.8981983422929364,1.581223637999895,3.1255875336880994 +2.812581195630317,3.0527704721594575,1.558581195630317,3.1218855105384327 +0.4991938448912149,1.035856399260312,1.5871938448912148,3.260103998001885 +5.6098897152211995,1.0638990909743078,1.5987044080416135,3.0619520186574154 +2.6254859335268863,5.301086338965202,1.5494859335268865,3.2119272243279897 +2.3154321249945395,4.861297670389904,1.5974321249945398,3.058023487229363 +1.9352943430724732,0.2845098617508599,1.597294343072473,3.2941556238898815 +5.716580573124278,0.8219882690098586,1.5853952659446922,3.159333203280664 +2.874341074315657,5.761888302195145,1.5983410743156572,3.2611805499376705 +1.534971171135093,0.5394580594471935,1.570971171135093,3.209811814998518 +3.2321030805074598,1.3654715580533925,1.5701030805074598,3.244143964900088 +3.3182820622627416,3.884811775286743,1.5502820622627413,3.1873782061898086 +2.8650996321975724,4.303797175131684,1.5790996321975723,3.113133559421153 +0.7268288943611623,5.183637739856596,1.5668288943611623,3.3018237403563098 +6.071593232093484,5.195691612787055,1.5684079249138978,2.9777271993526604 +0.21843744275223148,2.35685684635486,1.5904374427522314,3.1076974905628205 +2.830764278170199,5.411545459404133,1.5647642781701991,3.250129713734355 +3.7336121334637196,2.8664943716255173,1.5556121334637194,3.3220253063960374 +0.9797494707599319,3.113885800300145,1.603749470759932,2.922248648431167 +1.6173987233987586,1.2158672247781672,1.5293987233987585,3.182504225925377 +1.8065300521205125,1.4135817463527716,1.5865300521205126,3.1508824837879272 +4.489095386430266,2.7761586134307734,1.5670953864302661,3.2882382159659103 +0.838417636438042,1.6687168450757632,1.6084176364380423,3.258362727792199 +0.14086664518474998,1.668397490002998,1.56486664518475,3.292600891908921 +2.7052362130025775,5.99584631820776,1.5432362130025776,3.146421781401817 +3.688947014543811,1.4342219152972153,1.542947014543811,3.2343545058041663 +0.7113742729612249,0.836506854512004,1.571374272961225,3.2209756785866572 +6.1071370982827,3.0020783829700104,1.6259517911031143,3.1654412009566792 +1.6495702906851604,1.6152383784738633,1.5795702906851603,3.305415226105172 +3.98378862003223,2.9850403547184023,1.55978862003223,3.0321642445222494 +5.975079478951895,1.165055279534718,1.5878941717723094,3.2447896162111607 +4.508291842694632,0.3023704429645472,1.5482918426946324,3.1643613503848482 +3.111310940574366,3.5871062046119677,1.587310940574366,3.188123937606064 +4.048864145282601,6.157370498807483,1.5148641452826013,2.9466628068387135 +0.8090409075993342,4.07051296707036,1.6010409075993344,3.269406840404962 +2.047840858871394,5.619492157654472,1.573840858871394,3.2664392601157175 +2.807230426623177,0.7793671517245687,1.589230426623177,3.3397651644002506 +0.570141920510934,2.2457717218630404,1.556141920510934,3.304488446122801 +5.68471265370701,4.4531872637811185,1.537527346527423,3.2342493141882787 +6.085805529992043,0.7496705270165355,1.5566202228124564,3.09329864659452 +2.872427967771161,5.0569570635437655,1.588427967771161,3.1185943962788625 +5.314245933797016,6.014824417311038,1.6130606266174305,3.055444137629454 +5.801283512137536,1.6250555268831868,1.6120982049579493,3.1518695565278265 +3.8419837739159335,3.485256684341216,1.5719837739159337,3.249637235321981 +4.999962436913053,1.1187305076344567,1.5767771297334672,3.2267391781932075 +2.053616549549462,6.268636313969328,1.5916165495494619,3.057928622000559 +2.293488662231708,1.0877952990380468,1.5534886622317081,2.9821756691526917 +0.8413209192613651,6.214828458288082,1.5633209192613653,3.0135455442800825 +5.015135497902836,4.086218134171884,1.5699501907232496,3.2159969691275117 +4.808486739151621,2.055203572790177,1.6033014319720353,3.1861769280825034 +6.22609455294896,4.526783029204124,1.5829092457693739,3.1476238542782045 +4.771351114614484,3.561533225005795,1.576165807434897,3.17825892126784 +2.9807297417563303,6.106439529277215,1.5267297417563304,3.1816167687851182 +2.707072222584205,3.347184994413859,1.5790722225842049,3.246654029498986 +2.9053512092872213,5.100189657195571,1.5713512092872213,3.224658843002464 +0.5769569720370747,3.6180153009633873,1.6069569720370749,3.1970418853823546 +2.439476379219009,3.434518399837616,1.567476379219009,3.186332580204022 +2.5727256680583652,0.4849898730722574,1.6007256680583652,3.293573705381532 +4.691309847754554,1.8617668959107927,1.5473098477545548,3.140395105921839 +3.580483345883286,1.9738616382809262,1.614483345883286,3.1079765862268416 +4.331432643564953,4.199340034743866,1.5654326435649533,3.2191631268238505 +0.22901747667814315,5.087527415305615,1.601017476678143,3.268545268877125 +0.8400833500985819,0.09197617897960657,1.5600833500985818,3.1456042382688847 +0.37445407717987406,5.2468731420485515,1.610454077179874,3.1954131392544167 +5.024053549725337,5.254362624420645,1.6108682425457497,3.209185806933689 +3.337777420359199,3.365342137761938,1.5817774203591994,3.2114040977360383 +5.794330408505968,3.7040777067022983,1.5651451013263817,3.1825733262063927 +2.2578410667824165,4.800131207399519,1.5598410667824165,3.0094233948533375 +1.4984774906842335,2.054341605251612,1.5504774906842336,2.83973976864906 +1.9219402496382743,0.23911867964456765,1.5859402496382742,3.179649403404614 +3.6658485274870296,2.872049209094563,1.5558485274870297,3.258465105486107 +3.951574237432412,3.739341057490491,1.5655742374324113,3.183279157805098 +0.08052169143355759,1.6700383611635996,1.5825216914335576,3.3225160969518304 +3.7327102228245055,0.36902869563205776,1.5607102228245053,3.2530107516274884 +3.9589926096026997,1.5037238019433048,1.6229926096026996,3.017971460973585 +3.3202890166136916,3.760626652341158,1.6142890166136916,3.2014231600021743 +0.38292104732418253,4.882959848196008,1.5809210473241826,2.9194644397023874 +1.7152687503733746,6.056118085559709,1.5852687503733747,3.1501448809891497 +0.17455805561406165,5.866109017997288,1.6105580556140615,3.3057110053216068 +5.68868950682021,1.4208004630546567,1.605504199640624,2.919340158816989 +2.254081311226668,3.9860434603256487,1.5660813112266685,3.2289196308105086 +2.3801583872022958,0.1449373184682155,1.526158387202296,3.2299813042933927 +1.5700033830017606,3.684794875029515,1.5400033830017605,3.1695736798407896 +2.720461705201787,0.04891910011267713,1.600461705201787,3.168520605127341 +3.4121304145385047,3.859106201979977,1.588130414538505,3.3187522655625328 +2.2427113213892897,2.598048485566252,1.6007113213892898,3.150968792598055 +0.03167981834166628,5.3869660850591,1.5936798183416663,3.015063631598807 +4.65141824130573,2.632270312491941,1.6234182413057294,3.24802247259554 +6.160349798141162,1.359119560037028,1.5671644909615758,3.2849158566875722 +1.1148451216622348,1.5187642410516713,1.5908451216622348,3.0267287147747717 +1.919554785266585,5.889932908973086,1.555554785266585,3.25099507995766 +5.723210029642837,0.05272410801607864,1.5680247224632509,3.1817503909915126 +2.847204974298387,2.443927469987585,1.6032049742983872,3.3047238570711883 +6.0913315723390875,5.479238212228995,1.560146265159501,3.251849020833831 +4.172660520695314,5.137736172576991,1.5806605206953142,3.3564531379915787 +0.04582227945775579,1.4523832509826344,1.601822279457756,3.0922946161565066 +3.6079853495543857,3.3041784376411534,1.5659853495543856,3.1879395094583307 +2.1704480050655985,3.1068713570238207,1.5504480050655984,3.075455430487923 +4.443294603120555,1.2376357734631904,1.6092946031205546,3.1854232186888622 +1.7516733200601537,2.3247482498250194,1.5716733200601538,3.2138189707909306 +1.3916952104367388,0.7301368072427873,1.5556952104367388,3.221419781539493 +4.260076248531504,5.036681902313475,1.5720762485315036,3.205133385270625 +6.255951118867489,4.365033504437703,1.5927658116879027,3.1775114813807606 +2.1914634513309617,0.4422996259434819,1.5414634513309613,3.156635678645063 +2.7992091333428,2.2993358507944164,1.6012091333428,3.3737605383221254 +3.860819068142911,0.30212425665931836,1.5628190681429108,3.176681534693979 +1.3831320495558137,2.440077820537996,1.5531320495558136,3.1814936867851857 +0.7495572771857301,1.5269385585889093,1.59355727718573,3.0537525882335483 +0.4225847718643004,3.8892683855885357,1.5845847718643005,3.242100298949039 +6.120673144017516,0.6628812866107117,1.58948783683793,3.260978411129471 +3.411396555883926,0.39376242191455324,1.555396555883926,3.2463285513740856 +3.5091167348434844,3.4405601202164466,1.5651167348434847,3.1735247446613144 +4.506292616652413,2.14780544909891,1.5502926166524125,3.21280535866585 +2.6034633470322075,1.3870238983715282,1.6014633470322075,3.2688378978718133 +4.341858528376448,4.215501508161036,1.5358585283764477,3.207050266358712 +0.6331927141886868,6.052282029144005,1.581192714188687,3.0991849347695997 +4.517147783551118,4.2585697953096044,1.5751477835511176,3.1747203298211257 +1.2709943845341765,1.8884191855653414,1.5229943845341765,3.311560657641518 +2.2219873601326166,2.783187133249869,1.6219873601326167,3.260709216595517 +4.623734162536191,1.36308286159197,1.563734162536191,3.2574632317066152 +3.6369199931262943,4.066195752549943,1.5689199931262943,3.277655996498905 +5.020185019675083,0.4737131432801829,1.614999712495496,3.2508810490535605 +5.183663667860817,0.5322871617628278,1.532478360681231,3.2214904732356904 +0.37082466521068597,0.9974772428065536,1.576824665210686,3.0175213190647905 +3.326365560254957,2.1054125152327567,1.554365560254957,3.2238194999107224 +5.722062230432032,2.112466475823484,1.5788769232524456,3.23087346050145 +4.781796327878721,5.980975126322479,1.5606110206991357,3.031019624601664 +2.6122692761087047,4.798466867268198,1.558269276108705,3.054882944525863 +2.364218315140294,2.590135538284168,1.602218315140294,3.2121708836949474 +5.494767169273025,3.5788923400044625,1.5475818620934396,3.1673437023841995 +3.3047605446694375,1.122993561312465,1.5047605446694372,3.2152942686032686 +5.724365259934822,2.464555803699822,1.5491799527552355,3.259378745058041 +2.151773322720631,4.9059244810268305,1.599773322720631,3.2188892260491118 +5.982155853195702,2.0182819912859222,1.6009705460161157,3.190096051074914 +5.1848273968616185,0.7158813383432193,1.5636420896820327,3.3014120922476184 +0.5953913998048171,5.93776062847407,1.569391399804817,3.267406872922746 +0.10145509293126095,0.4677559791687204,1.555455092931261,3.1820920318703014 +4.3773428804970695,3.852920504034713,1.5613428804970693,3.1272126010554713 +3.9220559160262636,6.246365024219562,1.514055916026264,3.1016307779761796 +2.6586669234557045,2.5366128045473118,1.6106669234557047,3.337718931212709 +6.036488848983944,5.851527215962843,1.563303541804358,3.118341607339722 +5.266296716681606,0.9655383671818034,1.57911140950202,3.111246149583632 +3.4091726053708107,2.324831088311291,1.5551726053708106,3.204477031316432 +5.233095771568873,2.6115255741622625,1.5539104643892871,3.220994548958683 +3.0289212704943886,1.3132706844935138,1.6129212704943885,3.2107926472617487 +0.9600967143099258,4.904153375826953,1.5720967143099258,2.96893230121564 +5.6245338424879465,0.87966291536409,1.5513485353083605,3.1573175892166896 +2.6845030783539765,5.909191246693377,1.6065030783539764,3.169722452763076 +4.191348326103674,2.0509813808591826,1.5733483261036743,2.9589016577466323 +4.9745893714049005,2.3876050298856666,1.6254040642253145,3.012781967950035 +4.8064063761375095,5.106063968244685,1.5472210689579227,3.2085420054764504 +3.5388654626035936,3.668881867960338,1.5468654626035938,3.2698996009544343 +4.4759514442312405,4.001364469194165,1.5879514442312401,3.2348158617182556 +3.8749821219058775,0.32727192232765506,1.5749821219058773,3.1955460150551365 +5.103400685812768,6.077604457235029,1.598215378633182,3.259595846964985 +0.9993163313332701,4.709465143783385,1.56331633133327,3.0412794447272042 +0.22580032249256182,4.688140661365126,1.5798003224925619,3.214733706831513 +5.751312377267417,0.2653175133832012,1.5681270700878305,3.1555827546858106 +2.9638479854374733,3.8683606541231055,1.5578479854374732,3.2369005307515573 +2.247431033192533,3.1202873808362286,1.565431033192533,3.0323227865357145 +5.844481632878584,0.872762075079838,1.5792963256989976,3.175549490161156 +0.9177949011557293,3.806930006319504,1.5877949011557293,3.210027402137443 +4.250232720392077,5.734357173825767,1.5542327203920772,3.2242246436075224 +3.28153811862531,1.9671557483049447,1.5575381186253097,3.182952105244194 +3.0412010277411547,4.610040102160883,1.581201027741155,3.180615444777527 +5.965522104518904,4.9767492875382455,1.5543367973393178,3.003829101083855 +2.634484837181982,0.7377901219560953,1.568484837181982,3.1159757607235683 +3.8872086912016943,2.1647312585400527,1.541208691201694,2.928138273362372 +4.251761205882008,4.7570200538766105,1.6117612058820072,3.032285687055813 +4.3515679505788105,4.767779657262632,1.565567950578811,3.0870275875920923 +1.396678036326238,5.262943386550564,1.594678036326238,3.1329435674166843 +0.3657123316430775,3.8441205268390384,1.5877123316430775,3.2063772181603105 +1.070664746311024,5.999209521924697,1.588664746311024,3.046112427550292 +5.021740949964953,5.825870864014494,1.592555642785367,3.174366664384709 +4.668103543684539,0.050675374157133656,1.5341035436845392,3.0697459142569246 +5.842343936073214,1.4846545922029597,1.5591586288936279,3.121424364723241 +0.32309003474970904,0.5988519795412942,1.569090034749709,3.0178783228054336 +0.7778745401904701,5.733454544079853,1.6218745401904702,3.267304311011866 +3.035470899619922,0.757602382558518,1.543470899619922,3.2237526156265055 +3.24735233568777,4.624003865251015,1.53935233568777,3.1505969107174017 +0.5833836158714836,6.196188167720483,1.5693836158714836,2.9886220684053044 +0.7809116357300797,3.9377151798096133,1.5589116357300798,3.1240426825298564 +4.172657126980928,4.039088298696569,1.5706571269809282,3.2191326161096336 +2.3803850039883616,0.43764045497886445,1.5103850039883615,3.24308269463455 +2.0558998565126907,2.408577672595456,1.5458998565126907,3.190834243339314 +0.7113271063718721,3.323243312734931,1.5153271063718723,3.2541282743559554 +1.5476482009545944,3.466987402130201,1.5916482009545945,3.2784918429148133 +5.001188442616316,2.061131331781115,1.594003135436729,3.151263982576773 +3.100491858209595,5.774785972869261,1.5304918582095945,3.2583702573438367 +1.578379919945356,0.8269433059862551,1.582379919945356,3.2208369080216777 +0.978850148962139,6.231716172799901,1.552850148962139,3.200079262085751 +3.82495227844213,4.724782690824296,1.54295227844213,3.1477031787222196 +0.8933270593272006,3.7562607238304775,1.5753270593272006,3.347853678863804 +0.33609236057419944,1.7248991341912514,1.5840923605741994,3.201447681378454 +5.148475759943397,6.189387589436687,1.6152904527638103,2.9755383048143287 +0.5739907745654763,4.509940069773568,1.5799907745654764,3.0742322270830322 +3.69150916923656,0.6993219471924669,1.58350916923656,3.1434810316853254 +0.4928651903173081,3.929182831119805,1.560865190317308,3.134359889761587 +3.6526035017916687,2.4089964117384515,1.5986035017916687,3.3483326151618003 +5.802191983793927,5.640593965070823,1.5590066766143407,3.2247092144602725 +5.375849846375836,5.827755339110922,1.57066453919625,3.2830652897031896 +3.2447937449014623,2.2277132482925768,1.536793744901462,3.1293503398728477 +4.642978895489473,4.0860609611607215,1.5929788954894728,3.181282276926861 +4.968348891947871,5.211811222054102,1.5671635847682848,3.1886255531422756 +0.3725564775044134,1.9687939753228352,1.5525564775044134,3.0337938848897754 +4.029927000347103,4.6280099791545455,1.5799270003471024,3.1231870980850345 +5.3272716340274675,4.618102172090451,1.5760863268478815,3.0535890306027333 +2.5529448639084844,2.453274800803327,1.5309448639084844,3.232389778893597 +1.7841313583793605,4.672663592422897,1.5781313583793606,3.1081504509351805 +0.20230317885171442,1.476702317880128,1.5243031788517143,2.877852641381175 +0.26446125636257106,3.6716518441281547,1.5524612563625708,3.228687279971994 +3.963069760484259,1.764427686463809,1.6150697604842592,3.193852343847165 +2.0795120397416564,2.4974232441736803,1.5215120397416564,3.1540161087739484 +5.56783726084322,1.3194448303189523,1.5986519536636337,3.3332057212700095 +1.7853592617473044,2.3076535317489157,1.5693592617473044,3.1841578821004677 +5.827806286847096,0.41256374807092894,1.5426209796675103,3.214864395073024 +5.71941900491567,3.046333964660021,1.5702336977360838,3.338502081443871 +4.292523040315505,6.087984676881047,1.6305230403155049,3.2008610282320267 +5.706893799752985,4.900251038087104,1.5437084925733986,3.235206931684514 +0.48948018171724783,0.3201093282612316,1.5474801817172479,3.204091384256661 +5.625494604548763,2.4859616412824574,1.5683092973691766,3.2933509532550342 +2.572719030144452,4.934436734736593,1.548719030144452,2.8735519539816896 +1.0784860938895637,4.110203253859013,1.5904860938895637,3.293389163925667 +1.5544581208921402,0.1197268823993859,1.57045812089214,3.1796381269958442 +0.22180426870472383,0.33355460987509983,1.5878042687047238,3.255235777713607 +0.7086829178188621,4.5315240991204595,1.5966829178188622,3.28431181564531 +4.729790179162178,2.168308120008898,1.5446048719825902,2.9914053952494237 +3.2216833947267527,1.56604150104748,1.5896833947267526,3.205952866221352 +4.495269603459149,5.52150562879342,1.5312696034591482,3.2344261769800506 +2.30664817243741,1.455175247875539,1.56664817243741,3.2647326163432586 +3.7428370573743797,2.939532843961006,1.5448370573743795,3.2474089240128046 +1.4788421263841374,1.308417262478283,1.5788421263841377,3.1493905574819006 +1.8896425288293563,5.169716006314554,1.5476425288293563,3.0805568916773427 +1.567663895326543,5.85101432908334,1.525663895326543,3.2183596853750935 +5.8342479348105964,1.5735168033545857,1.5510626276310098,3.112897203613584 +2.3447968291966137,5.958544452580671,1.5687968291966135,3.1782349541537025 +1.6828372718404043,3.971286626368892,1.5628372718404042,3.223587574814521 +6.2534308454596985,5.749828499569593,1.5662455382801121,3.1894304868939107 +4.8613592509089285,2.0578866678540675,1.5761739437293423,3.0223556125061344 +4.888858709714328,4.678517561242628,1.5836734025347425,3.192544236094655 +2.2176942146267034,4.49363059361379,1.5656942146267032,3.0422147876553054 +6.0521545718714185,1.7383926825560616,1.6049692646918328,3.164675747285828 +0.27032212522830434,3.970308064117096,1.5923221252283044,3.3105736068632394 +5.0093719860300165,4.465306705447835,1.5621866788504308,3.0327404554108903 +0.3597334326160174,6.229567438731194,1.5997334326160175,2.890054447965244 +6.1808348780129725,0.8646223760751165,1.549649570833386,3.2082504956531026 +2.2467529409475615,0.6308407984415706,1.5907529409475614,3.3137609246072537 +2.226733045782707,4.083633097731007,1.5447330457827066,3.2165535253402244 +1.357436734982042,1.8783917713271105,1.551436734982042,3.2292766123707213 +2.424376333317283,0.20559437939843542,1.580376333317283,3.281213587262843 +1.8638700798223613,2.6550946051546562,1.5638700798223613,3.317970655062102 +0.8517534305256185,5.543130436855484,1.5717534305256184,3.0424226845980082 +0.5713571223795262,0.9340607444487066,1.5813571223795262,3.148883565229511 +0.29698923599734517,0.7176260523939584,1.5729892359973452,3.3220063622198963 +2.7821842182469343,4.9880322008851286,1.5601842182469343,3.3324128724433075 +1.254040429049786,5.887433391855113,1.552040429049786,3.169955746499942 +5.966625128622364,2.607855992669115,1.5594398214427778,3.025687815596558 +5.91791608643206,4.402580426641786,1.6047307792524739,3.117669031323561 +0.16486958645001662,1.0219148130901687,1.6088695864500167,3.029392518734046 +0.973912803459327,0.37166766279659325,1.6059128034593269,3.1488355685699703 +5.3154922142747845,1.3089174811306101,1.5863069070951985,3.0336518479514054 +4.576876366253176,2.4652891225569267,1.6008763662531755,3.0778996900069364 +0.2845875030746481,5.201922478609957,1.5825875030746481,3.282409367266592 +4.324416630785809,4.855076702305364,1.5744166307858085,3.1963157812099525 +3.5025212761988738,5.958476665747894,1.5825212761988736,3.2786981322357995 +3.3910199108164707,4.143851220138557,1.5910199108164704,3.235930943251107 +4.537297365092049,1.3482197910426743,1.5772973650920485,3.264591309732449 +4.200213125301093,6.207520020302933,1.5302131253010929,3.2198654067390393 +0.8212949653019243,3.91910752481653,1.5632949653019244,3.234240326333955 +3.095929710452155,6.176532981022227,1.5839297104521548,3.23914384991577 +0.6903279916312126,2.9113062377383505,1.5703279916312127,3.033828351228352 +0.9372265881075286,5.465834394824417,1.5932265881075287,3.1724717577038675 +1.6415399638272614,3.4124205307889492,1.5655399638272613,3.2584824907630496 +1.2277799988042506,1.0204511794581927,1.5797799988042507,2.949389068762325 +1.3649801524406207,4.22858280868181,1.5769801524406206,3.2484059007617945 +6.1888623157759985,1.1345888847522068,1.5596770085964118,3.1671993316248033 +4.2889432272181445,1.290981670635695,1.5409432272181443,3.103680631757005 +2.3101761153691704,5.367266742040308,1.5641761153691705,3.2121341816777105 +5.28997233112129,4.806370801331034,1.5247870239417034,2.981105469595364 +4.970720703650058,2.847078691937121,1.5935353964704722,3.1769459205640476 +4.814398440210142,3.0549551252645233,1.5552131330305543,3.199468387329654 +1.0656433583377303,4.153247713512781,1.5756433583377303,3.3678495501153325 +4.582856627299481,2.0467607990221084,1.5668566272994806,3.0583536334780215 +1.044640279497227,5.847668371688844,1.5606402794972272,3.117624355719313 +4.673649047391701,1.4197271679270989,1.535649047391701,3.144461534747895 +0.5525385647765892,2.537973268672427,1.5545385647765892,3.3076634688019264 +3.002130798314934,0.7848377109932363,1.5481307983149337,3.2195720175253264 +5.176530063946489,5.036630532809133,1.5153447567669025,3.214506793727053 +0.34256436297175447,5.351931667280131,1.5805643629717545,3.143392031806507 +5.445972596721148,2.047286180280185,1.5427872895415622,3.2473745739514834 +1.1383405534517468,2.680690152627254,1.5743405534517467,3.315291868652392 +5.0479717008658485,0.7051670231998565,1.5487863936862618,3.1587508856534843 +5.987661545955787,4.202828166035515,1.5664762387762012,3.2540671846513978 +6.156121068371515,0.05852662572213643,1.5689357611919288,3.112154685011415 +1.2210473515584863,1.0678192496378969,1.5590473515584864,2.962199619752542 +2.463484351474826,4.144800394730939,1.6154843514748258,3.2557296737650274 +0.45679548030730194,4.754702324576671,1.5687954803073019,2.9797024752984376 +2.5919765579877767,0.3946585907077408,1.5759765579877767,3.2849238320103504 +2.332910613083919,3.8428936562222704,1.5649106130839185,3.2082919401971317 +4.551620731483286,3.164658401182598,1.5856207314832858,3.035853102385416 +4.643887244222084,2.773897700643189,1.553887244222083,3.251419783988837 +5.80056351484967,4.057371000363909,1.567378207670084,3.2845392075808197 +1.4595986726317338,4.436114610145054,1.6075986726317337,3.3114244401599082 +3.3802701593380062,5.680225187447047,1.5602701593380062,3.1418183233464934 +3.3594056860448975,4.280288951987976,1.6034056860448973,3.095908521584623 +5.7321190315373824,1.6480761479545554,1.5749337243577965,3.3194034396643253 +0.9754004487422777,1.2505160583262112,1.553400448742278,2.9469760912646996 +0.7863528945433069,3.9751164211453403,1.5423528945433067,3.2494085181660983 +0.3019398101456511,0.9628834511225586,1.543939810145651,3.1054496408707974 +4.019660154146025,1.2327133887063353,1.583660154146025,3.2276247237358535 +3.22690604413453,1.0681905739742328,1.53690604413453,3.191907207800933 +2.410127543787913,4.485847704574367,1.558127543787913,3.169520382720244 diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/main.py b/core/main.py new file mode 100644 index 0000000..bb2866e --- /dev/null +++ b/core/main.py @@ -0,0 +1,48 @@ +from tqdm import tqdm + +from ml.bootstrap_model import BootstrapModel +from ml.gradient_descent import get_best_params +from quantum.util import get_random_params +from util import get_bootstrap_file_name, get_bootstrap_row + +models_base_file_path = "./models" +bootstrap_data_base_file_path = "./bootstrap_data" + + +def get_equal_probability_params(shots=1000, cost_tolerance=0.01, learning_rate=1, bootstrap_model_available=True): + # If model is available directly use it + if bootstrap_model_available: + params = get_random_params() + bootstrap_model = BootstrapModel(models_base_file_path) + predicted_params = bootstrap_model.predict_params(params) + return get_best_params(predicted_params, shots, cost_tolerance, learning_rate) + + # If bootstrap_train_data is available, generate model and use it + else: + # If nothing is available generate bootstrap_train_data then generate model and then use predictions + bootstrap_data_file_path = get_bootstrap_file_name(bootstrap_data_base_file_path, shots, cost_tolerance, + learning_rate) + bootstrap_file = open(bootstrap_data_file_path, "w+") + bootstrap_file.write("start_param_1,start_param_2,final_param_1,final_param_2\n") + + iter = 1000 + total_steps = 0 + for i in tqdm(range(iter)): + # Random param init + params = get_random_params() + start_params_1, start_params_2, final_params_1, final_params_2, steps = get_best_params(params, shots, + cost_tolerance, + learning_rate) + total_steps += steps + + row = get_bootstrap_row(start_params_1, start_params_2, final_params_1, final_params_2) + bootstrap_file.write(row) + bootstrap_file.close() + print("Average steps taken per iteration: " + str(total_steps / iter)) + + bootstrap_model = BootstrapModel() + bootstrap_model.train_bootstrap_models(bootstrap_data_file_path, "./models") + + params = get_random_params() + predicted_params = bootstrap_model.predict_params(params) + return get_best_params(predicted_params, shots, cost_tolerance, learning_rate) diff --git a/main_test.py b/main_test.py new file mode 100644 index 0000000..243b855 --- /dev/null +++ b/main_test.py @@ -0,0 +1,4 @@ +from core.main import get_equal_probability_params + +results = get_equal_probability_params(shots=1000, cost_tolerance=0.01, learning_rate=1, bootstrap_model_available=True) +print(results) diff --git a/ml/__init__.py b/ml/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ml/bootstrap_model.py b/ml/bootstrap_model.py new file mode 100644 index 0000000..11700b8 --- /dev/null +++ b/ml/bootstrap_model.py @@ -0,0 +1,52 @@ +import joblib +import lightgbm as lgb +import pandas as pd +from sklearn.metrics import mean_squared_error +from sklearn.model_selection import train_test_split + + +class BootstrapModel: + model_param_1 = None + model_param_2 = None + + def __init__(self, model_base_path=None): + if model_base_path: + self.model_param_1 = joblib.load(model_base_path + "/model_param_1.pkl") + self.model_param_2 = joblib.load(model_base_path + "/model_param_2.pkl") + + def train_model(self, df, target_column_name): + X = df.drop(columns=["final_param_1", "final_param_2"]) + y = df[[target_column_name]] + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + params = { + 'boosting_type': 'gbdt', + 'objective': 'regression', + 'metric': ['mse'], + 'num_leaves': 1000, + 'learning_rate': 0.05, + 'feature_fraction': 0.9, + 'bagging_fraction': 0.8, + 'bagging_freq': 5, + 'verbose': 0 + } + gbm = lgb.LGBMRegressor(**params) + gbm.fit(X_train, y_train, eval_set=[(X_test, y_test)], eval_metric='mse', early_stopping_rounds=1000) + y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration_) + print('The mse of prediction is:', mean_squared_error(y_test, y_pred)) + return gbm + + def train_bootstrap_models(self, loc_data_shots_file, loc_model_base_path): + # df = pd.read_csv("./data_shots_1000_costTolerance_0.01_learningRate_1.csv") + df = pd.read_csv(loc_data_shots_file) + self.model_param_1 = self.train_model(df, "final_param_1") + self.model_param_2 = self.train_model(df, "final_param_2") + self.save_model(self.model_param_1, loc_model_base_path + "/model_param_1.pkl") + self.save_model(self.model_param_2, loc_model_base_path + "/model_param_2.pkl") + + def save_model(self, model, path): + joblib.dump(model, path) + + def predict_params(self, params): + bootstrap_param_1 = self.model_param_1.predict([params]) + bootstrap_param_2 = self.model_param_2.predict([params]) + return [bootstrap_param_1, bootstrap_param_2] diff --git a/ml/gradient_descent.py b/ml/gradient_descent.py new file mode 100644 index 0000000..b83c53d --- /dev/null +++ b/ml/gradient_descent.py @@ -0,0 +1,188 @@ +from math import pi +from typing import List + +from quantum.util import get_counts, get_cost_vector + + +def done_descending(costVector: List[float or int], shots: int, costTolerance: float) -> bool: + """ + Determines whether we should stop the algorithm or not + :param costVector: List of ints that determine how far the count of each state is from the desired count for that state + :param shots: Number of shots taken by the circuit + :param costTolerance: Float value that determines the error margin that will be allowed. + :return: True if all costs are lower than costTolerance * shots, False otherwise + """ + if not 1 >= costTolerance > 0: + raise ValueError("costTolerance must be in the range (0, 1]") + + for cost in costVector: + if cost > costTolerance * shots: + return False + return True + + +def get_gradient(counts: dict) -> List[int]: + """ + The gradient will determine how strongly we will modify the values in params[] and in which direction. + + Let's remember again what we want each qubit to do: + 1) We want the first qubit to be measured as |0> 50% of the time, with the other 50% of the time being |1>, obviously. + 2) We want the second qubit to always be |1> before it reaches the CNOT. + Remember that the counts give us information AFTER the CNOT. + + We can easily determine how far the first parameter (the one controlling the phase of the first qubit) is from its + desired goal by seeing how often it is a |0> or a |1> once it has been measured. This can be inferred by adding the + counts of |00> and |10>, we get the count of the first qubit being |0>. Of course, adding the counts of |01> and |11> + gives us how often the first qubit is |1>. + + With that information, we can determine in which direction and how strongly we should modify the values in params[i] + with a function such as (count |00> + count |10>) - (count |01> + count |11>). The more often |0> appears than |1>, + the greater the output will be on the positive side, and the more often |1> appears than |0>, the greater the output + will be on the negative side. This is what we will use as the gradient function for the parameter of the first qubit. + + The second qubit is a little trickier to think about, but the function is just as simple. We said we wanted the second + qubit to always be |1> BEFORE it reaches the CNOT, but we don't have access to measurement before the CNOT. Then, how + do we tell how we should modify the parameter for the RX gate on the second qubit? + + Going back to the other big comment in this file, we know that if there were no RX (or RY) gate on the second qubit, + that the output will always be |00> or |11>, since the CNOT only flips the second qubit if the first one is flipped. + This way, we know that if we are getting counts of |00> and |11> that are way too high above 0, the parameter of the + gate is not where it should be. Therefore, the higher the total count of |00> and |11>, the stronger the change in + phase we need to make, and a function that represents that well is simply the total count of |00> and |11> itself. + + There is a small problem with this function, and that is that it's only one-directional (we will never get a negative + value for this function). This means that perhaps it would be optimal to decrease the value of the parameter at a given + moment, rather than to increase it, but the function will always guide us to increase it. This isn't really a huge issue, + since the phase is modulo 2*pi. What matters is that it tells us to increase the value at the right pace at every given + moment: when we are really far from the goal, take big steps, and as we get closer to the goal, take smaller and smaller + steps. The function proposed earlier does that very well. + + One extra thing to note: the function of the gradient of the second qubit highly depends on the effectiveness of the + function of the first qubit. If the first one isn't working, the second one is flying blind. + + With these two functions dictating how strongly we should alter each parameter and tweaking some constants such as + the learning rate that we will use later on, we will obtain the correct values for each parameter fairly quickly. + + :param counts: Dictionary containing the count of each state + :return: List of ints that are a representation of how intensely we must change the values of params[] + -params[0] corresponds to the phase of the RY gate of the first qubit + -params[1] corresponds to the phase of the RX gate of the second qubit + """ + try: + a = counts['00'] + except KeyError: + a = 0 + try: + b = counts['01'] + except KeyError: + b = 0 + try: + c = counts['10'] + except KeyError: + c = 0 + try: + d = counts['11'] + except KeyError: + d = 0 + + # We then want the total number of shots to know what proportions we should expect + totalShots = a + b + c + d + + """ + Let's quickly think about a way of improving the gradient than just the difference or addition of counts. + + First, let's note that without any modifications, the range of the gradients are [-0.5, 0.5] and [0, 1] for params[0] + and params[1], respectively. If our values turned out to be at the extreme side of the undesired, then we know very + well by how much we should change the phase. + + For example, if for params[1] we got a gradient of 1, that means that params[1] is somewhere around |0> and so it needs + a shift of pi to be |1>. To get to that point very quickly, we can just multiply the value of the gradient by pi. + That way, whenever the second parameter is on the complete opposite end of where it should be, we can move it very + quickly to where it should. When I only modify the second gradient by multiplying it by pi, this often reduces the + number of steps taken by the algorithm significantly (for example, from an average of 20 steps to an average of 6 steps). + + Now, you would think that the same goes for the first parameter: if the gradient is ±0.5, then params[0] is + probably around 0 or pi, and we want to move it to pi/2 or 3*pi/2, so we need the gradient to be ±pi/2. We take + advantage of the 0.5 and multiply it by pi in order to make the gradient equal to ±pi/2 whenever it is at + either extreme. But this is not the case. For some reason that I don't fully comprehend, it makes the algorithm take + more steps in general, especially when combined with the modification of the second gradient value. + + I suspect that it has to do with the fact that the second gradient value has a greater "tolerable margin of error" + than the first gradient value. That is, params[1] could be anywhere from 3*pi/4 to 5*pi/4 and still output often + enough it's intended goal, whilst that range of 2*pi/4 (or pi/2) means the opposite output of what is desired. Either + way, I'd love to discuss it further with my mentor. + """ + return [((b + d) - (a + c)) / totalShots, pi * (a + d) / totalShots] + + +def update_params(intial_params: List[float], gradient: List[int], learningRate: float or int) -> List[float]: + """ + Here we update the parameters according to the gradient. A very simple update function is just subtracting the gradient, + and modulating the intensity of said gradient with a learning rate value. + + :param params: List of the parameters of the RY and RX gates of the circuit. + :param gradient: List of values which represent how intensely we should modify each parameter + :param learningRate: Float or int value to modulate the gradient + """ + updated_params = [None] * len(intial_params) + for i in range(len(intial_params)): # For every parameter value + # params[i] -= learningRate * gradient[i] # Subtract a modulated version of the value of the gradient + updated_params[i] = intial_params[i] - learningRate * gradient[i] + + while updated_params[i] < 0: + updated_params[i] = updated_params[i] + 2 * pi + updated_params[i] = updated_params[i] % (2 * pi) + + return updated_params + + +def get_best_params(params, shots=1000, cost_tolerance=0.01, learning_rate=1): + """ + Main method that does the entire gradient descent algorithm. + :param params: Rotation angle parameters + :param cost_tolerance: Float value that determines the error margin that will be allowed. + :param learning_rate: Float or int value to modulate the gradient + :param shots: Total number of shots the circuit must execute + """ + + # Initialize variables + descending = True # Symbolic, makes it easier for reader to follow + counts = None + cost_vector = None + + print("START PARAMS: " + str(params)) # Print to console the parameters we will begin with + + start_params = params + steps = 0 # Keep track of how many steps were taken to descend + while descending: + # Get the initial counts that result from these parameters + counts = get_counts(params, shots) + + # Find the cost of these parameters given the results they have produced + cost_vector = get_cost_vector(counts) + + # Determine whether the cost is low enough to stop the algorithm + if done_descending(cost_vector, shots, cost_tolerance): + break + + # Calculate the gradient + gradient = get_gradient(counts) + + # Update the params according to the gradient + params = update_params(params, gradient, learning_rate) + steps += 1 # Recording the number of steps taken + + # Show current situation + # print("\tCOUNTS: " + str(counts) + # + "\n\tCOST VECTOR: " + str(cost_vector) + # + "\n\tGRADIENT: " + str(gradient) + # + "\n\tUPDATED PARAMS: " + str(params) + "\n") + + # Print the obtained results + print("FINAL RESULTS:" + + "\n\tCOUNTS: " + str(counts) + + "\n\tCOST VECTOR" + str(cost_vector) + + "\n\tSTART_PARAMS: " + str(start_params) + + "\n\tPARAMS: " + str(params) + + "\nSteps taken: " + str(steps)) + return start_params[0], start_params[1], params[0], params[1], steps diff --git a/models/model_param_1.pkl b/models/model_param_1.pkl new file mode 100644 index 0000000..771deb0 Binary files /dev/null and b/models/model_param_1.pkl differ diff --git a/models/model_param_2.pkl b/models/model_param_2.pkl new file mode 100644 index 0000000..805316c Binary files /dev/null and b/models/model_param_2.pkl differ diff --git a/quantum/__init__.py b/quantum/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/quantum/util.py b/quantum/util.py new file mode 100644 index 0000000..1e9b8e5 --- /dev/null +++ b/quantum/util.py @@ -0,0 +1,92 @@ +from math import pi +from random import uniform as randUniform +from typing import List + +import qiskit.providers.aer.noise as noise +from qiskit import QuantumCircuit, execute, Aer + + +def get_random_params(): + params = [randUniform(0, 2 * pi), randUniform(0, 2 * pi)] + return params + + +def get_counts(params: List[float or int], shots: int = 1000) -> dict: + """ + Here we run the circuit according to the given parameters for each gate and return the counts for each state. + + :param params: List of the parameters of the RY and RX gates of the circuit. + :param shots: Total number of shots the circuit must execute + """ + # Error probabilities + prob_1 = 0.001 # 1-qubit gate + prob_2 = 0.01 # 2-qubit gate + + # Depolarizing quantum errors + error_1 = noise.depolarizing_error(prob_1, 1) + error_2 = noise.depolarizing_error(prob_2, 2) + + # Add errors to noise model + noise_model = noise.NoiseModel() + noise_model.add_all_qubit_quantum_error(error_1, ['u1', 'u2']) + noise_model.add_all_qubit_quantum_error(error_2, ['cx']) + + # Get basis gates from noise model + basis_gates = noise_model.basis_gates + + # Make a circuit + circ = QuantumCircuit(2, 2) + + # Set gates and measurement + circ.ry(params[0], 0) + circ.rx(params[1], 1) + circ.cx(0, 1) + circ.measure([0, 1], [0, 1]) + + # Perform a noisy simulation and get the counts + # noinspection PyTypeChecker + result = execute(circ, Aer.get_backend('qasm_simulator'), + basis_gates=basis_gates, + noise_model=noise_model, shots=shots).result() + counts = result.get_counts(0) + + return counts + + +def get_cost_vector(counts: dict) -> List[float]: + """ + This function simply gives values that represent how far away from our desired goal we are. Said desired goal is that + we get as close to 0 counts for the states |00> and |11>, and as close to 50% of the total counts for |01> and |10> + each. + + :param counts: Dictionary containing the count of each state + :return: List of ints that determine how far the count of each state is from the desired count for that state: + -First element corresponds to |00> + -Second element corresponds to |01> + -Third element corresponds to |10> + -Fourth element corresponds to |11> + """ + # First we get the counts of each state. Try-except blocks are to avoid errors when the count is 0. + try: + a = counts['00'] + except KeyError: + a = 0 + try: + b = counts['01'] + except KeyError: + b = 0 + try: + c = counts['10'] + except KeyError: + c = 0 + try: + d = counts['11'] + except KeyError: + d = 0 + + # We then want the total number of shots to know what proportions we should expect + totalShots = a + b + c + d + + # We return the absolute value of the difference of each state's observed and desired counts + # Other systems to determine how far each state count is from the goal exist, but this one is simple and works well + return [abs(a - 0), abs(b - totalShots / 2), abs(c - totalShots / 2), abs(d - 0)] diff --git a/util.py b/util.py new file mode 100644 index 0000000..6e80480 --- /dev/null +++ b/util.py @@ -0,0 +1,17 @@ +from os import path + + +def get_bootstrap_file_name(bootstrap_data_base_file_path, shots, cost_tolerance, learning_rate): + bootstrap_data_file_name = bootstrap_data_base_file_path + "/data_shots_" + str(shots) + "_costTolerance_" + str( + cost_tolerance) + "_learningRate_" + str(learning_rate) + ".csv" + return bootstrap_data_file_name + + +def get_bootstrap_row(start_params_1, start_params_2, final_params_1, final_params_2): + row = str(start_params_1) + "," + str(start_params_2) + "," + str(final_params_1) + "," + str( + final_params_2) + "\n" + return row + + +def check_file_exists(file_path): + return path.exists(file_path)