From 7c3f583b0d2aafaac6ef8f2943c96ecce3ebc689 Mon Sep 17 00:00:00 2001 From: Yoan Tournade Date: Mon, 5 Nov 2018 20:29:21 +0100 Subject: [PATCH] Closes #5 Add mlpy find peaks functions mlpy.findpeaks_dist and mlpy.findpeaks_win --- .gitignore | 4 +++- README.md | 40 +++++++++++++++++++++++++++++++++ images/mlpy_findpeaks_dist.png | Bin 0 -> 31763 bytes images/mlpy_findpeaks_win.png | Bin 0 -> 31589 bytes tests/install_mlpy.sh | 27 ++++++++++++++++++++++ tests/mlpy_findpeaks_dist.py | 27 ++++++++++++++++++++++ tests/mlpy_findpeaks_win.py | 28 +++++++++++++++++++++++ 7 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 images/mlpy_findpeaks_dist.png create mode 100644 images/mlpy_findpeaks_win.png create mode 100755 tests/install_mlpy.sh create mode 100644 tests/mlpy_findpeaks_dist.py create mode 100644 tests/mlpy_findpeaks_win.py diff --git a/.gitignore b/.gitignore index 8dc0421..21ea7ea 100755 --- a/.gitignore +++ b/.gitignore @@ -56,4 +56,6 @@ docs/_build/ # PyBuilder target/ -venv/ \ No newline at end of file +venv/ + +tests/mlpy-code diff --git a/README.md b/README.md index 4826fb8..7554e91 100755 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ This is an overview of all the ready-to-use algorithms I've found to perform pea | [Octave-Forge findpeaks](#octave-forge-findpeaks) | Requires an Octave-Forge distribution
+ PyPI package oct2py
Depends on Scipy | Minimum distance
Minimum height
Minimum peak width | ✘ | | [Janko Slavic findpeaks](#janko-slavic-findpeaks) | Single function
Depends on Numpy | Minimum distance
Minimum height | ✘ | | [Tony Beltramelli detect_peaks](#tony-beltramelli-detect_peaks) | Single function
Depends on Numpy | Amplitude threshold | ✘ | +| [mlpy.findpeaks_dist](#mlpyfindpeaks_dist) | Included in mlpy
Depends on Scipy and GSL | Minimum distance | ✘ | +| [mlpy.findpeaks_win](#mlpyfindpeaks_win) | Single function
Depends on Scipy and GSL | Sliding window width | ✘ | ## How to make your choice? @@ -251,6 +253,44 @@ Straightforward, simple and lightweight peak detection algorithm, with minimum d No minimum peak height filtering support. +## mlpy.findpeaks_dist + +![](/images/mlpy_findpeaks_dist.png?raw=true "mlpy.findpeaks_dist") + +```python +import numpy as np +import scipy.signal +vector = [0, 6, 25, 20, 15, 8, 15, 6, 0, 6, 0, -5, -15, -3, 4, 10, 8, + 13, 8, 10, 3, 1, 20, 7, 3, 0] +print('Detect peaks with minimum distance filter.') +indexes = mlpy.findpeaks_dist(vector, mindist=2.1) +print('Peaks are: %s' % (indexes)) +``` + +[Documentation](http://mlpy.sourceforge.net/docs/3.5/findpeaks.html#mlpy.findpeaks_dist). +[Sample code](/tests/mlpy_findpeaks_dist.py). + +Find peaks, with a minimum distance filter between peaks. Code written by Davide Albanese. + +## mlpy.findpeaks_win + +![](/images/mlpy_findpeaks_win.png?raw=true "mlpy.findpeaks_win") + +```python +import numpy as np +import scipy.signal +vector = [0, 6, 25, 20, 15, 8, 15, 6, 0, 6, 0, -5, -15, -3, 4, 10, 8, + 13, 8, 10, 3, 1, 20, 7, 3, 0] +print('Detect peaks with sliding window of 5.') +indexes = mlpy.findpeaks_win(vector, span=5) +print('Peaks are: %s' % (indexes)) +``` + +[Documentation](http://mlpy.sourceforge.net/docs/3.5/findpeaks.html#mlpy.findpeaks_win). +[Sample code](/tests/mlpy_findpeaks_win.py). + +Find peaks, with a sliding window of specified width. Code written by Davide Albanese. + ---------------------------------- # How to find both lows and highs? diff --git a/images/mlpy_findpeaks_dist.png b/images/mlpy_findpeaks_dist.png new file mode 100644 index 0000000000000000000000000000000000000000..2bbcab3916030ebc298af84584bf64808b5047fb GIT binary patch literal 31763 zcmd3OWmJ`2(DtDuC8S$Gx)DUnc0x;rGK8)*e;kOo0gK%_zGR7z4%N~A;SlCE!# z&syL6>;3m%?#lx%5v9nsBjPn#P!FIq}31zG)4phB@OEue8+t@ zq#gc2ca?gqfdwyLEQ>Js8r$iSt}6mTV2b>M@?N6Q2EHlcCZpq~?)cQr)6~ThVQ=c@ zWasE+XJdBL!_vjo#?j#>KMz089j=?!Zf;KZczOTl0v<;fD_$lNX$%D7CgQR50}Zc? zjcHFW^-*ff9Y?AL*2EE1ZlAos7l}D`*1G&3@Y1R*v6D(w3M?N@Ml29a-pmff(XqtA z>Ul(o(?e%jp3MJqBx9DoJGel}Gd}&}?9l#F&@Ug??eyWLmZOY)x+FrWz%b;i=fy@M z{(t}7qhn!|M!qbZ6{Y|C;X-N{ArZXdI{Ang7?H0?b4ICu7m;;K2miZ>D<&KZc@2>+ z4KdNbYpR6*Z{NrzjZ?c!GGEPfvdWT7!b3_5^%VgU_xZuv(+GK8^RB2M`TQ5Htr821 zi|VCE`}<#fwwntjE#A5Q`Nn`pBTPujsTEvY%o#z>8$%#|j7Z@z?ESG=ZrmE9nkSp% ze{t&M?j8b5%Xt{8X8(I>DL7W*l0v;e@qv`oi=wP+s+kE-RuN%rM-!i(k;|v>MC(>R zrQ`~@JQvy6+$4?QaO5y<5zUkcz{kW49MJ2H&MZG z-}GnVpFh^VXPdPY0@klba#V2C3zb7;^B#oa)2h_FSpI7ACdMV>Y8xxn-yJs&$nibd zTNS_DZoTRvH}(y3S?--b7&q>o{}THBSIv_waS924Q6Yz4VX&gMA5TKqo|r~r5vBD{ zH+s%5FDKd7CnOO6u>FKev~0+cgrlsiTv2^zd;C0tlyh!j;l;{8disIzShn6L+f;GC zd*#9UIhE$!3%yC4sdudKPyepI#3p7j*`8_kf+PKa%hdIwNF9@aPPA>Z+Ukzo*Mr^N z2VY)YCtbaiPn?27tKuhSRSt$NY`waSEHiBU{QWzzxcI+E3?{7ezqt4FqYWAX0Ri%? z4>u+$x2mm%GM!vqzvL^V5R#CfYinzhu&bdbus(T3h>ExwEE#@-`CEZfx<+ik?gECW znAmV@KtSHvc(k0b*Urrt+WXg%%eaI(P^ zyuc6;b93!4tw-KrH#IlU!}hA>%Uc!)oPQ3%RjsmkEPVfdo>r-zY~yPRY9^P(uIp~= zW7lOO$wKn-m~hB>qC7T#&UZyqBP_`CBFT9f`T5nZ=ve4I&HCY#RBIg!g+)Xtxym(* z$!veT4_fSwUEHjleH9sr3#S#ztzUyccx?R&rxLVno1COf;?Vp&)9iDdE^G9N7$Iag z5h$O;(LOv(RNi`d53WnwjZDKJW>IX5roOua_jy`pZ)eB#3ZM2vKq;rj`#|sg6-v7V zUtfi%X00BZR1KcnF;XEotF`)Ipfy>s4tC#>M@B<~2SPg9 z6N6bHS#fmjlh>}<#jH1&Pn<-6zt{8Ux!UDMVbRfo6I#Wij9grJG7%&};E-CY-FPmubyH6+XYrQj(6>v#eSy^f0G0v{`4oj=d zAbccWAlPssT%vZ)YP!m?}d5xQ#CqO7TBM^e7Rn;I@5fgjK?4h z&f65+=#jiU{~NB=kB+l+h}(XrZUQzV=wSQG?jf${$Gd-~YI!-d%c4YFS4_ZKCu;1e z*G7x2oXmDFj%Jzo_=sL!yZ-t7WPkX*DpP-^7`5N&-^WMZw8BmZr8fc(-rjTH*&mYl z0;fJaJdA~p-!+hacXzcg%WS5}`_GReVthK$)U6gZy^q#Juka{em~}>&uJot9*R5vJ ztFf~Y5K$;nN*9`FaOXt&dwI(#&cj!D?O#F(h-hg`XKTyLc|T|rA!^LS6L%lY2E>B*=fZ7|&-aIR{|qw)2M7Nl zu36&W_ebTgq!jlR23(AQx7-vGBHNs*l~YuV@=x#Rkp9&gAfbNO@I|J<_W~u=LS@?E z(9psuj`+mHU@~q!lljjf*3%7w5J*)%Xt3i^3*nh}#|&s~+;#XR38#O!ITeZoZ7?R8 zO0&*y%|4!7Moq#4I{fjkUk8F4<=IVEr3yYHiy&ct0f28h`a#orvWj`_M-lS*+rU2z z8{CEiwBpwRLU@c@qS)07=3Wwrw^dp8sYRzziai%#d6F4bJM$d(j@6*_aIVa7iEgz9 zIbD2wJpTnz=LSOB+WLLF2Ll6x%~tipQ2c9Chijt>5W$@R z^)FmMR#y{)u?kIWO;nl}B}@1ma*ev;;o=f|cz7(pmY-VE-uEDxnVEqH0t{m|Ff^2D z^w^a4^=I+5b%*6cohB$EVur3qcY!5DN!qg!jJdN)+Pe zSeYSbFyR7(KGZ;+3X=y7-E4*pAKU#$Tu=Ynph$A*R^1wHXls*1kvs=~KDA_3&LBht zgZooO%eMOVC39b^#ECmOQa?IzadEi;Xfx{QdAu{PQE5NhVuX=)z1&33~mB!wfY1Y5ev9hwdxXKdui#R*l&U2V<_-6YlEFuEHx~J#SN4v=zKovhj zthjzHV!dnd96*B7=&Mp+`%6qDSor=Omg`B`)+~){@jLt6*~vWJ-B4fupj68o0`WEN zpRNmVA>#GZ6f%g?AD@jY2ed+Tb8>N!`eZw*QmQ9-u?IGSxP2-z_~+t>&2TOToLoVx zarILr;d}R}Hug(vXFda=$}G|kLdA#@FMK-i#&UwA%6>`+V(ffgtoR78dXWa!_3JVa zE*P1Zs!7iJQg|!9_n&^W`F@SpxJBUj*ELMcMR*Kh_qD`f9e$=0Po?%37^;9uBy1{e z*~_X&Gn78Dz;8`hq>S~b$gJSI4 zx3sW)%Zd_%dKbjfFQ$9I{knmOI3KKOlJFYQPz%{fnwc>+xUVMQ{^Ll5QggeD z-8%;donT+{fBvM}HvZ+9OXSucoAdAe4P?gq7Bh2>bodQf`mFNIR3jyU_XFuOvO48kpTH=f$oZl^m(}hK)jcwGPo>D#$O>?)mEl$2lk>2nh*a+oly3 zT76i~%*;dt0vP816wfD8a=olFD0as^P52|up zVfjE!-pS*0YL&b<&PtkaoM{R#e3E4b2L<2~G@QCM)0|%VdtrGQ!_(9ArDenRn?xX) zcMj;5hqCB_xSk%dl@8fUN(MftB0%u)@QC=w=H}%MS6M0?pPnw9ZMWV%!62C%wVI(p z9ucI2y6onf1tT9slg7eLJdoKEgwbw@<$MmmgiG{3;eea=RGeFS=q#MPdpBxp>gZVB zs+S%g8j6V!$;^hm0G>?=955987s;cv%M2dOw)o|Y+Fqyoy|xwsd}SVTf=*EDflZF6t+jGl+M%d}*D0Z4i6rC6qMA&Ws4Zxjnp!bZTqBK5- z8|}}^o0FF>ynTGoZf8m&Y+74ayk_rI4?(EbSj-wxd#{osz!@X>Yzz-DT-M90?g6f) zhb2klR`po1cDX?L7OSHve`jUV@f7+JMI2B8OIv+M$88O?AN1nBVcFR?o4j^W?|W|b zJIB8zo3=7q4Oa}eqa`NF6_qL;T>vt5%Grz90XIYqe6TJFj`$7s6)cGgLU4N!8YXfP z3Zb|NHi+Pm(K&Da6nx2fxvDuO5^yOBe7U4GYfmJZ$B-&KJRDFhW0-UJUUv-bm*u_` zByY+C+&W#BxH_*M-UNIcD>se>29a&p=y42u7p!(#V`{WipBxNU#>-0>ZWIAAbupCQ zzvo92ZNvB+5U%&?g)#moK*pU8)<)g3VwE8$=5twk6h$L)!)h?&0l*FNDgBt=ml(`* zYknYsOwjpcZ&^`-rI`P@M70^#ews-x3|k$P4K{?@ae^)AVHzN zl?qwVX!%eCqf7*nyGvmueEgI869OeNXk1)?&CkQ5fia%^u6Y#4c)D3;+?x48vK_8C z;FhBlfn3OT^h18@)!$WhB)CG{>)e`dRR7eL8ozZXYf>k?M>vLvq4yy$()U-bgs71G z1UEN}QQdX0t1yI}*cpAicLpe6=%eyu!py$p-B6}4p4R=qPm19F-gyU7p<&e9z`2rui7boFLh22bin0`OfkKIQM`T5;=eZQFUZ!f{DG&n{3ZzBPI8YfMvvF{@UZ$snN$d|6Px zALx+vco{9Q+MT&}v>zq9#Bp(PMO~P;JXiWDkvRj<{B{V16%Nz){;rMUl5%JuZkC%U zr`|?MU{QkXlKfkP`?I=+2BcRV?{?Gk`5rsr(TP$ZlRXH1uRzgQ07LaSILLwoH*){?75Px$pkK-JUE7i5D+k@E<&f z&|^CC?(s3uui-jp^QNoIvt!`;(Bh|YBjjUOxUXwPQQoE1niU0khp}ZisKV2ZlpfR#sM215#AW zdxQF_OMks(A45aK&dx}3nd+wl!I6=X5UEK`O-&iu*}q!T0EY+i`bO}XTIu&BS|!~T z!Qy3~EKzT>iqbL~>%Ea8@FP;>MM$#k;NXx8sCPP&)^+F&aecVV@c#VD3JYiyofW2E zqLPIG0^TB_4(x*zc{OB+W`DlrEWr7k+AC*@vQr7!u>q?OiH(gt{*xEm5yvE_mh?u+ zs73oX(8pXzsy@%o8Uy{1IR|Yj7m%0n=1oaqVPPy|W8-1)J|a?5%fAOthQI-&A^d~l zk%t8tO2FkwA^fXY>%0B-zGsIVz2B|g6kc8f1B2kg!b0RDO?Pm<48po&>8V8z zAp$K_4~Y}|`}=>MoYWO?_@$E}<}+ro9am=Xu`)d`&-}yhw|hRaM@AMayI@|#wx9HX z9dL9z6EC}SF!YP=MTL=!S6e-?`&GxMP>leZPIGlOd*yU?xQVCmMeik_d6x;8mDk=9 z_OD;R67gA|fO3TkY$g)SY}(>%=`2kQRJuS=wjhTvix2v{iUd9J(?3iZ_uM)3JMryC zA?d6HedZikOj?~P+aiqDrC0X>~pjLnV)=U{O`@lYD~-C z#0S7J67iX}BVuE_;Ye?renw|ukY;J)W0Zd9d9-D?F;R&|eb=D_5|5F$!mkzAL9Mh= zevOHM*jW8jEeEtC<+~nL8LwXx0^4Atl`UHaN%S^dXqd|@(92gZz-#}&if~9dg29BX zd>l}F8zA`1?aY6%DFgo9)N;;AM5O9~{6uN3xt=(tqNmTE3?hR@*)_mX{r}P54XaDS zw2C`H6Pe%I%FLgP4o3?6Rl$VF-2)u}_5S^_fL?qSMy(~FNKnC0xrc`o>U-aTnOQx{ zRWoBW({#J@(Wup*mX3}NNA4j~;kO9~_6x-D@;tgKCOnLE*u8siXUBvQDgRrbO}rI9 zo5+d&Un>9*jNud1QniX9!H6F*RpGb&^v2SAAnISSAWkZnFf2U09Rf}wen^y)vvW{k zAuHy)bnO312qAys2|+{!_u2^_m&amw4cf-UgbpGwB_-uE(X#S?^$C*fQQL#ZVd?4V zBl9XaAQ>Q*d>LQ?8wHlvd}WZEK$1;OoO^$sc|Fg^QP{s*^uKZjd)Rbk3HdDbzS+OU zNK2D-BR5%Ey8eMQIw3W#mlq-@M_%q>BEx@mjDO#zy-vdYrjR%;Q_KgMA51iPSA(#9 zZ9*^-xd&Ai3mxGqMH<&?;Xv7F$tEcvafOCo zfNKCD5Ri`$W}<^c`Tk<(=$zhA&J56ty?lewSuro5^O{Lj8icXwWo zR>mu2`o1&xJ#RYl<*wt5!POOT#hbTp6GG7IhC2>}nj%22{mE9duCDISHr$Nb+1VLc zL;(4BXJhgX1o0npeAw97$W8fsM9!@j47jrJ^V2h=6o2E!4WttAvYSTSm!kE24;NV@ z0pdVaf(vOqC=(Sf%koGW7Gk$JRCC^zjt3#ZhduOQ5S*i`TSuES;7WVh$MIK%wJ>m1 zq;SGxQ1^P%ucNaQ1ySQL9g)j^gI!Ke4$%gw^=-2bETlFIrhzOqKq?#pxgWKiaf6!; z9IrV5G$@Vv55|kbiCGtrk|M}Um40U)!66~0(+%!G01a!*3pY#|rFu=9T^Sj34H$TM z@X2|Nq=BH1Om6|LK&}fULKFnhs~3KZqIH1ZefkWjyczF#Om$XWBg23>zA?dAi{f&=9#uWyhN{tuD+NX-m z5IpkWH3>B}E(kRp9UX07I$rjc#O)k~%ICC{0FKHlfPcZ>0vegW*{jqNKdgfM&+Gh{ zPsnkm#EmU2dB!Jkd~m8ih?~)ZQg-caF_*!11{{j^;x@}91q*x=XZ$`ZGDfX`mJa4( zdinhK(c6g6Q`9QVvzc&uF44d~*=bRADUsL8Ht0?F{*L|pc-U*pkVKro!Q|4~q=ztM zfe9iIR_MAOZ_C}4&b{V$VVDGg?{1w0Sh3D6#s(2F1roC+MgxBLsQs`NMCgtrmn3X8 z4>xOD=mAR0NXwusCroGYp-nWB|M`I}{G7zeU6V@y9x4)P2~d_YyP_svotr}>$tShv z_1p+1eDvs%Bovu|-I-W*KRa4!lMW`y8Agz5ATFQny1Ai`m0^6)#(Z@hEtyMIKoohW zoxgw45q|tqW1XFyGFNnQt59f{u@(q?7>{cM4F&)80#vHtZBiD~ryAv;-VPA|R!H!z zgmUNd3v1@1q|YIquqQs?%#U>qj=A-66kcAa3IwL`a?{fz zEisLrn5e2Qffc26%!?7V=a$6))!dG$$(}`Dmn<@LCbz>mDd(Z=Eu$IvaBteL{Xk(+ zLM>3nINYezu|{5D!JsJJvmii~t;Vd&&M9Wzg*aG8Gi>bjmiy7j&9K+_u*nTtwc0u@6p@EN>Xm(jqzk zS!8zn{x*V`1(Cpla(49FH{jpy>cZ}tx$vt@r#_LufZd1czt`U$x3hl>+(*9Od`Z z$Xo;-G+7dcbyJ9JX9pqmFe&C$7}D*juB&|FFtI9lk`akp;Xn&ASzAxsipVwiP^HMQ z*UKzSjEOP9SO|DNLUjU-yDJCdL6g-%A-F+V{`}jO$cJaMN)5A61Du!})U&1CYf?5$VU)3D2E-@55Q$cDlK<)z}tFk2*ZO zBJuAeED4C?6n{2)@?N`66%1M4JY@cIAT2{C`U-^AwOV9l&;Rno3Yql-I3ij1aEqT0 zMqUj*t8&jsL-HeO4Gxo4wYEvhKR-zy$@5?FA(<%Kx`vd~VaP_E=QbUZ^8-5O8Z|!$ z5*!36%vg!;OHcs_5Kd5z(kRg(0_c^70)pBmlejqD?(XjC85C-Pxl1Z4;)#liavd7< z+s{jhut5BDa;oU(JK8{@5=1Rfj3cJMK}597PDE7H{o>X(hswwI^9|or@J)ttfj>ii zdZl4sNWm=fkx*wx2LgdZ!iGQydu&kLASNDu_n7!X2!t1~fljBLxd(Y?AXtP#mU>A> zNN94|Mw&g0C~tmRe+wN!CGZ;ikq*V{uD&PI(uqEuUA-MlC*1Xk>t^Oj;R$;JER2)D z&H3ymZvO!NvAp?^3NZ)a11d*I2H#%O($Z4rcUCie5k-5SjE|4+bn0Mze1NX;1{WU~ zaK-KHr%KtbR&%@Nee_vjVUPIe=&D8+Tc;FeNw{x*9m}y+trv?6ai)v2gZ>gi zTDAvfz%dimzt_g`a8GM7z73#dsIwYA-F!-GEfD-boX(&Tv+LmM>H9K`T2 zu-Ymq@+Is8JJt2<^P!#y11ArUSCC3Ul`Q(( zHx($dy9pCesGKr0Qe%b#z>yyig1nk4g3Ha1b3 z5DSYarDPS0%hqZX5--yJ0vl&wVF8B_0Q3nts0BW0)H;wM;`;4_CMRUK*m0XRYM*S|`qSDfOeGUoB>R%(<&dGopDOx% zT#SoE<~+zT0D*Ik^W%Mvoq;q&?dp0rY_GkJdwSAtuke$w9}Q*h;Q)@QIus5gjEt%R zBb%F>D99;`+%%*CFr(bGO-k5_REsPQN_45j#=bdj0`N>LNiI!KRR~`v-U`4BPwbEm z?(fpO_JR6)9pCNe0z0dPZN>rY|2D$Aqob#6HW9UP7f?!d|uOicMEwn)%Cem>_o02w_B8Fb7MCe><6me0+Yk|QdV=%)CqJ8sU%Uux_6hnu z#7#{e2XT}i_gPu0WmMz+3J-3ly>}(=WZ*>Cm9wrHwJ4q)2@6v|Q3cY-zAl+}U!;Q- zd04L1c@5XxAVR!1qQxReagD4P;)0NJFZx=4@-#%au4J2l$$=$?=U0 zkDe#}gU?^Y)-Tn2RAAa0->oe^agmcRu4{5ka(s4Xd`AMSbZJlvLZ<7F$0jFH`cnED z*2H{J^-4#OA=&bYhDH}T#>*FhcdP=}$GM4#Rb9YhmPR;8tvP-Df=D@+NOS95|Lr2% zdVIVEK}gh%I2NTP8DWnhMrJtAgzuXDRhADPw1pA1rSi3byo3~15(UY55Kpq6p8I4- zNDxx=Z0WwkgGW)LOv3rd{Jr2SivQdDXwJ_6UF)rzrUM%?QTb47g0TvDFlqr;Z~coT z^%v%DDxA(VVdGKe{@d*|ux}KUz*^6)scRTtBT_;M(j|CumtaF4+Xz(Q$m!*y+AB>~ zwWS!N_9de{8~f*!sw)4s9VAnDK!s?_SNQK? z#2KoR!`_cdelMV5l}ZNrNwIhAsm2gql6+0X@o~>ClojOVEEtK1+B(Abj6q%!%*_ir zJE}hPp&>!15#ykjvtWlEwBXl=1M>EQH+09M5woz-Mu$sF1DQd#nD$y$@v9iJvOTJK zcYfLEZN|tC32RzZnTCmjqBH`+g2|eONf(~UZ{`0?orgm{<^&6?=iEGkB+fO^IRi`g z23Q#7G%1CC*27z3Ome8v)P2rOM_d1#Pt~@;VT40-jE3`uU= z3k-R=gvUfg{0fTxkuk~Zxq0g4i*?WpoBsC?k<+sL;d9oe3!%9M@Gc7x_`F-eul>~a zr5I5W+RB`6D{RbUejRK`_$Sj{>~1SFgVZnu&JeTC;% zSo%(XM%a8`8s#_4>;7I?Zyhhom@CRtxG30{2prq&h^q=|@;4^ANv+pKMFWTPf*e~h zc#O5~y@@icN9EE*jiSPsxHvMh`PBAAf}M&CFsE(*H*{o*C;+(v|3z81z((%lo_r^l z`L*lu%#o~0YWL!!lrp*W%UC?jEc~o2 zjEUyp``&^?&dw;}7bK8w2)oLzT90^aWpLdWb)cDB!x6#1#f7K+P^!`#Gr$RmvY|#I z4fWpXy2#X%FRvt9d^a*>Rtj&tP_NRB{Eu2OLX4yn()eV3zl|zjE!6a3-a$z@ z6Md`{jYaXcq7*{J2|B~(8n-Q^WTd@yq=PrCdLJv<$IB)(hvP+K;$tWa@Rv)QROVF_yQvI3yetdd)u`GH!T}W4e3&Km>yIbDF zUp1!Ry?kk@*@=ev|L?M#PdWNMfj6t^^>H6>Th2pyx&7YxFI6^v3({>fGsi-toTvwD zD8>Qy!{6XsqzB(77}_fx_!#8l%&qrtipMAD1Q*t~`c5w7|7d5#`|i(ETtSBK;CM!{X!;l20!ABXK(9 z41w3K2eLj1%#*WB;Z~r(Dy_9Bn(;g1&w_Msv8&2pvBhsCGB&J4K`}}+T+HnYeaMYG zX9Yu&&Dn+^iOWZgJs7&N&&C56I)kzTuIYW^-)xaM!_#S^sB>jqk2s%*&j#r;0 z1`a|lrbj-|;=&DWbYK^JluLrTJ2u^a7U&tw?1RXZP)DPY=CwXEv?0T^pFIm$F`P`cyFpKQ==*= zyV%b7LX{y_Zvl#qbU!t& zgIy$!)Jl)Fx4A1i!Mq(H62c__Z09sr0b!p*+U7o7#JHak|GIZ?I;=AjrETC)4O;@~GQN>9kdD#E(sKy{o)cGf|9hz<3r_fb(D z9O?y84>+;YvY5--mRKzNdUgB0d2F~dmw3avG6R%X1b3~16E&%#?J({h`D#9Ru*bNRc4tKlf0-NBY*6Qf zvfZ?=+%SbKq(CxB77>Ox>C~>srdfKFcE|Ju4Wf*m#8wKI3=vEBm9L=SM`5g@)L7}A zP53&FeyEx@%usq=6XD)ss4eC1) zF>%6{5VY8YK(Zdf$T&AD>Fx^PR~kW@u*matfZu*OE|p@^KG)GWTN?ZOCi&}&7wLDc zj<|Av&Git8Nc#O?%eMKxv6<)TIM;l%bTshkSwVDc)z;)4-4~NL!o#ZXsFc%nhrhPb z^<&)YqISFqdO7b1#q!zC{KIpoz(B`KatKr3lnx)K5145F?bhSZZf8+puZb1>Pm5L$ z(+sXI+lKR83OpFAl%8bv zPadajqroH3s}@D+YuEXQq8bq2axvz%hqQLSlHku?xV0#WEK}ta!m14`u{){&w>X-MQDh?hcCHtN%>BI>>3!Ko|rwtA3 zH(!?bK3n6=c7tuNb}-bv?$k@-9g>j<$$k()^()R^rwI~=|(H|>w(@`dh1af zou*X5rEohLsTVZl3%^-;eN*4)argO1_;KhfolKkPhKIKmsV8s0B_z3}a9pK>lJ;WY z7Nfk+>0fqap;gAlH+?8Wgc!PVx)(YlosV}+p#_PNjg4*K!C_6*oe#e=LNSr){bsGC zM?o7jhu~At3gT2~wATT&ajgejSf(u!sSf%crk%GKHIg}b-W}pYMGd^VAei_VzSzUH zxuL6j-Z9eJt@NhnR$?im1r7&8$vRcnCz^K?oe`vWOmEphmo9XO5dW;P$Ca#kg`6GA z^4$yfUpazK4`|UegMK|^L)-90M|U@fg+>7qFmHf@f`U{QLqkJPvK|SE`mh9iYq``j zLdo0kIaE9x$H$2$jIz^F#HX1=7bnl28f{=h7c86Py3Q6uKo*Pm7V8Xwng9ZW@bpt7*Y1~mF#H0Ul0 zU>FujGM9TTv-q9$?vm@K5s7i(u^H%iBvpMhYF;83`kZ_BssLsP!@(ZSRLO{Yj{`>ujjDbN$djs@_@p)|Mz~mhB<>i@U zWGA|$-OrDY1FoQ)iW-RQif{J-fv*L+qaGFd{myVy^CL!7mw0CV zIni$h%O>pBfaY!AdinF*IX~aehXDdTR;gA!MOex3pJ6Fs5p3tx_$GR4&W>Pgsk%C> z`AzPQU-eQQ-RXBH)GZcyMMsensnL9q(^wL}{E1Wb09H#Mi*OJvZ%{<*KDU-RCkDPCWigYUU{urqL zedr8*fXD(r%!-*nPbH2F7IdegfE-kBUU3d`>#2J^hLy(MW-wazrQO9lGajGOCrPg6 zLsw!sxzVomI1mP078&44k3oClq?pYw;cSb?_5IVdsREBZh;7G}JrX`>U{6%Ei;@<^ z(5IC0=Hy83uN2G%JjJ6xe6;7(e=;!KbG4UmXV0OpHJB&hRbdxGdGGJ2bTqv`+bm2R zDhBvIb6$?Hvs7O@(kZ?6MhF9RKsd53Q;1JclU0G9IJep&7+?a~+$twbjT7cVpk1WG z^|$gx737=9nm-icwYYfHzbD}=MXePi@n(tYo-C8kearb+d$!JN(nlr|o(dgspB3_* z&9gPwwR#vvh@=J$AmrS3u~<8hi9jeM_wacv_o30=gNix=6F-&bRh@9QIx9$mK|>OE zr~Rwt^W$G07#c1&F+YA>Fj-F6HY9`sCf&XMUA=r|^P%5zCdP9FOHJ)5+Q49aV?A9=aC zPSE-c(>Ta+Cm0p&d?IlX4FBdpfrU-&U06$%mP58iQCm~Cxtz$>O7+ml4E(h;`eX1d zH+c%5hleC2N~Z@I9Z^`X&6zy5lZm75iR3pMF83nUnZdVvjej?5gAO;BCthVx@k_^~ z=roSGRNEEiOQMLx*j@R5za=9Vi+Y_Jb-RVLJAmdsOQbIeZ|0%7__3tFalz4B+ddG8 z#m`eeTc-}a60l{A+FcdpvrUhI~ai@$IG^Oo_fVWV34 zRJB~$RNe5NGbL252oDdX`qT2gcIdDnTmLDaK^_6>(r}-nRN#Dq&x|0e;HEe zbJvIO9~iWp@%Y5vO~ED(Rw)jdXqE7ZZS~a+8+^O$T5O;jR;phuBxJuRdot1NQ|;;d zY^*Auu)SSgjzN0#gOuBLnHx!O<>9`NzKQ#O*t@^bwS(-D35$$;2xA;Ohf|KoGFzR` z5zpcFY%C12B72OW&5;%Ikauo%B4(Qh??VYN{ZFy$yi`{oxv(+>z7e#neSwB)L5?}S z_x!*@Ceyszh+A8)P`Sz%IPMrRaa?}Lt6ql)tD)Yn7gcMWxF(mrlP=k#sOH_hz50WL zX+G!q3ROuBmI@{Zw(F<*z9%=Vze&cBia0awCzOjnM^{Y0#-)Ss@em}+<|eGR!i|$?g$7wE#W%O4Bh1otYut;^Gfxl3Gd8>5{HkZNiSdWu zGVot7K-Txu19>^dj={HS<)^9Cx@X?$+!d!}aZAuK9|N<=H-W_>!bi6*KHuyTaSJqZE#zC0sgc6;a0~_c8L4sDn%A4=+Ux+&{|%-5hG~-=HMdm zgNDnuQv!(!TbyMvPOTnvlVQg1%nX5|mA@(;BzJqbC!s+vtz~EFlE)T$!4u2^#mX(H zTFwL*E6?0>d%w|}_KQBC=lH&RJjQ)c2g!Jaly0E*Y!?-&FNeJ4)>o{4k}o6kb>v&V zJUeZ8)1$EphQ4F9!%2dBYGgDI zPv?RZU+>*`Chk~G3JIcs?GHBfsUi)Im)@dwae@Ka-LWYHYqgG?w2x<;mcnT2@O$cI zN=_oI#>@6P7Ji9L34_>P)c(>kvS+f|C5F&dK`{|+fmJD9hEqN%ezueKiQdX_fy+Yh zIZv_1NxveQ03 zJ={$2TlU;|tsNHbQoY!{Tvy85@>)BHo1H~gdG2W7Zk3v9Uvjco3%l>dr;J@+NPEBK z-`$QVYCbF5pz>Hz9OHD-jjR)H`|?nk>SR6?#7Frweo2+rcC=p=N=}*vv>@?`Pez7L z34fZ!uIQKWYZPD@6ZcbeZLQuuW`nhAHstCD5nKlm|L z(tH(h{k!#2D@bSD(~W(^)%glZF~L2eTeB%IyBa+)XT0TBt=Sr(F~{N8>**=GI9VqB zEG6Bd0TL>qMC==lj_O*IzR=y{dtw$Vr4R_i7N>Om zz(l1>|5$&TyquJXY7XkR(sZuy%Z;>=VT-r2=5NU{rhi$aRQ5dj_k{c5JAP8Wt1Nb$M}yoKgRpz^X4?)$}kg z&iJ3{k#5=Wt(AE78Key%d;ZeEH_tV>?ZJL>~8eR+MG8yj;lvv*`55M3yk98^7~ z7G&|(%*+Cn|7lbP`uC?NXK2I2RSpNy)KHtlsdtrArW?ECoMznPgnw?c z)J=f$?ATm{;{2CLKGS1;1DbE|iJUgyhz9g*nk$s$3dEcdm?VOMPsV9`K=2S4RncY3ZIa20OBmJFhua##d5@P@M=?#-_?-np%DDPH z=miE;Q2X1vF(LKQsX$a5eoogb<)Sgi6(jcbg{r*O5Dc|j@@nUP1owq5LOK}1V4k)w zGir{278*U4Y|$>VvbNXmMXC?|pOW!{rRHvUpQz!h5a4~BrmSOk6+c0Dazp?8B`M~X zUkVS(lgx?1ZRhYCduBiK6(k!yp!#f6eF_?7rnnyt3`OLB>2WV<*0`z5I-PxBKV{Ju zHVVy1=2G#qxp~VCfByVfXJkx_PU&}OM@3e6cv~$d_kIob;ZlgGX`MBCC_xSBX(TbO zb`k3N-vk=Yky7f$^>}A3UBPv|2*;N&JW;534e|K#V`P`F|M5KLAd}g(shY29L4waX zXt5{X07r{Gi=q@#DV7jA)LbxC>~-I;dR;u-#9qwi_cxAfQlWkp?Cts3(pQ%jif4cc zQa3|z06)im6l0d?v-X|%pI0jGX>#P}F+MX(3V#H@UnKie`o_M5`Zy-bakAo;h~M)J#pV}soQTHs@^}LKxZDc$ z{E1AL(kJ3585w~^>R=6Aodee??rZrQN7G$TOkzI+bP^NM*%VR@S;`)b_l!`7EaR!{rs?vf*ZKn53|ZG>P_B9Q&IU zqqLR&XfsP2y|Ry025I%Z{c)BL&l@-diMf#$Hyix8sK$t zFs>=bC*tb;AWH=8M>(&$w%%SST~Td7t8Zn%NxmiCX>>&VmhfE#?;N)g(pyPo!Bt;V zod3QrVSO;hDX2*n!KtrhRJ$Q=<|BS((69vb#521-EHXjLqK^!^`9^JUo_r4+H$u}Y zLl<&Pez1`|Xy9L~%U{haZ5J-mlr5;FB`fBqckS6d5%%y0S{BDnl#V2{_A`;MY~K8} zYH>yr&RoLylEnEHa2Qa{|R}o9B+o$?#CHHtanDz+-plv@$J9yQ8b2~)LC-DDOcc$@NcVEB%Aw$TJNLPla zD-n@2P$K;d3CWO1kujIdlrmSkgp?Ag3?cKZlE~0t&KQz}WR@vIWH_Jgf1lSm=gE0; zKe|2WB|pC7-fOSD*804c=HsyPtz3b(ANW;gmDCBp50^bq`T3=wH-(K~C#v71rzcl2 zc5iK!xr1cPiwq;0dU=tI6BZq{naT->+e-1Wp3bvcS5#Cq^+x+?nW-WQ<8C!ah7VUS z)bYn^@ej2L@+SZ3sS1=Z*`+YWCLmK^#g1HhrUCy!+Rgiw5(hQa@A(bg-~JR)>v{!0 z-6V@z7Q+bdCEsi**^;7Un~tXDXS_4B`(l(0V|)aDV}spwxaC-|i0Il2ZCbCRusP^^ zIi0-RX|=94lOqQO!eyqVSdUJoos#(6=W-(rSM=Kdgigi+{Zjv9=b5?pYipLYxBLo= zW|OhqPS@(QayBzC@_vrF-wWHmf0L7}>nbGAg$XaU82GU(d{PjMtgDO4UHDagyEOJl zYV%#$&qapbi{oAFhnAiX%SZ|-RS5L$oedorwSZKbhWJ95g@n zxK*%4)+U%JM7{~R$il+;w)}R}oa?-^VP#OIUVnXroTXg4V$1=9V z6V-UOG7$4mNLJFv$9^<)7H0SFD7*|lr5?g5DwnsDD$SU-@#eETTqh^5MISin%^NL8 zua}u#BUDvxX;Jy0{D;M+m{5b`H&TNC`rE{_u~Bh;YToBtUyV*t$;35{F~x8ZDUQLG znyHNeTboBdpL~5!MMd2<^BZ1XB*RC$i%}`*#-g2;1NHl3!hflr7t(PJ^rk)Z71~qg zvjN&=D1%4Ekjnt3@6zY?V+P4q9~07=e@`x0A8^+``Gk z^eF)N?hx^yDt5JxS~L@mhGQ zoljh^b^Jc<`wz;mAEvz0QTNYtex`B2ae9Y#Rx}3a+N-l+^(kB;({^R@&TB4w(QAEW z)2LL^o0@1-I@l$ni+IM~USE<|mQM8lJePA#nJERfUn69qeDi|9Yc|Jz)@-ZW#TDz=BZBzWZ65Y8 zZeeAZ_w*i<-Lz+_!y%O`RMb!-2!JGJ?}Z@|fNBWv2y$40(E@gg4Fa2%$zY|dYB?9~ zA+0Fib(=LV@x~pZU!&Ii=i8gy@aribDr#(fN-4e51+%~I(@)05(_Eg58^5DrJ86c3 zs7+i3@i%e9#~4`eemH$1CfqQ68Z(sxHBMrm<9=Ag+8WrrIpkP+NKznMIbl#dj$-!qXlHii%1s3-5y}YbM7)^Y(=>D&lB2HX=6T7GI{h^E8Ho|WPJCz;ZGj&%8K63=@ zZSYS}(EYbo6Q)?)1B(@;qdM~authNr$Y5RkyI0mt-J8j0>edFPs~1|-d30a&vE0nJ zr$L&2zr9*bKz{x(wLOOeLwfuXHy>XxgwZ|7^tkup`}tqDb#G7<{h6EW%v;1d9-eEy zCvjG6=YbP3nR06l#(&!2=RZ)fdeIf5__Q7~EY3vOgdFj|e|Jm9maGysclTtiqv2!M*)2ZI z{F(DhiV5GX+SpjGphdm$oNaU3=9IneQ^#!FihWFYuCT5>85Iy*Hp&vJ6(x5b%E&uk zkt3BK{92HwbxXYYjKi_Ebbl6o5uxhN?lLSVubgu4M&xKjvmTH=X27ibNWoRnv34LP#3cgvPNhScr+0WR&cB2R!YS~`YJLrWqEc*Lby;XD>;PE6=gqM}n0nYy_ zjZ-dfw|2}<4=B12%6e7inR6c~bG|KUmVC@9m*;a`A3r`6*}U_WRhcBMV>yNA zuWPKe!>v9lSNd^Mz(eD;&6|bPujL^RG9xS^YrV6tLI>ygt6vk5^0IH=1VEr7Iv-EZ zLuTgYp;*o#@%)}sAy6}W=z5ti61d7KEEOBBN5fT-ZLZ6lAOmFR<9^GV@mwMnzE0<# zB~~k$BHsV>X(IpWN22m)7bKGss~>WPe9*C-zA!X)dF;tNtNq_2uDv%m2%#Vr1Q6NM zi5~wyb#I*MC#GnjFNNSD)pIe&^XVFTZhOI; z9A{@sgIv8rdN4u6ojnR+$l)H+hr-+jc!f238jT$-xV z?<3gL)3j9im1lg9fn7(noYvp!YC+Q>{Ha_gk394eQu5z#8R)t$a{mdp^>NpR+D;S~ zAq3~Waxvoj+gXTr|%l_ek?3uw=@$ndp0}H*qXU_?0?(CKJ_w| zA^w9uYJ4Wm3?EYg`Wd>H<1L@<5c7!j<;8N=$c5==5qcu1Rg}l|ng9vCiE(_u!T`DGANP?@?pQ?3c6Aacfh}^w8Ax<1(^YV|N8ftYwc#kuOe3qZj;`{yb z+qZpKSBG0$H4qpiSzwMV<7dRhF=4KwTwvf8be>vndU7uWyZ)ZB--f+l-j+*cdf$HyGQF6J?Zz2pDXDfI@egO`hy`C4T=lkGz$tD`HwNu&L61tuoV= zpodcyNblc9XkpnU z#J$-d$yW4>t$Qd1VXjZfLK`_wWijlt*NZBb_FCHO*z@*XTey(0SioyH%Qu|IhlXt> zYKu7xvrTFE`1yCc4r&u-j@uJeG0-8v4&xLQjQP3z`?tGZvbIpgEK%$^IaOWSD%>IE z`Koqt@73oTBgg0G>J@Z+SvLtANI`)i9qA?11Wz0XqVMvW;|JB}1>fmb9Wqgms$CnEC z@)rHqR{V1B1zYCb2H2z=h;?*zg50-8U&GC}2=$smCLQtz{)DLmQnZ@+At+eLHIex* zM*)h2RjEAZP)(b`>rI-E8BmDiIv6V#dgad#t}UW#A?k2jFDxu3mKRgJUs5%Mugt*2 z%ijS-o1nmI^CzhtSjQJ?S6xYY?HbD679Z!EYpE|HePX`@?cu{v8|mET;7obnWw+`M zIlGXF1>O|_>7uHHKp|Ewn=(~z$E8c9E6XCiRF#mh7b-iF?i{{nj&OP-)k*K&d_HQ(_urN`3{WXk_J)bi`%x5f|4&g3pA9} zATO^Rtq3rF?Yb5yy>b8oIl&9iY}QWE`J22*P^}1TLtk~9uymk+{EvTU!$cJy?^BFd zN#%;XGyjXm!vj0pmSYeKoUYAP-XK5+Hb`_myI*!~)>96`Ut%SM)7b3V4^rSfIK!rA97JfDlJQPC8 z2DFzKs(tsdf`M!>*b)*G$*@WY+Ia3Rt;MGu-76mPUlQ8$EaiH0%(2rE7B=5gqx54W ztE6;(tr~^0S%dTlC`Sd*#QZ=^?=6w&QWOg9CUR$Y_wEM<=gK5Y7USfEIYWa|Ov7l`{JL_X8>iqpvbQ+{@y=;f~e>jEmn9ArXBpRvIjz;z&qnJITF6zI;fmKJW1>>PWNHG~&@ zhK3X?LKHPvIXG#;MC0W`hh_$8o*Z8HV&0L7dub6@-zzH+YBCtM$BP;sE$$o zvLC9}1iAHiOrJYyPT%sFOL%{xSD<(; zRDSn1FHhDomxEjoYQE4=->47gc5M~5t-z$KxZ^G?%+gr6e_}YTG~pO@f2qw6%YSy1 zW}a=DdMA7%pz`&kc{Ca?Kw*Ytg46{LunAL}dAl;tD*luDJdlGk)XiK-iE42~J$y~^ zyb43+iRg5>+mrMRL_O1znxX{)Q)0Oi4)hi|AE>3$jn`i6OvSGxB-L!08Hm;;BXzoz z{08ltMd^lo$%*elkn!Ops;7A!dl?EXp`T>t0rQBb(v(vCn|6mjGq0SU5tsN`Z4T{B zzJ{WL;cZlE0^{nhRCn^9E)n=WV_-UF++q{BYlj+-^z(d!|8tUSFKp;EVs-_sAO=1x z<9~Tp+;M8#>N(c09$>8VvR_g(?M+tH-|IysI$pa*QB{S$o6K%CNpWgGfVgpvS(EZk z(Y3sLnHyvfw%&z^Wdn`lrBkbCc}s4E+1;b2dq(1nuVe`hVru_w4I5wg^EXuL%bWg8 zoS_c}yG#;i_!R^WI4QY3TI?v$wOSf(JW5Pi6BoQ7;hj^H6^bpXzA-USatU&p-FVl>^e4cC1+;&_9SdkR zBXU_E?OPU0hWXHKa_!vzd}2yA=_)F;#^ii*uwqgOcNMt$i8QZ8e>(DztT$zuneUa& z@XM_pSS*`dvd+<)l$4ax{*S5me~>5kbrUk|)m(get>l9D(uD%gz z@+{V8kKnS3S)m!abT(n62x>Z$Ag!9iV&E;`tPuyO{e?F3P zySGcbU;2Xl4yI%y?qmaOlyRlER-4k(L7f1bJ_py9XGt zvJ_rQ`N+9xt?}#k_J&mIdom)n%h=F<%1A5rIHk?e{hju?P5eGaPJj={XAHcoO=45; z*cEl|z2@`tQ-qpz^82tfCf5~Ha+6zcveE14_)47l#J4i6-`yZYUMKY$xtQC@#+xp* zv7OG>`Z$TTZS<$#SZ50#I0UswHQ;)_4=~=iL5YwY@fnTX605%x9@UCD7iZ}F>f<@O zFhj@3?>93tBR}@WqcmE6G#vWo6*F?uqsGR*-`-fxifcBHzw(%+R8>8B84(b${DE9? z`R{oe2x2)o7x?$!3F#lVhpL=H&iJ_b8H;x26K~r<3kx-&x2-TqS2vY<6ZcSVqnF;~Ut9KEPN4GrB z_q~n(cVnfN&f%y^0@?X{N>cPSbmaiK&$)9u>e1^D{}G2rtzGPS z1xh9Qxf$NI>Qp@@{ZtBK!y~PcW4zEdq0vG!KSrTA7fYz8x~Ap_P?_$41NdVBwcv8m zUbBW+CBNr)dB4N9i3E({Q4Kx`3)r!;xafP;TfJ}`Ld^#FDSE_32it+Lu&|$4yhRKQY;vSNi~<{= zc%1>Zro3xE9`|7$VU_h8H%4SI(cGPxgNJV%vj?eoC<&}O(G%g~)Dw)4z5zx)d1k80 zUk)+Iq~1};-3uEoP?yLON=W<+*LyW<=47@W|ADYX7cMH-XBDZrReDImm_VCXM6+3H*i!(CtI-S&o zyTM$BD8a~=TsTZe=Qq{o*Z(mH(k$Uzt$k+$!gd<4VdJrh3klJn`i7AL z9QtO0SUZ!Sc{1b()k4hM8}U%->!%`iDR-G@b2P*=np!vi9HUaFcPs{0CZPliBb&5E z7#bP^-$0Q{U4z1GItt-Vp*sePf`S4Vq~B4$U0yg|9E586+?MMBwdeAz6f=yntbI8N1E=-!DvR<(dbXiB;CYkVzmVI+<&{_6-%7R46~VBl)mP}xDS!Khb! z2f*UwH;-{qEiG!;elpIBR|I~qjO_I1*|1HQ_VTdBlZ%)KQLK*=ZBmckMb_pT`gdSw zgl;Esa%`OK4_P)+1O;ulH|!*Zl8Q^{xew2n0(XcCa0T~N21++ zZ3o7O*xi%g$hX|*bI**sIvF=0~j*$4i+FF_s~j_#z5iuqdn1r zyi787%zCL7UyX4wUjO;y{re4XWJ`7CVQq>!NQ^FLA3K@n)#df<0l{lR1SCHHV&kK% z=aM~)qfPw_W5#LOoUvIuQKRgPGA$iEwOA+f<{#vQWJwLk6+Oqtdw}C~$vKATfqxT^ z2{pz4n|=)IRv3b*`1g8@pyP}f$NGCEKTkZN)WulmL;qW?@So4JBvGWkTnO_)^Gv?Ypnd>J{avlOp|+st?g*~t z)xW*+Py71hbMhW@>7|OXXZDwt9XU(RX-v+!;{?O?^ykHvERN#>c>IpPrB+8!5Aj3d zJU8uQedTq=Na-b6nJl*)#MnB&L6;xx8N`p?{;NsZ_NS4JkWJ@bj+YIh0`Ws`G9-6& z!9+s6J3HDVj2ERRvwEH`=x|3zeZw|{u;a*a=iA8J&6l=Jpvby0CmZS_W+R+yL4Gw^ zv3PMk#58Wq_=)R(eu8WTS)r86{=?3sCcxn0|8N`sM}JdjmP*%9BBM!1!4^Z5IB|H> z_vSq$e$8#>=40X9g$aXm%!!HmXm4HIl?1mjAMS<8Gf}aHL-1j8fpuzEwUM=THcl?f4q1 z^9D^SPw(H@xSafaRdgxQPUrRbVz~MLJ?Hm=7D2`|g81SL9s4hcX@Dznoygb!|C{&M zGEgjnD1b7G%Sfb9Vfpt_w{6nbz!^t+z@o4v^XwTnaj_eqGQ}fK4++=}>;Vy+zWdWj zvsuc#oRu)H5MQJwX+@C;zOqfqmMOV>1O;TjRUpcz8y3z?diz{xP2WWNkU?A=4;~{z zk##RMot>r25p+j$B7%}%T9`TN=~)!_UXNp5w&drR7d4a1{PI_y$Gva8?H}O30KLL) zo2G5Gkntgqas;}{h8MO5+qP{>4pC9j&N?S=TzE-hWER=*TpFVxcd+?Gt z+7Sgn{jn863lf#bw|Ork4>$>fw@o(tH*Vhij(`X_-dS%yg_+>8DN=}`UmWkk3B}Ye z_Q~X`Ap_oqyL>z|H$Cn8vAJ3IF#^GF^(JDGMp`ored;SK8^rXI zV*#??F;WZ?stv+wUm$JOrzR*ZjAL+VZr*Kn13e8Sm2Xu(gyK?$VuXG;i8fP*-5ebo z_St<2d+`yqN_#0rr%yjjeW<6lB42{_4~X;@KrFMQ9{e;73ZN%G8Nio~DY{ANe=s^5 zQglUt#uU|1DR;(8gqIeF@*-Y2*B!`C>Z=NGJ%~02q?6T~J3xJ-Ayv&>&V$eS4uS;O z3S1{2`q`Bs9;T-nrvxJF8p^A}LOKfR8Swo1^NZu1Ab!5<=y*JSmSwu@*JB&JX@Zy? zZp*p@CvY=Bth$`_!%piwSRi0_OGrw3_wL=+jwSG}NXL>mJqvMQ#z^1*PEQD;4x}HO z`@&F?6Z-Up?K*4Zc1Zdj)Nqu_8LubvyoQ;iF^5A}F+pd7vPL?05DyUn5pcQ;`0q@K zZruu8jRsby4DAwcFUr(62}r5nmBGxvsP!n#f_E~JMc!OXRstPGIuO7j%#xQW&ZPeBp$6g+bm!szqRC8Irn zUqpmK>k{F?Asmip^T5ud__9RJyE+GZPcJVT-*FQzQz0`y(rOUTN*Gbpkzzzsk;#aM zOrH6Es3>v95N1g}of9{_!-7hfz)%jooO6Qn?7gydx%f^-13XBg#V)=h;hShf7^Q?d zi^|@&6%`^Ky@2NXU%!6z<(xgRZWvVa-(FCzM0I_IO{P$~O176~8uI)DP%rOpvo+D4 zQ^#Z+zVRIo7bi20G_h!DOb+3cy)j(tr49${cSBNh>Y|3tO$Q& zgOIfmz{@W{^|l2uP>=ssuxWRxpAn?PFA%-6gmk7P5+bz!z2>t{hu0_COboa-qs$(O~Np~O@+w1mJv};PP1nC?j z1a4)}edc3h@i+G&w`ela_F<35P-uRfPZ5kngRj)DA791K>;&(DA8d zRAYpR=`+KS8$1by(@R|ZN)<9n5QVRHT0wx87CRkOWV2(Mq8Vk#a!(+(K*ve06OBI~ zx^-d5HKOeWrq&K5GpOwEG7q>*?u97TD3R z1;3tltV0P6Ebj;0)g%Tw4TY?Xm=$rr9FRwfrcVCY*7krILUviC*Cb9wp#b|#HuxYI zg6<)lMuFLShgnIXz&Ch@sRvRZi~E%;q9Ewb|2q^Bq?A6Ex*DI zp>Y{7kYr5v9ViE)p{KX^{?B64^b6|L-#_l3kn&!12bE)B=Quuff&)P*CAD=JE~G;W z#TNofKCB{Gi7LMoW8}?$!ER^hI`P+ND3HC=P>{-~e_h|wvbW6+%{%X4Vv(vRdbx6+ zAP&loQ|Y`acLZ(|hhp2dHCt7JE8B{ruk>%CloI2K;-KmAEs7imD-4$Oufirv|hnFzY(cH(u)R73n0~gTHQ8LmhBAP9mPLj0+U8;L{7*yY4xhAsv;@I zrluz6(VZ@rG8o&0uQ;0cipTzrZD?pnkIZKllabj#A$@)*rKl|dcfXEA`gnZLVp?8& zk4ceNu7Lm<3Cs8_PBP*x6Fp1OpRvM+vMyFH2a2F&bN~6GtpS`@GGgY&yDG58Jhk}? z?&J+T@rxbSyDSdaeUTvoIh3c8uC=e6dK=KCLodUK8y%GZ#;G8#4^?#)UNYF6#15dh zara6RX6mbg0s;@GBqXb!IAKkmF3qc01co2f7&lBDfwO-DJaH)^1Ggw_q8B-n&OEL^p;I#TTo#ImQ$z zyCJDrGHs@QRFMKXcraM#YcJ9@{?ftq0++sJ#||dSMBTx0Q&@&qZX-Ofo-DKM2+h7; bP&m?gN=57En%8LHO*y8lMa@()z4pHV9!kJQ literal 0 HcmV?d00001 diff --git a/images/mlpy_findpeaks_win.png b/images/mlpy_findpeaks_win.png new file mode 100644 index 0000000000000000000000000000000000000000..f7214b036447b9a66c92a35de209ff9532338fda GIT binary patch literal 31589 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�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 literal 0 HcmV?d00001 diff --git a/tests/install_mlpy.sh b/tests/install_mlpy.sh new file mode 100755 index 0000000..78c67cf --- /dev/null +++ b/tests/install_mlpy.sh @@ -0,0 +1,27 @@ +#!/bin/bash +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +MLPY_DIR="$DIR/mlpy-code" + +# Pulling code. +if [ -d "$MLPY_DIR" ]; then + cd $MLPY_DIR && hg pull +else + hg clone http://hg.code.sf.net/p/mlpy/code $MLPY_DIR +fi + +# We try to install mlpy on Python 2, as the install is not compatible with Python 3.7+. +# (CPython must be updated to support Python 3.7+. See https://github.com/cython/cython/issues/1978) + +# Installating dependencies. +# We also install matplotlib for our tests. +pip2 install -U --user numpy scipy matplotlib + +# Also requires http://www.gnu.org/software/gsl/ to be installed. + +# Installing. +# http://mlpy.sourceforge.net/docs/3.5/install.html +cd $MLPY_DIR +python2 setup.py build_ext --include-dirs=/usr/include/ --rpath=/usr/lib/ +python2 setup.py install --user diff --git a/tests/mlpy_findpeaks_dist.py b/tests/mlpy_findpeaks_dist.py new file mode 100644 index 0000000..4fe4602 --- /dev/null +++ b/tests/mlpy_findpeaks_dist.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +To install the mlpy, you may read (and run) /tests/install_mlpy.sh +""" +import numpy as np +from vector import vector, plot_peaks +import mlpy + +print('Detect peaks without any filters.') +indexes = mlpy.findpeaks_dist(vector) +print('Peaks are: {}'.format(indexes)) +plot_peaks( + np.array(vector), + indexes, + algorithm='mlpy.findpeaks_dist' +) + +print('Detect peaks with minimum distance filter.') +mdp = 2.1 +indexes = mlpy.findpeaks_dist(vector, mindist=mdp) +print('Peaks are: {}'.format(indexes)) +plot_peaks( + np.array(vector), + indexes, + mpd=mdp, algorithm='mlpy.findpeaks_dist' +) diff --git a/tests/mlpy_findpeaks_win.py b/tests/mlpy_findpeaks_win.py new file mode 100644 index 0000000..203eeca --- /dev/null +++ b/tests/mlpy_findpeaks_win.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +To install the mlpy, you may read (and run) /tests/install_mlpy.sh +""" +import numpy as np +from vector import vector, plot_peaks +import mlpy + +span = 3 +print('Detect peaks with a sliding window of {} (minimum possible).'.format(span)) +indexes = mlpy.findpeaks_win(vector, span=span) +print('Peaks are: {}'.format(indexes)) +plot_peaks( + np.array(vector), + indexes, + mpd=span, algorithm='mlpy.findpeaks_win' +) + +span = 5 +print('Detect peaks with a sliding window of {}.'.format(span)) +indexes = mlpy.findpeaks_win(vector, span=span) +print('Peaks are: {}'.format(indexes)) +plot_peaks( + np.array(vector), + indexes, + mpd=span, algorithm='mlpy.findpeaks_win' +)