From 966bd80f92d4d4de7cfb42360b583c4a2a16b82e Mon Sep 17 00:00:00 2001 From: "min.tian" Date: Mon, 15 Jul 2024 15:11:13 +0800 Subject: [PATCH] support custom_dataset Signed-off-by: min.tian --- README.md | 18 ++ fig/custom_case_run_test.png | Bin 0 -> 111864 bytes fig/custom_dataset.png | Bin 0 -> 76838 bytes pyproject.toml | 1 + vectordb_bench/__init__.py | 2 + vectordb_bench/backend/assembler.py | 2 +- vectordb_bench/backend/cases.py | 82 +++++++-- vectordb_bench/backend/dataset.py | 32 +++- vectordb_bench/custom/custom_case.json | 18 ++ .../components/check_results/charts.py | 12 +- .../frontend/components/check_results/data.py | 24 +-- .../components/check_results/expanderStyle.py | 2 +- .../components/check_results/filters.py | 33 ++-- .../components/check_results/headerIcon.py | 2 +- .../components/check_results/priceTable.py | 2 +- .../components/check_results/stPageConfig.py | 2 +- .../frontend/components/concurrent/charts.py | 55 +++--- .../components/custom/displayCustomCase.py | 31 ++++ .../components/custom/displaypPrams.py | 11 ++ .../components/custom/getCustomConfig.py | 40 +++++ .../frontend/components/custom/initStyle.py | 15 ++ .../components/run_test/autoRefresh.py | 2 +- .../components/run_test/caseSelector.py | 68 ++++--- .../components/run_test/dbConfigSetting.py | 6 +- .../components/run_test/dbSelector.py | 16 +- .../components/run_test/generateTasks.py | 8 +- .../frontend/components/run_test/initStyle.py | 14 ++ .../components/run_test/submitTask.py | 2 +- .../{const => config}/dbCaseConfigs.py | 169 ++++++++++++++---- .../frontend/{const => config}/dbPrices.py | 0 .../frontend/{const => config}/styles.py | 0 vectordb_bench/frontend/pages/concurrent.py | 29 ++- vectordb_bench/frontend/pages/custom.py | 64 +++++++ .../frontend/pages/quries_per_dollar.py | 10 +- vectordb_bench/frontend/pages/run_test.py | 4 + vectordb_bench/frontend/pages/tables.py | 4 +- vectordb_bench/frontend/utils.py | 18 +- vectordb_bench/frontend/vdb_benchmark.py | 6 +- vectordb_bench/models.py | 12 +- vectordb_bench/results/getLeaderboardData.py | 2 +- 40 files changed, 611 insertions(+), 207 deletions(-) create mode 100644 fig/custom_case_run_test.png create mode 100644 fig/custom_dataset.png create mode 100644 vectordb_bench/custom/custom_case.json create mode 100644 vectordb_bench/frontend/components/custom/displayCustomCase.py create mode 100644 vectordb_bench/frontend/components/custom/displaypPrams.py create mode 100644 vectordb_bench/frontend/components/custom/getCustomConfig.py create mode 100644 vectordb_bench/frontend/components/custom/initStyle.py create mode 100644 vectordb_bench/frontend/components/run_test/initStyle.py rename vectordb_bench/frontend/{const => config}/dbCaseConfigs.py (78%) rename vectordb_bench/frontend/{const => config}/dbPrices.py (100%) rename vectordb_bench/frontend/{const => config}/styles.py (100%) create mode 100644 vectordb_bench/frontend/pages/custom.py diff --git a/README.md b/README.md index eeda249ae..120a2431b 100644 --- a/README.md +++ b/README.md @@ -281,6 +281,24 @@ Case No. | Case Type | Dataset Size | Filtering Rate | Results | Each case provides an in-depth examination of a vector database's abilities, providing you a comprehensive view of the database's performance. +#### Custom Dataset for Performance case + +Through the `/custom` page, users can customize their own performance case using local datasets. After saving, the corresponding case can be selected from the `/run_test` page to perform the test. + +![image](fig/custom_dataset.png) +![image](fig/custom_case_run_test.png) + +We have strict requirements for the data set format, please follow them. +- `Folder Path` - The path to the folder containing all the files. Please ensure that all files in the folder are in the `Parquet` format. + - Vectors data files: The file must be named `train.parquet` and should have two columns: `id` as an incrementing `int` and `emb` as an array of `float32`. + - Query test vectors: The file must be named `test.parquet` and should have two columns: `id` as an incrementing `int` and `emb` as an array of `float32`. + - Ground truth file: The file must be named `neighbors.parquet` and should have two columns: `id` corresponding to query vectors and `neighbors_id` as an array of `int`. + +- `Train File Count` - If the vector file is too large, you can consider splitting it into multiple files. The naming format for the split files should be `train-[index]-of-[file_count].parquet`. For example, `train-01-of-10.parquet` represents the second file (0-indexed) among 10 split files. + +- `Use Shuffled Data` - If you check this option, the vector data files need to be modified. VectorDBBench will load the data labeled with `shuffle`. For example, use `shuffle_train.parquet` instead of `train.parquet` and `shuffle_train-04-of-10.parquet` instead of `train-04-of-10.parquet`. The `id` column in the shuffled data can be in any order. + + ## Goals Our goals of this benchmark are: ### Reproducibility & Usability diff --git a/fig/custom_case_run_test.png b/fig/custom_case_run_test.png new file mode 100644 index 0000000000000000000000000000000000000000..8817b3439888606e12e1d236e9f701cdc26ea910 GIT binary patch literal 111864 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 -Ol%?X9gBp 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ТeQK^*YKpPvJ*Ug z&$p;O|3Gf=-E_hL_Ch2Wm{#8=ei%ks+>>vg`s{e&?;Vm^C4c?+$woL>WXNaysd|!S zl}lyDQWn+!>b_nXE4ngN!cxl8TxAQ3_OD$@zeBZ9G~bKv7l_Vru=n15eGbNW*S^rpkJE+D zNs3=sBs;$5MT=niicl=>fauN~Tj58F_EXGOs?vF;7j+66Ue zCgw@f}?m?tW{L3;tBC|~>0RZ^b{yV?^Gy3mLHMvBk0vfgEs*lP+L zUIU=Wk4hC7E!GMyK$?23Tytew4&;F`FfAlumBAQ(_%k1Ulrnjo#7lPc8JKZ*EeLrp z%368kr)Xv3cJE$QRI= zMQDAMazH<*ghyPsWCHNtH68|Wr#ZOw$U7lr_uAc=;`4NFQ?{b(uxm?)qCfTVBdOzu zHlcXf|E=QC2@y(d@(|suOhkzZ@q8h`+=ZYgsDnLq>XhPYiF|Z2sNw|)>{`MOmj7+d z%kr`7&Ep8(zZ34t-XA@WNE(bxH7tRVn0E)h+CUjW_QlJCo>#A4T^urfD!2%fl5==? z`rnVkh5l}T@+|Je@*=H9=%PIhaQ`HDsxsTVzCarCeW*;dy!x&*#AenIMfV<6r(TCS zYPq2h<%UxuV{=%Va+XlPd_NYavj0UrZ zr2l;Vs*}}Q3>`hkV|Z5t#p(X}S|~z&g9$talbRaF9|~{jm|R@*)k;(K84fIl8p*($ zmd>SGX#_r1GfBnbsLswtzch7nksKk};dwaE(xJB{ssB_!(I>lC(};%u*?Pgwq|P<8 zyK5ufn8V>L46yE@G$rk2GysvGK+&$GfO30-KH!|*Tj{5QdVUmEcT_$)C|`blIg2^C zwV(A@9)xnqD)(LjGWhqyhvH)GxxYUZtARQ>njMt8MW@=If9NCyJ_&-Op_#HXD%;p` zDBN!Ok5OEPI=ql>@TZ5p>jO-mToo%1S-5LneZ3u_d;7FR&XLQPAJOOA>;?;_o0OO# zDJ7l9HmoOQbSl?Eb64p)(w1MQr{kuSdM-eDeQwge%vfU;_>{xLy;`W0<$oT7JuX9F z((QRkKjdKR?eIz5-7M+9WsgSk?rX9)$@cuHoyoo+_XqH;&W1v&#vsKE^{M#M+@)s^N^@@tlAOboVQ#{-kHqlQ>E9xP_0;48h$Q!s&4Oy1^7? zR2dh|Z8}et=C$_yL))d z0_v8(Pi3`wKm5sg)?!;hKKFh+-HLzySwzI}(x{K(M*Y;arj_F8PCQ;Sm_j99fHPuT zcznh)1q%9~ivzOr8?!eFEIKtOk8i!IkpSqghSrQg(`M^m@seo_jt@#T-6$!jq+#txPPwD9Q(6^% zaO$z?gU^n-4%R6qhS)9=Cy$<$m%qbno4eb7P%pahgZEwAWh z+}U{F91#;^3b~b4!v_|mIAfyzm!JW{V92sCKXkK_SClp)LEYDP-RX&5hH4SiyZ4kH z&c==gmO`-#CdS+mzUXVltJJ|eRNmUk=haPb`iAQy+ExSHW?kob=kFsOs=u2Xw0vv@ z(c05I(;dnVJz^z!!@e`2-Dv*l$B+LAt9sv>;^Qx{8dU)Gt)odLmk$J}1g%2VLHGqB zBLmVa=R^A)#2~`ql@eo5x6M#!c@{WhQz&YmcMl|Mo;nr1NcedQo2`(eQ{XZrwaU2E9>?34vY}}XhX@0^I)4}6yEEID;@6-Gqi#tB;YtFOj>!7aGA1t4|(`IV7<*n$ZcLPYn zC?@kWlm&+XgG14CrdRJ3*r2GwS*e|$4m4BI_CHi9KCvz;GP|W*${W7{Kgth?MQQc^ z#+y;LN-2J>^g;oT-*yDup7htWz$u@cmGU>W7f&VlA4eeM=*Tv?z1}xB-e2L>48;mS zFIK=^G~*8s8B6_-Kgh)o@-lZdMnYqdAshhXQa1ryVw2}b=yijghh47!DMJ4Ju?O1) z!N11g1>O3D{X!wx{A$0{p2Y1X5_JLwSB6X<%K{$@_c7HV+tWh3_y{odzqaV;;doM0 zpiCnxnNu4`wHTG=|G|5@r1yi?{K<=-@huA~e^`Sv_|WZ@a3fx#ByC}oDAzX6(`Ry? zpz(MFeGX6$cL^|E9A8l2#dd%4%_fc~@>tI^b--+*W4!;pBXvdtTuU&QOf)VTlU080 z$a~>~@fQehgbT0>ADl47hpM8q93y}mpPPZ^SOYrkHq6UK6kUxBf!{C$pu*~!-3Rj@ zZ=_7`fuR(h%{(dwoWF)(dLh*C>Q1gD@&3Hy;&pU8s-8C|W84$yuse6&8sp8y+3|^V ztDgLWlg9hM)l>g3QLz7i!WH~~%1r;?xh!SG@5 zkEC9j^7vf!*Le>O{5(i~cVx-^s0iAOoqoI+t^YeOubA-<7zZU@>8-Dw1;O;105Iee zLg?*DG}lmWf5;VxWE!X1cq|6q2P}I1s;+>95Od3A)mOV8Y;E!i^_cR~h=hK6Kd@A8 zVBt`fe0I<^%DyorGy9hngiM#FE;33Qou%5E-}Va!@qjYvwP2mh{BMG#)Dw-eLrdy#A(zi|2QSIPenB zkL`va)>j;HR2KSFIvuv;E!DkeUfIeaOlH4C03FcBlKY><*fGQZ%hI_Uw{8uZ#u0{! zM}3Y63Av6>0=(*nDK~sdw0-y(G(Vq zP}an&&VvqirE3+m2ctBdBOqD5?}LGw?|Oga_>P+UU#M z@|iN=%_Z4s(Xio|rXiHm!@rId+ZQ?qZ9ds4eQ0>>&YL8Br>M?(!IPrVSmHu{okQe%NudymQtL!t3G-R@eMw@ub^VgL zP;MNM0dn8Gc@xC~5*En0zJb^%7Md!pQwG`im90pZ(Kq#)Tw9*ab*YNsA!t62Gq5;i z%nvgTt7h=xXv5vEkr?{4K4FYZ@S1i208y1(3&6b*S0a4m39cYP#=MkD@?Rj$#~lW0 zU>z4o9(3qZQXij$B*S$xLeZl7`}HH$X3trm*q8~Y#ec+s{Zu!&{JJQQs&+GR4`@y` z9L^dUF%ypbcMx>shKG^rVqSKPId$tA-?J+I=IJ$KH1lJE+2cA zc(l{ft62Y&K?`Ui$Sb!adT+yrG@`mv>5rkeI)A4=-9OOn#}o5_TNN<5;x|O+zC#FD z-}9@y$@k}HlS}_xlf1H1;FQo#zCXWQdnp;h@5Q~Z`o|xCT)kRkfA-6cq&WYou-lE$2I#Bp2-D0&(4=QFrpC6nas99&#nyhn2=_Y>2u z=bFjP$zf1`QBp&kCtj(^Ds$G4sjfXQOXz8wOU@8;wtB|q;zP_QxSSG0I9At1Q5PpU zJwuyIjxp{>OSS0hBMwtriTWG2{K@ut#RN`p(DpOToY3T31wN7Qu?BVcY}e8zP3_f* z1I?=|F`~)c%A{&*dk^f)D5cf@%e#GR@p2d?k~<3zBOjFsc+@R4eX&m)>k+!vv5j8u zH83`g7b+vDwb;sMY>u1iu+xJ(cIVVydp`0;7d5dlV5u{;btdKa?jTBfLbq~=J}7;p zx?%#ah=hLcyZ9X!?$ake*&%)`ZOFwrt&!`Az}{z)1G?YyQ4@8QM^$1p88M;k2yUX- z=4c6_qauS-=gk{px#QBoogt0SF@Bdz+3)plvP@Cj2)DN@FT~m(>}30Nv?Dq~uDiun z_0(q%t(D=o8VuTBE@HgxpCT*F=bKQ>(eoZnbQAn$NzrN%BBqC;8R83b3FDyN^0FiE zL^&5fie@3>#D<23M(twAtMB=j$BX?#u3Wj&qvq)_5ZHe^VY3 zG*UH~8+U>9Qsh9{FQBGE!*GYG3m)4WyL0$=?b<*7mohmJIc!x`F~M?3K_=7Ctp3#C zv7n%DQ*Eo^@F^Oa)jEt3JDdq=Yjt-<`%0T|Jdhy7+S~T4pY7FPW^ALo$OR=O-81cF ziOZ_Ib^E?NjL&JOd1E#^CvTD*GyHBA{k^zLsCaUre$B00XRHklX*ZdRq9Df(!UAEc2-$qFH#_PBVwK#Gus;F3ETkbD? zETAPlbzWTO6%P<8%CS46n~oJLC@${W$)crXS3KQ($cK^As^`q*>}rzZP;&YipJGLw zh{xmZH}bp1{rz}XE$eOVarscM`b2S2^w^zgo4|_dCf0IE*)7r976$&w<->B?obLw3B2dJrHgZaX$bCr+M4@(U}}SyS+vbL;(#n6gGmE&Ot> zy@;0U@KQfRQUW6xxp2&W{hPX>rDcjJ=Ud+9R17+q%^<0_3A3KLHMFJo&*Dl?zcWq%HjV*t$DB@N>piZa4_4nEGH2!a4|6JR`Lba^A26N zGH;vBNpZwWKDqvA*(q)i3%AcNC@^f>U$9 zKXaMvJ)xR6`}${1EMlBN8V^C(X}{Fkp2BZW@iS*Db$YweqNCE<1_;F2G-6S%DG8Gw zaKoDXNKBi#|K;nT#&mATH>ck8PV|No{UEd0Ovc~hhbw;9826w_co+Y~*_;xOdq$G2okVzxrs@W^2`FYQ2KAG)NGxV=j#n8X0!5xXKktB3VibuVy zw)ezlq9e}wx_!4I@dlTJy4j|mw0f=4bgb-#&s>)-5^47=-j68s*_m2eam}uYDRAE5 z933y#{$zKVxHg<-J7YE8CVjr=QjTkWDs&G0U_Oo;++a=FFZlM3Gs^=LQhjCm_+PIv zdRq&}yeI1O5^Y#4t@ImMw~M|jk4J!6%MjK|Hi`H`=hL4TY>@b*9VV5&o7E|0RRc>Xd2iRcm&wQd97!K6EVJQ=Y z)~}95OkL72`5{F%(xv zn^(^cN!UZ7ENCu?;=L+KnK31ZG!3rlYtHYTC*dldbUNo{WLTmZMO`VxTg>_bJi1AXX5nj0m9N2>`WW?Y%a-}uAN+FYh#yTmhz*uqh)Sd z%jXg8C?;DGTDvZcpB6ciL(-CFdRd9=6e>`=)h5_d=T!;igt;C=QV@_uMP*c@|~n2VH1 zO&=Q@8^>_3)N?s=(tUjU$IB0k5yhM9_u`rr_CDCHnW_v3eJxI4zU&ljfA=s_Gyx~*9xbHB#=gYDJYMV(naK=dcRzRJ9^i!zr|+O4Nfy&X)Y-rEeoH>v!g z#VR)Rp5ABb2*z{Z>qc^Na_Gw5Hp+*+Jx+bSC;4a@k>@T}T}Ti|uHj2oBQ48ZkCvJm zL%pT}r!aSh+~6mT44_RQ3)-yx+f_${2BT$dwANp+eOAI8b1N%nt6AUEMLX_fsJ&@f zl!M}WN~_tOJF#VHXj}Y7*tCwgcY^QtzeT&btmWAf%^iM0S}d%VGVi=yii@zVFk4#q zTc&fZm+(SNKr=M*oQSqgm1A$a^fW>jx8Ob+x~5BNQrPNN&U5Uak(4|dIZw*d2mkt~ zv9Ym^2Ef~zWp7tq9GVo>A1jUh1xncy-Yh34r%&Mfy4D5G50qH?O{}HsR$i0d>3f|$ z-^)MKRdwzrc6@t4^nOvvwfpe21x3E{VuGa(iBowHSX`w9V{)!Va^&E8D(R* zcmajL+ftwuq?pjq&;XH(?L@Gv|8V|%{K+f397}43Wfmzv%(vQPM=Gl}+(JOOoH6D) zi?Z}EXKb=rOdW_J#zI5={QQ(iZUg@GJK!Ipltr-cuX6jby7rZdm8mkPJN0YNerU_?_+Ov!-xm1?3jf6t{%^kI zf7eTftTi4C=~kHCLZMEEJ+)of8+JHSyCQRBsQJgLnw&opf21J)MqyE*fw6h)!a^Zz zi!Z%=!uXe^wCvkXpWbX;K6JIU-cw6;!q`t&Q8aV#@b$TP ze5SlpS>dfKnXkqg!Xyt1HUv8r$?gmhNd7>#y&?}GyX4_te!Tu&2Mq0abvg4S?{`YS zjhc$VtLEgKL`tQ1{x*u5gRkj7FK-oYcgI+yY_D4S{OHM;fPe(j~gg@o$FS0cc)h#T-hB| z=8B;(B7^s-J4~+Xjyf0)Yq#wlA>~V&9{cah-{iUt2!8E3eb*!FD;KYn$@$McNV#+< zMJn{@!S5xG{LpZCU>xgKwYK{|dJg{|KI#9LbNj#RNd1p5y5eWb|KNznShaGM(;XD{ z{<{a9`QdJ4xN$p-8aN-q7#Gu?#H0GF9Ak_Nd4BZ4P<%Gs`pfp-bKMY}Yh%ZK2mA!o z?%!@CnbmpT6G3m#k`!j?OL&(1sAn@>J>*q)S2EpXnZSK-WNd5?>0hUXYf1fOmK_}@ z)mxy&-h5~kG+U#MwTs@o4}SmK|NNE*X-Wd;=a#Klj~B6G1W_MHG`%y$(7gVu)bFT8 z(qwN|3`awIb$o5wdpIetv>YE8U}imM1nF{AWnnEpTxq%5f%38stpqiB4=~ooL&l@4 zP0glG2)Vc4ZJk5lhR*}0_WSYAm@qn%1_;*}dTYKyx>(eLsn=5y5TQC$)2hh|-9rys zUvAQS`f^1!Iev6ugT=E1)luQ8r5|A6R%@#7D$$#>nOOWC4+cG^pP_d;z$|kr7<hvawLcP^r@|lfR^T(E5-5qi@(i7N@~j=q%>s@8~B8i#_{n27w_L5&M%mM z(x((1urR26-fyfL;*irq9v4+Kf_+2Zb`DIi40^_0z#|KJ-0B>39^j!4^kL!8nFg0V zz-#low-VWRItN|8Hn%>Xbiw&%-UKW9EJTfLdO?ug!r=ORlisdyO6X zhf3NgEh}6}eVL*~kVgeG-M!F$xWc!Lv6=DJD#XlGxTtJRteBiOOGR(svq_VCOQfgh)@ zCLcm;x?aURCR^BR9l(}{Bsi}d{Zwq!H!jL&y)UDSPpi&HDq-W&y`a{p5cw>O@)^4} z%|w`vTkW*=cCF`As}MiZCq$>PsHl@l*hF265s6DWpAzoX{1llk7s@#w#AV^mHPwRt z&I#Y|vD#P>jo_JpEDzTjaz(FZ#`zu<7}DN(F3Y=TG!LheTf)p4uQxt>Sizx-yxHx6 znOyK=ZM5|wDe$4IIw+ZJa|}E zdGH_QWws7Isqx&m8BnHDnIY*}PFFdTgoU0zxwx`ha3#B>p&l$9a z#q{kj;Y8UrL9%zJ+-isPw9mXaCDA4X*`NJfR4a1`o${7G{FPSD=(wsarF5}Ge>6!f0 zWPX$h^a@7p9IWOK%G&)y?u;u z3rXDuFUv<7zAF!So(5y%_EUb+#l;eWO*+QiYPp`NpYs=UOUS*0i4VD&(x&FvGY;^g zd6E*fyWf?B#3B7f6ct=c>m4|oGX(Em4a`mKTN=tzt|Y0lnu)Ita96x=Vdkq&sngL? zj4uJT#$kG-U5#8=V-mE|2^u4H2AhC@xbm=UKxA!zWyERL$e|)@N7dA01d~(&3Qe#? z-w9^V81|gC?$ksDQ<_D=?7Nqvmz!w4ImT_6kndBl3n$^+xUba+s`=iCR@weseKbsy zwd51DTqnBYC50?@L*E_u0MAD{CKeeA252~l6Yt3@_M0iUPI-N4v zEvt+m7T>=GQ0}>gZxIfEQ|D5eBtn)qGmC2&7D4_?Yu%+fA$}$-9!?;sBBJK&c`bVU zWJ(i7Bgxb<<+@0a40ogLkTy14B=`a^xvw2_`3HMHhOG6VHSg!j@=_}k z{+}4eU0>b{&2~zJp7YSlu-W6cwLYIFm+`$`3Fr0Yp=h@$VYS8JbHJB}tXZMS4V&e9 zocuS`7Z3g#>AQ%^=gprpANx%G>X>-5>UUB6RmLc#d2^AC=?vGb(@7y&B}gQgNp4rf z2xAWswm17ZtO=aG=2jo-2V@hY;qPh~!t;m_YJo(Uf_R&7fYGpJ0J%S;k*X%8PP?ce zfu5}vYmd|Cs81u(cxXXQ0TnXOQu8`aw}(|S1Sh4{(6ZR*NNZwtrH=Y2xQ#dxaGHNF+r>Cm_&vg{@Zw{=d+OQ*qEhw#3ZM2`wJgYT)Xvoy|m~!GSRJ(%1TgO z-Ych~-bll5Of-2cmUxfNJ4$HJTP$Dj4!81rZ=N$Y!lL2=@ZVd?5=?ZoHolyu?ipdx z7vm0DY^olUwSXC8XfM@lusnjeIK;h$-Ckw}B$W1jiX}M$uDAB?XMW0? zNI8A%+klV%=JXVJv$Q+7>KE>Pa0OVnRF29e&`?$8^|{O@k50FWmN`}CcqCR#ne6M@ zqfUFSw`s|vjTCPsaH~~Jq%*kVUaIt$hb%7!uDpJ%Wif^h5vI--6j@ri+kJi=WihBh z8!k~}Ej2mjX>?V&qph7opr~W{b`tOb*=w z3Z%DNg*145+|19SBWE7(+6ODw*lSb2RJk` zfbnx9c3MMAY?6nl^_V6z^}Iz%6?*WFsGMyWGW&mU0g#j2caOU#gw|N5+ z`X_QtdD3mbLCZ44*MtReRgWLhI!%MQeYfhfx;Dgh-s4`^6B!8f=4@r_SRc9rdafs% z0)ORtwF#4DtUM~$@`bDD!%iX9I12jEvI!*DUJEOwRe!mzJWw zfN`%z6H(9lzH34+Yx8PXL}WXCdYfKYVmO`soJ~pwStd2@uc;cIQ`HtUy#*I%Qc_zr zY~ktv##4$6yZ4_o;}Ik5KaYf%dKVsFvg!G@iU@2Hzg z7KN&Yyz2Vr$CbSkA^tbXbaB*|pGn#J853aNO?W}g`JRh%yqGq0sr+%(TF+?!(>4bh zps2Y?;l|~qqtAdDb>pysyLPeKb2+sh>EhadP}JymQO)9(h_NHcs}qUJ3BQ%|fl=kK zw`A!fQ_V^qwOYKy>_pvrgJ^f_3{6x*NSB&xne|wy<>%mkCru#isb5<4NMOW(4Rgbf z=5|N(QqF$Hhp2oF?{5nE%vucyS+UYrSU*oIAvzH(-kR@SKv6U_?C)Pnbz0G&BvE ze9^OfbF2NRrLQ}RUTblOIomyd{wC@1E?M=u5~#2}6>`75dRf3!0ojz~l zkor+;x%75cFoz|_pV1C*%M~v-LAZf;}bpCq;&TZ7fQ5f0ZrRADAhP|RulP>HGZp*-4ph-pCRa4 zT=D$0Y3dO_grMNj#EE>DD;rHS^85Df>r|;+)PS0$fJX2wXKt!buhUA`qwGz^8~w$4 z+m-9E-z}~>rFg^vwK0yNepL4;#p<(L4U;c`B(6?-Yp664=(LMp|VKx>Jq8n>$j(3n6nW4nPXeOu%r<%mx8Q* z1_WtoFY$$ig_R_Cbw^mx9*j+>WY+bVb`9nQO{4XCO6x3Xl7q(6OF9!sJs#I5`(&&L zGuXAN&Ysf%Z~WtFbuB0n4nsoiq)lm76JTZGH@kcpsCi<*O0QB-f2AvL-tPUcA6sS> zp%Rwrp-}uA^pJMvB%-paxwD5fGcvDOATkLviX(o+JN4_>HPR5VVNn+S=fX=O0?`^f zJ73J83=PkLmy!#cXk2=0sHZwBoyLfId8AL@k`gkBZ_=R*La5cP%)TEsSilE2Z-Nl< z?${#_yA!(gN`H=mn;3CBvT3NVRdsob6k4V015Rd+G--1pUyJim>wMY1oD(8uw(*Oz zi3rfu5gvlU>H`frgH9Y`99OTx%x$gSLyjUJ;7)m&{jHc)IdO1`sv}3hj>6=YI3G;erdg0g*E<^?b^~`E^e`ncD>~+q>oKI0jpyf1re>yYA^|qzDmR;*Oxskq{bd%^)W2e8{}$-QsWH z5QDtFU3AHdElKD!p9tTp5ppiw@X(oC(Ap!@-9HxseFcnhJ7)i)^0=o?BgvgM`PH^! zq?Dfoi}4^n1r`IqBUdF720gyl`U1AKpzwO3n(x*snAfTX^>afO$~k~DgFD+@bn zKE_>Umb%ado8V15~_C)U9fdn zym%>nn`kH-%^Jv9?#)~HELNl}q&#sAUXdj~buz5k-9uMGiTMO08g1q4Arnn($#s7Ob8N2Cczklu?8 z6s1U&4g#Ts-h!b7MY<4r3lOD40-+_85V$LV=l7j^=l*xjoqK+BGQ$knS$prb*IrNi zJfHQf2ow@2nX<7l9+Wla)P^>^9Lb3QUh2q359v56sc$DO!g zNUTJRALV=yg&OYn^{ufkWQ}arV&&Hb>}9u`%>ne`hqa{{>r{V1bWel$e`NQW?edw= zMo((W`(6(N0h&e_6|>f1wFR(b#i(0?GzbzRIe}Gxxxg2b!S)nZ_)@ebm2+`sJMToP zRZa9qfm&(6kZ!e>alX$WGaKOZ`v?I|CEVB*so3sva?Gc6y)0*JUB}Qq&VPI217{0RgyBG_ zIO{70r6-zD@u(f*D`_CYZES?OtfVM&8Ok@#8^-D8VGv%9z|%?~v`S_szwleHlF|SZ zFgiM#>YggiEFy8)pI9*$2f@}(*NH^p5Q&1Z*xt}xt;4eY+E`|c8FrB0o9t#mY+uNP zT|-a+OD$ruR}vC@1wckwjgo44DrO;FyaTK}o?cD6hT zz!MzVS~V^AdI4O5l`aa4+)zCO`BnHL{@#wUVe3wp!`cJ8QcV~sep2PNgRxdXNAdS{K$2iLug#X~mHA9qzi zu$);?oe$8k9#yhp!mu=HP%Zi}34jh$WGo8SAVglQ8W7g~DA-O7QZMNmMU-~brmhXE zh>s4>7dr^{6l3K{9qr;+16n3R<;0@ZD_0ejLZ2Co?&Mp+lo4BR)^Ai%1yBXm_Bbzo zyD%dwcspi%b5rB~9Ecue0J!uFPH-(h$!Nl7oONA%#A8($Z9_W)LqQNB?L--GqDzJ_D)E8uPco>U1yMpeCM zsargDibcKGe;2}1Zmufxjo9flZue2?<{JK6<+SVi;*>9}#NtGm1!M|vnE)u49La~; zU3gI%)i*~43lX)R`lQkIdcat1K{hHu9V&*dZ+3+h{9?9FEa_bl#JnhVEkNxIQ^Q32 zdAp4wey4^3L8#7ZH8mb{2F#EtKGV%-2~9h0V4|d?j5_(sRL?Bt*UCQctn--&R&x6D z&RX2t7v!IRh531C1L$IKJn>2TqiH0&Y2+D>3ZA}0gt7G1MJ2bLuGa+aLc7({rUOxlhMl)BE%4zAu!l<%+lF?K^zqgRI1B7ywGxG zvPIv$=8z{EmH;zEbWkFifD0;OHlCsE@9gEZzL=zPn;AKxO##jTh+RTJF!wgExRC|W z8&=(pJ5P}6_cED!4E z-(^0iudjaWphSMuy}G?b@&9Q;RrECfXI%D%;s4B+{|zStyf{)-vKZu+htKY-fIL|I z57(>Y;3uPf`)VL{RqWk-li${tYJUtX(nA!^%{Pe289ew^FO;jE_$1v;p)h&WGJ!7u zkVSZT`64)@cggJ3;dpAfMgj!n=>h(mmI+MzjE(f*-F690YQ~>NPoJOPNbS6J0@M9H zGDrG+ZZ4<7yCG@_OOy9DhN*!2V`)1qFEW%7@J0Fn1LTQT&WXJmL>tRQA}%Yuqa>&*;BUz z2cT3@MIeqkuAfG1vd+z)%E`-pjAk1h+x%WI&H2-EwlCcqjHHGsHhkVT_Fw859@b^n zQ(K`N?yW!Gz0=at$?*pjpY{Et_p ziny;@1=h^5(xj)fs{0n-cm*%+%%#p#D(P5*NZUG6C^u^})Oc<<#O{}u}{ zR<;GGBY^&u3RX(Y=@>^pB)+q{=gs(MpEn%G8wfK80?+b$x%&^Z(BD zq5r`z{D0>uQ5i`jF?)6#iEB&)gA`Y=eCl?b6TN>I$1Dl-P14nGyv5A)DG?K?@%)~Ha-v1K=;!+ z`|7`j0MM-)Y!nL6J`pjonv&^wy9{s$9z+$UrGl$Z37mo|H>L+p^Z)vS5_|zsMvNn! znIeZ)S%ke!R({yM`{a33;h|G!^PBN4VAbd3Er|<#O+^M31NI1#HubHuJqUU=z(p zHYgbEx?SFrNRT|p^wnVnl>40gq!iCpTk3KH{Zba$J97ht4*kaNcXdxwmEhBIohLU7 zM*6;|03VIBW$BNh%kpCbFB?TUfg1aJjVgI+5k4;^@)Ankx4ni5w5h60I(aA$k z-w^lpgN`Jh^CE`rFi99fbdsxeGq<-w^I82&%}sQAj(#Dg6<#ImVdW#YgPlc6ix-EN z4`eqZ!U|i+w>{ml37~$vHSq1h;Jzlhzv7Z3ffq-|B6_O^c=F>&MA zYuj3PRA8c`oOxyKK*gw2{S8owF}hhtj?WqVJ7kA}#z6|dh(NR3l{5i0QqLGx0KHfG z(ziMM-Vb7*5g^(M`)r)g$;nYjQ*ZwHAyPvZ@pO}$szW;kH2w%1c^Mjy<=WE?2ttrq zTl0Kr!NHT=>E2d__El5)!_Ne2@(bWWy_PU#PYB@bA33&$204DD*PZG&@iNMw|I}1O z0ULEb)Y;0{jj8Hli*HR_KQH`3U0XmV7fj%wsmhJ)Waiu1yx_1Ckrhxc?+_|;G_#^@ z3)TtP!jJNDy3c8caP#xRuJdJoFZHl)j6qPvrWs9exLNvgI1Qp{Gqt5ySn_q*gsTNj zFkLF(Wzy6|Tmc?EP{0>EQPj(@+)7=pj|K~$c$lchxAOzAGE2DQ7q}D{FquK|ICyw| zpw4uWu@|Sl&uJ_@HKCIsWQ6ddjON2&FfDhKjR`o7rqfYl{B~}>(xOLo@z3VZRc^TP zu1*t`b$n>k1sKU#Jrn?S7X5jRSF|ftOFWp!fD-{^6xep^$?)UANJ7?L_y*Irgw`W1 zmyovgdA7$24L`F6xhfT>Et?c9PIn~5a%O6`6;1MzV4KvpeYXiL37T!$y zuFH@0;za+e_2ZA2=dGWfMOdWowASb4#xEN8)EFi48}x46(&c*gT%~85+VfQNfAIFA z-hOfs7D;0N;Qz-}*`6ub#ml@DlBG7<=d;o)@J1+ZZt=qB#+Y<>efEg09>@RZ@T9fe ziQqPUh7MfLGonxsI_4Ey4TMrHazI}U6TWVKs=_eRmt?=aJ|pW&+$(pvvAZzp>7zxg z*Bl!Mx*< zLhw;N-AG5G`@f`-dmCF$&qo&DY2Db%4Bd#BSQdJn$+J zCrHmxEXJ;C_v!#{GN1cCQ2GR<> zfvDtCX3u#Qq~{`(CN4qaNOtv`&zPNr&-%l>G>6@5mqTvO#rTGqt@~xIBeO}h^Klb9CB2iI~_zhM3Rxqo_tqm-e&-mu2!&g3`UT}SAn*F=PC>BWb? z-^#EN$q@V$2~$BN8zSz-?^e4EG0BhJW{Y)Oh;k#u(4NXjlXr#kV8@o>3>Di3){A@o zA`OjAmGojjV=mE;lBS&rV(LJ)M$w$jg zorJ$!09z7V=h7#UCJ$n#>#Ork*cwyh%6Hp_v#`K(NaC-BA%#K$T$mVi^mCxjZQ_W4 zP3yABsH5dweZMA$({WaMaW0@{I9^si%zyRL+}Dqpd3i8g<3#r=S}_bFurL<6J^amD z$$jJo{l&@Z7*go&40ndE$>$33d3ITX{#>-~LX)|?(k{hfy>>6IprOg26PHlYWDG4Y z^p!?&epRW$_#f%X!hV|Hmdah5wEJUK@2cPhb=1Rd8rydRuJZSMkNd&g8ShdaXkUVQ zvKI=3@m>~TQhVG)=g3`C;bwSWS6aP?(r(S6WmN594k>glz zwAFZlvbBoJo10jEyGA~GwcSr5Pf%^mW_rkkzFEqNaWx@}ti7XeG>}Z_`P5Ub070W} zH^A-uSbMjUbc$qVLf&8hRDyB&b!RlI$+TqnXLaRG*eO-0S1x``&_1{5tPiTGGlyfL zb7#i6p0+9PrSC6w1RDkFCdc=MvDHYD@K0F5rmMQ)dSkhViWbg&L)7WSfVWpjx>Dvt zrM#&H!$?!_&6Mul8Yq7(!{?n9EvHk_Jssh}#}&h5uiB5i$d|Pb9R4-8k)>9)Gqw?1 zhPSdCWmFA^A~T)W4^-Btdtc)kYh6F9VH4v=Ql&48h`F2T#f})}v$r$Y*gb5^H{T+P ziS905HugdyTIe6r%OR&Ust{X^#x3>+wJyP|+5Sbfo419)M7w>{)Fl|es5xYYI4}1Q zVmyY6va*$T-M7DVyIVyB&uwZr=5y-On);id!8St#7mBpjLt3Gn7R9D);|4Hog*E-P zzV5`0(VBzTkU`bX6ao>1Bfb%J8_@6XVT~wve^;qGt=gvN(h^LqygoeJzK) zcctab74gh-?d2bAM%bpuH5ax_^r3~`V;+TDM0-CNy9oxAJ*d@fBN0!k!?^1rQ{RynpdGW~(n+6j>9$Y^rvBU{Qk29)HfWC-B@L$N#(R;H`n{DL@~=E4XuJ7C1yA#r$GR_;#mZfs z>x(sHOGh?tx#JjautZm@2;LX#>YH$1_uEsmG~pWm;F&YB!_o*Q_&(x{x0u5dEq@=0 z-j|F$h*l0StIvkIs){lhhHeR7_{{fXybik|574ZHt|Mr@Hl2hocje%*jSFV5q<^u|SGMno zdLhjZ$h*D`fgW-xqgUDh2$N&mNs!v1HIrk;C4U8j>o7^wbtW;~ zZ>cGq;aEFI0RmdZx-@l+?%RCm?6AFCs<>yOE}MIgy}5n!Hn39j3OeuE)E*P^#fXJr z3p=Y;N$v)zh8a9y8^g>_edf#llT7udS@rB#OrBc%9Jv5s& z`Z~J3!W!<7|D5F|VbFRWe)=dz3(dudcQo}7|2pMb+T9dYsojg1%iD`pK|W56VG z%+v~!Ocdiwl=c0prNzlA$r&9BmY^CIqDX=_q?*QdX3a<|UlEy+sxgXT^VQ2rijg=< zpI}B?VZ=2vn~6trC47?Bviman*gMcB-Uj09(H`#_kw`o2$XD&Bain z9TaDq)cWV2s^D&H)Jex$VWUROM@2LJy*aa2^7+?aF>C#fhzoaPFC#7Y3vTgr-nZHr z{CEaJ^tv|b&@uhLeaMAX9WH)NJ zlOA>igfuQB~{30_x zh>Tx->!uw)tZT`OvCj5SPJ6;taNasmyaL|cnxR(#|h))V(jo z$4Kiz$0{vAd%&B*c&KoNM-zd=e(Px8|AVZsR-{O~|0g&!u|;^z4%_ zFyr^-8s07T>*DYGmSivnR=NCm=_mTi&8aH0!)0S2ahQb|&ZBR>pVNKqqTw&on{uGoX1^q-h`L39hmR=p6+Gk(%awH_ zHkEL%de!6z9J2Yey8jweo&Nh)w zn>Zs!*+UjU*c^HlEdN}#?3XXMu)o<5U6-?EuIqo(y9AHFsi2`k&;RTxT$X(vec<`K zD5KR_q*^kHq09nvl=3I``Kc<(uptApdGLi<0H;TC`SwjBA}<-UW+q>=<(#&&haONd z4A8G9Zgrh&C;b$iq(|tqAm9^^O-iT(M-GmH|LJ^?G6_)}i_^sq9_V~E>y1~pn zu>G^R#C{2|Sx$i0ylmivyRSPF-fGvznc(BT`Z(W5*D%Idu-A{JrqgMgnN_!vyfbYer(Xs^^B&0TbtcXy-e3dP2RRjN0?95aq2&#C9O-Q!#Ilgt2L zCEcoz3l6EucU${Fjd+H$|`CY*1t17Ew zQLz)a zuk--7-k(9Ujwc3LdHCGs{@_Yk?vrqSmom7$S#DqxJ6%!qx8LGUo2K-^4eBoo{JUf~ z+j*7#Dmh*Z#{%{EkesvgOwqSe#%1~g4Hw7o3Zzs9OvQlWdcD_z4#LGzM3 zmkZVie)I#Uu^Y@(S7jyFCE)XTt5;S&6KtA4`1VNW+F%-VRIJpUXe=9{&XZ?cC8Nt@ zQGR&{w zc=)h^Z2`o5OLwHC3?(FnT01&yJwE+XXU{nPraU+2#H!$Y2P{X3N7F2C!*yLhb{ zlaf;S`n8W${+^r#l*Qcm=3sYXP)h%ng>6?Z@UE4gFOa?fwJE8UaK(jS5vVkuFs0#` zmS(Ob&0;#;4MfKB_(slM@1GNn+PVWg7xTa>K@CwBZD}?&SN-Q42n>JW031veAb3;L z)6ENRS;(9F6Gq3ve>e?KEeL10N zzO%Nsml5^cx=Ar`N72x@X!-UVrckU(%1#f~ zxUxIlxvb#GMSW!O2?)(ad)54dHx~T&#N!BCxip{#_kW?8&ECpG$dKDDY}kutCM^^q zY;)~2j7}c>nwmaeI<|!ukIeL~OHN4OQ^?K9dBS-=VZZnTsJf~3`SAlWF`YV-gF71w z#O^7r=xFj^Z2<;7XX}%=tgNYk?r>92e(QU8b-m|D@#J-O^;>!g~>$lzA zITC^YCEjECpl)%UtgWZTqcB`kb*-WAZ>wRr42J(EZxoiG<|vlL!ExA4f#psr3TSgc z#{o6byqHWwZ4Ao|Cti_`Vd-&WED za&LD~!Y3S@sTfGN=%^2EJc^Gv#}HKRJTpW4?tVlDkP@cz=bLB12E~8N@6C>0`~04l zZ(V$(Q}o{x&q0qMFoKskGjq`Z#<*BMn#_BNZDw+khg)1;|5d=YU&;v7off`t(P#pa z1=+&*E{A5{KBuAL8UhyCv6%4P*GQ!ed*#CcY!%_w^pyMoEoIx3H0n;T$0~7?t zN>*W|y>1boQ$W}31K{#@H=D<=(mr#sg$O#^bn78Xjy%d$I+!dPjknr=g{F!xD$Wu< zK8r_*Dt}>c;iwOXsV(7x71*MgR?QEjc})h?osmUe$(3*j)G$8Qi8F?9rC!SN)HL49 zSc6PYzOe99Y$abBc_y&T%UilHlO|gP_A_6~>e!d|eU4Uu3CF}?Qgp&uB(cSSHBW&$ z0fSnA0sn(5aT&RFAC&f`e%5@LnTi~M#c|)gTgi}73V_3%rO}&K`}@Juq&Br>|AXK8 zcJ+trm3G#=VuL#e@&++({0AQ<@E(}2=6~UcCgSYt=eceB*Q7yeJ^BX^EVSs1iq+4< zaTXm309|VkRNeo%(;29go%M&sTCre;*6uCU0qnGvZkea21C`rNSyWw_X)b?3iRL}! zF<(rluCoK5GNs|;_>VdbmJ#Sf%q^n%gj@T^I~jpStbN7-NqnW;=zcJO5N*&Hhv=zi zZnp3V+V66wCbgltEX6F~|JE?*by+NpFf-O{|B7o`Km$9!(Y#W+%(_3`ch#av2OK!i zWbXZc6~p~s>Yq#J2&5vGyy<+&U+>mWd^=U2d*{oY@!O`7Ls{m>sx0GSJ8K4dVpmJy zZTR!0u#LV#wUzRux61a|$j;ypNBe^JS=oQJ+;geJBxppW<@4zwQj_n`>io#seoQ2xs9O&YIEFMX!d^v)Yl4_e z%|{+CttY}tD37v2eF=GYaeTy=&e-6&CbhRN*xk3pum+)M2i0s?*8@teez&=})m(1r zwsFaBH9ncbv_zI%Pdsoxo|+%?<`cLx1UIzOqbNh;Si7t2Bpm{spP0&l;Ugl%y&vH& zaQEAXiTz^ncZ?$@nmv{!+r|h;x5z+HvhDB-V;^}g&yDyAy`lATqgj}_v@dBiE^)~a zUvZUpEUxn#q<1EpkR-;HY0D}X(w!75m1W$536O zT0K!RWa%`5i~;=3_XqW>*jk=cyAGma1c^;p4Ag+QZhn5Ua%~*#td-J*U3#pZ@*+fB zpAd#^>vF8mqsXkisMI9;2;K~PPGKl~#8BLr;#6(;&ete6Pmwb}HU-zss%tryAskzh zFo!I4(!5W_j6|)_e*SAx5|Yp_SHm#1v_h55omHsCo~1h%KX*`Uw1Y@JgW_3Rt_v4x z6v$CNAQNMm(nu^t0bIp?6*Kno-rdp;5}TW|9_p)*<}Pvf>lRsx)bJk6QDXTG8Bb~3 z%I0z5sI@Upn|?vNwV}mH^x6Gcco!pt5<7ZWX6}_W{>oPMGL+u!PNdh$os^xK3jFmy zNQ-xH5P0!davP=x4o-lFYQ2>=K%QZ4r58<__gl`9`8MA#L}xQ>Q+plvxO-M3-7HBv zA>r5(t1G&vT!CQyBYV>BzB{_L8&t)3-aR-i=b!+dQAuzlE^=+;_cb|_ur7-jRM#wo z3~?J=aFGo`>`rT8&Hf-879y^Ha>8Yjoe~m{vmw^95}aKqn?XUi^My^FVYT?4Hv?AU z(&9yRT&Ti1Jh73`zSY*5a_2y{Y+eUIj!Hx22!$VQ+n{`PVsrpZf4)nv7If|#@pt)7 z;1#j+;>7KU>>YEc-s<_rb2$kL3#%8AyDU{Tt?~BD8T$R2YPRtss%){B*ODbm=8guW zZ&gjf?Hm|G;J(ypF!N&fkLiH7-cO&md$E?dtXs-R!DsvN9a zv@dMw=)}cus^7|C`W0FDZ7rphC-;z9oASP}!vKCiZzO~9PVX)+|)e zBcK3+X4xh2`Nlh%Y7q*GcOEe~;tFL;Itt$ot#}_OgWn(vlmuQX5hdFqGcJj$xq78X zIoXCy?Th4UKMe9K?B_y7cb}SjL%D}*_0Z!A_^h)RB8HHgZv-#OWI(*U2Ve9kd zOm4o`qO|@Oe7i}fjx3bh`QOhxlIKe=pv(Sa(+MK?zat5rig9?%`3^^9^Owlr?-qm4*02WbgPJJh+-uA{tu zK+XNSLACyr?0F1CJ@^#9o`TMFyE4YzhRm_45mYH^^0TOAolo|E=EN6gc4Wa_*xzR0 zDE|ASZ%#U^`M(pQ8E-}Wcu|;T=M{>mNZAa5ZW{nmki#}ZHTi)eX_`z!1sNC>F1K6D z$K1h99Y9m5lrP^+tXGrYCYzqsu1mS>6Uyfb&p;7JR_ISI$PD^~FKD?o_x3nExHRlz z0IYv@HX z(3kC#&i{G8wiuuN%n=3DL(}QfbqSwT_*Kq=+-P37^x${WQf1`1wgpL*el(0-%oar%M&Oie_i5T;_rTbC0iP*gTGO`vIA$kiP?czAY z7g-Zgt;8^9bR zEd#~uy*d&;yAdBdz?)1N=Gqu*<`eAO-|r6nx=EQ7y!S9PJo5bX@SGj0Hc$YPzPVH` zgc6s~Gbt8Ia}GsVNvA+Mdj2gMFjXI1`oKjV(4GEu%KO zD3O+t@RLDMHTlC>%mkmpQ3+%6UcqCaXo^5CQ$_j~dhv}gV0j!_H446bwauNizv}vV zaYG8mG`hN7iG5J&qW(bWWYih9Z@7+NL|gt_{}vXhjhYQDK0R6cC{~(XyN3hqUvATh zjYw-n^b?emZ}|7=`$4vn@-jNT30E}*t1tB!JKvA@k|%FXATrX)ISg^gl?#1dOL0ZK z44kH%7iF3=v-}eC+pZ5Uyc!Ae6~Q?9m^*4#opu=&{0k9q0{14~11|kFq^g>iufpKX z2!v0m{Bw+99KKND`BP&xqPT7&u?O`JrUvbzDvnjFIw+-pK13O{Mscqy0udlpeo%c87Lr!BnqdPP;Pyl56@8v@tOyYP``bj zVtCSl!m@eCjJKI2q297UV?4)&1UAE7a{Nm2URd&dk+WJ~ng4@rW@Ms9viO%`>6@!I z*sFY9qe$@r^-*6*c{;b8>_T`NVWXB;^N(JWS3Kh9M2wY6ap57>JfU)*H>^db9woX3 z$S|IBpKE>mRf2vH>m8nBw8@_{#4zJqi|n>*HBGim4(Ae0Z+C6ItLtd>sQ>o#B0$6z zDy#OE^8v^Pdao||Q3d`3u07iArT2aPwjk?8%;&(VLz@8b>aAcK4f6JmX4Oma%acEX zgYqD)44ne1p;gg`$-dpX9VPW+Q||W4h**m$gybE z4IBU_v&x*%d_5FLfpIhpKzzBQ55bsANjw~DDx1g?GTVvGIkDM1BlHXJT3 z@wAY3xXJwGlb!%?qa1m`(OB=FzV-!0O(!-ozSgRs&a#f8wXHXa!xUeaj^*~C$@=3M z@=feB|3x(v6ovgN6X@q@>{eQeHx`&1*NhLXDHYzls0!&CdiWQ@YEM7z%?GFebKSeM ziI*%Z9^QFoOX7RtJEN43)~h9cFleuBp*5~ylPmQP&uoBCcsbY`X@7qk$}-zO=?De+ zm+n_Aniod;)_n1KpWxSTPHp51&DWGjOZ@U%ro4y7nSp)8`1s8f2?Yy!bvp}!n`=`a zWRCiDr{0g<`X|1^cF4QAm%r35;YHPWX{CU4gXFu9r|3aaOtgijqt})6s_otYI@Nl)X5Dsqz7phm zdn(PK#xK9>`j+B}mrR#7W{#in_57-4u9*KFz4h8qa93Ja(C^=#EmlX%O}Zq#X^>Pi zTJZvoNcXN`yw3=hkunv})E{@fDmHQqCUZK5wU2U$eu z-K86(%$h9}onk&v=Bn1@U3i-JrH%T%)xtQ~+Q|49KVlf{50aDLL-wnK@ucRH(HYSf zsa=yl9`IaaE)k@?Tu{QBR*qqmtoRxK(8TEZY)9Nq;6NDL@5LoQ602~ZEPB{&<4SDc zX(zD}(c5#Bn;~K+t5NHEAv;_3m!sDZ6=<}ODDFjJ1`K2B8(OGPw=*L3#CJm4&KRYJ z^b9oq9Yb5Vvvlom4F3BZ|1+cl=Wy+%4*6BXf0DmQwozfW$#b-T$pr{v{iTGT=fDQ1CB>CFGqDed{LwBj^)j~v z4tLqEN*IqD?pHAz6>%buy*-~FoIC#1>G@a}WdjnZ$~@Qg!4hhZN$C8c_AEEg*4tqh z1mmK)Kl2ay8gIE+8?onw*{px>N3d)C?!LhxEeRXU50*R0Z^+&wc|7H_CV>J|Lo6I% zkh20{At3Vd-@*5~=JnuU-qHM~`FoUxhT&k{Ao%Tn{^1PYI_Slm0-C$>OaF<93d@R+L&Go;P}sj zk%bE8qa&PWn$-i%d=H?bfMg!f7$1-}$GDv%a3tW!UTW|+?SYfv1p_zWnhRD~dwERw z4Ayvmbk;1G&lJTnRk;wO?gC`2lR;PQWOm*ij-8JO5ZdLIFKf6)8VCmW+G zT_;2x{sTk<2wQ|p)31OPC*fR+)B!4Z7aF%czQ0(724easvk%0u5Fg|7SEa&XAo?Ki z!_^{d^}Wsutvm;jbNF2BM<)dvOlpT7RT0BYf#pa1{> literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index 1311cceef..edc3575c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,4 +80,5 @@ zilliz_cloud = [] [project.scripts] init_bench = "vectordb_bench.__main__:main" vectordbbench = "vectordb_bench.cli.vectordbbench:cli" + [tool.setuptools_scm] diff --git a/vectordb_bench/__init__.py b/vectordb_bench/__init__.py index 018cd7732..c3822a64a 100644 --- a/vectordb_bench/__init__.py +++ b/vectordb_bench/__init__.py @@ -35,6 +35,8 @@ class config: K_DEFAULT = 100 # default return top k nearest neighbors during search + RESULTS_LOCAL_DIR = pathlib.Path(__file__).parent.joinpath("results") + CUSTOM_CONFIG_DIR = pathlib.Path(__file__).parent.joinpath("custom/custom_case.json") CAPACITY_TIMEOUT_IN_SECONDS = 24 * 3600 # 24h LOAD_TIMEOUT_DEFAULT = 2.5 * 3600 # 2.5h diff --git a/vectordb_bench/backend/assembler.py b/vectordb_bench/backend/assembler.py index 6b0e3c81d..e7da4d49f 100644 --- a/vectordb_bench/backend/assembler.py +++ b/vectordb_bench/backend/assembler.py @@ -14,7 +14,7 @@ class Assembler: def assemble(cls, run_id , task: TaskConfig, source: DatasetSource) -> CaseRunner: c_cls = task.case_config.case_id.case_cls - c = c_cls() + c = c_cls(task.case_config.custom_case) if type(task.db_case_config) != EmptyDBCaseConfig: task.db_case_config.metric_type = c.dataset.data.metric_type diff --git a/vectordb_bench/backend/cases.py b/vectordb_bench/backend/cases.py index 6f4b35974..6c43bb910 100644 --- a/vectordb_bench/backend/cases.py +++ b/vectordb_bench/backend/cases.py @@ -4,9 +4,13 @@ from typing import Type from vectordb_bench import config +from vectordb_bench.backend.clients.api import MetricType from vectordb_bench.base import BaseModel +from vectordb_bench.frontend.components.custom.getCustomConfig import ( + CustomDatasetConfig, +) -from .dataset import Dataset, DatasetManager +from .dataset import CustomDataset, Dataset, DatasetManager log = logging.getLogger(__name__) @@ -44,25 +48,24 @@ class CaseType(Enum): Performance1536D50K = 50 Custom = 100 + PerformanceCustomDataset = 101 - @property def case_cls(self, custom_configs: dict | None = None) -> Type["Case"]: - if self not in type2case: - raise NotImplementedError(f"Case {self} has not implemented. You can add it manually to vectordb_bench.backend.cases.type2case or define a custom_configs['custom_cls']") - return type2case[self] + if custom_configs is None: + return type2case.get(self)() + else: + return type2case.get(self)(**custom_configs) - @property - def case_name(self) -> str: - c = self.case_cls + def case_name(self, custom_configs: dict | None = None) -> str: + c = self.case_cls(custom_configs) if c is not None: - return c().name + return c.name raise ValueError("Case unsupported") - @property - def case_description(self) -> str: - c = self.case_cls + def case_description(self, custom_configs: dict | None = None) -> str: + c = self.case_cls(custom_configs) if c is not None: - return c().description + return c.description raise ValueError("Case unsupported") @@ -289,26 +292,69 @@ class Performance1536D50K(PerformanceCase): optimize_timeout: float | int | None = 15 * 60 +def metric_type_map(s: str) -> MetricType: + if s.lower() == "cosine": + return MetricType.COSINE + if s.lower() == "l2" or s.lower() == "euclidean": + return MetricType.L2 + if s.lower() == "ip": + return MetricType.IP + err_msg = f"Not support metric_type: {s}" + log.error(err_msg) + raise RuntimeError(err_msg) + + +class PerformanceCustomDataset(PerformanceCase): + case_id: CaseType = CaseType.PerformanceCustomDataset + name: str = "Performance With Custom Dataset" + description: str = "" + dataset: DatasetManager + + def __init__( + self, + name, + description, + load_timeout, + optimize_timeout, + dataset_config, + **kwargs, + ): + dataset_config = CustomDatasetConfig(**dataset_config) + dataset = CustomDataset( + name=dataset_config.name, + size=dataset_config.size, + dim=dataset_config.dim, + metric_type=metric_type_map(dataset_config.metric_type), + use_shuffled=dataset_config.use_shuffled, + with_gt=dataset_config.with_gt, + dir=dataset_config.dir, + file_num=dataset_config.file_count, + ) + super().__init__( + name=name, + description=description, + load_timeout=load_timeout, + optimize_timeout=optimize_timeout, + dataset=DatasetManager(data=dataset), + ) + + type2case = { CaseType.CapacityDim960: CapacityDim960, CaseType.CapacityDim128: CapacityDim128, - CaseType.Performance768D100M: Performance768D100M, CaseType.Performance768D10M: Performance768D10M, CaseType.Performance768D1M: Performance768D1M, - CaseType.Performance768D10M1P: Performance768D10M1P, CaseType.Performance768D1M1P: Performance768D1M1P, CaseType.Performance768D10M99P: Performance768D10M99P, CaseType.Performance768D1M99P: Performance768D1M99P, - CaseType.Performance1536D500K: Performance1536D500K, CaseType.Performance1536D5M: Performance1536D5M, - CaseType.Performance1536D500K1P: Performance1536D500K1P, CaseType.Performance1536D5M1P: Performance1536D5M1P, - CaseType.Performance1536D500K99P: Performance1536D500K99P, CaseType.Performance1536D5M99P: Performance1536D5M99P, CaseType.Performance1536D50K: Performance1536D50K, + CaseType.PerformanceCustomDataset: PerformanceCustomDataset, } diff --git a/vectordb_bench/backend/dataset.py b/vectordb_bench/backend/dataset.py index 2b630eae3..d559eb6be 100644 --- a/vectordb_bench/backend/dataset.py +++ b/vectordb_bench/backend/dataset.py @@ -33,6 +33,7 @@ class BaseDataset(BaseModel): use_shuffled: bool with_gt: bool = False _size_label: dict[int, SizeLabel] = PrivateAttr() + isCustom: bool = False @validator("size") def verify_size(cls, v): @@ -52,7 +53,27 @@ def dir_name(self) -> str: def file_count(self) -> int: return self._size_label.get(self.size).file_count +class CustomDataset(BaseDataset): + dir: str + file_num: int + isCustom: bool = True + + @validator("size") + def verify_size(cls, v): + return v + + @property + def label(self) -> str: + return "Custom" + @property + def dir_name(self) -> str: + return self.dir + + @property + def file_count(self) -> int: + return self.file_num + class LAION(BaseDataset): name: str = "LAION" dim: int = 768 @@ -186,11 +207,12 @@ def prepare(self, gt_file, test_file = utils.compose_gt_file(filters), "test.parquet" all_files.extend([gt_file, test_file]) - source.reader().read( - dataset=self.data.dir_name.lower(), - files=all_files, - local_ds_root=self.data_dir, - ) + if not self.data.isCustom: + source.reader().read( + dataset=self.data.dir_name.lower(), + files=all_files, + local_ds_root=self.data_dir, + ) if gt_file is not None and test_file is not None: self.test_data = self._read_file(test_file) diff --git a/vectordb_bench/custom/custom_case.json b/vectordb_bench/custom/custom_case.json new file mode 100644 index 000000000..48ca8d8c4 --- /dev/null +++ b/vectordb_bench/custom/custom_case.json @@ -0,0 +1,18 @@ +[ + { + "name": "My Dataset (Performace Case)", + "description": "this is a customized dataset.", + "load_timeout": 36000, + "optimize_timeout": 36000, + "dataset_config": { + "name": "My Dataset", + "dir": "/my_dataset_path", + "size": 1000000, + "dim": 1024, + "metric_type": "L2", + "file_count": 1, + "use_shuffled": false, + "with_gt": true + } + } +] \ No newline at end of file diff --git a/vectordb_bench/frontend/components/check_results/charts.py b/vectordb_bench/frontend/components/check_results/charts.py index 7e28d1e66..c2b2813b8 100644 --- a/vectordb_bench/frontend/components/check_results/charts.py +++ b/vectordb_bench/frontend/components/check_results/charts.py @@ -1,19 +1,19 @@ from vectordb_bench.backend.cases import Case from vectordb_bench.frontend.components.check_results.expanderStyle import initMainExpanderStyle from vectordb_bench.metric import metricOrder, isLowerIsBetterMetric, metricUnitMap -from vectordb_bench.frontend.const.styles import * +from vectordb_bench.frontend.config.styles import * from vectordb_bench.models import ResultLabel import plotly.express as px -def drawCharts(st, allData, failedTasks, cases: list[Case]): +def drawCharts(st, allData, failedTasks, caseNames: list[str]): initMainExpanderStyle(st) - for case in cases: - chartContainer = st.expander(case.name, True) - data = [data for data in allData if data["case_name"] == case.name] + for caseName in caseNames: + chartContainer = st.expander(caseName, True) + data = [data for data in allData if data["case_name"] == caseName] drawChart(data, chartContainer) - errorDBs = failedTasks[case.name] + errorDBs = failedTasks[caseName] showFailedDBs(chartContainer, errorDBs) diff --git a/vectordb_bench/frontend/components/check_results/data.py b/vectordb_bench/frontend/components/check_results/data.py index c092da3a0..1e6bba00e 100644 --- a/vectordb_bench/frontend/components/check_results/data.py +++ b/vectordb_bench/frontend/components/check_results/data.py @@ -8,9 +8,9 @@ def getChartData( tasks: list[CaseResult], dbNames: list[str], - cases: list[Case], + caseNames: list[str], ): - filterTasks = getFilterTasks(tasks, dbNames, cases) + filterTasks = getFilterTasks(tasks, dbNames, caseNames) mergedTasks, failedTasks = mergeTasks(filterTasks) return mergedTasks, failedTasks @@ -18,14 +18,13 @@ def getChartData( def getFilterTasks( tasks: list[CaseResult], dbNames: list[str], - cases: list[Case], + caseNames: list[str], ) -> list[CaseResult]: - case_ids = [case.case_id for case in cases] filterTasks = [ task for task in tasks if task.task_config.db_name in dbNames - and task.task_config.case_config.case_id in case_ids + and task.task_config.case_config.case_id.case_cls(task.task_config.case_config.custom_case).name in caseNames ] return filterTasks @@ -36,16 +35,17 @@ def mergeTasks(tasks: list[CaseResult]): db_name = task.task_config.db_name db = task.task_config.db.value db_label = task.task_config.db_config.db_label or "" - case_id = task.task_config.case_config.case_id - dbCaseMetricsMap[db_name][case_id] = { + case = task.task_config.case_config.case_id.case_cls(task.task_config.case_config.custom_case) + dbCaseMetricsMap[db_name][case.name] = { "db": db, "db_label": db_label, "metrics": mergeMetrics( - dbCaseMetricsMap[db_name][case_id].get("metrics", {}), + dbCaseMetricsMap[db_name][case.name].get("metrics", {}), asdict(task.metrics), ), "label": getBetterLabel( - dbCaseMetricsMap[db_name][case_id].get("label", ResultLabel.FAILED), + dbCaseMetricsMap[db_name][case.name].get( + "label", ResultLabel.FAILED), task.label, ), } @@ -53,12 +53,11 @@ def mergeTasks(tasks: list[CaseResult]): mergedTasks = [] failedTasks = defaultdict(lambda: defaultdict(str)) for db_name, caseMetricsMap in dbCaseMetricsMap.items(): - for case_id, metricInfo in caseMetricsMap.items(): + for case_name, metricInfo in caseMetricsMap.items(): metrics = metricInfo["metrics"] db = metricInfo["db"] db_label = metricInfo["db_label"] label = metricInfo["label"] - case_name = case_id.case_name if label == ResultLabel.NORMAL: mergedTasks.append( { @@ -80,7 +79,8 @@ def mergeMetrics(metrics_1: dict, metrics_2: dict) -> dict: metrics = {**metrics_1} for key, value in metrics_2.items(): metrics[key] = ( - getBetterMetric(key, value, metrics[key]) if key in metrics else value + getBetterMetric( + key, value, metrics[key]) if key in metrics else value ) return metrics diff --git a/vectordb_bench/frontend/components/check_results/expanderStyle.py b/vectordb_bench/frontend/components/check_results/expanderStyle.py index 9496313e8..436eeec38 100644 --- a/vectordb_bench/frontend/components/check_results/expanderStyle.py +++ b/vectordb_bench/frontend/components/check_results/expanderStyle.py @@ -1,7 +1,7 @@ def initMainExpanderStyle(st): st.markdown( """""", + unsafe_allow_html=True, + ) \ No newline at end of file diff --git a/vectordb_bench/frontend/components/run_test/autoRefresh.py b/vectordb_bench/frontend/components/run_test/autoRefresh.py index fe31d8205..034ab5017 100644 --- a/vectordb_bench/frontend/components/run_test/autoRefresh.py +++ b/vectordb_bench/frontend/components/run_test/autoRefresh.py @@ -1,5 +1,5 @@ from streamlit_autorefresh import st_autorefresh -from vectordb_bench.frontend.const.styles import * +from vectordb_bench.frontend.config.styles import * def autoRefresh(): diff --git a/vectordb_bench/frontend/components/run_test/caseSelector.py b/vectordb_bench/frontend/components/run_test/caseSelector.py index 49b839163..58799deff 100644 --- a/vectordb_bench/frontend/components/run_test/caseSelector.py +++ b/vectordb_bench/frontend/components/run_test/caseSelector.py @@ -1,9 +1,13 @@ -from vectordb_bench.frontend.const.styles import * + +from vectordb_bench.frontend.config.styles import * from vectordb_bench.backend.cases import CaseType -from vectordb_bench.frontend.const.dbCaseConfigs import * +from vectordb_bench.frontend.config.dbCaseConfigs import * +from collections import defaultdict + +from vectordb_bench.frontend.utils import addHorizontalLine -def caseSelector(st, activedDbList): +def caseSelector(st, activedDbList: list[DB]): st.markdown( "
", unsafe_allow_html=True, @@ -14,41 +18,49 @@ def caseSelector(st, activedDbList): unsafe_allow_html=True, ) - caseIsActived = {case: False for case in CASE_LIST} - allCaseConfigs = {db: {case: {} for case in CASE_LIST} for db in DB_LIST} - for caseOrDivider in CASE_LIST_WITH_DIVIDER: - if caseOrDivider == DIVIDER: - caseItemContainer.markdown( - "
", - unsafe_allow_html=True, - ) + activedCaseList: list[CaseConfig] = [] + dbToCaseClusterConfigs = defaultdict(lambda: defaultdict(dict)) + dbToCaseConfigs = defaultdict(lambda: defaultdict(dict)) + caseClusters = UI_CASE_CLUSTERS + [get_custom_case_cluter()] + for caseCluster in caseClusters: + activedCaseList += caseClusterExpander( + st, caseCluster, dbToCaseClusterConfigs, activedDbList) + for db in dbToCaseClusterConfigs: + for uiCaseItem in dbToCaseClusterConfigs[db]: + for case in uiCaseItem.cases: + dbToCaseConfigs[db][case] = dbToCaseClusterConfigs[db][uiCaseItem] + + return activedCaseList, dbToCaseConfigs + + +def caseClusterExpander(st, caseCluster: UICaseItemCluster, dbToCaseClusterConfigs, activedDbList: list[DB]): + expander = st.expander(caseCluster.label, False) + activedCases: list[CaseConfig] = [] + for uiCaseItem in caseCluster.uiCaseItems: + if uiCaseItem.isLine: + addHorizontalLine(expander) else: - case = caseOrDivider - caseItemContainer = st.container() - caseIsActived[case] = caseItem( - caseItemContainer, allCaseConfigs, case, activedDbList - ) - activedCaseList = [case for case in CASE_LIST if caseIsActived[case]] - return activedCaseList, allCaseConfigs + activedCases += caseItemCheckbox(expander, + dbToCaseClusterConfigs, uiCaseItem, activedDbList) + return activedCases -def caseItem(st, allCaseConfigs, case: CaseType, activedDbList): - selected = st.checkbox(case.case_name) +def caseItemCheckbox(st, dbToCaseClusterConfigs, uiCaseItem: UICaseItem, activedDbList: list[DB]): + selected = st.checkbox(uiCaseItem.label) st.markdown( - f"
{case.case_description}
", + f"
{uiCaseItem.description}
", unsafe_allow_html=True, ) if selected: - caseConfigSettingContainer = st.container() caseConfigSetting( - caseConfigSettingContainer, allCaseConfigs, case, activedDbList + st.container(), dbToCaseClusterConfigs, uiCaseItem, activedDbList ) - return selected + return uiCaseItem.cases if selected else [] -def caseConfigSetting(st, allCaseConfigs, case, activedDbList): +def caseConfigSetting(st, dbToCaseClusterConfigs, uiCaseItem: UICaseItem, activedDbList: list[DB]): for db in activedDbList: columns = st.columns(1 + CASE_CONFIG_SETTING_COLUMNS) # column 0 - title @@ -57,12 +69,12 @@ def caseConfigSetting(st, allCaseConfigs, case, activedDbList): f"
{db.name}
", unsafe_allow_html=True, ) - caseConfig = allCaseConfigs[db][case] k = 0 - for config in CASE_CONFIG_MAP.get(db, {}).get(case.case_cls().label, []): + caseConfig = dbToCaseClusterConfigs[db][uiCaseItem] + for config in CASE_CONFIG_MAP.get(db, {}).get(uiCaseItem.caseLabel, []): if config.isDisplayed(caseConfig): column = columns[1 + k % CASE_CONFIG_SETTING_COLUMNS] - key = "%s-%s-%s" % (db, case, config.label.value) + key = "%s-%s-%s" % (db, uiCaseItem.label, config.label.value) if config.inputType == InputType.Text: caseConfig[config.label] = column.text_input( config.displayLabel if config.displayLabel else config.label.value, diff --git a/vectordb_bench/frontend/components/run_test/dbConfigSetting.py b/vectordb_bench/frontend/components/run_test/dbConfigSetting.py index ffd52721f..8f4f35c93 100644 --- a/vectordb_bench/frontend/components/run_test/dbConfigSetting.py +++ b/vectordb_bench/frontend/components/run_test/dbConfigSetting.py @@ -1,13 +1,9 @@ from pydantic import ValidationError -from vectordb_bench.frontend.const.styles import * +from vectordb_bench.frontend.config.styles import * from vectordb_bench.frontend.utils import inputIsPassword def dbConfigSettings(st, activedDbList): - st.markdown( - "", - unsafe_allow_html=True, - ) expander = st.expander("Configurations for the selected databases", True) dbConfigs = {} diff --git a/vectordb_bench/frontend/components/run_test/dbSelector.py b/vectordb_bench/frontend/components/run_test/dbSelector.py index 5fcbd8c08..ccf0168c6 100644 --- a/vectordb_bench/frontend/components/run_test/dbSelector.py +++ b/vectordb_bench/frontend/components/run_test/dbSelector.py @@ -1,7 +1,6 @@ from streamlit.runtime.media_file_storage import MediaFileStorageError - -from vectordb_bench.frontend.const.styles import * -from vectordb_bench.frontend.const.dbCaseConfigs import DB_LIST +from vectordb_bench.frontend.config.styles import DB_SELECTOR_COLUMNS, DB_TO_ICON +from vectordb_bench.frontend.config.dbCaseConfigs import DB_LIST def dbSelector(st): @@ -18,17 +17,6 @@ def dbSelector(st): dbContainerColumns = st.columns(DB_SELECTOR_COLUMNS, gap="small") dbIsActived = {db: False for db in DB_LIST} - # style - image; column gap; checkbox font; - st.markdown( - """ - - """, - unsafe_allow_html=True, - ) for i, db in enumerate(DB_LIST): column = dbContainerColumns[i % DB_SELECTOR_COLUMNS] dbIsActived[db] = column.checkbox(db.name) diff --git a/vectordb_bench/frontend/components/run_test/generateTasks.py b/vectordb_bench/frontend/components/run_test/generateTasks.py index 55f3c8399..828913f30 100644 --- a/vectordb_bench/frontend/components/run_test/generateTasks.py +++ b/vectordb_bench/frontend/components/run_test/generateTasks.py @@ -1,17 +1,15 @@ +from vectordb_bench.backend.clients import DB from vectordb_bench.models import CaseConfig, CaseConfigParamType, TaskConfig -def generate_tasks(activedDbList, dbConfigs, activedCaseList, allCaseConfigs): +def generate_tasks(activedDbList: list[DB], dbConfigs, activedCaseList: list[CaseConfig], allCaseConfigs): tasks = [] for db in activedDbList: for case in activedCaseList: task = TaskConfig( db=db.value, db_config=dbConfigs[db], - case_config=CaseConfig( - case_id=case.value, - custom_case={}, - ), + case_config=case, db_case_config=db.case_config_cls( allCaseConfigs[db][case].get(CaseConfigParamType.IndexType, None) )(**{key.value: value for key, value in allCaseConfigs[db][case].items()}), diff --git a/vectordb_bench/frontend/components/run_test/initStyle.py b/vectordb_bench/frontend/components/run_test/initStyle.py new file mode 100644 index 000000000..59dd438e1 --- /dev/null +++ b/vectordb_bench/frontend/components/run_test/initStyle.py @@ -0,0 +1,14 @@ +def initStyle(st): + st.markdown( + """""", + unsafe_allow_html=True, + ) \ No newline at end of file diff --git a/vectordb_bench/frontend/components/run_test/submitTask.py b/vectordb_bench/frontend/components/run_test/submitTask.py index 26cb1ef70..f824dd9d9 100644 --- a/vectordb_bench/frontend/components/run_test/submitTask.py +++ b/vectordb_bench/frontend/components/run_test/submitTask.py @@ -1,5 +1,5 @@ from datetime import datetime -from vectordb_bench.frontend.const.styles import * +from vectordb_bench.frontend.config.styles import * from vectordb_bench.interface import benchMarkRunner diff --git a/vectordb_bench/frontend/const/dbCaseConfigs.py b/vectordb_bench/frontend/config/dbCaseConfigs.py similarity index 78% rename from vectordb_bench/frontend/const/dbCaseConfigs.py rename to vectordb_bench/frontend/config/dbCaseConfigs.py index ed101ac69..ce8a3a4ae 100644 --- a/vectordb_bench/frontend/const/dbCaseConfigs.py +++ b/vectordb_bench/frontend/config/dbCaseConfigs.py @@ -1,43 +1,147 @@ -from enum import IntEnum +from enum import IntEnum, Enum import typing from pydantic import BaseModel from vectordb_bench.backend.cases import CaseLabel, CaseType from vectordb_bench.backend.clients import DB from vectordb_bench.backend.clients.api import IndexType +from vectordb_bench.frontend.components.custom.getCustomConfig import get_custom_configs -from vectordb_bench.models import CaseConfigParamType +from vectordb_bench.models import CaseConfig, CaseConfigParamType MAX_STREAMLIT_INT = (1 << 53) - 1 DB_LIST = [d for d in DB if d != DB.Test] -DIVIDER = "DIVIDER" -CASE_LIST_WITH_DIVIDER = [ + +class Delimiter(Enum): + Line = "line" + + +class BatchCaseConfig(BaseModel): + label: str = "" + description: str = "" + cases: list[CaseConfig] = [] + + +class UICaseItem(BaseModel): + isLine: bool = False + label: str = "" + description: str = "" + cases: list[CaseConfig] = [] + caseLabel: CaseLabel = CaseLabel.Performance + + def __init__( + self, + isLine: bool = False, + case_id: CaseType = None, + custom_case: dict = {}, + cases: list[CaseConfig] = [], + label: str = "", + description: str = "", + caseLabel: CaseLabel = CaseLabel.Performance, + ): + if isLine is True: + super().__init__(isLine=True) + elif case_id is not None and isinstance(case_id, CaseType): + c = case_id.case_cls(custom_case) + super().__init__( + label=c.name, + description=c.description, + cases=[CaseConfig(case_id=case_id, custom_case=custom_case)], + caseLabel=c.label, + ) + else: + super().__init__( + label=label, + description=description, + cases=cases, + caseLabel=caseLabel, + ) + + def __hash__(self) -> int: + return hash(self.json()) + + +class UICaseItemCluster(BaseModel): + label: str = "" + uiCaseItems: list[UICaseItem] = [] + + +def get_custom_case_items() -> list[UICaseItem]: + custom_configs = get_custom_configs() + return [ + UICaseItem( + case_id=CaseType.PerformanceCustomDataset, custom_case=custom_config.dict() + ) + for custom_config in custom_configs + ] + + +def get_custom_case_cluter() -> UICaseItemCluster: + return UICaseItemCluster( + label="Custom Search Performance Test", uiCaseItems=get_custom_case_items() + ) + + +UI_CASE_CLUSTERS: list[UICaseItemCluster] = [ + UICaseItemCluster( + label="Search Performance Test", + uiCaseItems=[ + UICaseItem(case_id=CaseType.Performance768D100M), + UICaseItem(case_id=CaseType.Performance768D10M), + UICaseItem(case_id=CaseType.Performance768D1M), + UICaseItem(isLine=True), + UICaseItem(case_id=CaseType.Performance1536D5M), + UICaseItem(case_id=CaseType.Performance1536D500K), + UICaseItem(case_id=CaseType.Performance1536D50K), + ], + ), + UICaseItemCluster( + label="Filter Search Performance Test", + uiCaseItems=[ + UICaseItem(case_id=CaseType.Performance768D10M1P), + UICaseItem(case_id=CaseType.Performance768D10M99P), + UICaseItem(case_id=CaseType.Performance768D1M1P), + UICaseItem(case_id=CaseType.Performance768D1M99P), + UICaseItem(isLine=True), + UICaseItem(case_id=CaseType.Performance1536D5M1P), + UICaseItem(case_id=CaseType.Performance1536D5M99P), + UICaseItem(case_id=CaseType.Performance1536D500K1P), + UICaseItem(case_id=CaseType.Performance1536D500K99P), + ], + ), + UICaseItemCluster( + label="Capacity Test", + uiCaseItems=[ + UICaseItem(case_id=CaseType.CapacityDim960), + UICaseItem(case_id=CaseType.CapacityDim128), + ], + ), +] + +# DIVIDER = "DIVIDER" +DISPLAY_CASE_ORDER: list[CaseType] = [ CaseType.Performance768D100M, CaseType.Performance768D10M, CaseType.Performance768D1M, - DIVIDER, CaseType.Performance1536D5M, CaseType.Performance1536D500K, CaseType.Performance1536D50K, - DIVIDER, CaseType.Performance768D10M1P, CaseType.Performance768D1M1P, - DIVIDER, CaseType.Performance1536D5M1P, CaseType.Performance1536D500K1P, - DIVIDER, CaseType.Performance768D10M99P, CaseType.Performance768D1M99P, - DIVIDER, CaseType.Performance1536D5M99P, CaseType.Performance1536D500K99P, - DIVIDER, CaseType.CapacityDim960, CaseType.CapacityDim128, ] +CASE_NAME_ORDER = [case.case_cls().name for case in DISPLAY_CASE_ORDER] -CASE_LIST = [item for item in CASE_LIST_WITH_DIVIDER if isinstance(item, CaseType)] +# CASE_LIST = [ +# item for item in CASE_LIST_WITH_DIVIDER if isinstance(item, CaseType)] class InputType(IntEnum): @@ -53,7 +157,7 @@ class CaseConfigInput(BaseModel): inputHelp: str = "" displayLabel: str = "" # todo type should be a function - isDisplayed: typing.Any = lambda x: True + isDisplayed: typing.Any = lambda config: True CaseConfigParamInput_IndexType = CaseConfigInput( @@ -146,7 +250,7 @@ class CaseConfigInput(BaseModel): CaseConfigParamInput_maintenance_work_mem_PgVector = CaseConfigInput( label=CaseConfigParamType.maintenance_work_mem, inputHelp="Recommended value: 1.33x the index size, not to exceed the available free memory." - "Specify in gigabytes. e.g. 8GB", + "Specify in gigabytes. e.g. 8GB", inputType=InputType.Text, inputConfig={ "value": "8GB", @@ -157,7 +261,7 @@ class CaseConfigInput(BaseModel): label=CaseConfigParamType.max_parallel_workers, displayLabel="Max parallel workers", inputHelp="Recommended value: (cpu cores - 1). This will set the parameters: max_parallel_maintenance_workers," - " max_parallel_workers & table(parallel_workers)", + " max_parallel_workers & table(parallel_workers)", inputType=InputType.Number, inputConfig={ "min": 0, @@ -514,7 +618,8 @@ class CaseConfigInput(BaseModel): "options": ["x4", "x8", "x16", "x32", "x64"], }, isDisplayed=lambda config: config.get(CaseConfigParamType.quantizationType, None) - == "product" and config.get(CaseConfigParamType.IndexType, None) + == "product" + and config.get(CaseConfigParamType.IndexType, None) in [ IndexType.HNSW.value, IndexType.IVFFlat.value, @@ -582,22 +687,24 @@ class CaseConfigInput(BaseModel): CaseConfigParamInput_NumCandidates_ES, ] -PgVectorLoadingConfig = [CaseConfigParamInput_IndexType_PgVector, - CaseConfigParamInput_Lists_PgVector, - CaseConfigParamInput_m, - CaseConfigParamInput_EFConstruction_PgVector, - CaseConfigParamInput_maintenance_work_mem_PgVector, - CaseConfigParamInput_max_parallel_workers_PgVector, - ] -PgVectorPerformanceConfig = [CaseConfigParamInput_IndexType_PgVector, - CaseConfigParamInput_m, - CaseConfigParamInput_EFConstruction_PgVector, - CaseConfigParamInput_EFSearch_PgVector, - CaseConfigParamInput_Lists_PgVector, - CaseConfigParamInput_Probes_PgVector, - CaseConfigParamInput_maintenance_work_mem_PgVector, - CaseConfigParamInput_max_parallel_workers_PgVector, - ] +PgVectorLoadingConfig = [ + CaseConfigParamInput_IndexType_PgVector, + CaseConfigParamInput_Lists_PgVector, + CaseConfigParamInput_m, + CaseConfigParamInput_EFConstruction_PgVector, + CaseConfigParamInput_maintenance_work_mem_PgVector, + CaseConfigParamInput_max_parallel_workers_PgVector, +] +PgVectorPerformanceConfig = [ + CaseConfigParamInput_IndexType_PgVector, + CaseConfigParamInput_m, + CaseConfigParamInput_EFConstruction_PgVector, + CaseConfigParamInput_EFSearch_PgVector, + CaseConfigParamInput_Lists_PgVector, + CaseConfigParamInput_Probes_PgVector, + CaseConfigParamInput_maintenance_work_mem_PgVector, + CaseConfigParamInput_max_parallel_workers_PgVector, +] PgVectoRSLoadingConfig = [ CaseConfigParamInput_IndexType, diff --git a/vectordb_bench/frontend/const/dbPrices.py b/vectordb_bench/frontend/config/dbPrices.py similarity index 100% rename from vectordb_bench/frontend/const/dbPrices.py rename to vectordb_bench/frontend/config/dbPrices.py diff --git a/vectordb_bench/frontend/const/styles.py b/vectordb_bench/frontend/config/styles.py similarity index 100% rename from vectordb_bench/frontend/const/styles.py rename to vectordb_bench/frontend/config/styles.py diff --git a/vectordb_bench/frontend/pages/concurrent.py b/vectordb_bench/frontend/pages/concurrent.py index 0c1415efc..b4eae339c 100644 --- a/vectordb_bench/frontend/pages/concurrent.py +++ b/vectordb_bench/frontend/pages/concurrent.py @@ -1,18 +1,14 @@ - - - import streamlit as st -from vectordb_bench.backend.cases import CaseType from vectordb_bench.frontend.components.check_results.footer import footer -from vectordb_bench.frontend.components.check_results.expanderStyle import initMainExpanderStyle -from vectordb_bench.frontend.components.check_results.priceTable import priceTable from vectordb_bench.frontend.components.check_results.headerIcon import drawHeaderIcon -from vectordb_bench.frontend.components.check_results.nav import NavToResults, NavToRunTest -from vectordb_bench.frontend.components.check_results.charts import drawMetricChart +from vectordb_bench.frontend.components.check_results.nav import ( + NavToResults, + NavToRunTest, +) from vectordb_bench.frontend.components.check_results.filters import getshownData from vectordb_bench.frontend.components.concurrent.charts import drawChartsByCase from vectordb_bench.frontend.components.get_results.saveAsImage import getResults -from vectordb_bench.frontend.const.styles import * +from vectordb_bench.frontend.config.styles import FAVICON from vectordb_bench.interface import benchMarkRunner from vectordb_bench.models import TestResult @@ -30,26 +26,23 @@ def main(): drawHeaderIcon(st) allResults = benchMarkRunner.get_results() - + def check_conc_data(res: TestResult): case_results = res.results count = 0 for case_result in case_results: if len(case_result.metrics.conc_num_list) > 0: count += 1 - + return count > 0 - + checkedResults = [res for res in allResults if check_conc_data(res)] - st.title("VectorDB Benchmark (Concurrent Performance)") # results selector resultSelectorContainer = st.sidebar.container() - shownData, _, showCases = getshownData( - checkedResults, resultSelectorContainer) - + shownData, _, showCaseNames = getshownData(checkedResults, resultSelectorContainer) resultSelectorContainer.divider() @@ -61,8 +54,8 @@ def check_conc_data(res: TestResult): # save or share resultesContainer = st.sidebar.container() getResults(resultesContainer, "vectordb_bench_concurrent") - - drawChartsByCase(shownData, showCases, st.container()) + + drawChartsByCase(shownData, showCaseNames, st.container()) # footer footer(st.container()) diff --git a/vectordb_bench/frontend/pages/custom.py b/vectordb_bench/frontend/pages/custom.py new file mode 100644 index 000000000..28c249f78 --- /dev/null +++ b/vectordb_bench/frontend/pages/custom.py @@ -0,0 +1,64 @@ +import streamlit as st +from vectordb_bench.frontend.components.check_results.headerIcon import drawHeaderIcon +from vectordb_bench.frontend.components.custom.displayCustomCase import displayCustomCase +from vectordb_bench.frontend.components.custom.displaypPrams import displayParams +from vectordb_bench.frontend.components.custom.getCustomConfig import CustomCaseConfig, generate_custom_case, get_custom_configs, save_custom_configs +from vectordb_bench.frontend.components.custom.initStyle import initStyle +from vectordb_bench.frontend.config.styles import FAVICON, PAGE_TITLE + + +class CustomCaseManager(): + customCaseItems: list[CustomCaseConfig] + + def __init__(self): + self.customCaseItems = get_custom_configs() + + def addCase(self): + new_custom_case = generate_custom_case() + new_custom_case.dataset_config.name = f"{new_custom_case.dataset_config.name} {len(self.customCaseItems)}" + self.customCaseItems += [new_custom_case] + self.save() + + def deleteCase(self, idx: int): + self.customCaseItems.pop(idx) + self.save() + + def save(self): + save_custom_configs(self.customCaseItems) + + +def main(): + st.set_page_config( + page_title=PAGE_TITLE, + page_icon=FAVICON, + # layout="wide", + # initial_sidebar_state="collapsed", + ) + + # header + drawHeaderIcon(st) + + # init style + initStyle(st) + + st.title("Custom Dataset") + displayParams(st) + customCaseManager = CustomCaseManager() + + for idx, customCase in enumerate(customCaseManager.customCaseItems): + expander = st.expander(customCase.dataset_config.name, expanded=True) + key = f"custom_case_{idx}" + displayCustomCase(customCase, expander, key=key) + + columns = expander.columns(8) + columns[0].button( + "Save", key=f"{key}_", type="secondary", on_click=lambda: customCaseManager.save()) + columns[1].button(":red[Delete]", key=f"{key}_delete", type="secondary", + on_click=lambda: customCaseManager.deleteCase(idx)) + + st.button("\+ New Dataset", key=f"add_custom_configs", + type="primary", on_click=lambda: customCaseManager.addCase()) + + +if __name__ == "__main__": + main() diff --git a/vectordb_bench/frontend/pages/quries_per_dollar.py b/vectordb_bench/frontend/pages/quries_per_dollar.py index 10c1ac8f1..0bb05294b 100644 --- a/vectordb_bench/frontend/pages/quries_per_dollar.py +++ b/vectordb_bench/frontend/pages/quries_per_dollar.py @@ -8,7 +8,7 @@ from vectordb_bench.frontend.components.check_results.charts import drawMetricChart from vectordb_bench.frontend.components.check_results.filters import getshownData from vectordb_bench.frontend.components.get_results.saveAsImage import getResults -from vectordb_bench.frontend.const.styles import * +from vectordb_bench.frontend.config.styles import * from vectordb_bench.interface import benchMarkRunner from vectordb_bench.metric import QURIES_PER_DOLLAR_METRIC @@ -26,7 +26,7 @@ def main(): # results selector resultSelectorContainer = st.sidebar.container() - shownData, _, showCases = getshownData(allResults, resultSelectorContainer) + shownData, _, showCaseNames = getshownData(allResults, resultSelectorContainer) resultSelectorContainer.divider() @@ -45,8 +45,8 @@ def main(): priceMap = priceTable(priceTableContainer, shownData) # charts - for case in showCases: - data = [data for data in shownData if data["case_name"] == case.name] + for caseName in showCaseNames: + data = [data for data in shownData if data["case_name"] == caseName] dataWithMetric = [] metric = QURIES_PER_DOLLAR_METRIC for d in data: @@ -56,7 +56,7 @@ def main(): d[metric] = d["qps"] / price * 3.6 dataWithMetric.append(d) if len(dataWithMetric) > 0: - chartContainer = st.expander(case.name, True) + chartContainer = st.expander(caseName, True) drawMetricChart(data, metric, chartContainer) # footer diff --git a/vectordb_bench/frontend/pages/run_test.py b/vectordb_bench/frontend/pages/run_test.py index 0712bb6cc..1297743ae 100644 --- a/vectordb_bench/frontend/pages/run_test.py +++ b/vectordb_bench/frontend/pages/run_test.py @@ -5,6 +5,7 @@ from vectordb_bench.frontend.components.run_test.dbSelector import dbSelector from vectordb_bench.frontend.components.run_test.generateTasks import generate_tasks from vectordb_bench.frontend.components.run_test.hideSidebar import hideSidebar +from vectordb_bench.frontend.components.run_test.initStyle import initStyle from vectordb_bench.frontend.components.run_test.submitTask import submitTask from vectordb_bench.frontend.components.check_results.nav import NavToResults from vectordb_bench.frontend.components.check_results.headerIcon import drawHeaderIcon @@ -15,6 +16,9 @@ def main(): # set page config initRunTestPageConfig(st) + # init style + initStyle(st) + # header drawHeaderIcon(st) diff --git a/vectordb_bench/frontend/pages/tables.py b/vectordb_bench/frontend/pages/tables.py index a4dab68a6..c088dc930 100644 --- a/vectordb_bench/frontend/pages/tables.py +++ b/vectordb_bench/frontend/pages/tables.py @@ -1,7 +1,7 @@ import streamlit as st from vectordb_bench.frontend.components.check_results.headerIcon import drawHeaderIcon from vectordb_bench.frontend.components.tables.data import getNewResults -from vectordb_bench.frontend.const.styles import FAVICON +from vectordb_bench.frontend.config.styles import FAVICON def main(): @@ -21,4 +21,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/vectordb_bench/frontend/utils.py b/vectordb_bench/frontend/utils.py index 139854af6..787b67d03 100644 --- a/vectordb_bench/frontend/utils.py +++ b/vectordb_bench/frontend/utils.py @@ -1,6 +1,22 @@ -from vectordb_bench.models import CaseType +import random +import string + passwordKeys = ["password", "api_key"] + + def inputIsPassword(key: str) -> bool: return key.lower() in passwordKeys + +def addHorizontalLine(st): + st.markdown( + "
", + unsafe_allow_html=True, + ) + + +def generate_random_string(length): + letters = string.ascii_letters + string.digits + result = ''.join(random.choice(letters) for _ in range(length)) + return result diff --git a/vectordb_bench/frontend/vdb_benchmark.py b/vectordb_bench/frontend/vdb_benchmark.py index 0be43470e..b859c68b8 100644 --- a/vectordb_bench/frontend/vdb_benchmark.py +++ b/vectordb_bench/frontend/vdb_benchmark.py @@ -6,7 +6,7 @@ from vectordb_bench.frontend.components.check_results.charts import drawCharts from vectordb_bench.frontend.components.check_results.filters import getshownData from vectordb_bench.frontend.components.get_results.saveAsImage import getResults -from vectordb_bench.frontend.const.styles import * +from vectordb_bench.frontend.config.styles import * from vectordb_bench.interface import benchMarkRunner @@ -24,7 +24,7 @@ def main(): # results selector and filter resultSelectorContainer = st.sidebar.container() - shownData, failedTasks, showCases = getshownData( + shownData, failedTasks, showCaseNames = getshownData( allResults, resultSelectorContainer ) @@ -40,7 +40,7 @@ def main(): getResults(resultesContainer, "vectordb_bench") # charts - drawCharts(st, shownData, failedTasks, showCases) + drawCharts(st, shownData, failedTasks, showCaseNames) # footer footer(st.container()) diff --git a/vectordb_bench/models.py b/vectordb_bench/models.py index aa9c930ea..56034796e 100644 --- a/vectordb_bench/models.py +++ b/vectordb_bench/models.py @@ -94,6 +94,10 @@ def k(self, value): self._k = value ''' + def __hash__(self) -> int: + return hash(self.json()) + + class TaskStage(StrEnum): """Enumerations of various stages of the task""" @@ -250,18 +254,18 @@ def append_return(x, y): max_db = max(map(len, [f.task_config.db.name for f in filtered_results])) max_db_labels = ( - max(map(len, [f.task_config.db_config.db_label for f in filtered_results])) - + 3 + max(map(len, [f.task_config.db_config.db_label for f in filtered_results])) + + 3 ) max_case = max( map(len, [f.task_config.case_config.case_id.name for f in filtered_results]) ) max_load_dur = ( - max(map(len, [str(f.metrics.load_duration) for f in filtered_results])) + 3 + max(map(len, [str(f.metrics.load_duration) for f in filtered_results])) + 3 ) max_qps = max(map(len, [str(f.metrics.qps) for f in filtered_results])) + 3 max_recall = ( - max(map(len, [str(f.metrics.recall) for f in filtered_results])) + 3 + max(map(len, [str(f.metrics.recall) for f in filtered_results])) + 3 ) max_db_labels = 8 if max_db_labels < 8 else max_db_labels diff --git a/vectordb_bench/results/getLeaderboardData.py b/vectordb_bench/results/getLeaderboardData.py index 50f458533..c6484514d 100644 --- a/vectordb_bench/results/getLeaderboardData.py +++ b/vectordb_bench/results/getLeaderboardData.py @@ -2,7 +2,7 @@ import ujson import pathlib from vectordb_bench.backend.cases import CaseType -from vectordb_bench.frontend.const.dbPrices import DB_DBLABEL_TO_PRICE +from vectordb_bench.frontend.config.dbPrices import DB_DBLABEL_TO_PRICE from vectordb_bench.interface import benchMarkRunner from vectordb_bench.models import CaseResult, ResultLabel, TestResult