From a8632fec39da71de2ec1d8ef56260fa47c4d5d7e Mon Sep 17 00:00:00 2001 From: Oceane <oceane.fourquet@outlook.fr> Date: Thu, 29 Sep 2022 11:12:50 +0200 Subject: [PATCH] first commit with modules in python --- .DS_Store | Bin 0 -> 6148 bytes Module/.DS_Store | Bin 0 -> 6148 bytes .../cost_matrix_uncertainty.cpython-38.pyc | Bin 0 -> 3695 bytes .../cost_matrix_uncertainty.cpython-39.pyc | Bin 0 -> 3810 bytes .../cost_matrix_uncertainty_v2.cpython-39.pyc | Bin 0 -> 5009 bytes Module/__pycache__/measures.cpython-38.pyc | Bin 0 -> 2405 bytes Module/__pycache__/measures.cpython-39.pyc | Bin 0 -> 2412 bytes ...monotonic_regression_4cases.cpython-39.pyc | Bin 0 -> 11382 bytes ...onic_regression_uncertainty.cpython-38.pyc | Bin 0 -> 12575 bytes ...onic_regression_uncertainty.cpython-39.pyc | Bin 0 -> 12799 bytes ..._regression_uncertainty_bis.cpython-39.pyc | Bin 0 -> 9497 bytes ...c_regression_uncertainty_v1.cpython-39.pyc | Bin 0 -> 10211 bytes ...c_regression_uncertainty_v2.cpython-39.pyc | Bin 0 -> 9859 bytes .../optimal_k_aggregations.cpython-38.pyc | Bin 0 -> 4224 bytes .../optimal_k_aggregations.cpython-39.pyc | Bin 0 -> 4315 bytes .../optimal_k_aggregations_v2.cpython-39.pyc | Bin 0 -> 3608 bytes .../__pycache__/preselection.cpython-39.pyc | Bin 0 -> 2415 bytes .../selection_algorithm.cpython-38.pyc | Bin 0 -> 5225 bytes .../selection_algorithm.cpython-39.pyc | Bin 0 -> 5173 bytes .../selection_algorithm_v2.cpython-39.pyc | Bin 0 -> 6027 bytes .../__pycache__/show_results.cpython-38.pyc | Bin 0 -> 5683 bytes .../__pycache__/show_results.cpython-39.pyc | Bin 0 -> 5682 bytes .../show_results_4cases.cpython-38.pyc | Bin 0 -> 5378 bytes .../show_results_4cases.cpython-39.pyc | Bin 0 -> 8079 bytes Module/__pycache__/stages.cpython-38.pyc | Bin 0 -> 2100 bytes Module/__pycache__/stages.cpython-39.pyc | Bin 0 -> 2390 bytes Module/__pycache__/tools.cpython-38.pyc | Bin 0 -> 3593 bytes Module/__pycache__/tools.cpython-39.pyc | Bin 0 -> 4329 bytes Module/cost_matrix_uncertainty.py | 150 ++++ Module/measures.py | 131 +++ Module/monotonic_regression_uncertainty.py | 778 ++++++++++++++++++ Module/optimal_k_aggregations.py | 151 ++++ Module/preselection.py | 59 ++ Module/selection_algorithm.py | 161 ++++ Module/show_results_4cases.py | 498 +++++++++++ Module/stages.py | 82 ++ Module/tools.py | 186 +++++ 37 files changed, 2196 insertions(+) create mode 100644 .DS_Store create mode 100755 Module/.DS_Store create mode 100755 Module/__pycache__/cost_matrix_uncertainty.cpython-38.pyc create mode 100644 Module/__pycache__/cost_matrix_uncertainty.cpython-39.pyc create mode 100755 Module/__pycache__/cost_matrix_uncertainty_v2.cpython-39.pyc create mode 100755 Module/__pycache__/measures.cpython-38.pyc create mode 100644 Module/__pycache__/measures.cpython-39.pyc create mode 100755 Module/__pycache__/monotonic_regression_4cases.cpython-39.pyc create mode 100755 Module/__pycache__/monotonic_regression_uncertainty.cpython-38.pyc create mode 100644 Module/__pycache__/monotonic_regression_uncertainty.cpython-39.pyc create mode 100755 Module/__pycache__/monotonic_regression_uncertainty_bis.cpython-39.pyc create mode 100755 Module/__pycache__/monotonic_regression_uncertainty_v1.cpython-39.pyc create mode 100755 Module/__pycache__/monotonic_regression_uncertainty_v2.cpython-39.pyc create mode 100755 Module/__pycache__/optimal_k_aggregations.cpython-38.pyc create mode 100644 Module/__pycache__/optimal_k_aggregations.cpython-39.pyc create mode 100755 Module/__pycache__/optimal_k_aggregations_v2.cpython-39.pyc create mode 100644 Module/__pycache__/preselection.cpython-39.pyc create mode 100755 Module/__pycache__/selection_algorithm.cpython-38.pyc create mode 100644 Module/__pycache__/selection_algorithm.cpython-39.pyc create mode 100755 Module/__pycache__/selection_algorithm_v2.cpython-39.pyc create mode 100755 Module/__pycache__/show_results.cpython-38.pyc create mode 100644 Module/__pycache__/show_results.cpython-39.pyc create mode 100755 Module/__pycache__/show_results_4cases.cpython-38.pyc create mode 100644 Module/__pycache__/show_results_4cases.cpython-39.pyc create mode 100755 Module/__pycache__/stages.cpython-38.pyc create mode 100644 Module/__pycache__/stages.cpython-39.pyc create mode 100755 Module/__pycache__/tools.cpython-38.pyc create mode 100644 Module/__pycache__/tools.cpython-39.pyc create mode 100755 Module/cost_matrix_uncertainty.py create mode 100755 Module/measures.py create mode 100755 Module/monotonic_regression_uncertainty.py create mode 100755 Module/optimal_k_aggregations.py create mode 100644 Module/preselection.py create mode 100755 Module/selection_algorithm.py create mode 100755 Module/show_results_4cases.py create mode 100755 Module/stages.py create mode 100755 Module/tools.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..eddf048df7bdf3062d661508dc2c5d7649330bb9 GIT binary patch literal 6148 zcmeHKPjAyO6n|dBaDos$Ahx3~h)Xrv6;0X!DJ$t=LP&@pI54y&O|?d(an+<$&~?hU zfN!x6!GVv!N8t$X*#<R~KR1M!pY;5*{ob?vev$1M09bF9bO4$Fz)=Yu4~w4&*-6)A z!}Pd_OpTGj@Gz5uIFs?3x9zYDSO)$z259eY!XuE7zzpj9mkxys)SWL%)Y5Cd@w}Lr zz5X$tWNA^h+n?A*!@06~m2;1K*S(kFNY2ADDrZG6n!cdc<ER|Prv6mQ?0Y?mpQXe3 zar5Q_nU_(T52q?PO@`=l^gPWIIq%6?o)l`FP#ZXRxqIBawODjpqPw@dY>CDGZo4J! zb@!G_mv7zf+&?@Szj?bjTb{pDNdUv+O34j_-{3t~YAGhgAd7L4<WMtYr=4&h#}gIV zxO?=YeJq2(aKm5Sxp?S({&2AFll;+VGFq9(QPb7d@j9I5naoddY)Z<7C(wrj2=JTs zVF$*LtenX7MQIhQUlf~GE+qqI6Yy)7GJBh}Wxz7<I|k@{5U7N{!Ahe#I<Qbr07M77 zm0+DN8Hy1GeS?)ow4g8@il{@Gd15dfj{U;;`35VEIvkjJd@wUJGcOdTX2<b`atG#X zw54UhGEirrp_@&*|NFmw|JQ?T%Q9dY_^%jXP7nq?Ov&7>Yst}FD^O2RNyx9#s6wzX i*RiV5RlJR=1Z{#Uh`zx}Ble)!9|1*!Ei40nm4UA|O^!YQ literal 0 HcmV?d00001 diff --git a/Module/.DS_Store b/Module/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..19b82036d32618a951840f33d2c93ee7eff892ee GIT binary patch literal 6148 zcmeHK%}T>S5T30)RC}-|Q9%fJF9<$BEcM{o2Z(J9X)raVNl|aP`wqT>&*w?MnO!tZ zw+BH)WG3v+{>(Qs`)!l$5|J6LZqJAYMASoJ-Q7dw5uWF=AssiuI3qq{novwLN+{Z} z)&XTe8Te}q@Vnc`+Zxe=p78E|y}!{_Uc}S9n8JcT4;LuIcM-IRj$vI;Nfoej;3`^D zMvv&N=pJ(k`W41A^eXrsa)g%8*Ot#dJSD)C@UcXz^r6g23v~)qfhYyyu+9)Y5`5~s zlo;cgZ{%j4TTzbSVSxyltTu<QJCq5fcsSQoIIwa2dB3$h9$<Y5<tVZEwHZz@k|Gwf zS>anc_i@lkTfX+;YX;PVTRAhB1Mkg*nD>{)UUDXWbVTRKj(23sZpiPV>1!9Zyzl8Y zgfQDg^k84$$^F^NTATJrUgZZEz?sd`>szh0GN2471D_1=_aQ)G9XefGEuRilas`0y zVps%i{<FZC!0FKG+G@-|jD<p5sBu>eW8oMNoL%U2ZMB7yahDI{A{%!@F%ljA12HEP zTCKG*pbV@tuw%OeKL0Pb-~ZP^+EWIUfq%t->5i|*BP_|Cts9Huvo=7vL1AIL+G>HI ja>ubW_$WR^5y4!*4d~G6+G>nI^pAkhpp`Q4s|<VqkY2rF literal 0 HcmV?d00001 diff --git a/Module/__pycache__/cost_matrix_uncertainty.cpython-38.pyc b/Module/__pycache__/cost_matrix_uncertainty.cpython-38.pyc new file mode 100755 index 0000000000000000000000000000000000000000..02ad757007d86da1fdf1845f98ec0504962353c1 GIT binary patch literal 3695 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 Xz=er8WH$7N0XcyiG=dAkonZZcITcHK literal 0 HcmV?d00001 diff --git a/Module/__pycache__/cost_matrix_uncertainty.cpython-39.pyc b/Module/__pycache__/cost_matrix_uncertainty.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a217a1b2a57daeee20a7c2f30411d77c5736faac GIT binary patch literal 3810 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 literal 0 HcmV?d00001 diff --git a/Module/__pycache__/cost_matrix_uncertainty_v2.cpython-39.pyc b/Module/__pycache__/cost_matrix_uncertainty_v2.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..fee8989c7e76919dca326645a40d09079d55e498 GIT binary patch literal 5009 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 literal 0 HcmV?d00001 diff --git a/Module/__pycache__/measures.cpython-38.pyc b/Module/__pycache__/measures.cpython-38.pyc new file mode 100755 index 0000000000000000000000000000000000000000..cc8175622ee2cee526a076e2f7047409622c7828 GIT binary patch literal 2405 zcmc&$&u<%55PrXQy>WgtP2I#H1wtu7D@08!1X6_%0yno<m7?ZgsWK*SAx>;3dAq5I zw3d+EKcpP}FYT36&Rh`Uz&EpY?M-sx!dm-gJp0x&^L;b({Bn7@EO7nx=Rcj(RU!VM zFY}kim+x@L$5^bevL{-?Dy!d!mbAutkjnbD1gULc7a)x-+eJt(GCxbZWS8H_mTy<= zJ=jWi)!v5;?3#T5xnL{yA!OOE+YQJ?D-T3iy@of@Jdz|P7wHQ354ht1OCnM+!tSwb zhBDLfWgnt+?jqa%wL2Eh!=ArCuf2>T7uPzr-yPH%XGfR)XpqFU7srj-{+Ye(MYVp^ zi7#CgKRv(7OdszqkOy)lv@2n~6$XLAVF0m77>T4{w#0#O^k%3WZOU{n8icYHa8yUV z6Amh0e0shTId|sTu9HM<JYIoq>Y1V_cs4LlPVBi3B?n+AtsE-&mm}E_uPQ^GszjwC z)tiXuYcW(8l~ko1+gLRn;TUR12xgw^41S3mxe5&+jFL?5XEMrU_hzKkXb?yJpL$Un zcn#XKxF6u<n2SgU(#R#bCLQ5Yh@CKbhuRZ-nZ};umLi8Oaq788RviedaRbS*X<pNd z*Az0xJyskyvjUwEam%z2E_1M!uDb30!}jh6FmtU4#I~x9a_g}ChsaDZGIyW+RcLug z%iZq32=T1wegl>xE-ff@5%g3EOsa)40Y;Iuk|-Q%5NrUHW`ds$y+n<~(1%5_Wqnvm z{kIyFmo`P}ZHnKe6c_bWras;dQj-QK19PzrO>>D7U7^XbT!fyPUN=rMzjJ;b4Q#mJ zme|;jl4Hg<lg&)`Uq|j9><oJ*Pg)*O?!Ug7yxu>2{w21>1dmVwDgsrZe8`FlR9QM= zr2qoKM_e)p&!9{}K;rscnvaGCDH^0GX+71hl4`4vnns1A>M6Cc&MVweSx(D^QVhM! zqb}UdMcr+|n5jlR&*=t(UZdXbp6p>uOi)nyP-(A9giqyLC?R^6<^+fTBa~@z7aH>` zP6YvPAc2uWt3F0TIyFdSXV$WLiX%!(UF=*`EE20w%F?Q;s0dEd%q8j8;BnH>jxyx{ zLytMkyW?ZBGIj5hR?OAW(-*j7nm*G^*JL2yQ~c}}RT|qk*YBa+N!61nRaTuU(8PpI z^jnm<5Aic@8w-N|i1f#_5I-&5+}*vKpgkh!74{Ses#1OJ!216Z<UT<N1x_fYc}_C5 zH>te4DESn->A<~BiFEX=kR6pCO>?H?Hz?EcBRLr%s?bS?7$-DBJoHw6YOD|a)Z-E2 zqrcEylM$j5lX$5&!oFNq#Rz9f;=e6XL2hAR6(z|%xIOK`aN2`hnZaz#xGJJ^n^-VS zx&t2LIC4A5ab}L9ZZ9m&6)p3xo;PPR$K3%{R>E=a&d#r5{Ax@Ng@=)&W+UgRbf3W* zE;$;<?2`{XKBV|Oa5R;9Dsk&@(Q^?o*8KKd&v5t9$j*Xq`uq>#TRNX&I$44s@bFor M&(c~@4wgy#7jZ9#^#A|> literal 0 HcmV?d00001 diff --git a/Module/__pycache__/measures.cpython-39.pyc b/Module/__pycache__/measures.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa3d020173484e9780d4dc91fd10532564f41f8b GIT binary patch literal 2412 zcmc&$-EJFI5I#S<>y7i%G<6e)6bPjRt&kdGRUlOeAxLu<3lR|^OO<hRPKgu$#AnwP zk=7ED`v$x~x%4aTEmwI3uJ~rwZoEmZxM8h5GoC%`nfbn%Ic_a4mj$jrYrniYUlrnS z`Z9lMeEAM{e2T>gBRirYj57MIXh`E3A5xjXlpwVU%>txn%4QMLx87@Mmdx^7*$B*v zxd&UxteX3fp;<EzAQw!<JcKNpb+ZAvXylQIs#owP>L-%K^dep1{sDI!Vo5|Q#@IcP z^+;wq9(Ey07tWgI@9l|jKKA_cZ1?Bbx_Gz$x<7P-q21l@pA5UUm&Ch2*?8E2JnWlc z$L@A*D;_!<KfSojye@uXfgF)Xp<M~<t!M}vjt0O@qe&#iv?Y#&qc<bvXj7&;win4p z$iba-&N#Mw3F!HXb*}H4u9es(9<RVQ^Gs0`JbN%uYV5fNCC6bTjT|ZXmt(mvURFjr zRf$SPsy7kQ*J7jwl~ko1+eFnJ!5L{sKxV#c^?tLCTtyy`v`HopGifu~z8PuN_F~(8 z)v-<B)oWhI{Qxh=TuVBXo?Mb^(h)9&*a?&Os6D}#S?oD(DRS5n=e~Pn)R8b6H;|lo z^(%VuibCeNCyL`{R-h9iZkZOsWe(QTWxIKJ+}!&JW-b|l*jBZt+&V1(Au_KRnY&N^ zDzrSL<!<+1MtD|qzX8h$mlhPd2zsgnCe=Wh0;5P8NfeGW2=)M!W`duO{6vk#D1b$= zWqnjigLfK~mo`P}Z;HR96oXnS(*SRWsh5T*18=YmO>>D7U6Ge#xd=V;I_)^gg4V@_ z?U`u7EwQm{lT*ewll4q@-&l7Kc7{EZXAK`Hci-GhULPL6c!q5;!6Q_Nia=GU0J5S& zRhEueDS$xm5tj_Yb0{+qkhp%I=A)5^6g{LUX+77jl4_%nnns1A>M6B}&MVweS<cFZ zQjGk}r!L&fMa^x&n5q3*p3@Bm{ry_AeRhB?F+oA)L#4ec5k8e~p@isNniCxUuTW;i zU1-d&I28oEfds}1t@;=V>C{6aJJ&6nr#Pmx)L>^&F-WXJDNCcOq9Qm+Z!Sr<29MK* zc9bax82QX$-W{Kkm8tuXv|_G~p8kkCrs*@wbWMix1I5p7QKhksbNwF5om4%UQDxM* z0!>WVRKG=;`xrmtwy_}SPe^}E3-Qy?^}W5j2|6HxUSdyypeohZ4y^w#LGCkzP~e1O zn&%`_2h+;Ci;~Z=o6g<alt@R<3fWQV(KKgD{(v$oKa$fCq6(dKjB!FE#7A%Cr^fmy zNPQk50s0HwH60;3@e)7v$Jm$4su<%eNrHDJD#$JDtD+>i2e)TE7|nW+D>J+vGp>s0 z+$I)GlXj2CIF8&_a+-N3w%v(Jb4APis~7d_nd9z&Dl6egcm0dY7{3~mL*ZlOsOypQ zRJt!<jg}mZWA@1h9v@PC9yprHJe9b0xahfv7;Aoeu4lM=Xk=&MH(mY*@hzQCF`X=7 R82b1u(r0NcEQiaa{R>(|iJ|}i literal 0 HcmV?d00001 diff --git a/Module/__pycache__/monotonic_regression_4cases.cpython-39.pyc b/Module/__pycache__/monotonic_regression_4cases.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..bd6abcdda3556f92104a4c16465af1e8423ebdf4 GIT binary patch literal 11382 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 literal 0 HcmV?d00001 diff --git a/Module/__pycache__/monotonic_regression_uncertainty.cpython-38.pyc b/Module/__pycache__/monotonic_regression_uncertainty.cpython-38.pyc new file mode 100755 index 0000000000000000000000000000000000000000..28e8f1dd48afe5f00fe10e507afc658d552be6dc GIT binary patch literal 12575 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 literal 0 HcmV?d00001 diff --git a/Module/__pycache__/monotonic_regression_uncertainty.cpython-39.pyc b/Module/__pycache__/monotonic_regression_uncertainty.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c149e50c32e14944c7ad6e4e464d285e645b056 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/Module/__pycache__/monotonic_regression_uncertainty_bis.cpython-39.pyc b/Module/__pycache__/monotonic_regression_uncertainty_bis.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..04a4aefe1d879f49104637b4568a0f386646de2d GIT binary patch literal 9497 zcmcIqOKcoRdhV)zOmjG-D2k#e`bEEFjVz0j*Rf@r*4nXGaU3t>SXyT@u`(V`HOW~H z=TY6HEp1N{gaWb~U;*u22Rer!@@bJnfEc+1L4ut25+exuv`9_{_7>!j9FlzB-}B&% zqyW1}hUj{Ab#>MM`2I(;HZxOn@cZj84r}d;j`OeV9R0cIyooEmsvO5SMm3#XRZ)s< z-P9EqwcGS|{ffUERD#_?rO>|@R;FZ5u~L+Jx>AyQrZOY-Y-QGX#=q@Uj+wv|P|umr zOrbt*ie?)1yeXL()F;fWIfi<{%$eh;Pnvmi0`;O<Feg!;GK=OE>Ls&ePNP0;mdzum zm(8Q*G1QNk$ITO{A2loHNz{*-r_9r+A2-jKXHh?4&Y0&=ub8u@jQUA)&ODF$DRbVu zfcj~3!K|Ww##}U)P(N#4G~Ymd#=K;H1@&|0W%CN^v*t~6*}QsNRm$cy^EyV(nKknU z>gUZB^G(#}jlSlT-};&qF00H>+U;h%UUoCD9yOYo+iY)TZm0ceon#;U*!FO}jVqo* zk*dT=om4M52Wr8&=G;^3Sj??$#8^q~XX?{T-MZ)4Y0UliJ1AD|UTbwXGL715eY?Ha z-HVdi>bo^-s>U|<qt)x%fBWZgRDHW<+s)eQ2YVaMM!l9a+O2Aw)V8A4x0`!$64}-3 zQJhp;(WljV+eFpG)>?7hHabbX`t7#aYeuWP?N&Q!w;J`TjkatQ$6RBtRgY{^YqXM^ z)s04cp>s2HBWsWGI2whc><r2}1Z?<YyMRm1yo5&LB+95nCvFNMJkSSn;p}?-Yc5ju zG8b>KKH8QPvm_bFqCOKk<V6W%S-94$?QWRbm3j334VPots>@#3#V^3crR4n`G(d56 zpi;Hu^mM97`<~lydLDO`x<;LH4)i<DjisKS=oEZO-6bdWPdTZV`fE=2jLg%+d5;d~ zVa5JDmo?_Dr(S+85&<0bThV7pHS<C4tq3v_waP)J-pbTY#qU&`(S8ME`&qHkGU(Oz zqc~HI$wQZLH~Or9|1=gBNpjqh3YDkk)grECWgo+xF+z|iB<GM3IJ|S{eD3T!cFw44 zKmlA3!m_)5{VM1k?AMxmQC!yc5j>W;t-amJy%ZWTH?sLGCd8z)qf5%ub_K16Oa2wy z6}boJ<BJKl0m?)EQ+?nnNXMXWG^j3PtzxPV!L82)u0T_FU8K&Q#8PEf-j_{p9-&)M z>vW=)!98x?K7k@r?@#RCK84})xZ)6nql;=zEovDZ+dWS<l;L;LNt^>nO)kfjk)brK z^t@E3-f5@jr|zMfc!>`(`;>C-y}OhIMyKw9R!-^)spSY6fToan%|@KqQ&`_pQS8$! z2ou><y}jGnOQLEe^E(#WLAiO?lKc7j$N>8&r@H&q`$R@psxRSQOr>#j01*js6_tG+ z{V{E&fD93ed@`yBj53;B!8zRn7rOBbGzXkH?HF&zwF_*MSA)Lsd#byTLZr&U`gJ*A z&Mm6JRmjuuh+q%Tka?TU+Lr8pf<xI1B<!u~My*)`_Lw&?ITkYqQD0DxszBKnFg7OW z)OK=<XNmh751lvaNBW0?K8gNgXHyw%+}mLS9{m6(J5cXP$yQG%{$XIe1iU0J8))<A zs^>xm3rT2#oR`T|if1|FK=-f)`0l3OCN#cWAc_}kv>(|x8lx|jkn}yly^&vA!2cTy zJ%#5L=tml&{;}?I9c@XmoPaa|Wu55@7llsufQR4Bi6u~2T%+(%Os>4oXZV6!Pc>SN zq)}@&Zix-Ju-0tXYt8ry8iUCrH6rS6mWx>sw`~#`dj>0HZX6wv$V|67nSU#??O22} z^EaFAS|V6e_A}4al3M2C+_ua;jKq_hw-;H+W@pFu^)1}UWiu$LGmy+#{MpwrI>y&A z*`z!}?!eV0(2PiK)Q+}`-HT}HWv2&ZAKiZiGrFaeCL72>(8$j%M9pQ;5(2E~k?d9q z?$$ns;ySLr`jm92G!$rF$(=Evpy=^>o6{>OxGikPWxWU^0|TS6&E@V#*c{s2ym6sK z?+74b9t6sR-v#5C-(O>$uYsCtbms)6y(17Pasru~su@!i*e?4y`Q=oC->Q?jyKOV6 zU?)tp6}2K;1G)fMB8$hX+&(R-gL8&*-Z`*@7RG)Pqjie#;5P=2?_gBG5#|)?pi+;J zo_YX{vw%cD)i~=S&gPSGK2DEzpNX$PV_`HGc{;m*g&_YFLc!y5ke`PLkh4l~{TXyK z)toq#UBmD$u0B=-vUO~p<6{gXmJAv8&**S7*y15-N)Z{SNpzw%kN_IK<eVb9b0$0k z>MQ1dB}Y2a&+S`2V{{Kl5uoRCTn-=PhaRk!k6ji*44yhV)_Msx#{)tYXb(SkK-T3R zFbs1;tUZ-ZrG*{G{v@616}mr33$&zbxl#Amb1<Q^mTSN_(4w=o+i2O#9DSSxrM+C7 z5FRUJr#-M!C^FwfO{ltuM;ke8KR|J^DI4{Hdk+uATwVkUVl<~#;G`_zZxP~Ef-MS( z<rJSfv3v02ZYgY{P*;G4uth}Zg3&lPY!WPw+xOVs#rfTI3TRM-=cdvkC^DT+3q?Lm zr$Mu+Udgz<nKVeJa?bR^?y}5)N~SZ$1y0Oh1g#y<{)MdKrlr&H2(gN`cT!*o=!;tB zmby(D(e}@<CdLGd!d6LokQD5N-0@*KsrG-L!uoS8^$)!?q({(y2WH|OR2fQ?tOLJv zHk}0zy;IJPx}%^r(oSdLXC9fk=Cq#a-x(Vf&qLOOzX2r_(0~+>?MLhiDGcQj0T8=P z0XX7+P~XePvVgu-eM{sbn`&+J{m<Mr^biDG%G9+S_Q|VEZRc`vj;m2PXkJXF>X{3` znb6nFM^Mta^e31W6WATd1YOxs6{Y2&H_INbWhrOjXA+Kz-sAqPTGk87ejCq?*^4oU zcLjIhWjfGdcq-6NNYRe6O9oz;fvp`-XQ&?6uinFLJatd!cq7(q+%#m<`_=7QT(ym@ z?c__$?fbwB^npJ>e++BJ>=#!i)^JCn;W|eG0l!(?6cXKYNAHGbSDOU7thCpG(T(yQ z{0(=&Q#;yTLpk<#YSB=W-b07jK!gJ=fN}@gUSRx_(<gO+X&3qsE*?0I5hVC>_iF0) zh9;>S%6^~3asX?dSYBNAj%=I4aWMyw3F^)DH(zTu^8@@H7KnLxz=U2_xux}#{SHPR z&RV)rIU$E^U65FYtYtjYx0Khf+I38|zsX`^E5)3V&1f_EN8Il7agKca2>mfij`5K% zAMlap{61ciHu>9rYuFn47TI*41blIZ`vdm<Hrit^9b?~B+`W%|=W_N5>&`uZbuV>) z_2I1JAuV5ely&ykI4aOTL9Sy*ILEF33=@ZpTO2X&yBM!?>x19eF-SYIj40lZ{Ma6% zm8EL|xgz^5m%`>m3&p9SOP23&Vsio}Fa8|2V|g_qWBWVk)%n=qN5jv)7?w3OQgw)J zd=8a_c@LoyA%J=cbPTbj0DT`Is}7J817tfev`7aW&{G?FD~RtUG#4b2HxBG5z2S;m zuWseR+Gyuwq<xpgw>ZVyC&W%12UfJcXPJNb56sCURidF@(DrvRGNu?l1}L9$EUu3D z4Y66O7oh2REeG^S=iGOOt%L4EG<3^LJ;Xlbhz1@Ywz=kXy@3jiyk?kT<YVj#tG=5l z&e+H|qmwXsj*^7u+to@HUIPf%_b|054#1oW&??di_!tk59f}7UT=9$ONcaYmdK<i9 z27{p+HqLFsDFbw!qg!wqoH+vRV{sUlqi~$SbtDe^Sog3{s(;{sCSI!YIBawh#H*`# z!u|#eiVtkWhinVaBwFD97I3;e0((4;YPP;z-HC2KF!~}Xzy5Fh5Zd{TB-)L|=9Jxv zXBzc(zWAHNH{4)LLa5?s;S;2#$TmVJ7)5PA!L&L>VeliSvM*xsmuL|5K`$yBSPgep z=N>s^K1ei@8wCc&G?Ek&gvwA*IGdND8PEu7MmqJe+bi~_d!@9<kX78O8IbK|Xa;8l zY2naMi<0(una(mC8ze>~O#7nW=NO&^xBSy2`4{p`J{R}IL4w1KBwS&W!CTM|-hK~9 z7`d}w{}%~ZkYkJV<YB`w%aA8h-oi8G*&IMF@p*|+MR2KsncA?w&bqi^quNfV%^V~V z${y#a{_JM%`nt{9My4O2rbwdJ;qTUW9w9%L@sI;Iw*-k^>bow8r2vg*^}M!QxI2dL z<lm4(|AJ0G#l%Dtloho92gXlAX~t0sS-Xo!F(J7m6rM|Ud>hIhqzZG-!r7I%X@O7d z_;w9_xSr^vWFHQ6&|QN=%CPxX>J3&xs%^Mxs+k#l$eIdn@c5c{WX(JMHGeu<vpY9h zlWn9)`k^@GU!oDf{28{NMo|te8I-vj9cy2cmaQUs-Kchi8TLHK^oAWNX08+^@Fr@; zRbk!*vf%<|I$%KnkjcqUUou4W5ePGidc0rKwuvXkSi^W^2tSAD46=Vz59a&gk6;oI zl}RLcH$|)n@duNDCczJ(VuvsuWRk#^YdpXf0%AT36=XE$b>~}GLF~H|>rky8wvPY6 zbt;logqjFpsU~Bv_t5kc^bvsvV9y)D9<WU?pV)R!3-D#SlQ8pia{};g;B`6Rt&Fs% zy73^$`{nmz8PVr2Zn4!Fc89>bIoJn01raAk6Qf`T7$KVfJ&xvrwb9wAco3|(;_cQx zYvl4JXfDeO)|QT*={ppwr?3FUieU=F5QZl6s^lK+6}62qYs`|-d*R}O!<WGge0X5$ z%Gq-e;GH$l-8<^WtT^R@%^!O`ujlsy;IRS{gg|2Vw&YVFHd7E6gq8?*-CS^(#JsVN zpw~;MAv&eB1dN{P&GwEVq-9ci4w!x{oi+Xe(VZ>tz|~IgcyAuzVgOv3gO_tWollEM zD1=B@f0zU*5}xr-<sE3@3tu3%V6Jx}Dd3qCX@SmL_si~|CL#Lpi?Bv`K=EJbokW_{ zOHb0NLw~V%Dk-9Wiv8YF>f+S%xVy9oqiYJt{>-OtJR0#ha!0{2QM3^M3ththE4uWK zk0|pns@zfC@8xv4qvD_6N16F?%3$_axW4>_sne$m&R#f;%oymV)5Y|Zq?o7H%li7& z2P)Gw2w1#;LUPL`WI{!`b6*BZEg|j^r9L9_BKSjX`u;$hZaq8r{xI}KAEeqjT;L(c zih<^fe(@dJgbT<{_J*zTjolq=tUN7g;#}7mQs<u*X4s-{EFT9Xt0WdzuwAsWeA>Q> z`}kU0i=!++UKDmiAR$Kx@eQc0xyMciq2j^1#8zDPp<iGP=ZL!-v9-x!<lob(XFdYp zwzb>5)nFm;W7(2p4bPSxzmLqjL>mTYPT(OKQiSgii1R-un1ghPUV>>`P;&?e=5)#B zU8GKY=BLMJB4MJJ;b9}`me0j}dlM_yB}(Eu@C$IUF9^km6!srk>v*&8S0M2zeuP+l z_z@-a;i<tBK*>H5Y#vkX;)RUQR`#{A+33S#@Vc+HK1p39$8yhQ@|o7yGrn!f8(I&1 zgKzJS%~tlVyn#m9+jruBdJi9S4%8pP?B?F&$dRO}gL^L)Zz#gI-uS?_H=5Dz%BPKF zd!=LX<-N|&=_~Ecm1H|w5l`d%iufHXjd%qg%~vj-U%9l>wkt1O68<8&CV`RgU${=o zBR-7XU~57MPW0b$^lSTHQ4DgUGxS%$_7xSv<gliH!xAjLg*C@mO1E<8TGAnc^Di+T zKp5r)q@fGAOhTdUf=uT?Cio?NG9hOuWFl$c2Mj6npRfKh#35xa0fo5Dd;Y^oGeMQv z0aaptRg1nNK^Vh3nu$SA&$;#w(EEQmxQN5|vARuJ^jQ2pi-|qX5BAvN|69mDe|FzK zwf#dpTE;(mypRR?KU-Kh0)Pp8U+>(sFS89_B-tMQ^Mm{^L>6>vEmMo(gPBaX<Lub( zUNdQQY`e~X&uDFBdba~WYvaE%yri)k$^T;5MXV<u=p<g3Zz=NGH;2a8c~>&N%=60k zksL0WO&ull@)QhlNRmX7jFAjSj<Sr{?I$c4*NjkB;6*qs%#o8HA=(J|!Zjc;{_TVr zekXnp1#^E3;B5ad2;Hy{mT-mP6s}|8bU2IpWOxx{9@>R4!2KDFAH(>G@VRiQ_<s0E GSo$AweBx^W literal 0 HcmV?d00001 diff --git a/Module/__pycache__/monotonic_regression_uncertainty_v1.cpython-39.pyc b/Module/__pycache__/monotonic_regression_uncertainty_v1.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..13c345d2299c2e6441fae49da50f0d2987522f93 GIT binary patch literal 10211 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 G;{O8B)QCU; literal 0 HcmV?d00001 diff --git a/Module/__pycache__/monotonic_regression_uncertainty_v2.cpython-39.pyc b/Module/__pycache__/monotonic_regression_uncertainty_v2.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..9939f22b40b2163c8755fa1788c7c3564f8c83d1 GIT binary patch literal 9859 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 I7lOzB8%<&+;Q#;t literal 0 HcmV?d00001 diff --git a/Module/__pycache__/optimal_k_aggregations.cpython-38.pyc b/Module/__pycache__/optimal_k_aggregations.cpython-38.pyc new file mode 100755 index 0000000000000000000000000000000000000000..816929b315143cd31076699cc0e8535a07a2a73c GIT binary patch literal 4224 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 Sj_3b|<u1D&ch$Y)I{yQ<MFe~R literal 0 HcmV?d00001 diff --git a/Module/__pycache__/optimal_k_aggregations.cpython-39.pyc b/Module/__pycache__/optimal_k_aggregations.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e6a22c8bb46763329272e0b152ec47e7ee05a9b GIT binary patch literal 4315 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 S!7l3`>dVfGv*vu{*#84Y1t~57 literal 0 HcmV?d00001 diff --git a/Module/__pycache__/optimal_k_aggregations_v2.cpython-39.pyc b/Module/__pycache__/optimal_k_aggregations_v2.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..1b9b748de6ab78bbb6b29f9740d07830ad6d9580 GIT binary patch literal 3608 zcmZ`+&2JmW6`zmY<#PEUS`u7aX<aofTC+&)SiY);<GMl6#IjK(NTNnyR=Z1PC32UV z9SXLvd!kz_hX5@C^h_OnE71RDu08pXON(A|>hBFDn|4$#_RX6&vorHP=Jy`MRx4om z{rB7NzWisCv42r#@h8!_i?{d-NX%kBWFx*KIPn6!+;J=~!Mi)2<sI;~otov{p}*r} zt~;#n1h#GLG;Q13X~kY#d&+j&u^-pbF2zCIK--B|;#S;#%6BfsOK}I1<@i#(jCLh< zw^?`f1<t~{-25oY3*8%qTBVPBlPpS<4%19O!O+h~d6w%uOQW7j1}Z6vG|v|2^o}+# zZKX(tNu+5k91e1o>aRu+yE@N@#a2YxpZ{85JiNcdTf`um&3MU5UW!xsg{)-dR4!y< zLFQGp%7;uY$m&&4HMCPYrHpxBmbKE01=^sj$FeU6a>}b_*^Hg547$2oMr_?P;@-9q z?{6!PeY>s^MQFUO-d<8@Rf9<RAjT_lrIWbZG9vC9nSt;FBgVIkGdfB@A-RSAhV6r* zzk&X3+XqGew&BC)OkKr#-`~A)^CBzWd^pzWC@n%V+s&Lh;jnkm3kR_Cz)A~P_r~~% z>Gabq#?UCy;V6%jVH@ifHsbgyJz|}!w;+ogkn>*$3~5EyFa7~iiWwsBl*7ufaph?a zD|@9p6<-LlFsut}?aP^S%DyI_xG#I~Ml4?T*faKwKZCVn89PsX?P~9YP5G4H2d(Px zCDsAO_kB?Xx;FF6Iy~f;UVpw@gM3qZR~dG0Rc*|u!*i{&O|wqjYN=eZUi+TkG(nt( zgA5^>MiDvg{3pOrB(2~rehD&QCELAL@e^M1tL#J&?TeV5;4I+e-^8J_&7SiYw2Jjj zR~T{QUBk2I(m1q@ky_m%vSG*78fKbcbC?!7%17fnKSTdNc-iqU#wv-^dCZT)R24Ti zhj|nZi#uS>r*{M67UN;6l}ih?lfy}R)H_I?^rEmxjCT|cCrM#Eozo}ARbe(rj2tGJ zks~!RmuS<8PH_36iK4q_R?hZayoBA30_ZR!^NBVNoyIsg%z;{hR4v;fY-*%Rj*OU$ zp=+o^<6?SmZ1`u!vr$zTxi?ls_OJ@no7>=RTErTn^QO+1F;oy?ydyiJ&D)|auJMkz z%$t0ft2-EZ?e;eypqR9`|L<Vv_Mfs!9xrR55qT7!h#~nY%bJ|g^Eu1JyEM;5r1HuE z=iv*tbZ0fRp7s$t3?nri#G;f_psH?68RA*oXS<gXkN&KQxZ;RGukW04&JMpUomoq_ z5o;8mK^aUT)l0KZ8Ju!Np4>7^4<9`0ZGG~f_wfgR{QZ0Pw~uSt-g-2i6x~ZkjK-!8 zz8B?_OdAQbG$My12Z>IyBjY>*@R{0!Fbf9>obeHyVVo$(UH0Q78C%XBEBel{uJ^+6 zILTsDD|Dzv;n<q)ENaN=ukL=gVPxFzsavp~ac$@sFWaM&!E3ZHAF10IoX3QN7%L1P zV=9&@<}M{%n!EJJkxD`YSO|bQ^X{vyevN6xItUX!7jUSDC*VH!Wgr6Kfm?;6eXc&m zoEIA)5#7r3-)ji;6>gmd{*a|(5zD7c^Vli*6keM0uUQJr(Od&*=1B5azAGy9_GO7X z9J4=*J`kuv4wyNm7$8n6p#Q!b)8l<ZUiW6T68;6I5W0Cl9T)iKAg`QD>TgQ+gSjNG z#r`)AV#u2{${N=8b+hzOa5^AiZNEi%WB_bK%pl{G^{K3a6Gqb6lI|b})q!}y6`Y;o z3z`LU&2~4Dr7q!{TG^OVersC1o3GNEuTnNHUghxLhwnUNeI7SpEq~Ek)zUK#d6VQP ze71bbtPKhImihwm+uAx_L%v9hXc!`A_tVHGl=U=QfB4~hKY&q68{2q`Rgjcmv{?Z} zHJh?;EojcslB*9f{#>YaG>VeYo8c5}5++)xe4mDY1#*1dp5%?AEWqW<Pt;E_{bPW# z6RUh|YH2nehEZbNM5$a+K|!hcmih^%y`Vt*fg*%0D|n0RAXbreQe>V1ko|xY`m8tQ zZ=EZ54U@5}Yj3mq4SMQx5@ADo^tqM<focb&PYh}H|F@@fWVc5;B0J6xFuiDVx{KIc z7L(CyTi5N??m_i8wjZ2t-(69EApRX9bZX<IfPM8RVjC#d65T`LkUTar8cj^oTJfyT zQ@b>&o$W2=5fhvhfl+Z}I<_i2kDo*pCO80e_2!6Ei}K-Qloj^otB+_g8SWLf3Na3n zO>v%-+)?<rcVPJb9I+f=*M@ONq?mD2+tg4oSq2b^QjBm!{gw!Y7&75eq8<_FP;qH$ z2Q)XIo24sMNHZfMHc72s6m9n~T-*R*z^+x{$Yr2elhPGhJTl;cY(laoNzxS8<Q0Bd zs3-X1HAtgkigLM4V0Xa)ju>6P-3@>hN)GBBadjQ#6X0q9@0Vhe9s1Pbnp0VY)+Qmy zs2tgX4jERmR_sbOA>Qh9!3|Rf7^U~D{G&5>#Hz6J*W!`xG`;quq`#)KBH1Fn0%nmQ z0j@J?&%Q>mT1qO~4uo1mp$L$(XI#TqVhSw?R@5<;LES7zX{IPSSUgxbyrUjNiaI#W z(z*Bo6-@nQu}i8JRJt&j+=D83gsRZ*a`hQCtERbFCo8)3%3eV7gd&$J(o)rl*ec6G zC5_r@jFc7@sLNxsG@1-`I#zi^e_*nKx=WKkAVO91Jl9eRv;MZGw1-$gw^td{-$b!A d876nAiYzGP?6G-MA}`Y8_`bjDUkSQ?@IPFIZWI6j literal 0 HcmV?d00001 diff --git a/Module/__pycache__/preselection.cpython-39.pyc b/Module/__pycache__/preselection.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..335c7d27405aec0aade12dd43f1cd38612ce4370 GIT binary patch literal 2415 zcma)7OK%)S5bnq9?0CIiKN4&lP%sAqi%?7=KoN?fNJK%3AVOH6Xq9L+o*r)|o|n6O ztt6T`*-{*d3(Aet`k24eS57%|<HT1pF|iXNv8%4GseV=0_f>Vcu+U@py|{XB`&XZ_ zKk4K2PvGMwn)wYvF~w7s@sZ%93+Qs>HM)e}8TpOwLGO;bjoyJCjOH5MPkW<ztn<_U zXrbu`+2UyF_1N-gS#?!#$VMw_PW8~AQ}e2i{=8aH1N85yMYV)}Rry<Nxcmwpu_1SB zQDN*j3$0EbkEeMQYa1rHeS)FYqO?gCrsLglIGN~p656E54MsMyA}?%_C(#&Y9UFsz zw^ny-QKU5aoQcyoqNU?7ofJB;53{=wr}JO`5IQ!G_8pqphp?<-kN5$vdBtZ!@ng<m zJ7Bf2(s~s}4)`th;7%>AtWGQfmTzj$N+py$ps!1HrxLS{@@9U;E4j`fy>({0Rp)?D z<Z-j_-tE0>dzUJKpmgrKo=U<=j*ukLD{}Ew2jXwOISibaCdRsMRHV}^H_q2_R_w>F zqr-d>JDJA0^TV=?bLG58MUp#dtRDJKsGZTg#Vix)q_k!<h>CnCnM`#XPsbC-A33=j zKY7XY8l87-^A{6qvsvsEQ@uBhH*XcuG>da<Hh+%IG)4bop{8lPSt9r+;k{fwaVue( zj?eBtz>a1Kg7F^j37;?V6+YmfalH;(L>xW&EkYqMB%1jHqGB_!_L$$7wWuY6ivR)^ z&x)C>JlI9usS#Wy*4fNEX3r_auk|+MWEJc=e=eS}XZ)GikxDA>Ft8o#AF&ol?AW#4 zSx^C(%CEc~c`UGVP|sC!1lavf-K*#8e!Wl+DpvJ&TCg-FpYB4OVG~`5E^!XcT!NV3 z8V@ek{0MAXXGenMj!^6f&O(#Fi#-qMa~)uE1He!?arsMq9^Wse^N15pT78AY)n<l% zA7id}oj4H{S$X4QeE)^Uo^F^VpQQ2FM1_toUr&oDOwA1_CsT)Wu4BqHu}&h>G%?H# z;=O6IKL!WJQD|b<wZ)hgXhKgDE>328>XzxSsg03$(Nt5~4Hun=QcbsYqP&83Rj)Sl zb-eGyw1oem4IRJdc;>pu*Kw@1liOt@ww=`D5})I;z1RnIU~{|v>5E)|*{nb?@F(B{ z(dQTVMY+mXg#HTFh&Xfdqd-z?cr=1y*$lim=CyprcDMpx4uc9QOkAqu3~60?)>G1U zh+mbszz)Q*tdY8^bI7VrGt;;JtXuimrK|j^I|g3>TlZ`&A@n`827LmsLBCIx<Ory@ zShqK&R2vFSH`AX&yyQ(3-{7l1g7pg;-hg=e`Kelm5ElBsA#SMj4l4=iEi^+%CdA4W z@=GzQObT3l(K1nJDm|y^*f{C9e&hHF0aX&U1l*)08xa4)&wm#^U3zn;jpj}ur^vvW zpHRJB*Vs^JVc8%I0)~%UDvDA$e=F8WY@C;eSv(9{0?H^wWz4sua*C0X_VD&We~^r( z;@rY<)8681a=0Pd>KiABn<s%CVuB(5qi~58{-GG4fcaeChUHAzBD|?J?+5Kj?+2(Q zP_9^od_Ryi-ia+Bd>4RI*=sf#dM)5LVQ_w1HObS-+hJaN$HDf&B;p&YH4G`y=lTw` zGoBF}DG3_S`cU8xu-*mYTTFisLvz$njOK9!U7ns|H)kIrUJr{@z3s{Q(*>U%Ut04m z_AyNz=lTce!!_r(?}H|*lTkL+<c5>QZm20#`V$gFNKO7bVM4c<;blomT}1St=M#O6 zM*K3&RcQ2e`dEf{Wm?!Y*~V)_8phjRmZ^23Fl~4#GEIz|m^5CUx(a1p3w>}sYaX&2 Z#P}vJ`Uqt67lELl1~TXei@|*0{{t7BOdS9K literal 0 HcmV?d00001 diff --git a/Module/__pycache__/selection_algorithm.cpython-38.pyc b/Module/__pycache__/selection_algorithm.cpython-38.pyc new file mode 100755 index 0000000000000000000000000000000000000000..9befda9e9bfaac2b829c9dab5d20e939f10dbd56 GIT binary patch literal 5225 zcmcgwO>-Pa8Sd`+*x665Rw~;vCOANV1<Fbs2my={iesRNg+VqSTXCtz+ar0U{c=w$ zWt&+J$SJL=Fa-w=Ib~Ix^lv!#5l%XDOBGc-Z_n;(S1UQG9GI=?>FMc@x1WCB=jq=2 z#bS=(y3YO^{$q}@f78q4<=|xncl;+Ll1biVEnX9x@&b9M=Gwf|^lBc;oTgvP*k@1+ zq$|DWtd^C&%;1@e-0l1(mx0Va=e2^&$vjGnR4NObLKbBS<s~^M%P5~id0Eb*ydoD+ zJ};ehR$V-X9jwaD#d;^!8?8{Q#*>ZRc0E!$Y_#=Ld<t4o81JemUaNDeJ-h-uJ>2i$ zj{k^6vpv@1HWiv{k+40!$8WI*@AaI7CC(BXIFcXo_nn^G^Ll>bCVa<_R}zn&>TV(i zZd&h<bN2XB!tw4>-sZevsX&jVUM67!FUi=l?S!qfBeC`gU#|MbZ8l<UJQcRLBI7ip zw(;U_v!RV2cDqqq8ec`N&IeI7FkUxosJNEfjU&0C(E@oHH6tBu)H_YX8%A{Bz<u2~ zJJD0apByn&!Aw7Sd-;AGsdzb*twwwKR;Rw(irP9}zWeCb@|}*{ZAQy6`l;(ir@aw2 zw>qk!AGNM^pPGfuMpH*>!;ZYMrJ_ha%@cwbkTCA!SLTbj%Ob}MJix6M@ue>4`|!%* zIflNCmlSkB!V>`8a{#`h0Xi0d;Cib^z`9rfcent69}rsL<J*aE7vL2vfS1;@u;Sf9 z9iU%732a%7pjIx1tY(ythw&P189h-M<Q2JuBI6WAfuea;v#NlH5%nfqG{x4=-8c>T zL=~xCi4sH$Q)No#DIu8CWC1x-nSw2pVOM_v<uO$w)N;I%qLw0d38i&1Z*-A)WHrU# z&{<Qg4p^UU3(2L}64H_G3&bLjgDV~~=}G@NlbILdfba8Rqy^g3ejkoauD!<(xX#eq z0q=8}OPmkI5<_i<+Ihrf(6_aEXrY5aHt`Snra;^k)=YLBWyXt?>Zp51++-T<ZZoV$ zQ;|kdN6WuX#uLT~h+`@B`D6NMfkJDpPvaKcXojtaGQ9aZs{IEyd$zc?dhJHDQxBW* zO=Qx~N8DmRH7pHDn9%~ngy<Fqeo*f5J_2%yNw&oPCLX&8J+4ly5Jp^k-L5N&Y3V0c zF?WMvv)*ZSZ@xjDQtv*d_Uyv6O`}S-+w*O@JhG`WvS}L;a5%Io1w|PDgRr?9#m3hi z8vRJ9uc4jcT>$2^<>rZf>Kpj*UEE{CsyXA<I|$oAMp4)1T&X%;<HsGPBMI-<Q7fMC zeu`BiTCs8N{N~+i#t6A-T#T|o9f6nlj`7<M>)l<{Xu&Ecj?zV|3bl;3DP-2?#oFq( z$QTL=1~#aOMShw5TU3O)iLyFzz~~~s7<>2%UeZYJdDa)<-_L_&=!=OzfY&G965Hkj zamXmL6DRTaI5@!tD`YlF8=PsrpK^!K0KKZhh#}gF*iBud#0ECa&!WA8%oy!wujvRP zR1e#-Aw!Vx?e$4d9eG97N$KUA)CnO3CeKl$lvIsVZ^kK>H>d_t4Ctq87EU?_=)=lh zy}N-0v{qUBEcEj;hWrS<#8%sRAc$)Mq25K=@heE`L@%R@I-td{RMSUbXrg5ow4Bjm z;1EF{xP5mUR6IpGUSACSL!uOaU+nu3YNDS2rI|xURMQKRKxUR$FPmhyh<NB*7Bod0 z048&wDR1Ai#DjJ^r}KSpOjDjL^m0kAmq#h+Dsgt$U%7ge<P-lQOKa}9>Yw`@J<!(S zB|Y@L1U*qZOLlCZp_Q}mZo0BGZb#CSx?3U13<|oK6m&@zbUrCyboVmb6Ne7XXnPJD zl+=E5Lpww45Q@E0Z!VeZm6K9$9#$4FGFiCD(mC|`pq$K;+v<5(GrxzKKmH3W;IeEn zOGmDNbSr~}q%tJk`8BnKg;C_Z_Y~>J`P^~^UoGD)j<}`IcZ9;0CFQ)-W5{g~xI`$H zKau}F^2P-#bWgeZFYzHJO(MoCfb-7w?pe+|m;TikX<X~NUmE95;_FqEtyB4zkvv<R z9xkPQ^%Z<NAB2~YzWOS4ZAW{Ja$g_6j)VIiipIgMY@pCwM%NUfTt%tH`x5ZRE@lY~ zwUbe9nm>)X`ZlTq?4RIqN@OgpypQq;tY>CO@k(aK(>&JaeWx!HzUj>jNOL@L)e0Wz zsFqtSW1k>S`tcC=c+yh?pSzCOx*ii47EP$;85<x)iy2WJTFj|#r(m3(55YJiiI$fw zfM*eMjPA$gR~I2=UE|*Ebef8G5Q=15T}J}-YP1zmuyL_Bj@6s=<vWxRxOOXOGO-R- zE9_dPM2ql=aY;B+{wD8IB)94<B-I7=J<7jL2?de*0VO}Ags?X5_Ac4dg)PRxX~b#@ zc9Csa%jk~YK*qSx`Z(QGu2REWNNTx<R#k}SYuPjpu~5Y57IExkS150t$&P%owsr&a zQ~FBoV#MwBpWzvkX^iKrC>Qu8h_X-OEL`r2k|^^loN{GxRb0VFzC>@>$h%HX6dZ{6 z@6dWmya_VW3#%C<L#cQlSZ)O$Ps+CksRpmp`3WNKf2vfI!`R5W+(TR;s+>_&o#Prm zMg!=!1@H_9r=#9DwgNUI+N)=Z_AJu2Ym2l!1iXW8?Rur0@_Tx<n4i|-)%8D+1thTy zD!eG5#5LrP$t|apn9dbrCC0w~EG2gO&a4t+`|nR}|6Qvsq_cs}KzH4dx*fPWOK+s; z604DJ|4}2=SXccET7@lEx{}a!2P&Bx_j96>0aOx-odmid^BTH1p_0)1?V>C|+2}Ar zDw&nVB?gs*p7#nEp_Jt9@$3=$=TPC3gGUh>I0v;X4mEJ@<r;V{M|}pZ`7_`iYR$9{ z{6Dnj1qL7U*0T%K28?!&GralvbU+aYq;5(cY8B`2ljF~7-TAoweB9SB#<>$kc@<?J zQ8`8N?AAb_ls5fj#wjiP9Nhmg^+Mgz4y8J;-a}U1p=6r-&*FOfCxyC8l_?n2uPFI7 zCG;=A1kIN|h2|anMWblvpnglqeM&4rSUw^`pI~lpg1JwTcFNbQ>mQ;;d=&{Dp>T+D zMu(^Zhy(l#mM(G2$`4SdS}}h52aY0aah7Q9Dq`hy284r|Ywb35qpLdgD2^NLEsGPj ze2rF=qF{xMG|isUtoT{Vx5z+4t}7ZUbs)Rc<MlSdjh6lU=q5Rg{ZFWX^Iiaf3A~^j NluMN$Uw$*l{SW9?&uIVv literal 0 HcmV?d00001 diff --git a/Module/__pycache__/selection_algorithm.cpython-39.pyc b/Module/__pycache__/selection_algorithm.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79170c5987605a38fd82c88271acc26b149a7405 GIT binary patch literal 5173 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 bGn+ql3OKw4P?Eq4%0anQ3G(GPgWUfBY0%P` literal 0 HcmV?d00001 diff --git a/Module/__pycache__/selection_algorithm_v2.cpython-39.pyc b/Module/__pycache__/selection_algorithm_v2.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..ab8ab13c851d4de362981d471ef9a7eae3e789b6 GIT binary patch literal 6027 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 MzEt*dm9w7rFBluQJpcdz literal 0 HcmV?d00001 diff --git a/Module/__pycache__/show_results.cpython-38.pyc b/Module/__pycache__/show_results.cpython-38.pyc new file mode 100755 index 0000000000000000000000000000000000000000..c5b962eab0a56c10c738cb71b723ac51d1ed1c15 GIT binary patch literal 5683 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 H!8`v17R3b9 literal 0 HcmV?d00001 diff --git a/Module/__pycache__/show_results.cpython-39.pyc b/Module/__pycache__/show_results.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a77523ab471eb02977f182b7253a9182f0e5c99 GIT binary patch literal 5682 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 M`epx8a5Z@IUyEo6<^TWy literal 0 HcmV?d00001 diff --git a/Module/__pycache__/show_results_4cases.cpython-38.pyc b/Module/__pycache__/show_results_4cases.cpython-38.pyc new file mode 100755 index 0000000000000000000000000000000000000000..1ab8bd2cb097ee1e24327eb042b443465987f776 GIT binary patch literal 5378 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 YVF^Y;&$Nt?-sM2%+HTc*AD<8Y3Ak{^F8}}l literal 0 HcmV?d00001 diff --git a/Module/__pycache__/show_results_4cases.cpython-39.pyc b/Module/__pycache__/show_results_4cases.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b60c307a3f8c7658a1ad25c34c2e454dc7179053 GIT binary patch literal 8079 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 literal 0 HcmV?d00001 diff --git a/Module/__pycache__/stages.cpython-38.pyc b/Module/__pycache__/stages.cpython-38.pyc new file mode 100755 index 0000000000000000000000000000000000000000..b0ce31ee2ee72d1a36d64a24d9fc7c3d44abd849 GIT binary patch literal 2100 zcmZWqOOM+&5Ek{eY_Gkxcau$uVB4OIrr9>>F)4y3mmCrVNOKWV2wF;Z6zf%zPV=CE z0^1%7^dHm)ddXknwWt1tp8AoyS!}lwH2gS2j)%jU&(DX$$inl-;~U3uXjy;h$;HRU z<UT(BGel-(q_ip$+eBj<*oj?(9bhl^4R(QpI55})4&$D|ei_Am?DNY(HH>%8bfb6# zT~Lmz-FO$eFzfwd#gi<``WUC#ARA(wW&Sg3zVkPtu;xTvp$!*Fl?qn8N!B&ZnMjLT zyoG7MX+=?`WwJ`r<&x#gR1{6kVL7atx)DuX&;)9ha}L9$-JWQgQZJtJyv(WInxy5j zVTE{EJ%N768k(eQnsC~%oCZ3evqxvLhwlMCeiK4i8zL=9q$54)N?ZEdpbMb2Ww0eL z>@MtjGL*r>erA0jPv(wtnpGOlR!LQGPRkS#E(&T65ckf{HII~?EtEq`9(z^#CRr)J zKBn!OD~}773gs=36QP{4S;oOC$r)>y@>U64#2#kJ>Vw605#c{y96jeb<40*$74^}> zhOVo;7X0Yx%ZEpgn`~X?M_i=KoZo8Ss=&bH>ybX74`GpgvP0Muh@yJVpX)&9nfR0F zOq^I<Xk^dGNDyI5>x7(;ht}`php6jI>y;yQeOSNR3;V$82GZKNvcDu-(hcSCm6s8` z_HU>@;maU%PV8<+?reh0-Gs8g#X4eP-rHJO5pDW%h}^r<+q&Hd^MM?})A-U}??1bS zn;q;L$uVxr#eMlNoNl+9bW<_hj9?kaiSg*+_GaDQC0{<`n904ZebJ{3H)F9Y2U&1n z$=Ow$*;sp<F;?n`BOqhdvmb9@{Ui&wIzQnFxo&m)V!D~ho{Xfkb-F8J52%N;Uxj{O zUXjt(?hY<R(nBQLcCd9W#)2JKFMC@X=Zd;sckOi5!a;XMPrjeq%FS5Qs-URbGNrj9 z>AS&GR3NJ2@O^g}z1w|ky6%uRRl62>2G#T_%d>m$yPJnkS#z8M9Y%4K73s1@n--Lz z0<3ojDWzr+y2p$U9v$8@KId1JTNWI3%hGz8qi*wBxkcGfHp5QUN3Z50De5eLqui#2 z)%yt@nJa(MFtC8~XxVUVq}5stOu3(tgBlyA_}EJ*b*2kbjTi6+il}mtR!x?d@h6n! zsmPNQ`WELYC<x}GRrzU)pUsq$9;3@>v#tg6;3)2$a{<#_5Kn1SFN!P&Cm~>wv)5@E zPtlHN-JHXF0|TF5XPPirUyHHc8fsUIqRiPq>vpslYJ-bD=E^tc;<4ZABx7Et$9c&W zDL@-*5xdzUxvj`T1vL;BD_5UgIo0c2d2L!Su3XJ!%GKwKJ>v%_qBM5!)3FP2JGLJ@ ziihWvnzVu&rZ^Q7g!7RGZtr8l??YI`*RMSx6EXlHL}W}tdrTrb0uJqKWFKe(w6AT> z#H<-WH-m0M*d6$whETLOJUS_wPz;sc1-L+^F51~QB<iD`1L1%qED1tD%YtZ4%Ys-t zl(`HwwKDB#?y*A*>{Bg1(?Zt)`y684zjPCq^3ODvvoE!{rNxmJUumH!^#6&u^BvUO z@F5Zrk!yr~1I>I-`KOf1^uOw9IF3dp5*G+}#nz^-n9hc>d8+&t6^ZM%+f41E*4wfX zWpNBX)(Ga)(P>Me?1sl9zAE#S)wfW*tf1VKrJ-n(W)sSVz|9fNwT5@m2q64#b+>YT TxdYs$dF>EmXb;>l2ygxiPgNu1 literal 0 HcmV?d00001 diff --git a/Module/__pycache__/stages.cpython-39.pyc b/Module/__pycache__/stages.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1b1d8b631f5a1ddbd8bdaa280656de911f2e391 GIT binary patch literal 2390 zcmZ`*ON$#v5T2g5M$)cU(mox64tWWTH(n<YLL3Y>0Yki)IDs%Y46`#MdAuX_xVz=p z>z>ml$3P(Y0TSfmztq>9@)vT-*S!xmOESY$S65Y+s=BMbR@&`G7M|Y@zCTJ@mi4Ee zTzzaz?&0IVgXC6DDr-h!n`qt!@5HX*9q?Z48{P#U#DU>G@L}9CybnH#+lCLSPTYl$ zpjw-)$GvmeM!W%8SoLRvcmP=|kAAY^VcyO=7&r57zJ_rtU(b6OxAWkMHQx9Oky&G+ zwlm5_GD`(3UnPrqRxpv4bMYFgEn16mmR8Ael1`_rn5Lqna}LdDM(0$}d6^{;vx0Ld zuC4Y2rIj`w@S-X*y);RyDP^U2HiNiRW8H=35P~kFS&}ZYglCi$nWF<de_V|EyN{2* z2O_K`k(MMYyK$tQTMNQQkl7M5BXgcuZ^_}<QBKXPc>79}1!I(*Cmav22BC9FpdP!* z&L_&BA7%A|tCo0%NT1OvR}L)RT5KH={C%+h9WNN)rxUthFBZlA1DY*n#a!_HZwkJs zFg~LBqAK>eNT&tARliogVL$HaG(r%IbV!JgZGg`LEjfR5eW9|>GQJ7sB4cFeNmts^ zUj<EIat>DHsojK4ONKI-*iS5`SL)p9aT*VglUd1mR;4(lNtu~Lj9ZsyJC0Zz=E}(` z9(%L&RdUQaTHtZPQlY#FszNBIqSH7y*84-5@{SWYh&{|;uJ_}N=*(1LvP^F8V#0k8 zi)@iK!gj!ACT%Ula|7RHl7A4L<f+w!hPDii1QE8hPRS{GVEsydh?=&vo;$LQg13IQ zC-$z@bfmR(WqV3ir0L4;b1x@&?O)Jt!k0nroZ8KrTw4aYy9{M}1v_G4-db6(h?Z^H zl>}Srt=wiE^Nw7Hr{1---oI9LmupzHE_*l#7f0bgb()Q)-wZ@|xeiT7_Kimm2QzFo zule#3$53vr?5jRyxa^4y*~x=lOAdFCv(dJeJy`09BXCBmXD{A`eLoLZdVj)Ga>Hu2 z#9%p;Eg4B?<uu!36I=_q??ApKw`GLJ*u54>3z2Bu?#j6u3s%5hwpKRsikeolcV;y~ zTaBZ`Z^yQBb4F_wl=HeuvqF*dr1Kc1h58@8X-3h>#v=nMqm0h#g(z}}29H^h-+j~E z96e_AC<Ql);wUfE=^PkTW(*Zzo$RJrW{dy@X1xD!bl3PC?<lt_IZBeH^J#&SEau8B zE1EG~YO1XPMI_}sFJ38^*3f!C0&WWBPbdS#DKD!i$HHv3P@Stlpn3)dFPa2>&HCD9 zZvt<?zgZ#D8O@6-ekWr^DvBh99N>|c8PM}WtNgUa&jKjYBaUCAi@9JP9L23mU}L%i z;z35|lQJ&=xCmGj>}6WT19aMXn-=g+q2S{irajpJtJt<)8fsUQvMNlQvQ4cRYK4my z<;pjC@z}5RCSzWuM@7XIDS-zI5xe;$IZ$Mxf;l)CD_7^PoY~7ld39Pcu3Qb&%GLSB zp7Dc>vMhG+)3FP35Zm`3#@);NBB=%c9~d|oAvS&w#3H_a?LO%P^VUd2dL*=aB(fv$ zp}j}8!1cjxX`RzIHXX=@ko5`s3_dagDB2qy4P1IV&Aspym@6phqMd!|FYVkk5;P7P zl>jr{rH8u%(17LznwsVXdNwF{8EX6-+lMDnHcPm;b1UO7$3A->zS##L$`>?&jD4sj zx<=SXAmjG6Q@VCG?6$T%(BzILpJ?)_CjX6{cfN*>n?D)YB)vU*gnbSfdcZ%sR+#>i zaTb`qD$iokmn2S-Elkxhy;sWSDbrUA)9#dCqjFIecAcvY^h8}zQI$uyoiqpa+33`j zP&Vc9IzO(8l+ACU$XS_jQ@-ZDGI(yz#6)%_6O)s<3c@eYHMj%6)UD0;Ksq@3^Vil_ OU+8q4uoVX3&3^#>C2R-) literal 0 HcmV?d00001 diff --git a/Module/__pycache__/tools.cpython-38.pyc b/Module/__pycache__/tools.cpython-38.pyc new file mode 100755 index 0000000000000000000000000000000000000000..8f2638c1b65f0190d22036d3ad42dcc974ea8167 GIT binary patch literal 3593 zcmbtX&668P74Po(&`2w3*VcMJ97CxLgeW9lYzR~lf^qC@l~c*$_#-xojcQgss~vVU zqwQ&}EqTO&&4G&xjvR8>&229f2acTbCvfa5Cs%O@2QCy<;rCkmVQ;|&M%DdZzv=FI z{rdMlbgx#cFg$<!+x&Vm$Jk$K@Z#fO@KdxrMJJi$32SppMc-+=oMa;L`hMF7?@0Gk z)-Fj;`k;X<$pEx0%d!Gmku$OiIwNbc4qBD7at^d6&&f0L?5Dh4mkl`&$*kmeSZm=q zzRA{F+ypX;2Hk8h>T(htJ_6K3yN;GGpp#q*(m{Hkxf5RSf-N)b<F6fv)w>7cF52oU z=xWP-P8&U^9iGz>pS$P|SW6fl8!y@(#ye^TBHR7*^_6>hr1F(e_TzNrM%Eqnqg3ZB zw>EFAe3;2$60PVgOY%#Dk*V9oovmop>4tgaW0RaVXS~kUEa?Au1XaRX6;M~Ej;^ic zDpFq2{)#N2=yO(QoWxPlj;b9ArpKvcc%&k!M|#qf6BW;3^pc9SIeo=i`4?acwg*e^ zb6A)-0Zv%X0q4N#Vv!ZjBGY)k%eO@SBQ2!6%YV%a=SZgBryHiZTTFc{#U1R3Mz`gy zO^<3X=qo(qOSe?Eo<#j-oHq4l)QptMRCAyr8FzJ@rFnA$<FGjhb&PvCaE#Z@hN(7A z5~ZeoEyv~2y!U9`fonWknj0P(zHWH;<f7HoJoLKLk9642WRx^;<oql;CMukM7kHJs zJm9WS7a;xb#%km3|6wd^NGY})bsL7VqgP-c>HG&nDN=C!`YA&VV7G8RPGZ>Ql#vu2 zOD$4&jPvR7XYHz!^IycAoDB2g`Kv;G4U#T7(9uHxBve|UJOtBY6CnYK@kO!%PT=ed z07UE&$2mYE#ShuUxzDx(muaz8QFl3;AgGM1_u0?c=l=GC`|K^iV&eYFeE`XJ@Bpm< zTn?NyMF_E2Y2n7>R7OvX9}WglDoy3%Fd0Vn!dqUumc+U4WE-6bD9TNV2!PVA+eMv0 zmUn1IyL>!0JUVTcMlaHx;|VY+fOiQROtAq(xI*wMFjD1nz=--L-o0cW@=dalwGUxK z!zPmNiiw!I#f030@A8SOg@z;T;&+2RdTrtr9vr2lUM-wGw_t_0%&h%fjQG)L8*dA@ z5F5ZpORQN$v^=YZqH8jq3e#Ss&Vg4=bS>ZbNw^**x$*6t=WTzOb_O~(l{9+XnZ9dV ze)?WjY3(VzG=^z63G+POh~YMaEJkE}8}o9c6T*xL;45=zb@ZwQS=XUAhYul!#?~so z2SbQKbJ09BUsE7CvPFAR!ih`E4EFHU2e1Wr_=r&N9-(P_r*JK<-0cg;bD6quI2Qp) zrG;l_c$nc^&Ijk<=P$BX*d%}*y~4G8xhNMw4~SD=hjJ~Uz6D~9*s8RHQ77!`VVD?i z)Y%NRDeFxY<(pX|jnD%lHqdkmnp)c#M-P;7HU{dn6{~|tZIIKcxSM}~PvlK>j9_J< zH3wK#dBwu(m<n|Tb6zqhIV$A`Yt8~5qS+omMtO1HnK*Dsw{UK-N9QM=7BCOMwCha# z!rjB+2~^t)m{URvw5wr+T`t`v#Br>-F)70^<z+Uh5S1_x_?aTW+KL1yiy7*B$Ov%m zl9jqvihe5HeqZB4_ew=jl=cPfy~rljqAJ}juKon-ZF%{hbs&Ap7rHD<dzGTPkL%}5 z&lFVvK}>3ekZh~`JFcGS>Mv`wmkg-Jp!!1Ao|P~ca#SI1PaO7j%$R+K(4wn*b=YHW zst-n}HC`Ca$up!q<fupvxwEpdSJ4e<H@_<i?29wiB+j&N!x+9bj|yht*>v5xVtW26 z+;DNNhr6&(ul4Y^U;N{>FR%9gb@2DUe7Jt=>Pea#FJHTNy_t726*c3$nP!?&-6!9D z<MN|%<C==X<`B_MHM>K#6TS0vG8S*XX(}>QTiMj7sVo?mZ~yH2bjoVWGvy>sqg;=Y zh_YdlDI=1{#<NasO5G$Lbh6aAX}B{2sNcc{>ig&p_5JedxUm{0dDOg><%o4VQS)}F zqw(3hYIs`Kfbvl4jpp^6?|kxf^7hloqo%D<#xqIw7;3Ayx2aLZIZ4)SEf|pw5T~b# z6Mk(lI&mxG<io!4v<e4fMO7W;YXlYJBg^;UV~uW>Zp1Q5yAk5Cj?@nP&lx1zxPv4^ z|0Id~#vM`bKbaobA5E#JV@(!Os1GE<U(};)QOd)eXd~{m>gwC1(5vX$K{)JoHe$@K z96NR1uBfbg806G<Xd0rbj`DUHKHUkG3P<fSe0<7UpKtp%CSE?ISK2N%{+<!nZ=Q|; zW%{B;L4=+2AD~0kD5%ze^Mks4-tr54NzC&lyrY1y#LpwP)@^Nak%9zQYgqYG?xB!C z1*8oNUx1<9gG__SO5wqlaKuqD=M<<h3bsU%&?Qbf4K|OsTre9E5jf!5cDw{RoRKdv z1Oz*eBvk%cnfH=R6wW;M#20+X-NK*8HxSPcc?1G-WGV<hmjd!Y@-0{W0XYDn2yeVy z0U8jcc#N|C#Di>M+_N6`@T;p9eeeO7vbvhbaTR4G<L28+tD9h3W#how_NI+kyNq_F zEj|MM=!y|{-fMe+ZfCviZvwlW^;0*cu3?McpylV$G298&g;m_nyL3|++xn2(c`d%y znloNH><>m$HO>IVgw!Nn$3F&(S$|5^yV%aS^iRj;Z2N~nQAut~O<QwKGdkr_8~yEF s+Yh~<q)pM33QX{06tVb&@)IhS?4KkHCMPHbelQzUgIaJVSgw5I-xGN+#{d8T literal 0 HcmV?d00001 diff --git a/Module/__pycache__/tools.cpython-39.pyc b/Module/__pycache__/tools.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03b72c0092087876efdff4564d67f0237de44159 GIT binary patch literal 4329 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 literal 0 HcmV?d00001 diff --git a/Module/cost_matrix_uncertainty.py b/Module/cost_matrix_uncertainty.py new file mode 100755 index 0000000..9ef4090 --- /dev/null +++ b/Module/cost_matrix_uncertainty.py @@ -0,0 +1,150 @@ +from Module import monotonic_regression_uncertainty as mru +from Module import tools + + +import numpy as np +import pandas as pd +import os +import time +from itertools import chain +import copy + + +import multiprocessing as mp + + +### Useful functions for parallele + +def vals_mp(pairs, df_2, out, funct): + vals = list() + for p in pairs: + vals.append((p, df_2, out, funct)) + return vals + + +#### ERROR MATRIX ###### + + +def single_error(p, df_2, out, funct): + + p1, p2, key = p.split('/') + key = int(key) + rev, up = tools.equiv_key_case(key) + + diag = df_2['target'].values.tolist() + + tr1, tr2 = df_2[p1].values.tolist(), df_2[p2].values.tolist() + + data = [((tr1[n], tr2[n] ), 1, diag[n]) for n in range(len(diag))] + out_p = (out[p1], out[p2]) + X, models = mru.compute_recursion(data, (rev, up, key)) + + reg_err, bpr, bpb, r_p, b_p = models[key] + pred = funct(out_p, bpr, bpb, rev, up) + + if pred == -1: + return (p, -1) #if uncertain, we keep it like this + else: + return (p, abs(1-int(pred == out['target']))) #int(True) = 1 so if the pred is equal to real label, error is equal to 0 + + +def error_matrix(df_, pairs, nbcpus, funct): + try: + nbcpus = int (os.getenv('OMP_NUM_THREADS') ) + except: + pass + pool = mp.Pool(nbcpus) + + + df = copy.deepcopy(df_) + + index = list() + + mat_err = pd.DataFrame(columns = pairs + ['target']) #Dataframe with possible classifiers as columns + + for j in range(len(df)):# For each patient j, we add a line to the dataframe contaning whereas the patient was misclassified or not (1 if misclassified, 0 otherwise) + out = df.iloc[j, :] + df_2 = df.drop([j])#classifiers are constructed according to the set of patients without patient j + df_2.reset_index(drop=True, inplace=True) + + vals = vals_mp(pairs, df_2, out, funct) + + res = pool.starmap(single_error, vals, max(1,len(vals)//nbcpus)) #res is an array (size = nb of pairs) that the name of the classifier and whereas the poatient was misclassified or not + + dico_err = {r[0] : r[1] for r in res} + dico_err['target'] = out['target'] + dico_err_s = pd.Series(dico_err) + dico_err_s.name = 'P'+str(j+1) + mat_err = pd.concat((mat_err, dico_err_s.to_frame().T), axis=0) + del df_2 + + + + + unc = {col: mat_err[col].to_list().count(-1) for col in pairs} + unc['target'] = np.nan + unc_s = pd.Series(unc) + unc_s.name = 'uncertain' + + mat_err_unc = pd.concat((mat_err,unc_s.to_frame().T), axis=0) + + + + cols = list(mat_err_unc.columns) + cols.remove('target') + rem = list() + for col in cols: + val = mat_err_unc.at['uncertain', col] + if val > len(df)/3: + rem.append(col) + mat_err.drop(rem, axis=1, inplace=True) + mat_err_unc.drop(rem, axis=1, inplace=True) + + err = {col: mat_err[col].to_list().count(1)/(mat_err[col].to_list().count(1) + mat_err[col].to_list().count(0)) for col in pairs if col not in rem} + err['target'] = np.nan + err_s = pd.Series(err) + err_s.name = 'error' + + mat_err_final = pd.concat((mat_err_unc,err_s.to_frame().T), axis=0) + + + mat_err_final.sort_values(axis = 1, by=['error', 'uncertain'], inplace=True) + + del df + return mat_err_final + + + + +#### GOING error matrix to prediction matrix +def error_to_prediction(matrix, df): + diags = df['target'].values.tolist() + + prediction_mat = {} + for cls in matrix.keys(): + if cls != 'target': + errors = matrix[cls] + pred = list() + for i in range(len(errors)): + if errors[i] == 0: + pred.append(diags[i]) + elif errors[i] == 1: + pred.append(int(abs(1-diags[i]))) + elif errors[i] == -1: + pred.append(-1) + prediction_mat[cls] = pred + + return prediction_mat + + + + + +### Get dict relating classifiers with error score + + +def cost_classifiers(ndf): + cols = list(ndf.columns) + cols.remove('target') + cost = {cols[i] : ndf[cols[i]].loc[['error']][0] for i in range(len(cols))} + return cost diff --git a/Module/measures.py b/Module/measures.py new file mode 100755 index 0000000..1ea5533 --- /dev/null +++ b/Module/measures.py @@ -0,0 +1,131 @@ +import math + + +#cls = classifier +# boolean prediction : 0 if the prediction is correct, 1 if it's wrong +#pred_xi : array of the boolean prediction of xi over the M classifiers +#set (size MxN) is a list of the boolean prediction of the M classifiers over the N patients + +def m_xi(pred_xi): + #number of classifiers producing error for the input sample xi + #pred_xi is the boolean prediction of xi over the M classifiers + return sum(pred_xi) + +def error_rate_clj(pred_clj): + # error rate of jth classifier + #pred_clj is the boolean prediction of the N patients by classifier j + return sum(pred_clj)/len(pred_clj) + +def ensemble_mean_error_rate(set): + #average error rate over the M classifiers + #set (size MxN) is a list of the boolean prediction of the M classifiers over the N patients + M = len(set) + e = 0 + for i in range(M): + e += error_rate_clj(set[i]) + return e/M + + + +def yi_MV_1(pred_xi): + #pred_xi is the boolean prediction of xi over the M classifiers + #majority boolean prediction error in favor of the wrong pred 1 + M = len(pred_xi) + if m_xi(pred_xi) >= M/2: + #if the nb of misclassification is greater than or equal to the nb of classifiers + #then the preditcion made with majority voting is wrong + return 1 + else: + return 0 + +def yi_MV_0(pred_xi): + #pred_xi is the boolean prediction of xi over the M classifiers + #majority boolean prediction error in favor of correct pred 0 + M = len(pred_xi) + if m_xi(pred_xi) > M/2: + #if the nb of misclassification is greater than the nb of classifiers + #then the preditcion made with majority voting is wrong + return 1 + else: + return 0 + +def MVE(set, meth = yi_MV_1): + #majority voting error rate + M = len(set) #Nb of classifiers + N = len(set[0]) #Nb of patients + mve = 0 + for i in range(N): #For each patient i + #construction of pred_xi + pred_xi = list() + for j in range(M):#For each classifier j + pred_xi.append(set[j][i]) #We add the misclassification error of patient i for the classifier j + + yi_mv = meth(pred_xi) #Whereas the patient i was misclassified or not according to the ensemble + + mve += yi_mv + return mve/N + + + +def D2_ij(pred1, pred2): + #disagreement measure for 2 pairs + #pred1 and pred2 (size N) are the output of classifiers for the N patients + N = len(pred1) + D2 = 0 + for i in range(N): + if pred1[i] != pred2[i]: + D2 += 1 + return D2/N + +def D2(set): + #average disagreement measure over all pairs of a set + #set (size MxN) is a list of the boolean prediction of the M classifiers over the N patients + M = len(set) + D2 = 0 + for i in range(M): + for j in range(i+1, M): + if i != j: + D2 += D2_ij(set[i], set[j]) + + return (2*D2)/(M*(M-1)) + + +def F2_ij(pred1, pred2): + #double fault measure + #pred1 and pred2 (size N) are the output of classifiers for the N patients + N = len(pred1) + N11 = 0 + for i in range(N): + if pred1[i] == 1 and pred2[i] == 1: + #double fault + N11 +=1 + return N11/N + +def F2(set): + #average double fault measure over all pairs of a set + #set (size MxN) is a list of the boolean prediction of the M classifiers over the N patients + M = len(set) + F2 = 0 + for i in range(M): + for j in range(i+1, M): + if i != j: + F2 += F2_ij(set[i], set[j]) + return (2*F2)/(M*(M-1)) + +def entropy(set): + #set (size MxN) is a list of the boolean prediction of the M classifiers over the N patients + #The entropy measure reaches its maximum (EN 1â„4 1) for the highest disagreement, which is the case of observing M/2 votes with identical value (0 or 1) and + #M M/2 with the alternative value. The lowest entropy (EN 1â„4 0) is observed if all classifier outputs are + #identical. + M = len(set) + N = len(set[0]) + + EN = 0 + for i in range(N): + #construction of pred_xi + pred_xi = list() + for j in range(M): + pred_xi.append(set[j][i]) + + EN += min(m_xi(pred_xi), M-m_xi(pred_xi)) / (M-math.ceil(M/2)) + return EN/N diff --git a/Module/monotonic_regression_uncertainty.py b/Module/monotonic_regression_uncertainty.py new file mode 100755 index 0000000..48cb10f --- /dev/null +++ b/Module/monotonic_regression_uncertainty.py @@ -0,0 +1,778 @@ +from Module import tools + +import numpy as np +from math import ceil, log, pow +import pandas as pd +import os +import multiprocessing as mp +import copy +import time + + + +#Useful functions + +def err(v, w, z): #error function defined in the paper + return w*abs(v-z) + +next_ = lambda x: int( pow(2, ceil(log(x, 2)))) + +def index_leaves(A, k): + #As we use a balanced binary tree, leaves can be at at most two levels. This function constructs + #a dictionary linking each leaf index to the index of the corresponding node in the tree + #A is an array contaning all the values of the nodes + #k is the number of leaves in the tree + p_lev = next_(k) - k + lev = k - p_lev + ind_leaves = {} + for i in range(1, lev+1): + ind_leaves[i] = (len(A)-lev) + i + for i in range(1, p_lev+1): + ind_leaves[lev+i ] = (len(A)-k) + i + return ind_leaves + +def is_leaf(ind_leaves, num): + #confirms or not whether the node under study is a leaf + if num in ind_leaves.values(): + return True + else: + return False + +def find_leaves(ind_leaves, num, L): + #return a list with all the leaves below the node num + #ind_leaves is the dictionary with leaf index as key and node index as values + #num is the the node we are studying + #L is the list we are updating with the leaves + + if not is_leaf(ind_leaves, num): + find_leaves(ind_leaves, 2*num, L) + find_leaves(ind_leaves, 2*num +1, L) + else: + L.append(num) + +def Z_(H, A, ind_leaves): + #Show Z : this one won't appear in the final programm. It's just to check the tree for the moment + Z = list() + for i in range(1,len(H)+1): + v_i = ind_leaves[i] + Z.append(int(compute_Z(A,v_i))) + print('Z', Z) + return Z + +def is_A_balanced(A): + flag = True + for i in range(1, len(A), 2): + if A[i] != 0 and A[i+1] != 0: + flag = False + return flag + +########Initialize A +def initialization(data, rev): + #rev enable us to test increasing and decreasing isotonicity + #X is an array with sorted data + #H is a soretd list of all column values + #A is the array initialised at zero + #ind_leaves is the dictionnary linking each leaf index to the index of the corresponding node in the tree + X = sorted(data, reverse = rev) + H = sorted(list(set([X[i][0][1] for i in range(len(X))]))) + A = np.zeros(2*len(H)+1) + H.append(float('inf')) + ind_leaves = index_leaves(A, len(H)) + return X, H, A, ind_leaves + + +#####STEP 1 : compute Z and Z(g,c_g) +def compute_Z(A,v): + #compute Z by going up the tree from leaf v to the root (Z(g,h) = sum of z_v on the path to the root) + Z = A[v-1] + while True: + if v == 1: + break + v = v//2 + Z += A[v-1] + return Z + +#These two functions help for updating the tree when Z(g,c_g) is computed (it can change a lot in the path to the root) +def degenerate_interval(A, v, ind_leaves): + p = v //2 + mod = v%2 + while True: + if p == 1: + break + if A[p-1] != 0: + add_value(A, p, v, ind_leaves) + A[p-1] = 0 + p = p//2 + mod = p%2 + + + +def add_value(A, p, v, ind_leaves): + L = list() + find_leaves(ind_leaves, p, L) + for l in L: + if l != v: + A[l-1] += A[p-1] + + +def rebalance(A,v, ind_leaves): + if v != 0: + p = v//2 + mod = v%2 + w = 2*p+(1-mod) + if A[v-1] != 0 and A[w-1] !=0: + delta = min(A[v-1], A[w-1]) + A[p-1] += delta + A[v-1] -= delta + A[w-1] -= delta + else: + mini = float('inf') + for i in ind_leaves.values(): + Z = compute_Z(A,i) + if Z < mini: + mini = Z + A[0] = mini + + + + +def step1(ind_cg, A, nb_leaves, ind_leaves, err1, S, H): + #t0 = time.process_time() + mini = float('inf') + h = 0 + c = 1 #not sure of this + for i in range(ind_cg, nb_leaves+1): + v_i = ind_leaves[i] + Z = compute_Z(A,v_i) + + if Z < mini: + mini = Z + ind = i + c = 1 + h = H[i-1] + elif Z == mini: + c+=1 + if c>1: + while compute_Z(A,ind_leaves[ind]) == mini and ind < nb_leaves: + ind+=1 + if ind == nb_leaves: + h = H[ind-1] #value of the leaves that give minimum Z(g,h) + else: + h = H[ind-2] + if len(S) ==0: + h=H[0] + S.append(h) + + + + deg = compute_Z(A,ind_leaves[ind_cg]) - A[ind_leaves[ind_cg]-1] #sum of z_v on the path from c_g to the root, but minus the leaf c_g + + #if the new value of Z(g,c_g) minus deg is greater or equal to 0, then the value in A for leaf c_g is equal to the difference + # however, in the other case, it means that we have to change the path to make it correspond + + + if deg <= mini + err1: + A[ind_leaves[ind_cg]-1] = mini + err1 - deg + else: + A[ind_leaves[ind_cg]-1] = mini + err1 + degenerate_interval(A, ind_leaves[ind_cg], ind_leaves) + #print('Step1', time.process_time() - t0) + + + + + + +#######STEP 2 : update right and left + +#Update right c_g +def v_has_right(v, A): + #indicates whether the node v has a right child branch + if 2*v+1 <= len(A): + return True + else: + return False + +def update_right(v, A, val): + #update right child branch by adding val + A[2*v] += val + +def update_all_right(v, A, err0): + p = v//2 + while True: + if v_has_right(p, A) and 2*p+1 !=v: + update_right(p, A, err0) + + if p == 1: #end when root has been updated + break + v = p + p = p//2 + + + +#Update left c_g +def v_has_left(v, A): + #indicates whether the node v has a left child branch + if 2*v <= len(A): + return True + else: + return False + +def update_left(v, A, val): + #update left child branch by adding val + A[2*v-1] += val + + + +def update_all_left(v, A, err1): + p = v//2 + while True: + if v_has_left(p, A) and 2*p != v: + update_left(p, A, err1) + + if p == 1: #end when root has been updated + break + v = p + p = p//2 + + +def step2(A, v, err0, err1): + #t0 = time.process_time() + #add the error in left and right intervals + update_all_right(v, A, err0) + update_all_left(v, A, err1) + #print('Step2', time.process_time() - t0) + + + + + +########RECURSION + +def recursion(A, H, c_g, ind_leaves, err0, err1, nb_leaves, S): + ind_cg = H.index(c_g) + 1 + v_cg = ind_leaves[ind_cg] + + step1(ind_cg, A, nb_leaves, ind_leaves, err1, S, H) + + step2(A, v_cg, err0, err1) + + + +#######TRACEBACK +def find_h_Z_min(A, ind_leaves): + p = 1 + while True: + v = 2*p + w = 2*p +1 + if A[v-1] == 0: + p = v + else: + p = w + + if is_leaf(ind_leaves,p): + return p + return None + +def search_key(dico, val): + l = [c for c,v in dico.items() if v==val] + if len(l) != 0: + return l[0] + else: + return -1 + + +def find_highest_point(X, hh): + #find the point with highest rows + for x in X: + if x[0][1] == hh: + return x + +def find_index_point(X, xy): + for x in X: + if xy in x: + return X.index(x) + return None + +def traceback(A, X, H, ind_leaves, S, up): + #By going up in the steps, we can determine the breaking point that construct the regression + b = search_key(ind_leaves,find_h_Z_min(A, ind_leaves)) #We look for leaf with minimal Z value as it is the first point + h = H[b-1] + breakpoint = list() + for i in range(len(X)-1, -1, -1): + x = X[i] #ie point by decreasing order of the sorted array + xy, w, lab = x + cg = xy[1] #column + if h == cg:#h is a breaking point + h = S[i] #we take the h from the previous step + breakpoint.append(xy) + + if X[0][2] == int(up) and X[0][0][1] == H[-2]: #To avoid forgetting the first point if it's the highest in column + breakpoint.append(X[0][0]) + + hx = find_highest_point(X, H[-2]) #To avoid forgetting the last point if the highest + id_hx = X.index(hx) + if len(breakpoint)!=0: + id_hbp = find_index_point(X, breakpoint[0]) + if hx[2] == int(up) and id_hx < id_hbp: + breakpoint.append(hx[0]) + + return breakpoint + + +def labels_point(X, bpr, rev, up): + r_p = list() + b_p = list() + + reg_err = 0 + for x in X: + lab = x[2] + x = x[0] + + if up and x in bpr: + r_p.append(x) + if lab == 0: + reg_err +=1 + + elif not up and x in bpr: + b_p.append(x) + if lab == 1: + reg_err +=1 + + else: + if not rev and up: #CASE 1 + flag = 0 + for br in bpr: + if x[0] >= br[0] and x[1] >= br[1]: + flag = 1 + if flag == 0: + b_p.append(x) + if lab == 1: + reg_err +=1 + else: + r_p.append(x) + if lab == 0: + reg_err +=1 + + if rev and up: #CASE 2 + flag = 0 #consider as blue by default + for br in bpr: + if x[0] <= br[0] and x[1] >= br[1]: + flag = 1 + if flag == 0: + b_p.append(x) + if lab == 1: + reg_err +=1 + else: + r_p.append(x) + if lab == 0: + reg_err +=1 + + if not rev and not up: #CASE 3 + flag = 1 #consider as red by default + for br in bpr: + if x[0] >= br[0] and x[1] >= br[1]: + flag = 0 + if flag == 0: + b_p.append(x) + if lab == 1: + reg_err +=1 + else: + r_p.append(x) + if lab == 0: + reg_err +=1 + + if rev and not up: #CASE 4 + flag = 1 #consider as red by default + for br in bpr: + if x[0] <= br[0] and x[1] >= br[1]: + flag =0 + if flag == 0: + b_p.append(x) + if lab == 1: + reg_err +=1 + else: + r_p.append(x) + if lab == 0: + reg_err +=1 + + + return r_p, b_p, reg_err + + + + +#previous functions give us the data labelled as 0 and 1. But if we want +#to predict new points, we must know the official separation. As we prefer +#false positive rather than false negative, we draw the lines closest +#to "blue" points + +def breakpoint_b(X, b_p, rev, up): + bpb = list() + b_ps = sorted(b_p) + if not rev and up: #CASE 1 + while len(b_ps) != 0: + maxi = b_ps[-1] + x, y = maxi + bpb.append(maxi) + b_ps = [pt for pt in b_ps if pt[1] > y] + b_ps = sorted(b_ps) + + + elif rev and up: #CASE 2 + while len(b_ps) != 0: + maxi = b_ps[0] + x, y = maxi + bpb.append(maxi) + b_ps = [pt for pt in b_ps if pt[1] > y] + b_ps = sorted(b_ps) + + elif not rev and not up: #CASE 3 + while len(b_ps) != 0: + maxi = b_ps[0] + x, y = maxi + bpb.append(maxi) + b_ps = [pt for pt in b_ps if pt[0] > x] + b_ps = sorted(b_ps) + + elif rev and not up: #CASE 4 + while len(b_ps) != 0: + maxi = b_ps[-1] + x, y = maxi + bpb.append(maxi) + b_ps = [pt for pt in b_ps if pt[0] < x] + b_ps = sorted(b_ps) + return bpb + + +#Clean the list of border points + +def clean_blue(bpr, rev, up): + bpr = sorted(bpr) + nbpr = list() + + if rev and not up: + for bp in bpr: + itv = bpr[bpr.index(bp)+1:] + flag = True + for it in itv: + if it[1] <= bp[1]: + flag=False + break + if flag: + nbpr.append(bp) + + elif rev and up: + for bp in bpr: + itv = bpr[:bpr.index(bp)] + flag = True + for it in itv: + if it[1] >= bp[1]: + flag=False + break + if flag: + nbpr.append(bp) + + elif not rev and not up: + + for bp in bpr: + itv = bpr[:bpr.index(bp)] + flag = True + for it in itv: + if it[1] <= bp[1]: + flag=False + break + if flag: + nbpr.append(bp) + + elif not rev and up: + + for bp in bpr: + itv = bpr[bpr.index(bp)+1:] + flag = True + for it in itv: + if it[1] >= bp[1]: + flag=False + break + if flag: + nbpr.append(bp) + + assert len(nbpr) <= len(bpr) + return nbpr + + +def clean_red(bpr, rev, up): + bpr = sorted(bpr) + nbpr = list() + + if rev and up: + + for bp in bpr: + itv = bpr[bpr.index(bp)+1:] + flag = True + for it in itv: + if it[1] <= bp[1]: + flag=False + break + if flag: + nbpr.append(bp) + + elif rev and not up: + + for bp in bpr: + itv = bpr[:bpr.index(bp)] + flag = True + for it in itv: + if it[1] >= bp[1]: + flag=False + break + if flag: + nbpr.append(bp) + + elif not rev and up: + + for bp in bpr: + itv = bpr[:bpr.index(bp)] + flag = True + for it in itv: + if it[1] <= bp[1]: + flag=False + break + if flag: + nbpr.append(bp) + + elif not rev and not up: + + for bp in bpr: + itv = bpr[bpr.index(bp)+1:] + flag = True + for it in itv: + if it[1] >= bp[1]: + flag=False + break + if flag: + nbpr.append(bp) + + assert len(nbpr) <= len(bpr) + return nbpr + + + +#####MAIN FUNCTION + +def compute_recursion(data, case = None): + #return X : sorted data + # labels : labelisation of each points + # bpb : points creating the delimitation of blue area + # bpr : points creating the delimitation of red area + + models = {} + if case is None: + + for rev in [True, False]: + for up in [True, False]: + + X, H, A, ind_leaves = initialization(data, rev) + + S = list() + labs = [x[2] for x in X] + nb_leaves = len(H) + + for i in range(len(X)): #((r,c), w, label) + x = X[i] + xy, w, lab = x + cg = xy[1] + err0, err1 = err(lab, w, abs(1-int(up))), err(lab, w, int(up)) + + recursion(A, H, cg, ind_leaves, err0, err1, nb_leaves, S) + + while not is_A_balanced(A): + for v in range(len(A), -1, -1): + rebalance(A,v, ind_leaves) + + if up: + bpr = traceback(A, X, H, ind_leaves, S, up) + r_p, b_p, reg_err = labels_point(X, bpr, rev, up) + + bpb = breakpoint_b(X, b_p, rev, up) + + else: + bpb = traceback(A, X, H, ind_leaves, S, up) + + r_p, b_p, reg_err = labels_point(X, bpb, rev, up) + bpr = breakpoint_b(X, r_p, rev, up) + + bpr = clean_red(bpr, rev, up) + bpb = clean_blue(bpb, rev, up) + + if rev and up: + models[2] = (reg_err, bpr, bpb, r_p, b_p) + elif not rev and up: + models[1] = (reg_err, bpr, bpb, r_p, b_p) + elif not rev and not up: + models[3] = (reg_err, bpr, bpb, r_p, b_p) + else: + models[4] = (reg_err, bpr, bpb, r_p, b_p) + + else: + #print('case {}'.format(case)) + rev, up = case[0], case[1] + X, H, A, ind_leaves = initialization(data, rev) + S = list() + labs = [x[2] for x in X] + nb_leaves = len(H) + #print(X) + for i in range(len(X)): #((r,c), w, label) + x = X[i] + xy, w, lab = x + cg = xy[1] + err0, err1 = err(lab, w, abs(1-int(up))), err(lab, w, int(up)) + + recursion(A, H, cg, ind_leaves, err0, err1, nb_leaves, S) + + while not is_A_balanced(A): + for v in range(len(A), -1, -1): + rebalance(A,v, ind_leaves) + + if up: + bpr = traceback(A, X, H, ind_leaves, S, up) + r_p, b_p, reg_err = labels_point(X, bpr, rev, up) + + bpb = breakpoint_b(X, b_p, rev, up) + + else: + bpb = traceback(A, X, H, ind_leaves, S, up) + r_p, b_p, reg_err = labels_point(X, bpb, rev, up) + bpr = breakpoint_b(X, r_p, rev, up) + + bpr = clean_red(bpr, rev, up) + bpb = clean_blue(bpb, rev, up) + + models[case[2]] = (reg_err, bpr, bpb, r_p, b_p) + + return X, models + + +#### PREDICTION For diff case + +def predict_uncertainty(p, bpr, bpb, rev, up): + flag = -1 + if not rev and up: #CASE 1 + for b in bpr: + if p[0] >= b[0] and p[1] >= b[1]: + flag = 1 + + for b in bpb: + if p[0] <= b[0] and p[1] <= b[1]: + flag = 0 + + + elif rev and up: #CASE 2 + for b in bpr: + if p[0] <= b[0] and p[1] >= b[1]: + flag = 1 + + for b in bpb: + if p[0] >= b[0] and p[1] <= b[1]: + flag = 0 + + elif not rev and not up: #CASE 3 + for b in bpr: + if p[0] <= b[0] and p[1] <= b[1]: + flag = 1 + + for b in bpb: + if p[0] >= b[0] and p[1] >= b[1]: + flag = 0 + + + elif rev and not up: #CASE 4 + for b in bpr: + if p[0] >= b[0] and p[1] <= b[1]: + flag = 1 + + for b in bpb: + if p[0] <= b[0] and p[1] >= b[1]: + flag = 0 + assert flag in [1, 0, -1], "Problem with prediction of the point, label is not 0, 1 or -1" + + return flag + + + +def predict_severe(p, bpr, bpb, rev, up): + # points in grey area are automatically labelled in red area + flag = predict_uncertainty(p, bpr, bpb, rev, up) + if flag == -1: + flag = 1 + + assert flag in [1, 0], "Problem with prediction of the point, label is not 0 or 1" + + + return flag + + +def predict_non_severe(p, bpr, bpb, rev, up): + # points in grey area are automatically labelled in blue area + flag = predict_uncertainty(p, bpr, bpb, rev, up) + if flag == -1: + flag = 0 + + assert flag in [1, 0], "Problem with prediction of the point, label is not 0 or 1" + + return flag + + + +#def predict_severe(p, bpr, bpb, rev, up): + # points in grey area are automatically labelled in red area +# flag = 1 +# if not rev and up: #CASE 1 +# for b in bpb: +# if p[0] <= b[0] and p[1] <= b[1]: +# flag = 0 + + +# elif rev and up: #CASE 2 +# for b in bpb: +# if p[0] >= b[0] and p[1] <= b[1]: +# flag = 0 + +# elif not rev and not up: #CASE 3 +# for b in bpb: +# if p[0] >= b[0] and p[1] >= b[1]: +# flag = 0 + + +# elif rev and not up: #CASE 4 +# for b in bpb: +# if p[0] <= b[0] and p[1] >= b[1]: +# flag = 0 +# return flag + + +#def predict_non_severe(p, bpr, bpb, rev, up): + # points in grey area are automatically labelled in blue area +# flag = 0 +# if not rev and up: #CASE 1 +# for b in bpr: +# if p[0] >= b[0] and p[1] >= b[1]: +# flag = 1 + + +# elif rev and up: #CASE 2 +# for b in bpr: +# if p[0] <= b[0] and p[1] >= b[1]: +# flag = 1 + +# elif not rev and not up: #CASE 3 +# for b in bpr: +# if p[0] <= b[0] and p[1] <= b[1]: +# flag = 1 + +# elif rev and not up: #CASE 4 +# for b in bpr: +# if p[0] >= b[0] and p[1] <= b[1]: +# flag = 1 + +# return flag diff --git a/Module/optimal_k_aggregations.py b/Module/optimal_k_aggregations.py new file mode 100755 index 0000000..fe0c450 --- /dev/null +++ b/Module/optimal_k_aggregations.py @@ -0,0 +1,151 @@ +from Module import cost_matrix_uncertainty as cmu +from Module import monotonic_regression_uncertainty as mru +from Module import selection_algorithm as sa +from Module import tools + + + +import time +import pandas as pd +import multiprocessing as mp +import copy +import numpy as np +import matplotlib.pyplot as plt + + + +def find_k_metamodel(df, ndf, cost, k, nbcpus, strat): + l = list() + mini = 1 + for s in strat: + p, mve = s(df, ndf, cost, k, nbcpus) + if mve<mini: + mini = mve + l.append((mve, p, s.__name__)) + potential = [L for L in l if L[0] == mini] + potential.sort(key=lambda x:x[2], reverse = True) + return potential[0] + + +#Functions that given some classifiers, construct the associated ensemble model and predict the output for a single patient + +def prediction_pairs(df, out, pair, funct): + p1, p2, key = pair.split('/') + key = int(key) + rev, up = tools.equiv_key_case(key) + + tr1, tr2 = df[p1].values.tolist(), df[p2].values.tolist() + diag = df['target'].values.tolist() + + data = [((tr1[n], tr2[n] ), 1, diag[n]) for n in range(len(diag))] + out_p = (out[p1], out[p2]) + + X, models = mru.compute_recursion(data, (rev, up, key)) + reg_err, bpr, bpb, r_p, b_p = models[key] + pred = funct(out_p, bpr, bpb, rev, up) # + return pred + + +def create_and_predict_metamodel(df_, out, pairs, nbcpus, funct): + #Return the majority vote prediction (pred_metamodel) and the probability of the being severe (nb of severe/total nb) + pool = mp.Pool(nbcpus) + df = copy.deepcopy(df_) + + vals = [(df, out, p, funct) for p in pairs] + + preds = pool.starmap(prediction_pairs, vals, max(1,len(vals)//nbcpus)) #Get all the predictions made by the different pairs for a single patient + + del df + return tools.pred_metamodel(preds), tools.proba_metamodel(preds) + + + +##Big loop to compute the average error for ensemble contaning k classifiers + + +def k_missclassification(df, cls, nbcpus, funct, strat, min_k, max_k, log): + print('k misclassification : {}\n'.format(funct)) + + k_mis = {k : list() for k in range(3, max_k)} #Store for each value of k, whereas patients were misclassified or not with an ensemble of k classifiers + + #pairs_err = {cl : list() for cl in cls} #For each classifiers we are going to store the average misclassification error (computed with LOOCV) made with each patients + + + for j in range(len(df)): + t1 = time.time() + f = open(log, 'a') + f.write('Patient {} \n'.format(j)) + f.close() + out = df.iloc[j, :] + df_2 = df.drop([j]) + df_2.reset_index(drop=True, inplace=True) + + ndf_err = cmu.error_matrix(df_2, cls, nbcpus,funct) + + + f = open(log, 'a') + f.write('cost matrix computed \n') + f.close() + + + cost = cmu.cost_classifiers(ndf_err) + + + if min_k == 1: + #k = 1 : As a first pair, we take one with the lowest error + temp = min(cost.values()) + res = [key for key in cost.keys() if cost[key] == temp] #Many classifiers can have the lowest error + pair = [res[0]] #We take one arbitrary + + + pred, proba = create_and_predict_metamodel(df_2, out, pair, nbcpus, funct) + if proba != -1: + k_mis[1].append(abs(out['target']-pred)) + else: #case of proba = -1 means that all the classifiers in the metamodel predicted the point as uncertain + print('case of unknown point in oka') + + min_k +=1 + + #k > 1: ensemble classifiers + for k in range(min_k, max_k): + t0 = time.time() + mve, pairs, algo = find_k_metamodel(df_2, ndf_err, cost, k, nbcpus, strat) + pred, proba = create_and_predict_metamodel(df_2, out, pairs, nbcpus, funct) + + if proba != -1: + k_mis[k].append(abs(out['target']-pred)) + else: #case of proba = -1 means that all the classifiers in the metamodel predicted the point as uncertain + print('case of unknown point in oka') + + f = open(log, 'a') + f.write('Creation metamodel for k = {} in {}s \n'.format(k, time.time()-t0)) + f.close() + + f = open(log, 'a') + f.write('End patient in {}s \n'.format(time.time() - t1)) + f.close() + + + k_error = {k : np.mean(k_mis[k]) for k in range(min_k, max_k)} + + return k_error + + + +def optimal_k(k_error): + mini = min(k_error.values()) + keys = [k for k in k_error.keys() if k_error[k] == mini] + return min(keys), mini + + +def print_k_error(k_error, file): + x, y = k_error.keys(), k_error.values() + plt.figure() + plt.plot(x,y) + plt.title('Average error for ensembles of classifiers') + plt.xlabel('Nb of classifiers') + plt.ylabel('Average error') + if file: + plt.savefig(file) + else: + plt.show() diff --git a/Module/preselection.py b/Module/preselection.py new file mode 100644 index 0000000..caffa4d --- /dev/null +++ b/Module/preselection.py @@ -0,0 +1,59 @@ +from Module import cost_matrix_uncertainty as cmu +from Module import optimal_k_aggregations as oka +from Module import monotonic_regression_uncertainty as mru +from Module import tools +from Module import selection_algorithm as sa + +import multiprocessing as mp + +import pandas as pd +import matplotlib.pyplot as plt +import os + + +def all_configurations(df): + transcripts = list(df.columns) + transcripts.remove('target') + + configurations = list() + for i in range(len(transcripts)): + for j in range(i+1, len(transcripts)): + for key in range(1,5): + configurations.append('/'.join([transcripts[i], transcripts[j], str(key)])) + return configurations + + +def single_score(cl, df): + p1, p2, key = cl.split('/') + key = int(key) + rev, up = tools.equiv_key_case(key) + + diag = df['target'].to_list() + tr1, tr2 = df[p1].to_list(), df[p2].to_list() + data = [((tr1[i], tr2[i]), 1, diag[i]) for i in range(len(diag))] + + + X, m = mru.compute_recursion(data, (rev, up, key)) + reg_err, bpr, bpb, r_p, b_p = m[key] + + return (cl, reg_err) + +def regression_error_score(df, cls, nbcpus): + pool = mp.Pool(nbcpus) + + vals = [(cl, df) for cl in cls] + res = pool.starmap(single_score, vals, max(1, len(vals)//nbcpus)) + + dico = {r[0] : r[1] for r in res} + s = pd.Series(dico) + s.name = 'regression error' + return s + +def regression_error_matrix(df, nbcpus): + config = all_configurations(df) + reg = regression_error_score(df, config, nbcpus) + return reg + + +def preselection_reg_err(reg_err_mat, threshold): + return reg_err_mat[reg_err_mat<threshold] diff --git a/Module/selection_algorithm.py b/Module/selection_algorithm.py new file mode 100755 index 0000000..8471605 --- /dev/null +++ b/Module/selection_algorithm.py @@ -0,0 +1,161 @@ +from Module import cost_matrix_uncertainty as cmu +from Module import measures as ms + +import copy +import multiprocessing as mp +import time + + +#Filter the matrix: eliminate redundant transcripts + +def filter_pairs_greedy(pairs): + used_trans = list() + delete_col = list() + for i in range(len(pairs)): + p1, p2, key = pairs[i].split("/") + if p1 in used_trans or p2 in used_trans: + delete_col.append(pairs[i]) + else: + used_trans.append(p1) + used_trans.append(p2) + for x in delete_col: + pairs.remove(x) + return pairs + + + +def filter_pairs_adapt(pairs, cl): + delete_pairs = list() + idx = pairs.index(cl) + for i in range(idx, len(pairs)): + p1, p2, key = pairs[i].split("/") + if p1 in cl or p2 in cl: + delete_pairs.append(pairs[i]) + for x in delete_pairs: + pairs.remove(x) + return pairs + + +#########N-best + + + +def NB(df, ndf_, cost, k, nbcpus, mes = ms.MVE): + + ndf = copy.deepcopy(ndf_) + ndf.drop(['uncertain', 'error'], inplace=True) + + pairs = sorted(cost.items(), key=lambda t: t[1]) + pairs = [pairs[i][0] for i in range(len(pairs))] + pairs = filter_pairs_greedy(pairs) + pairs = pairs[0:k] + + set = [ndf[p].values.tolist() for p in pairs] + + return pairs, ms.MVE(set) + + +##### Forward search + + +def test_candidate_FS(cand_pairs, cls, ndf, mes, i): + cp = cand_pairs[i] + + candidate_set_pairs = [ndf[cl].values.tolist() for cl in cls] + candidate_set_pairs.append(ndf[cp].values.tolist()) + cp_ms = mes(candidate_set_pairs) + + return (i, cp, cp_ms) + + + +def FS(df, ndf_, cost, k, nbcpus, mes = ms.MVE, jump = 30): + pool = mp.Pool(nbcpus) + + ndf = copy.deepcopy(ndf_) + ndf.drop(['uncertain', 'error'], inplace=True) + + temp = min(cost.values()) + res = [key for key in cost.keys() if cost[key] == temp] #Many classifiers can have the lowest error + cl = res[0] #We take one arbitrary + cls = [cl] #We start with an ensemble of k=1 classifiers + + pairs = sorted(cost.items(), key=lambda t: t[1]) + pairs = [pairs[i][0] for i in range(len(pairs))] + + ind = 1 + tot_ind = ind + + while len(cls) < k: #We add classifiers until we reach k + #Condition if we reach the end of the list of classifiers, we start again from the begining by eliminating the already used cls + if tot_ind + jump > len(pairs): + pairs = [pairs[p] for p in range(len(pairs)) if pairs[p] not in cls] + ind = 1 + tot_ind = ind + + cand_pairs = pairs[ind:ind+jump] + + vals = [(cand_pairs, cls, ndf, mes, i) for i in range(len(cand_pairs))] + + res = pool.starmap(test_candidate_FS, vals, max(1,len(vals)//nbcpus)) + res.sort(key=lambda x:x[2]) + + i, cp, cp_ms = res[0] + best_cp_ms = cp_ms + best_cand = cp + ind = tot_ind + i +1 + tot_ind = ind + + + cls.append(best_cand) + + pairs = filter_pairs_adapt(pairs, best_cand) + + + set = [ndf[p].values.tolist() for p in cls] + + return cls, ms.MVE(set) + + +#### Backward Search + + +def test_candidate_BS(cand_pairs, cls, ndf, mes, i): + cp = cand_pairs[i] + + candidate_set_pairs = [ndf[cl].values.tolist() for cl in cls if cl != cp] + + cp_ms = mes(candidate_set_pairs) + + return (i, cp, cp_ms) + + +def BS(df, ndf_, cost, k, nbcpus, mes = ms.F2, end = 30): + + pool = mp.Pool(nbcpus) + ndf = copy.deepcopy(ndf_) + ndf.drop(['uncertain', 'error'], inplace=True) + + + pairs = sorted(cost.items(), key=lambda t: t[1]) + pairs = [pairs[i][0] for i in range(len(pairs))] + pairs = filter_pairs_greedy(pairs) + cls = pairs[:end] + + while len(cls) > k: + + cand_pairs = cls.copy() + + vals = [(cand_pairs, cls, ndf, mes, i) for i in range(len(cand_pairs))] + + res = pool.starmap(test_candidate_BS, vals, max(1,len(vals)//nbcpus)) + + res.sort(key=lambda x:x[2]) + + i, cp, cp_ms = res[0] + cls.remove(cp) + + + set = [ndf[p].values.tolist() for p in cls] + + return cls, ms.MVE(set) diff --git a/Module/show_results_4cases.py b/Module/show_results_4cases.py new file mode 100755 index 0000000..f83fc86 --- /dev/null +++ b/Module/show_results_4cases.py @@ -0,0 +1,498 @@ +from Module import monotonic_regression_uncertainty as mru +from Module import tools + +import multiprocessing as mp + +import matplotlib.pyplot as plt +from matplotlib import patches +import colorsys +import random + +from math import log + + + + +def cr_models(p, df): + p1, p2, key = p.split('/') + key = int(key) + rev, up = tools.equiv_key_case(key) + tr1 = df[p1].values.tolist() + tr2 = df[p2].values.tolist() + diag = df['target'].values.tolist() + data = [((tr1[n], tr2[n] ), 1, diag[n]) for n in range(len(diag))] + + X, models = mru.compute_recursion(data, (rev, up, key)) + + return p1, p2, models, data + + +def print_model(data, models, p1, p2, df1, pathname = None, cm=None): + #print the monotonic space with the 3 areas + + if '.1.1' in p1: + p1 = p1[:-2] + if '.1.1' in p2: + p2 = p2[:-2] + + try: + g1 = df1[df1['Probeset_ID'] == p1]['Gene.Symbol'].values.tolist()[0] + except: + g1 = p1 + try: + g2 = df1[df1['Probeset_ID'] == p2]['Gene.Symbol'].values.tolist()[0] + except: + g2 = p2 + + for key in models.keys(): + key = int(key) + #print('Key', key) + plt.figure(figsize=(3,3)) + ax = plt.axes() + ax.set_facecolor("lightgray") + + x_r = list() + y_r = list() + x_b = list() + y_b = list() + for i in range(len(data)): + xy, w, lab = data[i] + x, y = xy + if lab == 0: #blue + x_r.append(x) + y_r.append(y) + else: #red + x_b.append(x) + y_b.append(y) + + reg_err, bpr, bpb, r_p, b_p = models[key] + + + min_x = min(min(x_r), min(x_b))-0.05 + min_y = min(min(y_r), min(y_b))-0.05 + max_x = max(max(x_r), max(x_b))+0.05 + max_y = max(max(y_r), max(y_b))+0.05 + + for bp in bpb: + x, y = bp + if key == 1: + ax.add_artist(patches.Rectangle((min_x, min_y), abs(x-min_x), abs(y-min_y), facecolor = 'lightskyblue', zorder = 1)) + elif key == 2: + ax.add_artist(patches.Rectangle((x, min_y), max_x+abs(x), abs(y-min_y), facecolor = 'lightskyblue', zorder = 1)) + elif key == 3: + ax.add_artist(patches.Rectangle((x, y), max_x+abs(x), max_y+abs(y), facecolor = 'lightskyblue', zorder = 1)) + else: + ax.add_artist(patches.Rectangle((min_x, y ), abs(x-min_x), max_y+abs(y), facecolor = 'lightskyblue', zorder = 1)) + + + for bp in bpr: + x, y = bp + + + if key == 1: + ax.add_artist(patches.Rectangle((x, y), max_x+abs(x), max_y+abs(y), facecolor ='lightcoral', zorder = 1)) + elif key == 2: + ax.add_artist(patches.Rectangle((min_x, y ), abs(x-min_x), max_y+abs(y), facecolor = 'lightcoral', zorder = 1)) + elif key == 3: + ax.add_artist(patches.Rectangle((min_x, min_y), abs(x-min_x), abs(y-min_y), facecolor = 'lightcoral', zorder = 1)) + else: + ax.add_artist(patches.Rectangle((x, min_y), max_x+abs(x), abs(y-min_y), facecolor = 'lightcoral', zorder = 1)) + + + #plt.scatter(x_r, y_r, c = 'blue', marker='.', zorder = 2) + #plt.scatter(x_b, y_b, c = 'red', marker='.', zorder = 2) + + random.shuffle(data) + + for d in data: + if d[2] == 0: + plt.scatter(d[0][0], d[0][1], c = 'blue', marker='.', zorder = 2) + elif d[2] == 1: + plt.scatter(d[0][0], d[0][1], c = 'red', marker='.', zorder = 2) + plt.xlabel(g1) + plt.ylabel(g2) + + if cm is not None: + pair = '/'.join([p1, p2, str(key)]) + error = cm.at['error', pair] + plt.title('LOOCV Error {}'.format(error)) + + if pathname is not None: + plt.savefig(pathname + g1 + '_' + g2 + '.png') + + f = open(pathname + 'gene.txt', 'a') + f.write('{} : {}\n'.format(g1, p1)) + f.write('{} : {}\n'.format(g2, p2)) + f.close() + else: + plt.show() + + + +def print_model_log(data, models, p1, p2, df1, pathname = None): + #print the monotonic space with the 3 areas + + data = [((log(d[0][0]), log([0][1])), d[1], d[2]) for d in data] + + if '.1.1' in p1: + p1 = p1[:-2] + if '.1.1' in p2: + p2 = p2[:-2] + + try: + g1 = df1[df1['Probeset_ID'] == p1]['Gene.Symbol'].values.tolist()[0] + except: + g1 = p1 + try: + g2 = df1[df1['Probeset_ID'] == p2]['Gene.Symbol'].values.tolist()[0] + except: + g2 = p2 + + for key in models.keys(): + key = int(key) + #print('Key', key) + plt.figure(figsize=(3,3)) + ax = plt.axes() + ax.set_facecolor("lightgray") + + x_r = list() + y_r = list() + x_b = list() + y_b = list() + for i in range(len(data)): + xy, w, lab = data[i] + x, y = xy + if lab == 0: #blue + x_r.append(x) + y_r.append(y) + else: #red + x_b.append(x) + y_b.append(y) + + reg_err, bpr, bpb, r_p, b_p = models[key] + + for bp in bpb: + x, y = bp + if key == 1: + ax.add_artist(patches.Rectangle((0.0, 0.0), x, y, facecolor = 'lightskyblue', zorder = 1)) + elif key == 2: + ax.add_artist(patches.Rectangle((x, 0), 1000, y, facecolor = 'lightskyblue', zorder = 1)) + elif key == 3: + ax.add_artist(patches.Rectangle((x, y), 1000, 1000, facecolor = 'lightskyblue', zorder = 1)) + else: + ax.add_artist(patches.Rectangle((0, y ), x, 1000, facecolor = 'lightskyblue', zorder = 1)) + + + for bp in bpr: + x, y = bp + + + if key == 1: + ax.add_artist(patches.Rectangle((x, y), 1000, 1000, facecolor ='lightcoral', zorder = 1)) + elif key == 2: + ax.add_artist(patches.Rectangle((0, y ), x, 1000, facecolor = 'lightcoral', zorder = 1)) + elif key == 3: + ax.add_artist(patches.Rectangle((0.0, 0.0), x, y, facecolor = 'lightcoral', zorder = 1)) + else: + ax.add_artist(patches.Rectangle((x, 0), 1000, y, facecolor = 'lightcoral', zorder = 1)) + + + #plt.scatter(x_r, y_r, c = 'blue', marker='.', zorder = 2) + #plt.scatter(x_b, y_b, c = 'red', marker='.', zorder = 2) + + random.shuffle(data) + + for d in data: + if d[2] == 0: + plt.scatter(d[0][0], d[0][1], c = 'blue', marker='.', zorder = 2) + elif d[2] == 1: + plt.scatter(d[0][0], d[0][1], c = 'red', marker='.', zorder = 2) + plt.xlabel(g1) + plt.ylabel(g2) + + if pathname is not None: + plt.savefig(pathname + g1 + '_' + g2 + '.png') + + f = open(pathname + 'gene.txt', 'a') + f.write('{} : {}\n'.format(g1, p1)) + f.write('{} : {}\n'.format(g2, p2)) + f.close() + else: + plt.show() + + + +def print_model_out(data, out, models, p1, p2, df1, pathname = None): + #print the monotonic space with the 3 areas + + if '.1.1' in p1: + p1 = p1[:-2] + if '.1.1' in p2: + p2 = p2[:-2] + + try: + g1 = df1[df1['Probeset_ID'] == p1]['Gene.Symbol'].values.tolist()[0] + except: + g1 = p1 + try: + g2 = df1[df1['Probeset_ID'] == p2]['Gene.Symbol'].values.tolist()[0] + except: + g2 = p2 + + for key in models.keys(): + key = int(key) + print('Key', key) + plt.figure(figsize=(5,5)) + ax = plt.axes() + ax.set_facecolor("lightgray") + + x_r = list() + y_r = list() + x_b = list() + y_b = list() + for i in range(len(data)): + xy, w, lab = data[i] + x, y = xy + if lab == 0: #blue + x_r.append(x) + y_r.append(y) + else: #red + x_b.append(x) + y_b.append(y) + + reg_err, bpr, bpb, r_p, b_p = models[key] + + for bp in bpb: + x, y = bp + if key == 1: + ax.add_artist(patches.Rectangle((0.0, 0.0), x, y, facecolor = 'lightskyblue', zorder = 1)) + elif key == 2: + ax.add_artist(patches.Rectangle((x, 0), 1000, y, facecolor = 'lightskyblue', zorder = 1)) + elif key == 3: + ax.add_artist(patches.Rectangle((x, y), 1000, 1000, facecolor = 'lightskyblue', zorder = 1)) + else: + ax.add_artist(patches.Rectangle((0, y ), x, 1000, facecolor = 'lightskyblue', zorder = 1)) + + + for bp in bpr: + x, y = bp + + + if key == 1: + ax.add_artist(patches.Rectangle((x, y), 1000, 1000, facecolor ='lightcoral', zorder = 1)) + elif key == 2: + ax.add_artist(patches.Rectangle((0, y ), x, 1000, facecolor = 'lightcoral', zorder = 1)) + elif key == 3: + ax.add_artist(patches.Rectangle((0.0, 0.0), x, y, facecolor = 'lightcoral', zorder = 1)) + else: + ax.add_artist(patches.Rectangle((x, 0), 1000, y, facecolor = 'lightcoral', zorder = 1)) + + + #plt.scatter(x_r, y_r, c = 'blue', zorder = 2) + #plt.scatter(x_b, y_b, c = 'red', zorder = 2) + + random.shuffle(data) + + for d in data: + if d[2] == 0: + plt.scatter(d[0][0], d[0][1], c = 'blue', marker='.', zorder = 2) + elif d[2] == 1: + plt.scatter(d[0][0], d[0][1], c = 'red', marker='.', zorder = 2) + plt.scatter(out[0], out[1], c = 'g', zorder = 2) + plt.xlabel(g1) + plt.ylabel(g2) + + if pathname is not None: + plt.savefig(pathname + g1 + '_' + g2 + '.png') + + f = open(pathname + 'gene.txt', 'a') + f.write('{} : {}\n'.format(g1, p1)) + f.write('{} : {}\n'.format(g2, p2)) + f.close() + else: + plt.show() + + + +def rank_h(x, D, rev): + h = [d[0] for d in D] + h = sorted(h, reverse=rev) + r = h.index(x) + + if rev: + return len(D) - r + 1 + else: + return r+1 + +def rank_v(x, D, up): + h = [d[1] for d in D] + h.sort() + r = h.index(x) + #if up: + return r+1 + #else: + # return len(D) - r + 1 + + + + + + + +def print_model_RS(data, models, p1, p2, df1, pathname = None, cm=None): + D_hat = [x[0] for x in data] + + + plt.figure(figsize=(3,3)) + ax = plt.axes() + ax.set_facecolor("lightgray") + plt.title('Ranking Space') + plt.xlabel(p1) + plt.ylabel(p2) + + for key in models.keys(): + key = int(key) + + rev, up = tools.equiv_key_case(key) + + reg, bpr, bpb, rps, bps = models[key] + + + + for bp in bpb: + x, y = bp + rxd = rank_h(x, D_hat, rev) + ryd = rank_v(y, D_hat, up) + + if key == 1: + ax.add_artist(patches.Rectangle((0.0, 0.0), rxd, ryd, facecolor = 'lightskyblue', zorder = 1)) + elif key == 2: + ax.add_artist(patches.Rectangle((rxd, 0), 1000, ryd, facecolor = 'lightskyblue', zorder = 1)) + elif key == 3: + ax.add_artist(patches.Rectangle((rxd, ryd), 1000, 1000, facecolor = 'lightskyblue', zorder = 1)) + else: + ax.add_artist(patches.Rectangle((0, ryd ), rxd, 1000, facecolor = 'lightskyblue', zorder = 1)) + + + for bp in bpr: + x, y = bp + rxd = rank_h(x, D_hat, rev) + ryd = rank_v(y, D_hat, up) + + if key == 1: + ax.add_artist(patches.Rectangle((rxd, ryd), 1000, 1000, facecolor ='lightcoral', zorder = 1)) + elif key == 2: + ax.add_artist(patches.Rectangle((0, ryd ), rxd, 1000, facecolor = 'lightcoral', zorder = 1)) + elif key == 3: + ax.add_artist(patches.Rectangle((0.0, 0.0), rxd, ryd, facecolor = 'lightcoral', zorder = 1)) + else: + ax.add_artist(patches.Rectangle((rxd, 0), 1000, ryd, facecolor = 'lightcoral', zorder = 1)) + + random.shuffle(data) + for d in data: + rxd = rank_h(d[0][0], D_hat, rev) + ryd = rank_v(d[0][1], D_hat, up) + if d[2] == 1: + plt.scatter(rxd, ryd, c='red', marker='.', zorder=2) + elif d[2] == 0: + plt.scatter(rxd, ryd, c='blue', marker='.', zorder=2) + + plt.show() + +def print_severe(data, models, p1, p2, df1, pathname = None): + #print the monotonic space with the 3 areas + + if '.1.1' in p1: + p1 = p1[:-2] + if '.1.1' in p2: + p2 = p2[:-2] + + try: + g1 = df1[df1['Probeset_ID'] == p1]['Gene.Symbol'].values.tolist()[0] + except: + g1 = p1 + try: + g2 = df1[df1['Probeset_ID'] == p2]['Gene.Symbol'].values.tolist()[0] + except: + g2 = p2 + + for key in models.keys(): + key = int(key) + print('Key', key) + plt.figure(figsize=(5,5)) + ax = plt.axes() + ax.set_facecolor("lightcoral") + + x_r = list() + y_r = list() + x_b = list() + y_b = list() + for i in range(len(data)): + xy, w, lab = data[i] + x, y = xy + if lab == 0: #blue + x_r.append(x) + y_r.append(y) + else: #red + x_b.append(x) + y_b.append(y) + + reg_err, bpr, bpb, r_p, b_p = models[key] + + for bp in bpb: + x, y = bp + if key == 1: + ax.add_artist(patches.Rectangle((0.0, 0.0), x, y, facecolor = 'lightskyblue', zorder = 1)) + elif key == 2: + ax.add_artist(patches.Rectangle((x, 0), 1000, y, facecolor = 'lightskyblue', zorder = 1)) + elif key == 3: + ax.add_artist(patches.Rectangle((x, y), 1000, 1000, facecolor = 'lightskyblue', zorder = 1)) + else: + ax.add_artist(patches.Rectangle((0, y ), x, 1000, facecolor = 'lightskyblue', zorder = 1)) + + + #for bp in bpr: + # x, y = bp + + + # if key == 1: + # ax.add_artist(patches.Rectangle((x, y), 1000, 1000, facecolor ='lightcoral', zorder = 1)) + # elif key == 2: + # ax.add_artist(patches.Rectangle((0, y ), x, 1000, facecolor = 'lightcoral', zorder = 1)) + # elif key == 3: + # ax.add_artist(patches.Rectangle((0.0, 0.0), x, y, facecolor = 'lightcoral', zorder = 1)) + # else: + # ax.add_artist(patches.Rectangle((x, 0), 1000, y, facecolor = 'lightcoral', zorder = 1)) + + + random.shuffle(data) + + for d in data: + if d[2] == 0: + plt.scatter(d[0][0], d[0][1], c = 'blue', marker='.', zorder = 2) + elif d[2] == 1: + plt.scatter(d[0][0], d[0][1], c = 'red', marker='.', zorder = 2) + plt.xlabel(g1) + plt.ylabel(g2) + + if pathname is not None: + plt.savefig(pathname + g1 + '_' + g2 + '.png') + + f = open(pathname + 'gene.txt', 'a') + f.write('{} : {}\n'.format(g1, p1)) + f.write('{} : {}\n'.format(g2, p2)) + f.close() + else: + plt.show() + + + +def show_results(df, probs_df, pairs, nbcpus, pathname, cm): + pool = mp.Pool(nbcpus) + vals = [(p, df) for p in pairs] + + res = pool.starmap(cr_models, vals, max(1,len(vals)//nbcpus) ) + + for r in res: + p1, p2, models, data = r + print_model(data, models, p1, p2, probs_df, pathname, cm) diff --git a/Module/stages.py b/Module/stages.py new file mode 100755 index 0000000..24ab16b --- /dev/null +++ b/Module/stages.py @@ -0,0 +1,82 @@ +from Module import cost_matrix_uncertainty as cmu +from Module import optimal_k_aggregations as oka +from Module import monotonic_regression_uncertainty as mru +from Module import tools +from Module import selection_algorithm as sa +from Module import preselection as psl + +import pandas as pd +import matplotlib.pyplot as plt +import os + + +from sklearn.metrics import roc_auc_score, confusion_matrix, matthews_corrcoef + + +def stage0(df, nbcpus, threshold): + reg = psl.regression_error_matrix(df, nbcpus) + if threshold is not None: + reg = psl.preselection_reg_err(reg, threshold) + return reg + + + + +def stage_1(df, cls, min_k, max_k, nbcpus, strat, funct, log): + k_error = oka.k_missclassification(df, cls, nbcpus, funct, strat, min_k, max_k, log) + k_opt, err_k = oka.optimal_k(k_error) + return k_opt, k_error + + + +def stage_2(df, cls, k_opt, auc_file, conf_mat_file, nbcpus, funct, strat, logs): + errors, y_true, y_pred, y_proba = list(), list(), list(), list() + + for i in range(len(df)): + out = df.iloc[i, :] + df_2 = df.drop([i]) + df_2.reset_index(drop=True, inplace=True) + f = open(logs, 'a') + f.write('Patient {} \n'.format(i)) + f.close() + + ndf_err = cmu.error_matrix(df_2, cls, nbcpus,funct) + cost = cmu.cost_classifiers(ndf_err) + + f = open(logs, 'a') + f.write('Matrix computed \n') + f.close() + + mve, pairs, algo = oka.find_k_metamodel(df_2, ndf_err, cost, k_opt, nbcpus, strat) + pred, proba = oka.create_and_predict_metamodel(df_2, out, pairs, nbcpus, funct) + + f = open(logs, 'a') + f.write('Pred={}, Proba={} \n'.format(pred, proba)) + f.close() + + errors.append(abs(out['target']-pred)) + y_proba.append(proba) + y_true.append(out['target']) + y_pred.append(pred) + + + acc = errors.count(0)/len(errors) + auc = tools.auc_score(y_proba, y_true, auc_file) + auc2 = roc_auc_score(y_true, y_proba) + CI = tools.confidence_interval(auc, y_true) + conf_mat = confusion_matrix(y_true, y_pred) + mcc = matthews_corrcoef(y_true, y_pred) + + f = open(logs, 'a') + f.write('acc={}, auc={}, CI = {}, aucsk = {}, confusion_matrix = {}, mcc = {} \n'.format(acc, auc, CI, auc2, conf_mat, mcc)) + f.close() + + labels, probas, uncertain_pts = tools.unclassified_points(y_true, y_proba) + return acc, auc, CI, conf_mat + +def stage_3(df, cls, k_opt, nbcpus, funct, strat): + ndf_err = cmu.error_matrix(df, cls, nbcpus,funct) + ndf_err.to_csv('cm_st3.csv') + cost = cmu.cost_classifiers(ndf_err) + mve, pairs, algo = oka.find_k_metamodel(df, ndf_err, cost, k_opt, nbcpus, strat) + return pairs, mve diff --git a/Module/tools.py b/Module/tools.py new file mode 100755 index 0000000..273b80d --- /dev/null +++ b/Module/tools.py @@ -0,0 +1,186 @@ +import numpy as np +import matplotlib.pyplot as plt +from copy import deepcopy +import seaborn as sn + + +def equiv_key_case(i): + equiv = {1 : (False, True), 2: (True, True), 3:(False, False), 4:(True, False)} + return equiv[i] + + + + +def equiv_case_key(rev): + equiv = {(False, True):1, (True, True):2, (False, False):3, (True, False):4} + return equiv[rev] + + +#PREDICTION FROM A METAMODEL +def pred_metamodel(preds): + #preds is an array with all the predicted labels from the classifiers belongig to the meta model + a = preds.count(1) + b = preds.count(0) + c = preds.count(-1) + assert a + b +c == len(preds), "Problem in the error predictions for a patient" + if c == len(preds): #In the case where all the predictions are equal to -1, we predict the patient as 1 + return 1 + if a < b:# If less 1 than 0, predict as 0 + return 0 + else: #If more or same nb of 1 as nb of 0, predict as 1 + return 1 + + +# Prediction probability of being severe +def proba_metamodel(preds): + #preds is an array with all the predicted labels from the classifiers belongig to the meta model + a = preds.count(1) + b = preds.count(0) + c = preds.count(-1) + assert a + b +c == len(preds), "Problem in the probabilities for a patient" + if a+b != 0: + return a/(a+b) + else: + return -1 + + +def get_index_positions(list_of_elems, element): + index_pos_list = [] + index_pos = 0 + while True: + try: + index_pos = list_of_elems.index(element, index_pos) + # Add the index position in list + index_pos_list.append(index_pos) + index_pos += 1 + except ValueError as e: + break + return index_pos_list + +def unclassified_points(labels, probas): + #print('probas {}'.format(probas)) + un_pts = get_index_positions(probas, -1) + #print('unclassified_points {}'.format(un_pts)) + new_labels = deepcopy(labels) + new_probas = deepcopy(probas) + for i in range(len(probas)): + if i not in un_pts: + new_labels.append(labels[i]) + new_probas.append(probas[i]) + return new_labels, new_probas, un_pts + + + + + +####AUC score +def perf_metrics(y_actual, y_hat,threshold): + tp = 0 + fp = 0 + tn = 0 + fn = 0 + + for i in range(len(y_hat)): + if(y_hat[i] >= threshold): + if(y_actual[i] == 1): + tp += 1 + else: + fp += 1 + elif(y_hat[i] < threshold): + if(y_actual[i] == 0): + tn += 1 + else: + fn += 1 + tpr = tp/(tp+fn) + fpr = fp/(tn+fp) + + return [fpr,tpr] + + + + +def auc_score(probas, labels, auc_file=None): + thresholds = np.arange(0.0, 1.01, 0.001) + + roc_points = [] + for threshold in thresholds: + rates = perf_metrics(labels, probas, threshold) + roc_points.append(rates) + + fpr_array = [] + tpr_array = [] + for i in range(len(roc_points)-1): + point1 = roc_points[i]; + point2 = roc_points[i+1] + tpr_array.append([point1[0], point2[0]]) + fpr_array.append([point1[1], point2[1]]) + + auc3 = sum(np.trapz(tpr_array,fpr_array))+1 + assert auc3 <= 1 and auc3 >= 0, "AUC score is not in [0,1]" + print('Area under curve={}'.format(auc3)) + + CI = confidence_interval(auc3, labels) + + if auc_file is not None: + plt.plot(tpr_array, fpr_array, linestyle='--', color='darkorange', lw = 2, label='ROC curve', clip_on=False) + plt.plot([0, 1], [0, 1], color='navy', linestyle='--') + plt.xlim([0.0, 1.0]) + plt.ylim([0.0, 1.0]) + plt.xlabel('False Positive Rate') + plt.ylabel('True Positive Rate') + plt.title('AUC={}, CI=[{};{}] '.format(round(auc3,3), CI[0], CI[1])) + plt.legend(loc="lower right") + plt.savefig(auc_file) + return auc3 + + +def confidence_interval(auc, labels): + labels = list(labels) + N1 = labels.count(1) + N2 = labels.count(0) + Q1 = auc/(2-auc) + Q2 = (2*(auc**2))/(1+auc) + SE = np.sqrt((auc*(1-auc)+(N1-1)*(Q1-auc**2)+(N2-1)*(Q2-auc**2))/(N1*N2)) + low_b = auc - 1.96*SE + high_b = auc + 1.96*SE + if low_b < 0: + low_b = 0 + if high_b > 1: + high_b = 1 + return [round(low_b, 3), round(high_b,3)] + + + +def confusion_matrix(y_real, y_pred, conf_mat_file): + tp = 0 + fp = 0 + tn = 0 + fn = 0 + + for i in range(len(y_real)): + if y_real[i] == 1: + if y_pred[i] == 1: + tp += 1 + else: + fn += 1 + elif y_real[i] == 0: + if y_pred[i] == 0: + tn += 1 + else: + fp += 1 + + conf_mat = [[tn, fn], [fp, tp]] + + if conf_mat_file is not None: + df_cm = pd.DataFrame(array, range(6), range(6)) + plt.figure(figsize=(5,5)) + sn.set(font_scale=1.4) + sn.heatmap(df_cm, annot=True, annot_kws={"size": 16}) + plt.xlabel('True labels') + plt.ylabel('Output labels') + plt.title('Confusion matrix') + plt.legend() + plt.savefig(conf_mat_file) + + + return conf_mat -- GitLab