From d635fed0ae22b7838548f58b2c1a6dabf246b8a5 Mon Sep 17 00:00:00 2001 From: ltcptgeneral <35508619+ltcptgeneral@users.noreply.github.com> Date: Thu, 9 Apr 2020 22:16:26 -0500 Subject: [PATCH] analysis pkg v 1.0.0.10 analysis.py v 1.1.13.008 superscript.py v 0.0.5.001 --- .../analysis-amd64/analysis.egg-info/PKG-INFO | 2 +- .../analysis.egg-info/SOURCES.txt | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 151 -> 166 bytes .../__pycache__/analysis.cpython-37.pyc | Bin 26762 -> 23330 bytes .../__pycache__/glicko2.cpython-37.pyc | Bin 0 -> 3700 bytes .../__pycache__/trueskill.cpython-37.pyc | Bin 32169 -> 32184 bytes .../analysis-amd64/analysis/analysis.py | 109 +----------------- .../analysis-amd64/analysis/glicko2.py | 99 ++++++++++++++++ .../build/lib/analysis/analysis.py | 109 +----------------- .../build/lib/analysis/glicko2.py | 99 ++++++++++++++++ .../dist/analysis-1.0.0.10-py3-none-any.whl | Bin 0 -> 20742 bytes .../dist/analysis-1.0.0.10.tar.gz | Bin 0 -> 18950 bytes analysis-master/analysis-amd64/setup.py | 2 +- data analysis/requirements.txt | 4 + data analysis/superscript.py | 8 +- 15 files changed, 222 insertions(+), 211 deletions(-) create mode 100644 analysis-master/analysis-amd64/analysis/__pycache__/glicko2.cpython-37.pyc create mode 100644 analysis-master/analysis-amd64/analysis/glicko2.py create mode 100644 analysis-master/analysis-amd64/build/lib/analysis/glicko2.py create mode 100644 analysis-master/analysis-amd64/dist/analysis-1.0.0.10-py3-none-any.whl create mode 100644 analysis-master/analysis-amd64/dist/analysis-1.0.0.10.tar.gz create mode 100644 data analysis/requirements.txt diff --git a/analysis-master/analysis-amd64/analysis.egg-info/PKG-INFO b/analysis-master/analysis-amd64/analysis.egg-info/PKG-INFO index 6db62a2e..a9c6413a 100644 --- a/analysis-master/analysis-amd64/analysis.egg-info/PKG-INFO +++ b/analysis-master/analysis-amd64/analysis.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: analysis -Version: 1.0.0.9 +Version: 1.0.0.10 Summary: analysis package developed by Titan Scouting for The Red Alliance Home-page: https://github.com/titanscout2022/tr2022-strategy Author: The Titan Scouting Team diff --git a/analysis-master/analysis-amd64/analysis.egg-info/SOURCES.txt b/analysis-master/analysis-amd64/analysis.egg-info/SOURCES.txt index b7f40198..25a54640 100644 --- a/analysis-master/analysis-amd64/analysis.egg-info/SOURCES.txt +++ b/analysis-master/analysis-amd64/analysis.egg-info/SOURCES.txt @@ -1,6 +1,7 @@ setup.py analysis/__init__.py analysis/analysis.py +analysis/glicko2.py analysis/regression.py analysis/titanlearn.py analysis/trueskill.py diff --git a/analysis-master/analysis-amd64/analysis/__pycache__/__init__.cpython-37.pyc b/analysis-master/analysis-amd64/analysis/__pycache__/__init__.cpython-37.pyc index fc74077cd72d529e7f6a0a61e6bdab4ce899d9e6..58e435d647c201f89a2ea771b73275d3a98ad37a 100644 GIT binary patch delta 34 ocmbQvxQvn8iIz>% delta 27 hcmZ3+IGvH(iI7~ygCnhX7GWnpwQH+ zG3vJ3#HO*fv8j33N~>*6W74E)Y7<+vNt;R1q+KiR>JL}CR=VP9`=@)KD>EQy(!%1q z`+R4g?|f(9d(XM-yUI?TXU;l@BT>Ph3m-iC&>rouGn17Zp0>0v+h_J$yzxxonLNv9 z^;+>d$!GN^coS}MiC&xRvwQ7$&GFgWj9iD;A=?hwo{Tz9ZxT})6h4LL4k|oXOCE^x zrtqmeZcy>2Y6(1#=Rd-D0iQ6a3@~pRF@2IML+Vjl9iVp_7Qm~b+fO`uo@@A=i zKDVMn4XC~yAw3igO1pQ6EKDte{=(~Q`cPX@5o7m2Z}E0^KYUVrjx8BFJuRIv&(I6g zGve45xIXhZ+X-7rcC-C(qvRwzH*|1T3uEhsJ}jNi*h`R5mLFe-f?;Jdl$D)jm*K;* zQs#xE@}2hAn4*L%*r}M3;aK_0Y#p@EE?_E@SEiX0kiG&(XMf7xhy8OxtP9H9GtC>2 z{WIiLc=I-66iM}KYM?Xp#U52?yi*e*DBN*k3w8-3pJVtDG*(W5YZXgVX^ik8j84*! z`8y_6B1M8~S zniLaUs_tNB$eFj6B|`7KhgcH4gXkKnzPE|7ZO~s+nHaHb(L_M=q19Jwrm`&fsAg}* zPLzr`^{^(?FczyjxDD&I3kK#_7Jh|he3;;?1bYc6U3`sT7r}tMDGm$^;Ggr)uwC%v zeIfTA>LQPBhbY5K#Nt!eYrc?pggOoqJW6l~YVNPGbWylj3OO;H0Y~pYJyB-T6mF}S zO$mnyjzCN8jGUN!ij)^XeR9NZI9^-K`r*ae$(cuq{W`%hg5v~j2(Y_3-JFC$B{&v9 z{m7Y4QqC!Y-2_h%e4F4~1Wyw5BaHS$>^I@B3#K$mWAs?KZyEDYpPb+%MW3xK4AaoO zuo(6IwsUv2>F|LVcDd{(zN@uRkQ4 z!-li(?ig+?v9S*L*OF6nZZ{g0P$CloLE#_ABwVSV*c7YZT|5ojQN++^710q%+z|A4 z`!v562y3vap`_y}9ODtE5wVEW5YHgAdEDk$OZ;FA)#j;p$BS&rpG1&DaE9P4!8w8- z8Cy~c#!H88HY74O0H($nxc$#+oMQPhrSw8e<7C_$f{ha!MuReo7#>nx9d0k-$)*=mmmZa>I~2BmAwgis@)06RMUu9Ni{7Kk!enn#3h&S$3^2 zI^F*>4+`O?E%%_G)5I?lktF0gXbD29FQ(`YtH@Er=UB#ecze0K_9fD(CU}|P7YJ?j z;uVTtMex*%UsC)U#ds@kyERmVELhXzOx`-82*1K)Sl6Bb`ljJgrV4*&D6ERGd`U;|aPY+HnSHUf zX5W5TUnjAH1cwNIPw*DO+XxZ6U)|ohQB%V`LJNsM5dTNwQ~i3NQ}=iG2tB-`Gt}+V z!{Qz4jS%z`L=B2}^QbNNkMWKjsylrSWTjznnr4^X%B7xNSmEVu)ZhL71S2U@Jief~UIfSDIb< zAy(NY7A+wq;7lkbFD$1?Q-?SuN(c>U0u7;ogcOpJq_=5H^C-}eKxo3p*YeT+XYTIR z>fwH+t8f21bLQNc|C~8#i*{rQ9($ zZ{$l;?h#MS!!(qeQr?(PJ^e91p374HeYQLh3#fWP)tgflBf(gRY5f{s&ReE5-eOjs zHeyx$5^hXsv1-%9SMZg0G2Y5uQ`%`3t8pZ&xSJ$}Sgj*k%{@w~&XKI)UL^_hwcLje z>-jqF$8!l^&jWZi@CdKKGYA5g@*oHVPwTNp)Gp&8)Iz8=sopk##N~XW>TRhbxq=rq zDbX@V)W+MDq}h>N$vc!}xg)uXZ&s2PN7Bi=l;jd6A&YP1+j->_gUu@(*-gBMS1H-b zlI$@5ecs2bm9VuW>ze(t2pzz#E{^a9W?)t!G!tr&r}zx7@zEqxL`|ok*R^CbJtyPl+Z(#cKJH z)jweCW{#{`!`Mdop|vO3R_R^$Mb)phlZ?V5RZ{St#6l`md)ADfVc4ew)jN_P2K z_R!3^%l9xApZV>^^^AQ(F5lGZ?nZ|>*|+Hn>?!%irj5*!YuauLev4^Z)`KQZuapnA zJPeA) zS-Xk)&t?3o7Wq=gwYA5nbp#MG#C*-e5WfV?j_RYNMI8%zTO5|JbvC+bu~_o4t3Ku# zCSlnSr2cF9-pvOtq3&bVLz(p9@oX}aj*ldAB6)I=u|}czy1dZ2N?zUB0p{t>+Ncgj_nDiLa&^VuO64t4(IEUcvnG zo~v(RmGV_!-Awdd157@!rL9W5A9|MOm?_d`3YJ(~RcE1$qB9S6%amXcB)!a0kH$2uNMrNl+k|BA7RIA;?-~VC#8SkYC=KjhrT(3P2M+h-codo+B+C)!EXnD_{_sW;v)KfitLmG48{sz}GvW^(w*p^V5{Y}E3epjs{~?j`L%A-Ip= zPYL$P#O6kK6^b2lRk!RbAAXt?K1Dzd7M~V(xLcZ1Aa-CvJVHPQ} zjZ&K$;Q!cjk+B?l_gZOg4!f(-!8UpB-LHCVn)1G$)t;h%9`9*gJL{jIy&Pyp%AE9B zs{Vx>>#g%R#y3=0zTxpiHk(YOuamtyK3nSh^&K0ccHi{Yc|a_*Ydn=prZXeSL@L@N zc2UFZn4v|-{5&aLAo#+(f#t`0Lu^ohxw=)pu?IKj%%&a-}n343BCa+*`{))>b;kmE@D}SCf>1WC*&)?7rE?l>a~mD zZwS5#*w-hXpz^l>(LV7cmH!qXS6*LNbi%QL>d<(Z6TU6)7V;EvsJ{N6u)0EvV-;DO!y@ss7 z?o8^GonTJO)4RLn^m_)jsNTqv3p>(nvdYbiF#e!izk93Qcdca%_Vj(AjP7?q_l|zm z`Qj{#oj;9{=Wl~V{7k7YO`m9$ZM*8^*q+v+!#}sjAG*8Lj;MP^KE7v3^;6W-cL=^q z@Qe!3xA#=n-A1ZD$b5RGhyKL(;D-c10$9P3#L4(!Gm#q?W>)-|i4+UCM$i zpbJwzc;ko5_JS(07)PQf{+YmGCH{q~7pH;NxxOLwe*(nn2NP+Y8R^Tw%G@9&OL=R+ zRVdqf)jT)Z&WqA}YNi$=<~Z-2vnx9~{Tasaicix>%3FmniWe4oYY1ZJW1!THZ*&rDtK{{#BWbv(HtXfp4}Fkk^iCoP{;6H)wdzhz@t0`%-J?n-81aNeZP1v#R6$ zspQbHOnW?zBX=@A9AP3Qf3q`O7&dc*O7bZAiu%>qL`_k9qtiO1TF^*O`l``s9p)Kl zjTn0wc*HesGf?9a4aEY3y#URKZZG?rQ7$De`PNSVv22OM*U|F=4o>Uh9-u%gc>vby z%KGB4R4WwFL zrs;Y47R>02kF?zW%RP@=*goV!FZ7`&#iw#~3krGdESx>f7?oIFS0w{Z*Ok**6x+~G zp(lPpa1c<3!X~7mt63sCm$!=>ZmC6V)X@loaOp+zUNLXFUoz zkib`m?+wnT^@=@VgxSeb(3D;P27Z5mv%H*z>v;hc{erdT0E%S=#4sa z0l%p5*o$Yj5ipGR4^~eytVIoL5!}w`V=h_^a~Gmoby$YC;2m)d!Q8`1LBt{aQOWNf zZ6Z?g`}iowT|GXUN}Mvq#%ofUp+qXX4TWSjH-ziNw#C^|7FO(nHamwIbFxDjsluYH z6saH2k`kT7oMK8W0YpNU9zSk*al1ZoVS(e0SQZ z$*UGh!K$#+W1P&gyo0@VA($B_BTc);Fj&qU8QnWRB4`TcIZ@mS+4Dq~*x^?vR;dSB zE%WJXbr+tMY&DyxU(~OKA>;$~p=3krQblwx5(H?j`}2Wg#yw1Q zjl7Rk5bs7wC9LHumQi$-NtC9CiC+8)@FE3JGYT4lrkaJBhq;(b52Dtr_ZjbEy{uZF zs49g~G5DSMnUfKBqZf)FBr5o0L88)~L{%tdD&r!Vsur2bMTtr6wD$6I&8{i&Ym6jb z1>hR5cAmvN^IK9{Y~lQluFr3i;dJL9!)sYPo2Yb*RNfpis1YApAEc<(2<>jL(Ks2M zW8*fJ<8_$hQi&IcyzkB%IpZv4e>ZF=8TJdThypC*M&4b_%*Gh(Mcr6N_PWYKN2Q>M zr_6FP+720&Yse93pXUR|@|c?v$j;fBw%U{+Q$daa_mRKUN5L9Kp9Cr4s;+cB29ZNyzQLa_T0GfK7 zt(e+UoP$agPx5#=lZ(^dXXeZ$Wdk&nCTpG!9nk&_U5gh9UIIkI^MCAmgPQ)8;HLn~ zH!3otrpTQV>InC9YWM}<3ZYJOFH>D@b+=N9@`m^w0mYG8hxUqmi*C(@dI-Nlt7`=c zKHa7J44)AwV!-2b`D%R)KCjQ`bNgJ83X!Ewas)RJj1wFuI6*+0TXbJkRU+Ofe(h1> z+e->j%+m*{^2Y>sQF4t&{I*DG-cRz60-{mzF)D8+_&5NUP9>nS-K)}7?e+`!>G}uM zNPXMKOFO1#M;BBCD|Ajw`=XIm)%H8)|MHGJy1!38vA?y(@|FHorT!}S*AldavY^ilQ69XhcJ>NFq|Nj8}uTiHqaD=oCU$zFjOd! znq4^(u{;!Zul;fA)$Fa8o{A!WM$d~L0_0E#`3Hg=+J4_Gxuz(Y#Jri=`SHH*y*F>> zqgt&j@cYX*fBfusRUy7*XZ~~0_z)#}8A1y!2cj)L7FucNsnE_7)s|X56ixRG<6^f< zIsfHr|9~%{z)aCrTDF~Rb=%dh_MVEi7ZyS{^srY^7jzL{eC_KJ>Jmo$u!NDa-qJO_ z@>I4fdR4Dstg5f*b<{O|Ro79k=xh2V)T_FoH&CzX>-uHXSM;X7fqGrPqHm(Us$T`( z*V5w0gMRnRVXK$H{pN$NoB?O8P=0|Dtw1DVAI$4u-4Iyo?Dp>b^&jtj|IhHl{=YpT znlfDrX1fJ}>BRlR9=^FzIQaZ;!eEB@VfX&~d!Lx$e%Otpz1XyFw_3NN7<0qk>0als zGdPX<(XE3{6o=+{zjL79y_0wMdKu#F(P>)hh4BNcsX&y3E9Cgf48?Xn+O;DXWSx^* zM<;>fHb7|;^a8ln60>}Ac1>yM!=^GWsN?Cd#%PxJ6mF$la!6Xj@Z* zNS(*SLDS7_;qxobtT2SK4AKvR{$W23f|oED(OE*3Wm%5b<`$YyIOm%p=2>iSp%DWS zih_?EEvIVMcG+%-sRT;LqEx$QjIXAbx(A*33xxlXiBo4Z{L0$W0(^lBtHH>GSu{V` zxq(eGPpWY}$GI>ewceNqv;yp3(j>ey2)D`Ed%EvO0)sd z!}3RK6Nz&yaE<}(&+5qK5juZ}ZBR5-sDcEY(QWZQ-i@{;|)o+G_EdCoDrEYVLf?;oiFZE34uotGzAUwpf9?JbJ zwH33}R>@LZKw4?>!A{nw4v%S?FzZQZi^GG_!{dWg_LtD6wR4u*g64?og<6p-sw&r| zuij8D>J|CA9ACTCzFk^?KV~P|z()2C=xRA(blC{bqIOb<I!7}V+ zA;jF8xp+o>}ncadR#seu7;XH^@}5 z#Dz?yE@Ud_1(|9cnaX8mviEa#`dq_{%e+dlMe!O$GdoS@GMl`?Ni@td?VsY?uTUc1 zWu(0>TXMXTQ?zF6(n0+3RB)m_8GC4ep>wi(j^RC<;T71pHt#|r>wAe4JI|Q=Juv4t z+!i(jZHLL**KH*f(3HkZI8+0{xW?! zo1Tj78{E>b%eUpYoEzYAPM$`{$#Y{|c)XlJ1hnALDITf3s1v;G>LAz#X>X=(E|1=IZ;ah}psHR{ivW^Hv5hsqy-%m`g_5nb*GWA3-5Ief!0t(#SfHEv!{ z@jyH5;C>0xau6I0_3?o1Y7iV9cLv#rxyAWB*!BsS`Xe(Og(f~Vj097m;IlA$1@d8U zk(;;JVoEVQV1{94&uHfJciH7_vmki14DWviM6?CrBlY->@04eb8XpQaK$Q{bU7%(}J#e_{aF*n7`WOENobva|yW{#SLi~vuG B4gmlF delta 40 vcmdn-n{nlDMs6owUM>b8NMcXl$Q{bU=r}o%#bommmZEaTTbspe7BT_=@hc1^ diff --git a/analysis-master/analysis-amd64/analysis/analysis.py b/analysis-master/analysis-amd64/analysis/analysis.py index 08871456..3651680f 100644 --- a/analysis-master/analysis-amd64/analysis/analysis.py +++ b/analysis-master/analysis-amd64/analysis/analysis.py @@ -7,10 +7,12 @@ # current benchmark of optimization: 1.33 times faster # setup: -__version__ = "1.1.13.007" +__version__ = "1.1.13.008" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 1.1.13.008: + - moved Glicko2 to a seperate package 1.1.13.007: - fixed bug with trueskill 1.1.13.006: @@ -271,7 +273,6 @@ __all__ = [ 'SVM', 'random_forest_classifier', 'random_forest_regressor', - 'Glicko2', # all statistics functions left out due to integration in other functions ] @@ -280,6 +281,7 @@ __all__ = [ # imports (now in alphabetical order! v 1.0.3.006): import csv +from analysis import glicko2 as Glicko2 import numba from numba import jit import numpy as np @@ -452,7 +454,7 @@ def elo(starting_score, opposing_score, observed, N, K): def glicko2(starting_score, starting_rd, starting_vol, opposing_score, opposing_rd, observations): - player = Glicko2(rating = starting_score, rd = starting_rd, vol = starting_vol) + player = Glicko2.Glicko2(rating = starting_score, rd = starting_rd, vol = starting_vol) player.update_player([x for x in opposing_score], [x for x in opposing_rd], observations) @@ -690,103 +692,4 @@ def random_forest_regressor(data, outputs, test_size, n_estimators="warn", crite kernel.fit(data_train, outputs_train) predictions = kernel.predict(data_test) - return kernel, RegressionMetrics(predictions, outputs_test) - -class Glicko2: - - _tau = 0.5 - - def getRating(self): - return (self.__rating * 173.7178) + 1500 - - def setRating(self, rating): - self.__rating = (rating - 1500) / 173.7178 - - rating = property(getRating, setRating) - - def getRd(self): - return self.__rd * 173.7178 - - def setRd(self, rd): - self.__rd = rd / 173.7178 - - rd = property(getRd, setRd) - - def __init__(self, rating = 1500, rd = 350, vol = 0.06): - - self.setRating(rating) - self.setRd(rd) - self.vol = vol - - def _preRatingRD(self): - - self.__rd = math.sqrt(math.pow(self.__rd, 2) + math.pow(self.vol, 2)) - - def update_player(self, rating_list, RD_list, outcome_list): - - rating_list = [(x - 1500) / 173.7178 for x in rating_list] - RD_list = [x / 173.7178 for x in RD_list] - - v = self._v(rating_list, RD_list) - self.vol = self._newVol(rating_list, RD_list, outcome_list, v) - self._preRatingRD() - - self.__rd = 1 / math.sqrt((1 / math.pow(self.__rd, 2)) + (1 / v)) - - tempSum = 0 - for i in range(len(rating_list)): - tempSum += self._g(RD_list[i]) * \ - (outcome_list[i] - self._E(rating_list[i], RD_list[i])) - self.__rating += math.pow(self.__rd, 2) * tempSum - - - def _newVol(self, rating_list, RD_list, outcome_list, v): - - i = 0 - delta = self._delta(rating_list, RD_list, outcome_list, v) - a = math.log(math.pow(self.vol, 2)) - tau = self._tau - x0 = a - x1 = 0 - - while x0 != x1: - # New iteration, so x(i) becomes x(i-1) - x0 = x1 - d = math.pow(self.__rating, 2) + v + math.exp(x0) - h1 = -(x0 - a) / math.pow(tau, 2) - 0.5 * math.exp(x0) \ - / d + 0.5 * math.exp(x0) * math.pow(delta / d, 2) - h2 = -1 / math.pow(tau, 2) - 0.5 * math.exp(x0) * \ - (math.pow(self.__rating, 2) + v) \ - / math.pow(d, 2) + 0.5 * math.pow(delta, 2) * math.exp(x0) \ - * (math.pow(self.__rating, 2) + v - math.exp(x0)) / math.pow(d, 3) - x1 = x0 - (h1 / h2) - - return math.exp(x1 / 2) - - def _delta(self, rating_list, RD_list, outcome_list, v): - - tempSum = 0 - for i in range(len(rating_list)): - tempSum += self._g(RD_list[i]) * (outcome_list[i] - self._E(rating_list[i], RD_list[i])) - return v * tempSum - - def _v(self, rating_list, RD_list): - - tempSum = 0 - for i in range(len(rating_list)): - tempE = self._E(rating_list[i], RD_list[i]) - tempSum += math.pow(self._g(RD_list[i]), 2) * tempE * (1 - tempE) - return 1 / tempSum - - def _E(self, p2rating, p2RD): - - return 1 / (1 + math.exp(-1 * self._g(p2RD) * \ - (self.__rating - p2rating))) - - def _g(self, RD): - - return 1 / math.sqrt(1 + 3 * math.pow(RD, 2) / math.pow(math.pi, 2)) - - def did_not_compete(self): - - self._preRatingRD() + return kernel, RegressionMetrics(predictions, outputs_test) \ No newline at end of file diff --git a/analysis-master/analysis-amd64/analysis/glicko2.py b/analysis-master/analysis-amd64/analysis/glicko2.py new file mode 100644 index 00000000..66c0df94 --- /dev/null +++ b/analysis-master/analysis-amd64/analysis/glicko2.py @@ -0,0 +1,99 @@ +import math + +class Glicko2: + _tau = 0.5 + + def getRating(self): + return (self.__rating * 173.7178) + 1500 + + def setRating(self, rating): + self.__rating = (rating - 1500) / 173.7178 + + rating = property(getRating, setRating) + + def getRd(self): + return self.__rd * 173.7178 + + def setRd(self, rd): + self.__rd = rd / 173.7178 + + rd = property(getRd, setRd) + + def __init__(self, rating = 1500, rd = 350, vol = 0.06): + + self.setRating(rating) + self.setRd(rd) + self.vol = vol + + def _preRatingRD(self): + + self.__rd = math.sqrt(math.pow(self.__rd, 2) + math.pow(self.vol, 2)) + + def update_player(self, rating_list, RD_list, outcome_list): + + rating_list = [(x - 1500) / 173.7178 for x in rating_list] + RD_list = [x / 173.7178 for x in RD_list] + + v = self._v(rating_list, RD_list) + self.vol = self._newVol(rating_list, RD_list, outcome_list, v) + self._preRatingRD() + + self.__rd = 1 / math.sqrt((1 / math.pow(self.__rd, 2)) + (1 / v)) + + tempSum = 0 + for i in range(len(rating_list)): + tempSum += self._g(RD_list[i]) * \ + (outcome_list[i] - self._E(rating_list[i], RD_list[i])) + self.__rating += math.pow(self.__rd, 2) * tempSum + + + def _newVol(self, rating_list, RD_list, outcome_list, v): + + i = 0 + delta = self._delta(rating_list, RD_list, outcome_list, v) + a = math.log(math.pow(self.vol, 2)) + tau = self._tau + x0 = a + x1 = 0 + + while x0 != x1: + # New iteration, so x(i) becomes x(i-1) + x0 = x1 + d = math.pow(self.__rating, 2) + v + math.exp(x0) + h1 = -(x0 - a) / math.pow(tau, 2) - 0.5 * math.exp(x0) \ + / d + 0.5 * math.exp(x0) * math.pow(delta / d, 2) + h2 = -1 / math.pow(tau, 2) - 0.5 * math.exp(x0) * \ + (math.pow(self.__rating, 2) + v) \ + / math.pow(d, 2) + 0.5 * math.pow(delta, 2) * math.exp(x0) \ + * (math.pow(self.__rating, 2) + v - math.exp(x0)) / math.pow(d, 3) + x1 = x0 - (h1 / h2) + + return math.exp(x1 / 2) + + def _delta(self, rating_list, RD_list, outcome_list, v): + + tempSum = 0 + for i in range(len(rating_list)): + tempSum += self._g(RD_list[i]) * (outcome_list[i] - self._E(rating_list[i], RD_list[i])) + return v * tempSum + + def _v(self, rating_list, RD_list): + + tempSum = 0 + for i in range(len(rating_list)): + tempE = self._E(rating_list[i], RD_list[i]) + tempSum += math.pow(self._g(RD_list[i]), 2) * tempE * (1 - tempE) + return 1 / tempSum + + def _E(self, p2rating, p2RD): + + return 1 / (1 + math.exp(-1 * self._g(p2RD) * \ + (self.__rating - p2rating))) + + def _g(self, RD): + + return 1 / math.sqrt(1 + 3 * math.pow(RD, 2) / math.pow(math.pi, 2)) + + def did_not_compete(self): + + self._preRatingRD() \ No newline at end of file diff --git a/analysis-master/analysis-amd64/build/lib/analysis/analysis.py b/analysis-master/analysis-amd64/build/lib/analysis/analysis.py index 08871456..3651680f 100644 --- a/analysis-master/analysis-amd64/build/lib/analysis/analysis.py +++ b/analysis-master/analysis-amd64/build/lib/analysis/analysis.py @@ -7,10 +7,12 @@ # current benchmark of optimization: 1.33 times faster # setup: -__version__ = "1.1.13.007" +__version__ = "1.1.13.008" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 1.1.13.008: + - moved Glicko2 to a seperate package 1.1.13.007: - fixed bug with trueskill 1.1.13.006: @@ -271,7 +273,6 @@ __all__ = [ 'SVM', 'random_forest_classifier', 'random_forest_regressor', - 'Glicko2', # all statistics functions left out due to integration in other functions ] @@ -280,6 +281,7 @@ __all__ = [ # imports (now in alphabetical order! v 1.0.3.006): import csv +from analysis import glicko2 as Glicko2 import numba from numba import jit import numpy as np @@ -452,7 +454,7 @@ def elo(starting_score, opposing_score, observed, N, K): def glicko2(starting_score, starting_rd, starting_vol, opposing_score, opposing_rd, observations): - player = Glicko2(rating = starting_score, rd = starting_rd, vol = starting_vol) + player = Glicko2.Glicko2(rating = starting_score, rd = starting_rd, vol = starting_vol) player.update_player([x for x in opposing_score], [x for x in opposing_rd], observations) @@ -690,103 +692,4 @@ def random_forest_regressor(data, outputs, test_size, n_estimators="warn", crite kernel.fit(data_train, outputs_train) predictions = kernel.predict(data_test) - return kernel, RegressionMetrics(predictions, outputs_test) - -class Glicko2: - - _tau = 0.5 - - def getRating(self): - return (self.__rating * 173.7178) + 1500 - - def setRating(self, rating): - self.__rating = (rating - 1500) / 173.7178 - - rating = property(getRating, setRating) - - def getRd(self): - return self.__rd * 173.7178 - - def setRd(self, rd): - self.__rd = rd / 173.7178 - - rd = property(getRd, setRd) - - def __init__(self, rating = 1500, rd = 350, vol = 0.06): - - self.setRating(rating) - self.setRd(rd) - self.vol = vol - - def _preRatingRD(self): - - self.__rd = math.sqrt(math.pow(self.__rd, 2) + math.pow(self.vol, 2)) - - def update_player(self, rating_list, RD_list, outcome_list): - - rating_list = [(x - 1500) / 173.7178 for x in rating_list] - RD_list = [x / 173.7178 for x in RD_list] - - v = self._v(rating_list, RD_list) - self.vol = self._newVol(rating_list, RD_list, outcome_list, v) - self._preRatingRD() - - self.__rd = 1 / math.sqrt((1 / math.pow(self.__rd, 2)) + (1 / v)) - - tempSum = 0 - for i in range(len(rating_list)): - tempSum += self._g(RD_list[i]) * \ - (outcome_list[i] - self._E(rating_list[i], RD_list[i])) - self.__rating += math.pow(self.__rd, 2) * tempSum - - - def _newVol(self, rating_list, RD_list, outcome_list, v): - - i = 0 - delta = self._delta(rating_list, RD_list, outcome_list, v) - a = math.log(math.pow(self.vol, 2)) - tau = self._tau - x0 = a - x1 = 0 - - while x0 != x1: - # New iteration, so x(i) becomes x(i-1) - x0 = x1 - d = math.pow(self.__rating, 2) + v + math.exp(x0) - h1 = -(x0 - a) / math.pow(tau, 2) - 0.5 * math.exp(x0) \ - / d + 0.5 * math.exp(x0) * math.pow(delta / d, 2) - h2 = -1 / math.pow(tau, 2) - 0.5 * math.exp(x0) * \ - (math.pow(self.__rating, 2) + v) \ - / math.pow(d, 2) + 0.5 * math.pow(delta, 2) * math.exp(x0) \ - * (math.pow(self.__rating, 2) + v - math.exp(x0)) / math.pow(d, 3) - x1 = x0 - (h1 / h2) - - return math.exp(x1 / 2) - - def _delta(self, rating_list, RD_list, outcome_list, v): - - tempSum = 0 - for i in range(len(rating_list)): - tempSum += self._g(RD_list[i]) * (outcome_list[i] - self._E(rating_list[i], RD_list[i])) - return v * tempSum - - def _v(self, rating_list, RD_list): - - tempSum = 0 - for i in range(len(rating_list)): - tempE = self._E(rating_list[i], RD_list[i]) - tempSum += math.pow(self._g(RD_list[i]), 2) * tempE * (1 - tempE) - return 1 / tempSum - - def _E(self, p2rating, p2RD): - - return 1 / (1 + math.exp(-1 * self._g(p2RD) * \ - (self.__rating - p2rating))) - - def _g(self, RD): - - return 1 / math.sqrt(1 + 3 * math.pow(RD, 2) / math.pow(math.pi, 2)) - - def did_not_compete(self): - - self._preRatingRD() + return kernel, RegressionMetrics(predictions, outputs_test) \ No newline at end of file diff --git a/analysis-master/analysis-amd64/build/lib/analysis/glicko2.py b/analysis-master/analysis-amd64/build/lib/analysis/glicko2.py new file mode 100644 index 00000000..66c0df94 --- /dev/null +++ b/analysis-master/analysis-amd64/build/lib/analysis/glicko2.py @@ -0,0 +1,99 @@ +import math + +class Glicko2: + _tau = 0.5 + + def getRating(self): + return (self.__rating * 173.7178) + 1500 + + def setRating(self, rating): + self.__rating = (rating - 1500) / 173.7178 + + rating = property(getRating, setRating) + + def getRd(self): + return self.__rd * 173.7178 + + def setRd(self, rd): + self.__rd = rd / 173.7178 + + rd = property(getRd, setRd) + + def __init__(self, rating = 1500, rd = 350, vol = 0.06): + + self.setRating(rating) + self.setRd(rd) + self.vol = vol + + def _preRatingRD(self): + + self.__rd = math.sqrt(math.pow(self.__rd, 2) + math.pow(self.vol, 2)) + + def update_player(self, rating_list, RD_list, outcome_list): + + rating_list = [(x - 1500) / 173.7178 for x in rating_list] + RD_list = [x / 173.7178 for x in RD_list] + + v = self._v(rating_list, RD_list) + self.vol = self._newVol(rating_list, RD_list, outcome_list, v) + self._preRatingRD() + + self.__rd = 1 / math.sqrt((1 / math.pow(self.__rd, 2)) + (1 / v)) + + tempSum = 0 + for i in range(len(rating_list)): + tempSum += self._g(RD_list[i]) * \ + (outcome_list[i] - self._E(rating_list[i], RD_list[i])) + self.__rating += math.pow(self.__rd, 2) * tempSum + + + def _newVol(self, rating_list, RD_list, outcome_list, v): + + i = 0 + delta = self._delta(rating_list, RD_list, outcome_list, v) + a = math.log(math.pow(self.vol, 2)) + tau = self._tau + x0 = a + x1 = 0 + + while x0 != x1: + # New iteration, so x(i) becomes x(i-1) + x0 = x1 + d = math.pow(self.__rating, 2) + v + math.exp(x0) + h1 = -(x0 - a) / math.pow(tau, 2) - 0.5 * math.exp(x0) \ + / d + 0.5 * math.exp(x0) * math.pow(delta / d, 2) + h2 = -1 / math.pow(tau, 2) - 0.5 * math.exp(x0) * \ + (math.pow(self.__rating, 2) + v) \ + / math.pow(d, 2) + 0.5 * math.pow(delta, 2) * math.exp(x0) \ + * (math.pow(self.__rating, 2) + v - math.exp(x0)) / math.pow(d, 3) + x1 = x0 - (h1 / h2) + + return math.exp(x1 / 2) + + def _delta(self, rating_list, RD_list, outcome_list, v): + + tempSum = 0 + for i in range(len(rating_list)): + tempSum += self._g(RD_list[i]) * (outcome_list[i] - self._E(rating_list[i], RD_list[i])) + return v * tempSum + + def _v(self, rating_list, RD_list): + + tempSum = 0 + for i in range(len(rating_list)): + tempE = self._E(rating_list[i], RD_list[i]) + tempSum += math.pow(self._g(RD_list[i]), 2) * tempE * (1 - tempE) + return 1 / tempSum + + def _E(self, p2rating, p2RD): + + return 1 / (1 + math.exp(-1 * self._g(p2RD) * \ + (self.__rating - p2rating))) + + def _g(self, RD): + + return 1 / math.sqrt(1 + 3 * math.pow(RD, 2) / math.pow(math.pi, 2)) + + def did_not_compete(self): + + self._preRatingRD() \ No newline at end of file diff --git a/analysis-master/analysis-amd64/dist/analysis-1.0.0.10-py3-none-any.whl b/analysis-master/analysis-amd64/dist/analysis-1.0.0.10-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..a9401521bc24a7d3c97b652f8e3e6fa586d11beb GIT binary patch literal 20742 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 z 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 a_Ak{m)}tonHj$Chk=g~4)(#l_@%BIIzQM%+ literal 0 HcmV?d00001 diff --git a/analysis-master/analysis-amd64/dist/analysis-1.0.0.10.tar.gz b/analysis-master/analysis-amd64/dist/analysis-1.0.0.10.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a970f1b5e6e730256b88c71d5c83aadbfed08b16 GIT binary patch literal 18950 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 TzeDcb0vMeIoNF0yj12z