From 9945ef3c5c907add575e0de79b8c957d01e8c33b Mon Sep 17 00:00:00 2001 From: "M.K" Date: Thu, 4 Aug 2016 00:08:33 +0900 Subject: [PATCH 01/12] added better rng --- data/lognormal.model | 1000 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 data/lognormal.model diff --git a/data/lognormal.model b/data/lognormal.model new file mode 100644 index 0000000000..e9f7e3774a --- /dev/null +++ b/data/lognormal.model @@ -0,0 +1,1000 @@ +10,5,-4.616056279651733,0.16314945605790696 +10,10,-4.654509411741211,0.32206282695599847 +10,15,-4.712882558733536,0.46980053502998265 +10,20,-4.784728160970069,0.60382096464875279 +10,25,-4.864176650816492,0.72363961829746082 +10,30,-4.946778575031898,0.83004984302534501 +10,35,-5.02953812433362,0.92444540675412412 +10,40,-5.110613331492685,1.0083779718302868 +10,45,-5.188968879044218,1.083327073285254 +10,50,-5.264092089783407,1.1506051593567688 +10,55,-5.335793153108978,1.211335179608831 +10,60,-5.404072014080302,1.2664603084787531 +10,65,-5.469035581181396,1.3167666060195917 +10,70,-5.530846733997671,1.3629079021107928 +10,75,-5.589694876553046,1.405429272482368 +10,80,-5.6457746165179215,1.4447857199014495 +10,85,-5.699278877649659,1.4813598173900231 +10,90,-5.750391626574923,1.5154744924388424 +10,95,-5.799284558115888,1.5474036516503382 +10,100,-5.846117447194974,1.5773813201136113 +20,5,-3.916752212510045,0.084340946729705976 +20,10,-3.924394014611288,0.16425306866729103 +20,15,-3.9408063188456253,0.24497532639753442 +20,20,-3.9630317075663997,0.32332892706626121 +20,25,-3.990259961533459,0.39882605328087006 +20,30,-4.021663359217758,0.47109062133687712 +20,35,-4.056413819968653,0.53988784450913307 +20,40,-4.093731897089638,0.60511225238895561 +20,45,-4.132916541358667,0.66676220421981502 +20,50,-4.173363167475968,0.72491571053309067 +20,55,-4.2145664946523835,0.77970644201642947 +20,60,-4.256112319007335,0.83130213475189396 +20,65,-4.297672339435738,0.87989132914701751 +20,70,-4.338988443723558,0.92566957177507747 +20,75,-4.379864986063282,0.96883318586326395 +20,80,-4.420155387248137,1.0095725281046506 +20,85,-4.4597534585824965,1.0480690031674318 +20,90,-4.498584361781276,1.0844927439027439 +20,95,-4.536598686801127,1.119002104627391 +20,100,-4.573765996504509,1.1517430875296097 +30,5,-3.508917706075146,0.056261008176375485 +30,10,-3.5119720219328814,0.10986328688386143 +30,15,-3.5193629398360415,0.16468797278755376 +30,20,-3.5296761283332727,0.21872454226982682 +30,25,-3.5426706496823006,0.27179997841761316 +30,30,-3.558124485697554,0.32375115394776233 +30,35,-3.5758009476745243,0.37442959119615632 +30,40,-3.5954578882863317,0.42371742553488934 +30,45,-3.6168426832250735,0.47152132704440475 +30,50,-3.6397139600310306,0.51778148636493404 +30,55,-3.66383505644649,0.56246017669864634 +30,60,-3.6889847230403414,0.60554282745347587 +30,65,-3.714961773795475,0.64703540561663742 +30,70,-3.7415807186324774,0.68695736107525951 +30,75,-3.7686783123184875,0.72534198281165019 +30,80,-3.7961075686591643,0.76223024156690355 +30,85,-3.823742722565532,0.79767149612085675 +30,90,-3.851476708833415,0.83172050305077583 +30,95,-3.8792125084811673,0.86443202137741482 +30,100,-3.9068729014028287,0.89586515705693126 +40,5,-3.220348690369191,0.042201724022051926 +40,10,-3.2218927874523877,0.082475029824635226 +40,15,-3.226035843931853,0.1238624652183356 +40,20,-3.231903693186518,0.16490116724261447 +40,25,-3.2393957493846877,0.20550598230231484 +40,30,-3.2484242890846784,0.24560023460939545 +40,35,-3.258898127322142,0.28510892276478184 +40,40,-3.270721289845689,0.32396206856812237 +40,45,-3.283795298317571,0.36209910840364579 +40,50,-3.2980180246541604,0.3994684039156961 +40,55,-3.3132810519995006,0.43602463031350036 +40,60,-3.3294845468885867,0.47173773365357835 +40,65,-3.3465197387430017,0.50657911881976392 +40,70,-3.364291298898512,0.5405352230409598 +40,75,-3.382704053891119,0.57359697637232454 +40,80,-3.4016636236180577,0.60575923667485898 +40,85,-3.4210873140879614,0.63702631366355023 +40,90,-3.4408965194797965,0.66740617224448839 +40,95,-3.4610187084963298,0.69691082568813412 +40,100,-3.4813855295706055,0.72555459094901331 +50,5,-2.996764981745989,0.033762982016823102 +50,10,-2.9976548223280672,0.066008598688572617 +50,15,-3.0002893876109895,0.099208412870507315 +50,20,-3.004052919605667,0.13223355642177864 +50,25,-3.008894738446769,0.16502853021409661 +50,30,-3.0147725118878244,0.19754947538488377 +50,35,-3.0216415267861487,0.22975383093142157 +50,40,-3.029460723737394,0.26160502293682647 +50,45,-3.0381780787247052,0.29306126571542945 +50,50,-3.0477477217483284,0.32409058073289115 +50,55,-3.0581162013670404,0.3546600953388625 +50,60,-3.0692339942049345,0.38474485135145486 +50,65,-3.0810451823104197,0.41431973670753902 +50,70,-3.0934961871286513,0.44336546586528569 +50,75,-3.1065337772498656,0.47186649171411282 +50,80,-3.1201055237276583,0.4998107694631086 +50,85,-3.1341628755554556,0.52719121080598486 +50,90,-3.14864852678029,0.55399713339535983 +50,95,-3.1635224786094995,0.58023045126676653 +50,100,-3.1787369548167357,0.60588923511636827 +60,5,-2.8141880854286243,0.028138809721160611 +60,10,-2.8147427286729405,0.055019426075035821 +60,15,-2.816563805424102,0.082726338929081017 +60,20,-2.8191730772242938,0.11033065339674958 +60,25,-2.822549647090562,0.1378058296969456 +60,30,-2.8266645538145143,0.16511451435865057 +60,35,-2.8314952530927693,0.1922327690486729 +60,40,-2.8370218957799875,0.2191399175173461 +60,45,-2.843216382491172,0.24580954026816376 +60,50,-2.850052607189156,0.27221928504984705 +60,55,-2.857503279040635,0.2983481218938856 +60,60,-2.865536527946155,0.32417399879202413 +60,65,-2.874129606347463,0.34968431658615889 +60,70,-2.883245699764681,0.37485825578140786 +60,75,-2.8928539407632674,0.39968186443283082 +60,80,-2.9029299235312203,0.42414771646773253 +60,85,-2.913436266277488,0.4482410036175053 +60,90,-2.9243420609267305,0.47195319884561421 +60,95,-2.9356201919900125,0.49527965631847626 +60,100,-2.9472410107241354,0.51821513420554011 +70,5,-2.6598720378668754,0.024121826978681388 +70,10,-2.660237647717709,0.047166670381784966 +70,15,-2.661570000289415,0.070933484427640331 +70,20,-2.6634828195937335,0.09463629001635511 +70,25,-2.6659642784460797,0.11825867112553129 +70,30,-2.6690011135633225,0.1417779446557729 +70,35,-2.672576962291597,0.16517356542193626 +70,40,-2.6766821252946444,0.18843379664958421 +70,45,-2.6812941527583174,0.21153588801338302 +70,50,-2.6864057695369254,0.23447201104894305 +70,55,-2.6919930586789276,0.2572209853425716 +70,60,-2.698047203118507,0.2797755218412154 +70,65,-2.704542906827506,0.30211636576299228 +70,70,-2.7114659161997574,0.32423450968188211 +70,75,-2.71880165020656,0.34612182621835486 +70,80,-2.7265233102466735,0.3677623869104889 +70,85,-2.7346152733316442,0.38914990631031743 +70,90,-2.743054320299798,0.41027370276258363 +70,95,-2.751828421248564,0.43113204026623653 +70,100,-2.7609106920048645,0.45171367279107028 +80,5,-2.526224670515837,0.021107965042591558 +80,10,-2.5264767642073727,0.041275349131596639 +80,15,-2.52749267105767,0.062078664164264885 +80,20,-2.5289559496626417,0.082845482666806691 +80,25,-2.530855702687071,0.10355678171265037 +80,30,-2.5331862282283777,0.12419997065995385 +80,35,-2.5359360582303236,0.14475837404173728 +80,40,-2.5390965667940657,0.16522132301581915 +80,45,-2.542658770267417,0.18557829090638436 +80,50,-2.546613199058567,0.20581886910004926 +80,55,-2.55095457786502,0.22593680147951592 +80,60,-2.555663196812028,0.2459143104511945 +80,65,-2.5607371516120288,0.26574942475244762 +80,70,-2.566156039735204,0.28542581888504059 +80,75,-2.5719124186049664,0.30493851961227442 +80,80,-2.5779987406774714,0.3242830367229404 +80,85,-2.584393593103854,0.34344515333977321 +80,90,-2.5910884974445407,0.36242132929099025 +80,95,-2.598070644383271,0.38120543061653617 +80,100,-2.6053269802487065,0.39979182878930691 +90,5,-2.4083579818907426,0.01876458149125777 +90,10,-2.4085371738718004,0.036694927108251431 +90,15,-2.409338226103796,0.055192211483089303 +90,20,-2.410493082791113,0.073665966561663618 +90,25,-2.4119907437617623,0.092096454873279249 +90,30,-2.413835988232551,0.11048755985450051 +90,35,-2.4160117314238523,0.12881217989441807 +90,40,-2.4185213587629724,0.14707399716978956 +90,45,-2.421349459912604,0.16525476747411338 +90,50,-2.4244997085399738,0.18335703361579683 +90,55,-2.4279607363419218,0.20136840457350716 +90,60,-2.4317254828956227,0.21928153864380301 +90,65,-2.4357867096187342,0.2370893909859669 +90,70,-2.4401368714499783,0.25478514653226902 +90,75,-2.444768124891041,0.2723622595239652 +90,80,-2.4496672222356604,0.2898104937498836 +90,85,-2.4548359304793896,0.30713191260379091 +90,90,-2.460260772680332,0.32431708922886066 +90,95,-2.4659328095265267,0.3413607191525681 +90,100,-2.4718430829539786,0.35825797728256498 +100,5,-2.3029357959479104,0.016891260258064551 +100,10,-2.303063691105835,0.033024680801306779 +100,15,-2.303711391215226,0.04967746098013593 +100,20,-2.3046464194706395,0.066314820762031532 +100,25,-2.3058599986680393,0.082920252372391159 +100,30,-2.3073539134493615,0.099494540925086861 +100,35,-2.3091159846524167,0.11601756387663595 +100,40,-2.311152221195079,0.1324967839035209 +100,45,-2.3134597185679833,0.14892567849223676 +100,50,-2.3160231515947203,0.16528679036240812 +100,55,-2.3188431463013344,0.18158040253576174 +100,60,-2.321915140879609,0.19780117622566457 +100,65,-2.3252400036100043,0.21394871783476596 +100,70,-2.3288011271803053,0.23000789058346233 +100,75,-2.3325985726458636,0.24597844406374528 +100,80,-2.3366268905149825,0.26185560856082918 +100,85,-2.3408860144097647,0.27763920955827687 +100,90,-2.345358660678315,0.29331578522548279 +100,95,-2.3500440879735978,0.30888541912078199 +100,100,-2.354936157269966,0.32434421331184354 +110,5,-2.2075752424088315,0.015355560591059619 +110,10,-2.207670964237554,0.030027194756912248 +110,15,-2.2082052093518403,0.045166377965205513 +110,20,-2.2089765851220906,0.060295508906125596 +110,25,-2.2099781780205405,0.075400736527566029 +110,30,-2.2112129956516196,0.090485247912876626 +110,35,-2.212674977371374,0.10553573818960731 +110,40,-2.2143613434876164,0.12054773234299179 +110,45,-2.216269271691655,0.13551692345249194 +110,50,-2.2183957688627896,0.1504390246002365 +110,55,-2.220737668905023,0.1653097801143236 +110,60,-2.2232916344164146,0.18012498097070917 +110,65,-2.2260541589605287,0.19488048064791075 +110,70,-2.2290215701070566,0.20957221096082462 +110,75,-2.232196421148394,0.22420156355425211 +110,80,-2.2355621409105546,0.23875399108539028 +110,85,-2.239120600065566,0.25323093077687098 +110,90,-2.2428676852773637,0.26762890585333887 +110,95,-2.2468052477590335,0.28194936449495384 +110,100,-2.250916405406456,0.29617922763021926 +120,5,-2.120522422235391,0.014073857569958917 +120,10,-2.120595850971716,0.027523532685376426 +120,15,-2.1210453454519707,0.041407983713783798 +120,20,-2.1216913912867716,0.055275575267896997 +120,25,-2.122534712895865,0.069134482915189713 +120,30,-2.123571012640021,0.08297080304809637 +120,35,-2.124798505988217,0.096780879614921364 +120,40,-2.1262153687383036,0.11056125413294986 +120,45,-2.1278196303279113,0.12430849066540132 +120,50,-2.1296158010805897,0.13802637164543088 +120,55,-2.1315887984846054,0.15169709610401952 +120,60,-2.1337490401726886,0.16533101870070802 +120,65,-2.1360808470265886,0.17891187931928421 +120,70,-2.1385947654426616,0.19244900708498 +120,75,-2.1412746624058276,0.20592715144537224 +120,80,-2.144130969406783,0.21935498334068607 +120,85,-2.1471472915767302,0.23271804817968902 +120,90,-2.1503338182283285,0.24602459864559198 +120,95,-2.1536740085706425,0.25926086184929265 +120,100,-2.157170950603397,0.27242942872370546 +130,5,-2.0404513659621473,0.012995200560427718 +130,10,-2.040505355292806,0.025416369605012236 +130,15,-2.0408871371871853,0.038227163247248439 +130,20,-2.0414383969104546,0.051033744696799638 +130,25,-2.0421544414013844,0.063825920189428162 +130,30,-2.0430395590805297,0.076610447570477594 +130,35,-2.0440828842350545,0.089364731249738746 +130,40,-2.0452938352110714,0.10210456477585035 +130,45,-2.0466658716705926,0.11481788410186723 +130,50,-2.048190266798112,0.12749398632137821 +130,55,-2.0498787041831075,0.1401462540437679 +130,60,-2.051723055787703,0.15276409859656587 +130,65,-2.0537211959012374,0.16534476441105456 +130,70,-2.055871098203065,0.17788569160808826 +130,75,-2.058170654723784,0.19038435539108922 +130,80,-2.0606176717825004,0.20283826933053595 +130,85,-2.0632098711166615,0.21524499257106991 +130,90,-2.065944891694728,0.22760213674231075 +130,95,-2.0688202921356553,0.23990737234432272 +130,100,-2.071833553748287,0.25215843450953274 +140,5,-1.9663150552851223,0.012064282095702343 +140,10,-1.9663581630062117,0.023602020116314994 +140,15,-1.9666877420725035,0.035501307901280664 +140,20,-1.9671638942395475,0.047397832780007775 +140,25,-1.9677825585034203,0.059282613006055578 +140,30,-1.9685429011139168,0.071153213765033446 +140,35,-1.9694440708356336,0.08300733423818521 +140,40,-1.9704851199237612,0.094842690871237312 +140,45,-1.971671933745502,0.10666620015246532 +140,50,-1.9729901781845367,0.11845723149889445 +140,55,-1.9744446549738035,0.13022262354065173 +140,60,-1.9760420387734412,0.14196858554850458 +140,65,-1.9777658700593652,0.15367659306040821 +140,70,-1.9796297418691484,0.16536017301291406 +140,75,-1.9816246309315027,0.17700947543099071 +140,80,-1.9837407876445992,0.18861532870722258 +140,85,-1.985992034052237,0.20018987434868515 +140,90,-1.9883611271203958,0.2117174674136863 +140,95,-1.9908617051381488,0.22320957870330829 +140,100,-1.9934763027019335,0.23465115023503669 +150,5,-1.897302311091664,0.011261961173875431 +150,10,-1.89733349571538,0.022027898731513163 +150,15,-1.897620722659518,0.033136940018863283 +150,20,-1.8980361190775124,0.044244341272247495 +150,25,-1.8985713305862166,0.055330107185332093 +150,30,-1.89923416827427,0.066416347357108579 +150,35,-1.9000203492602104,0.077489111825670073 +150,40,-1.9009289603117703,0.088546358324402205 +150,45,-1.9019591555636317,0.099586262568866102 +150,50,-1.9031100256975588,0.11060701410186413 +150,55,-1.9043805956020643,0.12160681433182449 +150,60,-1.9057779238542103,0.1325927985299751 +150,65,-1.907285201914043,0.14354535665411727 +150,70,-1.9089086242317785,0.15447150190347123 +150,75,-1.9106471792077309,0.16536968941534072 +150,80,-1.9125081201420047,0.17624607267832673 +150,85,-1.9144734365095821,0.18708336657259575 +150,90,-1.9165496511876061,0.19788748712515611 +150,95,-1.918735533622578,0.2086569903569585 +150,100,-1.9210381989567196,0.21939754166480638 +160,5,-1.8327422768059267,0.010553578255956486 +160,10,-1.832769469985211,0.02065540868841316 +160,15,-1.8330225935248718,0.031072875702550483 +160,20,-1.8333847408599762,0.041476198636666996 +160,25,-1.8338595053146913,0.051884759766405983 +160,30,-1.8344380385313765,0.06227129228161913 +160,35,-1.835129933486264,0.072659047083505957 +160,40,-1.8359300436786026,0.083033943048019268 +160,45,-1.8368375009359164,0.093394286280303385 +160,50,-1.8378515525359091,0.10373860611860407 +160,55,-1.8389714038436349,0.11406543938537293 +160,60,-1.8401962144726567,0.12437332793832778 +160,65,-1.8415250986377703,0.13466082065429377 +160,70,-1.842957125648583,0.14492647557140123 +160,75,-1.8444913204485691,0.1551688620856399 +160,80,-1.8461266642063134,0.16538656318458234 +160,85,-1.8478620949714444,0.17557817769786527 +160,90,-1.8496965084097616,0.18574232254015341 +160,95,-1.851628758632473,0.19587763492001872 +160,100,-1.853657659133436,0.2059827744875474 +170,5,-1.7721035707341664,0.0099339702581041304 +170,10,-1.772123447406921,0.019441698584038884 +170,15,-1.7723479737346421,0.029248807179398616 +170,20,-1.7726689744470712,0.039041632745867284 +170,25,-1.7730903227726775,0.04884151181513785 +170,30,-1.773603297287018,0.058620343652738348 +170,35,-1.7742174814703127,0.068402576476125812 +170,40,-1.7749209477842895,0.078161949602553293 +170,45,-1.7757261103478215,0.087921387124375611 +170,50,-1.7766263342099524,0.097667385945067658 +170,55,-1.7776207490367368,0.10739853246395278 +170,60,-1.7787001237638955,0.11710344599430637 +170,65,-1.7798804046053687,0.12680157528331432 +170,70,-1.7811529606539616,0.13648143837613977 +170,75,-1.7825167593100277,0.14614164108582389 +170,80,-1.7839709629839098,0.15578100623913108 +170,85,-1.785514708900277,0.16539836858913512 +170,90,-1.7871377036737814,0.17498393592757619 +170,95,-1.7888576098436124,0.18455386895400949 +170,100,-1.7906645468888673,0.19409855608993526 +180,5,-1.7149333200463788,0.0093834604903015543 +180,10,-1.714947146680198,0.018363305685777726 +180,15,-1.7151477399222024,0.027627795502234091 +180,20,-1.7154342766851776,0.036877739127267085 +180,25,-1.715806064930882,0.046122112481924916 +180,30,-1.7162686978462127,0.055374137829866901 +180,35,-1.7168115272103817,0.06460459447985685 +180,40,-1.7174459119899628,0.073839189915631431 +180,45,-1.7181583418243784,0.083050985630200289 +180,50,-1.718962748088,0.092263890832486165 +180,55,-1.7198517586488125,0.10146418229619764 +180,60,-1.720815820063894,0.11063981662575079 +180,65,-1.721871474649254,0.11981193905570404 +180,70,-1.72300994302122,0.12896844590973222 +180,75,-1.7242208575130318,0.13809821301853228 +180,80,-1.7255222570041189,0.14722038873242729 +180,85,-1.7269044429567926,0.15632397563466741 +180,90,-1.728366427234425,0.16540778754688842 +180,95,-1.729897683698841,0.17446191573051925 +180,100,-1.7315168461441701,0.18350342493298785 +190,5,-1.6608521013633963,0.0088855678544894137 +190,10,-1.660865105887259,0.017402143048838619 +190,15,-1.6610428861695785,0.026165291549624513 +190,20,-1.6613032935305478,0.034944765867908095 +190,25,-1.661637554730496,0.043704298245471923 +190,30,-1.662048108434446,0.052457998036064296 +190,35,-1.6625414478584084,0.061219556766851167 +190,40,-1.6631052997782096,0.069959531757659621 +190,45,-1.6637524872566885,0.078704074417044995 +190,50,-1.6644682711833296,0.08742627479249801 +190,55,-1.6652677054255198,0.096150252454875781 +190,60,-1.6661339510426652,0.10485092122554752 +190,65,-1.6670838341792016,0.11355080381954412 +190,70,-1.6680988352917587,0.12222623857504331 +190,75,-1.669197174511719,0.13089852161467169 +190,80,-1.6703691160404142,0.13955559332558407 +190,85,-1.6716038799442121,0.14818654076786961 +190,90,-1.6729206519603612,0.15681064820152293 +190,95,-1.6742989063812697,0.16540741384547938 +190,100,-1.6757583113154035,0.17399538967995778 +200,5,-1.6095485278728567,0.0084400908560749149 +200,10,-1.6095581879068661,0.016527346596529029 +200,15,-1.6097211520618344,0.024869615368962216 +200,20,-1.6099534294890685,0.033196211413939303 +200,25,-1.6102548144834061,0.041518664947093428 +200,30,-1.6106309606797002,0.049851647341998012 +200,35,-1.6110713469770228,0.058164028588722855 +200,40,-1.6115801987188463,0.066469698400755603 +200,45,-1.6121654097795344,0.07478210571560083 +200,50,-1.612811911325052,0.083072763631268726 +200,55,-1.6135260517289796,0.091354228107204241 +200,60,-1.6143174556523368,0.099639085840018293 +200,65,-1.6151674213700973,0.10790070194076611 +200,70,-1.6160943487417436,0.11616300364398092 +200,75,-1.617078392104489,0.12440136628156705 +200,80,-1.6181390554809851,0.13263816461433012 +200,85,-1.6192554800764065,0.14085016651199758 +200,90,-1.620447958642036,0.14905853629278695 +200,95,-1.6217056735353534,0.15725148491929103 +200,100,-1.623017405765667,0.16541841536907304 +210,5,-1.5607493866741615,0.008037023259950064 +210,10,-1.5607570627982286,0.01574365781430314 +210,15,-1.5609053017155476,0.023690417252927157 +210,20,-1.561116250190622,0.031621141090883903 +210,25,-1.5613899002606375,0.039548257822452436 +210,30,-1.5617261655939303,0.047471214625868272 +210,35,-1.5621315367082498,0.055404904787411176 +210,40,-1.5625937623773136,0.063317771013327584 +210,45,-1.5631179329023541,0.071224075895190558 +210,50,-1.5637126156379375,0.079137513211447089 +210,55,-1.564361470729445,0.087029476964777197 +210,60,-1.5650715243756883,0.094912748436260005 +210,65,-1.565852840156174,0.10280001988090207 +210,70,-1.566685922583619,0.11066478741100579 +210,75,-1.5675898443736795,0.11853095471492947 +210,80,-1.568544368069497,0.12637425276153988 +210,85,-1.5695584668942957,0.13420541796043156 +210,90,-1.5706435024625187,0.14203572510718157 +210,95,-1.5717770453392785,0.1498416588603311 +210,100,-1.5729805559291,0.1576445759107484 +220,5,-1.5142196860209134,0.007667926728835677 +220,10,-1.5142285266806197,0.015041978520069707 +220,15,-1.5143619222295572,0.022611825356779962 +220,20,-1.5145538779665892,0.03018230834837568 +220,25,-1.5148030449909682,0.037749856794518463 +220,30,-1.5151092952029508,0.045313779999602177 +220,35,-1.5154793071828572,0.052890113124818713 +220,40,-1.5159005573970172,0.060445302512997387 +220,45,-1.516378298380376,0.067994730910696591 +220,50,-1.516921254325645,0.075552881089272689 +220,55,-1.5175129025074534,0.083089870790383505 +220,60,-1.5181604181580683,0.090619253378064327 +220,65,-1.5188739310236827,0.098154201712714564 +220,70,-1.51963394648111,0.10566751155868614 +220,75,-1.5204490586954262,0.11317139231063361 +220,80,-1.521330399751371,0.12067811208175611 +220,85,-1.522256306655723,0.12816236101148615 +220,90,-1.5232363935818698,0.1356353977609136 +220,95,-1.5242824989957564,0.14310888714395933 +220,100,-1.5253713955725259,0.15055882070547261 +230,5,-1.469765969931937,0.0073408395231435207 +230,10,-1.4697673251064194,0.014378588108714953 +230,15,-1.4698914523801354,0.021637529203245055 +230,20,-1.4700676318757224,0.028879558365641947 +230,25,-1.4702961070822163,0.036118786592050499 +230,30,-1.4705768310455662,0.04335484596986542 +230,35,-1.4709097032147707,0.050587176429873433 +230,40,-1.4712946058814362,0.057815217600863111 +230,45,-1.47173976076298,0.065054786874293641 +230,50,-1.472229500870901,0.072273061586618406 +230,55,-1.472770622550039,0.079485164587369303 +230,60,-1.473372998565021,0.086705331078865994 +230,65,-1.4740178255757292,0.093904452680785941 +230,70,-1.4747134303998612,0.10109580574899379 +230,75,-1.4754598065543154,0.10827907673604587 +230,80,-1.4762683522947042,0.11546726330118055 +230,85,-1.4771165967964628,0.12263338349292209 +230,90,-1.4780146005995274,0.12978961851382004 +230,95,-1.4789745784586952,0.13694829488618115 +230,100,-1.479972745261547,0.14408431032236349 +240,5,-1.4272008283303053,0.0070352093058593185 +240,10,-1.4272004316289515,0.013782375102798962 +240,15,-1.4273147604965941,0.020740254898547091 +240,20,-1.4274767647941167,0.02768089976630881 +240,25,-1.4276868066383765,0.034619057513087199 +240,30,-1.427944852557625,0.04155442669914413 +240,35,-1.428250817663256,0.048486514025046709 +240,40,-1.4286046024447023,0.05541482555289956 +240,45,-1.42900609393689,0.062338869520218575 +240,50,-1.4294642679998621,0.069274700222473673 +240,55,-1.4299619627360096,0.076189242741017835 +240,60,-1.4305067341892093,0.083097837463752877 +240,65,-1.4310986256552756,0.090000242365955663 +240,70,-1.431748601468954,0.096910783317138607 +240,75,-1.4324352947344563,0.10379995429481324 +240,80,-1.4331682959999827,0.11068129404820158 +240,85,-1.433959437377001,0.11756793235028057 +240,90,-1.4347858945775391,0.12443327699635778 +240,95,-1.4356579833840661,0.13128942877859601 +240,100,-1.4365756992797458,0.13813615889312611 +250,5,-1.3863681624422028,0.0067451577419163928 +250,10,-1.3863731831570758,0.013248308317743984 +250,15,-1.3864770966337165,0.019910852202565905 +250,20,-1.3866262888264982,0.026573934763031624 +250,25,-1.386819815751359,0.033235017189259926 +250,30,-1.3870575997795955,0.039893630068160275 +250,35,-1.3873395673839808,0.046549333815429077 +250,40,-1.3876656337980875,0.053201690878722133 +250,45,-1.388043973547988,0.059867278604920235 +250,50,-1.3884591008827418,0.066512093753060053 +250,55,-1.3889178205453327,0.073152055243879147 +250,60,-1.389420183989388,0.079786958957345847 +250,65,-1.389966054241949,0.086416381666838821 +250,70,-1.390566404505325,0.093054990965711515 +250,75,-1.3911999087922355,0.099672733789506598 +250,80,-1.3918761975678287,0.10628351595454148 +250,85,-1.3925953214186182,0.11288715185019187 +250,90,-1.3933694302548396,0.11949692430119735 +250,95,-1.3941746456580857,0.12608563929114353 +250,100,-1.3950218398622756,0.13266576674354125 +260,5,-1.3471416265125875,0.0064832886321787861 +260,10,-1.3471460468481258,0.012734283829186739 +260,15,-1.3472417635591676,0.019140561486953585 +260,20,-1.3473793934702796,0.02554759502618318 +260,25,-1.3475580234096693,0.031952845344516825 +260,30,-1.3477775840712343,0.038355889651755418 +260,35,-1.3480447272484795,0.044774594601331597 +260,40,-1.3483471259416924,0.05117246040265945 +260,45,-1.34869009049823,0.057566749893127635 +260,50,-1.3490736729670532,0.063957299535439813 +260,55,-1.3494977745471284,0.070343727956616919 +260,60,-1.3499622840548777,0.07672565248996524 +260,65,-1.3504777835909199,0.083118518987247467 +260,70,-1.351023835131547,0.08949082146478958 +260,75,-1.3516096836282683,0.095857276720963072 +260,80,-1.3522353999257213,0.1022177348461025 +260,85,-1.3529008312750352,0.10857182869648033 +260,90,-1.353618426289952,0.11493346521266237 +260,95,-1.354363796844729,0.12127432487023425 +260,100,-1.3551481065102982,0.12760750231547452 +270,5,-1.3093996603897158,0.0062465094162266633 +270,10,-1.3094013052927873,0.012273206741290879 +270,15,-1.3094906795203294,0.018442710555378092 +270,20,-1.3096188558863078,0.024612707285953876 +270,25,-1.3097850550020969,0.030781115546076349 +270,30,-1.3099892192346778,0.036947563291288843 +270,35,-1.3102312942886358,0.043111701026417336 +270,40,-1.310511217564946,0.049273180650763658 +270,45,-1.3108289180224164,0.055431655311244339 +270,50,-1.311184316237472,0.061586779533222551 +270,55,-1.3115870962943499,0.067755508636026626 +270,60,-1.312018763804362,0.073903391179187802 +270,65,-1.3124876385344832,0.080046688634698118 +270,70,-1.3129938087288855,0.086185287255684098 +270,75,-1.3135371582511384,0.092318853705475504 +270,80,-1.3141294665313557,0.098462024488496086 +270,85,-1.3147478112629107,0.10458507858458019 +270,90,-1.3154026999289619,0.11070189736297698 +270,95,-1.316094209388026,0.11681237018569803 +270,100,-1.316822185840549,0.12291617513378181 +280,5,-1.2730230281327064,0.0060146386917671072 +280,10,-1.2730278110553672,0.011823418868338292 +280,15,-1.2731101796240252,0.017772347403456817 +280,20,-1.2732286882509454,0.023722116237187844 +280,25,-1.2733874494560538,0.029690131314159686 +280,30,-1.2735777955061611,0.035637035128264702 +280,35,-1.2738033063993666,0.041581655962761969 +280,40,-1.2740640245155659,0.047523896567909729 +280,45,-1.2743598901735178,0.053463448178197981 +280,50,-1.274690834612554,0.059400000536266144 +280,55,-1.2750567818319671,0.065333244602690188 +280,60,-1.2754576486826963,0.071262872701939678 +280,65,-1.2758933449330208,0.077188578631289639 +280,70,-1.2763753709414027,0.0831268095404816 +280,75,-1.2768815368964124,0.089044301390998531 +280,80,-1.2774219909568523,0.094956747782237852 +280,85,-1.2779968423774188,0.1008640784504046 +280,90,-1.2786059711507491,0.10676599964813641 +280,95,-1.2792622285256645,0.11267677631524747 +280,100,-1.2799404960282,0.11856757820549223 +290,5,-1.2379259188712755,0.005802607449636378 +290,10,-1.2379325915102455,0.011421038254476663 +290,15,-1.2380096927773256,0.017165193882786318 +290,20,-1.238120408116605,0.0229099793458639 +290,25,-1.238264093232071,0.028653473381237207 +290,30,-1.2384407026031823,0.034395371036472458 +290,35,-1.2386501951135094,0.040135389909699927 +290,40,-1.2389002006742713,0.045892622286898617 +290,45,-1.2391764859433345,0.051628455062671524 +290,50,-1.2394853404402855,0.057361370507351156 +290,55,-1.2398268487434307,0.063091307367740865 +290,60,-1.2402009411651107,0.06881799113205915 +290,65,-1.2406075391691078,0.074541145579972892 +290,70,-1.2410465580521095,0.080260495770153734 +290,75,-1.2415179070492208,0.085975768174110026 +290,80,-1.2420340393189087,0.091703098120876347 +290,85,-1.2425708250651284,0.097409965199371812 +290,90,-1.2431393979717134,0.1031117296308758 +290,95,-1.243739877566023,0.1088083508831222 +290,100,-1.2443721483118828,0.11449956724901737 +300,5,-1.2040210875555488,0.0056079615281474232 +300,10,-1.2040273854859256,0.011043422901020911 +300,15,-1.2040995716782563,0.016596312784424132 +300,20,-1.2042031444863863,0.022149754177817924 +300,25,-1.2043375287507634,0.027702027731987513 +300,30,-1.204502684859832,0.033252858972622958 +300,35,-1.204698576818507,0.038801992689074791 +300,40,-1.2049251631914892,0.044349174598915311 +300,45,-1.2051908955844497,0.049913482066489323 +300,50,-1.2054798875813173,0.055456429192126115 +300,55,-1.2057992544474394,0.060996473464820775 +300,60,-1.206149092869731,0.06653357618095887 +300,65,-1.206529336834986,0.072067490186877289 +300,70,-1.2069399122530193,0.077597966586731071 +300,75,-1.2073807396723837,0.083124757635763519 +300,80,-1.2078517343771995,0.088647616858093234 +300,85,-1.2083656619139216,0.094182470197483492 +300,90,-1.2088977529286826,0.099697293859313862 +300,95,-1.2094594993492798,0.1052072506428713 +300,100,-1.2100510223135363,0.11071231620470159 +310,5,-1.1712302871461564,0.0054291467450721014 +310,10,-1.171234124318976,0.010688228944137778 +310,15,-1.171301711235329,0.01606206867827498 +310,20,-1.1713987140755486,0.021436488374870055 +310,25,-1.1715245760898074,0.026809847971468705 +310,30,-1.1716792617521818,0.032181897862203872 +310,35,-1.1718627393797107,0.037552406635972937 +310,40,-1.1720825194732598,0.042940620248732984 +310,45,-1.1723246039289388,0.048307742425959296 +310,50,-1.1725952212912116,0.053672458285886501 +310,55,-1.172894454279677,0.059034734563909889 +310,60,-1.1732222493452245,0.064394345739741024 +310,65,-1.1735785460580692,0.069751064824153899 +310,70,-1.173963279233286,0.075104665748761457 +310,75,-1.1743763790039148,0.080454923462632014 +310,80,-1.1748177708649223,0.085801613996378145 +310,85,-1.1752873757189664,0.091144514524802017 +310,90,-1.1757985229187289,0.096499745589131242 +310,95,-1.1763253269858487,0.10183497583473619 +310,100,-1.1768798511969272,0.10716555077796745 +320,5,-1.1394831130133767,0.005265438099807669 +320,10,-1.1394821788982243,0.010353253283011191 +320,15,-1.1395454320359166,0.015559102529251363 +320,20,-1.1396363632460056,0.020765669382376901 +320,25,-1.1397543822095257,0.025971270598935215 +320,30,-1.139899455825398,0.031175676439316333 +320,35,-1.1400783155977228,0.036398950376556292 +320,40,-1.1402785572421272,0.041600696036742137 +320,45,-1.140505639559799,0.046800445358280596 +320,50,-1.140759637752833,0.051998181790114117 +320,55,-1.141040508674834,0.057193699338093748 +320,60,-1.1413482031611364,0.062386790578101259 +320,65,-1.1416826678162981,0.067577248821113003 +320,70,-1.1420438450720796,0.072764868195973692 +320,75,-1.142431673222099,0.077949443705052579 +320,80,-1.142846086458086,0.083130771278760854 +320,85,-1.1432997588958245,0.08832496929769787 +320,90,-1.1437681311891,0.09349972676732278 +320,95,-1.1442626650615884,0.098670448499628138 +320,100,-1.144783480983329,0.10383712952256713 +330,5,-1.1087031505680993,0.0050955730088372451 +330,10,-1.1087089146046605,0.010057174564415659 +330,15,-1.108769487686832,0.015106032274090655 +330,20,-1.1088558690175792,0.020154988708107797 +330,25,-1.1089677184810467,0.025203071545258044 +330,30,-1.1091050114169319,0.030250081301890674 +330,35,-1.1092677231268562,0.035295826014027094 +330,40,-1.109455825123639,0.040340114198255526 +330,45,-1.1096692851032373,0.045382754833567698 +330,50,-1.1099080669641466,0.05042355741101693 +330,55,-1.1101721308291912,0.055462331983556198 +330,60,-1.1104614330691147,0.060498889215328554 +330,65,-1.1107759263279335,0.065533040430377859 +330,70,-1.1111155595500175,0.070564597660756484 +330,75,-1.1114802780088637,0.075593373694008606 +330,80,-1.111882419825457,0.080636012577937802 +330,85,-1.1122981417038362,0.085659180158599177 +330,90,-1.1127385742508429,0.09067883806099504 +330,95,-1.113203837492181,0.095694988737869136 +330,100,-1.1136938618277783,0.10070745163149641 +340,5,-1.0788441163884086,0.0049384329489125583 +340,10,-1.078852941904078,0.0097586154415162159 +340,15,-1.078909839378277,0.014659009113429764 +340,20,-1.0789910331147423,0.019559533713269992 +340,25,-1.079096220996494,0.024459254074642448 +340,30,-1.0792253807466026,0.029357986963219326 +340,35,-1.079378490326266,0.034255556822440761 +340,40,-1.0795555243382857,0.039151788533423562 +340,45,-1.0797564539947917,0.044046507384043698 +340,50,-1.0799812471334709,0.048939539111479816 +340,55,-1.0802298682359597,0.053830709945108822 +340,60,-1.0805022784477547,0.058719846648935967 +340,65,-1.0807984355996092,0.063606776563529865 +340,70,-1.0811298262598286,0.068509049886877199 +340,75,-1.0814743769300568,0.073391525828389939 +340,80,-1.081842358148347,0.078271120264095911 +340,85,-1.082233885161432,0.083147840097526377 +340,90,-1.0826489021547414,0.088021518033974469 +340,95,-1.0830873478112313,0.092891985339976418 +340,100,-1.083549157653099,0.09775907408826251 +350,5,-1.0498626896001155,0.0048097410884781876 +350,10,-1.049862612527033,0.0094751676860580364 +350,15,-1.0499158903743517,0.014235313290523891 +350,20,-1.0499922229865748,0.018995871512554292 +350,25,-1.0500912020544921,0.023755688003744935 +350,30,-1.0502128054157376,0.028514590817630456 +350,35,-1.0503570132968414,0.033272418961359539 +350,40,-1.050523802966073,0.038029011886831665 +350,45,-1.0507131486695342,0.04278420940879573 +350,50,-1.0509340271190242,0.047556949662859754 +350,55,-1.0511694724329825,0.052309266311920684 +350,60,-1.0514272496507253,0.057059567990483943 +350,65,-1.051707449771257,0.061807857163067553 +350,70,-1.0520100339773863,0.066553977399009465 +350,75,-1.0523349588999464,0.07129777114184653 +350,80,-1.052682178253512,0.076039081408414338 +350,85,-1.053051642879494,0.080777751843578854 +350,90,-1.0534433007703425,0.085513626755094427 +350,95,-1.0538570970945758,0.090246551147757592 +350,100,-1.054292974222871,0.09497637075709045 +360,5,-1.0216878949273833,0.0046721023340941898 +360,10,-1.0216905081111602,0.0092255863594007115 +360,15,-1.0217416564646415,0.013853986685234389 +360,20,-1.021814468689782,0.018482424386730596 +360,25,-1.0219086855183408,0.023110188006269759 +360,30,-1.0220242896407101,0.027737124956442587 +360,35,-1.0221612634381578,0.032363087242088293 +360,40,-1.0223195866031412,0.03698792717215918 +360,45,-1.0224992361261822,0.041611497357316271 +360,50,-1.0227001863079024,0.046233650742359036 +360,55,-1.022922408772395,0.050854240638651536 +360,60,-1.023165872481671,0.055473120756226943 +360,65,-1.0234305437511635,0.060090145235554587 +360,70,-1.0237163862662675,0.064705168678957564 +360,75,-1.0240233610999,0.069318046181669243 +360,80,-1.024351426731058,0.073928633362518564 +360,85,-1.024700539064356,0.078536786394234781 +360,90,-1.0250706514505203,0.083142362033361894 +360,95,-1.0254753919561366,0.087761670339156661 +360,100,-1.0258883032103612,0.092362196200564378 +370,5,-0.9942862978891883,0.0045436171742446966 +370,10,-0.9942889016792695,0.0089704491690861601 +370,15,-0.994336943036134,0.013473643267477945 +370,20,-0.994405532460217,0.017977016993528536 +370,25,-0.9944943872225083,0.02247976192788792 +370,30,-0.9946034906854828,0.026981735467721847 +370,35,-0.9947328269136941,0.031482801290719897 +370,40,-0.9948823775760868,0.035982823377855036 +370,45,-0.9950521219182263,0.04048166598479179 +370,50,-0.9952420367723693,0.044979193669739737 +370,55,-0.9954520965689205,0.049475271321598464 +370,60,-0.9956822733488182,0.053969764187814115 +370,65,-0.9959325367768306,0.058462537901930609 +370,70,-0.9962144110459803,0.062971361531391518 +370,75,-0.9965057597445084,0.067460746890252637 +370,80,-0.9968169461516501,0.071947879134468554 +370,85,-0.99714807537201,0.076432776471189137 +370,90,-0.997499107305176,0.080915308125583674 +370,95,-0.99786999789295,0.085395342239960856 +370,100,-0.9982607007971437,0.089872747490501087 +380,5,-0.9676165371152383,0.0044234444864928273 +380,10,-0.9676179926734804,0.0087253334085128052 +380,15,-0.9676657276332344,0.013130305155734438 +380,20,-0.9677313222311359,0.017515386438944347 +380,25,-0.9678161011344495,0.021899773371375525 +380,30,-0.9679200786731533,0.026283458518753251 +380,35,-0.9680432408893299,0.030666316755053585 +380,40,-0.9681855713227856,0.035048222404087927 +380,45,-0.9683470513308572,0.039429050013922544 +380,50,-0.968527660100751,0.043808674387057718 +380,55,-0.9687273746595126,0.048186970605288933 +380,60,-0.9689461698847421,0.052563814054298018 +380,65,-0.9691840185160714,0.0569390804480037 +380,70,-0.9694408911673938,0.061312645852663834 +380,75,-0.9697167563398321,0.06568438671072245 +380,80,-0.970011580435429,0.070054179864394314 +380,85,-0.9703253277715507,0.074421902578981763 +380,90,-0.9706579605959819,0.078787432565917581 +380,95,-0.9710094391027043,0.083150648005529321 +380,100,-0.9713797214483374,0.087511427569520531 +390,5,-0.9416406231483053,0.0043110409511529129 +390,10,-0.9416416922700073,0.0085144145603590644 +390,15,-0.9416850627724043,0.012786829387022127 +390,20,-0.9417469136952712,0.017059364557170886 +390,25,-0.9418270063166505,0.021331360682072295 +390,30,-0.9419253272244896,0.025602696760160332 +390,35,-0.9420418633797665,0.029873256344571573 +390,40,-0.9421765997956133,0.034142923217925308 +390,45,-0.9423295195197368,0.038411581377227354 +390,50,-0.9425006036420728,0.042679115055376353 +390,55,-0.9426898313033918,0.046945408742790476 +390,60,-0.9428971797045854,0.051210347208815551 +390,65,-0.9431226241166205,0.055473815522904514 +390,70,-0.943366137891152,0.059735699075561373 +390,75,-0.9436395879399869,0.064013096894891389 +390,80,-0.9439201151936666,0.068271917101641905 +390,85,-0.944218493874871,0.072528698284441556 +390,90,-0.9445348182339943,0.076783457231048499 +390,95,-0.9448690537247599,0.081036082119786523 +390,100,-0.9452211626552548,0.085286460314776893 +400,5,-0.916312151338508,0.0041872885030901259 +400,10,-0.9163229164145299,0.0083109420996467214 +400,15,-0.9163647344767673,0.012476893816076697 +400,20,-0.9164239963760864,0.016642695136159191 +400,25,-0.9165005987512965,0.020808003831089199 +400,30,-0.9165945309259359,0.024972710446012285 +400,35,-0.9167057811427652,0.029136706998770648 +400,40,-0.9168343358670358,0.033299885675539667 +400,45,-0.9169801797874966,0.03746213884235701 +400,50,-0.9171432958233321,0.041623359064431736 +400,55,-0.9173236651317229,0.045783439125334224 +400,60,-0.9175212671159781,0.049942272046010081 +400,65,-0.9177360794342296,0.054099751103612162 +400,70,-0.917968078008682,0.058255769850145724 +400,75,-0.9182172370354058,0.062410222130922309 +400,80,-0.9184835289946679,0.066563002102818097 +400,85,-0.9187669246617844,0.070714004252333665 +400,90,-0.9190673931184886,0.074863123413451305 +400,95,-0.9193849017648029,0.079010254785287934 +400,100,-0.9197194163314015,0.083155293949540687 +410,5,-0.8916199086990183,0.0040868733151878259 +410,10,-0.8916280016579581,0.0081001228239664744 +410,15,-0.8916672818004613,0.012164300469984594 +410,20,-0.8917232165101121,0.016228493017525047 +410,25,-0.8917956574525401,0.020292216069994651 +410,30,-0.8918845939831942,0.02435536628972243 +410,35,-0.8919900152813683,0.028417843444242762 +410,40,-0.8921119089252344,0.032479547481473386 +410,45,-0.8922502608822802,0.036540378522816469 +410,50,-0.892405055515215,0.040600236879890873 +410,55,-0.8925762755885481,0.044659023071297793 +410,60,-0.8927639022756775,0.048716637839210007 +410,65,-0.8929679151664826,0.052772982165777763 +410,70,-0.8931996532886888,0.056845159691075238 +410,75,-0.8934373277964482,0.060899088709249642 +410,80,-0.8936912136564894,0.064951361263729579 +410,85,-0.8939613905333731,0.06900198900690302 +410,90,-0.8942478313739092,0.073050874891222584 +410,95,-0.8945505066734943,0.077097921298621766 +410,100,-0.8948693854018973,0.081143030935463156 +420,5,-0.8675236602405386,0.0039927192217704428 +420,10,-0.8675297443003293,0.0079160892791855769 +420,15,-0.8675676332322847,0.011883683349576301 +420,20,-0.8676213632042502,0.015851176833406092 +420,25,-0.8676908228428573,0.019818240866025034 +420,30,-0.8677760030634878,0.023784780746851135 +420,35,-0.8678768940395152,0.027750703184326514 +420,40,-0.8679934844821813,0.031715915025487422 +420,45,-0.8681257616403534,0.035680323263677864 +420,50,-0.8682737113059362,0.039643835053583813 +420,55,-0.8684373178197604,0.043606357726171649 +420,60,-0.8686165640779006,0.047567798803480763 +420,65,-0.8688114315384182,0.051528066013266462 +420,70,-0.8690219002285237,0.055487067303490269 +420,75,-0.8692479487521487,0.059444710856655002 +420,80,-0.8694895542979242,0.063400905103982177 +420,85,-0.869746692647555,0.067355558739430318 +420,90,-0.8700193381845843,0.071308580733552465 +420,95,-0.8703074639035387,0.075259880347191777 +420,100,-0.870611041419447,0.079209367145014808 +430,5,-0.8439858312600024,0.0038890352035318857 +430,10,-0.8439969023275486,0.0077216125624620562 +430,15,-0.844032451411053,0.011596808992179712 +430,20,-0.8440831168382961,0.015472015409189608 +430,25,-0.8441487897126212,0.019346806237579187 +430,30,-0.8442294610883766,0.023221091737638457 +430,35,-0.8443251218560651,0.02709478503488804 +430,40,-0.8444428711840415,0.030985397434889435 +430,45,-0.8445694656889747,0.034857924101241021 +430,50,-0.8447109609773352,0.038729547258287887 +430,55,-0.8448673971393228,0.042600255890140014 +430,60,-0.8450387590018167,0.046469964086564515 +430,65,-0.845225029717006,0.050338585716990188 +430,70,-0.8454261911315114,0.054206034837271551 +430,75,-0.8456422237954013,0.058072225704975666 +430,80,-0.8458731069691964,0.061937072792200905 +430,85,-0.8461188186311908,0.065800490798257436 +430,90,-0.8463793354851018,0.069662394662223376 +430,95,-0.846654632968034,0.073522699575376438 +430,100,-0.8469446852587578,0.077381320993500743 +440,5,-0.8209977408936884,0.0038036364839039716 +440,10,-0.8210068805259365,0.0075551030785175411 +440,15,-0.8210412774405474,0.011342395368754987 +440,20,-0.8210900912521119,0.015129588444293945 +440,25,-0.8211532380291783,0.018916400317974879 +440,30,-0.8212307100534331,0.022702748610177809 +440,35,-0.8213224989819116,0.026488552199540265 +440,40,-0.8214285952575494,0.030273730085149272 +440,45,-0.8215489881084912,0.034058201391435582 +440,50,-0.821683665552371,0.037841885379930329 +440,55,-0.8218326144009708,0.041624701460936074 +440,60,-0.8219958202652131,0.045406569205064071 +440,65,-0.8221732675604868,0.049187408354635066 +440,70,-0.8223649395123013,0.05296713883494137 +440,75,-0.8225708181622635,0.056745680765368976 +440,80,-0.8227908843743762,0.060522954470377685 +440,85,-0.8230372359082769,0.064313883250267476 +440,90,-0.8232864547996069,0.068088831659943588 +440,95,-0.8235497175498233,0.071862211730668979 +440,100,-0.8238270839414317,0.075634025102878033 +450,5,-0.7985276589060774,0.0037241586026077389 +450,10,-0.7985334382166958,0.0073937772711575494 +450,15,-0.7985666723087836,0.011097008632214111 +450,20,-0.7986136787127932,0.014800095719147475 +450,25,-0.7986743884406885,0.018502833556816686 +450,30,-0.798748794663797,0.022205145666020016 +450,35,-0.7988368897538984,0.025906956165876051 +450,40,-0.7989386649710944,0.029608189272389906 +450,45,-0.7990541104658544,0.033308769306960452 +450,50,-0.799183215282984,0.037008620706956839 +450,55,-0.7993259673658893,0.040707668036195188 +450,60,-0.7994823535611264,0.044405835995303546 +450,65,-0.7996523596232284,0.048103049431974333 +450,70,-0.7998359702198107,0.051799233351102765 +450,75,-0.8000331689369445,0.05549431292481119 +450,80,-0.8002439382847975,0.059188213502358783 +450,85,-0.8004682597035347,0.06288086061993696 +450,90,-0.8007061135694751,0.066572180010350923 +450,95,-0.8009574792014952,0.070262097612588309 +450,100,-0.8012223348676797,0.073950539581275967 +460,5,-0.7765422987009089,0.0036338001177373502 +460,10,-0.7765523502459758,0.0072227311386677323 +460,15,-0.7765835016193907,0.010845329511316717 +460,20,-0.7766278448571493,0.014467876681815265 +460,25,-0.776685302557508,0.018090077677304233 +460,30,-0.7767558678613675,0.021711859931375397 +460,35,-0.7768455710918984,0.025348778506581033 +460,40,-0.7769432686419696,0.028969749899080122 +460,45,-0.7770540190213799,0.032590071359674774 +460,50,-0.7771778437357031,0.036209717279332955 +460,55,-0.7773147319195332,0.039828617098924254 +460,60,-0.7774646715571629,0.043446700214512336 +460,65,-0.7776276496321871,0.047063896146638418 +460,70,-0.777803652132718,0.050680134550190555 +460,75,-0.7779926640561774,0.054295345223533791 +460,80,-0.7781946694143056,0.057909458117550293 +460,85,-0.7784096512383857,0.061522403344593433 +460,90,-0.7786375915846766,0.065134111187356611 +460,95,-0.7788784715400495,0.068744512107658515 +460,100,-0.7791322712278228,0.072353536755146525 +470,5,-0.7550389497862652,0.0035613112464256522 +470,10,-0.7550457870679118,0.0070766247789593416 +470,15,-0.7550760128541893,0.010622259588517554 +470,20,-0.7551188670022814,0.014167781193313394 +470,25,-0.7551742834143553,0.017712984938328912 +470,30,-0.7552422560009858,0.021257803545425003 +470,35,-0.7553227781085887,0.024802170469701821 +470,40,-0.7554158421499193,0.02834601926025241 +470,45,-0.7555214396047089,0.031889283565283928 +470,50,-0.7556395610228827,0.035431897140372239 +470,55,-0.755770196028031,0.038973793856611358 +470,60,-0.7559133333211225,0.042514907708638479 +470,65,-0.7560689606844523,0.046055172822532894 +470,70,-0.7562370649858283,0.049594523463587357 +470,75,-0.756417632182992,0.053132894043951211 +470,80,-0.7566215901776167,0.056683440714841847 +470,85,-0.7568278164127366,0.060220083852973651 +470,90,-0.7570464118904524,0.063755522025572567 +470,95,-0.7572774105042243,0.067289739516254388 +470,100,-0.7575207943042109,0.070822671340428967 +480,5,-0.733980321115762,0.0034797321168366533 +480,10,-0.7339919008437588,0.006934573457401165 +480,15,-0.7340212180612957,0.010406455049179241 +480,20,-0.7340626058650097,0.013878157941498522 +480,25,-0.7341160380241455,0.017349569214964757 +480,30,-0.7341815091703331,0.020820626132285223 +480,35,-0.734259013163244,0.024291266178437229 +480,40,-0.7343485430038837,0.027761426914453633 +480,45,-0.7344500908371526,0.031231045984440327 +480,50,-0.7345636479549871,0.034700061122991982 +480,55,-0.7346892047997055,0.038168410162498091 +480,60,-0.734826750967556,0.041636031040337133 +480,65,-0.7349762752124622,0.045102861805958586 +480,70,-0.7351377654499672,0.048568840627853001 +480,75,-0.7353112087613692,0.052033905800410701 +480,80,-0.7354965913980495,0.055497995750670021 +480,85,-0.735693898785986,0.058961049044956512 +480,90,-0.7359031155304506,0.062423004395414906 +480,95,-0.7361242254208844,0.06588380066643601 +480,100,-0.7363572114359459,0.069343376880981258 +490,5,-0.7133640763590208,0.0034134698595698885 +490,10,-0.713372098488776,0.0067967949319672569 +490,15,-0.713400465329369,0.010197864686808757 +490,20,-0.7134404137298724,0.013598758796543021 +490,25,-0.713491920308896,0.016999385536017944 +490,30,-0.713554980170263,0.02039968597271578 +490,35,-0.713629587671455,0.023799601292507203 +490,40,-0.7137157363801179,0.027199072742352535 +490,45,-0.713813419076788,0.030598041636971697 +490,50,-0.7139226277579072,0.03399644936555709 +490,55,-0.7140433536390053,0.03739423739839224 +490,60,-0.7141755871580501,0.040791347293376766 +490,65,-0.71431931797896,0.044187720702458612 +490,70,-0.7144745349952734,0.047583299377975098 +490,75,-0.7146412263339759,0.050978025178904887 +490,80,-0.7148193793594758,0.054371840077033141 +490,85,-0.7150089806777266,0.057764686163033083 +490,90,-0.715210016140489,0.061156505652467066 +490,95,-0.7154224708497299,0.064547240891711655 +490,100,-0.7156463291621485,0.067936834363810789 +500,5,-0.6931567642092097,0.003338923050947466 +500,10,-0.693167530743147,0.0066535187903594747 +500,15,-0.6931941822313998,0.0099864812526377963 +500,20,-0.6932319649795574,0.013319297465686717 +500,25,-0.6932808476880918,0.016651837554692957 +500,30,-0.6933408253820703,0.019984045939219472 +500,35,-0.6934118925170913,0.023315867434718276 +500,40,-0.6934940428175114,0.026647246946221573 +500,45,-0.6935872692775532,0.02997812947279305 +500,50,-0.6936989396265383,0.033319690055084721 +500,55,-0.6938150881376377,0.036649743896545656 +500,60,-0.6939422720920503,0.039979145022424882 +500,65,-0.6940805012776042,0.043307858564822541 +500,70,-0.6942297655516642,0.046635829624110614 +500,75,-0.6943900540166589,0.049963003342512941 +500,80,-0.6945613550720934,0.05328932495719834 +500,85,-0.6947436564183619,0.056614739806104944 +500,90,-0.6949369450605342,0.059939193333592621 +500,95,-0.6951412073122358,0.063262631096052097 +500,100,-0.6953564287996141,0.066584998767477394 From b467da3ace0b6fedb8188582c76363beccebdeea Mon Sep 17 00:00:00 2001 From: "M.K" Date: Thu, 4 Aug 2016 00:12:27 +0900 Subject: [PATCH 02/12] forgot adding --- pokemongo_bot/human_behaviour.py | 264 ++++++++++++++++++++++++++++--- 1 file changed, 242 insertions(+), 22 deletions(-) diff --git a/pokemongo_bot/human_behaviour.py b/pokemongo_bot/human_behaviour.py index 2a8d2d5e9f..bedd73c0f1 100644 --- a/pokemongo_bot/human_behaviour.py +++ b/pokemongo_bot/human_behaviour.py @@ -1,16 +1,76 @@ # -*- coding: utf-8 -*- import time -from random import random, uniform +from math import exp +from random import random, gauss, uniform +from collections import defaultdict +from numpy.random import lognormal +def lognormal_model(path='data/lognormal.model'): + ''' + lazy initialization of model + ''' + if not hasattr(lognormal_model, 'delay_range2mu_sigma'): + lognormal_model.delay_range2mu_sigma = defaultdict(dict) + for line in open(path): + delay, delay_range, mu_, sigma = line.strip().split(',') + lognormal_model.delay_range2mu_sigma \ + [int(delay)][int(delay_range)] = \ + (float(mu_), float(sigma)) + return lognormal_model.delay_range2mu_sigma -def sleep(seconds, delta=0.3): - time.sleep(jitter(seconds,delta)) +def pareto(alpha=5.0, cap=10): + ''' + somehow reflects human behaviour (Zipf's law) + transformed to return [alpha-1/alpha, inf) with mean of 1.0 + capped to prevent inf + ''' + alpha = float(alpha) + return min((alpha - 1) / alpha / ((1 - random())**(1 / alpha)), cap) -def jitter(value, delta=0.3): - jitter = delta * value - return uniform(value-jitter, value+jitter) + +def sleep(seconds): + ''' + sleep for (given seconds + jitter + human reflex) seconds. + ''' + time.sleep(seconds + jitter_rng() + human_reflex_rng()) + + +def jitter_rng(ping=80, ping_range=30): + ''' + Simple lognormal jitter model for given ping and range. + Actually wider range is preferred for accurate modeling, + but we don't want to spend much time... + ''' + ping = int(ping / 10) * 10 + ping_range = int(ping_range / 5) * 5 + ping = min(max(10, ping), 500) + ping_range = min(max(10, ping_range), 100) + mu_, sigma = lognormal_model()[ping][ping_range] + lag = lognormal(mu_, sigma) + lag = min(1.0, lag) + return lag + + +def human_reflex_rng(reflex_mean=270, reflex_range=100): + ''' + Simulates human reflexes. + ''' + mu_, sigma = lognormal_model()[reflex_mean][reflex_range] + return min(1.0, lognormal(mu_, sigma)) + + +def random_lat_long_delta(radius=0.00025): + ''' + Simulates gps noise. + ''' + # Return random value from [-.000025, .000025]ish 99.73% of time. + # Since 364,000 feet is equivalent to one degree of latitude, this + # Gaussian is better for gps errors + noise = gauss(0, radius/3.0) + noise = min(max(-radius, noise), radius) + return noise def action_delay(low, high): @@ -20,27 +80,187 @@ def action_delay(low, high): time.sleep(shortNum) -def random_lat_long_delta(): - # Return random value from [-.000025, .000025]. Since 364,000 feet is equivalent to one degree of latitude, this - # should be 364,000 * .000025 = 9.1. So it returns between [-9.1, 9.1] - return ((random() * 0.00001) - 0.000005) * 5 +def ball_throw_reticle_fail_delay(success_prob=0.95): + ''' + Chances to skip the reticle could be considered constant, + so the wait time before throwing is as follows, + given that the pokemon does not interrupt... <- TODO + ''' + for trial in range(10): + if random() < success_prob: + break + + time.sleep(1.8*(trial+random())) + + +def aim_rng(target, std=0.05): + ''' + noise from the target point should be approximated by gaussian, + we can wait for the missed reticles etc, which means we get + another chance to try... + + ''' + for trial in range(10): + r = gauss(0, std) + if 0 <= target + r and target + r <= 1: + break + else: + # couldnt find target + gauss between [0, 1] + return random() + return target + r # Humanized `normalized_reticle_size` parameter for `catch_pokemon` API. # 1.0 => normal, 1.950 => excellent -def normalized_reticle_size(factor): - minimum = 1.0 - maximum = 1.950 - return uniform( - minimum + (maximum - minimum) * factor, - maximum) +def normalized_reticle_size(factor, mode='human'): + if 'bot' == mode: + return 1.950 + elif 'uniform' == mode: + minimum = 1.0 + maximum = 1.950 + return uniform( + minimum + (maximum - minimum) * factor, + maximum) + elif 'human' == mode: + rnd = gauss(factor, 0.05) + # mirror the bounds + rnd = rnd%1.0 + return 1.950 * rnd + else: + return mode(factor) # strategy # Humanized `spin_modifier` parameter for `catch_pokemon` API. # 0.0 => normal ball, 1.0 => super spin curve ball -def spin_modifier(factor): - minimum = 0.0 - maximum = 1.0 - return uniform( - minimum + (maximum - minimum) * factor, - maximum) +def spin_modifier(factor, mode='human'): + if 'bot' == mode: + return 1.0 + elif 'uniform' == mode: + minimum = 0.0 + maximum = 1.0 + return uniform( + minimum + (maximum - minimum) * factor, + maximum) + elif 'human' == mode: + return aim_rng(factor) + else: + return mode(factor) + + +def _visualize(): + ''' + Visualize rng distributions. + ''' + import numpy as np + import pandas as pd + import matplotlib.pyplot as plt + import seaborn as sns + + K = 10000 + + # lognormal simulations + human_reflex = [human_reflex_rng() for x in range(K)] + jitter = [jitter_rng(80,30) for x in range(K)] + + df_time = pd.DataFrame() + df_time.loc[:,'time'] = human_reflex + jitter + df_time.loc[:,'type'] = ['reflex']*len(human_reflex)+['jitter']*len(jitter) + + g = sns.FacetGrid(df_time, col='type') + g.map(sns.distplot, 'time') + sns.plt.savefig('time.png') + + + # spin simulation + spin9 = [spin_modifier(.9) for x in range(K)] + spin5 = [spin_modifier(.5) for x in range(K)] + spin1 = [spin_modifier(.1) for x in range(K)] + + df_time = pd.DataFrame() + df_time.loc[:,'value'] = spin9 + spin5 + spin1 + df_time.loc[:,'factor'] = ['0.9']*len(spin9)+['0.5']*len(spin5)+['0.1']*len(spin1) + + g = sns.FacetGrid(df_time, col='factor') + g.map(sns.distplot, 'value') + sns.plt.savefig('spin.png') + + # reticle simulation + reti9 = [normalized_reticle_size(.9) for x in range(K)] + reti5 = [normalized_reticle_size(.5) for x in range(K)] + reti1 = [normalized_reticle_size(.1) for x in range(K)] + + df_time = pd.DataFrame() + df_time.loc[:,'value'] = reti9 + reti5 + reti1 + df_time.loc[:,'factor'] = ['0.9']*len(spin9)+['0.5']*len(spin5)+['0.1']*len(spin1) + + g = sns.FacetGrid(df_time, col='factor') + g.map(sns.distplot, 'value') + sns.plt.savefig('reticle.png') + + +def _precalc_lognormal_ping_param( + output_file_path='lognormal_connection.model'): + ''' + Precalc parameters for lognormal ping model. + ''' + def calc_lognormal_ping_param( + target_mu, target_std, init_mu=0.1, init_std=0.1, debug=False): + # calculate mu and sighma for lognormal + import numpy as np + import theano + import theano.tensor as T + + # codes to calculate lognormal connection lag + mu_ = theano.shared(init_mu, name='mu') + sigma = theano.shared(init_std, name='sigma') + + eps = 1.5 # constant for gradient + func = (T.exp(mu_ + sigma * sigma / 2.0) - target_mu)**2 + \ + (T.sqrt(T.exp(2 * mu_ + sigma * sigma) * + (T.exp(sigma * sigma) - 1)) - target_std)**2 + + grad_mu, grad_sigma = T.grad(func, [mu_, sigma]) + + train = theano.function(inputs=[], outputs=[func], updates=( + (mu_, mu_ - eps * grad_mu), (sigma, sigma - eps * grad_sigma))) + + for epoch in range(100000): + err = train() + if float(err[0]) < 10e-10: + break + err = float(err[0]) + mu_ = float(mu_.get_value()) + sigma = np.abs(sigma.get_value()) + if debug: + print('Error:%s' % repr(err)) + print('[Expected mu and std]') + print('mu=%f, std=%f' % (target_mu, target_std)) + print('[lognormal check]') + print('mean=%f, std=%f' % (exp(mu_ + (sigma**2) / 2.0), + ((exp(sigma**2) - 1) * exp(2 * mu_ + sigma**2))**0.5)) + return mu_, sigma + + # good initial number for algo + init_mu = -1.5 + init_std = 0.007 + res = [] + for ping_ms in range(10, 501, 10): + for range_ms in range(5, 101, 5): + ping = ping_ms / 1000.0 + std = range_ms / 3.0 / 1000.0 + lognormal_mu, lognormal_std = calc_lognormal_ping_param( + ping, std, init_mu, init_std) + formatted = ','.join(map(repr, (ping_ms, range_ms, lognormal_mu, lognormal_std))) + res.append(formatted) + print(res[-1]) + init_mu = lognormal_mu + init_std = lognormal_std + + with open(output_file_path, 'w') as fout: + fout.write('\n'.join(res)) + + +if '__main__' == __name__: + # _precalc_lognormal_ping_param() + # _visualize() + pass From c05fbcfeaf85eac863d7645c268a05750ef3115e Mon Sep 17 00:00:00 2001 From: "M.K" Date: Thu, 4 Aug 2016 00:15:47 +0900 Subject: [PATCH 03/12] added better rng and model file --- data/lognormal.model | 1000 ++++++++++++++++++++++++++++++ pokemongo_bot/human_behaviour.py | 264 +++++++- 2 files changed, 1242 insertions(+), 22 deletions(-) create mode 100644 data/lognormal.model diff --git a/data/lognormal.model b/data/lognormal.model new file mode 100644 index 0000000000..e9f7e3774a --- /dev/null +++ b/data/lognormal.model @@ -0,0 +1,1000 @@ +10,5,-4.616056279651733,0.16314945605790696 +10,10,-4.654509411741211,0.32206282695599847 +10,15,-4.712882558733536,0.46980053502998265 +10,20,-4.784728160970069,0.60382096464875279 +10,25,-4.864176650816492,0.72363961829746082 +10,30,-4.946778575031898,0.83004984302534501 +10,35,-5.02953812433362,0.92444540675412412 +10,40,-5.110613331492685,1.0083779718302868 +10,45,-5.188968879044218,1.083327073285254 +10,50,-5.264092089783407,1.1506051593567688 +10,55,-5.335793153108978,1.211335179608831 +10,60,-5.404072014080302,1.2664603084787531 +10,65,-5.469035581181396,1.3167666060195917 +10,70,-5.530846733997671,1.3629079021107928 +10,75,-5.589694876553046,1.405429272482368 +10,80,-5.6457746165179215,1.4447857199014495 +10,85,-5.699278877649659,1.4813598173900231 +10,90,-5.750391626574923,1.5154744924388424 +10,95,-5.799284558115888,1.5474036516503382 +10,100,-5.846117447194974,1.5773813201136113 +20,5,-3.916752212510045,0.084340946729705976 +20,10,-3.924394014611288,0.16425306866729103 +20,15,-3.9408063188456253,0.24497532639753442 +20,20,-3.9630317075663997,0.32332892706626121 +20,25,-3.990259961533459,0.39882605328087006 +20,30,-4.021663359217758,0.47109062133687712 +20,35,-4.056413819968653,0.53988784450913307 +20,40,-4.093731897089638,0.60511225238895561 +20,45,-4.132916541358667,0.66676220421981502 +20,50,-4.173363167475968,0.72491571053309067 +20,55,-4.2145664946523835,0.77970644201642947 +20,60,-4.256112319007335,0.83130213475189396 +20,65,-4.297672339435738,0.87989132914701751 +20,70,-4.338988443723558,0.92566957177507747 +20,75,-4.379864986063282,0.96883318586326395 +20,80,-4.420155387248137,1.0095725281046506 +20,85,-4.4597534585824965,1.0480690031674318 +20,90,-4.498584361781276,1.0844927439027439 +20,95,-4.536598686801127,1.119002104627391 +20,100,-4.573765996504509,1.1517430875296097 +30,5,-3.508917706075146,0.056261008176375485 +30,10,-3.5119720219328814,0.10986328688386143 +30,15,-3.5193629398360415,0.16468797278755376 +30,20,-3.5296761283332727,0.21872454226982682 +30,25,-3.5426706496823006,0.27179997841761316 +30,30,-3.558124485697554,0.32375115394776233 +30,35,-3.5758009476745243,0.37442959119615632 +30,40,-3.5954578882863317,0.42371742553488934 +30,45,-3.6168426832250735,0.47152132704440475 +30,50,-3.6397139600310306,0.51778148636493404 +30,55,-3.66383505644649,0.56246017669864634 +30,60,-3.6889847230403414,0.60554282745347587 +30,65,-3.714961773795475,0.64703540561663742 +30,70,-3.7415807186324774,0.68695736107525951 +30,75,-3.7686783123184875,0.72534198281165019 +30,80,-3.7961075686591643,0.76223024156690355 +30,85,-3.823742722565532,0.79767149612085675 +30,90,-3.851476708833415,0.83172050305077583 +30,95,-3.8792125084811673,0.86443202137741482 +30,100,-3.9068729014028287,0.89586515705693126 +40,5,-3.220348690369191,0.042201724022051926 +40,10,-3.2218927874523877,0.082475029824635226 +40,15,-3.226035843931853,0.1238624652183356 +40,20,-3.231903693186518,0.16490116724261447 +40,25,-3.2393957493846877,0.20550598230231484 +40,30,-3.2484242890846784,0.24560023460939545 +40,35,-3.258898127322142,0.28510892276478184 +40,40,-3.270721289845689,0.32396206856812237 +40,45,-3.283795298317571,0.36209910840364579 +40,50,-3.2980180246541604,0.3994684039156961 +40,55,-3.3132810519995006,0.43602463031350036 +40,60,-3.3294845468885867,0.47173773365357835 +40,65,-3.3465197387430017,0.50657911881976392 +40,70,-3.364291298898512,0.5405352230409598 +40,75,-3.382704053891119,0.57359697637232454 +40,80,-3.4016636236180577,0.60575923667485898 +40,85,-3.4210873140879614,0.63702631366355023 +40,90,-3.4408965194797965,0.66740617224448839 +40,95,-3.4610187084963298,0.69691082568813412 +40,100,-3.4813855295706055,0.72555459094901331 +50,5,-2.996764981745989,0.033762982016823102 +50,10,-2.9976548223280672,0.066008598688572617 +50,15,-3.0002893876109895,0.099208412870507315 +50,20,-3.004052919605667,0.13223355642177864 +50,25,-3.008894738446769,0.16502853021409661 +50,30,-3.0147725118878244,0.19754947538488377 +50,35,-3.0216415267861487,0.22975383093142157 +50,40,-3.029460723737394,0.26160502293682647 +50,45,-3.0381780787247052,0.29306126571542945 +50,50,-3.0477477217483284,0.32409058073289115 +50,55,-3.0581162013670404,0.3546600953388625 +50,60,-3.0692339942049345,0.38474485135145486 +50,65,-3.0810451823104197,0.41431973670753902 +50,70,-3.0934961871286513,0.44336546586528569 +50,75,-3.1065337772498656,0.47186649171411282 +50,80,-3.1201055237276583,0.4998107694631086 +50,85,-3.1341628755554556,0.52719121080598486 +50,90,-3.14864852678029,0.55399713339535983 +50,95,-3.1635224786094995,0.58023045126676653 +50,100,-3.1787369548167357,0.60588923511636827 +60,5,-2.8141880854286243,0.028138809721160611 +60,10,-2.8147427286729405,0.055019426075035821 +60,15,-2.816563805424102,0.082726338929081017 +60,20,-2.8191730772242938,0.11033065339674958 +60,25,-2.822549647090562,0.1378058296969456 +60,30,-2.8266645538145143,0.16511451435865057 +60,35,-2.8314952530927693,0.1922327690486729 +60,40,-2.8370218957799875,0.2191399175173461 +60,45,-2.843216382491172,0.24580954026816376 +60,50,-2.850052607189156,0.27221928504984705 +60,55,-2.857503279040635,0.2983481218938856 +60,60,-2.865536527946155,0.32417399879202413 +60,65,-2.874129606347463,0.34968431658615889 +60,70,-2.883245699764681,0.37485825578140786 +60,75,-2.8928539407632674,0.39968186443283082 +60,80,-2.9029299235312203,0.42414771646773253 +60,85,-2.913436266277488,0.4482410036175053 +60,90,-2.9243420609267305,0.47195319884561421 +60,95,-2.9356201919900125,0.49527965631847626 +60,100,-2.9472410107241354,0.51821513420554011 +70,5,-2.6598720378668754,0.024121826978681388 +70,10,-2.660237647717709,0.047166670381784966 +70,15,-2.661570000289415,0.070933484427640331 +70,20,-2.6634828195937335,0.09463629001635511 +70,25,-2.6659642784460797,0.11825867112553129 +70,30,-2.6690011135633225,0.1417779446557729 +70,35,-2.672576962291597,0.16517356542193626 +70,40,-2.6766821252946444,0.18843379664958421 +70,45,-2.6812941527583174,0.21153588801338302 +70,50,-2.6864057695369254,0.23447201104894305 +70,55,-2.6919930586789276,0.2572209853425716 +70,60,-2.698047203118507,0.2797755218412154 +70,65,-2.704542906827506,0.30211636576299228 +70,70,-2.7114659161997574,0.32423450968188211 +70,75,-2.71880165020656,0.34612182621835486 +70,80,-2.7265233102466735,0.3677623869104889 +70,85,-2.7346152733316442,0.38914990631031743 +70,90,-2.743054320299798,0.41027370276258363 +70,95,-2.751828421248564,0.43113204026623653 +70,100,-2.7609106920048645,0.45171367279107028 +80,5,-2.526224670515837,0.021107965042591558 +80,10,-2.5264767642073727,0.041275349131596639 +80,15,-2.52749267105767,0.062078664164264885 +80,20,-2.5289559496626417,0.082845482666806691 +80,25,-2.530855702687071,0.10355678171265037 +80,30,-2.5331862282283777,0.12419997065995385 +80,35,-2.5359360582303236,0.14475837404173728 +80,40,-2.5390965667940657,0.16522132301581915 +80,45,-2.542658770267417,0.18557829090638436 +80,50,-2.546613199058567,0.20581886910004926 +80,55,-2.55095457786502,0.22593680147951592 +80,60,-2.555663196812028,0.2459143104511945 +80,65,-2.5607371516120288,0.26574942475244762 +80,70,-2.566156039735204,0.28542581888504059 +80,75,-2.5719124186049664,0.30493851961227442 +80,80,-2.5779987406774714,0.3242830367229404 +80,85,-2.584393593103854,0.34344515333977321 +80,90,-2.5910884974445407,0.36242132929099025 +80,95,-2.598070644383271,0.38120543061653617 +80,100,-2.6053269802487065,0.39979182878930691 +90,5,-2.4083579818907426,0.01876458149125777 +90,10,-2.4085371738718004,0.036694927108251431 +90,15,-2.409338226103796,0.055192211483089303 +90,20,-2.410493082791113,0.073665966561663618 +90,25,-2.4119907437617623,0.092096454873279249 +90,30,-2.413835988232551,0.11048755985450051 +90,35,-2.4160117314238523,0.12881217989441807 +90,40,-2.4185213587629724,0.14707399716978956 +90,45,-2.421349459912604,0.16525476747411338 +90,50,-2.4244997085399738,0.18335703361579683 +90,55,-2.4279607363419218,0.20136840457350716 +90,60,-2.4317254828956227,0.21928153864380301 +90,65,-2.4357867096187342,0.2370893909859669 +90,70,-2.4401368714499783,0.25478514653226902 +90,75,-2.444768124891041,0.2723622595239652 +90,80,-2.4496672222356604,0.2898104937498836 +90,85,-2.4548359304793896,0.30713191260379091 +90,90,-2.460260772680332,0.32431708922886066 +90,95,-2.4659328095265267,0.3413607191525681 +90,100,-2.4718430829539786,0.35825797728256498 +100,5,-2.3029357959479104,0.016891260258064551 +100,10,-2.303063691105835,0.033024680801306779 +100,15,-2.303711391215226,0.04967746098013593 +100,20,-2.3046464194706395,0.066314820762031532 +100,25,-2.3058599986680393,0.082920252372391159 +100,30,-2.3073539134493615,0.099494540925086861 +100,35,-2.3091159846524167,0.11601756387663595 +100,40,-2.311152221195079,0.1324967839035209 +100,45,-2.3134597185679833,0.14892567849223676 +100,50,-2.3160231515947203,0.16528679036240812 +100,55,-2.3188431463013344,0.18158040253576174 +100,60,-2.321915140879609,0.19780117622566457 +100,65,-2.3252400036100043,0.21394871783476596 +100,70,-2.3288011271803053,0.23000789058346233 +100,75,-2.3325985726458636,0.24597844406374528 +100,80,-2.3366268905149825,0.26185560856082918 +100,85,-2.3408860144097647,0.27763920955827687 +100,90,-2.345358660678315,0.29331578522548279 +100,95,-2.3500440879735978,0.30888541912078199 +100,100,-2.354936157269966,0.32434421331184354 +110,5,-2.2075752424088315,0.015355560591059619 +110,10,-2.207670964237554,0.030027194756912248 +110,15,-2.2082052093518403,0.045166377965205513 +110,20,-2.2089765851220906,0.060295508906125596 +110,25,-2.2099781780205405,0.075400736527566029 +110,30,-2.2112129956516196,0.090485247912876626 +110,35,-2.212674977371374,0.10553573818960731 +110,40,-2.2143613434876164,0.12054773234299179 +110,45,-2.216269271691655,0.13551692345249194 +110,50,-2.2183957688627896,0.1504390246002365 +110,55,-2.220737668905023,0.1653097801143236 +110,60,-2.2232916344164146,0.18012498097070917 +110,65,-2.2260541589605287,0.19488048064791075 +110,70,-2.2290215701070566,0.20957221096082462 +110,75,-2.232196421148394,0.22420156355425211 +110,80,-2.2355621409105546,0.23875399108539028 +110,85,-2.239120600065566,0.25323093077687098 +110,90,-2.2428676852773637,0.26762890585333887 +110,95,-2.2468052477590335,0.28194936449495384 +110,100,-2.250916405406456,0.29617922763021926 +120,5,-2.120522422235391,0.014073857569958917 +120,10,-2.120595850971716,0.027523532685376426 +120,15,-2.1210453454519707,0.041407983713783798 +120,20,-2.1216913912867716,0.055275575267896997 +120,25,-2.122534712895865,0.069134482915189713 +120,30,-2.123571012640021,0.08297080304809637 +120,35,-2.124798505988217,0.096780879614921364 +120,40,-2.1262153687383036,0.11056125413294986 +120,45,-2.1278196303279113,0.12430849066540132 +120,50,-2.1296158010805897,0.13802637164543088 +120,55,-2.1315887984846054,0.15169709610401952 +120,60,-2.1337490401726886,0.16533101870070802 +120,65,-2.1360808470265886,0.17891187931928421 +120,70,-2.1385947654426616,0.19244900708498 +120,75,-2.1412746624058276,0.20592715144537224 +120,80,-2.144130969406783,0.21935498334068607 +120,85,-2.1471472915767302,0.23271804817968902 +120,90,-2.1503338182283285,0.24602459864559198 +120,95,-2.1536740085706425,0.25926086184929265 +120,100,-2.157170950603397,0.27242942872370546 +130,5,-2.0404513659621473,0.012995200560427718 +130,10,-2.040505355292806,0.025416369605012236 +130,15,-2.0408871371871853,0.038227163247248439 +130,20,-2.0414383969104546,0.051033744696799638 +130,25,-2.0421544414013844,0.063825920189428162 +130,30,-2.0430395590805297,0.076610447570477594 +130,35,-2.0440828842350545,0.089364731249738746 +130,40,-2.0452938352110714,0.10210456477585035 +130,45,-2.0466658716705926,0.11481788410186723 +130,50,-2.048190266798112,0.12749398632137821 +130,55,-2.0498787041831075,0.1401462540437679 +130,60,-2.051723055787703,0.15276409859656587 +130,65,-2.0537211959012374,0.16534476441105456 +130,70,-2.055871098203065,0.17788569160808826 +130,75,-2.058170654723784,0.19038435539108922 +130,80,-2.0606176717825004,0.20283826933053595 +130,85,-2.0632098711166615,0.21524499257106991 +130,90,-2.065944891694728,0.22760213674231075 +130,95,-2.0688202921356553,0.23990737234432272 +130,100,-2.071833553748287,0.25215843450953274 +140,5,-1.9663150552851223,0.012064282095702343 +140,10,-1.9663581630062117,0.023602020116314994 +140,15,-1.9666877420725035,0.035501307901280664 +140,20,-1.9671638942395475,0.047397832780007775 +140,25,-1.9677825585034203,0.059282613006055578 +140,30,-1.9685429011139168,0.071153213765033446 +140,35,-1.9694440708356336,0.08300733423818521 +140,40,-1.9704851199237612,0.094842690871237312 +140,45,-1.971671933745502,0.10666620015246532 +140,50,-1.9729901781845367,0.11845723149889445 +140,55,-1.9744446549738035,0.13022262354065173 +140,60,-1.9760420387734412,0.14196858554850458 +140,65,-1.9777658700593652,0.15367659306040821 +140,70,-1.9796297418691484,0.16536017301291406 +140,75,-1.9816246309315027,0.17700947543099071 +140,80,-1.9837407876445992,0.18861532870722258 +140,85,-1.985992034052237,0.20018987434868515 +140,90,-1.9883611271203958,0.2117174674136863 +140,95,-1.9908617051381488,0.22320957870330829 +140,100,-1.9934763027019335,0.23465115023503669 +150,5,-1.897302311091664,0.011261961173875431 +150,10,-1.89733349571538,0.022027898731513163 +150,15,-1.897620722659518,0.033136940018863283 +150,20,-1.8980361190775124,0.044244341272247495 +150,25,-1.8985713305862166,0.055330107185332093 +150,30,-1.89923416827427,0.066416347357108579 +150,35,-1.9000203492602104,0.077489111825670073 +150,40,-1.9009289603117703,0.088546358324402205 +150,45,-1.9019591555636317,0.099586262568866102 +150,50,-1.9031100256975588,0.11060701410186413 +150,55,-1.9043805956020643,0.12160681433182449 +150,60,-1.9057779238542103,0.1325927985299751 +150,65,-1.907285201914043,0.14354535665411727 +150,70,-1.9089086242317785,0.15447150190347123 +150,75,-1.9106471792077309,0.16536968941534072 +150,80,-1.9125081201420047,0.17624607267832673 +150,85,-1.9144734365095821,0.18708336657259575 +150,90,-1.9165496511876061,0.19788748712515611 +150,95,-1.918735533622578,0.2086569903569585 +150,100,-1.9210381989567196,0.21939754166480638 +160,5,-1.8327422768059267,0.010553578255956486 +160,10,-1.832769469985211,0.02065540868841316 +160,15,-1.8330225935248718,0.031072875702550483 +160,20,-1.8333847408599762,0.041476198636666996 +160,25,-1.8338595053146913,0.051884759766405983 +160,30,-1.8344380385313765,0.06227129228161913 +160,35,-1.835129933486264,0.072659047083505957 +160,40,-1.8359300436786026,0.083033943048019268 +160,45,-1.8368375009359164,0.093394286280303385 +160,50,-1.8378515525359091,0.10373860611860407 +160,55,-1.8389714038436349,0.11406543938537293 +160,60,-1.8401962144726567,0.12437332793832778 +160,65,-1.8415250986377703,0.13466082065429377 +160,70,-1.842957125648583,0.14492647557140123 +160,75,-1.8444913204485691,0.1551688620856399 +160,80,-1.8461266642063134,0.16538656318458234 +160,85,-1.8478620949714444,0.17557817769786527 +160,90,-1.8496965084097616,0.18574232254015341 +160,95,-1.851628758632473,0.19587763492001872 +160,100,-1.853657659133436,0.2059827744875474 +170,5,-1.7721035707341664,0.0099339702581041304 +170,10,-1.772123447406921,0.019441698584038884 +170,15,-1.7723479737346421,0.029248807179398616 +170,20,-1.7726689744470712,0.039041632745867284 +170,25,-1.7730903227726775,0.04884151181513785 +170,30,-1.773603297287018,0.058620343652738348 +170,35,-1.7742174814703127,0.068402576476125812 +170,40,-1.7749209477842895,0.078161949602553293 +170,45,-1.7757261103478215,0.087921387124375611 +170,50,-1.7766263342099524,0.097667385945067658 +170,55,-1.7776207490367368,0.10739853246395278 +170,60,-1.7787001237638955,0.11710344599430637 +170,65,-1.7798804046053687,0.12680157528331432 +170,70,-1.7811529606539616,0.13648143837613977 +170,75,-1.7825167593100277,0.14614164108582389 +170,80,-1.7839709629839098,0.15578100623913108 +170,85,-1.785514708900277,0.16539836858913512 +170,90,-1.7871377036737814,0.17498393592757619 +170,95,-1.7888576098436124,0.18455386895400949 +170,100,-1.7906645468888673,0.19409855608993526 +180,5,-1.7149333200463788,0.0093834604903015543 +180,10,-1.714947146680198,0.018363305685777726 +180,15,-1.7151477399222024,0.027627795502234091 +180,20,-1.7154342766851776,0.036877739127267085 +180,25,-1.715806064930882,0.046122112481924916 +180,30,-1.7162686978462127,0.055374137829866901 +180,35,-1.7168115272103817,0.06460459447985685 +180,40,-1.7174459119899628,0.073839189915631431 +180,45,-1.7181583418243784,0.083050985630200289 +180,50,-1.718962748088,0.092263890832486165 +180,55,-1.7198517586488125,0.10146418229619764 +180,60,-1.720815820063894,0.11063981662575079 +180,65,-1.721871474649254,0.11981193905570404 +180,70,-1.72300994302122,0.12896844590973222 +180,75,-1.7242208575130318,0.13809821301853228 +180,80,-1.7255222570041189,0.14722038873242729 +180,85,-1.7269044429567926,0.15632397563466741 +180,90,-1.728366427234425,0.16540778754688842 +180,95,-1.729897683698841,0.17446191573051925 +180,100,-1.7315168461441701,0.18350342493298785 +190,5,-1.6608521013633963,0.0088855678544894137 +190,10,-1.660865105887259,0.017402143048838619 +190,15,-1.6610428861695785,0.026165291549624513 +190,20,-1.6613032935305478,0.034944765867908095 +190,25,-1.661637554730496,0.043704298245471923 +190,30,-1.662048108434446,0.052457998036064296 +190,35,-1.6625414478584084,0.061219556766851167 +190,40,-1.6631052997782096,0.069959531757659621 +190,45,-1.6637524872566885,0.078704074417044995 +190,50,-1.6644682711833296,0.08742627479249801 +190,55,-1.6652677054255198,0.096150252454875781 +190,60,-1.6661339510426652,0.10485092122554752 +190,65,-1.6670838341792016,0.11355080381954412 +190,70,-1.6680988352917587,0.12222623857504331 +190,75,-1.669197174511719,0.13089852161467169 +190,80,-1.6703691160404142,0.13955559332558407 +190,85,-1.6716038799442121,0.14818654076786961 +190,90,-1.6729206519603612,0.15681064820152293 +190,95,-1.6742989063812697,0.16540741384547938 +190,100,-1.6757583113154035,0.17399538967995778 +200,5,-1.6095485278728567,0.0084400908560749149 +200,10,-1.6095581879068661,0.016527346596529029 +200,15,-1.6097211520618344,0.024869615368962216 +200,20,-1.6099534294890685,0.033196211413939303 +200,25,-1.6102548144834061,0.041518664947093428 +200,30,-1.6106309606797002,0.049851647341998012 +200,35,-1.6110713469770228,0.058164028588722855 +200,40,-1.6115801987188463,0.066469698400755603 +200,45,-1.6121654097795344,0.07478210571560083 +200,50,-1.612811911325052,0.083072763631268726 +200,55,-1.6135260517289796,0.091354228107204241 +200,60,-1.6143174556523368,0.099639085840018293 +200,65,-1.6151674213700973,0.10790070194076611 +200,70,-1.6160943487417436,0.11616300364398092 +200,75,-1.617078392104489,0.12440136628156705 +200,80,-1.6181390554809851,0.13263816461433012 +200,85,-1.6192554800764065,0.14085016651199758 +200,90,-1.620447958642036,0.14905853629278695 +200,95,-1.6217056735353534,0.15725148491929103 +200,100,-1.623017405765667,0.16541841536907304 +210,5,-1.5607493866741615,0.008037023259950064 +210,10,-1.5607570627982286,0.01574365781430314 +210,15,-1.5609053017155476,0.023690417252927157 +210,20,-1.561116250190622,0.031621141090883903 +210,25,-1.5613899002606375,0.039548257822452436 +210,30,-1.5617261655939303,0.047471214625868272 +210,35,-1.5621315367082498,0.055404904787411176 +210,40,-1.5625937623773136,0.063317771013327584 +210,45,-1.5631179329023541,0.071224075895190558 +210,50,-1.5637126156379375,0.079137513211447089 +210,55,-1.564361470729445,0.087029476964777197 +210,60,-1.5650715243756883,0.094912748436260005 +210,65,-1.565852840156174,0.10280001988090207 +210,70,-1.566685922583619,0.11066478741100579 +210,75,-1.5675898443736795,0.11853095471492947 +210,80,-1.568544368069497,0.12637425276153988 +210,85,-1.5695584668942957,0.13420541796043156 +210,90,-1.5706435024625187,0.14203572510718157 +210,95,-1.5717770453392785,0.1498416588603311 +210,100,-1.5729805559291,0.1576445759107484 +220,5,-1.5142196860209134,0.007667926728835677 +220,10,-1.5142285266806197,0.015041978520069707 +220,15,-1.5143619222295572,0.022611825356779962 +220,20,-1.5145538779665892,0.03018230834837568 +220,25,-1.5148030449909682,0.037749856794518463 +220,30,-1.5151092952029508,0.045313779999602177 +220,35,-1.5154793071828572,0.052890113124818713 +220,40,-1.5159005573970172,0.060445302512997387 +220,45,-1.516378298380376,0.067994730910696591 +220,50,-1.516921254325645,0.075552881089272689 +220,55,-1.5175129025074534,0.083089870790383505 +220,60,-1.5181604181580683,0.090619253378064327 +220,65,-1.5188739310236827,0.098154201712714564 +220,70,-1.51963394648111,0.10566751155868614 +220,75,-1.5204490586954262,0.11317139231063361 +220,80,-1.521330399751371,0.12067811208175611 +220,85,-1.522256306655723,0.12816236101148615 +220,90,-1.5232363935818698,0.1356353977609136 +220,95,-1.5242824989957564,0.14310888714395933 +220,100,-1.5253713955725259,0.15055882070547261 +230,5,-1.469765969931937,0.0073408395231435207 +230,10,-1.4697673251064194,0.014378588108714953 +230,15,-1.4698914523801354,0.021637529203245055 +230,20,-1.4700676318757224,0.028879558365641947 +230,25,-1.4702961070822163,0.036118786592050499 +230,30,-1.4705768310455662,0.04335484596986542 +230,35,-1.4709097032147707,0.050587176429873433 +230,40,-1.4712946058814362,0.057815217600863111 +230,45,-1.47173976076298,0.065054786874293641 +230,50,-1.472229500870901,0.072273061586618406 +230,55,-1.472770622550039,0.079485164587369303 +230,60,-1.473372998565021,0.086705331078865994 +230,65,-1.4740178255757292,0.093904452680785941 +230,70,-1.4747134303998612,0.10109580574899379 +230,75,-1.4754598065543154,0.10827907673604587 +230,80,-1.4762683522947042,0.11546726330118055 +230,85,-1.4771165967964628,0.12263338349292209 +230,90,-1.4780146005995274,0.12978961851382004 +230,95,-1.4789745784586952,0.13694829488618115 +230,100,-1.479972745261547,0.14408431032236349 +240,5,-1.4272008283303053,0.0070352093058593185 +240,10,-1.4272004316289515,0.013782375102798962 +240,15,-1.4273147604965941,0.020740254898547091 +240,20,-1.4274767647941167,0.02768089976630881 +240,25,-1.4276868066383765,0.034619057513087199 +240,30,-1.427944852557625,0.04155442669914413 +240,35,-1.428250817663256,0.048486514025046709 +240,40,-1.4286046024447023,0.05541482555289956 +240,45,-1.42900609393689,0.062338869520218575 +240,50,-1.4294642679998621,0.069274700222473673 +240,55,-1.4299619627360096,0.076189242741017835 +240,60,-1.4305067341892093,0.083097837463752877 +240,65,-1.4310986256552756,0.090000242365955663 +240,70,-1.431748601468954,0.096910783317138607 +240,75,-1.4324352947344563,0.10379995429481324 +240,80,-1.4331682959999827,0.11068129404820158 +240,85,-1.433959437377001,0.11756793235028057 +240,90,-1.4347858945775391,0.12443327699635778 +240,95,-1.4356579833840661,0.13128942877859601 +240,100,-1.4365756992797458,0.13813615889312611 +250,5,-1.3863681624422028,0.0067451577419163928 +250,10,-1.3863731831570758,0.013248308317743984 +250,15,-1.3864770966337165,0.019910852202565905 +250,20,-1.3866262888264982,0.026573934763031624 +250,25,-1.386819815751359,0.033235017189259926 +250,30,-1.3870575997795955,0.039893630068160275 +250,35,-1.3873395673839808,0.046549333815429077 +250,40,-1.3876656337980875,0.053201690878722133 +250,45,-1.388043973547988,0.059867278604920235 +250,50,-1.3884591008827418,0.066512093753060053 +250,55,-1.3889178205453327,0.073152055243879147 +250,60,-1.389420183989388,0.079786958957345847 +250,65,-1.389966054241949,0.086416381666838821 +250,70,-1.390566404505325,0.093054990965711515 +250,75,-1.3911999087922355,0.099672733789506598 +250,80,-1.3918761975678287,0.10628351595454148 +250,85,-1.3925953214186182,0.11288715185019187 +250,90,-1.3933694302548396,0.11949692430119735 +250,95,-1.3941746456580857,0.12608563929114353 +250,100,-1.3950218398622756,0.13266576674354125 +260,5,-1.3471416265125875,0.0064832886321787861 +260,10,-1.3471460468481258,0.012734283829186739 +260,15,-1.3472417635591676,0.019140561486953585 +260,20,-1.3473793934702796,0.02554759502618318 +260,25,-1.3475580234096693,0.031952845344516825 +260,30,-1.3477775840712343,0.038355889651755418 +260,35,-1.3480447272484795,0.044774594601331597 +260,40,-1.3483471259416924,0.05117246040265945 +260,45,-1.34869009049823,0.057566749893127635 +260,50,-1.3490736729670532,0.063957299535439813 +260,55,-1.3494977745471284,0.070343727956616919 +260,60,-1.3499622840548777,0.07672565248996524 +260,65,-1.3504777835909199,0.083118518987247467 +260,70,-1.351023835131547,0.08949082146478958 +260,75,-1.3516096836282683,0.095857276720963072 +260,80,-1.3522353999257213,0.1022177348461025 +260,85,-1.3529008312750352,0.10857182869648033 +260,90,-1.353618426289952,0.11493346521266237 +260,95,-1.354363796844729,0.12127432487023425 +260,100,-1.3551481065102982,0.12760750231547452 +270,5,-1.3093996603897158,0.0062465094162266633 +270,10,-1.3094013052927873,0.012273206741290879 +270,15,-1.3094906795203294,0.018442710555378092 +270,20,-1.3096188558863078,0.024612707285953876 +270,25,-1.3097850550020969,0.030781115546076349 +270,30,-1.3099892192346778,0.036947563291288843 +270,35,-1.3102312942886358,0.043111701026417336 +270,40,-1.310511217564946,0.049273180650763658 +270,45,-1.3108289180224164,0.055431655311244339 +270,50,-1.311184316237472,0.061586779533222551 +270,55,-1.3115870962943499,0.067755508636026626 +270,60,-1.312018763804362,0.073903391179187802 +270,65,-1.3124876385344832,0.080046688634698118 +270,70,-1.3129938087288855,0.086185287255684098 +270,75,-1.3135371582511384,0.092318853705475504 +270,80,-1.3141294665313557,0.098462024488496086 +270,85,-1.3147478112629107,0.10458507858458019 +270,90,-1.3154026999289619,0.11070189736297698 +270,95,-1.316094209388026,0.11681237018569803 +270,100,-1.316822185840549,0.12291617513378181 +280,5,-1.2730230281327064,0.0060146386917671072 +280,10,-1.2730278110553672,0.011823418868338292 +280,15,-1.2731101796240252,0.017772347403456817 +280,20,-1.2732286882509454,0.023722116237187844 +280,25,-1.2733874494560538,0.029690131314159686 +280,30,-1.2735777955061611,0.035637035128264702 +280,35,-1.2738033063993666,0.041581655962761969 +280,40,-1.2740640245155659,0.047523896567909729 +280,45,-1.2743598901735178,0.053463448178197981 +280,50,-1.274690834612554,0.059400000536266144 +280,55,-1.2750567818319671,0.065333244602690188 +280,60,-1.2754576486826963,0.071262872701939678 +280,65,-1.2758933449330208,0.077188578631289639 +280,70,-1.2763753709414027,0.0831268095404816 +280,75,-1.2768815368964124,0.089044301390998531 +280,80,-1.2774219909568523,0.094956747782237852 +280,85,-1.2779968423774188,0.1008640784504046 +280,90,-1.2786059711507491,0.10676599964813641 +280,95,-1.2792622285256645,0.11267677631524747 +280,100,-1.2799404960282,0.11856757820549223 +290,5,-1.2379259188712755,0.005802607449636378 +290,10,-1.2379325915102455,0.011421038254476663 +290,15,-1.2380096927773256,0.017165193882786318 +290,20,-1.238120408116605,0.0229099793458639 +290,25,-1.238264093232071,0.028653473381237207 +290,30,-1.2384407026031823,0.034395371036472458 +290,35,-1.2386501951135094,0.040135389909699927 +290,40,-1.2389002006742713,0.045892622286898617 +290,45,-1.2391764859433345,0.051628455062671524 +290,50,-1.2394853404402855,0.057361370507351156 +290,55,-1.2398268487434307,0.063091307367740865 +290,60,-1.2402009411651107,0.06881799113205915 +290,65,-1.2406075391691078,0.074541145579972892 +290,70,-1.2410465580521095,0.080260495770153734 +290,75,-1.2415179070492208,0.085975768174110026 +290,80,-1.2420340393189087,0.091703098120876347 +290,85,-1.2425708250651284,0.097409965199371812 +290,90,-1.2431393979717134,0.1031117296308758 +290,95,-1.243739877566023,0.1088083508831222 +290,100,-1.2443721483118828,0.11449956724901737 +300,5,-1.2040210875555488,0.0056079615281474232 +300,10,-1.2040273854859256,0.011043422901020911 +300,15,-1.2040995716782563,0.016596312784424132 +300,20,-1.2042031444863863,0.022149754177817924 +300,25,-1.2043375287507634,0.027702027731987513 +300,30,-1.204502684859832,0.033252858972622958 +300,35,-1.204698576818507,0.038801992689074791 +300,40,-1.2049251631914892,0.044349174598915311 +300,45,-1.2051908955844497,0.049913482066489323 +300,50,-1.2054798875813173,0.055456429192126115 +300,55,-1.2057992544474394,0.060996473464820775 +300,60,-1.206149092869731,0.06653357618095887 +300,65,-1.206529336834986,0.072067490186877289 +300,70,-1.2069399122530193,0.077597966586731071 +300,75,-1.2073807396723837,0.083124757635763519 +300,80,-1.2078517343771995,0.088647616858093234 +300,85,-1.2083656619139216,0.094182470197483492 +300,90,-1.2088977529286826,0.099697293859313862 +300,95,-1.2094594993492798,0.1052072506428713 +300,100,-1.2100510223135363,0.11071231620470159 +310,5,-1.1712302871461564,0.0054291467450721014 +310,10,-1.171234124318976,0.010688228944137778 +310,15,-1.171301711235329,0.01606206867827498 +310,20,-1.1713987140755486,0.021436488374870055 +310,25,-1.1715245760898074,0.026809847971468705 +310,30,-1.1716792617521818,0.032181897862203872 +310,35,-1.1718627393797107,0.037552406635972937 +310,40,-1.1720825194732598,0.042940620248732984 +310,45,-1.1723246039289388,0.048307742425959296 +310,50,-1.1725952212912116,0.053672458285886501 +310,55,-1.172894454279677,0.059034734563909889 +310,60,-1.1732222493452245,0.064394345739741024 +310,65,-1.1735785460580692,0.069751064824153899 +310,70,-1.173963279233286,0.075104665748761457 +310,75,-1.1743763790039148,0.080454923462632014 +310,80,-1.1748177708649223,0.085801613996378145 +310,85,-1.1752873757189664,0.091144514524802017 +310,90,-1.1757985229187289,0.096499745589131242 +310,95,-1.1763253269858487,0.10183497583473619 +310,100,-1.1768798511969272,0.10716555077796745 +320,5,-1.1394831130133767,0.005265438099807669 +320,10,-1.1394821788982243,0.010353253283011191 +320,15,-1.1395454320359166,0.015559102529251363 +320,20,-1.1396363632460056,0.020765669382376901 +320,25,-1.1397543822095257,0.025971270598935215 +320,30,-1.139899455825398,0.031175676439316333 +320,35,-1.1400783155977228,0.036398950376556292 +320,40,-1.1402785572421272,0.041600696036742137 +320,45,-1.140505639559799,0.046800445358280596 +320,50,-1.140759637752833,0.051998181790114117 +320,55,-1.141040508674834,0.057193699338093748 +320,60,-1.1413482031611364,0.062386790578101259 +320,65,-1.1416826678162981,0.067577248821113003 +320,70,-1.1420438450720796,0.072764868195973692 +320,75,-1.142431673222099,0.077949443705052579 +320,80,-1.142846086458086,0.083130771278760854 +320,85,-1.1432997588958245,0.08832496929769787 +320,90,-1.1437681311891,0.09349972676732278 +320,95,-1.1442626650615884,0.098670448499628138 +320,100,-1.144783480983329,0.10383712952256713 +330,5,-1.1087031505680993,0.0050955730088372451 +330,10,-1.1087089146046605,0.010057174564415659 +330,15,-1.108769487686832,0.015106032274090655 +330,20,-1.1088558690175792,0.020154988708107797 +330,25,-1.1089677184810467,0.025203071545258044 +330,30,-1.1091050114169319,0.030250081301890674 +330,35,-1.1092677231268562,0.035295826014027094 +330,40,-1.109455825123639,0.040340114198255526 +330,45,-1.1096692851032373,0.045382754833567698 +330,50,-1.1099080669641466,0.05042355741101693 +330,55,-1.1101721308291912,0.055462331983556198 +330,60,-1.1104614330691147,0.060498889215328554 +330,65,-1.1107759263279335,0.065533040430377859 +330,70,-1.1111155595500175,0.070564597660756484 +330,75,-1.1114802780088637,0.075593373694008606 +330,80,-1.111882419825457,0.080636012577937802 +330,85,-1.1122981417038362,0.085659180158599177 +330,90,-1.1127385742508429,0.09067883806099504 +330,95,-1.113203837492181,0.095694988737869136 +330,100,-1.1136938618277783,0.10070745163149641 +340,5,-1.0788441163884086,0.0049384329489125583 +340,10,-1.078852941904078,0.0097586154415162159 +340,15,-1.078909839378277,0.014659009113429764 +340,20,-1.0789910331147423,0.019559533713269992 +340,25,-1.079096220996494,0.024459254074642448 +340,30,-1.0792253807466026,0.029357986963219326 +340,35,-1.079378490326266,0.034255556822440761 +340,40,-1.0795555243382857,0.039151788533423562 +340,45,-1.0797564539947917,0.044046507384043698 +340,50,-1.0799812471334709,0.048939539111479816 +340,55,-1.0802298682359597,0.053830709945108822 +340,60,-1.0805022784477547,0.058719846648935967 +340,65,-1.0807984355996092,0.063606776563529865 +340,70,-1.0811298262598286,0.068509049886877199 +340,75,-1.0814743769300568,0.073391525828389939 +340,80,-1.081842358148347,0.078271120264095911 +340,85,-1.082233885161432,0.083147840097526377 +340,90,-1.0826489021547414,0.088021518033974469 +340,95,-1.0830873478112313,0.092891985339976418 +340,100,-1.083549157653099,0.09775907408826251 +350,5,-1.0498626896001155,0.0048097410884781876 +350,10,-1.049862612527033,0.0094751676860580364 +350,15,-1.0499158903743517,0.014235313290523891 +350,20,-1.0499922229865748,0.018995871512554292 +350,25,-1.0500912020544921,0.023755688003744935 +350,30,-1.0502128054157376,0.028514590817630456 +350,35,-1.0503570132968414,0.033272418961359539 +350,40,-1.050523802966073,0.038029011886831665 +350,45,-1.0507131486695342,0.04278420940879573 +350,50,-1.0509340271190242,0.047556949662859754 +350,55,-1.0511694724329825,0.052309266311920684 +350,60,-1.0514272496507253,0.057059567990483943 +350,65,-1.051707449771257,0.061807857163067553 +350,70,-1.0520100339773863,0.066553977399009465 +350,75,-1.0523349588999464,0.07129777114184653 +350,80,-1.052682178253512,0.076039081408414338 +350,85,-1.053051642879494,0.080777751843578854 +350,90,-1.0534433007703425,0.085513626755094427 +350,95,-1.0538570970945758,0.090246551147757592 +350,100,-1.054292974222871,0.09497637075709045 +360,5,-1.0216878949273833,0.0046721023340941898 +360,10,-1.0216905081111602,0.0092255863594007115 +360,15,-1.0217416564646415,0.013853986685234389 +360,20,-1.021814468689782,0.018482424386730596 +360,25,-1.0219086855183408,0.023110188006269759 +360,30,-1.0220242896407101,0.027737124956442587 +360,35,-1.0221612634381578,0.032363087242088293 +360,40,-1.0223195866031412,0.03698792717215918 +360,45,-1.0224992361261822,0.041611497357316271 +360,50,-1.0227001863079024,0.046233650742359036 +360,55,-1.022922408772395,0.050854240638651536 +360,60,-1.023165872481671,0.055473120756226943 +360,65,-1.0234305437511635,0.060090145235554587 +360,70,-1.0237163862662675,0.064705168678957564 +360,75,-1.0240233610999,0.069318046181669243 +360,80,-1.024351426731058,0.073928633362518564 +360,85,-1.024700539064356,0.078536786394234781 +360,90,-1.0250706514505203,0.083142362033361894 +360,95,-1.0254753919561366,0.087761670339156661 +360,100,-1.0258883032103612,0.092362196200564378 +370,5,-0.9942862978891883,0.0045436171742446966 +370,10,-0.9942889016792695,0.0089704491690861601 +370,15,-0.994336943036134,0.013473643267477945 +370,20,-0.994405532460217,0.017977016993528536 +370,25,-0.9944943872225083,0.02247976192788792 +370,30,-0.9946034906854828,0.026981735467721847 +370,35,-0.9947328269136941,0.031482801290719897 +370,40,-0.9948823775760868,0.035982823377855036 +370,45,-0.9950521219182263,0.04048166598479179 +370,50,-0.9952420367723693,0.044979193669739737 +370,55,-0.9954520965689205,0.049475271321598464 +370,60,-0.9956822733488182,0.053969764187814115 +370,65,-0.9959325367768306,0.058462537901930609 +370,70,-0.9962144110459803,0.062971361531391518 +370,75,-0.9965057597445084,0.067460746890252637 +370,80,-0.9968169461516501,0.071947879134468554 +370,85,-0.99714807537201,0.076432776471189137 +370,90,-0.997499107305176,0.080915308125583674 +370,95,-0.99786999789295,0.085395342239960856 +370,100,-0.9982607007971437,0.089872747490501087 +380,5,-0.9676165371152383,0.0044234444864928273 +380,10,-0.9676179926734804,0.0087253334085128052 +380,15,-0.9676657276332344,0.013130305155734438 +380,20,-0.9677313222311359,0.017515386438944347 +380,25,-0.9678161011344495,0.021899773371375525 +380,30,-0.9679200786731533,0.026283458518753251 +380,35,-0.9680432408893299,0.030666316755053585 +380,40,-0.9681855713227856,0.035048222404087927 +380,45,-0.9683470513308572,0.039429050013922544 +380,50,-0.968527660100751,0.043808674387057718 +380,55,-0.9687273746595126,0.048186970605288933 +380,60,-0.9689461698847421,0.052563814054298018 +380,65,-0.9691840185160714,0.0569390804480037 +380,70,-0.9694408911673938,0.061312645852663834 +380,75,-0.9697167563398321,0.06568438671072245 +380,80,-0.970011580435429,0.070054179864394314 +380,85,-0.9703253277715507,0.074421902578981763 +380,90,-0.9706579605959819,0.078787432565917581 +380,95,-0.9710094391027043,0.083150648005529321 +380,100,-0.9713797214483374,0.087511427569520531 +390,5,-0.9416406231483053,0.0043110409511529129 +390,10,-0.9416416922700073,0.0085144145603590644 +390,15,-0.9416850627724043,0.012786829387022127 +390,20,-0.9417469136952712,0.017059364557170886 +390,25,-0.9418270063166505,0.021331360682072295 +390,30,-0.9419253272244896,0.025602696760160332 +390,35,-0.9420418633797665,0.029873256344571573 +390,40,-0.9421765997956133,0.034142923217925308 +390,45,-0.9423295195197368,0.038411581377227354 +390,50,-0.9425006036420728,0.042679115055376353 +390,55,-0.9426898313033918,0.046945408742790476 +390,60,-0.9428971797045854,0.051210347208815551 +390,65,-0.9431226241166205,0.055473815522904514 +390,70,-0.943366137891152,0.059735699075561373 +390,75,-0.9436395879399869,0.064013096894891389 +390,80,-0.9439201151936666,0.068271917101641905 +390,85,-0.944218493874871,0.072528698284441556 +390,90,-0.9445348182339943,0.076783457231048499 +390,95,-0.9448690537247599,0.081036082119786523 +390,100,-0.9452211626552548,0.085286460314776893 +400,5,-0.916312151338508,0.0041872885030901259 +400,10,-0.9163229164145299,0.0083109420996467214 +400,15,-0.9163647344767673,0.012476893816076697 +400,20,-0.9164239963760864,0.016642695136159191 +400,25,-0.9165005987512965,0.020808003831089199 +400,30,-0.9165945309259359,0.024972710446012285 +400,35,-0.9167057811427652,0.029136706998770648 +400,40,-0.9168343358670358,0.033299885675539667 +400,45,-0.9169801797874966,0.03746213884235701 +400,50,-0.9171432958233321,0.041623359064431736 +400,55,-0.9173236651317229,0.045783439125334224 +400,60,-0.9175212671159781,0.049942272046010081 +400,65,-0.9177360794342296,0.054099751103612162 +400,70,-0.917968078008682,0.058255769850145724 +400,75,-0.9182172370354058,0.062410222130922309 +400,80,-0.9184835289946679,0.066563002102818097 +400,85,-0.9187669246617844,0.070714004252333665 +400,90,-0.9190673931184886,0.074863123413451305 +400,95,-0.9193849017648029,0.079010254785287934 +400,100,-0.9197194163314015,0.083155293949540687 +410,5,-0.8916199086990183,0.0040868733151878259 +410,10,-0.8916280016579581,0.0081001228239664744 +410,15,-0.8916672818004613,0.012164300469984594 +410,20,-0.8917232165101121,0.016228493017525047 +410,25,-0.8917956574525401,0.020292216069994651 +410,30,-0.8918845939831942,0.02435536628972243 +410,35,-0.8919900152813683,0.028417843444242762 +410,40,-0.8921119089252344,0.032479547481473386 +410,45,-0.8922502608822802,0.036540378522816469 +410,50,-0.892405055515215,0.040600236879890873 +410,55,-0.8925762755885481,0.044659023071297793 +410,60,-0.8927639022756775,0.048716637839210007 +410,65,-0.8929679151664826,0.052772982165777763 +410,70,-0.8931996532886888,0.056845159691075238 +410,75,-0.8934373277964482,0.060899088709249642 +410,80,-0.8936912136564894,0.064951361263729579 +410,85,-0.8939613905333731,0.06900198900690302 +410,90,-0.8942478313739092,0.073050874891222584 +410,95,-0.8945505066734943,0.077097921298621766 +410,100,-0.8948693854018973,0.081143030935463156 +420,5,-0.8675236602405386,0.0039927192217704428 +420,10,-0.8675297443003293,0.0079160892791855769 +420,15,-0.8675676332322847,0.011883683349576301 +420,20,-0.8676213632042502,0.015851176833406092 +420,25,-0.8676908228428573,0.019818240866025034 +420,30,-0.8677760030634878,0.023784780746851135 +420,35,-0.8678768940395152,0.027750703184326514 +420,40,-0.8679934844821813,0.031715915025487422 +420,45,-0.8681257616403534,0.035680323263677864 +420,50,-0.8682737113059362,0.039643835053583813 +420,55,-0.8684373178197604,0.043606357726171649 +420,60,-0.8686165640779006,0.047567798803480763 +420,65,-0.8688114315384182,0.051528066013266462 +420,70,-0.8690219002285237,0.055487067303490269 +420,75,-0.8692479487521487,0.059444710856655002 +420,80,-0.8694895542979242,0.063400905103982177 +420,85,-0.869746692647555,0.067355558739430318 +420,90,-0.8700193381845843,0.071308580733552465 +420,95,-0.8703074639035387,0.075259880347191777 +420,100,-0.870611041419447,0.079209367145014808 +430,5,-0.8439858312600024,0.0038890352035318857 +430,10,-0.8439969023275486,0.0077216125624620562 +430,15,-0.844032451411053,0.011596808992179712 +430,20,-0.8440831168382961,0.015472015409189608 +430,25,-0.8441487897126212,0.019346806237579187 +430,30,-0.8442294610883766,0.023221091737638457 +430,35,-0.8443251218560651,0.02709478503488804 +430,40,-0.8444428711840415,0.030985397434889435 +430,45,-0.8445694656889747,0.034857924101241021 +430,50,-0.8447109609773352,0.038729547258287887 +430,55,-0.8448673971393228,0.042600255890140014 +430,60,-0.8450387590018167,0.046469964086564515 +430,65,-0.845225029717006,0.050338585716990188 +430,70,-0.8454261911315114,0.054206034837271551 +430,75,-0.8456422237954013,0.058072225704975666 +430,80,-0.8458731069691964,0.061937072792200905 +430,85,-0.8461188186311908,0.065800490798257436 +430,90,-0.8463793354851018,0.069662394662223376 +430,95,-0.846654632968034,0.073522699575376438 +430,100,-0.8469446852587578,0.077381320993500743 +440,5,-0.8209977408936884,0.0038036364839039716 +440,10,-0.8210068805259365,0.0075551030785175411 +440,15,-0.8210412774405474,0.011342395368754987 +440,20,-0.8210900912521119,0.015129588444293945 +440,25,-0.8211532380291783,0.018916400317974879 +440,30,-0.8212307100534331,0.022702748610177809 +440,35,-0.8213224989819116,0.026488552199540265 +440,40,-0.8214285952575494,0.030273730085149272 +440,45,-0.8215489881084912,0.034058201391435582 +440,50,-0.821683665552371,0.037841885379930329 +440,55,-0.8218326144009708,0.041624701460936074 +440,60,-0.8219958202652131,0.045406569205064071 +440,65,-0.8221732675604868,0.049187408354635066 +440,70,-0.8223649395123013,0.05296713883494137 +440,75,-0.8225708181622635,0.056745680765368976 +440,80,-0.8227908843743762,0.060522954470377685 +440,85,-0.8230372359082769,0.064313883250267476 +440,90,-0.8232864547996069,0.068088831659943588 +440,95,-0.8235497175498233,0.071862211730668979 +440,100,-0.8238270839414317,0.075634025102878033 +450,5,-0.7985276589060774,0.0037241586026077389 +450,10,-0.7985334382166958,0.0073937772711575494 +450,15,-0.7985666723087836,0.011097008632214111 +450,20,-0.7986136787127932,0.014800095719147475 +450,25,-0.7986743884406885,0.018502833556816686 +450,30,-0.798748794663797,0.022205145666020016 +450,35,-0.7988368897538984,0.025906956165876051 +450,40,-0.7989386649710944,0.029608189272389906 +450,45,-0.7990541104658544,0.033308769306960452 +450,50,-0.799183215282984,0.037008620706956839 +450,55,-0.7993259673658893,0.040707668036195188 +450,60,-0.7994823535611264,0.044405835995303546 +450,65,-0.7996523596232284,0.048103049431974333 +450,70,-0.7998359702198107,0.051799233351102765 +450,75,-0.8000331689369445,0.05549431292481119 +450,80,-0.8002439382847975,0.059188213502358783 +450,85,-0.8004682597035347,0.06288086061993696 +450,90,-0.8007061135694751,0.066572180010350923 +450,95,-0.8009574792014952,0.070262097612588309 +450,100,-0.8012223348676797,0.073950539581275967 +460,5,-0.7765422987009089,0.0036338001177373502 +460,10,-0.7765523502459758,0.0072227311386677323 +460,15,-0.7765835016193907,0.010845329511316717 +460,20,-0.7766278448571493,0.014467876681815265 +460,25,-0.776685302557508,0.018090077677304233 +460,30,-0.7767558678613675,0.021711859931375397 +460,35,-0.7768455710918984,0.025348778506581033 +460,40,-0.7769432686419696,0.028969749899080122 +460,45,-0.7770540190213799,0.032590071359674774 +460,50,-0.7771778437357031,0.036209717279332955 +460,55,-0.7773147319195332,0.039828617098924254 +460,60,-0.7774646715571629,0.043446700214512336 +460,65,-0.7776276496321871,0.047063896146638418 +460,70,-0.777803652132718,0.050680134550190555 +460,75,-0.7779926640561774,0.054295345223533791 +460,80,-0.7781946694143056,0.057909458117550293 +460,85,-0.7784096512383857,0.061522403344593433 +460,90,-0.7786375915846766,0.065134111187356611 +460,95,-0.7788784715400495,0.068744512107658515 +460,100,-0.7791322712278228,0.072353536755146525 +470,5,-0.7550389497862652,0.0035613112464256522 +470,10,-0.7550457870679118,0.0070766247789593416 +470,15,-0.7550760128541893,0.010622259588517554 +470,20,-0.7551188670022814,0.014167781193313394 +470,25,-0.7551742834143553,0.017712984938328912 +470,30,-0.7552422560009858,0.021257803545425003 +470,35,-0.7553227781085887,0.024802170469701821 +470,40,-0.7554158421499193,0.02834601926025241 +470,45,-0.7555214396047089,0.031889283565283928 +470,50,-0.7556395610228827,0.035431897140372239 +470,55,-0.755770196028031,0.038973793856611358 +470,60,-0.7559133333211225,0.042514907708638479 +470,65,-0.7560689606844523,0.046055172822532894 +470,70,-0.7562370649858283,0.049594523463587357 +470,75,-0.756417632182992,0.053132894043951211 +470,80,-0.7566215901776167,0.056683440714841847 +470,85,-0.7568278164127366,0.060220083852973651 +470,90,-0.7570464118904524,0.063755522025572567 +470,95,-0.7572774105042243,0.067289739516254388 +470,100,-0.7575207943042109,0.070822671340428967 +480,5,-0.733980321115762,0.0034797321168366533 +480,10,-0.7339919008437588,0.006934573457401165 +480,15,-0.7340212180612957,0.010406455049179241 +480,20,-0.7340626058650097,0.013878157941498522 +480,25,-0.7341160380241455,0.017349569214964757 +480,30,-0.7341815091703331,0.020820626132285223 +480,35,-0.734259013163244,0.024291266178437229 +480,40,-0.7343485430038837,0.027761426914453633 +480,45,-0.7344500908371526,0.031231045984440327 +480,50,-0.7345636479549871,0.034700061122991982 +480,55,-0.7346892047997055,0.038168410162498091 +480,60,-0.734826750967556,0.041636031040337133 +480,65,-0.7349762752124622,0.045102861805958586 +480,70,-0.7351377654499672,0.048568840627853001 +480,75,-0.7353112087613692,0.052033905800410701 +480,80,-0.7354965913980495,0.055497995750670021 +480,85,-0.735693898785986,0.058961049044956512 +480,90,-0.7359031155304506,0.062423004395414906 +480,95,-0.7361242254208844,0.06588380066643601 +480,100,-0.7363572114359459,0.069343376880981258 +490,5,-0.7133640763590208,0.0034134698595698885 +490,10,-0.713372098488776,0.0067967949319672569 +490,15,-0.713400465329369,0.010197864686808757 +490,20,-0.7134404137298724,0.013598758796543021 +490,25,-0.713491920308896,0.016999385536017944 +490,30,-0.713554980170263,0.02039968597271578 +490,35,-0.713629587671455,0.023799601292507203 +490,40,-0.7137157363801179,0.027199072742352535 +490,45,-0.713813419076788,0.030598041636971697 +490,50,-0.7139226277579072,0.03399644936555709 +490,55,-0.7140433536390053,0.03739423739839224 +490,60,-0.7141755871580501,0.040791347293376766 +490,65,-0.71431931797896,0.044187720702458612 +490,70,-0.7144745349952734,0.047583299377975098 +490,75,-0.7146412263339759,0.050978025178904887 +490,80,-0.7148193793594758,0.054371840077033141 +490,85,-0.7150089806777266,0.057764686163033083 +490,90,-0.715210016140489,0.061156505652467066 +490,95,-0.7154224708497299,0.064547240891711655 +490,100,-0.7156463291621485,0.067936834363810789 +500,5,-0.6931567642092097,0.003338923050947466 +500,10,-0.693167530743147,0.0066535187903594747 +500,15,-0.6931941822313998,0.0099864812526377963 +500,20,-0.6932319649795574,0.013319297465686717 +500,25,-0.6932808476880918,0.016651837554692957 +500,30,-0.6933408253820703,0.019984045939219472 +500,35,-0.6934118925170913,0.023315867434718276 +500,40,-0.6934940428175114,0.026647246946221573 +500,45,-0.6935872692775532,0.02997812947279305 +500,50,-0.6936989396265383,0.033319690055084721 +500,55,-0.6938150881376377,0.036649743896545656 +500,60,-0.6939422720920503,0.039979145022424882 +500,65,-0.6940805012776042,0.043307858564822541 +500,70,-0.6942297655516642,0.046635829624110614 +500,75,-0.6943900540166589,0.049963003342512941 +500,80,-0.6945613550720934,0.05328932495719834 +500,85,-0.6947436564183619,0.056614739806104944 +500,90,-0.6949369450605342,0.059939193333592621 +500,95,-0.6951412073122358,0.063262631096052097 +500,100,-0.6953564287996141,0.066584998767477394 diff --git a/pokemongo_bot/human_behaviour.py b/pokemongo_bot/human_behaviour.py index 2a8d2d5e9f..bedd73c0f1 100644 --- a/pokemongo_bot/human_behaviour.py +++ b/pokemongo_bot/human_behaviour.py @@ -1,16 +1,76 @@ # -*- coding: utf-8 -*- import time -from random import random, uniform +from math import exp +from random import random, gauss, uniform +from collections import defaultdict +from numpy.random import lognormal +def lognormal_model(path='data/lognormal.model'): + ''' + lazy initialization of model + ''' + if not hasattr(lognormal_model, 'delay_range2mu_sigma'): + lognormal_model.delay_range2mu_sigma = defaultdict(dict) + for line in open(path): + delay, delay_range, mu_, sigma = line.strip().split(',') + lognormal_model.delay_range2mu_sigma \ + [int(delay)][int(delay_range)] = \ + (float(mu_), float(sigma)) + return lognormal_model.delay_range2mu_sigma -def sleep(seconds, delta=0.3): - time.sleep(jitter(seconds,delta)) +def pareto(alpha=5.0, cap=10): + ''' + somehow reflects human behaviour (Zipf's law) + transformed to return [alpha-1/alpha, inf) with mean of 1.0 + capped to prevent inf + ''' + alpha = float(alpha) + return min((alpha - 1) / alpha / ((1 - random())**(1 / alpha)), cap) -def jitter(value, delta=0.3): - jitter = delta * value - return uniform(value-jitter, value+jitter) + +def sleep(seconds): + ''' + sleep for (given seconds + jitter + human reflex) seconds. + ''' + time.sleep(seconds + jitter_rng() + human_reflex_rng()) + + +def jitter_rng(ping=80, ping_range=30): + ''' + Simple lognormal jitter model for given ping and range. + Actually wider range is preferred for accurate modeling, + but we don't want to spend much time... + ''' + ping = int(ping / 10) * 10 + ping_range = int(ping_range / 5) * 5 + ping = min(max(10, ping), 500) + ping_range = min(max(10, ping_range), 100) + mu_, sigma = lognormal_model()[ping][ping_range] + lag = lognormal(mu_, sigma) + lag = min(1.0, lag) + return lag + + +def human_reflex_rng(reflex_mean=270, reflex_range=100): + ''' + Simulates human reflexes. + ''' + mu_, sigma = lognormal_model()[reflex_mean][reflex_range] + return min(1.0, lognormal(mu_, sigma)) + + +def random_lat_long_delta(radius=0.00025): + ''' + Simulates gps noise. + ''' + # Return random value from [-.000025, .000025]ish 99.73% of time. + # Since 364,000 feet is equivalent to one degree of latitude, this + # Gaussian is better for gps errors + noise = gauss(0, radius/3.0) + noise = min(max(-radius, noise), radius) + return noise def action_delay(low, high): @@ -20,27 +80,187 @@ def action_delay(low, high): time.sleep(shortNum) -def random_lat_long_delta(): - # Return random value from [-.000025, .000025]. Since 364,000 feet is equivalent to one degree of latitude, this - # should be 364,000 * .000025 = 9.1. So it returns between [-9.1, 9.1] - return ((random() * 0.00001) - 0.000005) * 5 +def ball_throw_reticle_fail_delay(success_prob=0.95): + ''' + Chances to skip the reticle could be considered constant, + so the wait time before throwing is as follows, + given that the pokemon does not interrupt... <- TODO + ''' + for trial in range(10): + if random() < success_prob: + break + + time.sleep(1.8*(trial+random())) + + +def aim_rng(target, std=0.05): + ''' + noise from the target point should be approximated by gaussian, + we can wait for the missed reticles etc, which means we get + another chance to try... + + ''' + for trial in range(10): + r = gauss(0, std) + if 0 <= target + r and target + r <= 1: + break + else: + # couldnt find target + gauss between [0, 1] + return random() + return target + r # Humanized `normalized_reticle_size` parameter for `catch_pokemon` API. # 1.0 => normal, 1.950 => excellent -def normalized_reticle_size(factor): - minimum = 1.0 - maximum = 1.950 - return uniform( - minimum + (maximum - minimum) * factor, - maximum) +def normalized_reticle_size(factor, mode='human'): + if 'bot' == mode: + return 1.950 + elif 'uniform' == mode: + minimum = 1.0 + maximum = 1.950 + return uniform( + minimum + (maximum - minimum) * factor, + maximum) + elif 'human' == mode: + rnd = gauss(factor, 0.05) + # mirror the bounds + rnd = rnd%1.0 + return 1.950 * rnd + else: + return mode(factor) # strategy # Humanized `spin_modifier` parameter for `catch_pokemon` API. # 0.0 => normal ball, 1.0 => super spin curve ball -def spin_modifier(factor): - minimum = 0.0 - maximum = 1.0 - return uniform( - minimum + (maximum - minimum) * factor, - maximum) +def spin_modifier(factor, mode='human'): + if 'bot' == mode: + return 1.0 + elif 'uniform' == mode: + minimum = 0.0 + maximum = 1.0 + return uniform( + minimum + (maximum - minimum) * factor, + maximum) + elif 'human' == mode: + return aim_rng(factor) + else: + return mode(factor) + + +def _visualize(): + ''' + Visualize rng distributions. + ''' + import numpy as np + import pandas as pd + import matplotlib.pyplot as plt + import seaborn as sns + + K = 10000 + + # lognormal simulations + human_reflex = [human_reflex_rng() for x in range(K)] + jitter = [jitter_rng(80,30) for x in range(K)] + + df_time = pd.DataFrame() + df_time.loc[:,'time'] = human_reflex + jitter + df_time.loc[:,'type'] = ['reflex']*len(human_reflex)+['jitter']*len(jitter) + + g = sns.FacetGrid(df_time, col='type') + g.map(sns.distplot, 'time') + sns.plt.savefig('time.png') + + + # spin simulation + spin9 = [spin_modifier(.9) for x in range(K)] + spin5 = [spin_modifier(.5) for x in range(K)] + spin1 = [spin_modifier(.1) for x in range(K)] + + df_time = pd.DataFrame() + df_time.loc[:,'value'] = spin9 + spin5 + spin1 + df_time.loc[:,'factor'] = ['0.9']*len(spin9)+['0.5']*len(spin5)+['0.1']*len(spin1) + + g = sns.FacetGrid(df_time, col='factor') + g.map(sns.distplot, 'value') + sns.plt.savefig('spin.png') + + # reticle simulation + reti9 = [normalized_reticle_size(.9) for x in range(K)] + reti5 = [normalized_reticle_size(.5) for x in range(K)] + reti1 = [normalized_reticle_size(.1) for x in range(K)] + + df_time = pd.DataFrame() + df_time.loc[:,'value'] = reti9 + reti5 + reti1 + df_time.loc[:,'factor'] = ['0.9']*len(spin9)+['0.5']*len(spin5)+['0.1']*len(spin1) + + g = sns.FacetGrid(df_time, col='factor') + g.map(sns.distplot, 'value') + sns.plt.savefig('reticle.png') + + +def _precalc_lognormal_ping_param( + output_file_path='lognormal_connection.model'): + ''' + Precalc parameters for lognormal ping model. + ''' + def calc_lognormal_ping_param( + target_mu, target_std, init_mu=0.1, init_std=0.1, debug=False): + # calculate mu and sighma for lognormal + import numpy as np + import theano + import theano.tensor as T + + # codes to calculate lognormal connection lag + mu_ = theano.shared(init_mu, name='mu') + sigma = theano.shared(init_std, name='sigma') + + eps = 1.5 # constant for gradient + func = (T.exp(mu_ + sigma * sigma / 2.0) - target_mu)**2 + \ + (T.sqrt(T.exp(2 * mu_ + sigma * sigma) * + (T.exp(sigma * sigma) - 1)) - target_std)**2 + + grad_mu, grad_sigma = T.grad(func, [mu_, sigma]) + + train = theano.function(inputs=[], outputs=[func], updates=( + (mu_, mu_ - eps * grad_mu), (sigma, sigma - eps * grad_sigma))) + + for epoch in range(100000): + err = train() + if float(err[0]) < 10e-10: + break + err = float(err[0]) + mu_ = float(mu_.get_value()) + sigma = np.abs(sigma.get_value()) + if debug: + print('Error:%s' % repr(err)) + print('[Expected mu and std]') + print('mu=%f, std=%f' % (target_mu, target_std)) + print('[lognormal check]') + print('mean=%f, std=%f' % (exp(mu_ + (sigma**2) / 2.0), + ((exp(sigma**2) - 1) * exp(2 * mu_ + sigma**2))**0.5)) + return mu_, sigma + + # good initial number for algo + init_mu = -1.5 + init_std = 0.007 + res = [] + for ping_ms in range(10, 501, 10): + for range_ms in range(5, 101, 5): + ping = ping_ms / 1000.0 + std = range_ms / 3.0 / 1000.0 + lognormal_mu, lognormal_std = calc_lognormal_ping_param( + ping, std, init_mu, init_std) + formatted = ','.join(map(repr, (ping_ms, range_ms, lognormal_mu, lognormal_std))) + res.append(formatted) + print(res[-1]) + init_mu = lognormal_mu + init_std = lognormal_std + + with open(output_file_path, 'w') as fout: + fout.write('\n'.join(res)) + + +if '__main__' == __name__: + # _precalc_lognormal_ping_param() + # _visualize() + pass From c0566ed1e6dac9d8687241190955e40a7e19b096 Mon Sep 17 00:00:00 2001 From: "M.K" Date: Thu, 4 Aug 2016 00:30:30 +0900 Subject: [PATCH 04/12] CI failing due to the imports used in unused code, commenting them out... --- pokemongo_bot/human_behaviour.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pokemongo_bot/human_behaviour.py b/pokemongo_bot/human_behaviour.py index bedd73c0f1..b20b3cc848 100644 --- a/pokemongo_bot/human_behaviour.py +++ b/pokemongo_bot/human_behaviour.py @@ -147,6 +147,7 @@ def spin_modifier(factor, mode='human'): return mode(factor) +""" def _visualize(): ''' Visualize rng distributions. @@ -259,8 +260,8 @@ def calc_lognormal_ping_param( with open(output_file_path, 'w') as fout: fout.write('\n'.join(res)) - if '__main__' == __name__: # _precalc_lognormal_ping_param() # _visualize() pass +""" From d692e2c8971a583bb95de777c9c03ece018e2148 Mon Sep 17 00:00:00 2001 From: "M.K" Date: Sat, 6 Aug 2016 11:53:34 +0900 Subject: [PATCH 05/12] Added Singleton Config class, so that we don't have to pass config to rng everytime we call them... --- pokecli.py | 7 +- pokemongo_bot/api_wrapper.py | 12 +- pokemongo_bot/config.py | 29 ++++ pokemongo_bot/human_behaviour.py | 183 +++++++++++++------- pokemongo_bot/test/config_singleton_test.py | 29 ++++ 5 files changed, 199 insertions(+), 61 deletions(-) create mode 100644 pokemongo_bot/config.py create mode 100644 pokemongo_bot/test/config_singleton_test.py diff --git a/pokecli.py b/pokecli.py index 94f8b01ee2..5eb346aadc 100755 --- a/pokecli.py +++ b/pokecli.py @@ -39,6 +39,7 @@ from geopy.exc import GeocoderQuotaExceeded from pokemongo_bot import PokemonGoBot, TreeConfigBuilder +from pokemongo_bot.config import Config if sys.version_info >= (2, 7, 9): ssl._create_default_https_context = ssl._create_unverified_context @@ -55,9 +56,11 @@ def main(): sys.stdout = codecs.getwriter('utf8')(sys.stdout) sys.stderr = codecs.getwriter('utf8')(sys.stderr) - config = init_config() - if not config: + conf = init_config() + if not conf: return + config = Config() + config = config.initialize(conf) logger.info('Configuration initialized') finished = False diff --git a/pokemongo_bot/api_wrapper.py b/pokemongo_bot/api_wrapper.py index 324d645043..95cda04d10 100644 --- a/pokemongo_bot/api_wrapper.py +++ b/pokemongo_bot/api_wrapper.py @@ -1,6 +1,7 @@ import time import logging +from human_behaviour import gps_noise_rng, sleep from pgoapi.exceptions import (ServerSideRequestThrottlingException, NotLoggedInException, ServerBusyOrOfflineException, NoPlayerPositionSetException, EmptySubrequestChainException, @@ -8,7 +9,6 @@ from pgoapi.pgoapi import PGoApi, PGoApiRequest, RpcApi from pgoapi.protos.POGOProtos.Networking.Requests_pb2 import RequestType -from human_behaviour import sleep class ApiWrapper(PGoApi): def __init__(self): @@ -38,6 +38,16 @@ def login(self, *args): self.useVanillaRequest = False return ret_value + def set_position(self, lat, lng, alt=0): + self.actual_lat = lat + self.actual_lng = lng + self.actual_alt = alt + lat_noise, lng_noise = gps_noise_rng() + PGoApi.set_position(self, lat + lat_noise, lng + lng_noise, alt) + + def get_position(self): + return (self.actual_lat, self.actual_lng, self.actual_alt) + class ApiRequest(PGoApiRequest): def __init__(self, *args): diff --git a/pokemongo_bot/config.py b/pokemongo_bot/config.py new file mode 100644 index 0000000000..2a0e1ee401 --- /dev/null +++ b/pokemongo_bot/config.py @@ -0,0 +1,29 @@ +class Config(object): + _instance = None + _initialized = False + def __new__(class_, *args, **kwargs): + if not isinstance(class_._instance, class_): + class_._instance = object.__new__(class_, *args, **kwargs) + return class_._instance + + def __init__(self): + pass + + def initialize(self, config): + self.config = config + Config._initialized = True + + def __getattr__(self, name): + if Config._initialized: + if hasattr(self, 'config'): + return getattr(self.config, name) + return None + +def get_config(attr, default, config=Config()): + if Config._initialized and hasattr(config, attr): + ret = getattr(config, attr) + else: + # logger.log("Config for %s not found, using default = %s"%(attr, repr(default))) + ret = default + return ret + diff --git a/pokemongo_bot/human_behaviour.py b/pokemongo_bot/human_behaviour.py index b20b3cc848..8a2dfa8de9 100644 --- a/pokemongo_bot/human_behaviour.py +++ b/pokemongo_bot/human_behaviour.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- import time -from math import exp -from random import random, gauss, uniform from collections import defaultdict +from config import get_config +from math import exp from numpy.random import lognormal +from random import random, gauss, uniform def lognormal_model(path='data/lognormal.model'): ''' @@ -20,77 +21,126 @@ def lognormal_model(path='data/lognormal.model'): return lognormal_model.delay_range2mu_sigma -def pareto(alpha=5.0, cap=10): +def random_lat_long_delta(radius=0.00025): ''' - somehow reflects human behaviour (Zipf's law) - transformed to return [alpha-1/alpha, inf) with mean of 1.0 - capped to prevent inf + Simulates gps noise??? Sounds more like a rng for random walk. + Keep it here for now... ''' - alpha = float(alpha) - return min((alpha - 1) / alpha / ((1 - random())**(1 / alpha)), cap) + # Return random value from [-.000025, .000025]ish 99.73% of time. + # Since 364,000 feet is equivalent to one degree of latitude, this + # Gaussian is better for gps errors + noise = gauss(0, radius/3.0) + noise = min(max(-radius, noise), radius) + return noise + + +def action_delay(low, high): + # Waits for random number of seconds between low & high numbers + longNum = uniform(low, high) + shortNum = float("{0:.2f}".format(longNum)) def sleep(seconds): ''' - sleep for (given seconds + jitter + human reflex) seconds. + General sleep with some lags. + + Configs: + "max_sleep_time" = 60, + ''' - time.sleep(seconds + jitter_rng() + human_reflex_rng()) + # some of the actions don't need reflex replication, so removed from here. + wait_time = seconds + jitter_rng() + max_sleep = get_config('max_sleep_time', 60) + time.sleep(min(wait_time, max_sleep)) -def jitter_rng(ping=80, ping_range=30): +def ball_throw_reticle_fail_delay(): ''' - Simple lognormal jitter model for given ping and range. - Actually wider range is preferred for accurate modeling, - but we don't want to spend much time... + Chances to skip the reticle could be considered constant, + so the wait time before throwing is as follows, + given that the pokemon does not interrupt... <- TODO + + Configs: + "replicate_reticle_fail_delay" = false, + "reticle_fail_chance = 0.05", + "reticle_fail_max_trial" = 10, ''' - ping = int(ping / 10) * 10 - ping_range = int(ping_range / 5) * 5 - ping = min(max(10, ping), 500) - ping_range = min(max(10, ping_range), 100) - mu_, sigma = lognormal_model()[ping][ping_range] - lag = lognormal(mu_, sigma) - lag = min(1.0, lag) - return lag + if get_config('replicate_throw_reticle_fail_delay', false): + fail_prob = get_config('throw_reticle_fail_chance', 0.05) + for trial in range(get_config('reticle_fail_max_trial', 10)): + if fail_prob < random(): + break + time.sleep(1.8*(trial+random())) -def human_reflex_rng(reflex_mean=270, reflex_range=100): - ''' - Simulates human reflexes. + +def jitter_rng(): ''' - mu_, sigma = lognormal_model()[reflex_mean][reflex_range] - return min(1.0, lognormal(mu_, sigma)) + Simulates jitter. + Configs: + "replicate_jitter" = false, + "jitter_ping" = 80, + "jitter_range" = 30, + "jitter_max_seconds" = 1.0, -def random_lat_long_delta(radius=0.00025): ''' - Simulates gps noise. + replicate_jitter = get_config('replicate_jitter', False) + jitter = 0 + if replicate_jitter: + ping = get_config('jitter_ping', 80) + ping_range = get_config('jitter_range', 30) + + ping = int(ping / 10) * 10 + ping_range = int(ping_range / 5) * 5 + ping = min(max(10, ping), 500) + ping_range = min(max(10, ping_range), 100) + mu_, sigma = lognormal_model()[ping][ping_range] + jitter = lognormal(mu_, sigma) + jitter = min(jitter, get_config('jitter_max_seconds', 1.0)) + return jitter + + +def human_reflex_rng(): ''' - # Return random value from [-.000025, .000025]ish 99.73% of time. - # Since 364,000 feet is equivalent to one degree of latitude, this - # Gaussian is better for gps errors - noise = gauss(0, radius/3.0) - noise = min(max(-radius, noise), radius) - return noise + Simulates human reflexes. + Configs: + "replicate_reflex" = false, + "reflex_time" = 270, + "reflex_range" = 100, + "reflex_max_seconds" = 1.0, -def action_delay(low, high): - # Waits for random number of seconds between low & high numbers - longNum = uniform(low, high) - shortNum = float("{0:.2f}".format(longNum)) - time.sleep(shortNum) + ''' + reflex_time = 0 + if get_config('replicate_reflex', False): + reflex_mean = get_config('reflex_time', 270) + reflex_range = get_config('reflex_range', 100) + mu_, sigma = lognormal_model()[reflex_mean][reflex_range] + reflex_time = min(lognormal(mu_, sigma), get_config('reflex_max_seconds', 1.0)) + return reflex_time -def ball_throw_reticle_fail_delay(success_prob=0.95): +def gps_noise_rng(): ''' - Chances to skip the reticle could be considered constant, - so the wait time before throwing is as follows, - given that the pokemon does not interrupt... <- TODO + Simulates gps noise. This may cause problem, so we need test. + + Configs: + "replicate_gps_noise" = false, + "gps_noise_radius = 0.00075" + ''' - for trial in range(10): - if random() < success_prob: - break + radius = get_config('gps_noise_radius', 0.00075) + lat_noise = 0 + lng_noise = 0 + if get_config('replicate_gps_noise', False): + lat_noise = gauss(0, radius/3.0) + lat_noise = min(max(-radius, lat_noise), radius) + + lng_noise = gauss(0, radius/3.0) + lng_noise = min(max(-radius, lng_noise), radius) - time.sleep(1.8*(trial+random())) + return lat_noise, lng_noise def aim_rng(target, std=0.05): @@ -98,6 +148,8 @@ def aim_rng(target, std=0.05): noise from the target point should be approximated by gaussian, we can wait for the missed reticles etc, which means we get another chance to try... + + TODO: add nice conf name for this... ''' for trial in range(10): @@ -112,9 +164,18 @@ def aim_rng(target, std=0.05): # Humanized `normalized_reticle_size` parameter for `catch_pokemon` API. # 1.0 => normal, 1.950 => excellent -def normalized_reticle_size(factor, mode='human'): - if 'bot' == mode: - return 1.950 +def normalized_reticle_size_rng(): + ''' + Reticle rng. + + Configs: + "replicate_ball_throw_reticle" = "human", + "normalized_reticle_size" = 0.9, + + ''' + factor = get_config('normalized_reticle_size', 0.9) + if 'exact' == mode: + return factor elif 'uniform' == mode: minimum = 1.0 maximum = 1.950 @@ -126,14 +187,22 @@ def normalized_reticle_size(factor, mode='human'): # mirror the bounds rnd = rnd%1.0 return 1.950 * rnd - else: - return mode(factor) # strategy + return 1.950 # Humanized `spin_modifier` parameter for `catch_pokemon` API. # 0.0 => normal ball, 1.0 => super spin curve ball -def spin_modifier(factor, mode='human'): - if 'bot' == mode: +def spin_modifier_rng(): + ''' + Spin rng. + + Configs: + "replicate_ball_throw_spin" = "human", + "spin_modifier" = 0.9, + + ''' + factor = get_config('spin_modifier', 0.9) + if 'exact' == mode: return 1.0 elif 'uniform' == mode: minimum = 0.0 @@ -143,9 +212,7 @@ def spin_modifier(factor, mode='human'): maximum) elif 'human' == mode: return aim_rng(factor) - else: - return mode(factor) - + return 1.0 """ def _visualize(): diff --git a/pokemongo_bot/test/config_singleton_test.py b/pokemongo_bot/test/config_singleton_test.py new file mode 100644 index 0000000000..6f50bfebf7 --- /dev/null +++ b/pokemongo_bot/test/config_singleton_test.py @@ -0,0 +1,29 @@ +from config import Config, get_config +import unittest + + +class ConfigSingletonTestCase(unittest.TestCase): + + def testConfigSingleton(self): + class AttrHolder(object): + pass + + obj = AttrHolder() + obj.val = 1 + + assert 0 == get_config('val', 0) + + config1 = Config() + assert 0 == get_config('val', 0) + + config2 = Config() + config2.initialize(obj) + assert 1 == get_config('val', 0) + + obj.val = 2 + config1.initialize(obj) + assert 2 == get_config('val', 0) + + config3 = Config() + obj.val = 3 + assert 3 == get_config('val', 0) From 53091d7739715fe10dbca9f60a6421422ab41ab2 Mon Sep 17 00:00:00 2001 From: "M.K" Date: Sat, 6 Aug 2016 12:03:58 +0900 Subject: [PATCH 06/12] quick fix on wrong syntax etc, waiting api update before further test... --- pokecli.py | 7 +++---- pokemongo_bot/cell_workers/pokemon_catch_worker.py | 9 +++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pokecli.py b/pokecli.py index 5eb346aadc..56fe37f4b0 100755 --- a/pokecli.py +++ b/pokecli.py @@ -56,11 +56,10 @@ def main(): sys.stdout = codecs.getwriter('utf8')(sys.stdout) sys.stderr = codecs.getwriter('utf8')(sys.stderr) - conf = init_config() - if not conf: + config = init_config() + if not config: return - config = Config() - config = config.initialize(conf) + conf = Config().initialize(config) # initialize the singleton aswell logger.info('Configuration initialized') finished = False diff --git a/pokemongo_bot/cell_workers/pokemon_catch_worker.py b/pokemongo_bot/cell_workers/pokemon_catch_worker.py index afa5578267..aa08772c7d 100644 --- a/pokemongo_bot/cell_workers/pokemon_catch_worker.py +++ b/pokemongo_bot/cell_workers/pokemon_catch_worker.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- import time -from pokemongo_bot.human_behaviour import (normalized_reticle_size, sleep, - spin_modifier) +from pokemongo_bot.human_behaviour import (normalized_reticle_size_rng, sleep, + spin_modifier_rng) from pokemongo_bot.cell_workers.base_task import BaseTask class PokemonCatchWorker(BaseTask): @@ -303,8 +303,9 @@ def work(self, response_dict=None): ) id_list1 = self.count_pokemon_inventory() - reticle_size_parameter = normalized_reticle_size(self.config.catch_randomize_reticle_factor) - spin_modifier_parameter = spin_modifier(self.config.catch_randomize_spin_factor) + reticle_size_parameter = normalized_reticle_size_rng() + + spin_modifier_parameter = spin_modifier_rng() response_dict = self.api.catch_pokemon( encounter_id=encounter_id, From 35a815ed619ed24e5cc8415a529b8cb8fef6fa8c Mon Sep 17 00:00:00 2001 From: "M.K" Date: Sat, 6 Aug 2016 14:26:33 +0900 Subject: [PATCH 07/12] Worked around with nested config --- pokemongo_bot/config.py | 61 +++++++++++++++++---- pokemongo_bot/test/config_singleton_test.py | 22 ++++++-- 2 files changed, 66 insertions(+), 17 deletions(-) diff --git a/pokemongo_bot/config.py b/pokemongo_bot/config.py index 2a0e1ee401..63181507c4 100644 --- a/pokemongo_bot/config.py +++ b/pokemongo_bot/config.py @@ -1,6 +1,6 @@ class Config(object): _instance = None - _initialized = False + config = None def __new__(class_, *args, **kwargs): if not isinstance(class_._instance, class_): class_._instance = object.__new__(class_, *args, **kwargs) @@ -9,20 +9,57 @@ def __new__(class_, *args, **kwargs): def __init__(self): pass - def initialize(self, config): - self.config = config - Config._initialized = True - - def __getattr__(self, name): - if Config._initialized: - if hasattr(self, 'config'): - return getattr(self.config, name) + @staticmethod + def initialize(config): + Config.config = config + + @staticmethod + def __getattr__(name): + if None != Config.config: + return getattr(Config.config, name) return None -def get_config(attr, default, config=Config()): - if Config._initialized and hasattr(config, attr): - ret = getattr(config, attr) + +def _recursive_getattr(obj, attrNames): + if 0 == len(attrNames): + return obj + else: + if type(obj) == dict and attrNames[0] in obj: + return _recursive_getattr(obj[attrNames[0]], attrNames[1:]) + else: + return None + + +def get_config(attr, default): + ''' + Utility for getting config value. + Instead of writing + + if 'attr1' in Config.config.dic and 'attr2' in Config.config.dic['attr1']: + value = Config.config.dic['attr1']['attr2'] else: + value = default + + you can simply write + + value = get_config('dic.attr1.attr2', default) + + Array indexing is not supported yet. + TODO: Maybe add memoize??? + Be careful with changin the conf values in the case... + + ''' + attr_ar = attr.split('.') + if None != Config.config and hasattr(Config.config, attr_ar[0]): + obj = getattr(Config.config, attr_ar[0]) + if 1 == len(attr_ar): + return obj + else: + ret = _recursive_getattr(obj, attr_ar[1:]) + else: + ret = None + + if None == ret: # logger.log("Config for %s not found, using default = %s"%(attr, repr(default))) ret = default return ret diff --git a/pokemongo_bot/test/config_singleton_test.py b/pokemongo_bot/test/config_singleton_test.py index 6f50bfebf7..05b093a903 100644 --- a/pokemongo_bot/test/config_singleton_test.py +++ b/pokemongo_bot/test/config_singleton_test.py @@ -10,20 +10,32 @@ class AttrHolder(object): obj = AttrHolder() obj.val = 1 + obj.d = {'apple':'is delicious', 'banana':{'is':'good'}} assert 0 == get_config('val', 0) config1 = Config() - assert 0 == get_config('val', 0) + assert 0 == get_config('val', 0) # not initialized yet. config2 = Config() config2.initialize(obj) - assert 1 == get_config('val', 0) + assert 1 == get_config('val', 0) # initialized. obj.val = 2 config1.initialize(obj) - assert 2 == get_config('val', 0) + assert 2 == get_config('val', 0) # value changed, and other conf instance gets the canged value. config3 = Config() - obj.val = 3 - assert 3 == get_config('val', 0) + config3.config.val = 3 # value changed through an instance + assert 3 == get_config('val', 0) # + + assert 'is delicious' == get_config('d.apple', 'WRONG') # nested attribute test + + assert 'good' == get_config('d.banana.is', 'WRONG') # another nested attribute test + + assert 'WRONG' == get_config('d.pineapple.does.not.exist', 'WRONG') # some other nested attribute test + + assert 3 == config2.config.val # make sure direct access works as it used to + + assert 'good' == config2.config.d['banana']['is'] # same as above + From 1eaede789c47a669406fa708cd350afdb030f129 Mon Sep 17 00:00:00 2001 From: "M.K" Date: Sun, 7 Aug 2016 09:41:28 +0900 Subject: [PATCH 08/12] Added to conf examples and fixed config bug, added altitude gps noise aswell... --- configs/config.json.cluster.example | 20 ++++++++++++++-- configs/config.json.example | 20 ++++++++++++++-- configs/config.json.map.example | 20 ++++++++++++++-- configs/config.json.path.example | 20 ++++++++++++++-- configs/config.json.pokemon.example | 20 ++++++++++++++-- pokecli.py | 2 +- pokemongo_bot/api_wrapper.py | 4 ++-- pokemongo_bot/config.py | 6 +++-- pokemongo_bot/human_behaviour.py | 36 ++++++++++++++++++----------- 9 files changed, 119 insertions(+), 29 deletions(-) diff --git a/configs/config.json.cluster.example b/configs/config.json.cluster.example index 5613061a84..071a7a562d 100644 --- a/configs/config.json.cluster.example +++ b/configs/config.json.cluster.example @@ -78,8 +78,24 @@ "distance_unit": "km", "reconnecting_timeout": 15, "evolve_captured": "NONE", - "catch_randomize_reticle_factor": 1.0, - "catch_randomize_spin_factor": 1.0, + "max_sleep" = 60, + "replicate_reticle_fail_delay" = false, + "reticle_fail_chance = 0.05", + "reticle_fail_max_trial" = 10, + "reticle_fail_max_sleep" = 10, + "jitter_ping" = 80, + "jitter_range" = 30, + "jitter_max_sleep" = 1.0, + "replicate_reflex" = false, + "reflex_time" = 270, + "reflex_range" = 100, + "reflex_max_sleep" = 1.0, + "replicate_gps_noise" = false, + "gps_noise_radius = 0.00075", + "replicate_ball_throw_reticle" = "human", + "catch_randomize_reticle_factor": 0.9, + "replicate_ball_throw_spin" = "human", + "catch_randomize_spin_factor": 0.9, "catch": { "any": {"catch_above_cp": 0, "catch_above_iv": 0, "logic": "or"}, "// Example of always catching Rattata:": {}, diff --git a/configs/config.json.example b/configs/config.json.example index 20ef72e34e..527713ca03 100644 --- a/configs/config.json.example +++ b/configs/config.json.example @@ -85,8 +85,24 @@ "distance_unit": "km", "reconnecting_timeout": 15, "evolve_captured": "NONE", - "catch_randomize_reticle_factor": 1.0, - "catch_randomize_spin_factor": 1.0, + "max_sleep" = 60, + "replicate_reticle_fail_delay" = false, + "reticle_fail_chance = 0.05", + "reticle_fail_max_trial" = 10, + "reticle_fail_max_sleep" = 10, + "jitter_ping" = 80, + "jitter_range" = 30, + "jitter_max_sleep" = 1.0, + "replicate_reflex" = false, + "reflex_time" = 270, + "reflex_range" = 100, + "reflex_max_sleep" = 1.0, + "replicate_gps_noise" = false, + "gps_noise_radius = 0.00075", + "replicate_ball_throw_reticle" = "human", + "catch_randomize_reticle_factor": 0.9, + "replicate_ball_throw_spin" = "human", + "catch_randomize_spin_factor": 0.9, "catch": { "any": {"catch_above_cp": 0, "catch_above_iv": 0, "logic": "or"}, "// Example of always catching Rattata:": {}, diff --git a/configs/config.json.map.example b/configs/config.json.map.example index 6436b95905..3c06892cd3 100644 --- a/configs/config.json.map.example +++ b/configs/config.json.map.example @@ -316,8 +316,24 @@ "distance_unit": "km", "reconnecting_timeout": 15, "evolve_captured": "NONE", - "catch_randomize_reticle_factor": 1.0, - "catch_randomize_spin_factor": 1.0, + "max_sleep" = 60, + "replicate_reticle_fail_delay" = false, + "reticle_fail_chance = 0.05", + "reticle_fail_max_trial" = 10, + "reticle_fail_max_sleep" = 10, + "jitter_ping" = 80, + "jitter_range" = 30, + "jitter_max_sleep" = 1.0, + "replicate_reflex" = false, + "reflex_time" = 270, + "reflex_range" = 100, + "reflex_max_sleep" = 1.0, + "replicate_gps_noise" = false, + "gps_noise_radius = 0.00075", + "replicate_ball_throw_reticle" = "human", + "catch_randomize_reticle_factor": 0.9, + "replicate_ball_throw_spin" = "human", + "catch_randomize_spin_factor": 0.9, "catch": { "any": {"catch_above_cp": 0, "catch_above_iv": 0, "logic": "or"}, "// Example of always catching Rattata:": {}, diff --git a/configs/config.json.path.example b/configs/config.json.path.example index 38baa9f1f0..83d62d29fd 100644 --- a/configs/config.json.path.example +++ b/configs/config.json.path.example @@ -79,8 +79,24 @@ "distance_unit": "km", "reconnecting_timeout": 15, "evolve_captured": "NONE", - "catch_randomize_reticle_factor": 1.0, - "catch_randomize_spin_factor": 1.0, + "max_sleep" = 60, + "replicate_reticle_fail_delay" = false, + "reticle_fail_chance = 0.05", + "reticle_fail_max_trial" = 10, + "reticle_fail_max_sleep" = 10, + "jitter_ping" = 80, + "jitter_range" = 30, + "jitter_max_sleep" = 1.0, + "replicate_reflex" = false, + "reflex_time" = 270, + "reflex_range" = 100, + "reflex_max_sleep" = 1.0, + "replicate_gps_noise" = false, + "gps_noise_radius = 0.00075", + "replicate_ball_throw_reticle" = "human", + "catch_randomize_reticle_factor": 0.9, + "replicate_ball_throw_spin" = "human", + "catch_randomize_spin_factor": 0.9, "catch": { "any": {"catch_above_cp": 0, "catch_above_iv": 0, "logic": "or"}, "// Example of always catching Rattata:": {}, diff --git a/configs/config.json.pokemon.example b/configs/config.json.pokemon.example index 7cad1ac066..1acf7c76bd 100644 --- a/configs/config.json.pokemon.example +++ b/configs/config.json.pokemon.example @@ -85,8 +85,24 @@ "distance_unit": "km", "reconnecting_timeout": 15, "evolve_captured": "NONE", - "catch_randomize_reticle_factor": 1.0, - "catch_randomize_spin_factor": 1.0, + "max_sleep" = 60, + "replicate_reticle_fail_delay" = false, + "reticle_fail_chance = 0.05", + "reticle_fail_max_trial" = 10, + "reticle_fail_max_sleep" = 10, + "jitter_ping" = 80, + "jitter_range" = 30, + "jitter_max_sleep" = 1.0, + "replicate_reflex" = false, + "reflex_time" = 270, + "reflex_range" = 100, + "reflex_max_sleep" = 1.0, + "replicate_gps_noise" = false, + "gps_noise_radius = 0.00075", + "replicate_ball_throw_reticle" = "human", + "catch_randomize_reticle_factor": 0.9, + "replicate_ball_throw_spin" = "human", + "catch_randomize_spin_factor": 0.9, "catch": { "any": {"catch_above_cp": 0, "catch_above_iv": 0, "logic": "or" }, diff --git a/pokecli.py b/pokecli.py index 56fe37f4b0..529d1d5e93 100755 --- a/pokecli.py +++ b/pokecli.py @@ -59,7 +59,7 @@ def main(): config = init_config() if not config: return - conf = Config().initialize(config) # initialize the singleton aswell + Config().initialize(config) # initialize the singleton aswell logger.info('Configuration initialized') finished = False diff --git a/pokemongo_bot/api_wrapper.py b/pokemongo_bot/api_wrapper.py index 95cda04d10..f5f413f816 100644 --- a/pokemongo_bot/api_wrapper.py +++ b/pokemongo_bot/api_wrapper.py @@ -42,8 +42,8 @@ def set_position(self, lat, lng, alt=0): self.actual_lat = lat self.actual_lng = lng self.actual_alt = alt - lat_noise, lng_noise = gps_noise_rng() - PGoApi.set_position(self, lat + lat_noise, lng + lng_noise, alt) + lat_noise, lng_noise, alt_noise = gps_noise_rng() + PGoApi.set_position(self, lat + lat_noise, lng + lng_noise, alt + alt_noise) def get_position(self): return (self.actual_lat, self.actual_lng, self.actual_alt) diff --git a/pokemongo_bot/config.py b/pokemongo_bot/config.py index 63181507c4..9ecfba558e 100644 --- a/pokemongo_bot/config.py +++ b/pokemongo_bot/config.py @@ -1,5 +1,6 @@ class Config(object): _instance = None + _initialized = False # None != config causes error for some reason... config = None def __new__(class_, *args, **kwargs): if not isinstance(class_._instance, class_): @@ -12,10 +13,11 @@ def __init__(self): @staticmethod def initialize(config): Config.config = config + Config._initialized = True @staticmethod def __getattr__(name): - if None != Config.config: + if Config._initialized: return getattr(Config.config, name) return None @@ -50,7 +52,7 @@ def get_config(attr, default): ''' attr_ar = attr.split('.') - if None != Config.config and hasattr(Config.config, attr_ar[0]): + if Config._initialized and hasattr(Config.config, attr_ar[0]): obj = getattr(Config.config, attr_ar[0]) if 1 == len(attr_ar): return obj diff --git a/pokemongo_bot/human_behaviour.py b/pokemongo_bot/human_behaviour.py index 8a2dfa8de9..e7132243d1 100644 --- a/pokemongo_bot/human_behaviour.py +++ b/pokemongo_bot/human_behaviour.py @@ -45,12 +45,12 @@ def sleep(seconds): General sleep with some lags. Configs: - "max_sleep_time" = 60, + "max_sleep" = 60, ''' # some of the actions don't need reflex replication, so removed from here. wait_time = seconds + jitter_rng() - max_sleep = get_config('max_sleep_time', 60) + max_sleep = get_config('max_sleep', 60) time.sleep(min(wait_time, max_sleep)) @@ -64,14 +64,15 @@ def ball_throw_reticle_fail_delay(): "replicate_reticle_fail_delay" = false, "reticle_fail_chance = 0.05", "reticle_fail_max_trial" = 10, + "reticle_fail_max_sleep" = 10, ''' - if get_config('replicate_throw_reticle_fail_delay', false): + if get_config('replicate_throw_reticle_fail_delay', False): fail_prob = get_config('throw_reticle_fail_chance', 0.05) for trial in range(get_config('reticle_fail_max_trial', 10)): if fail_prob < random(): break - time.sleep(1.8*(trial+random())) + time.sleep(1.8*(trial+random()), get_config('reticle_fail_max_sleep', 10)) # should this be sleep? or time.sleep? def jitter_rng(): @@ -82,7 +83,7 @@ def jitter_rng(): "replicate_jitter" = false, "jitter_ping" = 80, "jitter_range" = 30, - "jitter_max_seconds" = 1.0, + "jitter_max_sleep" = 1.0, ''' replicate_jitter = get_config('replicate_jitter', False) @@ -97,7 +98,7 @@ def jitter_rng(): ping_range = min(max(10, ping_range), 100) mu_, sigma = lognormal_model()[ping][ping_range] jitter = lognormal(mu_, sigma) - jitter = min(jitter, get_config('jitter_max_seconds', 1.0)) + jitter = min(jitter, get_config('jitter_max_sleep', 1.0)) return jitter @@ -109,7 +110,7 @@ def human_reflex_rng(): "replicate_reflex" = false, "reflex_time" = 270, "reflex_range" = 100, - "reflex_max_seconds" = 1.0, + "reflex_max_sleep" = 1.0, ''' reflex_time = 0 @@ -117,7 +118,7 @@ def human_reflex_rng(): reflex_mean = get_config('reflex_time', 270) reflex_range = get_config('reflex_range', 100) mu_, sigma = lognormal_model()[reflex_mean][reflex_range] - reflex_time = min(lognormal(mu_, sigma), get_config('reflex_max_seconds', 1.0)) + reflex_time = min(lognormal(mu_, sigma), get_config('reflex_max_sleep', 1.0)) return reflex_time @@ -127,12 +128,13 @@ def gps_noise_rng(): Configs: "replicate_gps_noise" = false, - "gps_noise_radius = 0.00075" + "gps_noise_radius = 0.00075", ''' radius = get_config('gps_noise_radius', 0.00075) lat_noise = 0 lng_noise = 0 + alt_noise = 0 if get_config('replicate_gps_noise', False): lat_noise = gauss(0, radius/3.0) lat_noise = min(max(-radius, lat_noise), radius) @@ -140,7 +142,9 @@ def gps_noise_rng(): lng_noise = gauss(0, radius/3.0) lng_noise = min(max(-radius, lng_noise), radius) - return lat_noise, lng_noise + alt_noise = gauss(0, radius/3.0) + alt_noise = min(max(-radius, alt_noise), radius) + return lat_noise, lng_noise, alt_noise def aim_rng(target, std=0.05): @@ -170,10 +174,12 @@ def normalized_reticle_size_rng(): Configs: "replicate_ball_throw_reticle" = "human", - "normalized_reticle_size" = 0.9, + "catch_randomize_reticle_factor" = 0.9, ''' - factor = get_config('normalized_reticle_size', 0.9) + mode = get_config('replicate_ball_throw_reticle', 'human') + factor = get_config('catch_randomize_reticle_factor', 0.9) + if 'exact' == mode: return factor elif 'uniform' == mode: @@ -198,10 +204,12 @@ def spin_modifier_rng(): Configs: "replicate_ball_throw_spin" = "human", - "spin_modifier" = 0.9, + "catch_randomize_spin_factor" = 0.9, ''' - factor = get_config('spin_modifier', 0.9) + mode = get_config('replicate_ball_throw_spin', 'human') + factor = get_config('catch_randomize_spin_factor', 0.9) + if 'exact' == mode: return 1.0 elif 'uniform' == mode: From 4cfa87f1e0b1ce48bb2e575245a18684810118f3 Mon Sep 17 00:00:00 2001 From: "M.K" Date: Sun, 7 Aug 2016 11:00:21 +0900 Subject: [PATCH 09/12] CI failing due to wrong import path, fixed --- pokemongo_bot/test/config_singleton_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pokemongo_bot/test/config_singleton_test.py b/pokemongo_bot/test/config_singleton_test.py index 05b093a903..7124b2481c 100644 --- a/pokemongo_bot/test/config_singleton_test.py +++ b/pokemongo_bot/test/config_singleton_test.py @@ -1,4 +1,4 @@ -from config import Config, get_config +from pokemongo_bot.config import Config, get_config import unittest From 95e866999e9e6b2941d20a40ea488a90a4b3dc1f Mon Sep 17 00:00:00 2001 From: "M.K" Date: Sun, 7 Aug 2016 16:15:17 +0900 Subject: [PATCH 10/12] fixed broken json and remaining conf issue, seems to be working now... --- configs/config.json.cluster.example | 38 +++++++++-------- configs/config.json.example | 38 +++++++++-------- configs/config.json.map.example | 38 +++++++++-------- configs/config.json.path.example | 38 +++++++++-------- configs/config.json.pokemon.example | 38 +++++++++-------- pokecli.py | 7 +++- pokemongo_bot/human_behaviour.py | 64 ++++++++++++++--------------- 7 files changed, 137 insertions(+), 124 deletions(-) diff --git a/configs/config.json.cluster.example b/configs/config.json.cluster.example index dcafb91f67..54ab34aec7 100644 --- a/configs/config.json.cluster.example +++ b/configs/config.json.cluster.example @@ -77,24 +77,26 @@ "distance_unit": "km", "reconnecting_timeout": 15, "evolve_captured": "NONE", - "max_sleep" = 60, - "replicate_reticle_fail_delay" = false, - "reticle_fail_chance = 0.05", - "reticle_fail_max_trial" = 10, - "reticle_fail_max_sleep" = 10, - "jitter_ping" = 80, - "jitter_range" = 30, - "jitter_max_sleep" = 1.0, - "replicate_reflex" = false, - "reflex_time" = 270, - "reflex_range" = 100, - "reflex_max_sleep" = 1.0, - "replicate_gps_noise" = false, - "gps_noise_radius = 0.00075", - "replicate_ball_throw_reticle" = "human", - "catch_randomize_reticle_factor": 0.9, - "replicate_ball_throw_spin" = "human", - "catch_randomize_spin_factor": 0.9, + "replicator": { + "max_sleep" : 60, + "replicate_reticle_fail_delay": true, + "reticle_fail_chance" : 0.05, + "reticle_fail_max_trial" : 10, + "reticle_fail_max_sleep" : 10, + "jitter_ping" : 80, + "jitter_range" : 30, + "jitter_max_sleep" : 1.0, + "replicate_reflex" : true, + "reflex_time" : 270, + "reflex_range" : 100, + "reflex_max_sleep" : 1.0, + "replicate_gps_noise" : true, + "gps_noise_radius" : 0.00075, + "replicate_ball_throw_reticle" : "human", + "replicate_ball_throw_spin" : "human" + }, + "catch_randomize_reticle_factor": 1.0, + "catch_randomize_spin_factor": 1.0, "catch": { "any": {"catch_above_cp": 0, "catch_above_iv": 0, "logic": "or"}, "// Example of always catching Rattata:": {}, diff --git a/configs/config.json.example b/configs/config.json.example index 527713ca03..eb3f4bf69a 100644 --- a/configs/config.json.example +++ b/configs/config.json.example @@ -85,24 +85,26 @@ "distance_unit": "km", "reconnecting_timeout": 15, "evolve_captured": "NONE", - "max_sleep" = 60, - "replicate_reticle_fail_delay" = false, - "reticle_fail_chance = 0.05", - "reticle_fail_max_trial" = 10, - "reticle_fail_max_sleep" = 10, - "jitter_ping" = 80, - "jitter_range" = 30, - "jitter_max_sleep" = 1.0, - "replicate_reflex" = false, - "reflex_time" = 270, - "reflex_range" = 100, - "reflex_max_sleep" = 1.0, - "replicate_gps_noise" = false, - "gps_noise_radius = 0.00075", - "replicate_ball_throw_reticle" = "human", - "catch_randomize_reticle_factor": 0.9, - "replicate_ball_throw_spin" = "human", - "catch_randomize_spin_factor": 0.9, + "replicator": { + "max_sleep" : 60, + "replicate_reticle_fail_delay": true, + "reticle_fail_chance" : 0.05, + "reticle_fail_max_trial" : 10, + "reticle_fail_max_sleep" : 10, + "jitter_ping" : 80, + "jitter_range" : 30, + "jitter_max_sleep" : 1.0, + "replicate_reflex" : true, + "reflex_time" : 270, + "reflex_range" : 100, + "reflex_max_sleep" : 1.0, + "replicate_gps_noise" : true, + "gps_noise_radius" : 0.00075, + "replicate_ball_throw_reticle" : "human", + "replicate_ball_throw_spin" : "human" + }, + "catch_randomize_reticle_factor": 1.0, + "catch_randomize_spin_factor": 1.0, "catch": { "any": {"catch_above_cp": 0, "catch_above_iv": 0, "logic": "or"}, "// Example of always catching Rattata:": {}, diff --git a/configs/config.json.map.example b/configs/config.json.map.example index 417f222a8f..1a5f9a933b 100644 --- a/configs/config.json.map.example +++ b/configs/config.json.map.example @@ -315,24 +315,26 @@ "distance_unit": "km", "reconnecting_timeout": 15, "evolve_captured": "NONE", - "max_sleep" = 60, - "replicate_reticle_fail_delay" = false, - "reticle_fail_chance = 0.05", - "reticle_fail_max_trial" = 10, - "reticle_fail_max_sleep" = 10, - "jitter_ping" = 80, - "jitter_range" = 30, - "jitter_max_sleep" = 1.0, - "replicate_reflex" = false, - "reflex_time" = 270, - "reflex_range" = 100, - "reflex_max_sleep" = 1.0, - "replicate_gps_noise" = false, - "gps_noise_radius = 0.00075", - "replicate_ball_throw_reticle" = "human", - "catch_randomize_reticle_factor": 0.9, - "replicate_ball_throw_spin" = "human", - "catch_randomize_spin_factor": 0.9, + "replicator": { + "max_sleep" : 60, + "replicate_reticle_fail_delay": true, + "reticle_fail_chance" : 0.05, + "reticle_fail_max_trial" : 10, + "reticle_fail_max_sleep" : 10, + "jitter_ping" : 80, + "jitter_range" : 30, + "jitter_max_sleep" : 1.0, + "replicate_reflex" : true, + "reflex_time" : 270, + "reflex_range" : 100, + "reflex_max_sleep" : 1.0, + "replicate_gps_noise" : true, + "gps_noise_radius" : 0.00075, + "replicate_ball_throw_reticle" : "human", + "replicate_ball_throw_spin" : "human" + }, + "catch_randomize_reticle_factor": 1.0, + "catch_randomize_spin_factor": 1.0, "catch": { "any": {"catch_above_cp": 0, "catch_above_iv": 0, "logic": "or"}, "// Example of always catching Rattata:": {}, diff --git a/configs/config.json.path.example b/configs/config.json.path.example index 9bbba18ab0..6b6b6ca99d 100644 --- a/configs/config.json.path.example +++ b/configs/config.json.path.example @@ -78,24 +78,26 @@ "distance_unit": "km", "reconnecting_timeout": 15, "evolve_captured": "NONE", - "max_sleep" = 60, - "replicate_reticle_fail_delay" = false, - "reticle_fail_chance = 0.05", - "reticle_fail_max_trial" = 10, - "reticle_fail_max_sleep" = 10, - "jitter_ping" = 80, - "jitter_range" = 30, - "jitter_max_sleep" = 1.0, - "replicate_reflex" = false, - "reflex_time" = 270, - "reflex_range" = 100, - "reflex_max_sleep" = 1.0, - "replicate_gps_noise" = false, - "gps_noise_radius = 0.00075", - "replicate_ball_throw_reticle" = "human", - "catch_randomize_reticle_factor": 0.9, - "replicate_ball_throw_spin" = "human", - "catch_randomize_spin_factor": 0.9, + "replicator": { + "max_sleep" : 60, + "replicate_reticle_fail_delay": true, + "reticle_fail_chance" : 0.05, + "reticle_fail_max_trial" : 10, + "reticle_fail_max_sleep" : 10, + "jitter_ping" : 80, + "jitter_range" : 30, + "jitter_max_sleep" : 1.0, + "replicate_reflex" : true, + "reflex_time" : 270, + "reflex_range" : 100, + "reflex_max_sleep" : 1.0, + "replicate_gps_noise" : true, + "gps_noise_radius" : 0.00075, + "replicate_ball_throw_reticle" : "human", + "replicate_ball_throw_spin" : "human" + }, + "catch_randomize_reticle_factor": 1.0, + "catch_randomize_spin_factor": 1.0, "catch": { "any": {"catch_above_cp": 0, "catch_above_iv": 0, "logic": "or"}, "// Example of always catching Rattata:": {}, diff --git a/configs/config.json.pokemon.example b/configs/config.json.pokemon.example index 1acf7c76bd..d244957d9b 100644 --- a/configs/config.json.pokemon.example +++ b/configs/config.json.pokemon.example @@ -85,24 +85,26 @@ "distance_unit": "km", "reconnecting_timeout": 15, "evolve_captured": "NONE", - "max_sleep" = 60, - "replicate_reticle_fail_delay" = false, - "reticle_fail_chance = 0.05", - "reticle_fail_max_trial" = 10, - "reticle_fail_max_sleep" = 10, - "jitter_ping" = 80, - "jitter_range" = 30, - "jitter_max_sleep" = 1.0, - "replicate_reflex" = false, - "reflex_time" = 270, - "reflex_range" = 100, - "reflex_max_sleep" = 1.0, - "replicate_gps_noise" = false, - "gps_noise_radius = 0.00075", - "replicate_ball_throw_reticle" = "human", - "catch_randomize_reticle_factor": 0.9, - "replicate_ball_throw_spin" = "human", - "catch_randomize_spin_factor": 0.9, + "replicator": { + "max_sleep" : 60, + "replicate_reticle_fail_delay": true, + "reticle_fail_chance" : 0.05, + "reticle_fail_max_trial" : 10, + "reticle_fail_max_sleep" : 10, + "jitter_ping" : 80, + "jitter_range" : 30, + "jitter_max_sleep" : 1.0, + "replicate_reflex" : true, + "reflex_time" : 270, + "reflex_range" : 100, + "reflex_max_sleep" : 1.0, + "replicate_gps_noise" : true, + "gps_noise_radius" : 0.00075, + "replicate_ball_throw_reticle" : "human", + "replicate_ball_throw_spin" : "human" + }, + "catch_randomize_reticle_factor": 1.0, + "catch_randomize_spin_factor": 1.0, "catch": { "any": {"catch_above_cp": 0, "catch_above_iv": 0, "logic": "or" }, diff --git a/pokecli.py b/pokecli.py index da44f7f7ae..28377235c8 100644 --- a/pokecli.py +++ b/pokecli.py @@ -39,9 +39,10 @@ from geopy.exc import GeocoderQuotaExceeded from pokemongo_bot import PokemonGoBot, TreeConfigBuilder -from pokemongo_bot.config import Config +from pokemongo_bot.config import Config, get_config from pokemongo_bot.health_record import BotEvent + if sys.version_info >= (2, 7, 9): ssl._create_default_https_context = ssl._create_unverified_context @@ -60,7 +61,7 @@ def main(): config = init_config() if not config: return - Config().initialize(config) # initialize the singleton aswell + Config.initialize(config) # initialize the singleton aswell logger.info('Configuration initialized') health_record = BotEvent(config) @@ -387,9 +388,11 @@ def init_config(): config.action_wait_max = load.get('action_wait_max', 4) config.action_wait_min = load.get('action_wait_min', 1) config.raw_tasks = load.get('tasks', []) + config.replicator = load.get('replicator', {}) config.vips = load.get('vips', {}) + if config.map_object_cache_time < 0.0: parser.error("--map_object_cache_time is out of range! (should be >= 0.0)") return None diff --git a/pokemongo_bot/human_behaviour.py b/pokemongo_bot/human_behaviour.py index c85a03c5ad..ec03c07338 100644 --- a/pokemongo_bot/human_behaviour.py +++ b/pokemongo_bot/human_behaviour.py @@ -46,12 +46,12 @@ def sleep(seconds): General sleep with some lags. Configs: - "max_sleep" = 60, + "max_sleep": 60, ''' # some of the actions don't need reflex replication, so removed from here. wait_time = seconds + jitter_rng() - max_sleep = get_config('max_sleep', 60) + max_sleep = get_config('replicator.max_sleep', 60) time.sleep(min(wait_time, max_sleep)) @@ -63,17 +63,17 @@ def ball_throw_reticle_fail_delay(): Configs: "replicate_reticle_fail_delay" = false, - "reticle_fail_chance = 0.05", - "reticle_fail_max_trial" = 10, - "reticle_fail_max_sleep" = 10, + "reticle_fail_chance": 0.05, + "reticle_fail_max_trial": 10, + "reticle_fail_max_sleep": 10, ''' - if get_config('replicate_throw_reticle_fail_delay', False): - fail_prob = get_config('throw_reticle_fail_chance', 0.05) + if get_config('replicator.replicate_throw_reticle_fail_delay', False): + fail_prob = get_config('replicator.throw_reticle_fail_chance', 0.05) for trial in range(get_config('reticle_fail_max_trial', 10)): if fail_prob < random(): break - time.sleep(1.8*(trial+random()), get_config('reticle_fail_max_sleep', 10)) # should this be sleep? or time.sleep? + time.sleep(1.8*(trial+random()), get_config('replicator.reticle_fail_max_sleep', 10)) # should this be sleep? or time.sleep? def jitter_rng(): @@ -81,17 +81,17 @@ def jitter_rng(): Simulates jitter. Configs: - "replicate_jitter" = false, - "jitter_ping" = 80, - "jitter_range" = 30, - "jitter_max_sleep" = 1.0, + "replicate_jitter": false, + "jitter_ping": 80, + "jitter_range": 30, + "jitter_max_sleep": 1.0, ''' - replicate_jitter = get_config('replicate_jitter', False) + replicate_jitter = get_config('replicator.replicate_jitter', False) jitter = 0 if replicate_jitter: - ping = get_config('jitter_ping', 80) - ping_range = get_config('jitter_range', 30) + ping = get_config('replicator.jitter_ping', 80) + ping_range = get_config('replicator.jitter_range', 30) ping = int(ping / 10) * 10 ping_range = int(ping_range / 5) * 5 @@ -99,7 +99,7 @@ def jitter_rng(): ping_range = min(max(10, ping_range), 100) mu_, sigma = lognormal_model()[ping][ping_range] jitter = lognormal(mu_, sigma) - jitter = min(jitter, get_config('jitter_max_sleep', 1.0)) + jitter = min(jitter, get_config('replicator.jitter_max_sleep', 1.0)) return jitter @@ -108,18 +108,18 @@ def human_reflex_rng(): Simulates human reflexes. Configs: - "replicate_reflex" = false, - "reflex_time" = 270, - "reflex_range" = 100, - "reflex_max_sleep" = 1.0, + "replicate_reflex": false, + "reflex_time": 270, + "reflex_range": 100, + "reflex_max_sleep": 1.0, ''' reflex_time = 0 - if get_config('replicate_reflex', False): - reflex_mean = get_config('reflex_time', 270) - reflex_range = get_config('reflex_range', 100) + if get_config('replicator.replicate_reflex', False): + reflex_mean = get_config('replicator.reflex_time', 270) + reflex_range = get_config('replicator.reflex_range', 100) mu_, sigma = lognormal_model()[reflex_mean][reflex_range] - reflex_time = min(lognormal(mu_, sigma), get_config('reflex_max_sleep', 1.0)) + reflex_time = min(lognormal(mu_, sigma), get_config('replicator.reflex_max_sleep', 1.0)) return reflex_time @@ -128,15 +128,15 @@ def gps_noise_rng(): Simulates gps noise. This may cause problem, so we need test. Configs: - "replicate_gps_noise" = false, - "gps_noise_radius = 0.00075", + "replicate_gps_noise": false, + "gps_noise_radius": 0.00075, ''' - radius = get_config('gps_noise_radius', 0.00075) + radius = get_config('replicator.gps_noise_radius', 0.00075) lat_noise = 0 lng_noise = 0 alt_noise = 0 - if get_config('replicate_gps_noise', False): + if get_config('replicator.replicate_gps_noise', False): lat_noise = gauss(0, radius/3.0) lat_noise = min(max(-radius, lat_noise), radius) @@ -174,11 +174,11 @@ def normalized_reticle_size_rng(): Reticle rng. Configs: - "replicate_ball_throw_reticle" = "human", - "catch_randomize_reticle_factor" = 0.9, + "replicate_ball_throw_reticle": "human", + "catch_randomize_reticle_factor": 0.9, ''' - mode = get_config('replicate_ball_throw_reticle', 'human') + mode = get_config('replicator.replicate_ball_throw_reticle', 'human') factor = get_config('catch_randomize_reticle_factor', 0.9) if 'exact' == mode: @@ -208,7 +208,7 @@ def spin_modifier_rng(): "catch_randomize_spin_factor" = 0.9, ''' - mode = get_config('replicate_ball_throw_spin', 'human') + mode = get_config('replicator.replicate_ball_throw_spin', 'human') factor = get_config('catch_randomize_spin_factor', 0.9) if 'exact' == mode: From 9b1de99ddb072d03906978ed844c0715e80d55c2 Mon Sep 17 00:00:00 2001 From: "M.K" Date: Sun, 7 Aug 2016 18:07:15 +0900 Subject: [PATCH 11/12] Set default to not using random features, and added ballthrow fail thingies --- configs/config.json.cluster.example | 7 ++++--- configs/config.json.example | 7 ++++--- configs/config.json.map.example | 7 ++++--- configs/config.json.path.example | 7 ++++--- configs/config.json.pokemon.example | 7 ++++--- pokemongo_bot/__init__.py | 7 +++---- .../cell_workers/pokemon_catch_worker.py | 16 ++++++++++++---- pokemongo_bot/human_behaviour.py | 14 ++++++++++++++ 8 files changed, 49 insertions(+), 23 deletions(-) diff --git a/configs/config.json.cluster.example b/configs/config.json.cluster.example index 54ab34aec7..65f2e30c47 100644 --- a/configs/config.json.cluster.example +++ b/configs/config.json.cluster.example @@ -79,19 +79,20 @@ "evolve_captured": "NONE", "replicator": { "max_sleep" : 60, - "replicate_reticle_fail_delay": true, + "replicate_reticle_fail_delay": false, "reticle_fail_chance" : 0.05, "reticle_fail_max_trial" : 10, "reticle_fail_max_sleep" : 10, "jitter_ping" : 80, "jitter_range" : 30, "jitter_max_sleep" : 1.0, - "replicate_reflex" : true, + "replicate_reflex" : false, "reflex_time" : 270, "reflex_range" : 100, "reflex_max_sleep" : 1.0, - "replicate_gps_noise" : true, + "replicate_gps_noise" : false, "gps_noise_radius" : 0.00075, + "ball_throw_hit_success_chance": 1.0, "replicate_ball_throw_reticle" : "human", "replicate_ball_throw_spin" : "human" }, diff --git a/configs/config.json.example b/configs/config.json.example index eb3f4bf69a..99485d4568 100644 --- a/configs/config.json.example +++ b/configs/config.json.example @@ -87,19 +87,20 @@ "evolve_captured": "NONE", "replicator": { "max_sleep" : 60, - "replicate_reticle_fail_delay": true, + "replicate_reticle_fail_delay": false, "reticle_fail_chance" : 0.05, "reticle_fail_max_trial" : 10, "reticle_fail_max_sleep" : 10, "jitter_ping" : 80, "jitter_range" : 30, "jitter_max_sleep" : 1.0, - "replicate_reflex" : true, + "replicate_reflex" : false, "reflex_time" : 270, "reflex_range" : 100, "reflex_max_sleep" : 1.0, - "replicate_gps_noise" : true, + "replicate_gps_noise" : false, "gps_noise_radius" : 0.00075, + "ball_throw_hit_success_chance": 1.0, "replicate_ball_throw_reticle" : "human", "replicate_ball_throw_spin" : "human" }, diff --git a/configs/config.json.map.example b/configs/config.json.map.example index 1a5f9a933b..042e98d5ab 100644 --- a/configs/config.json.map.example +++ b/configs/config.json.map.example @@ -317,19 +317,20 @@ "evolve_captured": "NONE", "replicator": { "max_sleep" : 60, - "replicate_reticle_fail_delay": true, + "replicate_reticle_fail_delay": false, "reticle_fail_chance" : 0.05, "reticle_fail_max_trial" : 10, "reticle_fail_max_sleep" : 10, "jitter_ping" : 80, "jitter_range" : 30, "jitter_max_sleep" : 1.0, - "replicate_reflex" : true, + "replicate_reflex" : false, "reflex_time" : 270, "reflex_range" : 100, "reflex_max_sleep" : 1.0, - "replicate_gps_noise" : true, + "replicate_gps_noise" : false, "gps_noise_radius" : 0.00075, + "ball_throw_hit_success_chance": 1.0, "replicate_ball_throw_reticle" : "human", "replicate_ball_throw_spin" : "human" }, diff --git a/configs/config.json.path.example b/configs/config.json.path.example index 6b6b6ca99d..a4a53f14f3 100644 --- a/configs/config.json.path.example +++ b/configs/config.json.path.example @@ -80,18 +80,19 @@ "evolve_captured": "NONE", "replicator": { "max_sleep" : 60, - "replicate_reticle_fail_delay": true, + "replicate_reticle_fail_delay": false, "reticle_fail_chance" : 0.05, "reticle_fail_max_trial" : 10, "reticle_fail_max_sleep" : 10, "jitter_ping" : 80, "jitter_range" : 30, "jitter_max_sleep" : 1.0, - "replicate_reflex" : true, + "replicate_reflex" : false, "reflex_time" : 270, "reflex_range" : 100, "reflex_max_sleep" : 1.0, - "replicate_gps_noise" : true, + "replicate_gps_noise" : false, + "ball_throw_hit_success_chance": 1.0, "gps_noise_radius" : 0.00075, "replicate_ball_throw_reticle" : "human", "replicate_ball_throw_spin" : "human" diff --git a/configs/config.json.pokemon.example b/configs/config.json.pokemon.example index d244957d9b..e4e8b33b7a 100644 --- a/configs/config.json.pokemon.example +++ b/configs/config.json.pokemon.example @@ -87,19 +87,20 @@ "evolve_captured": "NONE", "replicator": { "max_sleep" : 60, - "replicate_reticle_fail_delay": true, + "replicate_reticle_fail_delay": false, "reticle_fail_chance" : 0.05, "reticle_fail_max_trial" : 10, "reticle_fail_max_sleep" : 10, "jitter_ping" : 80, "jitter_range" : 30, "jitter_max_sleep" : 1.0, - "replicate_reflex" : true, + "replicate_reflex" : false, "reflex_time" : 270, "reflex_range" : 100, "reflex_max_sleep" : 1.0, - "replicate_gps_noise" : true, + "replicate_gps_noise" : false, "gps_noise_radius" : 0.00075, + "ball_throw_hit_success_chance": 1.0, "replicate_ball_throw_reticle" : "human", "replicate_ball_throw_spin" : "human" }, diff --git a/pokemongo_bot/__init__.py b/pokemongo_bot/__init__.py index c3ce471e0a..f94f8e02ab 100644 --- a/pokemongo_bot/__init__.py +++ b/pokemongo_bot/__init__.py @@ -31,12 +31,11 @@ class PokemonGoBot(object): @property def position(self): - #return self.api._position_lat, self.api._position_lng, 0 return self.api.actual_lat, self.api.actual_lng, self.api.actual_alt - @position.setter - def position(self, position_tuple): - self.api._position_lat, self.api._position_lng, self.api._position_alt = position_tuple + #@position.setter # these should be called through api now that gps replication is there... + #def position(self, position_tuple): + # self.api._position_lat, self.api._position_lng, self.api._position_alt = position_tuple def __init__(self, config): self.config = config diff --git a/pokemongo_bot/cell_workers/pokemon_catch_worker.py b/pokemongo_bot/cell_workers/pokemon_catch_worker.py index aa08772c7d..999c55e577 100644 --- a/pokemongo_bot/cell_workers/pokemon_catch_worker.py +++ b/pokemongo_bot/cell_workers/pokemon_catch_worker.py @@ -1,8 +1,11 @@ # -*- coding: utf-8 -*- +from random import random import time +from pokemongo_bot.config import get_config from pokemongo_bot.human_behaviour import (normalized_reticle_size_rng, sleep, - spin_modifier_rng) + spin_modifier_rng, ball_throw_reticle_fail_delay, + ball_throw_hit_success_rng) from pokemongo_bot.cell_workers.base_task import BaseTask class PokemonCatchWorker(BaseTask): @@ -304,17 +307,22 @@ def work(self, response_dict=None): id_list1 = self.count_pokemon_inventory() reticle_size_parameter = normalized_reticle_size_rng() - spin_modifier_parameter = spin_modifier_rng() + # aiming delay... + ball_throw_reticle_fail_delay() + + # hit fail calc + hit_flag = ball_throw_hit_success_rng() + response_dict = self.api.catch_pokemon( encounter_id=encounter_id, pokeball=pokeball, normalized_reticle_size=reticle_size_parameter, spawn_point_id=self.spawn_point_guid, - hit_pokemon=1, + hit_pokemon=hit_flag, spin_modifier=spin_modifier_parameter, - normalized_hit_position=1 + normalized_hit_position=1 # randomnise this??? what are valid values??? ) if response_dict and \ diff --git a/pokemongo_bot/human_behaviour.py b/pokemongo_bot/human_behaviour.py index ec03c07338..5aff38dd09 100644 --- a/pokemongo_bot/human_behaviour.py +++ b/pokemongo_bot/human_behaviour.py @@ -148,6 +148,20 @@ def gps_noise_rng(): return lat_noise, lng_noise, alt_noise +def ball_throw_hit_success_rng(): + ''' + Returns 1 if hits. + + Configs: + "ball_throw_hit_success_chance": 1.0, + + ''' + ret = 0 + if random() < get_config('ball_throw_hit_success_chance', 1.0): + ret = 1 + return ret + + def aim_rng(target, std=0.05): ''' noise from the target point should be approximated by gaussian, From 7dec8e984ce7ccbb1322bfc948351039036754d7 Mon Sep 17 00:00:00 2001 From: "M.K" Date: Sun, 7 Aug 2016 18:13:18 +0900 Subject: [PATCH 12/12] minor fix --- pokemongo_bot/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pokemongo_bot/__init__.py b/pokemongo_bot/__init__.py index f94f8e02ab..bf5b4a16b4 100644 --- a/pokemongo_bot/__init__.py +++ b/pokemongo_bot/__init__.py @@ -547,7 +547,7 @@ def check_session(self, position): self.logger.info("Session stale, re-logging in", 'yellow') position = self.position self.api = ApiWrapper() - self.position = position + self.api.set_position(*position) self.login() @staticmethod