From 8a692ffb0b707643db6c1ec9e7441ba04a369d27 Mon Sep 17 00:00:00 2001 From: mhostetter Date: Tue, 8 Nov 2022 14:18:08 -0500 Subject: [PATCH] Add unit tests for `np.convolve()` --- scripts/generate_field_test_vectors.py | 27 +++++++++++++++++- tests/fields/conftest.py | 14 +++++++++ tests/fields/data/GF(109987^4)/convolve.pkl | Bin 0 -> 1701 bytes tests/fields/data/GF(2)/convolve.pkl | Bin 0 -> 1351 bytes tests/fields/data/GF(2147483647)/convolve.pkl | Bin 0 -> 1351 bytes tests/fields/data/GF(2^100)/convolve.pkl | Bin 0 -> 2176 bytes tests/fields/data/GF(2^2)/convolve.pkl | Bin 0 -> 1351 bytes tests/fields/data/GF(2^3)/convolve.pkl | Bin 0 -> 1351 bytes tests/fields/data/GF(2^32)/convolve.pkl | Bin 0 -> 1351 bytes tests/fields/data/GF(2^8)/convolve.pkl | Bin 0 -> 1351 bytes .../fields/data/GF(2^8, 283, 19)/convolve.pkl | Bin 0 -> 1351 bytes tests/fields/data/GF(31)/convolve.pkl | Bin 0 -> 1351 bytes tests/fields/data/GF(3191)/convolve.pkl | Bin 0 -> 1351 bytes .../GF(36893488147419103183)/convolve.pkl | Bin 0 -> 1673 bytes tests/fields/data/GF(5)/convolve.pkl | Bin 0 -> 1351 bytes tests/fields/data/GF(7)/convolve.pkl | Bin 0 -> 1351 bytes tests/fields/data/GF(7^3)/convolve.pkl | Bin 0 -> 1351 bytes .../data/GF(7^3, 643, 244)/convolve.pkl | Bin 0 -> 1351 bytes tests/fields/test_advanced_arithmetic.py | 22 ++++++++++++++ 19 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 tests/fields/data/GF(109987^4)/convolve.pkl create mode 100644 tests/fields/data/GF(2)/convolve.pkl create mode 100644 tests/fields/data/GF(2147483647)/convolve.pkl create mode 100644 tests/fields/data/GF(2^100)/convolve.pkl create mode 100644 tests/fields/data/GF(2^2)/convolve.pkl create mode 100644 tests/fields/data/GF(2^3)/convolve.pkl create mode 100644 tests/fields/data/GF(2^32)/convolve.pkl create mode 100644 tests/fields/data/GF(2^8)/convolve.pkl create mode 100644 tests/fields/data/GF(2^8, 283, 19)/convolve.pkl create mode 100644 tests/fields/data/GF(31)/convolve.pkl create mode 100644 tests/fields/data/GF(3191)/convolve.pkl create mode 100644 tests/fields/data/GF(36893488147419103183)/convolve.pkl create mode 100644 tests/fields/data/GF(5)/convolve.pkl create mode 100644 tests/fields/data/GF(7)/convolve.pkl create mode 100644 tests/fields/data/GF(7^3)/convolve.pkl create mode 100644 tests/fields/data/GF(7^3, 643, 244)/convolve.pkl create mode 100644 tests/fields/test_advanced_arithmetic.py diff --git a/scripts/generate_field_test_vectors.py b/scripts/generate_field_test_vectors.py index c66000258..9b3305a50 100644 --- a/scripts/generate_field_test_vectors.py +++ b/scripts/generate_field_test_vectors.py @@ -12,7 +12,7 @@ import sage import numpy as np -from sage.all import GF, PolynomialRing, copy, log, matrix, vector, xgcd, lcm, prod, crt +from sage.all import GF, PolynomialRing, copy, log, matrix, vector, xgcd, lcm, prod, crt, convolution FIELD = None RING = None @@ -187,6 +187,10 @@ def make_luts(field, sub_folder, seed, sparse=False): } save_json(d, folder, "properties.json", indent=True) + ############################################################################### + # Arithmetic + ############################################################################### + set_seed(seed + 1) X, Y, XX, YY, ZZ = io_2d(0, order, 0, order, sparse=sparse) for i in range(ZZ.shape[0]): @@ -340,6 +344,27 @@ def make_luts(field, sub_folder, seed, sparse=False): d = {"X": X, "Z": Z} save_pickle(d, folder, "field_norm.pkl") + ############################################################################### + # Advanced arithmetic + ############################################################################### + + set_seed(seed + 101) + X = [] + Y = [] + Z = [] + for i in range(3): + x = randint_matrix(0, order, (10,)) + y = randint_matrix(0, order, (10,)) + X.append(x) + Y.append(y) + x = vector(FIELD, [F(xi) for xi in x]) + y = vector(FIELD, [F(yi) for yi in y]) + z = convolution(x, y) + z = np.array([I(zi) for zi in z], dtype) + Z.append(z) + d = {"X": X, "Y": Y, "Z": Z} + save_pickle(d, folder, "convolve.pkl") + ############################################################################### # Linear algebra ############################################################################### diff --git a/tests/fields/conftest.py b/tests/fields/conftest.py index 32cbe033f..a75656708 100644 --- a/tests/fields/conftest.py +++ b/tests/fields/conftest.py @@ -254,6 +254,20 @@ def field_log(field_folder): return d +############################################################################### +# Fixtures for advanced arithmetic over finite fields +############################################################################### + +@pytest.fixture(scope="session") +def field_convolve(field_folder): + GF, d = read_pickle(field_folder, "convolve.pkl") + d["GF"] = GF + d["X"] = [GF(x) for x in d["X"]] + d["Y"] = [GF(y) for y in d["Y"]] + d["Z"] = [GF(z) for z in d["Z"]] + return d + + ############################################################################### # Fixtures for linear algebra over finite fields ############################################################################### diff --git a/tests/fields/data/GF(109987^4)/convolve.pkl b/tests/fields/data/GF(109987^4)/convolve.pkl new file mode 100644 index 0000000000000000000000000000000000000000..a523a2970042dd59b6f0067484d6cd65f64a5eef GIT binary patch literal 1701 zcmah}X;4!K5Kc75dr*TY5hPU+17agbI21)dQJPlH5XV6&O$&-ko+UnNK`agbcpkipzOgQVd+xRH}Q5wXi5rm6IPWi#?Zei3_rhWOJPGe zesgcLTs5-I#A#BQ?aR7}CGNVIaSV%*POFw};aP zWd{vI*M6D2acq4D4yumw%p=uZ%IzRS~|gN!Lz(5+p9YQAX_m~ z%(QDaQ$T}Zi@MD*6m?Blaps;<;0_ zVymRUs`h_+Rm3}i=DNPBC%S;5 zz{;U*aoe1WVSl6jTF&+7%W`2-T<*x=pAJSsII8QJeSb&z7DYmK=`)_tOFiy6RCw@# zGvSy$nFbZanpMQX5)K2hnEZ;uy?GR9h(pdh&6&rZVHhgtRcMJOkw)ln?ksP+erm4_ z?B9vJ*Sg`|7S*j@_dsY=;c+N{RFS;!#8Al*c(41?;|s416Ud*Q|3_vY^qAF$WMUQY z$5D6kLiIbJ59dJ@H*a%mVawhV;2?V_rTxZRgB}>_rswj9{r7!~RawLz*{;mZhOpzJ zx1EK2{1sTtaMP!yF3Z6ndnMjuiuFfOa@13AXg(`k7*HYXvwMKOY`PGoT*q})=lIA(9nz9FeREm@0cj%Pap<6ctL7Y?&Y12RoHZ3t3G6*h33%B(Z{I+^Yd_b?u#;dG=D| zWn9QwwBHy-pJbEPvX;FIFY47iB=cXGj7wu~Jh(qGLyWw_`DlU@8 ze%&q6>c0MU?lY1F$wu3B?Gx{IM%;FFTiZS~+}#bAi*`3Oel+~O(TD9fdSRZBc{N|S z_tDj*Yy7{y?RRBQO;s1Wp32TAk2u;U`>@;8b`>;L_G#OPAF>baI2txDr3`)ml3$ps literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(2147483647)/convolve.pkl b/tests/fields/data/GF(2147483647)/convolve.pkl new file mode 100644 index 0000000000000000000000000000000000000000..8d8997461f151fcc95a4e3c55a70017757eb32cd GIT binary patch literal 1351 zcmaKseJs>*9LL?^lBDHO)<|MbNtaWMtLW(AP98#}ZgQON=I(Ir;?jxAJamirHENYg zu`K^2wPm&*X4a;EifXh~>!w)L=wY(x-XGQaL++1z?ft#a=kxtMeXqpktkBkqK1POT zVx=%r3tTjMb*>>GBS$L_Q0rAXWx7_IZeUCfXuy6hKy-}CUe%L zj*(cEF(Q_XDQEUDJPAu;U&bgnCfiJ%Ay*C;wlajNteE}P+QbqvF)=aX8Ow*hBvv{` zRw;_R#jjT)tC92Xwt{Z5^0i<}xY!2diIp-idGd7(=*Tu^f<20U7FhJfNQ zmaqz2g&nd}*#DcGljSxacQr-3cYiz>Ubng3J3#&SqD7$F$`9G#(7C|<;M*qaB5+&V z(=?E+YYzgSw~Xk)`EToOTb~ar>pdmg!N9Q}NusZ3e zBe=?3n+^_4Us8a$O>ScC!|48Bqbl530PD|@qpsk1y90HsWq5-dbT+@6YAQWd=n2go zbdLbzJu=v!w+6IHynj0`3Y`Bok-1g~tE!VXsiqT~%p&LnSM_EvDY#ezM))@df~;dV z=$2jOcI%*@#g#dOzKh(w!QUNCox7u4%L-Yxrhzw_OSOeGa#q0Wvd5<*VCxm5FStgu zo9682YxIDYc`InU+Kx}HhR$~?NCtziKU@X!i=SvZQRsQlo5HBF;tm$dSr2mV6I=fAq)szTQ7(uIGB5=l9(A{oGHKU^+*HZ|A#$ zsU+a+F(>%@#+T#63Q>3S3t+1IaJ<=<=m7!r5G;Y<62Nrx^9^JNaNO8f8kT_HDZ~%LP?VGb%%b+ceFY**{UjTLMv&VxTf{c^9aw=A**9inyfYriNND9kaz4&5?eFl`y*VY$1nq}ZJq_OS^ zl-L?eVFl?H7U%8e4@#iO__Tk^Pb$RFZa)52K*@^sc~>S-ku*L+AB0{jQb5JUYk3!# zTh3hA!@c@(()#|%K)8Z)dCPZL^6hQTTjWnY>pqUA{pSJz@e-(EQjOph@o86d6 z5)ptALYE1@?w5<#KXNhi<&Q#NRs6|yh2khZR{ofKzNRRsc62Gk`@vZC@$^P{ z*j}CbquB3xdMh=(2bKZ!Z;2^k8abEw80TnhyHKRIb8(Pq&FsY84VZwz@3J$exw_I@(P)&^emnaMG7|__>Bk#-6?eTN&=LAA2W^!y}{Dg%VO8_d>$jTf+Jn{Ap9*hd2A4Se zy-TFvNdJ46)J{vfw&TEyJy5c^&Q!t8TBM-80`S6WQdiT2x>~aS(L;pnEu(*bD3bRJZrGAm z1Q_piwX0WV{Cni|pO%0tj1f<1MdA2Y>8$8T$d=Y081wIan$=p8q6cB-@b8U$BEe~U z&-X}xS;Z2*(FyK7>z7{Z5CXUKu-#YTLr@@1dDe;x#S6 zc)HerC|=gb4K(i>qC#<@!LOc--PbHN6(5*G)~+y_hRYPs8y>x*19D*VE>r(B@G|wM zB=rH|uxVX0+0v5G#HM>A(5t-9Ns1^>E!yZ3+YN)xCfB|=mK1Is@4}vj71r({pjuO0 zese<&Iyn1zSM6}u4YSf9>?{Qa$sMVEC@d~!<;!=TMU5Cg6+?*bXlK?tN)S_)dwL5D1$_x+oKQU%PmGkQe z?U6E^2EtmUp*klbFuH%@BMfi^BuXc56woA7`@)QYVfFp|>_GP#>&T2*ZwR?pZJnG* z)s4xI7S!-4Aq=n4K3UeztmE4)g(6iHn-v9BgEP%OKQqCjQGe=G9S_AX^=J(>z{9@J zo7IX_4;QqK_nU(3lH|dnfmO9v<)_;DAuE1I$3ES)Xv8ebT^@{;S&-}CxT)`zhcCPe zp;ylG)WQlg*Put6C5#gEAKprwBQ~70dmL?pB08UpE9^wM-yh*@N(0+}wQVU$Tg8tf b8SN6F+z*#x`dk+;7tfRTObYB=E=T=8tr?=g literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(2^2)/convolve.pkl b/tests/fields/data/GF(2^2)/convolve.pkl new file mode 100644 index 0000000000000000000000000000000000000000..195d17537f27a762486b317cf1b2565896b66962 GIT binary patch literal 1351 zcmbV~KTE?<6vdO)s1zr~@6ai;L$_`Qf;g!l(x!nFY+7P6WDs167T(q?_-!@+ej=B? z3})!z+sTba6Zd6!!m2W~LhN^)$xMP6>=dStM?lHEt!9U6BcVHjS2 zS6}lJIJwMs(;K(VeYPdX}t}OtLC;k>CnT`!|9U)JbYI=HEP^6+WOSl&K#VSpsh|H{9kIO UNnt~sLhJAWbsw(#%}Xi#AIFZFK>z>% literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(2^3)/convolve.pkl b/tests/fields/data/GF(2^3)/convolve.pkl new file mode 100644 index 0000000000000000000000000000000000000000..3c5bbb74192060dfc3e7e3ac63fe4411d1e1550b GIT binary patch literal 1351 zcma))K}*9x5QVdC(@OEA_#b-8*+Xx=83^J@1(7xlq+rt$lS2-Im!gHebp-#dZqogV zENw7{yv)p-d2crR-uoK+Uh}-kNUM8!GH{iZ%XJmRt2_yoQ z@-i-DC)#g_q6gW0PuWT6ZDgWm@*#IJ3RO7VNZQx_yr|Ym-O^cH%l30$?P@iaD2i@= z%+tI=uaMbxa@*Z|I=q$rB0sQk$70Vxc+|y=P5tz&c9#zSdb==cuv``LpcV1@_5(gK z^>#J9!e%;orm`b>`=2~FU#lfrJ=DMM^p2?El@lU%Rmg*=($~HtUfBg?imOH*M1{Wp zskvTp0WuYJ)KKA1*b{v`exjG=3YlB;&56>D3R8(ug@?L}sKa9$bf}+-;U7OMTr(Y) yAlXP0siQ~S?wTp6(}hbHafhl~N8PQvdA6b-KKbURl)*2zd72sk literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(2^32)/convolve.pkl b/tests/fields/data/GF(2^32)/convolve.pkl new file mode 100644 index 0000000000000000000000000000000000000000..1cadb170051bd8aff7e497eb2aa8b3c2026a35bf GIT binary patch literal 1351 zcmaLWdq`7J90zcxP3L;22BlD$ls&Ypq?`}56_&$g&dRh0^RcF>TXVy=z0?fX19p6u zEG-L5g6W7%X)8?2%91k6(pqH^)>Kl_Fx&T3&>!ag<9_(w{q8xxb9U~LDfwPZGkRqZ zXC)()>@{JRpoo{IxJF83(XR1|IC+dvCKIL*<+S~>=txOIqFknkloJ(EGHD@ES|vpN zE>RJlSvKJ^BFG66Oq_WP9y^JIqO+)W2>N4>ZO)i;Y7FzI<& zKU8$Q8i1T?P9dCpwwgB&gs8f*DxD2GALaT&y&<^+Uz)rRVzy`{V>kY~|F1Dq&N+(ez;)AmpkPo$cd$_1?T-A(sVyF6=%=cnhsfF& za^8)q;fT$*1(20Kqa04Y#)FN1A5irwSo;!gC=I2(+Z7IuBIlKd#6j1FPfMWRCC@vs zUlM);-eZmh!&2w&FL3hN*86i-p(>yy#1R?~e57xA-|yui4_D|36qYx&L5Iw$KsbZ2 zs^K%P;Vpa^{Jk6g+0n3xchtsogiNQVXwz%aJXCktF0hB4sV;IjV4;hEi9X>!;L5B( zZy38%PP_4MPu+n$cs7!rIt_>Y8ToLQfp%B5O|uqx&FW1_usO_n8T3%yIRwju?}uSY zh?Jhjj;6~}WQWA7d^qu5{p~tAhu@4Ut7W^|p{*aw4<^rz%7U#ql}gyZd5;UM%kw+~ zvlUyLpw3uCXX9S8Zb6pXC(*9cO0@I~Y;FEAAJ0de)Lqax)_W1gnh%L#Pgw11ICkOP z7I@AvmySPq*XIRsX{a6%R4#(GPux7=+Atphe7a*?1S`V5AH$zlnRIU?*R>kt2ime$ z_;$I&ELak1%!l=@Nxgj5Z?|#Ye_j~W9bfgjT zD(4l_NL8ZKGXV2Uv^m3s_nNPTMdawBr^WTdE5_8F-5W# zo@};zQa<7V#&811@Ebls9dDv=epdJDzE*d-|KHwDI@NBGbrtX98t&pMuH!U5Ms`x^ zU2TEv9ejwJcpWd{-H!Lyh|Acjma)~_t)u(@jGxJVjmK~svnXel-FaC5fLE~hj0Lj# zu!`qUR;d$TzzCkj2KKIIkhO<*Fo1IQ0pda2z$l(Uc66ruj-GO^kaKHR-jaO-uVmM+$PVEse#g`J1>?Ak&+tcwkBH?| zdE(!w;#Yi$huFJoi>&AP9_3zqBKF}${E2ZqkMeBfKfASG;6qUN6|Nc8 zq^2@~#H3{eQqF`u7PqW;M!ApPSVm$pJ#AY~!d9!w)eDKreV9%bQ&v^P zmsKHcR4u5OYKmwPe^!|luAa0rQ%3%kvavRmTP!{;ceS93Mx)_d?<)L6e6||Rg?i_T zbMm=pV-COJQ{2S&C|vVLd7m|Pvob$B(|>nv)!t|^vcwm}&+!2F@eqIEC3a%z(PS+* zWWU1CC~G_-zQQ4F#^0D9&2Y7W{MP+{jn!nI<2Y_(5ANb)+`)HvjHTDuLDolgSZM$@DnbgbmJ277j$p~m+}5u$*fU7ACGisZkxVoJIML^ko~*<;;me?#rGPI>ib6 E1&7h($ literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(31)/convolve.pkl b/tests/fields/data/GF(31)/convolve.pkl new file mode 100644 index 0000000000000000000000000000000000000000..5172fea3a7694c27ae105e80a23dccc70e448d60 GIT binary patch literal 1351 zcma))OHaa35QSTyfQT;;-@0bS+66myHX+89ni#{QNlE09+Adg-xFJf?9b@9Z)wax+ zm-KD=$=Fj=jYeK$fb(K1pS*KDm#D03xy4wWTl%f760z-SmZ=E4 zhDJ^Q94Qi4Q|CF2H?tjR)`{Y_Vpg%Fm{x&0JmEfOb3*eW9^KzPrrCCsrJ{&qWsS*4 z&840nD{k(Q*BQ-bPQm98|D->c9S_DDh(d&Ys`F6fhr~iANBE!t>pcBuTYIzyrBwnMctOlU?12ICP^Jw w>5_VEDM%h&;10b1Q;iqAVmtASdp3eD@RIK69u;^9;xS#aw{!zvvME912Px*CLjV8( literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(3191)/convolve.pkl b/tests/fields/data/GF(3191)/convolve.pkl new file mode 100644 index 0000000000000000000000000000000000000000..6f2fbab39c3a047154f4d46021c36d0b112d2695 GIT binary patch literal 1351 zcma))F-Tic6o%i^#AqrARgo+XDkU9~p;Lws36Vk@4I&w8LKTgXNHvk?%Meg-FlgwL z5WRw>?dH&-6df#G)Jd0uQaV(MV23(}(5+MJOYZl;L4$9|pL5SS|NozJ@3L*nZ&zyH zl5iX93-Qu~&UAKeKIctjw4`?~JFCx3Xxc?z2bb8{-?NRqp{mJ+HO7}^VMwUt1_b=eVJmlHx}TFjqJ(eiO7k0*ZhYAdMwNfwL6(7-eG zV!F#n?s3q72^^2}Y)y{XVKi&~nmBruG>(eVpo6iNQ?Gdz6%#&J_?mZxfdY)ehYmGg zu$84zFv=KBZ}WC%=L4)8&2fo)>nMZJ%-Y%9w7?e}jLsN3cz=G=8V{w)C38mq7|lIT z;R9u;ZYVLSJXHU`x{bdoiPg?~J+q_D10xz;9T`-e>IO9ttF$+G4f{uoOv?N8hlHO$ zLd_3X63iA0TQez`$T;iKM4U&9FjCL8>5*qB62O>SVXHhae>@ta;RgL~uaxw}$)3uF z*Oi~Rq@G@gnHR4wdF@69M*FoE1$6x8cNzNRF@%YX*}lMu%1ncy>9Z|RlviUZ`r?$( z25@4V_2-zxAC3V3?urU4d4!QUMt4LacV=$<0AvN-#otMchs~g=xes%amJ~)sPL71H zpt2{g;eSWtqbEk=&H^_~RBUK!e(AIKXN>A;*FDd@?W6&9eGTy?-;!Da)cy6FnzHYT zjWD|ECZN388ZrR>gTjjvrS#z?fXCjq@$W`%9sxnwx2vijjQm*w*1hYtNjyj@pE})= zP?y0#s8bd_9;lEGHM}px!WbhX3zdkO=2#3y_rSJCuF3{FM!NAgXVqoKJ_n{tWPZ}g zW`j@QZ|+^tzN$SLhA@76m(nSABorgpylbm9!LBDk$c*`vk)y9t8mCcj2}|Re&1qRYJ!P*(ykayZNO5Dww_2`WMOP*0_j;rM5JKB z7z5x$hT1aLzh(`KdjsR)520hj8PF)x%pj*rXBpt{_^XxBI$tuS!X-nD`~f4L0&M&+@ImX zg;t2btX9S~F4qd9QPF}17gl2z_`B0yt%84Xa^cWiCg@WKwrdd-h_uWrc(Ey#?cd0cz*Nfi(%t<6W%D2%-E zr(F|vA09x`z^y_5?UpZKB5qJa2v3Gl)dOO2Z;R;#@Y7a^g42sH ztN?h;E@r^Sw<8;evSZAb3dLSi@`Dg^{zO abaZRgkwWnAY?eKK-XI;E`k(l6`@aFX)VbvV literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(5)/convolve.pkl b/tests/fields/data/GF(5)/convolve.pkl new file mode 100644 index 0000000000000000000000000000000000000000..cac89b486a7b42bb0e2cf3359d16464373900c52 GIT binary patch literal 1351 zcmaKqKTE?<6vdOaQ7KM}-=R}xhi=^r1aVS9q)h`U*tEoC$RM~BExfH)@Z0LkpC6P< zlMFq%_nvd^dFlHc{Y*Wlem-Pk+(&t_aFZ76ZRtmwEcVyMTfUlS*}N2U`I^PiCVkJd zBFg0;#;b{9&eLT>IY{8_Wacj9OCDqrxWRZQ$(iw%dAW@%$zXLW`|oBtH11TwFueP- zPyG`(xh(dx`(cyG0o&3UwJ&aqx`qcb7i*h%$wiee86Ri6vfE&xVrv(&eSn}v`u*Fw zR5}GbQc!DNwJkR8Q}x$%pOI|Z1$T~uJAHH-`_G757ve@5je6d{4K>->iVHP!_?(eG z*nZLH(_i%3ULkvHezlsKZPd7uhCav~Bpo$6uuBL3^tU24>ADaXwy;&Ff=3@e_@MTo f52Ei+%{JUn(Z@~C>BD1AU#Hf-y4Je-rWF1^Ef<+* literal 0 HcmV?d00001 diff --git a/tests/fields/data/GF(7)/convolve.pkl b/tests/fields/data/GF(7)/convolve.pkl new file mode 100644 index 0000000000000000000000000000000000000000..3a2dcc5cf01f0260cf1a4b40a4b20e10290f8098 GIT binary patch literal 1351 zcmb7?PfNo<6vVS_Q>A!P{0=?k?4h^b3n?nwQm!gHe^$C7k&A*?N zrHPos4*TA`nc2<04L&EXQ+=;8HtJ3u3%E?O)h74CbsBlA>{%~oX*$croIRycxK3Vl znuS{SV%&--<|J9vl)d=QR;Fq$?{X_+U-_f0#6#mQbiRqok>2u3b{}=OZ`4GBAh`Z6 zzH0FuE%V*c7EUnyWgne1`?;aF$Wwp4d%Mt z>?yLMjtZ{uNk<(l-6Esz%U{=iMthn)XrF-;q#`A0{&z;QqJk@kDsI$C)$Ilw7p737 zjyrYscE7pNhvPSTQ9PmI)qJ(NqDBhN#-2HD*yh`PQj!`SkUDzD?~2r?XS=KTOi`|u$d#AcN8`cW>f{s0cj z)j_!^oDe07NRo14cK7p^13QQL%=bIb^FGh}%scaO8+A4%e9ejyQ|%Ug7BYSQ@yUSG zJ)wJ?Vu0*FEkD-;|;I-G*2frY#&O%mm+1BxGG^%A#me2gQ=;6eXIf z*%yU3-n0!Ffk{s&C1#{r1eYUkV@#|s@N@8e=o1*dn%vV8(F;(6 zJ8%lFzz_HW^Qa!G<}uZt(5L%SqL0y8=rWjvpAYT$x9C0S zz)wO~!AkrJbQw&?kKXks(ee}?pKxun-iAwxyM z7y}0mc?H2qP#hEsPNIY0T51=Ej^d!B3QjKeF86)l5Oc$Q_`Uc0z4z|DcXuP3Q<~Cw zHpH-}E{K~xN9jole2RyulRG_5d+*syvgH21BL0ZqFvaL2cp8iJ-$Qn^(0xY_`B%ul zHIKiL{S`msCH#Z)n8z_@9VNboKT+=d7O}jYHgS&nB)*~j33lHrxoUX=Kgiz3^Ngku zCsCeYhFIQCk9Y^8)E~!1+J}fQ;xWu)279l1lB`dRI)d_~