From 9c033eff31af011ef9443342d25870e48c3ca786 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 10:21:23 -0600 Subject: [PATCH 01/17] 10:21 unverified --- .../__pycache__/__init__.cpython-37.pyc | Bin 161 -> 0 bytes .../__pycache__/analysis.cpython-37.pyc | Bin 34218 -> 0 bytes analysis-master/build.sh | 0 .../build/lib/analysis/analysis.py | 226 +----------------- .../dist/analysis-1.0.0.6-py3-none-any.whl | Bin 21564 -> 20139 bytes analysis-master/dist/analysis-1.0.0.6.tar.gz | Bin 19456 -> 18395 bytes data analysis/__pycache__/data.cpython-37.pyc | Bin 4251 -> 4240 bytes .../analysis/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 150 bytes .../__pycache__/analysis.cpython-36.pyc | Bin .../__pycache__/analysis.cpython-37.pyc | Bin 0 -> 26518 bytes .../__pycache__/regression.cpython-37.pyc | Bin .../__pycache__/titanlearn.cpython-37.pyc | Bin .../__pycache__/trueskill.cpython-37.pyc | Bin 32174 -> 32168 bytes .../analysis/analysis.py | 226 +----------------- .../analysis/regression.py | 0 .../analysis/titanlearn.py | 0 .../analysis/trueskill.py | 0 .../analysis/visualization.py | 0 19 files changed, 2 insertions(+), 450 deletions(-) delete mode 100644 analysis-master/analysis/__pycache__/__init__.cpython-37.pyc delete mode 100644 analysis-master/analysis/__pycache__/analysis.cpython-37.pyc mode change 100644 => 100755 analysis-master/build.sh rename {analysis-master => data analysis}/analysis/__init__.py (100%) create mode 100644 data analysis/analysis/__pycache__/__init__.cpython-37.pyc rename {analysis-master => data analysis}/analysis/__pycache__/analysis.cpython-36.pyc (100%) create mode 100644 data analysis/analysis/__pycache__/analysis.cpython-37.pyc rename {analysis-master => data analysis}/analysis/__pycache__/regression.cpython-37.pyc (100%) rename {analysis-master => data analysis}/analysis/__pycache__/titanlearn.cpython-37.pyc (100%) rename {analysis-master => data analysis}/analysis/__pycache__/trueskill.cpython-37.pyc (70%) rename {analysis-master => data analysis}/analysis/analysis.py (75%) rename {analysis-master => data analysis}/analysis/regression.py (100%) rename {analysis-master => data analysis}/analysis/titanlearn.py (100%) rename {analysis-master => data analysis}/analysis/trueskill.py (100%) rename {analysis-master => data analysis}/analysis/visualization.py (100%) diff --git a/analysis-master/analysis/__pycache__/__init__.cpython-37.pyc b/analysis-master/analysis/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index dd1607efdd2ea439917c6c3e2ebb253cfd0d0293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmZ?b<>g`k0)77YI1v39M8E(ekl_Ht#VkM~g&~+hlhJP_LlHjM diff --git a/analysis-master/analysis/__pycache__/analysis.cpython-37.pyc b/analysis-master/analysis/__pycache__/analysis.cpython-37.pyc deleted file mode 100644 index 46f1441d410733564b8d79ce4ec1a6265a05ff53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34218 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", - "Arthur Lu " - ) - - __all__ = [ - 'factorial', - 'take_all_pwrs', - 'num_poly_terms', - 'set_device', - 'LinearRegKernel', - 'SigmoidalRegKernel', - 'LogRegKernel', - 'PolyRegKernel', - 'ExpRegKernel', - 'SigmoidalRegKernelArthur', - 'SGDTrain', - 'CustomTrain' - ] - - global device - - device = "cuda:0" if torch.torch.cuda.is_available() else "cpu" - - #todo: document completely - - def set_device(self, new_device): - device=new_device - - class LinearRegKernel(): - parameters= [] - weights=None - bias=None - def __init__(self, num_vars): - self.weights=torch.rand(num_vars, requires_grad=True, device=device) - self.bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.bias] - def forward(self,mtx): - long_bias=self.bias.repeat([1,mtx.size()[1]]) - return torch.matmul(self.weights,mtx)+long_bias - - class SigmoidalRegKernel(): - parameters= [] - weights=None - bias=None - sigmoid=torch.nn.Sigmoid() - def __init__(self, num_vars): - self.weights=torch.rand(num_vars, requires_grad=True, device=device) - self.bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.bias] - def forward(self,mtx): - long_bias=self.bias.repeat([1,mtx.size()[1]]) - return self.sigmoid(torch.matmul(self.weights,mtx)+long_bias) - - class SigmoidalRegKernelArthur(): - parameters= [] - weights=None - in_bias=None - scal_mult=None - out_bias=None - sigmoid=torch.nn.Sigmoid() - def __init__(self, num_vars): - self.weights=torch.rand(num_vars, requires_grad=True, device=device) - self.in_bias=torch.rand(1, requires_grad=True, device=device) - self.scal_mult=torch.rand(1, requires_grad=True, device=device) - self.out_bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.in_bias, self.scal_mult, self.out_bias] - def forward(self,mtx): - long_in_bias=self.in_bias.repeat([1,mtx.size()[1]]) - long_out_bias=self.out_bias.repeat([1,mtx.size()[1]]) - return (self.scal_mult*self.sigmoid(torch.matmul(self.weights,mtx)+long_in_bias))+long_out_bias - - class LogRegKernel(): - parameters= [] - weights=None - in_bias=None - scal_mult=None - out_bias=None - def __init__(self, num_vars): - self.weights=torch.rand(num_vars, requires_grad=True, device=device) - self.in_bias=torch.rand(1, requires_grad=True, device=device) - self.scal_mult=torch.rand(1, requires_grad=True, device=device) - self.out_bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.in_bias, self.scal_mult, self.out_bias] - def forward(self,mtx): - long_in_bias=self.in_bias.repeat([1,mtx.size()[1]]) - long_out_bias=self.out_bias.repeat([1,mtx.size()[1]]) - return (self.scal_mult*torch.log(torch.matmul(self.weights,mtx)+long_in_bias))+long_out_bias - - class ExpRegKernel(): - parameters= [] - weights=None - in_bias=None - scal_mult=None - out_bias=None - def __init__(self, num_vars): - self.weights=torch.rand(num_vars, requires_grad=True, device=device) - self.in_bias=torch.rand(1, requires_grad=True, device=device) - self.scal_mult=torch.rand(1, requires_grad=True, device=device) - self.out_bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.in_bias, self.scal_mult, self.out_bias] - def forward(self,mtx): - long_in_bias=self.in_bias.repeat([1,mtx.size()[1]]) - long_out_bias=self.out_bias.repeat([1,mtx.size()[1]]) - return (self.scal_mult*torch.exp(torch.matmul(self.weights,mtx)+long_in_bias))+long_out_bias - - class PolyRegKernel(): - parameters= [] - weights=None - bias=None - power=None - def __init__(self, num_vars, power): - self.power=power - num_terms=self.num_poly_terms(num_vars, power) - self.weights=torch.rand(num_terms, requires_grad=True, device=device) - self.bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.bias] - def num_poly_terms(self,num_vars, power): - if power == 0: - return 0 - return int(self.factorial(num_vars+power-1) / self.factorial(power) / self.factorial(num_vars-1)) + self.num_poly_terms(num_vars, power-1) - def factorial(self,n): - if n==0: - return 1 - else: - return n*self.factorial(n-1) - def take_all_pwrs(self, vec, pwr): - #todo: vectorize (kinda) - combins=torch.combinations(vec, r=pwr, with_replacement=True) - out=torch.ones(combins.size()[0]).to(device).to(torch.float) - for i in torch.t(combins).to(device).to(torch.float): - out *= i - if pwr == 1: - return out - else: - return torch.cat((out,self.take_all_pwrs(vec, pwr-1))) - def forward(self,mtx): - #TODO: Vectorize the last part - cols=[] - for i in torch.t(mtx): - cols.append(self.take_all_pwrs(i,self.power)) - new_mtx=torch.t(torch.stack(cols)) - long_bias=self.bias.repeat([1,mtx.size()[1]]) - return torch.matmul(self.weights,new_mtx)+long_bias - - def SGDTrain(self, kernel, data, ground, loss=torch.nn.MSELoss(), iterations=1000, learning_rate=.1, return_losses=False): - optim=torch.optim.SGD(kernel.parameters, lr=learning_rate) - data_cuda=data.to(device) - ground_cuda=ground.to(device) - if (return_losses): - losses=[] - for i in range(iterations): - with torch.set_grad_enabled(True): - optim.zero_grad() - pred=kernel.forward(data_cuda) - ls=loss(pred,ground_cuda) - losses.append(ls.item()) - ls.backward() - optim.step() - return [kernel,losses] - else: - for i in range(iterations): - with torch.set_grad_enabled(True): - optim.zero_grad() - pred=kernel.forward(data_cuda) - ls=loss(pred,ground_cuda) - ls.backward() - optim.step() - return kernel - - def CustomTrain(self, kernel, optim, data, ground, loss=torch.nn.MSELoss(), iterations=1000, return_losses=False): - data_cuda=data.to(device) - ground_cuda=ground.to(device) - if (return_losses): - losses=[] - for i in range(iterations): - with torch.set_grad_enabled(True): - optim.zero_grad() - pred=kernel.forward(data) - ls=loss(pred,ground) - losses.append(ls.item()) - ls.backward() - optim.step() - return [kernel,losses] - else: - for i in range(iterations): - with torch.set_grad_enabled(True): - optim.zero_grad() - pred=kernel.forward(data_cuda) - ls=loss(pred,ground_cuda) - ls.backward() - optim.step() - return kernel - class Glicko2: _tau = 0.5 @@ -1016,4 +792,4 @@ class Glicko2: def did_not_compete(self): - self._preRatingRD() \ No newline at end of file + self._preRatingRD() diff --git a/analysis-master/dist/analysis-1.0.0.6-py3-none-any.whl b/analysis-master/dist/analysis-1.0.0.6-py3-none-any.whl index bc4762c9623b23ebe761e28a1631aa4b25352971..46500f86c269d4a7f915abefc51f01369e29690f 100644 GIT binary patch delta 9361 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 VXo7?MTR;J!)_#ZFsq}B={{j2y&7c4P delta 10775 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 diff --git a/analysis-master/dist/analysis-1.0.0.6.tar.gz b/analysis-master/dist/analysis-1.0.0.6.tar.gz index 2a848dc8f3eb8872922e07cb1c47764d81997695..570b4f717e806ed81d3637f862d8b90641b3e0a7 100644 GIT binary patch literal 18395 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 CDede4 literal 19456 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 z z!GP9@>|K;cynpx1iBe1olDi-c`3u+51Hn?5Pcqt`#b|Q2k`uB%qckuEM_zo9ukXYf zbxM2)-jGMweUqx%n@(T;)S!l#1eVW?&I^ss?4eF#T)7F-=B@P2vim>(825Go}siRPw1}liLoaZ^61ww;me9-$$U!MH|#gUWkkTT&2 zNz?r%S`tAnzVKyh*+ad(#=8Z63*mKN7We={OxjqM=w?nENZa*1`QHuusL-M&M-<^p zA>uBcqKlkQlmT8S(f|)oyGeq;U#;!vP$HfU5}=Z$-aaX&7=fmqFVi%+H%p9?EGm%p zy?+A+`9hGX&K`mekRl%c#d(HKPSg3*4=zWTTiuYB*`GMed?~5){vw5u1yv6C^GWau zQ$Jq+^n!OHw|g(kDxZHx)&aeDZG-oh9d1H^-bSsb4zOXV?VWDR0$twByRU!x(*F`y zvmIr~5ltZ6;azV7S!&F-ARjr~McRnjN@225ZAE|$4VS!R(LuNWIqi!L#DP3pkQ!nUCiJL?%?okJYRkB^(F*~&E5&I zVl-`A>{>(Mbuydh$z&4}??IlD)zEIB1^GB7LZcC5j42CDLtxLsLkitCY*SrFv(sT5 z43@Pvr)oPQ&F~dg@lBM5=I*AAWz2oq`J=?K)iC{A8!obZeg5BK;y0?a(AGTGKN`v# z>?9Vtmx1C-Vs7cMSJ#f#deHU5TOClaS_gK6}iegIUOdk}02P1=bVM zIyLOGG$vNVX%R6|NZ)8yL$Fis11dK%F_Da08K`WfR$($y>@ct0pmt~;iu2GwEML~DFwPC@Z8stuo7fIpuGD7VWh>ZTt#FD;;@_R_7cM>>)U3jhH^}|b}I$PO!c~kxvVr#8r+PKSfKhg9q z`%J0~A35tTyZG|Q=g$sUq`FtyAw+)b1uMPH%@-^uzx{%}G+Z`;vIiI*0|}&e9+c&g zQ7K4>7I%b&5>Zz{V19}PN!MqvrqW4%43xv~;d0iDu}zng=s-pNqquN%TL!)Q{P+Pn zN`o}=$~m4MUdXOi7g*3?Z2J<69t+I5Cy0IDdn~k&u-26pth(B@7Fv*!jiJiy2%pbb zuy-6RW&~+~-_e6Tb?gYMT5-NWj8b43wz_A0fuR@2(Go@x=aXmwl>j{GXbiEb;?H1s zJBrYboyR>Wcz-8T7IbXt@l_&Uw29W}A!vA*B^Wg+6D8Uu9-XyK;@rh*;KNM|j}xVM zwEeD$OSJGoDkxMyAZb8JR%5|i_Vxtp)B?b48Qeu?-54*1vIep~BOVOJ8ew4q$ugl5 zG1eeuUfdR?{vlh=Lu@UGm||{xfiYo5mZ4O6RE_b4{;AG2M!|gMOh>DY^TSuG#g^4D zni+Y%dHx33Pfug^aF$G|{M5xP%}02@4iB1PMB&(DQ8@Ng6pjtCIQGVir4STVKFQC$ zNj_fk%Q0};uHy7gt=koi`H~&YFFcCaxn`!tgrWMTTj8t@@wIYF02t>*geMf8br*?f zoiS6GJ&0YFCa?o$xrvH0Fb|mE$F6|N2!wO5FS27ib9S{~2y?-N>yW%vddxHfAYr6I z>%SWqjR==Iq8(YumCF|jt43)31HxHzY*n|ZQ8&02;+DM{8eCK%(t2z^ZSjn-5}ZxqK`C)7%eg8%m*4l zx?;Z@LAw$3Z!&@~EYJrULB^W-!z~5KePQcS!rdrbgM|U2e~ph=lHw*hZG z2&wodwY0EWPJ~@g*JSGPlY&F9ci!ZY(Q~n5!hJ`((lR7T{e)m1^eHH#nS~)yPZvd@ z5C)mqq9YIbrt+^~v3A#6nhl4|ZR{H#SQx*Ctl7Seyp4-t7vl_m6ORG&Te}CiJx5v$ zJ^yWzO(K&U#`%1dWP+vG8w+dU6Id7(w*@m};;H#G8k5&5KR%~Jf^pBG;H@}52P{NS z?<&x)y2D47*9yXD#KYnSECFgAfI3AnCh`8zOKMDcODx%M>;ovceTQ+ffuzOgNNn_& zT_idO*)O=y?C^+P=kt^7KDt^vDl6IuusSh?aeTF&iuD>qQ4t2kfql|Z^3jU%h1NZQ zITY~OUySko)<>v8@UiSr9Fv+Y3W+QXtCoim+g+U%`7)cJUA`=p1>nW&ufB%_3=751 zIOAv-_Iv2`Nn5HE1_-xYyCi)PyAVOdrQ9HvT!?meF)Z-83kdmQ%S{Sl09*_W*n#QY zj`rIjKH2w0l0lf7!Sb+YS1#av-$1sejZh1k*oXzEQv`AF676+xHi#>lj>0%YYxBe> zc~LJSY1GB*zNv^6I8Ar>8j3wmK5`^!+(lqeV54Y{^D| znpbus^d z`zO7gXY68Xu+R?&Uo@B|tf40Y5FQXDTx1C7+(|}cTom~tE~-0UqT5lm1!ij|4J{Fs zPqapuxQn1{#l(R#Mnr^vYA8-@^d<~7G00jC%V*g(Y&ws)cy!VekrsPhcG-q$;gJO9 zq^*CR_{GFZW&q*edgN5X3s{puef3(!g)&|Hmoc;OFbqfXo8(w-!R&kv}cvUvrJ#% zIh;tn_6;PJvG5viVTR0q8bTgx5$#>Xw@P~hiI;mTKMBw;3~$567v01nt6iB^8!1-w z-r@3{1j>yNDrhxb^-PG@i1`5|o)VhgB8wOFY zEb%CV=RJth<$6MG_|6*BlYc*v-#Z_Pc-Y$NJOpNAhavDu97s^-0oYZ7coYE-GqAY5 z;=BSoB+%x!4Qh94Hh{{;>2g8`DA=Awj#o5Jl7e;Y+I9(;KC zo1J`k_~DN}JZw>?JhZO8eYoX)whvnYFD#BQu#)=u1)gFZUf`+r$pxOQA6wu_wKEGm z-F09=6fsUK@I>pV0#7y1DKvr>hZIBxc|w6F=*JTtwyuyi5A}Ome}?ZgD6x~W{5GJ0 zs9%7J@9%kXf$D5Lx4 z>v6BXd7EBPLp$uEA9HzFKZWzKvVZy zJMA%-P0eontapOxut7ew9zO1 zw_iTiz0rj|LHeS9BrkM67re6z`oq>*Usi4hS?9$-1-{?B&$lBn#>H?~HST;3-xmVVh)ACq#S~UNaiToay z$OPuzC~MOrW)|^0zd`4as9L0Xl_n$JWsW=``xnY^60=@l5JSBT2I`>A#1neVe%4V>?)bNG_o7WioJVi;w{D- z_5hnK<6$dV7IvFULLpk2uw1QH9`D9FvSor0nU@Q8TAJqz&5H%fYW4H>NjDPoetC9r z@w(%UqB0rd3Qj_5Q4~!_1Wi38CJTs}F8^A=pe9F>&fYqI6FXbbYS}R}+eAzrD6$Rx zDjs?7>aVPiMM|Ybm~4wKm!Gd%hI2-XhE-m2?(@n!7*C-0X0Toq8MEblafgB=Td)}9 zgqk0md(y`Oa-+jTJFD8~%4Hv0!vOlwoU$EwN`-35MOUbJ;=mZR+gJKF$pgG~L-H?* zk&<5{1euowh$blGHVEmbsFsVk@GoL+s0+F>qr=73u#A8h1VLrQHYrPiF7F$TGRQN~ zp-9Pp&OS8b&P%qMk7(7fZ>(f(W5RG2SEw#aD_N3F;+5SXt4tbabu?JZ$q868p)ZBc zD5}QSA_V<%9^U4~TQWeD*URZNjrqmu!dKWZxLA$)z7h0LuZ061^1nv4L+zPI(x-93 z7gil6Ipak>zApJSEJAXMNvqHTrR$e88+|AW-CmEcd7DblC!Uev`~wwO9+v_sUDB>q z+2volg6^yv6T0*sH1^LN)U5WBU89y|JJV%XGOBU8I(G!PSr`e|{gwr7kpjx-Iw0clgE3ZLw5!Bw}l1xqV zK0(p$aL|O8E}n#-(`b2a#h7Ny&K=|GZky{JHaV97Hf+e*W88V;gq=y^j`u6babsoD zID?A{_R_NH`(EPyBdq^nE-c?BY5Km){|)Q^v(rKE2-p87r@hnD!5N+ZI2xSn*8d;l zN7{B6PM3J4326IV!;VH}o-V66Vpxz= zrTo&xMWh5V$BRp7;_rCBCJSfzxA9#mR|(^Mao4JfJErzgc9`c!c#whTxS-b-_tpQF z62B^nykJGxXIwUc5bMx>T*sq1w8PhdE07jRh8M$7vfqZ6w!BtET+Ht0qn|+m?@a2E0-*LxE9Ji4QA zn2Q1Ap(|QVThH?)zhMZStRnurNbsT|C_3zEYIK6vvZHk*%Ym4Xu@-lZU|^2=R~CC9 zfp)*STf{_mzs>ST#f*8%Bj`AWC2u>hLY_(34bl4u@J}!n4aocZ1I<=4E8<9+V0u;+ zM0Zxj{=RoGFwbog4I#@u5Ww2GPUwr7$nxXSaZ3NI2y>y`Zoe+p2EZgEhyZmclAFL0 z-VG4-6O_s}5Jn1XgB3PZ z$g;JXGboTQWC+b>ThEly#~5 zxCn$P8n+RmTQp6w1ua4G7%Pq>(wee^3Hmn8ad})Nlz^g14I=0kg_{v{ zM3)XY*ikHqWsO5zZz*==_+j@>`q!|G!jN;pI$#Yr>$oGVTg1`{YYU{V#Vxkit@~pk zq`>V~ed!25Stvtt<4jcKxAnq}^+-cxej7OZbgZgeH{(Eg8S%IncV{p%#az+ThEzSg zV|_Vgj0v)+0~*M;_*Y0cZ9K638K!a6Hkh1^4w}{=e3o}>XebBhOH*k!FRw3*CvKI> zRsmtlMP9~sDSO@^1xzF|&sby9W-5@T{cO>7+cFeR<9OEiisNxvTwRW@YQDSBgRB+4 zuGdk;Lb2mjsP@AolFJBy`E8h?ks=MV_n-tHg?cgU>OCzC7&9_{1O+F+@9r{Zv z4))ODAL`5xJur3vM~WR3H!Ul1f5^}=xj7nF6ald79lAbSbZ{^_nPCyiegi24oYi_b ziUOCbE8K~ka)@J0u$jNO;a_`K@IS@rXrG-$Rs4rxb5sF1P7`yXA@s1JH!xvG9d9Hi zDr#OwKKD)1qBbmY_O+b-TF$!6xV)Ue*cd^P%L9ND>DMbb=i*KBcuT=pCbNvioFuPw z7+K>0=7<5afA(AJmf*~qLo+UEW?fydVQ4%AzTLFm5wntH9ljr6bB?gks_s(k;Jh4t^iiug)XuE%Jg@7|H)6OsKBKSe;y7L=&4zYr9bEijPlLG&XS3 zg0SA_q+K~>|Ax6hQ7j1Fy<3V6{eqLRW=NnM(nzymIrru|_HdoV;-3jcH{y1UZToB6 zCC_irUDR4GN#2+L*Y5!QS1djA7z zxOhj{kmrARg^0w)-2@h3HO|7gn2uqN@$qkm_5+9bkG8oWa@=VR-P_xHqit3TUum?f zVfHS18*6-ihdVa|=ah8N?`aArE&A?oz1MT*HZqf&+ya`6x*`^>SwPzIP0BK z6f~SqS)$+Te)id5@R`ihJ3fAj;m-~{Z3%3h${JV$DlTxbfb{lPfzcX<^-s@wpPiia2PbEGAnOBvh5OnAsvjP)SdD{LNK}pFq!=Bnbl)V-DH?Yz7SjgK z;(2ig)y;;1WIzP6B431_*ud*Mwz6?Mm+#SQT}i=`1$6AzRiL8`uo=3Xj126r7|I>i zUpy}|2dP4=1Ak@wz`)>w$e`t~@b)V%^SXmmB=tZrf=`DXdV{0Wry@nRq1Qb+JMMkf z|LjyTNbj@Lv!};>nHe~)|MYb5^l9(3R-VBaoIQPd`m}c@OF+LLoeX+MpFLGL96x<} z(m#26=7d4#3VPkAgF*j9VGb3a^`4#$&d!X?demm|EdFxx4!U>%1UY8~teg+l3TfRg|%1Z6(%Rp-h!T`|P*BMO6kSw><`G4@0(MXjeK2#c^ua zL<`H@&8RKnh1w*k$5VA#vQSc@*5q=WEbi8|m^qALE)2L(NiQ&1#LYhl0SNY%?Z-;H z)OdPYs3+c~b-ny?p>qk&b#w+QCd;N^D8_BlwN)@&Deklt@2IjMqg_eodI>uNWrp)l zN09Yu4P8U-`v*#s#9~`=)+~<#KVfz>AadG?Ji*{$F5}`ZTX3x>+>;RM|$}v zx8XI%RcM(Xmt{1gO;SxmX3C?0?Kq61Ux*~`L5))V4mSM~6Lw((X0YAKI=TxPWS}Jc z>+oPAD7v*(-2zc}mkI>}B+hC+Q-+C1H)HLa8w(=!#%lRtkX!2Nq*OhL5 zvk|90Zv~4WYxpAq9G1oQb>YdVkjD1`y6Hl z4Is`s?5W;P@_1O+O3GljkrEkSEbrYut3?LmX{~0k_l=UwMAX=HDiXBT9Nl8zo7}$m zh?AIUfJ!GI*&9uRS8I>xw~cGbsF>lPU$=OykAJaz?9`(Y@NG+p6AXcNTX;p7U&x-v zRHt@XpFP@tf%PE#k3us%#xuxS7SnR&&u*EQ-_=SB}W+ zWI_CF*z@0sNzB^nEMaxO!f8X-Z`bcHizF|2=YK86+nVkt8PoA5cYuB}Haxuqe0zCA>p4Kx2_w&}K3jw?<{j&$+;&cI<*0wbodbl2m^RjO~YN(FjCA^AFbMQ+61?c`AOqg%LkA6RLRg&%Er8$$sHMN-JyEE zG_7k=+v3PV$);|{8k`ykEker~X<_2obXBj5D~Y)}g<&DiD1WHEyesNd#XT_>p`@4d zZ8^7O5d}fNhzk*0aGb}}X<1`i3AN6z913oUNI3RQoOCZ2&uAU0!1#n{ixEZ5&kP;f zv&V<^yagmL1%(N&-bu7rQd5~R?WN_Fvm00s_@WIoB7sH-t)t^t=No>k-4MT&S8@Oq zyrf)LW|p$Ad<25%p8cC}+sY6(f$ zITnzOK1fc6e8j?fu+!|P$KG|6O;QZ1gYQW;JK)A@rcsvs~eSOWlmFk)vBhYH^nj=L%#cIvLS9zb-Y{tcTz;R z;T+WCB&*F(W(C`6wgeW(13g&rbj8P8$43njRDjjnIt79$(n4!;D-eaHF*J==)SyG^ zGo?`5Tp<=Un9dIzvQnLTBlg9&pnkbCqmI9i@YLs9@%h&InfM-S@8eE_=Jcpe_%VF( z9$C!WQHVZ~&D+O2UwMW)@1-uSUUA-|bMJXPjh1QUiEG11wS+OvZm%r6trtJyj^atz zm01N=iEk1as7V%m{p~j|ofk$PE2TqAeOFX;R&ZBgr#Z z&vskSUp@O<`0~{cUp)Kb+wZ@9^M3$Nw@>AtQTQnmQRC}){1z`+ODq^gTtXE9<*V-r zTMDh!=Q}v0)e=`}wfh>Ibvza+C(dqk8yL(hkWxR_6O)u;S0IJ(;+tDkxW$y+p#5F1 z1D7Y-A`=f5@rA8LztN6?9h$4 zq80;bF2q!?KBJD)Q+orHOS}G^mD2VEWI-9(G|qg=6_9c-K3^X6uf#5Is;BeHgcpeX zATSq`JKKp4X>#|Wc?Mm(Yq!9dv~0hQE3sGAoiDnRMM+yW*U9WUF50cSmdeY08D+TV zqP&I2d4Z>lQta!vlKUqBOKgR;^)`LYTksMaz_xT~5htcOcFU}28pXiZ=xiV=XZ@V6hOVH5Po!)B35oJ#?&-dIf}#6h$5cCa~?9@!f6V1 z6=lDyX#wr7@M{_a6sebxWtp$=p7~47oUTg=@R3sy~da_X6y|2 zXn66X07laq-Y!~2L!1=Z{s&BXb-NpwuhKFnm()re-Nx`aU+HAk7=)s zq;W%Rh`OGri~3;=W2*uo`vlqzB7uK(%LQf|z|Cm3A*i0nv%!X3U(Rm;(BKB4nGq=_ z2fr?STY^j#26t;M8Ra`Sq=KuqC9sQ!Gzm{pSyyuA`JdOD6<#|Eb4<@r(T=cP}DnALn$q! zG%Y3pzT1QgY~pA|Sww*i&h*dHlv6_UrKckz2*ak12EDt;7k+@#2b&5u)Wb5NQ4uN3 zf)i-{U=Rj9z<_stjm^e3%;ZKMI&MUZ%j%#aYQZHu}Y zisFL>$<+D2O^C&k?E z;9g#l=<9|^5e9dwI@fVD(11F(F&v+L8Ul0UNvS*cNhx{qTPGO{Mgau5!*kE|b5cC7 z;u~gm3@IXih&vaPxNy#d6x;D_Df>ig+M|@S|aG~NQxQo@LbX5&%httrar#fm87t{NfBD30- zMOEW$0H{CR3jo?pZ6LzR*ld#2$d^WUpxX=XY3VV%C{YM}%ICX6b4W7l;|jMuwGQam zjOG|#V2dx}-0|%-^{;d!d9pyw-_F^NFHFqQz?2cxfFkPk;#)@ki(Z(zt zlfA6C>IUbzqf}rX?{il)Pa2R_R8W)yWizG%z*|@Ma5E5K>Oq&7?Zg6K2R*))y~xLa ze7+>$=K$!c!5x7D#TxQxT^ZJo$}7hpV#mfr`42R7A&uK@x=;*oM;FSm-^g|rx}rd5 z<7r%zMTq+6)Wc7_0V;w|`WQju%Go^Jz-?~Y>iybf#7uOV<{BpCM{@7Y-d1a^ZGT@I zNdv)>iZHA56_LaVM3`*3kxIdY>CH|XaHFkT;dR&_osGA5Z#NIYM>q(pZOO7N9?rOo z+H6m8?aUREprk_`H+Si`-tBXf6GNn+Zi6S(F-#D9#=W~MI_H&8(8MJE-%bLUo(!fv zLmcL&mwR+U6UA$QQX#wI39rWr`f2TIb zcHDDV9ZRR2?9}CpW=?~|upD2Q^<{H172%EC}cYr6pWp$8Pc}9Wi}Td zU5Br0mL8Q`M3ifcpUpbVT>nUE?F&855}T|Ltr6(n7h1`(5&=^#88^U)6cDZ)0J`z2 zq77&bT;MXH>KQban_&pBsK68Ttp?N>QkRa--oX4@vch_v&||h3jHa`VRffWYI+}}A zB@aM~&+qRWM6)K+F8R&sqm!uQJ%ah_(E$E`T6vgMrS6#{sRkVRPge4y4i%)MOrb})RG zn17^Qe&j?%fbVUJk!3a;*K+603XImWRb$Ka>hX*qJsVttg|VT*wlzWKe!x8K(F3EP z5J~bz$NRR>9j@(<($JpP&@`SlwDXb2E{pfje>KItz7Z>{X{^BJBTccEZH9C)Hqc(X3@g zVPXAUXZO9oflMgKZo4r1G_2dDOam~34_RsVM`hcj*Zi%>vl*+z*o!GKHh{5XhR)=e zPaRgj3-R3uzP++y-XRzSF{Gz>;;WUXX4Gl0fd*@)Lm>5#BM=z1#gov2DpLtKf78tE zw9nFUoE-6I9SlT$8&ISo))LEK!cn0x99vr{Iu>%vC9rRii{8eP`mVu@XMcq8>qJ$>aG5j({+kz~v-9vt7Xn~iPu_zPB{&<6f;U9W_ z(7)2ru_UqD8mvk4skTGJW)@{ytBZ4EFOOSBnCl%o^f|`>1$qK^rn5rF*BWi^;o19l zFkY`&>?&Pg^i*S(SxsIbnf#R)kzuF}#h~NBAXuwHbE$z?81h$a9XZ4=o477#axV-q zkceKjbcLe?{*Kut2cYDP@vbm-SeY)aqzyR?3|!o??M1r|{7wz#ds9#uU;8=gm2>DX z%ZMyd&S_MiI{&yc`+`>b9srw=}N^EwCcJtE91p)uXC8FCrLEJK+^2YZ|OyxyTsYyQbvX%e;tfP7mcqq zcpTXUHx3x)2myp+Yy};yMKa(O!kkd(2hW?D6}ars^31bgf|kG=t?Ibtx(ZbJmW@}9 z>eh!2?{4u|r@11~0U6w*5~J7B1#B2;60f=gU}c{1zA=bcW`IQ&`cnSZ8S-h$OlSVaViA@#vG#6L{|FVC66$IxS*M}fyVVc5m0{8_D%R=5$ z1?wq$pJ(MZ*gG!5m681VoA5%W;CL~TZH3vv2Gq1GnjH6ps7sSp=0}?m6f4?aG+jsK zwKH|qeGaB7gO}WLiSJF91w|AEMJc(Vb5`nZ_J~&9zO}#U?bi|Amw4!<%gBKhi&bEZ zI7ex*$*74#y*aKT^JFrio5cz5Ck%m>xi{%RMyp|iz88m}6(T_nScpA_<36vrD`HNw zQ$rIgptWilhk{sIF|Q8=D0fNy_CbuONBCH$mMBTh>yS-c=OHFQjlth4-)<2&!RfEf z3U(=0{IW32$I`>E_)rXN483=j7RCe zk_Q(t3!VWaZQ)Ylh)StzcrHkLAMdE z=D4e|zrou6=5@5I%Jrp19eidt=5!Y{Gv9;V@AvyfunNB`lk%Y7?ZJPiha%zdCMmJg zeFF{4?Vp|W^uPG)ADx~&=pUV&_Kr?^C%vNwy#ajhJ@9%Tg8)m^ zm_6@7lrGm3YQuNl82R@T`91R9B%p_Rukuk|CF9b2gQkK(Z!kFbe$qL>dqKKT>yh`j zBEfYgZks%Vb=tDhTwY+6XH_P%E&IS**-N3SOx}3yhdd9gd%|QqECP_iYtvd{!s!eNZPnBRzK?A*O z@u~2<)e1vgELD`NXqFqn0I_VDoABAwuC0mPo(!QNkfPU)eREub3s)OblrZHZf(&G(>gi8$p^ zwMg?SO-9frd_taB!1|V{KeA2u582UL;-DromGoFJPX3v-9Ex`l6xvbv2bm6CckAzF zoGs*kH=fN7l5CnEzIPoc56@0cn&dx;OPB>~C?H?|^ca%7lb!tkBlQ2v@4h+s z_TuXw-f#XtZk+#nXQxM2|DT~6u$%us!tVvFfF@BD9sI;5zH@KT?YAzXd3^2(R%pp@ zoJm@*m-Bf9D^Z!nTfkxoBZyDp8<^1+FzJALz*LLZ<9tbbpJ?XByM|uD*Jo+Uc0B$w zpT`FaD0=Q)SJk3CKRlczFa?de<9vQtA%qeEph|LB75L|%tZ)f5yK6n8ne3dPT9u(5 z!@nP(gHd|!nZW)!!&I!L^?fpqvl1})=Hf^18@lp7^@7vEj{@VATB%QUKRt5&6aiNQ{iX%Yi!FN++evH2Wv`W~+?M=G5|I#YY#>Bz|c z16~A1EqHxbR`DEj{P5cQHk-t_1C2}bSMe`P&~M5E2IJiOe0T(%q9J$iWuAeGRvqAh zWoUT3st%#U-l9KS>%Qav^$$P3`tqyS-D*|+Hsk+zV99^zp3|NF|51LV`Jz54*L@-o zkC7<3LQgE>8E|3A6;hc@!z_)X!b%oK6C<^z*EY{Tt+lM__$o%s_%2Kn^iFbTtMWyd zqS$(O4*!?d|6FAJpyMB2t?@rNK0e)z|Bvx&?Uq2h_22sO|K9R(m=96RU$v@e#=O_Pp+_%t zw+VXm?S#X>+xUN%8~;5V|0kzA{r{u<_&yBvdX?vC*=nihE_3Ce-4k?v z8tw^p+3R?ZyjSrejmG>Wz+Jv9y!~}o#MA^R-qVH^&QxauZ1USwH7BkpbF%;2ZQroqw#;Fh zjF|0CYqvYM`|W-u0FVIyH)GnS diff --git a/data analysis/__pycache__/data.cpython-37.pyc b/data analysis/__pycache__/data.cpython-37.pyc index 6b91e2a6c1a813ac165256db5b99aff44299069a..6d3e92a87e9fa4b9cd622c311cce6ee2cd0c83b9 100644 GIT binary patch delta 687 zcmbQOI6;xyiIZcTE=A~zBE@Bd6VvL&H$x_LvKAD+y zf`BqmX^{$uPz4cclNYnvF=|fc<(HiNn>9^Q11PA;RwM?J69*9(>YLcC8Fe@BV|&2J zXgYa5$3||DmLgLSp*}g9Q0(zpKb6f=?kp)y5QcFk6cy}3}q1S*j?7&B_w+BqWk2siK Vpx#6hzbQZ(0B`Bh?`);E_X9Bbj<^5- diff --git a/analysis-master/analysis/__init__.py b/data analysis/analysis/__init__.py similarity index 100% rename from analysis-master/analysis/__init__.py rename to data analysis/analysis/__init__.py diff --git a/data analysis/analysis/__pycache__/__init__.cpython-37.pyc b/data analysis/analysis/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa1abb0083cec6db1575fcf5da3f9955077f08b4 GIT binary patch literal 150 zcmZ?b<>g`kf~M@GI1v39M8E(ekl_Ht#VkM~g&~+hlhJP_LlHtyyblrSW=SI9lyWmi^h@@mec;*KO~1YPxD> zdepDI)jb*wJ@(>Vhu~yw$0Q+u0gVX|^9Te?FopyYAS4h%NJ0pegoGHfQ4EO<1cEqQ8iq%YPwd{a&0%`X5E~dcMEROEx8kJ*`0K!+-Y~lJ>br|2i-aMkbBsjcaOM7 z*XFCXdxv|hnW<*vn5|}UJl@Q-iM5~^^EaO!+o7wdC71q-t>!hb;fzo9-Lk>`TUrW_32c^CmYZcMisP?soHXXD+_;X15@B4!I}YBHBCbF1RHe=iPhU z2^^2OZ*j{wPNM%)?j-u3e9@{N#nrv;6t1Rlb%(UJ2pH~jPfKgZ;yY*DCAo7vzVlZ1 zez|jJeCKWM19IoC_|AjwLvrVJ@tud=N90aL?r^-%xR1HhFPRwe>*ISLaxb_ua_>ZZ zuj;@ophgbKj_ZmYymZ%c8{XQQPjA{J@%BbP}?q@S;W7$E}lMp#`)x3hEZR4+G}33 zv-U`-g1_NYea(CKR#y6JmDR>psHLaE<( znyLDgUI*}94Pk0tt6c4uMsZOQQuB`? zo#r*ak${Mey=`w}?S5;;sWg1Q@A(xpqr6sUlbF&EDyyo~s(=KiDr?O~{Yq!4;2RdFf%F@1O}~M@@rLVll~->#J)GA&t|pTZpMzK$ z_e#%mTHpfZ_bR>|J+JMfXV>XD(z<56zK@n# zPB-LVr?uib#FkTE_ZpiR$+}k=*JGlIW(UL8^xA0jDi}z&qk6i*AyB7;a%*1O!N-j-MI6GMq+FTd}?`yRol(0kKsdF>vEp+K0ZuMzwWdrIRjB?djO1=t+b z0JCe67%xd=#lBCh`BxyBs{Lla@?dW|{+q0&*V zr+{Y+g_vnVM$#{zemF_tP^FA?aQdNJsPo`0)Je&7&-2OWEpR3!tL1DZNDu>38R8T} zO$)N)y6FbUc^$u9O*#K)35)Uk2*Z9>ut|?us zLH*Tg>8?_erAI=H+}BeMM&WlMT$F}Oz)h!hu>+#_&Nm&X_SFWoI5C!dbV=*|j!Jiu z<_tks@~vBLP>%*PiuXvR5A8w94SPBb!i?!j1apznhH*f>VqE0w)qcB9fgAGS!=uXW zil^FMv#|}FK6(Bz8SHzOm*WmuKZU+{j`FqaKlQ;U6E5cGqT;DIYO>B5)Ly;HCEl~W&f zLlZ8=YMP~CVkQu~$IjCv9ahpDFV`?)U}*JW#{fT&OKC605L-$y7>zd0m&A4CBWM;* zy_3R3Wa*@s5=LSLJtt@;q)y0y*wU$YLSaeN(W8eVaA+4+R$(CCq{T6{BTHZNNIV8w z2_xfrGN>jIMIgZHhA=V82l+XtqPa*p+m$LQwqp$JKZiCJQ)sY0h8ZGM};0r zzwLSCea-JF3$3H5%R4I@wC@FqlPiw9PytLNAk3EpVYO!fKeHRU9Y9sL85%au3a3oE z-76k7zC(0EG+C!13Mf6?6!}M3R{MkEgNA-UG~L{z^`+nsI$V$IYNP4a9hDv+^(66> zV&913b?|Ku^D?ZQcH+FV0=7X&z(1ui0{h9=u5i+b)k+8mZ*say*?Gj-IEyLi+ER%| za0r2G+chzG6PQkfCDM*Phu>&pVucBUo~et_+z^IN7k+SKTkNYOq4xuT04Eer3_E>^ z*kfMp)9tE&SHUjpm9P&_TiY5NH*3G$X+tWBa2P?u9>8eyRU$=p3VhS9ueTg^g^UmH zxklBPH1ML1-O6^YP3fbNoc0$N5ki2QUZ-|yuPw&461de|OnXCnx7yskF9M7%6v!G4 zHi4X|`^d{Uy|~AmR^BSKDclw9A86bNozSF*c@p9dxDwC|IRP$P3hSD@5m=ELJH1FV zJEg|pLqclt$Ht z7+eFV^%~-cYPHcjRk^y}fJWuLeiH@@Y?rGY8Ua4zTx>h8=_v&%r?yYn9tp0|=#E>~nfFsqFAacw$^zg>OIp&pkkP+Ms1Q9E~Lsc3-V|S|!fJv-KBPk|Iit5d}KpT`W z-~d*I50fk&4lpeNl*-8%=V8qAxuwdtRL&&X6xKBrWjXr5>p(cv7U$$q+Ihz6N>VPTMI+J9oR@fleg8y{HQ0#p$HDyh+U?nT6YNv zO^9X^tNQuPnhgyY@rTe(a>OA-$y=aj()yvArq7s)it0W`hDk=~E8tdP3Wx)RF&c(L zWOFG8KsUG22Md5Yv0V_qx`*wfstWL9;o_uT4_eR)IE;P61K+;^?PP!#z$P>+bb#t) z(gTSMdOiFR2c)CcoVJAQ$V;K2EdgiB1Kd-LBN?0CCr;xd<_Du5UIYOO&xCI(x4 z-GsebNgA)P;v?%dH0Wu*#;i*ur}VRU2+=ZHSW$CE#I`ayBBl!gj;yo<=99A{=1si< zHKumNFe&}5DO{_?0j*PHvOb(4RjbK)95YUG>(F~lFn#nNX5o4M~zhcS=*Fr=#TCw@5_&Nro_6xxrYUkSQx=TX~EjAJO&lkSC#kn zD{tqL6ff2~=hhI=Z!Q9rXSZMXZl~T^sk|5Q$+lN{`$khv&NW)Tvxs2n*=jkdMuGx? zsR5E;LK}~=S`*~q1#;lQM8aeWrqTv#P#R7VfsHs=kPl;SK{1Y01_v(1A=D@IqD*k; ze7Jg|L+{b;oQ~86HbTBZIT+O6(@)|ys-+>ELH?b3o%se6PnH+Vz((u=2lJiU_!FBs}hG$F+|9=&fJhQ@s^ zUB`7SMJ=6PTDljmC{*y;wfiJc7YW#Xdrly7>L{AJ3$Xdfl`#sYT-OOJ|7`p?kn{NY z525H817y><*2~tXPwbdI^SafudztImfw_weja_rc8kpB}yU1#J8kslmH!c~^7y}Dq zw3h<|sL8jztDNW-@<9g44eh{ccY~}%cY_SqIs=}3WR*^br27;&_FIXPx}c{yf#1v%z=MLFgN*1#TQ2H8PwkYCMVJ2EWImho|Q6F8OImEcNHh@xjfw%vuREC*+6p%7$9(Q1xmtyj&~ z_;xjq1A}kX99B_b6;zAxdv*A&nyKM^md@5FmPqiE#L^5-412~ZnDIZWPSW!)gCA=O zf>?8449p`S>M>)-9@sKKX?Y=2&2~G`zv>>;Qm0U0JX8;(9kb~N*)iKTtg;nTgHN*f zy%Rs5EkxAVF}98m%nQb|bD)H^VQ*vr2Bha@YsYwg=4k*$If4vUGtO4SU&szI9^}J# zTrimmv{Z|+Keu2DZGw!W*8IRmISMi%JsWeBT{27NTpDcF5FGUcY>LTIq-nXp}M$g=^C`5Q-A2E7JNW%~)NEnca50cc5%FvD)z%ZYPaG8c?JhmF1Wse%G5G@x& z=WijmtPZ2^8>H3^zzWtw!Wxm-}7EH}Nt?2TeYNELHXX2vR+hk=d~Ur^_%ouke)4dZeXl|`vxXT6ZkJtUAaYa=+4B}_xDO}X)y7k1p)isopNttqr5RW zD7zCcn>&-Znz}wc;Bn^qfn8(Q+L;_oUY`ZE4w7f(2&(D(8*^^?sKMXHA<}1O3eU5H zsljC8$zk>^)GNEjC#<7vb80Z9Ck`Cty+MiZk+z>PpZ^?0oOCbo+MNtX_2qr=IrUB8 z(^6mBAD^P{rk5c|2xwEN_{Sq9=PCSTavxvir}`;BiBJJk%sinj^i7l!~Y%n#KoC%;DbT2P2W zM%5zLmp8o{f@ndGYhP`*nqNf-4cT@hvByU4`x8b^U6I zE66aCy1iO8Tkm+QwT0-izn)Sf-*7WQ$H}D3CwH4GSy5MLq=KeYzC%> z6XbVRvrR1W^a8UHWHmH7Nh|S3NluRb5HY%e6T`|_1TNRHWESVwbs3fZ@pg)wh%_JfUa0tanq*nYpYkPD{ZMk$1g)tmHzmhp)b?6nDL1e; zJI&aFqY9%!6s1ISaSi=FTi7uN=66}oXP!!kIQ$-K@wC=Nu|p#U{5MK(r!dgzKl{^> zbmffgW1-_X)QZD;5ZXiNE|}Djpc=xc*Wgus828jiSUihjA+Mgsp*j&GUb)qBe1UbsWCgqfWg36rt$m{OoSG$GICXVnijH6itcJJOKV4} z!-Y&xyc{JzS96zyVCvm?Qq9mkT*y^R%tiLa(o+r}lzF43Y3m0WUR8^7kJ+$l1$9Q{ zmG0rsa^NI3<+WsHXdT1rnzHJ=7yS_(=kOE5e&_(Z7PcMO+?s)-Y|p?k%Pkr>=G-D! zuB0eIsR=j6=Se&n7}rCt-UTk`zmdb`oRguP3-7`gvxB0lg)z3kM&?6cGxNcQ|bel226%-KhWS~Uz*EQYmGV8>p<6u|Bo8}tj{ zG7IqtoGAJrk0cxBrB(}SNvi_DmqDfoGWhVGqG}ugN_n{Vl>|V?_5u`-`}RRnO*9|O z(%p=ZSCg0pKyDG5ec@Wg(^nF39oh>Qh>(Ja@*=V_hZD*}=mrR)b{R1Nsln3Am=t)f6M-@^O1!~z~@9@*oxP;*Lu}Pd}|-r87;~u zTIcocwGKnZQTw!hFIp=nTIcocwT{3PB60gPzli1zB%0^-?Kh7I;dr{I1xa3ewc&4BO*D&kJ&OGSqxb0u=ps8kFj`x#UEkuaTYJ42y!}aOB65q){Tw|A<=z|#G(Wn_6ZnMCAcyd zU*RSH>ZBb1XnOG{1mQF?jvycegJuOy2xtNzJRg*SaG+6E@quz8D##(RgRW@F-*jt| zt*B&B!4&Zigu1nE=PG9X7tqy0Mq_Xi3ovZRmt2LajolyBNqChtEJ3t==9?}QHO~Gh z-csMr;*YWTBn!dWckt{57N1~|HntQw?oC7o)wp5bVZHKJ`TKdWC$?fVg1n0awtll0 zyF7d&HX%NUix4fL+k?f6%ttaiImQxqig?CgvV`ni8!k~v;!e3i0Wm3_BaDxTq#~nq8NFcsZJ$xbD4ssb+(X0njkYCkHEGAGaObV)lToe1r zn!frpAAE+zcd_^^ilC&|4!CD2DC%UO?+1`qdxDx%zGt zL9y*M*49@#%CFA7XE{3GAJGRiPk#>^kY+``i&$)36+YmK4o&!AQXgw!u!FiFm}tX) z2)hf+ZjisqEBG1T%jW(Bi|=FcCs_=!KZ1Cw;|GU&;y92F#9JwxQiX_ipa=YFIE}=B zD_2^LLm&#bh~-!qQds^xNAUeDh#&RmSp0bw*IDecAV&7kL;YFYtsWdwB6J$CsdLEj z9Na=ki1)E6A;c|qImC4^83wgN-Y>_OY33h6Ki%EOV)R?b&Ep#VxE=qI9kx!724f&~*@?Sl10ok+w_gxddq~#6h6llpjpO zXsY=wq^~ebcn>AP?A+2$d-?GMAw_kSwaX@E=}@e`fB~t$%;I)r zBPgu(x$)9zzc)#t8KKbj!C@M}VpK1jT)+0{<$4~y@h>%vT*8g9h?PkM%PD#qk#%30 zMkWRm&`tS4QBXSp-Bf^XDi1i3USTIu^!GH!9kJJs9-sm5WhrU>_M^mD*&!K z`2^-bWL0yc|6c4)j>YZ|;zjk>S^Nzaw}s+~*08@1B(W^|-`YN$z;dGMUMq$ZNX)?0 zc4P63sd}e`X*hxB0hY~P&WMqjg}y2Yrpv%|5txRV2~1CNQEOi&&L|=vD6BNvST4up z9iw6&98WxsZLS^cJ8JC3@YMbo{#!(D-1hCExwsN_`CJmobDEXs5=f3KUW^UIKWNkr z2OVU%*uD>1%jaQ1>YWX@h1VfU|28pvTkKn+)vEhk8-v(G3B(R-A`tMG(9^Q|0hF+S zd7=Iqipz*c4X@PS+;i*l^2NQuq`%77e~85wS^O}I;VdI(;+As?csGHh;a{*yMgFVf zJpQwBb`C#(8AUYF;JYP=?c=*87QS0z<4QuTZU$EwT;V%7c$ULeBG@Y5gvrZfWZ=s- zlbC|0)GQiJbq82?3=*ss&%>wdwB93|!|T(i%s(FaJCC1#H;RP7 zhlw+h7YS84IhcYALqOoTOa|t8@e+dUn$v1IND#sb)#;$EQUlEdSAi49_dXyb3J$z zl~Lqv89X>HKsjtr&e&*BPSS#z9@2WjQa^^LDe7|KJBOct7)8WPuuAZ$B(Yi;k)Ph4 zB~VYn0e7*BO;b43?O%ITJ%l%dX+{s|@4#iJ_ZX}G%NJkyUtjq8&pom7@k%l?=}CnhOGuy(6$V<5{{WBf^Cl|iC=r)#V^J@8kB_Bs zdepi{>|};X?d57tubCs1Mr!Y61ti?y{y3Tac!V?%@%8({64CN@gg2*$@j}!AsPfMM zM2af6f}uOdKsC%KsFSe#<1vfhdHj58{|HNr^&x&j4G&C}hN80aoNelcG7 zB}p>)2_ES%4)MqoT8%|pt*jzAA?Tw**^4<#bDU_Kp=yt(icdwu0KV=T57BEul#P*m zXVf$>^e+J0ZDUAu*@#F!)mUqF8t(03DUaM9z7=6=JdcH#`sV<3oPd6JG#p^+#28G4 zki8ac<->PB8+8GU{S3euvxZ2?6@C+xO05L2!x?)jjkk}o;LUBUNBvM{CQbc-)v0T6n0fmXeM(N>1^lK93T7M)-_&<@ZHH1NQR79{kg| zd#Vc?KVfz1Xx%+Lu}qIMw*6wX3YiF3W{0qZF;s#QAPWKE)CdxZJf^`34tm(w8|Ulm z#k$WCJi!Lid$#8Z;Fwyk8DNPvB>+}Gi$SV?#bO+U)6%z!H#K}d1>M0Ix?zoF1j4nCe}2MGgoVS-=$>Koq&AH*Na*!vn!g@)qN+!4clk zmVIp%A9CT2%bGlyV&Gk3vuz~8`N1L9#D=#%zcv92wT|ruSUoDPAd1Dk6WyTL>8$9? z3%z{v0-zAnJtzT>Eq<*GSqDFYyL)`vpn#9(c`bZOqI&p}?CrZK+e`KjCf_j{O#avG z?K3Pmdi9Ge{tb&?LJ^cXn$_^Ta_Zmme!%;)sZq(QgZgDY{S_7;XYm3H@j!l+XM}&O z+bomO7`9di@x~93zbFm{qMr9iAVRVs>U_w*qxii#Ume^L&KlvXaQRR>ei3I0U(FBZ z!B+>tO$=7fgRkbmS4Rf(;Hx8p!#CqAH4dS~rTR4%F$&eM^YW%R+e2>k@9<9bP?FO7 z2CI*1Lcfo_e452LxMD)zK5z+I{slJw7g_8}OR9k%+DpsS98Z;g4nO}>C?ZqeW$ap# z1`)YtEF1o>m-8}S76yHupV!5mg2c9sY7tKg9#+nH2mU9aK5#|JbVKQ<1I`003@PF~%)8lL2nROmWR4+;dRKD` zl*&$a>+xPe@3MOl{XM&c>}8~1UoXMP%^^?L#3DY9xHEyCc&6`LOvio@soKwPbDvno z*eIjNxUWH$Pc5T{ttb$N{BledGA`NXDg68+C?u76hN;XhvcSp6I;DBRN(->C1jP3_ zyfZGnS=I0$h>(uF=7k99sodppSWsK55hX0gRM&?1mx*IwFv&cPuqq%)( zELQ8#5%NcMMDY|}z5u1+V&fUOM|hSAA-hNt!S*`~Kj;NWpS6o5|D8O}v&g8)?-cPy zY3u(m;pvKvjac^&N=PWtwXuA=i!AMVZ1}s*RX}sz*g*oxAb-S|;5~a#U=47(9o4{Q zorz;)ti&Cund5!d=C*>JGGt|+_vOB^5%)c(dz#Qag)Ku$bX&uIN8gK{P;%tigqBM5 zK8Z0PC{H+dO3y!p{Bw@4#0gFE48u)`!a4EOtV5Cy0omBXnuEdJg!wFt^BC@F#vw-q znHoOpC(NQQuy(kp_I1|!FD(8mi~q)gT*0tAn>x#L8?RQat<(6Ok0|$YkNB4ppflj-bv}fC(#Od2l@%v z;4a{leqw@mT0hzQ=%-oeC&aersE450$=aB6VqsFhiyP`|ysITijl;|DvC=q^`R{mO z+88!t2psmTxnyon#X}TS#vwpT1}lnmaI(V)?XBh12+xXMmx#P*+f2Ay!R~R>Cb#`T z0;rkEZyc9v53->)wx7pnagD7s7%kSpIa;l69>f_E^oHZ+kTtuAiXj^CTnv*T2I6s7 zvs4`K7^V7u##;prUwbYb{v5oQ?NW?@&3N#rHXQujxWF_gd+S_ITe8;&!ive6JE6JH zj(dSHj4;(m*d3G;4ksUL%85~@Gt;qSYe{QC?2cNxbYT=&j(CQ^a{e)}btwVnJ5t7F zJR6@v#Slo~TPz05$J7}-rZ4ub>DD`afFeUDLaT{v#j!CJQn0ew$}9)qN|^ zs67;ANs*&O95s1=pO<&03mTf@rF@zCrh=;icE}X$f{p!bQkHUv&de6(3;9B!kS$~u zCRC3v^;vv?#U_iZEVfusPL?k(%LS|zto_LCZ;L8$S>Zc*@iL1~u{Huraz`ruDc=6m zyuGYG$8(Zi{TUQ+ZRG~fb)!;Op6eHoZS@O$$fmXBsm+98=ZdEQ3XK!ci^~f$`jypN zer4e;!9?OCJHce?OI7?VM)b`cZp6Xo%;2-V39VPN@<~ZGAD!dl7AJ77#qeD`TS5^O zqR(K+CpuJ}_evk+|FQ87ey&VDfFWOyknQjaEN3W+p~|wzv7q{w9bd99Nm4H*S6))u z<;w@^URGITaUY8^i%Aw!ET&n^usFbij-iBB6fHSnm~osG6yC1C2y&J>OkDEJ#|$T9 zXR?-g>;G~Ee&(S({MZA|EKGtq7*R8JAwN4ko1ZPt&K4R4R4q(S%}!0tW{3aqZV|s6 RekGolic@z_J;a=Z{|9Nd=6V1C literal 0 HcmV?d00001 diff --git a/analysis-master/analysis/__pycache__/regression.cpython-37.pyc b/data analysis/analysis/__pycache__/regression.cpython-37.pyc similarity index 100% rename from analysis-master/analysis/__pycache__/regression.cpython-37.pyc rename to data analysis/analysis/__pycache__/regression.cpython-37.pyc diff --git a/analysis-master/analysis/__pycache__/titanlearn.cpython-37.pyc b/data analysis/analysis/__pycache__/titanlearn.cpython-37.pyc similarity index 100% rename from analysis-master/analysis/__pycache__/titanlearn.cpython-37.pyc rename to data analysis/analysis/__pycache__/titanlearn.cpython-37.pyc diff --git a/analysis-master/analysis/__pycache__/trueskill.cpython-37.pyc b/data analysis/analysis/__pycache__/trueskill.cpython-37.pyc similarity index 70% rename from analysis-master/analysis/__pycache__/trueskill.cpython-37.pyc rename to data analysis/analysis/__pycache__/trueskill.cpython-37.pyc index 1d5c8c7b500a5f67fd06daf559a6c6db1d31fef7..15c7554df5d4e48dc76a35fea45586d99213951b 100644 GIT binary patch delta 3279 zcmZ{me^6A{70353>|@zwl2t(TQiXIWTLHf&bo%Me@UMiVdR zFpWxQan?ratR5Dp#mP>pnVrivQP=FM)OKN8%nXL8Q3z%uZ>I@mnRH*SYU>aK{C)u! z06*S0k8{brY2u#gP%VuxA`RBYuk(!j64+@ zTWD25#4bk?Mn=Riy_ugz9~TVUJD@WSSO9FMGliS7Iw5WawgWqWoxn7Dp?nJKpwJ`P ztV7-T$Q{P^(AK##SvL*LZBU+rP8a3O%eUilQfKI)l2+1d?-a^QIph+ejhYKpRQp2vU{Z~#&XKDtKE=EUeW#Eb2v z(?v_DxBP3)ePXZ!@lF(i*?6Cc?~@TPU2rh92L_0^mKgT?BEt5I1vA+J8TY@a0u z&KL9Zh1laTT`qZ;?N$F-vYZK}lF}8zXnW~Hl~C1H`h?^%%lgnv!APCIMKi5!@CO3? zFmwumrN9y32f#!DlquvifYiIC8EnxHA>+g@n?5O%G-ihdJxXKH8;msRS(I6p(Rh(o zFL{vlQPYwt>sYPy$!PQnyC3~WG)xvd?-kMLV<+h4vRu2|=p}6bW8kC=jI#7lZs(NKLerI?+3UEk+1tn)YJIiAP%zfYbK!?7?{C08 zm7S&S?u+aKxtH%3&Ev-MEJcOFA*tY8@i2Q$UY0d0{$?G(L@6++u6(?fDaRl?=t^>y z`qmSVGNxa?$rTIJhA{IJ;HSXP0R2J_((Z~(HmDx2SjFscQuY=83ZytCS7zt53DK3L zN5+9+dC~qy6@AKExy3vPb#W!B&6Q0_D-T*_pbKHxFAp)i^0!ldiBC*uW?ya8TNf17 z=D}FCuGhcne9o^Rz9!&O^v&-X={0!@^KQB1;cxwVE;RXNAO;(~p!t~1B}|Rm1D~ga z^+Z)&{V&D_seg@&om1aiv)IUvQdZSuehg8i3U_OFeJc(CCc@<9_}-jD7(85%?4EDImL*g})E^L*P0fSCVUL_#C%0KFe1Rj0{fgSfi;zTF(PB4K$0)nB1rPNbLb2FKOeN@a4_Pn^M_(S{yB{PO8tR=O+L0G z&GeQ!wf;jRdy5jDu3)#-RZp*A>>c^~cT^|R>GeDE-VuhP>t2C9jP%yKR!EZ*Mt)H! z2A6}sjk$Lz7<#}ZGn|C)65uo79{>W&Wx|g^>ZVhnthE1%@NLZenXZQ_r(e>mMNA0A3{?o~}q|Z>xvG841!Emx<5D>>L3tS=4yY7g_6%>UDHL z42lE3uYST1pvywJRH zK9VRJ%K&ts?Ml*;^cGYwDinH5c$Fd?x?BZrQn;naXk|3KEQ5wxW~NJfY$RHHGPbe+ z`m^P1&1NZ7&{`>;y3MWAjEvEgXYLn!(#6(vF?Oxho&P#km5bPfp?FTlMFUg#F+1|; zKvGfo8BD0gQQBrPW-ywWgDH%QQ$IJ@Ue58se#d% zw(nan!kuB@7*%d`x8oV*n}Bwp1K17h1A2g70F9L=h&6d4U;-2%2`~d^pmG+F*I2%M c@-E9LTcMHy$g?7dBJ&nO97+_5$j+XB1M!nvy#N3J delta 3281 zcmZ{mdr;KZ70353yFV6|B@2iwL8JIeHi}3R5fv2hfoK?N5@*cPxURAbTY2T~s(=cD zku+9Q;8RwSt7ZMX_<+L=hg<7VqjBDTs*}`B57+J6wWdo(oP9{rQNHkJ! z+9A#u2!d{=@wrypt(7)LJmWokBZd=!*}zsh@l-=%6U6PntH5`G*C_AlN#o$2i-fVf#Ta95QPECPN&adVRC>a17t zT6pM;k`8E-AJ`L=6JQ160W}-DbPm-=IklkfqK%Ga)+~4P zX3xa!L6Fgmu&L7PsgfKGoJ_;8k;G&b8I+9@-8o~C@;=vLMwv4;+1Co<7RA7*!meN>i{CHAYj zoXa`E=TSayS;8B-CpG6jUJO^=N(O_o8MoN89B-wfPAPUKQPR zWI>u;#r_Fm9RZG_7VQhK7AgHmgFL9PJPNmw392`&dY-DwR9-)3Cs$q=TQ4@RCQh)0o$({A`6!i1X@R6c_eeRn%Nq zdqYc?t`Vj;5h8Edn9!wV&j^8g_niG_u)haf0Dg|^ozlxYntF_yp8Ikp9OQ2Rq%hR0a>Vu5 zFu8yd;5cv$wPvf;>$UVmA6Fd)yua+%?Z z8B)1R{cD4IHa##F0Dj<#T0*YeA^1@rd~vVhMCx(PACgi^hNXrQ4?k)*N|MACx>s_` zrXClRoF9;Dbm!YC;uEsIbWc;+?W3qwS<`X(oTl(2z6wt;=&f=OXZT0fhhu|YPo=xY zD}C+_9vP5tQ}wE^Z2D|H>SwgtJz3mj{iC5ScY!EW#+hu?4;T%h-+wbC^^HJ7>UI7t zBy~8KAffHKRO(2+q#2$uvvxwQIwcL#|6VPpIc%1ms&zx1;g5qI2lt zse1Rp_Im)q!qH{2dVP&M;IH?}FtncnUjTmsz6M4yIHivv-vCe-sUoSEpJ4dV${4;4 zB!=Ety9TKp$N|*nEM5=rO*w?4D*aXNQg21jBX42S->BQ?vo%3f z=?Qr|lu~xnD1JwS{vy#ITK1hnAwHsmt|U6P?lsFt?8(pQWy+}--*^?%{s4^R6U)P} z7O0j%Z>dxV7zqc}zJG!A4*>O)>OAor=pVj#Na~B1$&xcg-^u?~yB|(}X1F5P(5DrJ z1xQFP092Q&L;fp-SWx^#=5&>VSigABV2hEEeJrJtniY8}L3$tL0`*uMK@6Cx}yI z4orGpZA5hpmI-SW-m0=-xyy<#wY$<2l>S=zPt5-p!)5Ud>0BnaC+KmRnE{W=*riqa zOG_)f@;Yq}BwI(?=`3{xy7;!{1%2Xls5@vC3BTZ2_1fg=8NSJrLBTVmJV%bUU(5hb?MYwcL_sv5l31BhaNUB zT=eVb_su*Cb+vN4T$X5(fX&X^yWld#^UoZ4|#Xyj?2kIHJZgoV0l z7bGbM1mZs;8h_zrB%pt+Y;|Kr6iuxw7AI*_-9&MpE@V2AG2`Wkp}%nkVHD9K))*t? zNxEEDFynnJpn^toAZMihr%ZL^DVXfQNEJ@w>*2W1%6f#fuwXD+M7+?1yl)^`|I8Q_ z4EuGO^k=${W&PRc$Lu)RnlanRf", - "Arthur Lu " - ) - - __all__ = [ - 'factorial', - 'take_all_pwrs', - 'num_poly_terms', - 'set_device', - 'LinearRegKernel', - 'SigmoidalRegKernel', - 'LogRegKernel', - 'PolyRegKernel', - 'ExpRegKernel', - 'SigmoidalRegKernelArthur', - 'SGDTrain', - 'CustomTrain' - ] - - global device - - device = "cuda:0" if torch.torch.cuda.is_available() else "cpu" - - #todo: document completely - - def set_device(self, new_device): - device=new_device - - class LinearRegKernel(): - parameters= [] - weights=None - bias=None - def __init__(self, num_vars): - self.weights=torch.rand(num_vars, requires_grad=True, device=device) - self.bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.bias] - def forward(self,mtx): - long_bias=self.bias.repeat([1,mtx.size()[1]]) - return torch.matmul(self.weights,mtx)+long_bias - - class SigmoidalRegKernel(): - parameters= [] - weights=None - bias=None - sigmoid=torch.nn.Sigmoid() - def __init__(self, num_vars): - self.weights=torch.rand(num_vars, requires_grad=True, device=device) - self.bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.bias] - def forward(self,mtx): - long_bias=self.bias.repeat([1,mtx.size()[1]]) - return self.sigmoid(torch.matmul(self.weights,mtx)+long_bias) - - class SigmoidalRegKernelArthur(): - parameters= [] - weights=None - in_bias=None - scal_mult=None - out_bias=None - sigmoid=torch.nn.Sigmoid() - def __init__(self, num_vars): - self.weights=torch.rand(num_vars, requires_grad=True, device=device) - self.in_bias=torch.rand(1, requires_grad=True, device=device) - self.scal_mult=torch.rand(1, requires_grad=True, device=device) - self.out_bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.in_bias, self.scal_mult, self.out_bias] - def forward(self,mtx): - long_in_bias=self.in_bias.repeat([1,mtx.size()[1]]) - long_out_bias=self.out_bias.repeat([1,mtx.size()[1]]) - return (self.scal_mult*self.sigmoid(torch.matmul(self.weights,mtx)+long_in_bias))+long_out_bias - - class LogRegKernel(): - parameters= [] - weights=None - in_bias=None - scal_mult=None - out_bias=None - def __init__(self, num_vars): - self.weights=torch.rand(num_vars, requires_grad=True, device=device) - self.in_bias=torch.rand(1, requires_grad=True, device=device) - self.scal_mult=torch.rand(1, requires_grad=True, device=device) - self.out_bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.in_bias, self.scal_mult, self.out_bias] - def forward(self,mtx): - long_in_bias=self.in_bias.repeat([1,mtx.size()[1]]) - long_out_bias=self.out_bias.repeat([1,mtx.size()[1]]) - return (self.scal_mult*torch.log(torch.matmul(self.weights,mtx)+long_in_bias))+long_out_bias - - class ExpRegKernel(): - parameters= [] - weights=None - in_bias=None - scal_mult=None - out_bias=None - def __init__(self, num_vars): - self.weights=torch.rand(num_vars, requires_grad=True, device=device) - self.in_bias=torch.rand(1, requires_grad=True, device=device) - self.scal_mult=torch.rand(1, requires_grad=True, device=device) - self.out_bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.in_bias, self.scal_mult, self.out_bias] - def forward(self,mtx): - long_in_bias=self.in_bias.repeat([1,mtx.size()[1]]) - long_out_bias=self.out_bias.repeat([1,mtx.size()[1]]) - return (self.scal_mult*torch.exp(torch.matmul(self.weights,mtx)+long_in_bias))+long_out_bias - - class PolyRegKernel(): - parameters= [] - weights=None - bias=None - power=None - def __init__(self, num_vars, power): - self.power=power - num_terms=self.num_poly_terms(num_vars, power) - self.weights=torch.rand(num_terms, requires_grad=True, device=device) - self.bias=torch.rand(1, requires_grad=True, device=device) - self.parameters=[self.weights,self.bias] - def num_poly_terms(self,num_vars, power): - if power == 0: - return 0 - return int(self.factorial(num_vars+power-1) / self.factorial(power) / self.factorial(num_vars-1)) + self.num_poly_terms(num_vars, power-1) - def factorial(self,n): - if n==0: - return 1 - else: - return n*self.factorial(n-1) - def take_all_pwrs(self, vec, pwr): - #todo: vectorize (kinda) - combins=torch.combinations(vec, r=pwr, with_replacement=True) - out=torch.ones(combins.size()[0]).to(device).to(torch.float) - for i in torch.t(combins).to(device).to(torch.float): - out *= i - if pwr == 1: - return out - else: - return torch.cat((out,self.take_all_pwrs(vec, pwr-1))) - def forward(self,mtx): - #TODO: Vectorize the last part - cols=[] - for i in torch.t(mtx): - cols.append(self.take_all_pwrs(i,self.power)) - new_mtx=torch.t(torch.stack(cols)) - long_bias=self.bias.repeat([1,mtx.size()[1]]) - return torch.matmul(self.weights,new_mtx)+long_bias - - def SGDTrain(self, kernel, data, ground, loss=torch.nn.MSELoss(), iterations=1000, learning_rate=.1, return_losses=False): - optim=torch.optim.SGD(kernel.parameters, lr=learning_rate) - data_cuda=data.to(device) - ground_cuda=ground.to(device) - if (return_losses): - losses=[] - for i in range(iterations): - with torch.set_grad_enabled(True): - optim.zero_grad() - pred=kernel.forward(data_cuda) - ls=loss(pred,ground_cuda) - losses.append(ls.item()) - ls.backward() - optim.step() - return [kernel,losses] - else: - for i in range(iterations): - with torch.set_grad_enabled(True): - optim.zero_grad() - pred=kernel.forward(data_cuda) - ls=loss(pred,ground_cuda) - ls.backward() - optim.step() - return kernel - - def CustomTrain(self, kernel, optim, data, ground, loss=torch.nn.MSELoss(), iterations=1000, return_losses=False): - data_cuda=data.to(device) - ground_cuda=ground.to(device) - if (return_losses): - losses=[] - for i in range(iterations): - with torch.set_grad_enabled(True): - optim.zero_grad() - pred=kernel.forward(data) - ls=loss(pred,ground) - losses.append(ls.item()) - ls.backward() - optim.step() - return [kernel,losses] - else: - for i in range(iterations): - with torch.set_grad_enabled(True): - optim.zero_grad() - pred=kernel.forward(data_cuda) - ls=loss(pred,ground_cuda) - ls.backward() - optim.step() - return kernel - class Glicko2: _tau = 0.5 @@ -1016,4 +792,4 @@ class Glicko2: def did_not_compete(self): - self._preRatingRD() \ No newline at end of file + self._preRatingRD() diff --git a/analysis-master/analysis/regression.py b/data analysis/analysis/regression.py similarity index 100% rename from analysis-master/analysis/regression.py rename to data analysis/analysis/regression.py diff --git a/analysis-master/analysis/titanlearn.py b/data analysis/analysis/titanlearn.py similarity index 100% rename from analysis-master/analysis/titanlearn.py rename to data analysis/analysis/titanlearn.py diff --git a/analysis-master/analysis/trueskill.py b/data analysis/analysis/trueskill.py similarity index 100% rename from analysis-master/analysis/trueskill.py rename to data analysis/analysis/trueskill.py diff --git a/analysis-master/analysis/visualization.py b/data analysis/analysis/visualization.py similarity index 100% rename from analysis-master/analysis/visualization.py rename to data analysis/analysis/visualization.py From 2275fbcfb307e27022e424fab9166be50d4da710 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 10:25:20 -0600 Subject: [PATCH 02/17] 10:25 --- data analysis/superscript.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data analysis/superscript.py b/data analysis/superscript.py index 3a3c590c..7c4a0a41 100644 --- a/data analysis/superscript.py +++ b/data analysis/superscript.py @@ -332,7 +332,7 @@ def load_metrics(apikey, competition, match, group_name): metrics = db_data["metrics"] elo = metrics["elo"] - gl2 = metrics["gliko2"] + gl2 = metrics["gl2"] ts = metrics["trueskill"] group[team] = {"elo": elo, "gl2": gl2, "ts": ts} From 4b629eeb3be2beed7238f91ec0843d0331b0c0a7 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 10:43:45 -0600 Subject: [PATCH 03/17] 10:43 --- data analysis/superscript.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/data analysis/superscript.py b/data analysis/superscript.py index 7c4a0a41..2b8a2bee 100644 --- a/data analysis/superscript.py +++ b/data analysis/superscript.py @@ -324,13 +324,16 @@ def load_metrics(apikey, competition, match, group_name): gl2 = {"score": 1500, "rd": 250, "vol": 0.06} ts = {"mu": 25, "sigma": 25/3} - d.push_team_metrics_data(apikey, competition, team, {"elo":elo, "gliko2":gl2,"trueskill":ts}) + d.push_team_metrics_data(apikey, competition, team, {"elo":elo, "gl2":gl2,"trueskill":ts}) group[team] = {"elo": elo, "gl2": gl2, "ts": ts} else: metrics = db_data["metrics"] + + #print(metrics) + elo = metrics["elo"] gl2 = metrics["gl2"] ts = metrics["trueskill"] From 37109a494779b915418220a8c5806083ec115ede Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 10:57:39 -0600 Subject: [PATCH 04/17] 10:57 --- data analysis/superscript.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/data analysis/superscript.py b/data analysis/superscript.py index 2b8a2bee..b17009aa 100644 --- a/data analysis/superscript.py +++ b/data analysis/superscript.py @@ -324,7 +324,7 @@ def load_metrics(apikey, competition, match, group_name): gl2 = {"score": 1500, "rd": 250, "vol": 0.06} ts = {"mu": 25, "sigma": 25/3} - d.push_team_metrics_data(apikey, competition, team, {"elo":elo, "gl2":gl2,"trueskill":ts}) + #d.push_team_metrics_data(apikey, competition, team, {"elo":elo, "gl2":gl2,"trueskill":ts}) group[team] = {"elo": elo, "gl2": gl2, "ts": ts} @@ -332,8 +332,6 @@ def load_metrics(apikey, competition, match, group_name): metrics = db_data["metrics"] - #print(metrics) - elo = metrics["elo"] gl2 = metrics["gl2"] ts = metrics["trueskill"] From 864b27bc0cc7b297be5b71c4404d661402ac61c9 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 11:14:10 -0600 Subject: [PATCH 05/17] testing --- data analysis/superscript.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/data analysis/superscript.py b/data analysis/superscript.py index b17009aa..18d95ed6 100644 --- a/data analysis/superscript.py +++ b/data analysis/superscript.py @@ -176,16 +176,12 @@ def simplestats(data, test): if(test == "regression_sigmoidal"): return an.regression(list(range(len(data))), data, ['sig']) -def push_to_database(apikey, competition, results, metrics, pit): +def push_to_database(apikey, competition, results, pit): for team in results: d.push_team_tests_data(apikey, competition, team, results[team]) - for team in metrics: - - d.push_team_metrics_data(apikey, competition, team, metrics[team]) - for variable in pit: d.push_team_pit_data(apikey, competition, variable, pit[variable]) @@ -279,6 +275,14 @@ def metricsloop(tbakey, apikey, competition, timestamp): # listener based metric blu[team]["gl2"]["rd"] = blu[team]["gl2"]["rd"] + blu_gl2_delta["rd"] blu[team]["gl2"]["vol"] = blu[team]["gl2"]["vol"] + blu_gl2_delta["vol"] + temp_vector = {} + temp_vector.update(red) + temp_vector.update(blu) + + for team in temp_vector: + + d.push_team_metrics_data(apikey, competition, team, temp_vector[team]) + """ not functional for now red_trueskill = [] blu_trueskill = [] @@ -305,11 +309,6 @@ def metricsloop(tbakey, apikey, competition, timestamp): # listener based metric """ - return_vector.update(red) - return_vector.update(blu) - - return return_vector - def load_metrics(apikey, competition, match, group_name): group = {} @@ -334,7 +333,7 @@ def load_metrics(apikey, competition, match, group_name): elo = metrics["elo"] gl2 = metrics["gl2"] - ts = metrics["trueskill"] + ts = metrics["ts"] group[team] = {"elo": elo, "gl2": gl2, "ts": ts} From 201752a55e281a800345587e420f41131b943b53 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 11:16:24 -0600 Subject: [PATCH 06/17] testing part 2 better electric boogaloo --- data analysis/superscript.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/data analysis/superscript.py b/data analysis/superscript.py index 18d95ed6..192c5905 100644 --- a/data analysis/superscript.py +++ b/data analysis/superscript.py @@ -176,12 +176,16 @@ def simplestats(data, test): if(test == "regression_sigmoidal"): return an.regression(list(range(len(data))), data, ['sig']) -def push_to_database(apikey, competition, results, pit): +def push_to_database(apikey, competition, results, metrics, pit): for team in results: d.push_team_tests_data(apikey, competition, team, results[team]) + for team in temp_vector: + + d.push_team_metrics_data(apikey, competition, team, temp_vector[team]) + for variable in pit: d.push_team_pit_data(apikey, competition, variable, pit[variable]) @@ -198,11 +202,12 @@ def metricsloop(tbakey, apikey, competition, timestamp): # listener based metric red = {} blu = {} + red = load_metrics(apikey, competition, match, "red") + blu = load_metrics(apikey, competition, match, "blue") + + for match in matches: - - red = load_metrics(apikey, competition, match, "red") - blu = load_metrics(apikey, competition, match, "blue") - + elo_red_total = 0 elo_blu_total = 0 @@ -275,14 +280,6 @@ def metricsloop(tbakey, apikey, competition, timestamp): # listener based metric blu[team]["gl2"]["rd"] = blu[team]["gl2"]["rd"] + blu_gl2_delta["rd"] blu[team]["gl2"]["vol"] = blu[team]["gl2"]["vol"] + blu_gl2_delta["vol"] - temp_vector = {} - temp_vector.update(red) - temp_vector.update(blu) - - for team in temp_vector: - - d.push_team_metrics_data(apikey, competition, team, temp_vector[team]) - """ not functional for now red_trueskill = [] blu_trueskill = [] @@ -309,6 +306,11 @@ def metricsloop(tbakey, apikey, competition, timestamp): # listener based metric """ + return_vector.update(red) + return_vector.update(blue) + + return return_vector + def load_metrics(apikey, competition, match, group_name): group = {} From 2fa0d75a3007c3325d4b3ec10f3b4908e506a1aa Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 11:18:02 -0600 Subject: [PATCH 07/17] a --- data analysis/superscript.py | 1 - 1 file changed, 1 deletion(-) diff --git a/data analysis/superscript.py b/data analysis/superscript.py index 192c5905..7cdfee98 100644 --- a/data analysis/superscript.py +++ b/data analysis/superscript.py @@ -205,7 +205,6 @@ def metricsloop(tbakey, apikey, competition, timestamp): # listener based metric red = load_metrics(apikey, competition, match, "red") blu = load_metrics(apikey, competition, match, "blue") - for match in matches: elo_red_total = 0 From 548668e2a4ca191ea40aed20653671e23f3e3ebc Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 11:27:32 -0600 Subject: [PATCH 08/17] maybe working --- data analysis/config.csv | 6 ++++-- data analysis/superscript.py | 27 +++++++++++++-------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/data analysis/config.csv b/data analysis/config.csv index d1975c6a..42e42922 100644 --- a/data analysis/config.csv +++ b/data analysis/config.csv @@ -1,9 +1,11 @@ 2020ilch balls-blocked,basic_stats,historical_analysis,regression_linear,regression_logarithmic,regression_exponential,regression_polynomial,regression_sigmoidal balls-collected,basic_stats,historical_analysis,regression_linear,regression_logarithmic,regression_exponential,regression_polynomial,regression_sigmoidal -balls-lower,basic_stats,historical_analysis,regression_linear,regression_logarithmic,regression_exponential,regression_polynomial,regression_sigmoidal +balls-lower-teleop,basic_stats,historical_analysis,regression_linear,regression_logarithmic,regression_exponential,regression_polynomial,regression_sigmoidal +balls-lower-auto,basic_stats,historical_analysis,regression_linear,regression_logarithmic,regression_exponential,regression_polynomial,regression_sigmoidal balls-started,basic_stats,historical_analyss,regression_linear,regression_logarithmic,regression_exponential,regression_polynomial,regression_sigmoidal -balls-upper,basic_stats,historical_analysis,regression_linear,regression_logarithmic,regression_exponential,regression_polynomial,regression_sigmoidal +balls-upper-teleop,basic_stats,historical_analysis,regression_linear,regression_logarithmic,regression_exponential,regression_polynomial,regression_sigmoidal +balls-upper-auto,basic_stats,historical_analysis,regression_linear,regression_logarithmic,regression_exponential,regression_polynomial,regression_sigmoidal wheel-mechanism low-balls high-balls diff --git a/data analysis/superscript.py b/data analysis/superscript.py index 7cdfee98..7ee79e5d 100644 --- a/data analysis/superscript.py +++ b/data analysis/superscript.py @@ -114,7 +114,7 @@ def main(): print(" finished tests") print(" running metrics") - metrics = metricsloop(tbakey, apikey, competition, previous_time) + metricsloop(tbakey, apikey, competition, previous_time) print(" finished metrics") print(" running pit analysis") @@ -176,16 +176,12 @@ def simplestats(data, test): if(test == "regression_sigmoidal"): return an.regression(list(range(len(data))), data, ['sig']) -def push_to_database(apikey, competition, results, metrics, pit): +def push_to_database(apikey, competition, results, pit): for team in results: d.push_team_tests_data(apikey, competition, team, results[team]) - for team in temp_vector: - - d.push_team_metrics_data(apikey, competition, team, temp_vector[team]) - for variable in pit: d.push_team_pit_data(apikey, competition, variable, pit[variable]) @@ -202,10 +198,10 @@ def metricsloop(tbakey, apikey, competition, timestamp): # listener based metric red = {} blu = {} - red = load_metrics(apikey, competition, match, "red") - blu = load_metrics(apikey, competition, match, "blue") - for match in matches: + + red = load_metrics(apikey, competition, match, "red") + blu = load_metrics(apikey, competition, match, "blue") elo_red_total = 0 elo_blu_total = 0 @@ -279,6 +275,14 @@ def metricsloop(tbakey, apikey, competition, timestamp): # listener based metric blu[team]["gl2"]["rd"] = blu[team]["gl2"]["rd"] + blu_gl2_delta["rd"] blu[team]["gl2"]["vol"] = blu[team]["gl2"]["vol"] + blu_gl2_delta["vol"] + temp_vector = {} + temp_vector.update(red) + temp_vector.update(blu) + + for team in temp_vector: + + d.push_team_metrics_data(apikey, competition, team, temp_vector[team]) + """ not functional for now red_trueskill = [] blu_trueskill = [] @@ -305,11 +309,6 @@ def metricsloop(tbakey, apikey, competition, timestamp): # listener based metric """ - return_vector.update(red) - return_vector.update(blue) - - return return_vector - def load_metrics(apikey, competition, match, group_name): group = {} From 82567a5f69dfdb69c4aaf2d157a6b77f0f8e358a Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 11:50:07 -0600 Subject: [PATCH 09/17] working --- data analysis/analysis/analysis.py | 4 +- data analysis/analysis/regression.py | 82 ++++++++++++++-------------- data analysis/superscript.py | 11 +++- 3 files changed, 51 insertions(+), 46 deletions(-) diff --git a/data analysis/analysis/analysis.py b/data analysis/analysis/analysis.py index 9297585b..3521862e 100644 --- a/data analysis/analysis/analysis.py +++ b/data analysis/analysis/analysis.py @@ -7,10 +7,12 @@ # current benchmark of optimization: 1.33 times faster # setup: -__version__ = "1.1.13.001" +__version__ = "1.1.13.002" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 1.1.13.002: + - removed torch requirement, and moved Regression back to regression.py 1.1.13.001: - bug fix with linear regression not returning a proper value - cleaned up regression diff --git a/data analysis/analysis/regression.py b/data analysis/analysis/regression.py index 6cbe7868..adf2a54e 100644 --- a/data analysis/analysis/regression.py +++ b/data analysis/analysis/regression.py @@ -1,27 +1,28 @@ # Titan Robotics Team 2022: CUDA-based Regressions Module # Written by Arthur Lu & Jacob Levine # Notes: -# this should be imported as a python module using 'import regression' -# this should be included in the local directory or environment variable -# this module is cuda-optimized and vectorized (except for one small part) +# this module has been automatically inegrated into analysis.py, and should be callable as a class from the package +# this module is cuda-optimized and vectorized (except for one small part) # setup: -__version__ = "1.0.0.002" +__version__ = "1.0.0.003" -# changelog should be viewed using print(regression.__changelog__) +# changelog should be viewed using print(analysis.regression.__changelog__) __changelog__ = """ - 1.0.0.002: - -Added more parameters to log, exponential, polynomial - -Added SigmoidalRegKernelArthur, because Arthur apparently needs - to train the scaling and shifting of sigmoids - - 1.0.0.001: - -initial release, with linear, log, exponential, polynomial, and sigmoid kernels - -already vectorized (except for polynomial generation) and CUDA-optimized +1.0.0.003: + - bug fixes +1.0.0.002: + -Added more parameters to log, exponential, polynomial + -Added SigmoidalRegKernelArthur, because Arthur apparently needs + to train the scaling and shifting of sigmoids +1.0.0.001: + -initial release, with linear, log, exponential, polynomial, and sigmoid kernels + -already vectorized (except for polynomial generation) and CUDA-optimized """ __author__ = ( "Jacob Levine ", + "Arthur Lu " ) __all__ = [ @@ -39,35 +40,13 @@ __all__ = [ 'CustomTrain' ] - -# imports (just one for now): - -import torch +global device device = "cuda:0" if torch.torch.cuda.is_available() else "cpu" #todo: document completely -def factorial(n): - if n==0: - return 1 - else: - return n*factorial(n-1) -def num_poly_terms(num_vars, power): - if power == 0: - return 0 - return int(factorial(num_vars+power-1) / factorial(power) / factorial(num_vars-1)) + num_poly_terms(num_vars, power-1) - -def take_all_pwrs(vec,pwr): - #todo: vectorize (kinda) - combins=torch.combinations(vec, r=pwr, with_replacement=True) - out=torch.ones(combins.size()[0]) - for i in torch.t(combins): - out *= i - return torch.cat(out,take_all_pwrs(vec, pwr-1)) - -def set_device(new_device): - global device +def set_device(self, new_device): device=new_device class LinearRegKernel(): @@ -154,20 +133,39 @@ class PolyRegKernel(): power=None def __init__(self, num_vars, power): self.power=power - num_terms=num_poly_terms(num_vars, power) + num_terms=self.num_poly_terms(num_vars, power) self.weights=torch.rand(num_terms, requires_grad=True, device=device) self.bias=torch.rand(1, requires_grad=True, device=device) self.parameters=[self.weights,self.bias] + def num_poly_terms(self,num_vars, power): + if power == 0: + return 0 + return int(self.factorial(num_vars+power-1) / self.factorial(power) / self.factorial(num_vars-1)) + self.num_poly_terms(num_vars, power-1) + def factorial(self,n): + if n==0: + return 1 + else: + return n*self.factorial(n-1) + def take_all_pwrs(self, vec, pwr): + #todo: vectorize (kinda) + combins=torch.combinations(vec, r=pwr, with_replacement=True) + out=torch.ones(combins.size()[0]).to(device).to(torch.float) + for i in torch.t(combins).to(device).to(torch.float): + out *= i + if pwr == 1: + return out + else: + return torch.cat((out,self.take_all_pwrs(vec, pwr-1))) def forward(self,mtx): #TODO: Vectorize the last part cols=[] for i in torch.t(mtx): - cols.append(take_all_pwrs(i,self.power)) + cols.append(self.take_all_pwrs(i,self.power)) new_mtx=torch.t(torch.stack(cols)) long_bias=self.bias.repeat([1,mtx.size()[1]]) return torch.matmul(self.weights,new_mtx)+long_bias -def SGDTrain(kernel, data, ground, loss=torch.nn.MSELoss(), iterations=1000, learning_rate=.1, return_losses=False): +def SGDTrain(self, kernel, data, ground, loss=torch.nn.MSELoss(), iterations=1000, learning_rate=.1, return_losses=False): optim=torch.optim.SGD(kernel.parameters, lr=learning_rate) data_cuda=data.to(device) ground_cuda=ground.to(device) @@ -192,7 +190,7 @@ def SGDTrain(kernel, data, ground, loss=torch.nn.MSELoss(), iterations=1000, lea optim.step() return kernel -def CustomTrain(kernel, optim, data, ground, loss=torch.nn.MSELoss(), iterations=1000, return_losses=False): +def CustomTrain(self, kernel, optim, data, ground, loss=torch.nn.MSELoss(), iterations=1000, return_losses=False): data_cuda=data.to(device) ground_cuda=ground.to(device) if (return_losses): @@ -214,4 +212,4 @@ def CustomTrain(kernel, optim, data, ground, loss=torch.nn.MSELoss(), iterations ls=loss(pred,ground_cuda) ls.backward() optim.step() - return kernel + return kernel \ No newline at end of file diff --git a/data analysis/superscript.py b/data analysis/superscript.py index 7ee79e5d..82dcd4f3 100644 --- a/data analysis/superscript.py +++ b/data analysis/superscript.py @@ -3,11 +3,16 @@ # Notes: # setup: -__version__ = "0.0.3.000" +__version__ = "0.0.4.000" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: - 0.0.3.00: + 0.0.4.000: + - fixed spelling issue in __changelog__ + - addressed nan bug in regression + - fixed errors on line 335 with metrics calling incorrect key "glicko2" + - fixed errors in metrics computing + 0.0.3.000: - added analysis to pit data 0.0.2.001: - minor stability patches @@ -124,7 +129,7 @@ def main(): d.set_analysis_flags(apikey, "latest_update", {"latest_update":current_time}) print(" pushing to database") - push_to_database(apikey, competition, results, metrics, pit) + push_to_database(apikey, competition, results, pit) print(" pushed to database") def load_config(file): From cf06c0f4d82bf98fd7bf86aeae530b6693fc52e3 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 12:15:35 -0600 Subject: [PATCH 10/17] working --- .../__pycache__/analysis.cpython-37.pyc | Bin 26518 -> 26671 bytes data analysis/analysis/analysis.py | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/data analysis/analysis/__pycache__/analysis.cpython-37.pyc b/data analysis/analysis/__pycache__/analysis.cpython-37.pyc index b8a24f345588117a9d897fd66448d699ad51e5ab..44a770c4e2ed53dfa188d7f095457777925f4a6f 100644 GIT binary patch delta 5076 zcmbtY3wV>&8U9bwq-mO@0a|*2Vx`;y2vvFm29yE?1k%zLu%#uYO(J0(=ZHVHw)Y}~1rkzeUrwpgtyaGCPnWCa|^D^1IZ_~N+p1(JG@j=%huhEz>}eMmU`>BHyHFa1u|;fwGARzME1C5G`Dme(sgC93@Xlio@I7r zPMFBpR9Zf9E1ONnCf?5qx=>~W>Fd&%CVnqKDthkr81-Kv7+4j zb^O#YDYFeo+01jPcu!4q{1vL6sk$=@QFdl$G4#a+lekDI zJMvcCd$hd~ksASZfK44`DHO?$VQZzHd#N9Sa)^XT4x3N)qM9C8bJJy_0y}8i+?)wliY|T?;A+4% z0EF{BfE|E#S!t^<9du^yVYY*A{7%4FjIP~eo0nqW5A!-e2Y@JdUT)kPn8-bys7*9- zo3OHI-@MzCWi*H#CVmluz7O~Tt(-sce2o-sJEu#(j9OX@;*T_R~GGU%7UQ2gdIlnPQY;KN~UpzW>!Lu!aI5dyi_>7PXND5jIOk< z3N@;}K$G9+ZX7(fb;!Bz#k4;I-1oHtY|(gsAA1GuTXa{OmI^V<5yQa~HP!e6ZtnZ8 zw~ujfrKHsOLh%ALg&G@ugN53L7y5H(>`|NiHTkkc<7#?lsG*M+-#kccFO3q72{dv4 zFhVVhn*7a;@&@ybl=g^J_=7U9iNGOVgk&lxvakkPRWv>O4iV$zKNTnviUz+&K)KUl z=xgz=vt4v|QHuR;#NH2h0PqX!X(NQ??E0|C%vd{pxpXSqMpKrJGj2yfE3I6X?v}5& zUcTN@eQ=9EsxMo+$dSP1hWrrX+67b^Jh+0J#VK8rCC#?SNLmqktW9 zOTt#Wl}<0qV~rhU$z!6HMWLYDa77DBEB{y&!yW)p&W}?x9y#E!GHUJ1y*L+EiRX?aq}N36eEC6nCNl zX?;q#`7?lL0ndpnXGU!$+*=d!HLBWEcR6TGqT8gi8S%@HlX3M-D>iFUD0$&%r^3}U z4Dj4Uq18)A?gpFO!wo$F&#q3V(>bH)zpIm2gc3_D#>yah^7I5@)Cs^zap)yeq;v$k zo$fEqPCEwYlYrv@OvIlDywFiLmZ_9pc2Cbvf1)hWC=YI;_sX_kfb&l~^S28tYQD_P z{jQ+6@~QGIJbNFbgXNP-C3)Wh(gq&bFM?5<0oF@^mjQng5ViQ-TU{HyZZ#ynv+*eW zeAp+!2O4&)RYPr;ZXaccBhQm!ccXrZNjN>v$bqx2D6_cd{h# zq0~Vbe;uIdf%OL9Yc-vn8ic<_d)AI=>&uUGn0TOT`MNa50(7EeRD4{WS1lEH+d$nhy8M!A(`gal(D4AhT9HCuU1DaBleywj zEts}d7}=AwyQ0MUm+mkySA!_l5EMk7XXuNH`t#p{`>%ivi0gjjt7NeBVuab`a`^&2 z)#W-#w^sVcHlt^=fT&*FO*v-JhBKi?#8bg~D|@-ixqclpy3jcfuW`qQ7FjsuO=pxLkd#nD3$LY*sF}3AgBfrOUA4Fe{ha zEjDC_DQa|iyp7_ekh}{)BzZAmG{&X6Lz0UxMs)Xu<3mJ!1o#;6380+xm(Dhv5#|T9 z@Y2IMy^{Dp(EU#VVh@r##!$mQ)j04a>@#5+DBpc&c^?OcYYL?}P&$kQ*)$H(RcTPY z{^lh-9it?SgY|&`3+2_+jl=pyG3Ao6FioS(nfMw<57%TGFk>RURTCU7qfkznm`Yu< zPd--u+GGQCq|#Njg(j57(No{IYwawZKC7MF_BRZB2knFj|1K+$kH5Sf@ClrTdDW036NNqOljS57CY|%_9R3!F?0lPX0sKxqu%D z5ZehHZL*=U%3v9wjS$~J{)ljJJGGH{X!p%7O`%G#LurxIVb_M#o$C;adY4S)%RoCG oAPc)37A`_jlRMyUYzg{;JPtk&t=M=}{9nLQS0Qel8|$+E2id>@k^lez delta 5261 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 A$N&HU diff --git a/data analysis/analysis/analysis.py b/data analysis/analysis/analysis.py index 3521862e..ec7d9419 100644 --- a/data analysis/analysis/analysis.py +++ b/data analysis/analysis/analysis.py @@ -7,10 +7,12 @@ # current benchmark of optimization: 1.33 times faster # setup: -__version__ = "1.1.13.002" +__version__ = "1.1.13.003" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 1.1.13.003: + - filtered nans from regression 1.1.13.002: - removed torch requirement, and moved Regression back to regression.py 1.1.13.001: @@ -346,6 +348,8 @@ def histo_analysis(hist_data): def regression(inputs, outputs, args): # inputs, outputs expects N-D array + inputs = inputs[~numpy.isnan(x)] + outputs = outputs[~numpy.isnan(x)] regressions = [] if 'lin' in args: # formula: ax + b From b3dba9cc2233572f83f83bf80fd9065654ab829e Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 12:18:42 -0600 Subject: [PATCH 11/17] more working --- data analysis/analysis/analysis.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data analysis/analysis/analysis.py b/data analysis/analysis/analysis.py index ec7d9419..4a915d32 100644 --- a/data analysis/analysis/analysis.py +++ b/data analysis/analysis/analysis.py @@ -348,8 +348,8 @@ def histo_analysis(hist_data): def regression(inputs, outputs, args): # inputs, outputs expects N-D array - inputs = inputs[~numpy.isnan(x)] - outputs = outputs[~numpy.isnan(x)] + inputs = inputs[~np.isnan(x)] + outputs = outputs[~np.isnan(x)] regressions = [] if 'lin' in args: # formula: ax + b From abc1c26cd2c80dba8d186d678fbb043c66210dab Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 12:21:17 -0600 Subject: [PATCH 12/17] even more working --- .../__pycache__/analysis.cpython-37.pyc | Bin 26671 -> 26717 bytes data analysis/analysis/analysis.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data analysis/analysis/__pycache__/analysis.cpython-37.pyc b/data analysis/analysis/__pycache__/analysis.cpython-37.pyc index 44a770c4e2ed53dfa188d7f095457777925f4a6f..ab9a7c01e220b38919996687c9d3e81ba2f539cd 100644 GIT binary patch delta 5296 zcmbVQ3wV>&8U9bwq-mO@g_f4q7J30Rr67ft7P$xo3J8SKRv2kZ2u)g2a`PmGmL;?k zVNOL^Kc)<(YrPH8$*|kJY);(V)QzE{vMpYjI&@ADr?}_Yo^9tne{c5UEq(g_=X~e8 zyx(^&|4EKM&t7|;S<203qar^0_ix@<6gXyyYT{-&^Cr?Qn#_V(R~U18Khts=J>IaJ zyInbcr$3a_$OFC{?r!4lP{jSZ|*-DN(J9MKoLW{9xNvVoU?wXq;>bt*FkW zacQqpqWZA5Ij&0=(MRGUx^8WqCK?|#M6_M{NPJg(x6)rkgQkz2eV{Q^E;b zjr;&pq6v&{wWiS{mzh?N|6WZFW;>U*|LFJtT(I(qqOc8d1QSTMF$=qu>>=oYf~=%HD5<|T7+X1)(PqiQ#b(GTd2;t8~+c=_dC==ud% zwfyt#nuO8?VON~I6*dUU;fps>uyni*+y52UY zu=yQ6XPA3hzmUf@!tCEPy)>U5on0(4J~ul%aS(IbIXj*GPmGr)N}f>XTu{tnpU~dY zElf)nOY50|YRc-(W--m`RBL%5Z7M6G^JO_~EG5s`$kHhwFpEyk$zfOboSzfNn2kQZ zVhU@cw7Dh5n0~99``updA^Y4MmP_B9dwp6|1dCZb;)D|u?Q#SI+ufXZP{zEHdEW+) z>jB>Z+yH<&zY)*@*bNx62+Tq@m2Q}KgmqBKeE)PCbgly=3b2~_4DpERz0S>UZ;0Q5 zfqj7Q0y^o1`Lp#kXnN?(niQj4E*8P&`vus|t6RKbk3Zn^IK8%VK7@sNL>3Ri`Y7NhfX}Bw z*-K2UmI{_U(5@yfOssJnK4ON=9>0@&cDM(;4WBAWGqGH3r$CF>>lsecGCIi~@atom z^#xS3nTu{&dgm~j{SK5^oIk*Qqfj(04)}szx6kblePQhha ztg>hCG9zQV>A>=W$@1_rHaHu$xE&!eWieBOS1d7yx|?}B%p!Dld3Jk;Xo_YT#R~t*$#sx-rFH7B;k69#8^BWnYAX0|(f*wPTLpg_?Pml~_llJMGQ7Vs*}QX5 z8J;D>s(%%M?eJ8XI#DAO_O_OMJJuHEu_VjHOr*ik=gdT{ey@((uzCSM^n-4$fIMcQs_cuUSAlR zx;DXlpie`ry_2+PZCdj0;p+t8kARcn?vYMA*CwZ22UUZR88j9>{`hm$z4mf5j%2aH zUX+))v7)(+9;tpXXW&FnikbWlcPQ);_cZaMSFahJ zw5O(H+O@Fk0AM4>jN6^u=Lm_*ZCGya&mN~V>*^`(GT=aNnL}?EFT>eBKqufd;7@=* z3y7I~&Q?dG+Zk>VUmW>gAdf*l*5~m%JicHH_k`OVp`h0j=C5G%Rlp#Ym!ba};Bml6 z?>D(-Je}*($32K?Lv0mJ7As&TX4LRTDqPn&=sl9eM`8@J{0%@qNB$Ug&cEGt^S9ft{SZk%;w|@~g8ORIJPHL6Ca^ zYPHZBvNuzO?BSlb*Jm;svmnJ3OK5V3tDNFK()1K%Z>Tq)5#v^ky0mM>qE4kl8xq*l zbkBxOFfhb)FmRoq9DAkt?Lo?QatG|Q>)CT+ES2uJugiT41pWr7hi31Vs)e9VN?~I( zI2<0oC+u*%L|4}OG6NV13W#aNeVrqQYR)KmK`O;+EiBgaUhR6uHqxT{@j8c4c#}5P zZyVGq&-)e~I9WJ+5>@FE)5$t3Xgpb8J!p;`ynJh!ight$2FTd4J7-IV@Fjk{7&L^}UWT zBzb&-7LvB>!fs!1>CoIi5JMI^wYg~mQWtY6vqerSJy|^Qot4%%d-6Irx^Mx z01Gc>2=YMC&BJY6uDEwFAQz)tdw)k)E{;uTq3j&R<49B%Tg~fV=*o3KZKX-NaiV*i zR=KCPhcVCsxEinxupQ6}NE2YIvB{1#-X`u0QoN^6!6qtr6FPeVH$&T+ph~3TL5L4Q zY~w#bdp6*90pd7SV_AZBp-o!+*PCnSG3;SKb5<8hrkP8+AAV@;Fji6#TR H++_bh0AK*P delta 4955 zcmbVP3tXGk70(SM1d;$PAdf=VLR(E=wv@i4wJlOCwxmcaN(#gel7`Sc@FuCS1!>pH zob%CnoH}(5)cI(gk20N|TjzV5&sLptQR_N&I^C>J=jMLDxt;(05F*e`ZGZf~bI(2J zf6hJUe)oQP^^myhkjSjE+cOOOFPGX{KMLKG*=tNK*WQ^*mm7S4GrPrda?RQ=Ru9=v%oC!P%1&A~IcgjfS%yMGuOTj?h5->ZQt+hwx|D&` zxM5KArbZzNmP{U_CuO&x*BmuzC>`m*n#8U<=@w9>TLBl}CpuuC< z%B;e0wjorSYKU6t@JVwfWHfyR#uL^-B?RmN=@dxX4%Hae!z8;+trTU>b3 z3k|zOueJN;sNIthx9&1l8(OaFwM8>KvpTcmHjnjE(QD_?q=CtCJaYze2MvS9UVGd= zkjHg90TonFuAi>&%=g#|4fyLUK&5&!dEOGwjN6lD3O(t4g?b@v9>aykLXc+0Gf`e) z;HPqoXTT9<-XqR?@N9!>K?cSid)&CqyvHby^qisEH@1GTF4zaFQ!Sa$L*CeEFCE_1p6c>ACKQ9>*A?&WyQLDILa`?1eP7FKE{?6 z*#TG~nuNFPprf_5Nl#enYsE&yBt*a_%Yjj^-np!-(rWk+pgX#Pe_T?jy) z4!c~ykAyj(wRr;(xd#*91zZ6j`uEBu>1RPiNoj#Am+DV7i3QYn>Mi-o7@-^%Sq_^k z0pFvXRWqlL2{TEBkypV$x$UN=RkOq{+Oeu6?`mkT0el~DE#NGAXiC#Zvx4@A46dB@POsnB(H54G2Cq+gBayI_qv>KNIfm1% zhm(pt{|m;H`dTP!&2*tJA)7hYl5@>5v%Um6t!jpOxKP2WlIqdOsvkD}C0T&Tqt)7r z;Xc6eYL#zISbQ-p67g%HdV0U=w$H-daN1m-9uDqzFu3e>u>imR;hN}EJmMY<%u(bI@n)H9&J4!UZM=C>W74QCVED-RI z&o6Vr3aR{llAL7z|H|^NwN^ga9$0(hxGYC=OQeRvGI*Q}ZKs8UT>)><8;X9Z6h}*V zpQ>XnaDu&`Z%<^jkA&Dpxu?%DFv$*|e!FpZAn&^Xm*XAPhHMX;X& zCA5u)YLDU= zjdW;TUb&MN*5=o$!}oqz_cORm9=u@k02Dt1JOKDPK%G^;fOHVB1AqwfmjGtt>jo!l zH{D*lR0KG^nfC2`530M+Vw4Y4&Kb}3jfDCtF_@hXe|2y@h@cNaktNj{kiJyxHIR<8 zf?|XG0!z4nu37I`^$2*D0UiZB#<00YJ`VX;49*()YskNW%9K}9F+eXjG!-jnbpa(g%frkdpX2*5pM0Ap ziCd^=Q$^9kP(A@T1V94vdB6+$n>?B2D7~@i&S`s~Rkw6j!WMFKB7Xkz;oDEY=ZW@j z-Z2mNrT*2hgQY~q`I-#6)t8}qKRX&Ag9ll3)FKMUBIgMg?cIL;isB6QDP&d{PNi)UEa5Fj5K*GBB^Sb za2?${lzmQ-5Fwh=R3aXx!%ex=(o{R=k38it>YKV59wj3%m8C>_#2anU@U!AE_BnTo zdOgP2n0##Gd4e{$>Q8(#iLYgZN;xP#6Zkw&(<83V>2F~EEkG;0hTlDvg>r2r=aype z9BtbYEbfBYc?^k^uJHL1VRSDcL-f&>Y2u}!yymloaFb{)FrCZON9f{~?MdU;Xlkot z86wHQ0!A3+UocdRPDslc5=OU=|JF)XpEQoq*IFSqt3yfS`B#RXYTYX;)!~lg-(g9Z z-5zg%e}XCAH6T*F2$)E9N41#ZlGU*0uN`_uD`3JW&RuRg#;W(oqV3Hei7(#=!3VHK zaJDsn42_<_KUg%;f3$szM;&0R$5vtC?=b6q{Trq}1PpV$)>dSCkHV_+|jP~G84#iXXW>Dx`W(l?4@dpjFp; z%0vkr^qgpY8zg@QyhHDM@*4jM@pS<9MZ(f0!~6vj?U8Cj{0S3kuc)o@E{3X&=!QfE zC8{E^ELAss6`$zmW*%z~QnzF!134MV}hztjbs!=pOw0LHavf+(0jiy~knqKnuxKGI&=c`TWIA*nn(TYf)SjA> RYNDgQQaa|#pp*{Re*tfZ*e?J8 diff --git a/data analysis/analysis/analysis.py b/data analysis/analysis/analysis.py index 4a915d32..4d077276 100644 --- a/data analysis/analysis/analysis.py +++ b/data analysis/analysis/analysis.py @@ -348,8 +348,8 @@ def histo_analysis(hist_data): def regression(inputs, outputs, args): # inputs, outputs expects N-D array - inputs = inputs[~np.isnan(x)] - outputs = outputs[~np.isnan(x)] + inputs = inputs[~np.isnan(inputs)] + outputs = outputs[~np.isnan(outputs)] regressions = [] if 'lin' in args: # formula: ax + b From 33e0cc19a58baf760ba60848e435dc6a50a05796 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 12:43:01 -0600 Subject: [PATCH 13/17] super ultra working --- .../__pycache__/analysis.cpython-37.pyc | Bin 26717 -> 26640 bytes data analysis/analysis/analysis.py | 27 ++++++------------ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/data analysis/analysis/__pycache__/analysis.cpython-37.pyc b/data analysis/analysis/__pycache__/analysis.cpython-37.pyc index ab9a7c01e220b38919996687c9d3e81ba2f539cd..9cd8c993cb9cf52831a77cadf81e97fcd49a7364 100644 GIT binary patch delta 1415 zcmbVLYitx%6u#f>Zo6-x4`BI0Op8qm^Z}I8+6vMZ8*EEo(#O(W>2~_qEp1^tt+dX# z!BP?+hSkHPzHm3zAk>)P7){f({veVVtCqwEDME~apovjKOhcMjy|dMb^^ZEqz32PR z$-Upqch20HL1+e!BD>wf#Itt9>yf)JIdap2c0u)Au~@z5IAbykLtzo9iwFVyvFhc@_<` z7@%h}-iDnvW~PuUvpmZiz03j&cfbJyH*wBQhD5%aFXQn`n1yq?k(oh`tZ95e*R#IF zNAyniMSMu^jjyAeu;~eWLUo(w@HJIz4&fWRx%n(^k#)-&I+fFp?*!V1S=zs45Kpy-+<6ArUJSZiviT?&VoYw>c-OO{tOojO#IOt`uCusBe4*^y5 zV8KzW(#{t+fMo5xLZ_aad1M&rRJZM0f%CVYMh<vYkEHOA|ZqL~%MzKUNBf5=%!>s*RWa z1RSIbyWHr};vNqHPti!(N%U!HxTt zQ|I0bxT+;J$-q~1+)cPfYdoc>q&810zR;#U1sr$C)O=B-wB|Ctz+dp{c+6V^BQ1E} f64Nx+GKzSrlDe>hrlfJauN`WAm%~dL9ofGFKog(9 delta 1539 zcmbVMYfM~46rOMP!S2E?TZ*Ntrq!a2NI__6d94Z)wh z1hL`Y6EE@xneUDTVsUKJ4XBNa)MHCf$NgvO7;{joSx_Ik0ktVc&Ha+hI-m(6W=#f5 zz#>C3JJ<-6_`Oqsc*!EikML5~_>7VeNa(b7+T;W&{z)iS;U$LcvSycslOim_6{~Cw zFAoG+I9bzAsFy4Y^%fGHH%SQ&rj5=Onof#M<} zFkxf+WQ(>>lQ@L_88?gRZ_#|os+AQCasS07T59`$Esb@Q`#)d0qq44=r6szex^6H1 zeD_r-G?)G;LL{vV7o38)2jUtq#?w~%*9co@@DBKzeg0H|qlST2Z{JYV)Y}*E_IQWe z>ddWs{DW-|w|fKR%y<=vbS)#*7)4DKL*&SOAlDZ=$__j9+{8Jzz`{-XWPUTZ^CWKh zTO{ev2#sfE=)_u@$@~CkY3!a^d`xXwCvcAJ*~hViPG&!dSu(G`hAT%lgzzOD-Y|i$ z>8+eqdxKGb)05%8>}W#@j}%) ze>z>x&8EJ*+hC=`d5uV-`8*F&$d&KGt?DcJcLFZ@q~HKx^m~DSEA53uzWcAna2f@-InhIBwoPHD+U=YNhN)qDBlfDNwugX6sI2TM>{CB0 z%K;uIdwCNMP=EOqjFH>58;5Ad^&ZCQU_~8{&|Jki9Hr@e>1LaES^V376@kMkmV2 z;c3G~HR##Q@eRG%bV7vMo6C5dj?`w&@w8OIM$;`XV+DCyr*I4Dq#mrMe(4R&sOfDd KIlAalN7nE7Ah=!t diff --git a/data analysis/analysis/analysis.py b/data analysis/analysis/analysis.py index 4d077276..01262f96 100644 --- a/data analysis/analysis/analysis.py +++ b/data analysis/analysis/analysis.py @@ -348,17 +348,17 @@ def histo_analysis(hist_data): def regression(inputs, outputs, args): # inputs, outputs expects N-D array - inputs = inputs[~np.isnan(inputs)] - outputs = outputs[~np.isnan(outputs)] + inputs = np.array(inputs) + outputs = np.array(outputs) + + inputs = inputs[np.isfinite(inputs)] + outputs = outputs[np.isfinite(outputs)] regressions = [] if 'lin' in args: # formula: ax + b try: - X = np.array(inputs) - y = np.array(outputs) - def func(x, a, b): return a * x + b @@ -375,9 +375,6 @@ def regression(inputs, outputs, args): # inputs, outputs expects N-D array try: - X = np.array(inputs) - y = np.array(outputs) - def func(x, a, b, c, d): return a * np.log(b*(x + c)) + d @@ -392,10 +389,7 @@ def regression(inputs, outputs, args): # inputs, outputs expects N-D array if 'exp' in args: # formula: a e ^ (b(x + c)) + d - try: - - X = np.array(inputs) - y = np.array(outputs) + try: def func(x, a, b, c, d): @@ -411,8 +405,8 @@ def regression(inputs, outputs, args): # inputs, outputs expects N-D array if 'ply' in args: # formula: a + bx^1 + cx^2 + dx^3 + ... - inputs = [inputs] - outputs = [outputs] + inputs = np.array([inputs]) + outputs = np.array([outputs]) plys = [] limit = len(outputs[0]) @@ -434,10 +428,7 @@ def regression(inputs, outputs, args): # inputs, outputs expects N-D array if 'sig' in args: # formula: a tanh (b(x + c)) + d - try: - - X = np.array(inputs) - y = np.array(outputs) + try: def func(x, a, b, c, d): From 267918d67e24302a4e37c7909d574356fd08f41b Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 13:12:01 -0600 Subject: [PATCH 14/17] fix --- data analysis/visualize_pit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data analysis/visualize_pit.py b/data analysis/visualize_pit.py index 3305ee4d..afd10e20 100644 --- a/data analysis/visualize_pit.py +++ b/data analysis/visualize_pit.py @@ -34,7 +34,7 @@ import numpy as np # %% -fig, ax = plt.subplots(1, len(pit), sharey=True, figsize=(20,10)) +fig, ax = plt.subplots(1, len(pit), sharey=True, figsize=(80,15)) i = 0 From 1ca07266876e6934b73db7fddca7b535ece955c9 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 14:44:13 -0600 Subject: [PATCH 15/17] ultra galaxybrain working --- .../__pycache__/analysis.cpython-37.pyc | Bin 26640 -> 26712 bytes data analysis/analysis/analysis.py | 10 ++++---- data analysis/superscript.py | 24 +++++++++++++----- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/data analysis/analysis/__pycache__/analysis.cpython-37.pyc b/data analysis/analysis/__pycache__/analysis.cpython-37.pyc index 9cd8c993cb9cf52831a77cadf81e97fcd49a7364..bccb944fa1eabf0b710618cff8189f3233f16b0e 100644 GIT binary patch delta 5130 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 P2QT>7<39z)Z=CucGUV%; diff --git a/data analysis/analysis/analysis.py b/data analysis/analysis/analysis.py index 01262f96..e025c5f3 100644 --- a/data analysis/analysis/analysis.py +++ b/data analysis/analysis/analysis.py @@ -7,10 +7,12 @@ # current benchmark of optimization: 1.33 times faster # setup: -__version__ = "1.1.13.003" +__version__ = "1.1.13.004" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 1.1.13.004: + - small fixes to regression to improve performance 1.1.13.003: - filtered nans from regression 1.1.13.002: @@ -348,11 +350,9 @@ def histo_analysis(hist_data): def regression(inputs, outputs, args): # inputs, outputs expects N-D array - inputs = np.array(inputs) - outputs = np.array(outputs) + X = np.array(inputs) + y = np.array(outputs) - inputs = inputs[np.isfinite(inputs)] - outputs = outputs[np.isfinite(outputs)] regressions = [] if 'lin' in args: # formula: ax + b diff --git a/data analysis/superscript.py b/data analysis/superscript.py index 82dcd4f3..96567948 100644 --- a/data analysis/superscript.py +++ b/data analysis/superscript.py @@ -3,10 +3,13 @@ # Notes: # setup: -__version__ = "0.0.4.000" +__version__ = "0.0.4.001" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 0.0.4.001: + - fixed bug where X range for regression was determined before sanitization + - better sanitized data 0.0.4.000: - fixed spelling issue in __changelog__ - addressed nan bug in regression @@ -76,6 +79,7 @@ __all__ = [ from analysis import analysis as an import data as d +import numpy as np import matplotlib.pyplot as plt import time import warnings @@ -150,6 +154,8 @@ def simpleloop(data, tests): # expects 3D array with [Team][Variable][Match] variable_data = data[team][variable] if(variable in tests): for test in tests[variable]: + print(team) + print(variable) test_vector[test] = simplestats(variable_data, test) else: pass @@ -160,26 +166,30 @@ def simpleloop(data, tests): # expects 3D array with [Team][Variable][Match] def simplestats(data, test): + data = np.array(data) + data = data[np.isfinite(data)] + ranges = list(range(len(data))) + if(test == "basic_stats"): return an.basic_stats(data) if(test == "historical_analysis"): - return an.histo_analysis([list(range(len(data))), data]) + return an.histo_analysis([ranges, data]) if(test == "regression_linear"): - return an.regression(list(range(len(data))), data, ['lin']) + return an.regression(ranges, data, ['lin']) if(test == "regression_logarithmic"): - return an.regression(list(range(len(data))), data, ['log']) + return an.regression(ranges, data, ['log']) if(test == "regression_exponential"): - return an.regression(list(range(len(data))), data, ['exp']) + return an.regression(ranges, data, ['exp']) if(test == "regression_polynomial"): - return an.regression(list(range(len(data))), data, ['ply']) + return an.regression(ranges, data, ['ply']) if(test == "regression_sigmoidal"): - return an.regression(list(range(len(data))), data, ['sig']) + return an.regression(ranges, data, ['sig']) def push_to_database(apikey, competition, results, pit): From 210d2c92e15f53e3083d680c05acff3129d14274 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 14:50:54 -0600 Subject: [PATCH 16/17] ultimate carl the fat kid brain working --- .../__pycache__/analysis.cpython-37.pyc | Bin 26712 -> 26681 bytes data analysis/analysis/analysis.py | 7 +++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/data analysis/analysis/__pycache__/analysis.cpython-37.pyc b/data analysis/analysis/__pycache__/analysis.cpython-37.pyc index bccb944fa1eabf0b710618cff8189f3233f16b0e..b9d52e8ee9a5a977a701ce6545d86f8bcda85344 100644 GIT binary patch delta 6169 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 delta 6288 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 Y9!tEzi2o$v@nMAbJy~ou#IG&*A3tmUjsO4v diff --git a/data analysis/analysis/analysis.py b/data analysis/analysis/analysis.py index e025c5f3..7a840e89 100644 --- a/data analysis/analysis/analysis.py +++ b/data analysis/analysis/analysis.py @@ -7,10 +7,12 @@ # current benchmark of optimization: 1.33 times faster # setup: -__version__ = "1.1.13.004" +__version__ = "1.1.13.005" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 1.1.13.005: + - cleaned up package 1.1.13.004: - small fixes to regression to improve performance 1.1.13.003: @@ -245,7 +247,6 @@ __author__ = ( ) __all__ = [ - '_init_device', 'load_csv', 'basic_stats', 'z_score', @@ -266,7 +267,6 @@ __all__ = [ 'SVM', 'random_forest_classifier', 'random_forest_regressor', - 'Regression', 'Glicko2', # all statistics functions left out due to integration in other functions ] @@ -279,7 +279,6 @@ import csv import numba from numba import jit import numpy as np -import math import scipy from scipy import * import sklearn From af7bf43cb2c75e4d0d75b5b0c15af4785d2fe5cf Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 6 Mar 2020 14:52:41 -0600 Subject: [PATCH 17/17] tiny brain fix --- data analysis/superscript.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/data analysis/superscript.py b/data analysis/superscript.py index 96567948..70edaa92 100644 --- a/data analysis/superscript.py +++ b/data analysis/superscript.py @@ -154,8 +154,6 @@ def simpleloop(data, tests): # expects 3D array with [Team][Variable][Match] variable_data = data[team][variable] if(variable in tests): for test in tests[variable]: - print(team) - print(variable) test_vector[test] = simplestats(variable_data, test) else: pass