diff --git a/coverage.xml b/coverage.xml index bcccea3f3bcfa3f2adc89fcb5b32308b04522852..797bf7980f1f3c11d1bf1fe2e0326db2beeb5a85 100644 --- a/coverage.xml +++ b/coverage.xml @@ -1,148 +1,139 @@ <?xml version="1.0" ?> -<coverage version="7.4.4" timestamp="1714280906690" lines-valid="2388" lines-covered="978" line-rate="0.4095" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0"> - <!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.4.4 --> +<coverage version="7.6.12" timestamp="1739514868967" lines-valid="4124" lines-covered="2081" line-rate="0.5046" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0"> + <!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.6.12 --> <!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd --> <sources> - <source>/Users/jamesbriggs/Documents/projects/aurelio-labs/semantic-router/semantic_router</source> + <source>/Users/bogdanbuduroiu/development/aurelio-labs/semantic-router/semantic_router</source> </sources> <packages> - <package name="." line-rate="0.2415" branch-rate="0" complexity="0"> + <package name="." line-rate="0.7328" branch-rate="0" complexity="0"> <classes> - <class name="__init__.py" filename="__init__.py" complexity="0" line-rate="0.4" branch-rate="0"> + <class name="__init__.py" filename="__init__.py" complexity="0" line-rate="1" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> <line number="2" hits="1"/> - <line number="3" hits="0"/> - <line number="5" hits="0"/> - <line number="7" hits="0"/> + <line number="4" hits="1"/> + <line number="6" hits="1"/> </lines> </class> - <class name="hybrid_layer.py" filename="hybrid_layer.py" complexity="0" line-rate="0.1933" branch-rate="0"> + <class name="linear.py" filename="linear.py" complexity="0" line-rate="1" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> <line number="3" hits="1"/> <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="15" hits="1"/> + <line number="7" hits="1"/> <line number="16" hits="1"/> <line number="17" hits="1"/> <line number="18" hits="1"/> <line number="19" hits="1"/> + <line number="22" hits="1"/> + <line number="30" hits="1"/> + <line number="31" hits="1"/> + <line number="32" hits="1"/> + <line number="34" hits="1"/> + </lines> + </class> + <class name="route.py" filename="route.py" complexity="0" line-rate="0.7957" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="3" hits="1"/> + <line number="5" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="9" hits="1"/> + <line number="10" hits="1"/> + <line number="13" hits="1"/> <line number="21" hits="1"/> - <line number="30" hits="0"/> - <line number="31" hits="0"/> - <line number="33" hits="0"/> - <line number="34" hits="0"/> - <line number="35" hits="0"/> - <line number="37" hits="0"/> - <line number="39" hits="0"/> - <line number="40" hits="0"/> - <line number="41" hits="0"/> - <line number="42" hits="0"/> - <line number="43" hits="0"/> - <line number="44" hits="0"/> - <line number="45" hits="0"/> - <line number="48" hits="0"/> - <line number="49" hits="0"/> - <line number="50" hits="0"/> - <line number="53" hits="0"/> - <line number="55" hits="0"/> - <line number="59" hits="0"/> - <line number="61" hits="1"/> - <line number="62" hits="0"/> - <line number="63" hits="0"/> - <line number="64" hits="0"/> - <line number="65" hits="0"/> - <line number="66" hits="0"/> - <line number="68" hits="0"/> + <line number="22" hits="1"/> + <line number="23" hits="1"/> + <line number="25" hits="1"/> + <line number="26" hits="1"/> + <line number="27" hits="1"/> + <line number="28" hits="1"/> + <line number="29" hits="1"/> + <line number="32" hits="1"/> + <line number="33" hits="1"/> + <line number="35" hits="1"/> + <line number="36" hits="1"/> + <line number="37" hits="1"/> + <line number="40" hits="1"/> + <line number="42" hits="1"/> + <line number="43" hits="1"/> + <line number="44" hits="1"/> + <line number="45" hits="1"/> + <line number="48" hits="1"/> + <line number="67" hits="1"/> + <line number="68" hits="1"/> + <line number="69" hits="1"/> <line number="70" hits="1"/> - <line number="71" hits="0"/> + <line number="71" hits="1"/> + <line number="72" hits="1"/> <line number="73" hits="1"/> - <line number="74" hits="0"/> - <line number="76" hits="0"/> - <line number="78" hits="0"/> - <line number="81" hits="0"/> - <line number="83" hits="0"/> - <line number="84" hits="0"/> - <line number="87" hits="0"/> - <line number="89" hits="0"/> - <line number="92" hits="0"/> + <line number="75" hits="1"/> + <line number="76" hits="1"/> + <line number="78" hits="1"/> + <line number="87" hits="1"/> + <line number="88" hits="1"/> + <line number="89" hits="1"/> <line number="93" hits="0"/> - <line number="95" hits="0"/> - <line number="96" hits="0"/> - <line number="97" hits="0"/> - <line number="99" hits="1"/> - <line number="101" hits="0"/> + <line number="94" hits="0"/> + <line number="99" hits="0"/> <line number="102" hits="0"/> <line number="105" hits="0"/> <line number="106" hits="0"/> - <line number="109" hits="0"/> - <line number="110" hits="0"/> - <line number="111" hits="0"/> - <line number="117" hits="1"/> + <line number="108" hits="1"/> + <line number="117" hits="0"/> <line number="118" hits="0"/> - <line number="120" hits="0"/> - <line number="126" hits="1"/> - <line number="127" hits="0"/> + <line number="119" hits="0"/> + <line number="123" hits="0"/> + <line number="124" hits="0"/> <line number="129" hits="0"/> - <line number="135" hits="1"/> - <line number="140" hits="0"/> - <line number="141" hits="0"/> - <line number="143" hits="0"/> - <line number="144" hits="0"/> + <line number="132" hits="0"/> + <line number="135" hits="0"/> + <line number="136" hits="0"/> + <line number="138" hits="1"/> + <line number="144" hits="1"/> + <line number="145" hits="1"/> <line number="146" hits="0"/> - <line number="148" hits="0"/> - <line number="150" hits="0"/> - <line number="151" hits="0"/> - <line number="152" hits="0"/> - <line number="154" hits="0"/> - <line number="155" hits="0"/> - <line number="156" hits="0"/> - <line number="157" hits="0"/> - <line number="159" hits="0"/> - <line number="160" hits="0"/> - <line number="161" hits="0"/> - <line number="163" hits="0"/> - <line number="164" hits="0"/> - <line number="166" hits="0"/> - <line number="167" hits="0"/> - <line number="169" hits="1"/> - <line number="171" hits="0"/> - <line number="172" hits="0"/> - <line number="173" hits="0"/> - <line number="175" hits="1"/> - <line number="176" hits="0"/> - <line number="177" hits="0"/> - <line number="178" hits="0"/> - <line number="179" hits="0"/> - <line number="180" hits="0"/> - <line number="181" hits="0"/> - <line number="183" hits="0"/> - <line number="187" hits="1"/> - <line number="188" hits="0"/> - <line number="189" hits="0"/> - <line number="190" hits="0"/> - <line number="191" hits="0"/> - <line number="192" hits="0"/> - <line number="193" hits="0"/> - <line number="195" hits="0"/> - <line number="198" hits="0"/> + <line number="151" hits="1"/> + <line number="153" hits="1"/> + <line number="154" hits="1"/> + <line number="162" hits="1"/> + <line number="164" hits="1"/> + <line number="165" hits="1"/> + <line number="177" hits="1"/> + <line number="178" hits="1"/> + <line number="181" hits="1"/> + <line number="182" hits="1"/> + <line number="184" hits="1"/> + <line number="185" hits="1"/> + <line number="195" hits="1"/> + <line number="196" hits="1"/> + <line number="198" hits="1"/> + <line number="199" hits="1"/> + <line number="200" hits="1"/> <line number="202" hits="0"/> - <line number="205" hits="0"/> - <line number="206" hits="0"/> - <line number="208" hits="0"/> - <line number="209" hits="0"/> - <line number="211" hits="1"/> - <line number="212" hits="0"/> - <line number="213" hits="0"/> - <line number="215" hits="0"/> + <line number="204" hits="1"/> + <line number="205" hits="1"/> + <line number="216" hits="1"/> + <line number="219" hits="1"/> + <line number="245" hits="1"/> + <line number="246" hits="1"/> + <line number="247" hits="1"/> + <line number="248" hits="0"/> + <line number="250" hits="1"/> + <line number="252" hits="1"/> + <line number="253" hits="1"/> + <line number="254" hits="1"/> + <line number="255" hits="1"/> + <line number="256" hits="0"/> </lines> </class> - <class name="layer.py" filename="layer.py" complexity="0" line-rate="0.04217" branch-rate="0"> + <class name="schema.py" filename="schema.py" complexity="0" line-rate="0.7" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> @@ -154,447 +145,269 @@ <line number="8" hits="1"/> <line number="9" hits="1"/> <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="0"/> - <line number="18" hits="0"/> - <line number="21" hits="0"/> - <line number="24" hits="0"/> - <line number="25" hits="0"/> - <line number="26" hits="0"/> - <line number="28" hits="0"/> - <line number="29" hits="0"/> - <line number="30" hits="0"/> - <line number="31" hits="0"/> - <line number="32" hits="0"/> - <line number="35" hits="0"/> - <line number="36" hits="0"/> - <line number="38" hits="0"/> - <line number="39" hits="0"/> - <line number="40" hits="0"/> - <line number="43" hits="0"/> - <line number="45" hits="0"/> - <line number="46" hits="0"/> - <line number="47" hits="0"/> - <line number="48" hits="0"/> - <line number="51" hits="0"/> + <line number="17" hits="1"/> + <line number="18" hits="1"/> + <line number="19" hits="1"/> + <line number="20" hits="1"/> + <line number="21" hits="1"/> + <line number="22" hits="1"/> + <line number="23" hits="1"/> + <line number="24" hits="1"/> + <line number="25" hits="1"/> + <line number="26" hits="1"/> + <line number="27" hits="1"/> + <line number="28" hits="1"/> + <line number="29" hits="1"/> + <line number="32" hits="1"/> + <line number="35" hits="1"/> + <line number="36" hits="1"/> + <line number="37" hits="1"/> + <line number="40" hits="1"/> + <line number="43" hits="1"/> + <line number="44" hits="1"/> + <line number="45" hits="1"/> + <line number="48" hits="1"/> + <line number="51" hits="1"/> + <line number="52" hits="1"/> + <line number="54" hits="1"/> + <line number="56" hits="1"/> <line number="57" hits="0"/> - <line number="59" hits="0"/> - <line number="65" hits="0"/> - <line number="66" hits="0"/> - <line number="67" hits="0"/> + <line number="60" hits="1"/> + <line number="62" hits="1"/> + <line number="64" hits="0"/> + <line number="66" hits="1"/> <line number="68" hits="0"/> - <line number="69" hits="0"/> - <line number="70" hits="0"/> - <line number="73" hits="0"/> + <line number="70" hits="1"/> + <line number="72" hits="0"/> + <line number="74" hits="1"/> <line number="76" hits="0"/> - <line number="77" hits="0"/> - <line number="78" hits="0"/> - <line number="79" hits="0"/> - <line number="81" hits="0"/> - <line number="82" hits="0"/> - <line number="83" hits="0"/> - <line number="84" hits="0"/> - <line number="85" hits="0"/> - <line number="86" hits="0"/> - <line number="87" hits="0"/> - <line number="88" hits="0"/> - <line number="89" hits="0"/> - <line number="91" hits="0"/> - <line number="95" hits="0"/> - <line number="96" hits="0"/> - <line number="98" hits="0"/> - <line number="99" hits="0"/> - <line number="100" hits="0"/> - <line number="101" hits="0"/> - <line number="103" hits="0"/> - <line number="104" hits="0"/> - <line number="108" hits="0"/> - <line number="110" hits="0"/> - <line number="111" hits="0"/> - <line number="113" hits="0"/> - <line number="115" hits="0"/> - <line number="118" hits="0"/> - <line number="119" hits="0"/> - <line number="121" hits="0"/> - <line number="125" hits="0"/> - <line number="126" hits="0"/> - <line number="132" hits="0"/> - <line number="134" hits="0"/> - <line number="135" hits="0"/> + <line number="79" hits="1"/> + <line number="84" hits="1"/> + <line number="85" hits="1"/> + <line number="86" hits="1"/> + <line number="87" hits="1"/> + <line number="91" hits="1"/> + <line number="101" hits="0"/> + <line number="102" hits="0"/> + <line number="114" hits="1"/> + <line number="119" hits="1"/> + <line number="120" hits="1"/> + <line number="121" hits="1"/> + <line number="122" hits="1"/> + <line number="123" hits="1"/> + <line number="125" hits="1"/> + <line number="126" hits="1"/> <line number="138" hits="0"/> <line number="139" hits="0"/> + <line number="140" hits="0"/> + <line number="141" hits="0"/> + <line number="142" hits="0"/> <line number="143" hits="0"/> - <line number="146" hits="0"/> - <line number="147" hits="0"/> - <line number="149" hits="0"/> - <line number="150" hits="0"/> - <line number="151" hits="0"/> - <line number="152" hits="0"/> - <line number="153" hits="0"/> - <line number="155" hits="0"/> + <line number="150" hits="1"/> <line number="156" hits="0"/> - <line number="157" hits="0"/> - <line number="159" hits="0"/> - <line number="160" hits="0"/> - <line number="161" hits="0"/> - <line number="162" hits="0"/> - <line number="163" hits="0"/> - <line number="164" hits="0"/> - <line number="166" hits="0"/> - <line number="167" hits="0"/> - <line number="168" hits="0"/> - <line number="170" hits="0"/> - <line number="171" hits="0"/> - <line number="174" hits="0"/> - <line number="175" hits="0"/> + <line number="163" hits="1"/> + <line number="172" hits="1"/> + <line number="175" hits="1"/> <line number="176" hits="0"/> - <line number="177" hits="0"/> - <line number="179" hits="0"/> + <line number="181" hits="1"/> + <line number="183" hits="1"/> + <line number="184" hits="1"/> + <line number="185" hits="0"/> + <line number="187" hits="1"/> <line number="188" hits="0"/> - <line number="189" hits="0"/> - <line number="190" hits="0"/> - <line number="191" hits="0"/> - <line number="195" hits="0"/> - <line number="197" hits="0"/> - <line number="198" hits="0"/> - <line number="199" hits="0"/> - <line number="200" hits="0"/> - <line number="201" hits="0"/> - <line number="202" hits="0"/> - <line number="203" hits="0"/> - <line number="204" hits="0"/> - <line number="205" hits="0"/> - <line number="206" hits="0"/> - <line number="209" hits="0"/> - <line number="212" hits="0"/> - <line number="213" hits="0"/> - <line number="214" hits="0"/> - <line number="216" hits="0"/> - <line number="218" hits="0"/> - <line number="220" hits="0"/> - <line number="221" hits="0"/> - <line number="222" hits="0"/> - <line number="223" hits="0"/> - <line number="227" hits="0"/> - <line number="228" hits="0"/> - <line number="230" hits="0"/> - <line number="238" hits="0"/> - <line number="239" hits="0"/> - <line number="240" hits="0"/> - <line number="241" hits="0"/> - <line number="243" hits="0"/> + <line number="191" hits="1"/> + <line number="194" hits="1"/> + <line number="195" hits="1"/> + <line number="196" hits="1"/> + <line number="197" hits="1"/> + <line number="198" hits="1"/> + <line number="199" hits="1"/> + <line number="202" hits="1"/> + <line number="205" hits="1"/> + <line number="210" hits="1"/> + <line number="212" hits="1"/> + <line number="213" hits="1"/> + <line number="223" hits="1"/> + <line number="226" hits="1"/> + <line number="230" hits="1"/> + <line number="231" hits="1"/> + <line number="232" hits="1"/> + <line number="233" hits="1"/> + <line number="235" hits="1"/> + <line number="236" hits="1"/> + <line number="238" hits="1"/> + <line number="239" hits="1"/> + <line number="240" hits="1"/> + <line number="241" hits="1"/> + <line number="242" hits="1"/> <line number="244" hits="0"/> - <line number="246" hits="0"/> - <line number="247" hits="0"/> - <line number="248" hits="0"/> - <line number="251" hits="0"/> - <line number="252" hits="0"/> - <line number="253" hits="0"/> - <line number="259" hits="0"/> - <line number="260" hits="0"/> - <line number="262" hits="0"/> - <line number="263" hits="0"/> - <line number="264" hits="0"/> - <line number="265" hits="0"/> - <line number="272" hits="0"/> - <line number="274" hits="0"/> - <line number="279" hits="0"/> + <line number="245" hits="1"/> + <line number="250" hits="1"/> + <line number="251" hits="1"/> + <line number="252" hits="1"/> + <line number="254" hits="1"/> <line number="280" hits="0"/> - <line number="281" hits="0"/> - <line number="282" hits="0"/> - <line number="284" hits="0"/> - <line number="286" hits="0"/> - <line number="289" hits="0"/> + <line number="282" hits="1"/> + <line number="290" hits="1"/> <line number="291" hits="0"/> - <line number="292" hits="0"/> - <line number="293" hits="0"/> - <line number="294" hits="0"/> - <line number="295" hits="0"/> - <line number="296" hits="0"/> - <line number="298" hits="0"/> - <line number="300" hits="0"/> - <line number="308" hits="0"/> - <line number="312" hits="0"/> + <line number="292" hits="1"/> + <line number="294" hits="1"/> + <line number="302" hits="1"/> + <line number="303" hits="0"/> + <line number="304" hits="1"/> + <line number="305" hits="1"/> + <line number="308" hits="1"/> + <line number="309" hits="1"/> + <line number="312" hits="1"/> + <line number="313" hits="1"/> <line number="314" hits="0"/> <line number="315" hits="0"/> - <line number="317" hits="0"/> <line number="321" hits="0"/> - <line number="322" hits="0"/> - <line number="323" hits="0"/> - <line number="328" hits="0"/> - <line number="330" hits="0"/> - <line number="331" hits="0"/> - <line number="337" hits="0"/> + <line number="325" hits="1"/> + <line number="326" hits="1"/> + <line number="333" hits="0"/> + <line number="334" hits="0"/> <line number="338" hits="0"/> - <line number="339" hits="0"/> - <line number="340" hits="0"/> - <line number="341" hits="0"/> - <line number="343" hits="0"/> - <line number="344" hits="0"/> + <line number="342" hits="0"/> <line number="345" hits="0"/> - <line number="346" hits="0"/> <line number="347" hits="0"/> - <line number="349" hits="0"/> - <line number="350" hits="0"/> - <line number="351" hits="0"/> - <line number="352" hits="0"/> - <line number="354" hits="0"/> - <line number="355" hits="0"/> + <line number="356" hits="0"/> <line number="357" hits="0"/> - <line number="359" hits="0"/> - <line number="360" hits="0"/> - <line number="363" hits="0"/> - <line number="368" hits="0"/> - <line number="370" hits="0"/> - <line number="371" hits="0"/> <line number="373" hits="0"/> - <line number="374" hits="0"/> - <line number="376" hits="0"/> - <line number="382" hits="0"/> - <line number="383" hits="0"/> <line number="384" hits="0"/> - <line number="385" hits="0"/> <line number="387" hits="0"/> - <line number="388" hits="0"/> - <line number="390" hits="0"/> - <line number="392" hits="0"/> - <line number="407" hits="0"/> - <line number="409" hits="0"/> - <line number="412" hits="0"/> - <line number="414" hits="0"/> - <line number="416" hits="0"/> - <line number="422" hits="0"/> - <line number="425" hits="0"/> - <line number="426" hits="0"/> - <line number="427" hits="0"/> - <line number="429" hits="0"/> - <line number="434" hits="0"/> - <line number="437" hits="0"/> - <line number="439" hits="0"/> - <line number="440" hits="0"/> - <line number="441" hits="0"/> - <line number="442" hits="0"/> - <line number="443" hits="0"/> + <line number="394" hits="0"/> + <line number="397" hits="0"/> + <line number="400" hits="0"/> + <line number="402" hits="0"/> + <line number="411" hits="0"/> + <line number="421" hits="0"/> + <line number="424" hits="0"/> + <line number="428" hits="0"/> + <line number="430" hits="0"/> <line number="444" hits="0"/> - <line number="445" hits="0"/> - <line number="447" hits="0"/> - <line number="451" hits="0"/> - <line number="452" hits="0"/> - <line number="455" hits="0"/> - <line number="459" hits="0"/> - <line number="462" hits="0"/> - <line number="463" hits="0"/> - <line number="465" hits="0"/> - <line number="466" hits="0"/> + <line number="460" hits="0"/> <line number="468" hits="0"/> - <line number="469" hits="0"/> - <line number="470" hits="0"/> - <line number="471" hits="0"/> - <line number="472" hits="0"/> - <line number="473" hits="0"/> - <line number="475" hits="0"/> - <line number="478" hits="0"/> - <line number="481" hits="0"/> - <line number="482" hits="0"/> - <line number="484" hits="0"/> - <line number="485" hits="0"/> - <line number="487" hits="0"/> - <line number="492" hits="0"/> - <line number="493" hits="0"/> - <line number="494" hits="0"/> - <line number="496" hits="0"/> - <line number="498" hits="0"/> - <line number="501" hits="0"/> - <line number="502" hits="0"/> - <line number="503" hits="0"/> - <line number="504" hits="0"/> - <line number="505" hits="0"/> - <line number="506" hits="0"/> - <line number="508" hits="0"/> - <line number="509" hits="0"/> - <line number="511" hits="0"/> - <line number="512" hits="0"/> - <line number="513" hits="0"/> + <line number="471" hits="1"/> + <line number="474" hits="1"/> + <line number="475" hits="1"/> + <line number="476" hits="1"/> + <line number="477" hits="1"/> + <line number="480" hits="1"/> + <line number="485" hits="1"/> + <line number="487" hits="1"/> + <line number="488" hits="1"/> + <line number="490" hits="1"/> + <line number="491" hits="1"/> + <line number="499" hits="1"/> + <line number="500" hits="0"/> + <line number="504" hits="1"/> + <line number="506" hits="1"/> + <line number="507" hits="1"/> <line number="515" hits="0"/> + <line number="516" hits="0"/> <line number="517" hits="0"/> - <line number="521" hits="0"/> - <line number="522" hits="0"/> - <line number="523" hits="0"/> - <line number="527" hits="0"/> + <line number="519" hits="1"/> + <line number="520" hits="1"/> <line number="528" hits="0"/> - <line number="534" hits="0"/> - <line number="535" hits="0"/> - <line number="536" hits="0"/> - <line number="538" hits="0"/> - <line number="539" hits="0"/> - <line number="540" hits="0"/> - <line number="542" hits="0"/> - <line number="544" hits="0"/> - <line number="548" hits="0"/> - <line number="550" hits="0"/> - <line number="558" hits="0"/> - <line number="559" hits="0"/> - <line number="560" hits="0"/> - <line number="561" hits="0"/> - <line number="563" hits="0"/> - <line number="564" hits="0"/> - <line number="566" hits="0"/> - <line number="567" hits="0"/> - <line number="569" hits="0"/> - <line number="574" hits="0"/> - <line number="576" hits="0"/> - <line number="578" hits="0"/> - <line number="579" hits="0"/> - <line number="580" hits="0"/> - <line number="582" hits="0"/> - <line number="584" hits="0"/> - <line number="588" hits="0"/> - <line number="589" hits="0"/> - <line number="590" hits="0"/> - <line number="591" hits="0"/> - <line number="593" hits="0"/> - <line number="594" hits="0"/> - <line number="596" hits="0"/> - <line number="600" hits="0"/> - <line number="601" hits="0"/> - <line number="603" hits="0"/> - <line number="604" hits="0"/> - <line number="605" hits="0"/> - <line number="606" hits="0"/> - <line number="607" hits="0"/> - <line number="609" hits="0"/> - <line number="610" hits="0"/> - <line number="613" hits="0"/> - <line number="619" hits="0"/> - <line number="620" hits="0"/> - <line number="621" hits="0"/> - <line number="623" hits="0"/> - <line number="624" hits="0"/> - <line number="625" hits="0"/> - <line number="633" hits="0"/> - <line number="637" hits="0"/> - </lines> - </class> - <class name="linear.py" filename="linear.py" complexity="0" line-rate="1" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="7" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="24" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="30" hits="1"/> + <line number="529" hits="0"/> + <line number="531" hits="1"/> + <line number="532" hits="1"/> + <line number="540" hits="1"/> + <line number="541" hits="1"/> + <line number="543" hits="1"/> + <line number="544" hits="1"/> + <line number="552" hits="0"/> + <line number="553" hits="0"/> + <line number="555" hits="1"/> + <line number="561" hits="1"/> + <line number="565" hits="1"/> + <line number="571" hits="0"/> + <line number="577" hits="1"/> + <line number="583" hits="0"/> </lines> </class> - <class name="route.py" filename="route.py" complexity="0" line-rate="0.8046" branch-rate="0"> + <class name="tokenizers.py" filename="tokenizers.py" complexity="0" line-rate="0.6667" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> <line number="2" hits="1"/> - <line number="3" hits="1"/> + <line number="4" hits="1"/> <line number="5" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> + <line number="6" hits="1"/> <line number="9" hits="1"/> - <line number="10" hits="1"/> <line number="12" hits="1"/> <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> + <line number="19" hits="0"/> <line number="21" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="0"/> - <line number="30" hits="0"/> - <line number="31" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="0"/> - <line number="38" hits="0"/> - <line number="40" hits="1"/> - <line number="41" hits="0"/> + <line number="22" hits="1"/> + <line number="28" hits="0"/> + <line number="30" hits="1"/> + <line number="39" hits="0"/> + <line number="40" hits="0"/> <line number="42" hits="0"/> <line number="43" hits="0"/> + <line number="45" hits="1"/> <line number="46" hits="1"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="54" hits="1"/> - <line number="55" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1"/> - <line number="60" hits="1"/> - <line number="64" hits="0"/> + <line number="57" hits="0"/> + <line number="58" hits="0"/> + <line number="60" hits="0"/> + <line number="61" hits="0"/> + <line number="62" hits="0"/> + <line number="64" hits="1"/> <line number="65" hits="0"/> + <line number="68" hits="1"/> + <line number="69" hits="1"/> <line number="70" hits="0"/> - <line number="73" hits="0"/> - <line number="76" hits="0"/> - <line number="77" hits="0"/> - <line number="82" hits="1"/> - <line number="83" hits="1"/> - <line number="84" hits="1"/> - <line number="85" hits="0"/> + <line number="73" hits="1"/> + <line number="87" hits="1"/> + <line number="88" hits="1"/> + <line number="89" hits="1"/> <line number="90" hits="1"/> <line number="92" hits="1"/> - <line number="93" hits="1"/> - <line number="94" hits="1"/> - <line number="96" hits="1"/> - <line number="97" hits="1"/> + <line number="100" hits="1"/> <line number="101" hits="1"/> <line number="102" hits="1"/> <line number="103" hits="1"/> <line number="104" hits="1"/> - <line number="106" hits="1"/> + <line number="105" hits="1"/> + <line number="106" hits="0"/> <line number="107" hits="1"/> - <line number="109" hits="1"/> + <line number="108" hits="1"/> <line number="110" hits="1"/> - <line number="112" hits="1"/> - <line number="113" hits="1"/> - <line number="114" hits="1"/> - <line number="116" hits="0"/> - <line number="118" hits="1"/> + <line number="111" hits="1"/> + <line number="117" hits="1"/> <line number="119" hits="1"/> <line number="120" hits="1"/> - <line number="122" hits="1"/> - <line number="147" hits="1"/> - <line number="148" hits="1"/> + <line number="126" hits="0"/> + <line number="132" hits="1"/> + <line number="142" hits="1"/> + <line number="143" hits="0"/> + <line number="145" hits="1"/> <line number="149" hits="1"/> - <line number="150" hits="0"/> <line number="152" hits="1"/> - <line number="154" hits="1"/> + <line number="155" hits="1"/> <line number="156" hits="1"/> - <line number="157" hits="1"/> - <line number="158" hits="1"/> - <line number="159" hits="1"/> - <line number="160" hits="0"/> + <line number="165" hits="0"/> + <line number="166" hits="0"/> + <line number="167" hits="0"/> + <line number="168" hits="0"/> + <line number="169" hits="0"/> </lines> </class> - <class name="schema.py" filename="schema.py" complexity="0" line-rate="0.8723" branch-rate="0"> + </classes> + </package> + <package name="encoders" line-rate="0.7154" branch-rate="0" complexity="0"> + <classes> + <class name="__init__.py" filename="encoders/__init__.py" complexity="0" line-rate="0.4035" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> - <line number="2" hits="1"/> + <line number="3" hits="1"/> <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="6" hits="1"/> <line number="7" hits="1"/> <line number="8" hits="1"/> <line number="9" hits="1"/> @@ -602,300 +415,267 @@ <line number="11" hits="1"/> <line number="12" hits="1"/> <line number="13" hits="1"/> + <line number="14" hits="1"/> + <line number="15" hits="1"/> <line number="16" hits="1"/> <line number="17" hits="1"/> - <line number="18" hits="1"/> <line number="19" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="0"/> - <line number="34" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="0"/> <line number="39" hits="1"/> - <line number="40" hits="0"/> + <line number="40" hits="1"/> + <line number="41" hits="1"/> <line number="42" hits="1"/> - <line number="43" hits="0"/> - <line number="45" hits="1"/> + <line number="44" hits="1"/> + <line number="45" hits="0"/> <line number="46" hits="0"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="54" hits="1"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> + <line number="47" hits="0"/> + <line number="49" hits="0"/> + <line number="50" hits="0"/> + <line number="51" hits="0"/> + <line number="52" hits="0"/> + <line number="53" hits="0"/> + <line number="54" hits="0"/> + <line number="55" hits="0"/> + <line number="56" hits="0"/> + <line number="57" hits="0"/> <line number="58" hits="0"/> - <line number="61" hits="1"/> - <line number="62" hits="1"/> - <line number="63" hits="1"/> - <line number="64" hits="1"/> - <line number="65" hits="1"/> + <line number="59" hits="0"/> + <line number="60" hits="0"/> + <line number="61" hits="0"/> + <line number="62" hits="0"/> + <line number="63" hits="0"/> + <line number="64" hits="0"/> + <line number="65" hits="0"/> + <line number="66" hits="0"/> + <line number="67" hits="0"/> + <line number="68" hits="0"/> + <line number="69" hits="0"/> + <line number="70" hits="0"/> + <line number="71" hits="0"/> + <line number="72" hits="0"/> + <line number="73" hits="0"/> + <line number="74" hits="0"/> + <line number="75" hits="0"/> + <line number="76" hits="0"/> + <line number="77" hits="0"/> + <line number="79" hits="0"/> + <line number="81" hits="1"/> + <line number="82" hits="0"/> </lines> </class> - <class name="text.py" filename="text.py" complexity="0" line-rate="0" branch-rate="0"> + <class name="aurelio.py" filename="encoders/aurelio.py" complexity="0" line-rate="0.4419" branch-rate="0"> <methods/> <lines> - <line number="1" hits="0"/> - <line number="3" hits="0"/> - <line number="4" hits="0"/> - <line number="6" hits="0"/> - <line number="7" hits="0"/> - <line number="8" hits="0"/> - <line number="9" hits="0"/> - <line number="12" hits="0"/> - <line number="14" hits="0"/> - <line number="25" hits="0"/> - <line number="26" hits="0"/> - <line number="29" hits="0"/> - <line number="30" hits="0"/> - <line number="32" hits="0"/> - <line number="33" hits="0"/> - <line number="34" hits="0"/> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="11" hits="1"/> + <line number="16" hits="1"/> + <line number="17" hits="1"/> + <line number="18" hits="1"/> + <line number="21" hits="1"/> + <line number="23" hits="1"/> <line number="35" hits="0"/> <line number="36" hits="0"/> + <line number="37" hits="0"/> + <line number="38" hits="0"/> <line number="39" hits="0"/> <line number="40" hits="0"/> <line number="41" hits="0"/> <line number="42" hits="0"/> <line number="43" hits="0"/> - <line number="45" hits="0"/> - <line number="46" hits="0"/> - <line number="47" hits="0"/> - <line number="48" hits="0"/> - <line number="50" hits="0"/> + <line number="45" hits="1"/> + <line number="49" hits="0"/> + <line number="51" hits="1"/> + <line number="52" hits="0"/> + <line number="55" hits="0"/> <line number="56" hits="0"/> - <line number="58" hits="0"/> + <line number="58" hits="1"/> <line number="59" hits="0"/> - <line number="61" hits="0"/> - <line number="83" hits="0"/> - <line number="84" hits="0"/> - <line number="87" hits="0"/> - <line number="88" hits="0"/> - <line number="92" hits="0"/> - <line number="94" hits="0"/> - <line number="106" hits="0"/> - <line number="107" hits="0"/> - <line number="109" hits="0"/> - <line number="111" hits="0"/> - <line number="124" hits="0"/> - <line number="125" hits="0"/> - <line number="126" hits="0"/> - <line number="131" hits="0"/> - <line number="132" hits="0"/> - <line number="134" hits="0"/> - <line number="145" hits="0"/> - <line number="146" hits="0"/> - <line number="147" hits="0"/> - <line number="149" hits="0"/> - <line number="163" hits="0"/> - <line number="164" hits="0"/> - <line number="167" hits="0"/> - <line number="169" hits="0"/> - <line number="171" hits="0"/> - <line number="174" hits="0"/> - <line number="175" hits="0"/> - <line number="176" hits="0"/> - <line number="177" hits="0"/> - <line number="180" hits="0"/> - <line number="184" hits="0"/> - <line number="185" hits="0"/> - <line number="187" hits="0"/> - <line number="190" hits="0"/> - <line number="191" hits="0"/> - <line number="194" hits="0"/> - <line number="199" hits="0"/> - <line number="200" hits="0"/> - <line number="202" hits="0"/> - <line number="205" hits="0"/> + <line number="62" hits="0"/> + <line number="63" hits="0"/> + <line number="65" hits="1"/> + <line number="66" hits="0"/> + <line number="69" hits="0"/> + <line number="70" hits="0"/> + <line number="72" hits="1"/> + <line number="73" hits="0"/> + <line number="76" hits="0"/> + <line number="77" hits="0"/> + <line number="79" hits="1"/> + <line number="89" hits="0"/> + <line number="91" hits="1"/> + <line number="98" hits="0"/> </lines> </class> - </classes> - </package> - <package name="encoders" line-rate="0.6161" branch-rate="0" complexity="0"> - <classes> - <class name="__init__.py" filename="encoders/__init__.py" complexity="0" line-rate="1" branch-rate="0"> + <class name="base.py" filename="encoders/base.py" complexity="0" line-rate="0.8421" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> - <line number="2" hits="1"/> <line number="3" hits="1"/> <line number="4" hits="1"/> - <line number="5" hits="1"/> <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> <line number="9" hits="1"/> <line number="10" hits="1"/> <line number="11" hits="1"/> <line number="12" hits="1"/> - <line number="13" hits="1"/> + <line number="14" hits="1"/> <line number="15" hits="1"/> - </lines> - </class> - <class name="base.py" filename="encoders/base.py" complexity="0" line-rate="1" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - </lines> - </class> - <class name="bm25.py" filename="encoders/bm25.py" complexity="0" line-rate="0.3404" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="12" hits="1"/> + <line number="17" hits="1"/> <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="27" hits="0"/> - <line number="29" hits="0"/> - <line number="30" hits="0"/> - <line number="31" hits="0"/> - <line number="32" hits="0"/> - <line number="34" hits="1"/> - <line number="35" hits="0"/> - <line number="36" hits="0"/> - <line number="37" hits="0"/> - <line number="38" hits="0"/> - <line number="39" hits="0"/> - <line number="41" hits="0"/> - <line number="43" hits="1"/> - <line number="44" hits="0"/> - <line number="45" hits="0"/> - <line number="46" hits="0"/> - <line number="47" hits="0"/> - <line number="48" hits="0"/> - <line number="49" hits="0"/> - <line number="51" hits="0"/> - <line number="53" hits="0"/> - <line number="54" hits="0"/> - <line number="55" hits="0"/> - <line number="56" hits="0"/> - <line number="57" hits="0"/> - <line number="58" hits="0"/> - <line number="59" hits="0"/> - <line number="60" hits="0"/> - <line number="61" hits="0"/> - <line number="63" hits="1"/> + <line number="26" hits="1"/> + <line number="28" hits="1"/> + <line number="38" hits="1"/> + <line number="40" hits="1"/> + <line number="50" hits="0"/> + <line number="53" hits="1"/> + <line number="56" hits="1"/> + <line number="57" hits="1"/> + <line number="59" hits="1"/> + <line number="60" hits="1"/> + <line number="62" hits="1"/> <line number="64" hits="0"/> - <line number="65" hits="0"/> - <line number="66" hits="0"/> - <line number="67" hits="0"/> + <line number="66" hits="1"/> + <line number="68" hits="0"/> + <line number="70" hits="1"/> + <line number="72" hits="0"/> + <line number="74" hits="1"/> + <line number="76" hits="0"/> + <line number="78" hits="1"/> + <line number="89" hits="1"/> + <line number="90" hits="0"/> + <line number="92" hits="1"/> + <line number="94" hits="1"/> + <line number="95" hits="1"/> + <line number="96" hits="1"/> + <line number="97" hits="1"/> </lines> </class> - <class name="clip.py" filename="encoders/clip.py" complexity="0" line-rate="0.2927" branch-rate="0"> + <class name="bedrock.py" filename="encoders/bedrock.py" complexity="0" line-rate="0.8718" branch-rate="0"> <methods/> <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> <line number="19" hits="1"/> <line number="20" hits="1"/> <line number="21" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="0"/> - <line number="25" hits="0"/> + <line number="22" hits="1"/> + <line number="24" hits="1"/> + <line number="26" hits="1"/> <line number="27" hits="1"/> - <line number="33" hits="0"/> - <line number="34" hits="0"/> - <line number="35" hits="0"/> - <line number="37" hits="0"/> - <line number="38" hits="0"/> - <line number="39" hits="0"/> - <line number="40" hits="0"/> - <line number="41" hits="0"/> - <line number="43" hits="0"/> - <line number="44" hits="0"/> - <line number="45" hits="0"/> - <line number="47" hits="0"/> - <line number="48" hits="0"/> - <line number="49" hits="0"/> - <line number="51" hits="1"/> - <line number="52" hits="0"/> - <line number="53" hits="0"/> - <line number="54" hits="0"/> - <line number="55" hits="0"/> - <line number="61" hits="0"/> - <line number="62" hits="0"/> - <line number="63" hits="0"/> - <line number="64" hits="0"/> - <line number="70" hits="0"/> - <line number="71" hits="0"/> - <line number="72" hits="0"/> - <line number="73" hits="0"/> - <line number="79" hits="0"/> - <line number="80" hits="0"/> - <line number="82" hits="0"/> - <line number="86" hits="0"/> - <line number="87" hits="0"/> - <line number="89" hits="0"/> - <line number="90" hits="0"/> - <line number="91" hits="0"/> - <line number="93" hits="1"/> - <line number="94" hits="0"/> - <line number="95" hits="0"/> - <line number="96" hits="0"/> - <line number="97" hits="0"/> - <line number="98" hits="0"/> - <line number="99" hits="0"/> - <line number="101" hits="0"/> - <line number="102" hits="0"/> + <line number="28" hits="1"/> + <line number="31" hits="1"/> + <line number="54" hits="1"/> + <line number="55" hits="1"/> + <line number="56" hits="1"/> + <line number="57" hits="1"/> + <line number="58" hits="1"/> + <line number="59" hits="1"/> + <line number="60" hits="1"/> + <line number="61" hits="1"/> + <line number="63" hits="1"/> + <line number="102" hits="1"/> + <line number="103" hits="1"/> <line number="104" hits="1"/> - <line number="105" hits="0"/> - <line number="108" hits="0"/> - <line number="109" hits="0"/> - <line number="110" hits="0"/> - <line number="111" hits="0"/> + <line number="107" hits="1"/> + <line number="108" hits="1"/> + <line number="111" hits="1"/> + <line number="112" hits="1"/> <line number="113" hits="1"/> - <line number="114" hits="0"/> - <line number="115" hits="0"/> - <line number="118" hits="0"/> - <line number="119" hits="0"/> - <line number="120" hits="0"/> - <line number="121" hits="0"/> - <line number="123" hits="1"/> - <line number="124" hits="0"/> - <line number="125" hits="0"/> - <line number="126" hits="0"/> + <line number="119" hits="1"/> + <line number="120" hits="1"/> + <line number="122" hits="1"/> + <line number="139" hits="1"/> + <line number="140" hits="1"/> + <line number="141" hits="0"/> + <line number="142" hits="0"/> + <line number="147" hits="1"/> + <line number="148" hits="1"/> + <line number="149" hits="1"/> + <line number="150" hits="1"/> + <line number="151" hits="0"/> + <line number="152" hits="1"/> + <line number="153" hits="0"/> + <line number="154" hits="1"/> + <line number="159" hits="1"/> + <line number="160" hits="1"/> + <line number="164" hits="0"/> + <line number="165" hits="0"/> + <line number="168" hits="1"/> + <line number="170" hits="1"/> + <line number="185" hits="1"/> + <line number="186" hits="1"/> + <line number="187" hits="0"/> + <line number="188" hits="0"/> + <line number="193" hits="1"/> + <line number="194" hits="1"/> + <line number="195" hits="1"/> + <line number="196" hits="1"/> + <line number="197" hits="1"/> + <line number="198" hits="1"/> + <line number="199" hits="1"/> + <line number="200" hits="1"/> + <line number="202" hits="1"/> + <line number="204" hits="1"/> + <line number="205" hits="0"/> + <line number="206" hits="0"/> + <line number="210" hits="1"/> + <line number="213" hits="1"/> + <line number="214" hits="0"/> + <line number="217" hits="1"/> + <line number="220" hits="1"/> + <line number="222" hits="1"/> + <line number="228" hits="1"/> + <line number="229" hits="1"/> + <line number="230" hits="1"/> + <line number="231" hits="1"/> + <line number="232" hits="1"/> + <line number="233" hits="1"/> + <line number="237" hits="1"/> + <line number="238" hits="0"/> + <line number="241" hits="1"/> + <line number="243" hits="1"/> + <line number="249" hits="1"/> + <line number="250" hits="1"/> + <line number="251" hits="1"/> + <line number="253" hits="1"/> + <line number="254" hits="1"/> + <line number="255" hits="1"/> + <line number="256" hits="1"/> + <line number="257" hits="1"/> + <line number="258" hits="1"/> + <line number="261" hits="1"/> + <line number="262" hits="1"/> + <line number="263" hits="1"/> + <line number="269" hits="0"/> + <line number="270" hits="0"/> + <line number="273" hits="1"/> + <line number="274" hits="1"/> + <line number="275" hits="1"/> + <line number="278" hits="1"/> + <line number="279" hits="1"/> + <line number="280" hits="0"/> + <line number="282" hits="1"/> + <line number="292" hits="1"/> + <line number="293" hits="1"/> + <line number="294" hits="1"/> + <line number="295" hits="1"/> + <line number="296" hits="1"/> + <line number="300" hits="1"/> + <line number="301" hits="1"/> + <line number="303" hits="1"/> + <line number="304" hits="1"/> + <line number="317" hits="1"/> + <line number="318" hits="1"/> + <line number="319" hits="1"/> + <line number="320" hits="1"/> + <line number="321" hits="1"/> + <line number="322" hits="1"/> + <line number="323" hits="1"/> + <line number="324" hits="1"/> </lines> </class> - <class name="cohere.py" filename="encoders/cohere.py" complexity="0" line-rate="1" branch-rate="0"> + <class name="bm25.py" filename="encoders/bm25.py" complexity="0" line-rate="0.8824" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> @@ -903,120 +683,113 @@ <line number="4" hits="1"/> <line number="6" hits="1"/> <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="9" hits="1"/> <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> <line number="13" hits="1"/> - <line number="15" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> <line number="40" hits="1"/> <line number="41" hits="1"/> <line number="42" hits="1"/> <line number="43" hits="1"/> <line number="44" hits="1"/> - <line number="47" hits="1"/> + <line number="45" hits="1"/> + <line number="46" hits="1"/> <line number="48" hits="1"/> - <line number="49" hits="1"/> - </lines> - </class> - <class name="fastembed.py" filename="encoders/fastembed.py" complexity="0" line-rate="0.6667" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="17" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="33" hits="0"/> - <line number="40" hits="0"/> - <line number="42" hits="0"/> - <line number="43" hits="0"/> - <line number="45" hits="1"/> - <line number="46" hits="0"/> - <line number="47" hits="0"/> - <line number="48" hits="0"/> - <line number="49" hits="0"/> - <line number="50" hits="0"/> - <line number="51" hits="0"/> - </lines> - </class> - <class name="google.py" filename="encoders/google.py" complexity="0" line-rate="0.2703" branch-rate="0"> - <methods/> - <lines> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="26" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="37" hits="1"/> - <line number="66" hits="0"/> - <line number="67" hits="0"/> + <line number="58" hits="1"/> + <line number="59" hits="1"/> + <line number="60" hits="1"/> + <line number="62" hits="1"/> + <line number="63" hits="1"/> + <line number="64" hits="1"/> + <line number="65" hits="1"/> + <line number="66" hits="1"/> + <line number="67" hits="1"/> + <line number="68" hits="1"/> <line number="69" hits="0"/> - <line number="71" hits="0"/> - <line number="73" hits="1"/> - <line number="90" hits="0"/> - <line number="91" hits="0"/> - <line number="92" hits="0"/> - <line number="93" hits="0"/> - <line number="94" hits="0"/> - <line number="100" hits="0"/> - <line number="101" hits="0"/> - <line number="102" hits="0"/> - <line number="104" hits="0"/> - <line number="105" hits="0"/> - <line number="107" hits="0"/> - <line number="108" hits="0"/> - <line number="111" hits="0"/> - <line number="112" hits="0"/> - <line number="113" hits="0"/> - <line number="117" hits="0"/> - <line number="119" hits="1"/> - <line number="133" hits="0"/> - <line number="134" hits="0"/> - <line number="135" hits="0"/> - <line number="136" hits="0"/> - <line number="137" hits="0"/> - <line number="138" hits="0"/> - <line number="139" hits="0"/> + <line number="70" hits="0"/> + <line number="72" hits="0"/> + <line number="76" hits="1"/> + <line number="77" hits="1"/> + <line number="78" hits="1"/> + <line number="80" hits="1"/> + <line number="86" hits="1"/> + <line number="87" hits="1"/> + <line number="90" hits="1"/> + <line number="91" hits="1"/> + <line number="92" hits="1"/> + <line number="93" hits="1"/> + <line number="95" hits="1"/> + <line number="98" hits="1"/> + <line number="99" hits="1"/> + <line number="102" hits="1"/> + <line number="104" hits="1"/> + <line number="105" hits="1"/> + <line number="107" hits="1"/> + <line number="109" hits="1"/> + <line number="117" hits="1"/> + <line number="118" hits="0"/> + <line number="121" hits="1"/> + <line number="123" hits="1"/> + <line number="126" hits="1"/> + <line number="130" hits="1"/> + <line number="131" hits="1"/> + <line number="133" hits="1"/> + <line number="143" hits="1"/> + <line number="144" hits="0"/> + <line number="147" hits="1"/> + <line number="148" hits="0"/> + <line number="151" hits="1"/> + <line number="153" hits="1"/> + <line number="156" hits="1"/> + <line number="160" hits="1"/> + <line number="164" hits="1"/> + <line number="165" hits="1"/> + <line number="167" hits="1"/> + <line number="175" hits="1"/> + <line number="180" hits="1"/> + <line number="183" hits="1"/> + <line number="184" hits="1"/> + <line number="187" hits="1"/> + <line number="188" hits="1"/> + <line number="191" hits="1"/> + <line number="192" hits="1"/> + <line number="193" hits="1"/> + <line number="194" hits="1"/> + <line number="195" hits="1"/> + <line number="196" hits="1"/> + <line number="199" hits="1"/> + <line number="201" hits="1"/> + <line number="203" hits="1"/> + <line number="222" hits="1"/> + <line number="227" hits="1"/> + <line number="230" hits="1"/> + <line number="231" hits="0"/> + <line number="234" hits="1"/> + <line number="235" hits="1"/> + <line number="236" hits="1"/> + <line number="237" hits="1"/> + <line number="238" hits="1"/> + <line number="239" hits="1"/> + <line number="240" hits="1"/> + <line number="246" hits="1"/> + <line number="248" hits="1"/> + <line number="255" hits="0"/> + <line number="256" hits="0"/> + <line number="259" hits="0"/> + <line number="264" hits="0"/> + <line number="268" hits="0"/> + <line number="270" hits="1"/> + <line number="271" hits="1"/> </lines> </class> - <class name="huggingface.py" filename="encoders/huggingface.py" complexity="0" line-rate="0.5929" branch-rate="0"> + <class name="clip.py" filename="encoders/clip.py" complexity="0" line-rate="0.2771" branch-rate="0"> <methods/> <lines> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="28" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="34" hits="1"/> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="6" hits="1"/> + <line number="9" hits="1"/> <line number="35" hits="1"/> <line number="36" hits="1"/> <line number="37" hits="1"/> @@ -1026,457 +799,1642 @@ <line number="41" hits="1"/> <line number="42" hits="1"/> <line number="43" hits="1"/> + <line number="44" hits="1"/> <line number="45" hits="1"/> - <line number="46" hits="1"/> <line number="47" hits="1"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="59" hits="0"/> - <line number="60" hits="0"/> - <line number="61" hits="0"/> - <line number="62" hits="0"/> - <line number="68" hits="0"/> - <line number="70" hits="0"/> + <line number="53" hits="0"/> + <line number="54" hits="0"/> + <line number="55" hits="0"/> + <line number="56" hits="0"/> + <line number="58" hits="1"/> <line number="75" hits="0"/> + <line number="76" hits="0"/> <line number="77" hits="0"/> - <line number="78" hits="0"/> + <line number="79" hits="0"/> + <line number="80" hits="0"/> <line number="81" hits="0"/> <line number="82" hits="0"/> <line number="83" hits="0"/> <line number="85" hits="0"/> - <line number="87" hits="1"/> - <line number="94" hits="0"/> - <line number="95" hits="0"/> - <line number="96" hits="0"/> - <line number="98" hits="0"/> + <line number="86" hits="0"/> + <line number="87" hits="0"/> + <line number="89" hits="0"/> + <line number="90" hits="0"/> + <line number="91" hits="0"/> + <line number="93" hits="1"/> + <line number="99" hits="0"/> + <line number="100" hits="0"/> + <line number="101" hits="0"/> <line number="102" hits="0"/> - <line number="103" hits="0"/> - <line number="105" hits="0"/> - <line number="106" hits="0"/> + <line number="108" hits="0"/> <line number="109" hits="0"/> <line number="110" hits="0"/> - <line number="114" hits="0"/> + <line number="111" hits="0"/> + <line number="117" hits="0"/> <line number="118" hits="0"/> <line number="119" hits="0"/> - <line number="121" hits="0"/> - <line number="122" hits="0"/> - <line number="123" hits="0"/> - <line number="125" hits="1"/> + <line number="120" hits="0"/> <line number="126" hits="0"/> <line number="127" hits="0"/> - <line number="130" hits="0"/> - <line number="134" hits="1"/> - <line number="135" hits="0"/> + <line number="129" hits="0"/> + <line number="133" hits="0"/> + <line number="134" hits="0"/> <line number="136" hits="0"/> - <line number="139" hits="0"/> - <line number="140" hits="0"/> - <line number="143" hits="1"/> - <line number="153" hits="1"/> - <line number="154" hits="1"/> - <line number="155" hits="1"/> + <line number="137" hits="0"/> + <line number="138" hits="0"/> + <line number="140" hits="1"/> + <line number="146" hits="0"/> + <line number="147" hits="0"/> + <line number="148" hits="0"/> + <line number="149" hits="0"/> + <line number="150" hits="0"/> + <line number="151" hits="0"/> + <line number="153" hits="0"/> + <line number="154" hits="0"/> <line number="156" hits="1"/> - <line number="158" hits="1"/> - <line number="181" hits="1"/> - <line number="182" hits="1"/> - <line number="184" hits="1"/> - <line number="186" hits="1"/> - <line number="187" hits="1"/> - <line number="188" hits="1"/> + <line number="164" hits="0"/> + <line number="167" hits="0"/> + <line number="168" hits="0"/> + <line number="169" hits="0"/> + <line number="170" hits="0"/> + <line number="172" hits="1"/> + <line number="180" hits="0"/> + <line number="181" hits="0"/> + <line number="184" hits="0"/> + <line number="185" hits="0"/> + <line number="186" hits="0"/> + <line number="187" hits="0"/> <line number="189" hits="1"/> - <line number="191" hits="1"/> - <line number="192" hits="1"/> - <line number="194" hits="1"/> - <line number="195" hits="1"/> - <line number="196" hits="0"/> <line number="197" hits="0"/> - <line number="201" hits="1"/> - <line number="214" hits="1"/> - <line number="215" hits="1"/> - <line number="216" hits="1"/> - <line number="217" hits="1"/> - <line number="218" hits="1"/> - <line number="219" hits="0"/> - <line number="220" hits="1"/> - <line number="222" hits="0"/> - <line number="223" hits="0"/> - <line number="226" hits="1"/> - <line number="228" hits="1"/> - <line number="241" hits="1"/> - <line number="246" hits="1"/> - <line number="247" hits="1"/> - <line number="248" hits="1"/> - <line number="254" hits="1"/> - <line number="255" hits="0"/> - <line number="256" hits="0"/> - <line number="257" hits="0"/> - <line number="260" hits="0"/> - <line number="261" hits="0"/> - <line number="263" hits="1"/> - <line number="265" hits="1"/> - <line number="266" hits="1"/> - <line number="267" hits="1"/> - <line number="268" hits="1"/> - <line number="269" hits="1"/> - <line number="271" hits="1"/> - <line number="275" hits="1"/> + <line number="198" hits="0"/> + <line number="199" hits="0"/> </lines> </class> - <class name="mistral.py" filename="encoders/mistral.py" complexity="0" line-rate="0.2708" branch-rate="0"> + <class name="cohere.py" filename="encoders/cohere.py" complexity="0" line-rate="0.9268" branch-rate="0"> <methods/> <lines> - <line number="3" hits="1"/> + <line number="1" hits="1"/> + <line number="2" hits="1"/> <line number="4" hits="1"/> - <line number="5" hits="1"/> + <line number="6" hits="1"/> <line number="7" hits="1"/> - <line number="9" hits="1"/> <line number="10" hits="1"/> - <line number="13" hits="1"/> + <line number="15" hits="1"/> <line number="16" hits="1"/> <line number="17" hits="1"/> <line number="18" hits="1"/> <line number="20" hits="1"/> - <line number="26" hits="0"/> - <line number="27" hits="0"/> - <line number="28" hits="0"/> - <line number="29" hits="0"/> - <line number="31" hits="1"/> - <line number="32" hits="0"/> - <line number="33" hits="0"/> - <line number="34" hits="0"/> - <line number="35" hits="0"/> - <line number="36" hits="0"/> - <line number="42" hits="0"/> - <line number="43" hits="0"/> - <line number="44" hits="0"/> - <line number="45" hits="0"/> - <line number="46" hits="0"/> - <line number="47" hits="0"/> - <line number="48" hits="0"/> - <line number="49" hits="0"/> - <line number="51" hits="1"/> - <line number="52" hits="0"/> - <line number="53" hits="0"/> - <line number="54" hits="0"/> - <line number="55" hits="0"/> - <line number="58" hits="0"/> - <line number="59" hits="0"/> - <line number="60" hits="0"/> - <line number="61" hits="0"/> - <line number="62" hits="0"/> - <line number="63" hits="0"/> - <line number="64" hits="0"/> - <line number="65" hits="0"/> - <line number="66" hits="0"/> - <line number="67" hits="0"/> - <line number="69" hits="0"/> - <line number="76" hits="0"/> - <line number="77" hits="0"/> - <line number="78" hits="0"/> - </lines> - </class> - <class name="openai.py" filename="encoders/openai.py" complexity="0" line-rate="0.9155" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="17" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> <line number="39" hits="1"/> <line number="40" hits="1"/> <line number="41" hits="1"/> - <line number="43" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="54" hits="1"/> - <line number="55" hits="1"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> + <line number="46" hits="1"/> + <line number="47" hits="1"/> + <line number="49" hits="1"/> <line number="58" hits="1"/> - <line number="59" hits="0"/> + <line number="59" hits="1"/> <line number="60" hits="1"/> - <line number="61" hits="1"/> + <line number="62" hits="1"/> + <line number="63" hits="0"/> <line number="64" hits="0"/> - <line number="65" hits="0"/> <line number="69" hits="1"/> + <line number="70" hits="1"/> <line number="71" hits="1"/> <line number="72" hits="1"/> + <line number="73" hits="1"/> <line number="74" hits="1"/> - <line number="76" hits="1"/> - <line number="84" hits="1"/> - <line number="85" hits="1"/> - <line number="86" hits="1"/> - <line number="87" hits="1"/> + <line number="75" hits="1"/> + <line number="78" hits="1"/> + <line number="80" hits="1"/> + <line number="88" hits="1"/> <line number="89" hits="1"/> + <line number="90" hits="1"/> <line number="91" hits="1"/> - <line number="92" hits="1"/> - <line number="93" hits="1"/> - <line number="94" hits="1"/> - <line number="97" hits="1"/> - <line number="98" hits="1"/> - <line number="99" hits="1"/> - <line number="104" hits="1"/> - <line number="105" hits="1"/> - <line number="106" hits="1"/> - <line number="107" hits="1"/> - <line number="108" hits="1"/> - <line number="109" hits="1"/> - <line number="110" hits="0"/> - <line number="111" hits="0"/> - <line number="112" hits="0"/> - <line number="114" hits="1"/> - <line number="119" hits="1"/> - <line number="120" hits="1"/> - <line number="122" hits="1"/> - <line number="123" hits="1"/> - <line number="125" hits="1"/> - <line number="126" hits="1"/> - <line number="127" hits="1"/> - <line number="128" hits="1"/> - <line number="132" hits="1"/> - <line number="133" hits="1"/> - <line number="134" hits="1"/> - <line number="135" hits="1"/> + <line number="95" hits="1"/> + <line number="96" hits="0"/> + <line number="100" hits="1"/> + <line number="101" hits="1"/> + <line number="102" hits="1"/> </lines> </class> - <class name="tfidf.py" filename="encoders/tfidf.py" complexity="0" line-rate="0.9844" branch-rate="0"> + <class name="fastembed.py" filename="encoders/fastembed.py" complexity="0" line-rate="0.4667" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> - <line number="2" hits="1"/> <line number="3" hits="1"/> - <line number="5" hits="1"/> + <line number="4" hits="1"/> <line number="6" hits="1"/> - <line number="7" hits="1"/> <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="17" hits="1"/> <line number="19" hits="1"/> <line number="20" hits="1"/> <line number="21" hits="1"/> + <line number="22" hits="1"/> <line number="23" hits="1"/> <line number="24" hits="1"/> - <line number="25" hits="1"/> <line number="26" hits="1"/> - <line number="27" hits="0"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> + <line number="33" hits="0"/> + <line number="34" hits="0"/> <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="40" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1"/> - <line number="46" hits="1"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="50" hits="1"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="54" hits="1"/> - <line number="55" hits="1"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - <line number="60" hits="1"/> - <line number="61" hits="1"/> - <line number="63" hits="1"/> - <line number="64" hits="1"/> - <line number="65" hits="1"/> - <line number="66" hits="1"/> - <line number="67" hits="1"/> - <line number="68" hits="1"/> - <line number="69" hits="1"/> - <line number="70" hits="1"/> - <line number="71" hits="1"/> - <line number="72" hits="1"/> - <line number="73" hits="1"/> - <line number="75" hits="1"/> - <line number="76" hits="1"/> - <line number="77" hits="1"/> - <line number="80" hits="1"/> - </lines> - </class> - <class name="vit.py" filename="encoders/vit.py" complexity="0" line-rate="0.3134" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="5" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="0"/> - <line number="23" hits="0"/> - <line number="25" hits="1"/> - <line number="26" hits="0"/> - <line number="27" hits="0"/> - <line number="28" hits="0"/> - <line number="29" hits="0"/> - <line number="35" hits="0"/> - <line number="36" hits="0"/> - <line number="37" hits="0"/> <line number="38" hits="0"/> <line number="39" hits="0"/> - <line number="45" hits="0"/> - <line number="46" hits="0"/> + <line number="40" hits="0"/> + <line number="41" hits="0"/> <line number="47" hits="0"/> - <line number="48" hits="0"/> <line number="54" hits="0"/> - <line number="55" hits="0"/> <line number="56" hits="0"/> - <line number="58" hits="0"/> - <line number="62" hits="0"/> - <line number="64" hits="0"/> - <line number="65" hits="0"/> - <line number="67" hits="0"/> - <line number="69" hits="1"/> + <line number="57" hits="0"/> + <line number="59" hits="1"/> + <line number="68" hits="0"/> + <line number="69" hits="0"/> <line number="70" hits="0"/> <line number="71" hits="0"/> <line number="72" hits="0"/> <line number="73" hits="0"/> - <line number="74" hits="0"/> - <line number="75" hits="0"/> - <line number="77" hits="0"/> - <line number="78" hits="0"/> - <line number="80" hits="1"/> - <line number="81" hits="0"/> - <line number="82" hits="0"/> - <line number="83" hits="0"/> - <line number="84" hits="0"/> - <line number="86" hits="1"/> - <line number="87" hits="0"/> - <line number="88" hits="0"/> - <line number="89" hits="0"/> - <line number="91" hits="1"/> - <line number="96" hits="0"/> - <line number="97" hits="0"/> - <line number="98" hits="0"/> - <line number="99" hits="0"/> - <line number="100" hits="0"/> - <line number="101" hits="0"/> - <line number="107" hits="0"/> - <line number="108" hits="0"/> </lines> </class> - <class name="zure.py" filename="encoders/zure.py" complexity="0" line-rate="0.9589" branch-rate="0"> + <class name="google.py" filename="encoders/google.py" complexity="0" line-rate="0.9459" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> <line number="2" hits="1"/> - <line number="3" hits="1"/> + <line number="4" hits="1"/> <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="23" hits="1"/> + <line number="8" hits="1"/> + <line number="29" hits="1"/> + <line number="30" hits="1"/> <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> + <line number="63" hits="1"/> + <line number="64" hits="1"/> + <line number="66" hits="1"/> + <line number="68" hits="1"/> + <line number="70" hits="1"/> + <line number="86" hits="1"/> + <line number="87" hits="1"/> + <line number="88" hits="1"/> + <line number="89" hits="0"/> + <line number="90" hits="0"/> + <line number="96" hits="1"/> + <line number="97" hits="1"/> + <line number="98" hits="1"/> + <line number="100" hits="1"/> + <line number="101" hits="1"/> + <line number="103" hits="1"/> + <line number="104" hits="1"/> + <line number="107" hits="1"/> + <line number="108" hits="1"/> + <line number="109" hits="1"/> + <line number="113" hits="1"/> + <line number="115" hits="1"/> + <line number="126" hits="1"/> + <line number="127" hits="1"/> + <line number="128" hits="1"/> + <line number="129" hits="1"/> + <line number="130" hits="1"/> + <line number="131" hits="1"/> + <line number="132" hits="1"/> + </lines> + </class> + <class name="huggingface.py" filename="encoders/huggingface.py" complexity="0" line-rate="0.5217" branch-rate="0"> + <methods/> + <lines> + <line number="23" hits="1"/> + <line number="24" hits="1"/> + <line number="25" hits="1"/> + <line number="27" hits="1"/> + <line number="28" hits="1"/> + <line number="30" hits="1"/> + <line number="31" hits="1"/> + <line number="38" hits="1"/> + <line number="56" hits="1"/> + <line number="57" hits="1"/> + <line number="58" hits="1"/> + <line number="59" hits="1"/> + <line number="60" hits="1"/> + <line number="61" hits="1"/> + <line number="62" hits="1"/> + <line number="63" hits="1"/> + <line number="65" hits="1"/> + <line number="66" hits="0"/> + <line number="67" hits="0"/> + <line number="68" hits="0"/> + <line number="69" hits="0"/> + <line number="71" hits="1"/> + <line number="72" hits="0"/> + <line number="73" hits="0"/> + <line number="74" hits="0"/> + <line number="75" hits="0"/> + <line number="81" hits="0"/> + <line number="82" hits="0"/> + <line number="83" hits="0"/> + <line number="84" hits="0"/> + <line number="90" hits="0"/> + <line number="92" hits="0"/> + <line number="97" hits="0"/> + <line number="99" hits="0"/> + <line number="100" hits="0"/> + <line number="103" hits="0"/> + <line number="104" hits="0"/> + <line number="105" hits="0"/> + <line number="107" hits="0"/> + <line number="109" hits="1"/> + <line number="122" hits="0"/> + <line number="123" hits="0"/> + <line number="124" hits="0"/> + <line number="126" hits="0"/> + <line number="130" hits="0"/> + <line number="131" hits="0"/> + <line number="133" hits="0"/> + <line number="134" hits="0"/> + <line number="137" hits="0"/> + <line number="138" hits="0"/> + <line number="142" hits="0"/> + <line number="146" hits="0"/> + <line number="147" hits="0"/> + <line number="149" hits="0"/> + <line number="150" hits="0"/> + <line number="151" hits="0"/> + <line number="153" hits="1"/> + <line number="160" hits="0"/> + <line number="161" hits="0"/> + <line number="164" hits="0"/> + <line number="168" hits="1"/> + <line number="175" hits="0"/> + <line number="176" hits="0"/> + <line number="179" hits="0"/> + <line number="180" hits="0"/> + <line number="183" hits="1"/> + <line number="204" hits="1"/> + <line number="205" hits="1"/> + <line number="206" hits="1"/> + <line number="208" hits="1"/> + <line number="227" hits="1"/> + <line number="228" hits="1"/> + <line number="229" hits="1"/> + <line number="230" hits="0"/> + <line number="232" hits="1"/> + <line number="234" hits="1"/> + <line number="235" hits="1"/> + <line number="236" hits="1"/> + <line number="237" hits="1"/> + <line number="239" hits="1"/> + <line number="240" hits="1"/> + <line number="242" hits="1"/> + <line number="243" hits="1"/> + <line number="244" hits="0"/> + <line number="245" hits="0"/> + <line number="249" hits="1"/> + <line number="258" hits="1"/> + <line number="259" hits="1"/> + <line number="260" hits="1"/> + <line number="261" hits="1"/> + <line number="262" hits="1"/> + <line number="263" hits="0"/> + <line number="264" hits="1"/> + <line number="266" hits="0"/> + <line number="267" hits="0"/> + <line number="270" hits="1"/> + <line number="272" hits="1"/> + <line number="281" hits="1"/> + <line number="286" hits="1"/> + <line number="287" hits="1"/> + <line number="288" hits="1"/> + <line number="294" hits="1"/> + <line number="295" hits="0"/> + <line number="296" hits="0"/> + <line number="297" hits="0"/> + <line number="300" hits="0"/> + <line number="301" hits="0"/> + <line number="303" hits="1"/> + <line number="305" hits="1"/> + <line number="306" hits="1"/> + <line number="307" hits="1"/> + <line number="308" hits="1"/> + <line number="309" hits="1"/> + <line number="311" hits="1"/> + <line number="315" hits="1"/> + </lines> + </class> + <class name="mistral.py" filename="encoders/mistral.py" complexity="0" line-rate="0.9583" branch-rate="0"> + <methods/> + <lines> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="7" hits="1"/> + <line number="9" hits="1"/> + <line number="10" hits="1"/> + <line number="13" hits="1"/> + <line number="17" hits="1"/> + <line number="18" hits="1"/> + <line number="19" hits="1"/> + <line number="21" hits="1"/> <line number="35" hits="1"/> <line number="36" hits="1"/> <line number="37" hits="1"/> <line number="38" hits="1"/> - <line number="39" hits="1"/> <line number="40" hits="1"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1"/> - <line number="46" hits="1"/> <line number="48" hits="1"/> <line number="49" hits="1"/> <line number="50" hits="1"/> - <line number="51" hits="0"/> + <line number="51" hits="1"/> <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="54" hits="1"/> - <line number="55" hits="0"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> <line number="58" hits="1"/> - <line number="59" hits="0"/> + <line number="59" hits="1"/> <line number="60" hits="1"/> + <line number="61" hits="1"/> + <line number="62" hits="1"/> + <line number="63" hits="0"/> + <line number="64" hits="0"/> + <line number="65" hits="1"/> <line number="67" hits="1"/> - <line number="68" hits="1"/> + <line number="75" hits="1"/> + <line number="76" hits="1"/> <line number="77" hits="1"/> <line number="78" hits="1"/> + <line number="81" hits="1"/> <line number="82" hits="1"/> <line number="83" hits="1"/> <line number="84" hits="1"/> <line number="85" hits="1"/> <line number="86" hits="1"/> + <line number="87" hits="1"/> + <line number="88" hits="1"/> <line number="89" hits="1"/> <line number="90" hits="1"/> + <line number="92" hits="1"/> + <line number="99" hits="1"/> + <line number="100" hits="1"/> + <line number="101" hits="1"/> + </lines> + </class> + <class name="openai.py" filename="encoders/openai.py" complexity="0" line-rate="0.8879" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="6" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="9" hits="1"/> + <line number="10" hits="1"/> + <line number="11" hits="1"/> + <line number="13" hits="1"/> + <line number="14" hits="1"/> + <line number="15" hits="1"/> + <line number="16" hits="1"/> + <line number="18" hits="1"/> + <line number="37" hits="1"/> + <line number="45" hits="1"/> + <line number="46" hits="1"/> + <line number="47" hits="1"/> + <line number="48" hits="1"/> + <line number="49" hits="1"/> + <line number="50" hits="1"/> + <line number="51" hits="1"/> + <line number="53" hits="1"/> + <line number="80" hits="1"/> + <line number="81" hits="1"/> + <line number="82" hits="1"/> + <line number="83" hits="1"/> + <line number="84" hits="0"/> + <line number="85" hits="0"/> + <line number="88" hits="0"/> + <line number="90" hits="0"/> <line number="91" hits="1"/> - <line number="94" hits="1"/> <line number="95" hits="1"/> <line number="96" hits="1"/> + <line number="97" hits="1"/> <line number="98" hits="1"/> + <line number="99" hits="1"/> <line number="100" hits="1"/> <line number="101" hits="1"/> <line number="102" hits="1"/> <line number="103" hits="1"/> - <line number="104" hits="1"/> - <line number="105" hits="1"/> <line number="106" hits="1"/> - <line number="108" hits="1"/> - <line number="113" hits="1"/> - <line number="115" hits="1"/> + <line number="109" hits="1"/> + <line number="110" hits="1"/> + <line number="114" hits="1"/> <line number="116" hits="1"/> + <line number="117" hits="1"/> + <line number="119" hits="1"/> + <line number="121" hits="1"/> + <line number="129" hits="1"/> + <line number="130" hits="1"/> + <line number="131" hits="1"/> + <line number="133" hits="1"/> + <line number="135" hits="1"/> + <line number="138" hits="1"/> + <line number="139" hits="1"/> + <line number="140" hits="1"/> + <line number="145" hits="1"/> + <line number="146" hits="1"/> + <line number="147" hits="1"/> + <line number="148" hits="1"/> + <line number="149" hits="1"/> + <line number="150" hits="1"/> + <line number="151" hits="1"/> + <line number="155" hits="1"/> + <line number="157" hits="1"/> + <line number="158" hits="1"/> + <line number="159" hits="1"/> + <line number="161" hits="1"/> + <line number="166" hits="0"/> + <line number="167" hits="0"/> + <line number="169" hits="1"/> + <line number="170" hits="1"/> + <line number="172" hits="1"/> + <line number="181" hits="1"/> + <line number="182" hits="1"/> + <line number="183" hits="1"/> + <line number="187" hits="1"/> + <line number="188" hits="1"/> + <line number="189" hits="1"/> + <line number="190" hits="1"/> + <line number="192" hits="1"/> + <line number="200" hits="1"/> + <line number="201" hits="0"/> + <line number="202" hits="1"/> + <line number="204" hits="1"/> + <line number="206" hits="1"/> + <line number="209" hits="1"/> + <line number="210" hits="1"/> + <line number="211" hits="1"/> + <line number="216" hits="1"/> + <line number="217" hits="1"/> + <line number="218" hits="1"/> + <line number="219" hits="1"/> + <line number="220" hits="1"/> + <line number="221" hits="1"/> + <line number="222" hits="1"/> + <line number="226" hits="1"/> + <line number="228" hits="0"/> + <line number="229" hits="0"/> + <line number="230" hits="0"/> + <line number="232" hits="1"/> + <line number="237" hits="0"/> + <line number="238" hits="0"/> + <line number="240" hits="1"/> + <line number="241" hits="1"/> + </lines> + </class> + <class name="tfidf.py" filename="encoders/tfidf.py" complexity="0" line-rate="0.9241" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="3" hits="1"/> + <line number="5" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="9" hits="1"/> + <line number="12" hits="1"/> + <line number="13" hits="1"/> + <line number="15" hits="1"/> + <line number="17" hits="1"/> + <line number="18" hits="1"/> + <line number="19" hits="1"/> + <line number="20" hits="1"/> + <line number="21" hits="1"/> + <line number="22" hits="1"/> + <line number="24" hits="1"/> + <line number="25" hits="1"/> + <line number="26" hits="1"/> + <line number="27" hits="1"/> + <line number="28" hits="0"/> + <line number="30" hits="1"/> + <line number="31" hits="1"/> + <line number="32" hits="1"/> + <line number="33" hits="1"/> + <line number="35" hits="1"/> + <line number="37" hits="0"/> + <line number="39" hits="1"/> + <line number="41" hits="0"/> + <line number="43" hits="1"/> + <line number="45" hits="0"/> + <line number="47" hits="1"/> + <line number="49" hits="0"/> + <line number="51" hits="1"/> + <line number="57" hits="1"/> + <line number="58" hits="1"/> + <line number="59" hits="1"/> + <line number="60" hits="1"/> + <line number="61" hits="1"/> + <line number="62" hits="1"/> + <line number="63" hits="1"/> + <line number="64" hits="0"/> + <line number="65" hits="1"/> + <line number="67" hits="1"/> + <line number="68" hits="1"/> + <line number="69" hits="1"/> + <line number="71" hits="1"/> + <line number="72" hits="1"/> + <line number="73" hits="1"/> + <line number="74" hits="1"/> + <line number="75" hits="1"/> + <line number="76" hits="1"/> + <line number="77" hits="1"/> + <line number="79" hits="1"/> + <line number="80" hits="1"/> + <line number="81" hits="1"/> + <line number="82" hits="1"/> + <line number="83" hits="1"/> + <line number="84" hits="1"/> + <line number="85" hits="1"/> + <line number="86" hits="1"/> + <line number="87" hits="1"/> + <line number="89" hits="1"/> + <line number="90" hits="1"/> + <line number="92" hits="1"/> + <line number="93" hits="1"/> + <line number="94" hits="1"/> + <line number="95" hits="1"/> + <line number="96" hits="1"/> + <line number="97" hits="1"/> + <line number="98" hits="1"/> + <line number="99" hits="1"/> + <line number="100" hits="1"/> + <line number="101" hits="1"/> + <line number="102" hits="1"/> + <line number="104" hits="1"/> + <line number="105" hits="1"/> + <line number="106" hits="1"/> + <line number="109" hits="1"/> + </lines> + </class> + <class name="vit.py" filename="encoders/vit.py" complexity="0" line-rate="0.2941" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="5" hits="1"/> + <line number="8" hits="1"/> + <line number="16" hits="1"/> + <line number="17" hits="1"/> + <line number="18" hits="1"/> + <line number="19" hits="1"/> + <line number="20" hits="1"/> + <line number="21" hits="1"/> + <line number="22" hits="1"/> + <line number="23" hits="1"/> + <line number="24" hits="1"/> + <line number="25" hits="1"/> + <line number="27" hits="1"/> + <line number="33" hits="0"/> + <line number="34" hits="0"/> + <line number="35" hits="0"/> + <line number="36" hits="0"/> + <line number="38" hits="1"/> + <line number="44" hits="0"/> + <line number="45" hits="0"/> + <line number="46" hits="0"/> + <line number="47" hits="0"/> + <line number="53" hits="0"/> + <line number="54" hits="0"/> + <line number="55" hits="0"/> + <line number="56" hits="0"/> + <line number="57" hits="0"/> + <line number="63" hits="0"/> + <line number="64" hits="0"/> + <line number="65" hits="0"/> + <line number="66" hits="0"/> + <line number="72" hits="0"/> + <line number="73" hits="0"/> + <line number="74" hits="0"/> + <line number="76" hits="0"/> + <line number="80" hits="0"/> + <line number="82" hits="0"/> + <line number="83" hits="0"/> + <line number="85" hits="0"/> + <line number="87" hits="1"/> + <line number="93" hits="0"/> + <line number="94" hits="0"/> + <line number="95" hits="0"/> + <line number="96" hits="0"/> + <line number="97" hits="0"/> + <line number="98" hits="0"/> + <line number="100" hits="0"/> + <line number="101" hits="0"/> + <line number="103" hits="1"/> + <line number="111" hits="0"/> + <line number="112" hits="0"/> + <line number="113" hits="0"/> + <line number="114" hits="0"/> + <line number="116" hits="1"/> + <line number="124" hits="0"/> + <line number="125" hits="0"/> + <line number="126" hits="0"/> + <line number="128" hits="1"/> + <line number="142" hits="0"/> + <line number="143" hits="0"/> + <line number="144" hits="0"/> + <line number="145" hits="0"/> + <line number="146" hits="0"/> + <line number="147" hits="0"/> + <line number="153" hits="0"/> + <line number="154" hits="0"/> + </lines> + </class> + <class name="zure.py" filename="encoders/zure.py" complexity="0" line-rate="0.9126" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="6" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="9" hits="1"/> + <line number="11" hits="1"/> + <line number="12" hits="1"/> + <line number="13" hits="1"/> + <line number="16" hits="1"/> + <line number="23" hits="1"/> + <line number="24" hits="1"/> + <line number="25" hits="1"/> + <line number="26" hits="1"/> + <line number="27" hits="1"/> + <line number="28" hits="1"/> + <line number="29" hits="1"/> + <line number="30" hits="1"/> + <line number="31" hits="1"/> + <line number="32" hits="1"/> + <line number="34" hits="1"/> + <line number="64" hits="1"/> + <line number="65" hits="1"/> + <line number="66" hits="1"/> + <line number="67" hits="1"/> + <line number="68" hits="1"/> + <line number="69" hits="1"/> + <line number="70" hits="1"/> + <line number="71" hits="1"/> + <line number="72" hits="1"/> + <line number="74" hits="1"/> + <line number="75" hits="1"/> + <line number="76" hits="1"/> + <line number="77" hits="1"/> + <line number="78" hits="1"/> + <line number="79" hits="1"/> + <line number="80" hits="1"/> + <line number="81" hits="1"/> + <line number="82" hits="1"/> + <line number="84" hits="1"/> + <line number="85" hits="1"/> + <line number="86" hits="1"/> + <line number="87" hits="0"/> + <line number="88" hits="1"/> + <line number="89" hits="1"/> + <line number="90" hits="1"/> + <line number="91" hits="0"/> + <line number="92" hits="1"/> + <line number="93" hits="1"/> + <line number="94" hits="1"/> + <line number="95" hits="0"/> + <line number="96" hits="1"/> + <line number="103" hits="1"/> + <line number="104" hits="1"/> + <line number="112" hits="1"/> + <line number="120" hits="1"/> + <line number="121" hits="1"/> + <line number="125" hits="1"/> + <line number="133" hits="1"/> + <line number="134" hits="1"/> + <line number="135" hits="1"/> + <line number="138" hits="1"/> + <line number="139" hits="1"/> + <line number="140" hits="1"/> + <line number="145" hits="1"/> + <line number="146" hits="1"/> + <line number="147" hits="1"/> + <line number="148" hits="1"/> + <line number="149" hits="1"/> + <line number="150" hits="1"/> + <line number="151" hits="1"/> + <line number="155" hits="1"/> + <line number="156" hits="1"/> + <line number="157" hits="1"/> + <line number="158" hits="1"/> + <line number="160" hits="1"/> + <line number="165" hits="0"/> + <line number="167" hits="1"/> + <line number="168" hits="1"/> + <line number="170" hits="1"/> + <line number="178" hits="1"/> + <line number="179" hits="0"/> + <line number="180" hits="1"/> + <line number="182" hits="1"/> + <line number="183" hits="1"/> + <line number="184" hits="1"/> + <line number="189" hits="1"/> + <line number="190" hits="1"/> + <line number="192" hits="1"/> + <line number="193" hits="1"/> + <line number="194" hits="1"/> + <line number="195" hits="1"/> + <line number="196" hits="1"/> + <line number="200" hits="1"/> + <line number="201" hits="0"/> + <line number="202" hits="0"/> + <line number="203" hits="0"/> + <line number="205" hits="1"/> + <line number="210" hits="0"/> + <line number="212" hits="1"/> + <line number="213" hits="1"/> + </lines> + </class> + </classes> + </package> + <package name="index" line-rate="0.2567" branch-rate="0" complexity="0"> + <classes> + <class name="__init__.py" filename="index/__init__.py" complexity="0" line-rate="1" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="6" hits="1"/> + <line number="8" hits="1"/> + </lines> + </class> + <class name="base.py" filename="index/base.py" complexity="0" line-rate="0.3313" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="10" hits="1"/> + <line number="11" hits="1"/> + <line number="12" hits="1"/> + <line number="14" hits="1"/> + <line number="17" hits="1"/> + <line number="18" hits="1"/> + <line number="19" hits="1"/> + <line number="20" hits="1"/> + <line number="23" hits="1"/> + <line number="32" hits="1"/> + <line number="33" hits="1"/> + <line number="34" hits="1"/> + <line number="35" hits="1"/> + <line number="36" hits="1"/> + <line number="37" hits="1"/> + <line number="39" hits="1"/> + <line number="62" hits="0"/> + <line number="64" hits="1"/> + <line number="87" hits="0"/> + <line number="88" hits="0"/> + <line number="97" hits="1"/> + <line number="107" hits="0"/> + <line number="108" hits="0"/> + <line number="109" hits="0"/> + <line number="110" hits="0"/> + <line number="111" hits="0"/> + <line number="112" hits="0"/> + <line number="114" hits="0"/> + <line number="115" hits="0"/> + <line number="117" hits="1"/> + <line number="127" hits="0"/> + <line number="128" hits="0"/> + <line number="129" hits="0"/> + <line number="130" hits="0"/> + <line number="131" hits="0"/> + <line number="132" hits="0"/> + <line number="134" hits="0"/> + <line number="135" hits="0"/> + <line number="137" hits="1"/> + <line number="143" hits="0"/> + <line number="144" hits="0"/> + <line number="146" hits="0"/> + <line number="148" hits="0"/> + <line number="149" hits="0"/> + <line number="157" hits="0"/> + <line number="159" hits="0"/> + <line number="160" hits="0"/> + <line number="161" hits="0"/> + <line number="162" hits="0"/> + <line number="164" hits="1"/> + <line number="172" hits="0"/> + <line number="174" hits="1"/> + <line number="182" hits="0"/> + <line number="183" hits="0"/> + <line number="185" hits="1"/> + <line number="192" hits="0"/> + <line number="194" hits="1"/> + <line number="204" hits="0"/> + <line number="206" hits="1"/> + <line number="214" hits="0"/> + <line number="216" hits="1"/> + <line number="223" hits="0"/> + <line number="225" hits="1"/> + <line number="246" hits="0"/> + <line number="248" hits="1"/> + <line number="269" hits="0"/> + <line number="271" hits="1"/> + <line number="280" hits="0"/> + <line number="282" hits="1"/> + <line number="288" hits="0"/> + <line number="289" hits="0"/> + <line number="290" hits="0"/> + <line number="291" hits="0"/> + <line number="293" hits="1"/> + <line number="299" hits="0"/> + <line number="300" hits="0"/> + <line number="306" hits="1"/> + <line number="316" hits="0"/> + <line number="317" hits="0"/> + <line number="323" hits="1"/> + <line number="335" hits="0"/> + <line number="336" hits="0"/> + <line number="338" hits="1"/> + <line number="346" hits="0"/> + <line number="347" hits="0"/> + <line number="349" hits="1"/> + <line number="357" hits="0"/> + <line number="358" hits="0"/> + <line number="362" hits="1"/> + <line number="368" hits="0"/> + <line number="370" hits="1"/> + <line number="376" hits="0"/> + <line number="378" hits="1"/> + <line number="386" hits="0"/> + <line number="387" hits="0"/> + <line number="388" hits="0"/> + <line number="389" hits="0"/> + <line number="390" hits="0"/> + <line number="392" hits="0"/> + <line number="394" hits="1"/> + <line number="402" hits="0"/> + <line number="403" hits="0"/> + <line number="404" hits="0"/> + <line number="405" hits="0"/> + <line number="406" hits="0"/> + <line number="408" hits="0"/> + <line number="410" hits="1"/> + <line number="424" hits="0"/> + <line number="425" hits="0"/> + <line number="426" hits="0"/> + <line number="428" hits="0"/> + <line number="429" hits="0"/> + <line number="433" hits="0"/> + <line number="434" hits="0"/> + <line number="436" hits="0"/> + <line number="438" hits="0"/> + <line number="441" hits="0"/> + <line number="446" hits="0"/> + <line number="447" hits="0"/> + <line number="449" hits="1"/> + <line number="455" hits="0"/> + <line number="456" hits="0"/> + <line number="457" hits="0"/> + <line number="459" hits="0"/> + <line number="460" hits="0"/> + <line number="462" hits="0"/> + <line number="464" hits="0"/> + <line number="467" hits="0"/> + <line number="472" hits="0"/> + <line number="473" hits="0"/> + <line number="475" hits="1"/> + <line number="486" hits="0"/> + <line number="488" hits="1"/> + <line number="501" hits="0"/> + <line number="503" hits="1"/> + <line number="511" hits="0"/> + <line number="512" hits="0"/> + <line number="513" hits="0"/> + <line number="514" hits="0"/> + <line number="515" hits="0"/> + <line number="516" hits="0"/> + <line number="518" hits="1"/> + <line number="519" hits="1"/> + <line number="522" hits="1"/> + <line number="531" hits="0"/> + <line number="532" hits="0"/> + <line number="533" hits="0"/> + <line number="534" hits="0"/> + <line number="535" hits="0"/> + <line number="536" hits="0"/> + <line number="537" hits="0"/> + <line number="539" hits="0"/> + <line number="544" hits="0"/> + <line number="545" hits="0"/> + <line number="547" hits="0"/> + <line number="550" hits="0"/> + </lines> + </class> + <class name="hybrid_local.py" filename="index/hybrid_local.py" complexity="0" line-rate="0.2447" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="6" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="11" hits="1"/> + <line number="12" hits="1"/> + <line number="13" hits="1"/> + <line number="14" hits="1"/> + <line number="16" hits="1"/> + <line number="17" hits="0"/> + <line number="19" hits="1"/> + <line number="44" hits="0"/> + <line number="45" hits="0"/> + <line number="46" hits="0"/> + <line number="47" hits="0"/> + <line number="48" hits="0"/> + <line number="49" hits="0"/> + <line number="50" hits="0"/> + <line number="53" hits="0"/> + <line number="54" hits="0"/> + <line number="55" hits="0"/> + <line number="57" hits="0"/> + <line number="60" hits="0"/> + <line number="61" hits="0"/> + <line number="62" hits="0"/> + <line number="65" hits="0"/> + <line number="66" hits="0"/> + <line number="69" hits="0"/> + <line number="70" hits="0"/> + <line number="71" hits="0"/> + <line number="72" hits="0"/> + <line number="74" hits="1"/> + <line number="84" hits="0"/> + <line number="85" hits="0"/> + <line number="86" hits="0"/> + <line number="88" hits="1"/> + <line number="101" hits="0"/> + <line number="102" hits="0"/> + <line number="103" hits="0"/> + <line number="105" hits="1"/> + <line number="113" hits="0"/> + <line number="114" hits="0"/> + <line number="115" hits="0"/> + <line number="118" hits="0"/> + <line number="120" hits="1"/> + <line number="138" hits="0"/> + <line number="139" hits="0"/> + <line number="141" hits="0"/> + <line number="143" hits="0"/> + <line number="144" hits="0"/> + <line number="145" hits="0"/> + <line number="146" hits="0"/> + <line number="148" hits="0"/> + <line number="150" hits="0"/> + <line number="152" hits="0"/> + <line number="153" hits="0"/> + <line number="154" hits="0"/> + <line number="156" hits="0"/> + <line number="157" hits="0"/> + <line number="159" hits="0"/> + <line number="160" hits="0"/> + <line number="161" hits="0"/> + <line number="163" hits="0"/> + <line number="164" hits="0"/> + <line number="166" hits="0"/> + <line number="167" hits="0"/> + <line number="169" hits="1"/> + <line number="189" hits="0"/> + <line number="196" hits="1"/> + <line number="202" hits="0"/> + <line number="204" hits="1"/> + <line number="210" hits="0"/> + <line number="212" hits="1"/> + <line number="218" hits="0"/> + <line number="223" hits="0"/> + <line number="224" hits="0"/> + <line number="225" hits="0"/> + <line number="226" hits="0"/> + <line number="228" hits="0"/> + <line number="233" hits="1"/> + <line number="239" hits="0"/> + <line number="240" hits="0"/> + <line number="241" hits="0"/> + <line number="243" hits="1"/> + <line number="251" hits="0"/> + <line number="252" hits="0"/> + <line number="253" hits="0"/> + <line number="254" hits="0"/> + <line number="256" hits="1"/> + <line number="257" hits="0"/> + <line number="258" hits="0"/> + <line number="260" hits="0"/> + </lines> + </class> + <class name="local.py" filename="index/local.py" complexity="0" line-rate="0.3551" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="5" hits="1"/> + <line number="6" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="11" hits="1"/> + <line number="12" hits="1"/> + <line number="14" hits="1"/> + <line number="15" hits="1"/> + <line number="17" hits="1"/> + <line number="19" hits="1"/> + <line number="21" hits="1"/> + <line number="43" hits="1"/> + <line number="44" hits="1"/> + <line number="45" hits="1"/> + <line number="46" hits="1"/> + <line number="48" hits="0"/> + <line number="49" hits="1"/> + <line number="50" hits="1"/> + <line number="51" hits="1"/> + <line number="52" hits="1"/> + <line number="54" hits="0"/> + <line number="55" hits="0"/> + <line number="56" hits="0"/> + <line number="58" hits="1"/> + <line number="66" hits="0"/> + <line number="67" hits="0"/> + <line number="69" hits="0"/> + <line number="71" hits="0"/> + <line number="72" hits="0"/> + <line number="74" hits="0"/> + <line number="75" hits="0"/> + <line number="80" hits="0"/> + <line number="81" hits="0"/> + <line number="82" hits="0"/> + <line number="84" hits="0"/> + <line number="86" hits="1"/> + <line number="95" hits="1"/> + <line number="96" hits="1"/> + <line number="97" hits="0"/> + <line number="99" hits="1"/> + <line number="105" hits="0"/> + <line number="111" hits="1"/> + <line number="117" hits="0"/> + <line number="119" hits="1"/> + <line number="139" hits="0"/> + <line number="140" hits="0"/> + <line number="141" hits="0"/> + <line number="142" hits="0"/> + <line number="143" hits="0"/> + <line number="144" hits="0"/> + <line number="145" hits="0"/> + <line number="146" hits="0"/> + <line number="147" hits="0"/> + <line number="148" hits="0"/> + <line number="149" hits="0"/> + <line number="150" hits="0"/> + <line number="151" hits="0"/> + <line number="152" hits="0"/> + <line number="154" hits="0"/> + <line number="155" hits="0"/> + <line number="156" hits="0"/> + <line number="157" hits="0"/> + <line number="159" hits="1"/> + <line number="179" hits="0"/> + <line number="180" hits="0"/> + <line number="181" hits="0"/> + <line number="182" hits="0"/> + <line number="183" hits="0"/> + <line number="184" hits="0"/> + <line number="185" hits="0"/> + <line number="186" hits="0"/> + <line number="187" hits="0"/> + <line number="188" hits="0"/> + <line number="189" hits="0"/> + <line number="190" hits="0"/> + <line number="191" hits="0"/> + <line number="192" hits="0"/> + <line number="194" hits="0"/> + <line number="195" hits="0"/> + <line number="196" hits="0"/> + <line number="197" hits="0"/> + <line number="199" hits="1"/> + <line number="205" hits="0"/> + <line number="207" hits="1"/> + <line number="213" hits="1"/> + <line number="215" hits="1"/> + <line number="221" hits="0"/> + <line number="226" hits="0"/> + <line number="227" hits="0"/> + <line number="228" hits="0"/> + <line number="229" hits="0"/> + <line number="231" hits="0"/> + <line number="236" hits="1"/> + <line number="242" hits="0"/> + <line number="243" hits="0"/> + <line number="244" hits="0"/> + <line number="246" hits="1"/> + <line number="254" hits="0"/> + <line number="255" hits="0"/> + <line number="256" hits="0"/> + <line number="257" hits="0"/> + <line number="259" hits="1"/> + <line number="260" hits="1"/> + <line number="261" hits="1"/> + <line number="263" hits="0"/> + </lines> + </class> + <class name="pinecone.py" filename="index/pinecone.py" complexity="0" line-rate="0.1731" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="6" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="10" hits="1"/> + <line number="11" hits="1"/> + <line number="12" hits="1"/> + <line number="14" hits="1"/> + <line number="15" hits="1"/> + <line number="16" hits="1"/> + <line number="19" hits="1"/> + <line number="20" hits="0"/> + <line number="23" hits="1"/> + <line number="24" hits="1"/> + <line number="25" hits="1"/> + <line number="26" hits="1"/> + <line number="27" hits="1"/> + <line number="30" hits="1"/> + <line number="55" hits="0"/> + <line number="56" hits="0"/> + <line number="57" hits="0"/> + <line number="58" hits="0"/> + <line number="75" hits="0"/> + <line number="93" hits="0"/> + <line number="96" hits="1"/> + <line number="97" hits="1"/> + <line number="98" hits="1"/> + <line number="99" hits="1"/> + <line number="100" hits="1"/> + <line number="101" hits="1"/> + <line number="102" hits="1"/> + <line number="103" hits="1"/> + <line number="105" hits="1"/> + <line number="111" hits="0"/> + <line number="112" hits="0"/> + <line number="114" hits="0"/> + <line number="115" hits="0"/> + <line number="116" hits="0"/> + <line number="124" hits="1"/> + <line number="130" hits="0"/> + <line number="135" hits="0"/> + <line number="136" hits="0"/> + <line number="137" hits="0"/> + <line number="140" hits="1"/> + <line number="141" hits="1"/> + <line number="142" hits="1"/> + <line number="143" hits="1"/> + <line number="144" hits="1"/> + <line number="145" hits="1"/> + <line number="146" hits="1"/> + <line number="147" hits="1"/> + <line number="148" hits="1"/> + <line number="149" hits="1"/> + <line number="150" hits="1"/> + <line number="151" hits="1"/> + <line number="152" hits="1"/> + <line number="153" hits="1"/> + <line number="154" hits="1"/> + <line number="155" hits="1"/> + <line number="157" hits="1"/> + <line number="193" hits="0"/> + <line number="194" hits="0"/> + <line number="195" hits="0"/> + <line number="196" hits="0"/> + <line number="198" hits="0"/> + <line number="204" hits="0"/> + <line number="205" hits="0"/> + <line number="206" hits="0"/> + <line number="207" hits="0"/> + <line number="209" hits="0"/> + <line number="211" hits="0"/> + <line number="212" hits="0"/> + <line number="214" hits="0"/> + <line number="215" hits="0"/> + <line number="216" hits="0"/> + <line number="217" hits="0"/> + <line number="218" hits="0"/> + <line number="219" hits="0"/> + <line number="220" hits="0"/> + <line number="221" hits="0"/> + <line number="222" hits="0"/> + <line number="223" hits="0"/> + <line number="225" hits="0"/> + <line number="229" hits="0"/> + <line number="232" hits="0"/> + <line number="234" hits="1"/> + <line number="242" hits="0"/> + <line number="243" hits="0"/> + <line number="245" hits="0"/> + <line number="246" hits="0"/> + <line number="247" hits="0"/> + <line number="252" hits="0"/> + <line number="257" hits="0"/> + <line number="258" hits="0"/> + <line number="260" hits="0"/> + <line number="262" hits="1"/> + <line number="269" hits="0"/> + <line number="270" hits="0"/> + <line number="271" hits="0"/> + <line number="272" hits="0"/> + <line number="274" hits="0"/> + <line number="275" hits="0"/> + <line number="276" hits="0"/> + <line number="277" hits="0"/> + <line number="278" hits="0"/> + <line number="280" hits="0"/> + <line number="282" hits="1"/> + <line number="295" hits="0"/> + <line number="296" hits="0"/> + <line number="297" hits="0"/> + <line number="298" hits="0"/> + <line number="301" hits="0"/> + <line number="308" hits="0"/> + <line number="309" hits="0"/> + <line number="310" hits="0"/> + <line number="311" hits="0"/> + <line number="312" hits="0"/> + <line number="313" hits="0"/> + <line number="317" hits="0"/> + <line number="318" hits="0"/> + <line number="319" hits="0"/> + <line number="320" hits="0"/> + <line number="323" hits="0"/> + <line number="324" hits="0"/> + <line number="325" hits="0"/> + <line number="331" hits="0"/> + <line number="337" hits="0"/> + <line number="339" hits="0"/> + <line number="340" hits="0"/> + <line number="342" hits="0"/> + <line number="344" hits="0"/> + <line number="345" hits="0"/> + <line number="346" hits="0"/> + <line number="347" hits="0"/> + <line number="348" hits="0"/> + <line number="350" hits="1"/> + <line number="365" hits="0"/> + <line number="367" hits="0"/> + <line number="369" hits="0"/> + <line number="370" hits="0"/> + <line number="371" hits="0"/> + <line number="372" hits="0"/> + <line number="374" hits="0"/> + <line number="375" hits="0"/> + <line number="376" hits="0"/> + <line number="379" hits="0"/> + <line number="385" hits="0"/> + <line number="386" hits="0"/> + <line number="391" hits="0"/> + <line number="395" hits="0"/> + <line number="397" hits="0"/> + <line number="398" hits="0"/> + <line number="399" hits="0"/> + <line number="401" hits="0"/> + <line number="403" hits="0"/> + <line number="404" hits="0"/> + <line number="405" hits="0"/> + <line number="407" hits="0"/> + <line number="410" hits="0"/> + <line number="417" hits="0"/> + <line number="418" hits="0"/> + <line number="419" hits="0"/> + <line number="420" hits="0"/> + <line number="421" hits="0"/> + <line number="422" hits="0"/> + <line number="425" hits="0"/> + <line number="426" hits="0"/> + <line number="428" hits="1"/> + <line number="434" hits="0"/> + <line number="435" hits="0"/> + <line number="437" hits="0"/> + <line number="439" hits="1"/> + <line number="467" hits="0"/> + <line number="468" hits="0"/> + <line number="469" hits="0"/> + <line number="470" hits="0"/> + <line number="478" hits="0"/> + <line number="479" hits="0"/> + <line number="480" hits="0"/> + <line number="482" hits="1"/> + <line number="510" hits="0"/> + <line number="511" hits="0"/> + <line number="512" hits="0"/> + <line number="513" hits="0"/> + <line number="522" hits="0"/> + <line number="523" hits="0"/> + <line number="524" hits="0"/> + <line number="529" hits="1"/> + <line number="535" hits="0"/> + <line number="536" hits="0"/> + <line number="537" hits="0"/> + <line number="543" hits="0"/> + <line number="544" hits="0"/> + <line number="546" hits="1"/> + <line number="554" hits="0"/> + <line number="555" hits="0"/> + <line number="556" hits="0"/> + <line number="562" hits="0"/> + <line number="563" hits="0"/> + <line number="567" hits="1"/> + <line number="575" hits="0"/> + <line number="576" hits="0"/> + <line number="577" hits="0"/> + <line number="579" hits="1"/> + <line number="587" hits="0"/> + <line number="588" hits="0"/> + <line number="589" hits="0"/> + <line number="591" hits="1"/> + <line number="599" hits="0"/> + <line number="600" hits="0"/> + <line number="601" hits="0"/> + <line number="602" hits="0"/> + <line number="603" hits="0"/> + <line number="610" hits="0"/> + <line number="612" hits="1"/> + <line number="620" hits="0"/> + <line number="621" hits="0"/> + <line number="624" hits="0"/> + <line number="625" hits="0"/> + <line number="626" hits="0"/> + <line number="629" hits="0"/> + <line number="631" hits="1"/> + <line number="641" hits="0"/> + <line number="642" hits="0"/> + <line number="643" hits="0"/> + <line number="644" hits="0"/> + <line number="646" hits="0"/> + <line number="647" hits="0"/> + <line number="649" hits="0"/> + <line number="650" hits="0"/> + <line number="651" hits="0"/> + <line number="656" hits="0"/> + <line number="660" hits="0"/> + <line number="662" hits="1"/> + <line number="671" hits="0"/> + <line number="672" hits="0"/> + <line number="673" hits="0"/> + <line number="674" hits="0"/> + <line number="675" hits="0"/> + <line number="678" hits="0"/> + <line number="687" hits="0"/> + <line number="688" hits="0"/> + <line number="692" hits="0"/> + <line number="693" hits="0"/> + <line number="696" hits="0"/> + <line number="698" hits="0"/> + <line number="700" hits="1"/> + <line number="709" hits="0"/> + <line number="710" hits="0"/> + <line number="711" hits="0"/> + <line number="712" hits="0"/> + <line number="714" hits="0"/> + <line number="716" hits="1"/> + <line number="722" hits="0"/> + <line number="723" hits="0"/> + <line number="725" hits="0"/> + <line number="727" hits="1"/> + <line number="733" hits="0"/> + <line number="734" hits="0"/> + <line number="735" hits="0"/> + <line number="741" hits="0"/> + <line number="747" hits="1"/> + <line number="753" hits="0"/> + <line number="755" hits="1"/> + <line number="778" hits="0"/> + <line number="779" hits="0"/> + <line number="780" hits="0"/> + <line number="781" hits="0"/> + <line number="782" hits="0"/> + <line number="784" hits="0"/> + <line number="785" hits="0"/> + <line number="786" hits="0"/> + <line number="787" hits="0"/> + <line number="788" hits="0"/> + <line number="789" hits="0"/> + <line number="791" hits="0"/> + <line number="792" hits="0"/> + <line number="793" hits="0"/> + <line number="801" hits="0"/> + <line number="802" hits="0"/> + <line number="803" hits="0"/> + <line number="811" hits="0"/> + <line number="812" hits="0"/> + <line number="813" hits="0"/> + <line number="815" hits="1"/> + <line number="825" hits="0"/> + <line number="826" hits="0"/> + <line number="827" hits="0"/> + <line number="832" hits="0"/> + <line number="833" hits="0"/> + <line number="837" hits="0"/> + <line number="838" hits="0"/> + <line number="847" hits="0"/> + <line number="848" hits="0"/> + <line number="854" hits="1"/> + <line number="866" hits="0"/> + <line number="867" hits="0"/> + <line number="868" hits="0"/> + <line number="873" hits="0"/> + <line number="874" hits="0"/> + <line number="877" hits="0"/> + <line number="878" hits="0"/> + <line number="879" hits="0"/> + <line number="885" hits="0"/> + <line number="886" hits="0"/> + <line number="890" hits="0"/> + <line number="891" hits="0"/> + <line number="897" hits="1"/> + <line number="903" hits="0"/> + <line number="904" hits="0"/> + <line number="905" hits="0"/> + <line number="906" hits="0"/> + <line number="907" hits="0"/> + <line number="908" hits="0"/> + <line number="912" hits="0"/> + <line number="914" hits="1"/> + <line number="920" hits="0"/> + <line number="921" hits="0"/> + <line number="922" hits="0"/> + <line number="923" hits="0"/> + <line number="924" hits="0"/> + <line number="925" hits="0"/> + <line number="926" hits="0"/> + <line number="930" hits="0"/> + <line number="932" hits="1"/> + <line number="955" hits="0"/> + <line number="956" hits="0"/> + <line number="957" hits="0"/> + <line number="958" hits="0"/> + <line number="959" hits="0"/> + <line number="961" hits="0"/> + <line number="963" hits="0"/> + <line number="964" hits="0"/> + <line number="965" hits="0"/> + <line number="966" hits="0"/> + <line number="967" hits="0"/> + <line number="969" hits="0"/> + <line number="970" hits="0"/> + <line number="978" hits="0"/> + <line number="979" hits="0"/> + <line number="980" hits="0"/> + <line number="982" hits="1"/> + <line number="989" hits="0"/> + <line number="990" hits="0"/> + <line number="992" hits="0"/> + <line number="994" hits="1"/> + <line number="1000" hits="0"/> + <line number="1001" hits="0"/> + <line number="1004" hits="1"/> + <line number="1028" hits="0"/> + <line number="1038" hits="0"/> + <line number="1039" hits="0"/> + <line number="1040" hits="0"/> + <line number="1041" hits="0"/> + <line number="1042" hits="0"/> + <line number="1044" hits="0"/> + <line number="1045" hits="0"/> + <line number="1046" hits="0"/> + <line number="1048" hits="0"/> + <line number="1049" hits="0"/> + <line number="1054" hits="0"/> + <line number="1055" hits="0"/> + <line number="1056" hits="0"/> + <line number="1057" hits="0"/> + <line number="1059" hits="0"/> + <line number="1060" hits="0"/> + <line number="1061" hits="0"/> + <line number="1062" hits="0"/> + <line number="1063" hits="0"/> + <line number="1065" hits="1"/> + <line number="1076" hits="0"/> + <line number="1077" hits="0"/> + <line number="1078" hits="0"/> + <line number="1080" hits="0"/> + <line number="1081" hits="0"/> + <line number="1082" hits="0"/> + <line number="1084" hits="1"/> + <line number="1090" hits="0"/> + <line number="1091" hits="0"/> + <line number="1095" hits="0"/> + <line number="1097" hits="1"/> + <line number="1109" hits="0"/> + <line number="1114" hits="0"/> + <line number="1115" hits="0"/> + <line number="1116" hits="0"/> + <line number="1117" hits="0"/> + <line number="1119" hits="0"/> + <line number="1120" hits="0"/> + <line number="1121" hits="0"/> + <line number="1122" hits="0"/> + <line number="1127" hits="0"/> + <line number="1128" hits="0"/> + <line number="1130" hits="1"/> + <line number="1151" hits="0"/> + <line number="1157" hits="0"/> + <line number="1158" hits="0"/> + <line number="1163" hits="0"/> + <line number="1165" hits="1"/> + <line number="1173" hits="0"/> + <line number="1177" hits="0"/> + <line number="1178" hits="0"/> + <line number="1179" hits="0"/> + <line number="1180" hits="0"/> + <line number="1181" hits="0"/> + <line number="1182" hits="0"/> + <line number="1184" hits="0"/> + <line number="1185" hits="0"/> + <line number="1190" hits="0"/> + <line number="1192" hits="1"/> + <line number="1198" hits="0"/> + <line number="1199" hits="0"/> + <line number="1203" hits="0"/> + <line number="1205" hits="1"/> + <line number="1218" hits="0"/> + <line number="1219" hits="0"/> + <line number="1220" hits="0"/> + <line number="1221" hits="0"/> + <line number="1223" hits="0"/> + <line number="1224" hits="0"/> + <line number="1226" hits="0"/> + <line number="1227" hits="0"/> + <line number="1229" hits="0"/> + <line number="1231" hits="0"/> + <line number="1232" hits="0"/> + <line number="1233" hits="0"/> + <line number="1234" hits="0"/> + <line number="1236" hits="0"/> + <line number="1237" hits="0"/> + <line number="1239" hits="0"/> + <line number="1240" hits="0"/> + <line number="1241" hits="0"/> + <line number="1242" hits="0"/> + <line number="1243" hits="0"/> + <line number="1245" hits="0"/> + <line number="1246" hits="0"/> + <line number="1247" hits="0"/> + <line number="1248" hits="0"/> + <line number="1250" hits="0"/> + <line number="1255" hits="0"/> + <line number="1256" hits="0"/> + <line number="1257" hits="0"/> + <line number="1258" hits="0"/> + <line number="1260" hits="0"/> + <line number="1262" hits="0"/> + <line number="1263" hits="0"/> + <line number="1264" hits="0"/> + <line number="1265" hits="0"/> + <line number="1267" hits="0"/> + <line number="1268" hits="0"/> + <line number="1271" hits="0"/> + <line number="1272" hits="0"/> + <line number="1274" hits="0"/> + <line number="1275" hits="0"/> + <line number="1276" hits="0"/> + <line number="1278" hits="0"/> + <line number="1280" hits="1"/> + <line number="1295" hits="0"/> + <line number="1296" hits="0"/> + <line number="1297" hits="0"/> + <line number="1298" hits="0"/> + <line number="1299" hits="0"/> + <line number="1300" hits="0"/> + <line number="1301" hits="0"/> + <line number="1302" hits="0"/> + <line number="1304" hits="0"/> + <line number="1306" hits="0"/> + <line number="1310" hits="0"/> + <line number="1311" hits="0"/> + <line number="1312" hits="0"/> + <line number="1313" hits="0"/> + <line number="1315" hits="0"/> + <line number="1316" hits="0"/> + <line number="1319" hits="0"/> + <line number="1320" hits="0"/> + <line number="1321" hits="0"/> + <line number="1322" hits="0"/> + <line number="1324" hits="0"/> + <line number="1325" hits="0"/> + <line number="1326" hits="0"/> + <line number="1327" hits="0"/> + <line number="1328" hits="0"/> + <line number="1330" hits="0"/> + <line number="1336" hits="1"/> + <line number="1337" hits="0"/> + <line number="1340" hits="0"/> + <line number="1341" hits="0"/> + <line number="1343" hits="0"/> </lines> </class> - </classes> - </package> - <package name="index" line-rate="0.3584" branch-rate="0" complexity="0"> - <classes> - <class name="__init__.py" filename="index/__init__.py" complexity="0" line-rate="1" branch-rate="0"> + <class name="postgres.py" filename="index/postgres.py" complexity="0" line-rate="0.2524" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> @@ -1484,264 +2442,214 @@ <line number="3" hits="1"/> <line number="4" hits="1"/> <line number="6" hits="1"/> - </lines> - </class> - <class name="base.py" filename="index/base.py" complexity="0" line-rate="0.7619" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> <line number="7" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="22" hits="1"/> - <line number="29" hits="0"/> - <line number="31" hits="1"/> - <line number="36" hits="0"/> - <line number="38" hits="1"/> - <line number="44" hits="0"/> - <line number="46" hits="1"/> - <line number="56" hits="0"/> - <line number="58" hits="1"/> - <line number="63" hits="0"/> - <line number="65" hits="1"/> - <line number="66" hits="1"/> - </lines> - </class> - <class name="local.py" filename="index/local.py" complexity="0" line-rate="0.2424" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> <line number="9" hits="1"/> <line number="10" hits="1"/> - <line number="16" hits="0"/> - <line number="17" hits="0"/> - <line number="19" hits="1"/> + <line number="11" hits="1"/> + <line number="13" hits="1"/> + <line number="14" hits="0"/> + <line number="17" hits="1"/> + <line number="20" hits="1"/> <line number="21" hits="1"/> + <line number="22" hits="1"/> <line number="23" hits="1"/> - <line number="26" hits="0"/> - <line number="27" hits="0"/> - <line number="28" hits="0"/> - <line number="29" hits="0"/> - <line number="31" hits="0"/> - <line number="32" hits="0"/> - <line number="33" hits="0"/> + <line number="26" hits="1"/> <line number="34" hits="0"/> <line number="35" hits="0"/> - <line number="37" hits="0"/> + <line number="36" hits="0"/> <line number="38" hits="0"/> - <line number="39" hits="0"/> <line number="41" hits="1"/> - <line number="48" hits="0"/> <line number="49" hits="0"/> - <line number="50" hits="0"/> - <line number="52" hits="1"/> - <line number="53" hits="0"/> - <line number="59" hits="1"/> - <line number="68" hits="0"/> - <line number="69" hits="0"/> - <line number="70" hits="0"/> - <line number="71" hits="0"/> - <line number="72" hits="0"/> - <line number="73" hits="0"/> - <line number="74" hits="0"/> - <line number="75" hits="0"/> - <line number="76" hits="0"/> - <line number="77" hits="0"/> - <line number="78" hits="0"/> - <line number="79" hits="0"/> - <line number="80" hits="0"/> - <line number="81" hits="0"/> - <line number="83" hits="0"/> - <line number="84" hits="0"/> - <line number="85" hits="0"/> - <line number="86" hits="0"/> - <line number="88" hits="1"/> - <line number="92" hits="0"/> - <line number="97" hits="0"/> - <line number="98" hits="0"/> - <line number="99" hits="0"/> - <line number="100" hits="0"/> - <line number="102" hits="0"/> - <line number="107" hits="1"/> - <line number="111" hits="0"/> - <line number="113" hits="1"/> - <line number="115" hits="0"/> - <line number="116" hits="0"/> - <line number="117" hits="0"/> - <line number="118" hits="0"/> - <line number="120" hits="1"/> - <line number="121" hits="0"/> - <line number="122" hits="0"/> - <line number="124" hits="0"/> - </lines> - </class> - <class name="pinecone.py" filename="index/pinecone.py" complexity="0" line-rate="0.281" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="0"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="0"/> - <line number="26" hits="0"/> - <line number="28" hits="0"/> - <line number="29" hits="0"/> - <line number="31" hits="1"/> - <line number="32" hits="0"/> - <line number="39" hits="1"/> - <line number="40" hits="1"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1"/> - <line number="46" hits="1"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> <line number="52" hits="1"/> - <line number="63" hits="0"/> - <line number="64" hits="0"/> - <line number="65" hits="0"/> + <line number="55" hits="1"/> + <line number="56" hits="1"/> + <line number="57" hits="1"/> + <line number="58" hits="1"/> + <line number="60" hits="1"/> <line number="66" hits="0"/> <line number="67" hits="0"/> <line number="68" hits="0"/> <line number="69" hits="0"/> - <line number="70" hits="0"/> - <line number="71" hits="0"/> <line number="72" hits="0"/> - <line number="74" hits="1"/> - <line number="75" hits="0"/> - <line number="76" hits="0"/> - <line number="78" hits="0"/> - <line number="79" hits="0"/> - <line number="80" hits="0"/> - <line number="85" hits="0"/> - <line number="86" hits="0"/> - <line number="87" hits="0"/> - <line number="88" hits="0"/> - <line number="89" hits="0"/> - <line number="90" hits="0"/> - <line number="92" hits="0"/> + <line number="73" hits="0"/> + <line number="74" hits="0"/> + <line number="76" hits="1"/> + <line number="82" hits="0"/> + <line number="90" hits="1"/> + <line number="93" hits="1"/> <line number="94" hits="1"/> - <line number="107" hits="0"/> - <line number="108" hits="0"/> - <line number="109" hits="0"/> - <line number="112" hits="0"/> - <line number="119" hits="0"/> - <line number="120" hits="0"/> - <line number="121" hits="0"/> - <line number="122" hits="0"/> - <line number="123" hits="0"/> - <line number="125" hits="0"/> + <line number="95" hits="1"/> + <line number="96" hits="1"/> + <line number="97" hits="1"/> + <line number="98" hits="1"/> + <line number="99" hits="1"/> + <line number="100" hits="1"/> + <line number="102" hits="1"/> + <line number="126" hits="0"/> <line number="127" hits="0"/> <line number="128" hits="0"/> - <line number="129" hits="0"/> - <line number="135" hits="0"/> - <line number="136" hits="0"/> + <line number="130" hits="0"/> + <line number="131" hits="0"/> + <line number="132" hits="0"/> + <line number="133" hits="0"/> <line number="137" hits="0"/> <line number="138" hits="0"/> - <line number="139" hits="0"/> - <line number="141" hits="1"/> + <line number="140" hits="0"/> + <line number="141" hits="0"/> + <line number="142" hits="0"/> <line number="143" hits="0"/> <line number="144" hits="0"/> + <line number="145" hits="0"/> <line number="146" hits="0"/> - <line number="148" hits="1"/> - <line number="156" hits="0"/> - <line number="157" hits="0"/> - <line number="158" hits="0"/> - <line number="160" hits="0"/> - <line number="165" hits="0"/> - <line number="166" hits="0"/> + <line number="147" hits="0"/> + <line number="148" hits="0"/> + <line number="149" hits="0"/> + <line number="150" hits="0"/> + <line number="152" hits="1"/> + <line number="159" hits="0"/> + <line number="161" hits="1"/> <line number="167" hits="0"/> <line number="169" hits="1"/> - <line number="170" hits="0"/> - <line number="171" hits="0"/> - <line number="172" hits="0"/> - <line number="174" hits="1"/> + <line number="177" hits="0"/> <line number="178" hits="0"/> <line number="179" hits="0"/> <line number="180" hits="0"/> <line number="181" hits="0"/> + <line number="182" hits="0"/> <line number="183" hits="0"/> <line number="184" hits="0"/> - <line number="186" hits="0"/> - <line number="189" hits="0"/> - <line number="190" hits="0"/> - <line number="191" hits="0"/> - <line number="192" hits="0"/> - <line number="194" hits="0"/> + <line number="185" hits="0"/> + <line number="187" hits="0"/> + <line number="189" hits="1"/> <line number="195" hits="0"/> <line number="196" hits="0"/> - <line number="199" hits="0"/> + <line number="197" hits="0"/> <line number="200" hits="0"/> + <line number="201" hits="0"/> + <line number="202" hits="0"/> <line number="203" hits="0"/> - <line number="205" hits="0"/> - <line number="206" hits="0"/> - <line number="207" hits="0"/> - <line number="210" hits="0"/> - <line number="211" hits="0"/> - <line number="213" hits="0"/> - <line number="216" hits="0"/> - <line number="217" hits="0"/> - <line number="218" hits="0"/> - <line number="220" hits="0"/> - <line number="222" hits="1"/> - <line number="230" hits="0"/> - <line number="231" hits="0"/> + <line number="215" hits="0"/> + <line number="217" hits="1"/> + <line number="225" hits="0"/> + <line number="226" hits="0"/> + <line number="227" hits="0"/> + <line number="228" hits="0"/> + <line number="229" hits="0"/> <line number="232" hits="0"/> - <line number="234" hits="1"/> + <line number="233" hits="0"/> + <line number="234" hits="0"/> <line number="235" hits="0"/> <line number="236" hits="0"/> - <line number="237" hits="0"/> - <line number="239" hits="0"/> - <line number="241" hits="1"/> <line number="242" hits="0"/> - <line number="244" hits="1"/> + <line number="243" hits="0"/> + <line number="244" hits="0"/> <line number="245" hits="0"/> <line number="246" hits="0"/> <line number="247" hits="0"/> + <line number="248" hits="0"/> + <line number="249" hits="0"/> <line number="253" hits="0"/> <line number="255" hits="1"/> - <line number="261" hits="0"/> - <line number="262" hits="0"/> - <line number="263" hits="0"/> - <line number="264" hits="0"/> - <line number="265" hits="0"/> - <line number="267" hits="0"/> - <line number="268" hits="0"/> - <line number="275" hits="0"/> - <line number="276" hits="0"/> - <line number="277" hits="0"/> - <line number="279" hits="1"/> + <line number="279" hits="0"/> <line number="280" hits="0"/> - <line number="282" hits="1"/> - <line number="283" hits="0"/> + <line number="281" hits="0"/> + <line number="282" hits="0"/> + <line number="285" hits="0"/> + <line number="289" hits="0"/> + <line number="290" hits="0"/> + <line number="291" hits="0"/> + <line number="292" hits="0"/> + <line number="299" hits="0"/> + <line number="301" hits="1"/> + <line number="308" hits="0"/> + <line number="309" hits="0"/> + <line number="310" hits="0"/> + <line number="311" hits="0"/> + <line number="312" hits="0"/> + <line number="313" hits="0"/> + <line number="315" hits="1"/> + <line number="321" hits="0"/> + <line number="322" hits="0"/> + <line number="323" hits="0"/> + <line number="324" hits="0"/> + <line number="329" hits="0"/> + <line number="330" hits="0"/> + <line number="331" hits="0"/> + <line number="332" hits="0"/> + <line number="333" hits="0"/> + <line number="335" hits="0"/> + <line number="336" hits="0"/> + <line number="342" hits="1"/> + <line number="348" hits="0"/> + <line number="350" hits="1"/> + <line number="371" hits="0"/> + <line number="372" hits="0"/> + <line number="373" hits="0"/> + <line number="374" hits="0"/> + <line number="375" hits="0"/> + <line number="377" hits="0"/> + <line number="378" hits="0"/> + <line number="379" hits="0"/> + <line number="380" hits="0"/> + <line number="383" hits="0"/> + <line number="384" hits="0"/> + <line number="388" hits="1"/> + <line number="396" hits="0"/> + <line number="397" hits="0"/> + <line number="398" hits="0"/> + <line number="400" hits="1"/> + <line number="413" hits="0"/> + <line number="414" hits="0"/> + <line number="415" hits="0"/> + <line number="417" hits="0"/> + <line number="418" hits="0"/> + <line number="419" hits="0"/> + <line number="420" hits="0"/> + <line number="422" hits="0"/> + <line number="423" hits="0"/> + <line number="425" hits="0"/> + <line number="426" hits="0"/> + <line number="428" hits="0"/> + <line number="429" hits="0"/> + <line number="430" hits="0"/> + <line number="431" hits="0"/> + <line number="432" hits="0"/> + <line number="433" hits="0"/> + <line number="434" hits="0"/> + <line number="436" hits="0"/> + <line number="438" hits="1"/> + <line number="443" hits="0"/> + <line number="444" hits="0"/> + <line number="445" hits="0"/> + <line number="446" hits="0"/> + <line number="447" hits="0"/> + <line number="448" hits="0"/> + <line number="450" hits="1"/> + <line number="455" hits="0"/> + <line number="456" hits="0"/> + <line number="457" hits="0"/> + <line number="458" hits="0"/> + <line number="459" hits="0"/> + <line number="460" hits="0"/> + <line number="462" hits="1"/> + <line number="470" hits="0"/> + <line number="472" hits="1"/> + <line number="478" hits="0"/> + <line number="480" hits="1"/> + <line number="487" hits="0"/> + <line number="488" hits="0"/> + <line number="489" hits="0"/> + <line number="490" hits="0"/> + <line number="491" hits="0"/> + <line number="492" hits="0"/> + <line number="493" hits="0"/> + <line number="494" hits="0"/> + <line number="495" hits="0"/> + <line number="497" hits="1"/> + <line number="500" hits="1"/> </lines> </class> - <class name="qdrant.py" filename="index/qdrant.py" complexity="0" line-rate="0.4483" branch-rate="0"> + <class name="qdrant.py" filename="index/qdrant.py" complexity="0" line-rate="0.3833" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> @@ -1749,93 +2657,126 @@ <line number="4" hits="1"/> <line number="6" hits="1"/> <line number="7" hits="1"/> - <line number="9" hits="1"/> + <line number="8" hits="1"/> <line number="10" hits="1"/> <line number="11" hits="1"/> <line number="12" hits="1"/> <line number="13" hits="1"/> - <line number="16" hits="1"/> - <line number="19" hits="1"/> - <line number="24" hits="1"/> - <line number="29" hits="1"/> - <line number="34" hits="1"/> - <line number="38" hits="1"/> - <line number="42" hits="1"/> - <line number="46" hits="1"/> - <line number="50" hits="1"/> - <line number="54" hits="1"/> - <line number="58" hits="1"/> - <line number="62" hits="1"/> - <line number="67" hits="1"/> - <line number="71" hits="1"/> - <line number="75" hits="1"/> - <line number="80" hits="1"/> - <line number="84" hits="1"/> - <line number="88" hits="1"/> + <line number="14" hits="1"/> + <line number="17" hits="1"/> + <line number="20" hits="1"/> + <line number="25" hits="1"/> + <line number="30" hits="1"/> + <line number="35" hits="1"/> + <line number="39" hits="1"/> + <line number="43" hits="1"/> + <line number="47" hits="1"/> + <line number="51" hits="1"/> + <line number="55" hits="1"/> + <line number="59" hits="1"/> + <line number="63" hits="1"/> + <line number="68" hits="1"/> + <line number="72" hits="1"/> + <line number="76" hits="1"/> + <line number="81" hits="1"/> + <line number="85" hits="1"/> + <line number="89" hits="1"/> <line number="90" hits="1"/> - <line number="91" hits="0"/> - <line number="92" hits="0"/> + <line number="92" hits="1"/> <line number="93" hits="0"/> - <line number="95" hits="1"/> - <line number="96" hits="0"/> - <line number="97" hits="0"/> - <line number="99" hits="0"/> - <line number="114" hits="0"/> - <line number="115" hits="0"/> - <line number="121" hits="1"/> - <line number="122" hits="0"/> - <line number="124" hits="0"/> - <line number="125" hits="0"/> + <line number="94" hits="0"/> + <line number="95" hits="0"/> + <line number="97" hits="1"/> + <line number="103" hits="0"/> + <line number="104" hits="0"/> + <line number="106" hits="0"/> + <line number="121" hits="0"/> + <line number="123" hits="0"/> <line number="126" hits="0"/> - <line number="127" hits="0"/> - <line number="131" hits="0"/> - <line number="139" hits="1"/> - <line number="146" hits="0"/> - <line number="147" hits="0"/> - <line number="149" hits="0"/> + <line number="141" hits="0"/> + <line number="142" hits="0"/> + <line number="143" hits="0"/> + <line number="149" hits="1"/> <line number="155" hits="0"/> - <line number="162" hits="1"/> - <line number="170" hits="0"/> - <line number="172" hits="0"/> - <line number="173" hits="0"/> - <line number="174" hits="0"/> - <line number="175" hits="0"/> - <line number="176" hits="0"/> - <line number="182" hits="0"/> - <line number="188" hits="0"/> - <line number="190" hits="0"/> - <line number="194" hits="0"/> - <line number="196" hits="1"/> - <line number="197" hits="0"/> - <line number="199" hits="0"/> - <line number="211" hits="1"/> - <line number="212" hits="0"/> + <line number="157" hits="0"/> + <line number="158" hits="0"/> + <line number="159" hits="0"/> + <line number="160" hits="0"/> + <line number="164" hits="0"/> + <line number="172" hits="1"/> + <line number="178" hits="0"/> + <line number="180" hits="1"/> + <line number="205" hits="0"/> + <line number="206" hits="0"/> + <line number="208" hits="0"/> <line number="214" hits="0"/> - <line number="220" hits="1"/> - <line number="226" hits="0"/> - <line number="228" hits="0"/> - <line number="231" hits="0"/> - <line number="232" hits="0"/> + <line number="221" hits="1"/> <line number="233" hits="0"/> + <line number="234" hits="0"/> + <line number="236" hits="0"/> + <line number="238" hits="0"/> + <line number="239" hits="0"/> + <line number="240" hits="0"/> + <line number="241" hits="0"/> <line number="242" hits="0"/> + <line number="243" hits="0"/> <line number="249" hits="0"/> - <line number="250" hits="0"/> - <line number="251" hits="0"/> - <line number="253" hits="1"/> - <line number="254" hits="0"/> - <line number="256" hits="1"/> + <line number="255" hits="0"/> <line number="257" hits="0"/> - <line number="259" hits="0"/> <line number="266" hits="0"/> <line number="267" hits="0"/> + <line number="268" hits="0"/> <line number="269" hits="0"/> <line number="271" hits="1"/> - <line number="272" hits="0"/> + <line number="277" hits="0"/> + <line number="279" hits="0"/> + <line number="291" hits="1"/> + <line number="297" hits="0"/> + <line number="299" hits="0"/> + <line number="305" hits="1"/> + <line number="311" hits="0"/> + <line number="313" hits="1"/> + <line number="333" hits="0"/> + <line number="335" hits="0"/> + <line number="336" hits="0"/> + <line number="337" hits="0"/> + <line number="338" hits="0"/> + <line number="347" hits="0"/> + <line number="354" hits="0"/> + <line number="355" hits="0"/> + <line number="358" hits="0"/> + <line number="360" hits="1"/> + <line number="380" hits="0"/> + <line number="382" hits="0"/> + <line number="383" hits="0"/> + <line number="384" hits="0"/> + <line number="385" hits="0"/> + <line number="387" hits="0"/> + <line number="388" hits="0"/> + <line number="389" hits="0"/> + <line number="398" hits="0"/> + <line number="405" hits="0"/> + <line number="406" hits="0"/> + <line number="409" hits="0"/> + <line number="411" hits="1"/> + <line number="417" hits="0"/> + <line number="419" hits="1"/> + <line number="425" hits="0"/> + <line number="427" hits="1"/> + <line number="435" hits="0"/> + <line number="437" hits="0"/> + <line number="444" hits="0"/> + <line number="445" hits="0"/> + <line number="447" hits="0"/> + <line number="449" hits="1"/> + <line number="455" hits="0"/> + <line number="457" hits="1"/> + <line number="458" hits="0"/> </lines> </class> </classes> </package> - <package name="llms" line-rate="0.7556" branch-rate="0" complexity="0"> + <package name="llms" line-rate="0.8012" branch-rate="0" complexity="0"> <classes> <class name="__init__.py" filename="llms/__init__.py" complexity="0" line-rate="1" branch-rate="0"> <methods/> @@ -1844,59 +2785,13 @@ <line number="2" hits="1"/> <line number="3" hits="1"/> <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="9" hits="1"/> - </lines> - </class> - <class name="base.py" filename="llms/base.py" complexity="0" line-rate="0.7317" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="22" hits="1"/> - <line number="26" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="0"/> - <line number="37" hits="0"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="40" hits="1"/> - <line number="41" hits="1"/> - <line number="43" hits="1"/> - <line number="46" hits="1"/> - <line number="48" hits="1"/> - <line number="98" hits="1"/> - <line number="99" hits="1"/> - <line number="101" hits="0"/> - <line number="102" hits="0"/> - <line number="104" hits="0"/> - <line number="105" hits="0"/> - <line number="106" hits="0"/> - <line number="107" hits="0"/> - <line number="108" hits="0"/> - <line number="109" hits="0"/> - <line number="110" hits="0"/> + <line number="5" hits="1"/> + <line number="6" hits="1"/> + <line number="7" hits="1"/> + <line number="9" hits="1"/> </lines> </class> - <class name="cohere.py" filename="llms/cohere.py" complexity="0" line-rate="0.9655" branch-rate="0"> + <class name="base.py" filename="llms/base.py" complexity="0" line-rate="0.8736" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> @@ -1905,32 +2800,131 @@ <line number="6" hits="1"/> <line number="7" hits="1"/> <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="13" hits="1"/> + <line number="17" hits="1"/> <line number="18" hits="1"/> <line number="19" hits="1"/> - <line number="20" hits="1"/> <line number="21" hits="1"/> <line number="22" hits="1"/> - <line number="23" hits="1"/> <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="31" hits="1"/> <line number="32" hits="1"/> + <line number="34" hits="1"/> + <line number="44" hits="1"/> + <line number="46" hits="1"/> + <line number="58" hits="1"/> + <line number="59" hits="1"/> + <line number="60" hits="1"/> + <line number="61" hits="1"/> + <line number="62" hits="1"/> + <line number="64" hits="1"/> + <line number="76" hits="1"/> + <line number="77" hits="1"/> + <line number="78" hits="1"/> + <line number="79" hits="1"/> + <line number="80" hits="1"/> + <line number="83" hits="1"/> + <line number="84" hits="1"/> + <line number="86" hits="1"/> + <line number="99" hits="1"/> + <line number="101" hits="1"/> + <line number="102" hits="1"/> + <line number="103" hits="1"/> + <line number="104" hits="1"/> + <line number="105" hits="1"/> + <line number="106" hits="1"/> + <line number="108" hits="1"/> + <line number="111" hits="1"/> + <line number="113" hits="1"/> + <line number="114" hits="1"/> + <line number="115" hits="1"/> + <line number="116" hits="1"/> + <line number="118" hits="1"/> + <line number="130" hits="1"/> + <line number="132" hits="1"/> + <line number="133" hits="1"/> + <line number="134" hits="1"/> + <line number="135" hits="1"/> + <line number="137" hits="1"/> + <line number="138" hits="1"/> + <line number="139" hits="1"/> + <line number="140" hits="1"/> + <line number="141" hits="1"/> + <line number="143" hits="1"/> + <line number="144" hits="1"/> + <line number="147" hits="1"/> + <line number="148" hits="1"/> + <line number="151" hits="1"/> + <line number="152" hits="1"/> + <line number="155" hits="1"/> + <line number="156" hits="1"/> + <line number="158" hits="1"/> + <line number="159" hits="1"/> + <line number="160" hits="1"/> + <line number="161" hits="1"/> + <line number="163" hits="1"/> + <line number="171" hits="1"/> + <line number="172" hits="1"/> + <line number="173" hits="1"/> + <line number="176" hits="1"/> + <line number="178" hits="1"/> + <line number="190" hits="1"/> + <line number="192" hits="1"/> + <line number="242" hits="1"/> + <line number="243" hits="1"/> + <line number="244" hits="0"/> + <line number="245" hits="0"/> + <line number="246" hits="0"/> + <line number="247" hits="0"/> + <line number="248" hits="0"/> + <line number="249" hits="0"/> + <line number="250" hits="0"/> + <line number="251" hits="0"/> + <line number="252" hits="0"/> + <line number="253" hits="0"/> + <line number="254" hits="0"/> + </lines> + </class> + <class name="cohere.py" filename="llms/cohere.py" complexity="0" line-rate="0.9167" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="4" hits="1"/> + <line number="6" hits="1"/> + <line number="7" hits="1"/> + <line number="10" hits="1"/> + <line number="17" hits="1"/> + <line number="19" hits="1"/> <line number="33" hits="1"/> <line number="34" hits="1"/> <line number="35" hits="1"/> - <line number="41" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="0"/> + <line number="36" hits="1"/> + <line number="38" hits="1"/> <line number="45" hits="1"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> + <line number="46" hits="1"/> + <line number="47" hits="0"/> + <line number="48" hits="0"/> + <line number="53" hits="1"/> + <line number="54" hits="1"/> + <line number="55" hits="1"/> + <line number="56" hits="1"/> + <line number="57" hits="1"/> + <line number="58" hits="1"/> + <line number="59" hits="1"/> + <line number="62" hits="1"/> + <line number="64" hits="1"/> + <line number="72" hits="1"/> + <line number="73" hits="1"/> + <line number="74" hits="1"/> + <line number="75" hits="1"/> + <line number="81" hits="1"/> + <line number="83" hits="1"/> + <line number="84" hits="0"/> + <line number="85" hits="1"/> + <line number="87" hits="1"/> + <line number="88" hits="1"/> </lines> </class> - <class name="llamacpp.py" filename="llms/llamacpp.py" complexity="0" line-rate="0.3913" branch-rate="0"> + <class name="llamacpp.py" filename="llms/llamacpp.py" complexity="0" line-rate="0.3636" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> @@ -1941,47 +2935,45 @@ <line number="8" hits="1"/> <line number="9" hits="1"/> <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> <line number="17" hits="1"/> + <line number="18" hits="1"/> <line number="19" hits="1"/> - <line number="27" hits="0"/> - <line number="35" hits="0"/> - <line number="36" hits="0"/> - <line number="37" hits="0"/> - <line number="38" hits="0"/> - <line number="43" hits="0"/> - <line number="44" hits="0"/> - <line number="45" hits="0"/> - <line number="46" hits="0"/> - <line number="47" hits="0"/> - <line number="49" hits="1"/> + <line number="21" hits="1"/> + <line number="42" hits="0"/> + <line number="50" hits="0"/> + <line number="51" hits="0"/> + <line number="52" hits="0"/> <line number="53" hits="0"/> - <line number="54" hits="0"/> + <line number="58" hits="0"/> + <line number="59" hits="0"/> + <line number="60" hits="0"/> <line number="61" hits="0"/> <line number="62" hits="0"/> - <line number="64" hits="0"/> - <line number="65" hits="0"/> - <line number="66" hits="0"/> - <line number="67" hits="0"/> - <line number="68" hits="0"/> - <line number="69" hits="0"/> - <line number="71" hits="1"/> - <line number="72" hits="1"/> - <line number="73" hits="0"/> - <line number="74" hits="0"/> + <line number="64" hits="1"/> <line number="75" hits="0"/> <line number="76" hits="0"/> - <line number="77" hits="0"/> - <line number="79" hits="0"/> - <line number="81" hits="1"/> + <line number="83" hits="0"/> <line number="84" hits="0"/> - <line number="85" hits="0"/> + <line number="86" hits="0"/> + <line number="87" hits="0"/> + <line number="88" hits="0"/> + <line number="89" hits="0"/> + <line number="90" hits="0"/> + <line number="91" hits="0"/> + <line number="93" hits="1"/> + <line number="94" hits="1"/> + <line number="100" hits="0"/> + <line number="101" hits="0"/> + <line number="102" hits="0"/> + <line number="103" hits="0"/> + <line number="104" hits="0"/> + <line number="106" hits="0"/> + <line number="108" hits="1"/> + <line number="120" hits="0"/> + <line number="121" hits="0"/> </lines> </class> - <class name="mistral.py" filename="llms/mistral.py" complexity="0" line-rate="0.5" branch-rate="0"> + <class name="mistral.py" filename="llms/mistral.py" complexity="0" line-rate="0.8636" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> @@ -1992,44 +2984,42 @@ <line number="8" hits="1"/> <line number="9" hits="1"/> <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> <line number="15" hits="1"/> <line number="16" hits="1"/> <line number="18" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="0"/> - <line number="30" hits="0"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="0"/> <line number="36" hits="1"/> <line number="37" hits="1"/> - <line number="42" hits="0"/> - <line number="43" hits="0"/> - <line number="44" hits="0"/> - <line number="45" hits="0"/> - <line number="46" hits="0"/> - <line number="47" hits="0"/> - <line number="48" hits="0"/> - <line number="51" hits="0"/> + <line number="38" hits="1"/> + <line number="39" hits="1"/> + <line number="40" hits="1"/> + <line number="41" hits="1"/> + <line number="43" hits="1"/> + <line number="51" hits="1"/> + <line number="52" hits="1"/> <line number="53" hits="1"/> - <line number="54" hits="0"/> - <line number="55" hits="0"/> - <line number="57" hits="0"/> - <line number="63" hits="0"/> - <line number="64" hits="0"/> - <line number="71" hits="0"/> - <line number="73" hits="0"/> - <line number="74" hits="0"/> - <line number="75" hits="0"/> - <line number="76" hits="0"/> - <line number="77" hits="0"/> - <line number="78" hits="0"/> + <line number="54" hits="1"/> + <line number="55" hits="1"/> + <line number="60" hits="1"/> + <line number="61" hits="1"/> + <line number="62" hits="1"/> + <line number="63" hits="1"/> + <line number="64" hits="1"/> + <line number="65" hits="0"/> + <line number="66" hits="0"/> + <line number="69" hits="1"/> + <line number="71" hits="1"/> + <line number="79" hits="1"/> + <line number="80" hits="1"/> + <line number="81" hits="1"/> + <line number="87" hits="1"/> + <line number="88" hits="1"/> + <line number="95" hits="1"/> + <line number="97" hits="1"/> + <line number="98" hits="0"/> + <line number="99" hits="1"/> + <line number="100" hits="0"/> + <line number="101" hits="0"/> + <line number="102" hits="0"/> </lines> </class> <class name="ollama.py" filename="llms/ollama.py" complexity="0" line-rate="1" branch-rate="0"> @@ -2041,332 +3031,360 @@ <line number="6" hits="1"/> <line number="7" hits="1"/> <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="16" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="30" hits="1"/> - <line number="39" hits="1"/> + <line number="15" hits="1"/> + <line number="17" hits="1"/> + <line number="35" hits="1"/> + <line number="36" hits="1"/> + <line number="37" hits="1"/> + <line number="38" hits="1"/> <line number="40" hits="1"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="55" hits="1"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> + <line number="62" hits="1"/> + <line number="63" hits="1"/> + <line number="64" hits="1"/> + <line number="65" hits="1"/> + <line number="67" hits="1"/> + <line number="68" hits="1"/> + <line number="75" hits="1"/> + <line number="76" hits="1"/> + <line number="78" hits="1"/> + <line number="79" hits="1"/> + <line number="80" hits="1"/> + <line number="81" hits="1"/> </lines> </class> - <class name="openai.py" filename="llms/openai.py" complexity="0" line-rate="0.8889" branch-rate="0"> + <class name="openai.py" filename="llms/openai.py" complexity="0" line-rate="0.7647" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> <line number="2" hits="1"/> + <line number="3" hits="1"/> <line number="4" hits="1"/> - <line number="6" hits="1"/> + <line number="5" hits="1"/> <line number="7" hits="1"/> <line number="8" hits="1"/> <line number="9" hits="1"/> <line number="12" hits="1"/> - <line number="13" hits="1"/> <line number="14" hits="1"/> <line number="15" hits="1"/> + <line number="16" hits="1"/> <line number="17" hits="1"/> + <line number="21" hits="1"/> <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> <line number="27" hits="1"/> <line number="28" hits="1"/> - <line number="29" hits="1"/> <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="39" hits="1"/> - <line number="40" hits="1"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> + <line number="48" hits="1"/> + <line number="49" hits="1"/> <line number="50" hits="1"/> + <line number="51" hits="1"/> <line number="52" hits="1"/> - <line number="53" hits="0"/> + <line number="53" hits="1"/> <line number="54" hits="1"/> - <line number="55" hits="0"/> - <line number="56" hits="0"/> - <line number="57" hits="0"/> + <line number="55" hits="1"/> + <line number="56" hits="1"/> + <line number="57" hits="1"/> + <line number="58" hits="1"/> + <line number="61" hits="1"/> + <line number="62" hits="1"/> + <line number="64" hits="1"/> + <line number="74" hits="1"/> + <line number="75" hits="1"/> + <line number="76" hits="1"/> + <line number="77" hits="1"/> + <line number="80" hits="1"/> + <line number="86" hits="1"/> + <line number="88" hits="1"/> + <line number="98" hits="0"/> + <line number="99" hits="0"/> + <line number="100" hits="0"/> + <line number="101" hits="0"/> + <line number="104" hits="0"/> + <line number="110" hits="0"/> + <line number="112" hits="1"/> + <line number="126" hits="1"/> + <line number="127" hits="1"/> + <line number="128" hits="1"/> + <line number="129" hits="1"/> + <line number="133" hits="1"/> + <line number="141" hits="1"/> + <line number="142" hits="1"/> + <line number="143" hits="1"/> + <line number="144" hits="1"/> + <line number="145" hits="1"/> + <line number="146" hits="1"/> + <line number="151" hits="1"/> + <line number="155" hits="1"/> + <line number="156" hits="1"/> + <line number="157" hits="0"/> + <line number="158" hits="1"/> + <line number="159" hits="1"/> + <line number="161" hits="1"/> + <line number="162" hits="1"/> + <line number="163" hits="1"/> + <line number="165" hits="1"/> + <line number="179" hits="0"/> + <line number="180" hits="0"/> + <line number="181" hits="0"/> + <line number="182" hits="0"/> + <line number="186" hits="0"/> + <line number="194" hits="0"/> + <line number="195" hits="0"/> + <line number="196" hits="0"/> + <line number="197" hits="0"/> + <line number="198" hits="0"/> + <line number="199" hits="0"/> + <line number="204" hits="0"/> + <line number="208" hits="0"/> + <line number="209" hits="0"/> + <line number="210" hits="0"/> + <line number="211" hits="0"/> + <line number="212" hits="0"/> + <line number="214" hits="0"/> + <line number="215" hits="0"/> + <line number="216" hits="0"/> + <line number="218" hits="1"/> + <line number="230" hits="1"/> + <line number="231" hits="1"/> + <line number="235" hits="1"/> + <line number="236" hits="1"/> + <line number="237" hits="1"/> + <line number="238" hits="1"/> + <line number="239" hits="1"/> + <line number="240" hits="1"/> + <line number="241" hits="1"/> + <line number="242" hits="1"/> + <line number="244" hits="1"/> + <line number="256" hits="0"/> + <line number="257" hits="0"/> + <line number="261" hits="0"/> + <line number="262" hits="0"/> + <line number="263" hits="0"/> + <line number="264" hits="0"/> + <line number="265" hits="0"/> + <line number="266" hits="0"/> + <line number="267" hits="0"/> + <line number="268" hits="0"/> + <line number="270" hits="1"/> + <line number="283" hits="1"/> + <line number="284" hits="1"/> + <line number="286" hits="1"/> + <line number="287" hits="1"/> + <line number="288" hits="1"/> + <line number="290" hits="1"/> + <line number="291" hits="1"/> + <line number="294" hits="1"/> + <line number="302" hits="1"/> + <line number="303" hits="1"/> + <line number="306" hits="1"/> + <line number="309" hits="1"/> + <line number="312" hits="1"/> + <line number="315" hits="1"/> + <line number="317" hits="1"/> + <line number="318" hits="1"/> + <line number="319" hits="1"/> + <line number="320" hits="1"/> + <line number="322" hits="1"/> + <line number="333" hits="1"/> + <line number="335" hits="1"/> + <line number="336" hits="1"/> + <line number="339" hits="1"/> + <line number="340" hits="1"/> + <line number="341" hits="1"/> + <line number="342" hits="1"/> + <line number="345" hits="1"/> + <line number="346" hits="1"/> + <line number="347" hits="1"/> + <line number="349" hits="1"/> + <line number="352" hits="1"/> + <line number="355" hits="1"/> + <line number="357" hits="1"/> + <line number="358" hits="1"/> + <line number="359" hits="1"/> + <line number="360" hits="1"/> + <line number="363" hits="1"/> + <line number="371" hits="1"/> + <line number="372" hits="1"/> + <line number="373" hits="1"/> + <line number="374" hits="1"/> + <line number="377" hits="1"/> + <line number="380" hits="1"/> + <line number="387" hits="1"/> + <line number="388" hits="1"/> + <line number="389" hits="1"/> + <line number="390" hits="1"/> + <line number="392" hits="1"/> + <line number="393" hits="1"/> + <line number="398" hits="1"/> + <line number="399" hits="1"/> + <line number="402" hits="1"/> + <line number="403" hits="0"/> + <line number="404" hits="0"/> + <line number="405" hits="0"/> + <line number="407" hits="1"/> + <line number="412" hits="1"/> + <line number="413" hits="1"/> + <line number="415" hits="1"/> + <line number="417" hits="1"/> </lines> </class> - <class name="openrouter.py" filename="llms/openrouter.py" complexity="0" line-rate="0.8649" branch-rate="0"> + <class name="openrouter.py" filename="llms/openrouter.py" complexity="0" line-rate="0.8611" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> <line number="2" hits="1"/> <line number="4" hits="1"/> - <line number="6" hits="1"/> + <line number="5" hits="1"/> <line number="7" hits="1"/> <line number="8" hits="1"/> - <line number="11" hits="1"/> + <line number="9" hits="1"/> <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> + <line number="16" hits="1"/> <line number="17" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="0"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> + <line number="19" hits="1"/> <line number="40" hits="1"/> <line number="41" hits="1"/> - <line number="43" hits="1"/> <line number="44" hits="1"/> <line number="45" hits="1"/> <line number="46" hits="1"/> <line number="47" hits="1"/> - <line number="54" hits="1"/> + <line number="48" hits="0"/> + <line number="49" hits="1"/> + <line number="50" hits="1"/> + <line number="51" hits="1"/> + <line number="52" hits="1"/> + <line number="55" hits="1"/> <line number="56" hits="1"/> - <line number="57" hits="0"/> <line number="58" hits="1"/> - <line number="59" hits="0"/> - <line number="60" hits="0"/> - <line number="61" hits="0"/> + <line number="66" hits="1"/> + <line number="67" hits="1"/> + <line number="68" hits="1"/> + <line number="69" hits="1"/> + <line number="76" hits="1"/> + <line number="78" hits="1"/> + <line number="79" hits="0"/> + <line number="80" hits="1"/> + <line number="81" hits="0"/> + <line number="82" hits="0"/> + <line number="83" hits="0"/> </lines> </class> - <class name="zure.py" filename="llms/zure.py" complexity="0" line-rate="0.8974" branch-rate="0"> + <class name="zure.py" filename="llms/zure.py" complexity="0" line-rate="0.8947" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> <line number="2" hits="1"/> <line number="4" hits="1"/> - <line number="6" hits="1"/> + <line number="5" hits="1"/> <line number="7" hits="1"/> <line number="8" hits="1"/> <line number="9" hits="1"/> - <line number="12" hits="1"/> + <line number="10" hits="1"/> <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="17" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="39" hits="1"/> - <line number="40" hits="1"/> - <line number="41" hits="1"/> + <line number="16" hits="1"/> + <line number="18" hits="1"/> <line number="42" hits="1"/> + <line number="43" hits="1"/> <line number="44" hits="1"/> <line number="45" hits="1"/> <line number="46" hits="1"/> <line number="47" hits="1"/> <line number="48" hits="1"/> + <line number="49" hits="1"/> + <line number="50" hits="1"/> + <line number="51" hits="1"/> + <line number="52" hits="1"/> <line number="55" hits="1"/> + <line number="56" hits="1"/> <line number="57" hits="1"/> - <line number="58" hits="0"/> - <line number="59" hits="1"/> - <line number="60" hits="0"/> - <line number="61" hits="0"/> - <line number="62" hits="0"/> + <line number="58" hits="1"/> + <line number="60" hits="1"/> + <line number="68" hits="1"/> + <line number="69" hits="1"/> + <line number="70" hits="1"/> + <line number="71" hits="1"/> + <line number="78" hits="1"/> + <line number="80" hits="1"/> + <line number="81" hits="0"/> + <line number="82" hits="1"/> + <line number="83" hits="0"/> + <line number="84" hits="0"/> + <line number="85" hits="0"/> </lines> </class> </classes> </package> - <package name="splitters" line-rate="0" branch-rate="0" complexity="0"> + <package name="routers" line-rate="0.3093" branch-rate="0" complexity="0"> <classes> - <class name="__init__.py" filename="splitters/__init__.py" complexity="0" line-rate="0" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="0"/> - <line number="2" hits="0"/> - <line number="3" hits="0"/> - <line number="4" hits="0"/> - <line number="6" hits="0"/> - </lines> - </class> - <class name="base.py" filename="splitters/base.py" complexity="0" line-rate="0" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="0"/> - <line number="3" hits="0"/> - <line number="4" hits="0"/> - <line number="6" hits="0"/> - <line number="7" hits="0"/> - <line number="10" hits="0"/> - <line number="11" hits="0"/> - <line number="12" hits="0"/> - <line number="14" hits="0"/> - <line number="15" hits="0"/> - <line number="17" hits="0"/> - <line number="18" hits="0"/> - <line number="20" hits="0"/> - <line number="21" hits="0"/> - <line number="22" hits="0"/> - <line number="23" hits="0"/> - <line number="24" hits="0"/> - <line number="25" hits="0"/> - <line number="26" hits="0"/> - <line number="27" hits="0"/> - <line number="28" hits="0"/> - <line number="30" hits="0"/> - <line number="31" hits="0"/> - <line number="36" hits="0"/> - <line number="37" hits="0"/> - <line number="38" hits="0"/> - </lines> - </class> - <class name="consecutive_sim.py" filename="splitters/consecutive_sim.py" complexity="0" line-rate="0" branch-rate="0"> + <class name="__init__.py" filename="routers/__init__.py" complexity="0" line-rate="1" branch-rate="0"> <methods/> <lines> - <line number="1" hits="0"/> - <line number="3" hits="0"/> - <line number="5" hits="0"/> - <line number="6" hits="0"/> - <line number="7" hits="0"/> - <line number="10" hits="0"/> - <line number="15" hits="0"/> - <line number="21" hits="0"/> - <line number="22" hits="0"/> - <line number="23" hits="0"/> - <line number="25" hits="0"/> - <line number="34" hits="0"/> - <line number="35" hits="0"/> - <line number="39" hits="0"/> - <line number="40" hits="0"/> - <line number="41" hits="0"/> - <line number="42" hits="0"/> - <line number="43" hits="0"/> - <line number="44" hits="0"/> - <line number="45" hits="0"/> - <line number="47" hits="0"/> - <line number="48" hits="0"/> - <line number="49" hits="0"/> - <line number="50" hits="0"/> - <line number="57" hits="0"/> - <line number="58" hits="0"/> - <line number="59" hits="0"/> - <line number="60" hits="0"/> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="3" hits="1"/> + <line number="5" hits="1"/> </lines> </class> - <class name="cumulative_sim.py" filename="splitters/cumulative_sim.py" complexity="0" line-rate="0" branch-rate="0"> + <class name="base.py" filename="routers/base.py" complexity="0" line-rate="0.2722" branch-rate="0"> <methods/> <lines> - <line number="1" hits="0"/> - <line number="3" hits="0"/> - <line number="5" hits="0"/> - <line number="6" hits="0"/> - <line number="7" hits="0"/> - <line number="10" hits="0"/> - <line number="16" hits="0"/> - <line number="22" hits="0"/> - <line number="23" hits="0"/> - <line number="24" hits="0"/> - <line number="26" hits="0"/> - <line number="34" hits="0"/> - <line number="36" hits="0"/> - <line number="37" hits="0"/> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="6" hits="1"/> + <line number="8" hits="1"/> + <line number="9" hits="1"/> + <line number="10" hits="1"/> + <line number="11" hits="1"/> + <line number="12" hits="1"/> + <line number="14" hits="1"/> + <line number="20" hits="1"/> + <line number="21" hits="1"/> + <line number="22" hits="1"/> + <line number="23" hits="1"/> + <line number="24" hits="1"/> + <line number="25" hits="1"/> + <line number="26" hits="1"/> + <line number="33" hits="1"/> + <line number="34" hits="1"/> + <line number="37" hits="1"/> + <line number="40" hits="0"/> <line number="41" hits="0"/> <line number="42" hits="0"/> <line number="44" hits="0"/> <line number="45" hits="0"/> <line number="46" hits="0"/> - <line number="49" hits="0"/> - <line number="53" hits="0"/> - <line number="54" hits="0"/> - <line number="57" hits="0"/> - <line number="58" hits="0"/> - <line number="59" hits="0"/> - <line number="64" hits="0"/> - <line number="65" hits="0"/> - <line number="72" hits="0"/> - <line number="77" hits="0"/> - <line number="78" hits="0"/> - <line number="80" hits="0"/> - </lines> - </class> - <class name="rolling_window.py" filename="splitters/rolling_window.py" complexity="0" line-rate="0" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="0"/> - <line number="2" hits="0"/> - <line number="4" hits="0"/> - <line number="6" hits="0"/> - <line number="7" hits="0"/> - <line number="8" hits="0"/> - <line number="9" hits="0"/> - <line number="10" hits="0"/> - <line number="13" hits="0"/> - <line number="14" hits="0"/> - <line number="15" hits="0"/> - <line number="16" hits="0"/> - <line number="17" hits="0"/> - <line number="18" hits="0"/> - <line number="19" hits="0"/> - <line number="20" hits="0"/> - <line number="21" hits="0"/> - <line number="22" hits="0"/> - <line number="24" hits="0"/> - <line number="25" hits="0"/> - <line number="38" hits="0"/> - <line number="39" hits="0"/> + <line number="47" hits="0"/> + <line number="48" hits="0"/> + <line number="51" hits="0"/> <line number="52" hits="0"/> - <line number="53" hits="0"/> <line number="54" hits="0"/> <line number="55" hits="0"/> <line number="56" hits="0"/> - <line number="57" hits="0"/> - <line number="58" hits="0"/> <line number="59" hits="0"/> - <line number="60" hits="0"/> <line number="61" hits="0"/> <line number="62" hits="0"/> <line number="63" hits="0"/> - <line number="65" hits="0"/> - <line number="73" hits="0"/> - <line number="74" hits="0"/> - <line number="76" hits="0"/> - <line number="77" hits="0"/> - <line number="78" hits="0"/> - <line number="79" hits="0"/> - <line number="84" hits="0"/> - <line number="85" hits="0"/> - <line number="86" hits="0"/> - <line number="87" hits="0"/> - <line number="88" hits="0"/> - <line number="90" hits="0"/> - <line number="91" hits="0"/> + <line number="64" hits="0"/> + <line number="67" hits="1"/> + <line number="70" hits="1"/> + <line number="72" hits="1"/> + <line number="73" hits="1"/> + <line number="75" hits="1"/> + <line number="90" hits="1"/> + <line number="91" hits="1"/> <line number="92" hits="0"/> + <line number="93" hits="0"/> <line number="94" hits="0"/> <line number="95" hits="0"/> - <line number="97" hits="0"/> <line number="98" hits="0"/> - <line number="100" hits="0"/> + <line number="101" hits="0"/> <line number="102" hits="0"/> - <line number="111" hits="0"/> - <line number="112" hits="0"/> + <line number="103" hits="1"/> + <line number="104" hits="1"/> + <line number="106" hits="1"/> + <line number="107" hits="1"/> <line number="114" hits="0"/> <line number="115" hits="0"/> <line number="116" hits="0"/> @@ -2374,174 +3392,841 @@ <line number="118" hits="0"/> <line number="119" hits="0"/> <line number="120" hits="0"/> - <line number="121" hits="0"/> - <line number="123" hits="0"/> - <line number="125" hits="0"/> + <line number="122" hits="0"/> <line number="126" hits="0"/> <line number="127" hits="0"/> - <line number="128" hits="0"/> <line number="129" hits="0"/> <line number="130" hits="0"/> + <line number="131" hits="0"/> + <line number="132" hits="0"/> <line number="134" hits="0"/> <line number="135" hits="0"/> - <line number="137" hits="0"/> - <line number="138" hits="0"/> <line number="139" hits="0"/> - <line number="140" hits="0"/> <line number="141" hits="0"/> <line number="142" hits="0"/> - <line number="147" hits="0"/> - <line number="148" hits="0"/> + <line number="144" hits="0"/> + <line number="146" hits="0"/> + <line number="149" hits="0"/> <line number="150" hits="0"/> - <line number="151" hits="0"/> <line number="152" hits="0"/> - <line number="155" hits="0"/> - <line number="156" hits="0"/> - <line number="159" hits="0"/> - <line number="160" hits="0"/> - <line number="162" hits="0"/> - <line number="163" hits="0"/> - <line number="164" hits="0"/> - <line number="165" hits="0"/> - <line number="166" hits="0"/> - <line number="167" hits="0"/> - <line number="172" hits="0"/> - <line number="180" hits="0"/> + <line number="156" hits="1"/> + <line number="157" hits="1"/> + <line number="176" hits="0"/> + <line number="179" hits="0"/> <line number="181" hits="0"/> - <line number="184" hits="0"/> - <line number="189" hits="0"/> + <line number="182" hits="0"/> <line number="190" hits="0"/> - <line number="191" hits="0"/> <line number="192" hits="0"/> <line number="193" hits="0"/> + <line number="194" hits="0"/> <line number="195" hits="0"/> - <line number="196" hits="0"/> - <line number="197" hits="0"/> - <line number="199" hits="0"/> - <line number="205" hits="0"/> - <line number="207" hits="0"/> - <line number="218" hits="0"/> - <line number="219" hits="0"/> - <line number="220" hits="0"/> - <line number="223" hits="0"/> - <line number="224" hits="0"/> - <line number="225" hits="0"/> - <line number="227" hits="0"/> - <line number="228" hits="0"/> - <line number="229" hits="0"/> - <line number="230" hits="0"/> - <line number="232" hits="0"/> - <line number="233" hits="0"/> - <line number="240" hits="0"/> - <line number="241" hits="0"/> + <line number="197" hits="1"/> + <line number="198" hits="1"/> + <line number="213" hits="0"/> + <line number="214" hits="0"/> + <line number="220" hits="1"/> + <line number="226" hits="1"/> + <line number="232" hits="1"/> + <line number="238" hits="0"/> + <line number="239" hits="0"/> + <line number="242" hits="0"/> <line number="243" hits="0"/> - <line number="246" hits="0"/> + <line number="247" hits="0"/> + <line number="250" hits="0"/> + <line number="251" hits="0"/> + <line number="253" hits="0"/> <line number="254" hits="0"/> - <line number="258" hits="0"/> - <line number="259" hits="0"/> - <line number="260" hits="0"/> + <line number="255" hits="0"/> + <line number="256" hits="0"/> + <line number="257" hits="0"/> + <line number="259" hits="1"/> + <line number="265" hits="1"/> + <line number="266" hits="1"/> + <line number="267" hits="1"/> + <line number="278" hits="1"/> + <line number="280" hits="1"/> + <line number="286" hits="0"/> + <line number="287" hits="0"/> + <line number="289" hits="1"/> + <line number="297" hits="0"/> + <line number="298" hits="0"/> + <line number="299" hits="0"/> + <line number="300" hits="0"/> + <line number="301" hits="0"/> + <line number="303" hits="1"/> + <line number="309" hits="0"/> + <line number="310" hits="0"/> + <line number="312" hits="0"/> + <line number="313" hits="0"/> + <line number="315" hits="1"/> + <line number="321" hits="1"/> + <line number="322" hits="1"/> + <line number="328" hits="1"/> + <line number="337" hits="0"/> + <line number="338" hits="0"/> + <line number="340" hits="0"/> + <line number="341" hits="0"/> + <line number="342" hits="0"/> + <line number="343" hits="0"/> + <line number="346" hits="0"/> + <line number="349" hits="1"/> + <line number="352" hits="1"/> + <line number="353" hits="1"/> + <line number="354" hits="1"/> + <line number="355" hits="1"/> + <line number="356" hits="1"/> + <line number="357" hits="1"/> + <line number="358" hits="1"/> + <line number="359" hits="1"/> + <line number="360" hits="1"/> + <line number="361" hits="1"/> + <line number="363" hits="1"/> + <line number="364" hits="1"/> + <line number="366" hits="1"/> + <line number="397" hits="1"/> + <line number="398" hits="1"/> + <line number="408" hits="1"/> + <line number="409" hits="1"/> + <line number="410" hits="1"/> + <line number="411" hits="1"/> + <line number="413" hits="1"/> + <line number="415" hits="1"/> + <line number="416" hits="1"/> + <line number="417" hits="1"/> + <line number="418" hits="0"/> + <line number="419" hits="1"/> + <line number="420" hits="1"/> + <line number="421" hits="0"/> + <line number="424" hits="1"/> + <line number="425" hits="1"/> + <line number="428" hits="1"/> + <line number="429" hits="1"/> + <line number="430" hits="1"/> + <line number="432" hits="1"/> + <line number="434" hits="1"/> + <line number="442" hits="1"/> + <line number="443" hits="0"/> + <line number="444" hits="0"/> + <line number="446" hits="1"/> + <line number="447" hits="1"/> + <line number="449" hits="1"/> + <line number="457" hits="1"/> + <line number="458" hits="0"/> + <line number="459" hits="0"/> + <line number="461" hits="1"/> + <line number="462" hits="1"/> + <line number="464" hits="1"/> + <line number="474" hits="1"/> + <line number="475" hits="1"/> + <line number="476" hits="0"/> + <line number="480" hits="1"/> + <line number="483" hits="1"/> + <line number="484" hits="1"/> + <line number="485" hits="1"/> + <line number="487" hits="1"/> + <line number="491" hits="0"/> + <line number="494" hits="1"/> + <line number="495" hits="1"/> + <line number="496" hits="1"/> + <line number="497" hits="1"/> + <line number="501" hits="1"/> + <line number="502" hits="1"/> + <line number="504" hits="1"/> + <line number="511" hits="1"/> + <line number="512" hits="1"/> + <line number="513" hits="1"/> + <line number="514" hits="0"/> + <line number="519" hits="1"/> + <line number="527" hits="0"/> + <line number="530" hits="0"/> + <line number="531" hits="0"/> + <line number="535" hits="0"/> + <line number="536" hits="0"/> + <line number="538" hits="1"/> + <line number="558" hits="0"/> + <line number="559" hits="0"/> + <line number="561" hits="0"/> + <line number="562" hits="0"/> + <line number="563" hits="0"/> + <line number="564" hits="0"/> + <line number="566" hits="0"/> + <line number="568" hits="0"/> + <line number="571" hits="0"/> + <line number="575" hits="0"/> + <line number="579" hits="0"/> + <line number="580" hits="0"/> + <line number="581" hits="0"/> + <line number="582" hits="0"/> + <line number="583" hits="0"/> + <line number="586" hits="0"/> + <line number="587" hits="0"/> + <line number="588" hits="0"/> + <line number="594" hits="0"/> + <line number="595" hits="0"/> + <line number="597" hits="0"/> + <line number="598" hits="0"/> + <line number="599" hits="0"/> + <line number="600" hits="0"/> + <line number="607" hits="0"/> + <line number="609" hits="1"/> + <line number="630" hits="0"/> + <line number="632" hits="0"/> + <line number="634" hits="0"/> + <line number="635" hits="0"/> + <line number="636" hits="0"/> + <line number="637" hits="0"/> + <line number="639" hits="0"/> + <line number="641" hits="0"/> + <line number="644" hits="0"/> + <line number="648" hits="0"/> + <line number="652" hits="0"/> + <line number="653" hits="0"/> + <line number="654" hits="0"/> + <line number="655" hits="0"/> + <line number="656" hits="0"/> + <line number="659" hits="0"/> + <line number="660" hits="0"/> + <line number="661" hits="0"/> + <line number="664" hits="0"/> + <line number="665" hits="0"/> + <line number="667" hits="0"/> + <line number="668" hits="0"/> + <line number="669" hits="0"/> + <line number="670" hits="0"/> + <line number="677" hits="0"/> + <line number="679" hits="1"/> + <line number="685" hits="0"/> + <line number="686" hits="0"/> + <line number="687" hits="0"/> + <line number="688" hits="0"/> + <line number="689" hits="0"/> + <line number="690" hits="0"/> + <line number="691" hits="0"/> + <line number="693" hits="1"/> + <line number="709" hits="0"/> + <line number="710" hits="0"/> + <line number="713" hits="0"/> + <line number="714" hits="0"/> + <line number="718" hits="0"/> + <line number="720" hits="0"/> + <line number="721" hits="0"/> + <line number="722" hits="0"/> + <line number="723" hits="0"/> + <line number="725" hits="0"/> + <line number="726" hits="0"/> + <line number="727" hits="0"/> + <line number="732" hits="0"/> + <line number="734" hits="0"/> + <line number="735" hits="0"/> + <line number="736" hits="0"/> + <line number="737" hits="0"/> + <line number="738" hits="0"/> + <line number="741" hits="0"/> + <line number="742" hits="0"/> + <line number="743" hits="0"/> + <line number="744" hits="0"/> + <line number="745" hits="0"/> + <line number="747" hits="1"/> + <line number="765" hits="0"/> + <line number="766" hits="0"/> + <line number="769" hits="0"/> + <line number="770" hits="0"/> + <line number="774" hits="0"/> + <line number="776" hits="0"/> + <line number="777" hits="0"/> + <line number="778" hits="0"/> + <line number="779" hits="0"/> + <line number="781" hits="0"/> + <line number="782" hits="0"/> + <line number="785" hits="0"/> + <line number="790" hits="0"/> + <line number="792" hits="0"/> + <line number="793" hits="0"/> + <line number="794" hits="0"/> + <line number="795" hits="0"/> + <line number="796" hits="0"/> + <line number="799" hits="0"/> + <line number="800" hits="0"/> + <line number="801" hits="0"/> + <line number="802" hits="0"/> + <line number="803" hits="0"/> + <line number="805" hits="1"/> + <line number="812" hits="1"/> + <line number="813" hits="0"/> + <line number="814" hits="0"/> + <line number="815" hits="0"/> + <line number="817" hits="0"/> + <line number="818" hits="1"/> + <line number="819" hits="1"/> + <line number="820" hits="1"/> + <line number="829" hits="1"/> + <line number="830" hits="0"/> + <line number="831" hits="1"/> + <line number="832" hits="0"/> + <line number="834" hits="1"/> + <line number="836" hits="1"/> + <line number="845" hits="0"/> + <line number="846" hits="0"/> + <line number="847" hits="0"/> + <line number="848" hits="0"/> + <line number="850" hits="0"/> + <line number="851" hits="0"/> + <line number="852" hits="0"/> + <line number="853" hits="0"/> + <line number="862" hits="0"/> + <line number="864" hits="0"/> + <line number="865" hits="0"/> + <line number="867" hits="0"/> + <line number="869" hits="0"/> + <line number="871" hits="1"/> + <line number="877" hits="0"/> + <line number="878" hits="0"/> + <line number="879" hits="0"/> + <line number="880" hits="0"/> + <line number="887" hits="0"/> + <line number="888" hits="0"/> + <line number="889" hits="0"/> + <line number="890" hits="0"/> + <line number="891" hits="0"/> + <line number="893" hits="1"/> + <line number="900" hits="0"/> + <line number="901" hits="0"/> + <line number="902" hits="0"/> + <line number="904" hits="0"/> + <line number="905" hits="0"/> + <line number="906" hits="0"/> + <line number="908" hits="0"/> + <line number="911" hits="0"/> + <line number="913" hits="0"/> + <line number="915" hits="0"/> + <line number="926" hits="0"/> + <line number="928" hits="0"/> + <line number="930" hits="1"/> + <line number="940" hits="0"/> + <line number="941" hits="0"/> + <line number="942" hits="0"/> + <line number="947" hits="0"/> + <line number="949" hits="1"/> + <line number="950" hits="0"/> + <line number="956" hits="1"/> + <line number="957" hits="1"/> + <line number="965" hits="0"/> + <line number="966" hits="0"/> + <line number="967" hits="0"/> + <line number="968" hits="0"/> + <line number="970" hits="0"/> + <line number="972" hits="1"/> + <line number="973" hits="1"/> + <line number="981" hits="0"/> + <line number="982" hits="0"/> + <line number="983" hits="0"/> + <line number="984" hits="0"/> + <line number="986" hits="0"/> + <line number="988" hits="1"/> + <line number="989" hits="1"/> + <line number="997" hits="0"/> + <line number="998" hits="0"/> + <line number="999" hits="0"/> + <line number="1001" hits="0"/> + <line number="1003" hits="1"/> + <line number="1009" hits="0"/> + <line number="1011" hits="1"/> + <line number="1017" hits="0"/> + <line number="1018" hits="0"/> + <line number="1020" hits="1"/> + <line number="1021" hits="0"/> + <line number="1023" hits="1"/> + <line number="1045" hits="0"/> + <line number="1046" hits="0"/> + <line number="1047" hits="0"/> + <line number="1049" hits="0"/> + <line number="1051" hits="0"/> + <line number="1052" hits="0"/> + <line number="1055" hits="0"/> + <line number="1056" hits="0"/> + <line number="1060" hits="0"/> + <line number="1061" hits="0"/> + <line number="1062" hits="0"/> + <line number="1063" hits="0"/> + <line number="1064" hits="0"/> + <line number="1065" hits="0"/> + <line number="1069" hits="0"/> + <line number="1071" hits="0"/> + <line number="1072" hits="0"/> + <line number="1074" hits="0"/> + <line number="1080" hits="1"/> + <line number="1087" hits="0"/> + <line number="1088" hits="0"/> + <line number="1089" hits="0"/> + <line number="1090" hits="0"/> + <line number="1091" hits="0"/> + <line number="1093" hits="0"/> + <line number="1095" hits="0"/> + <line number="1096" hits="0"/> + <line number="1097" hits="0"/> + <line number="1098" hits="0"/> + <line number="1099" hits="0"/> + <line number="1100" hits="0"/> + <line number="1101" hits="0"/> + <line number="1103" hits="0"/> + <line number="1104" hits="0"/> + <line number="1106" hits="0"/> + <line number="1107" hits="0"/> + <line number="1109" hits="0"/> + <line number="1115" hits="1"/> + <line number="1122" hits="0"/> + <line number="1123" hits="0"/> + <line number="1124" hits="0"/> + <line number="1125" hits="0"/> + <line number="1126" hits="0"/> + <line number="1128" hits="0"/> + <line number="1130" hits="0"/> + <line number="1131" hits="0"/> + <line number="1132" hits="0"/> + <line number="1133" hits="0"/> + <line number="1134" hits="0"/> + <line number="1135" hits="0"/> + <line number="1136" hits="0"/> + <line number="1138" hits="0"/> + <line number="1139" hits="0"/> + <line number="1141" hits="0"/> + <line number="1142" hits="0"/> + <line number="1144" hits="0"/> + <line number="1150" hits="1"/> + <line number="1155" hits="0"/> + <line number="1170" hits="1"/> + <line number="1176" hits="0"/> + <line number="1177" hits="0"/> + <line number="1179" hits="1"/> + <line number="1185" hits="1"/> + <line number="1186" hits="1"/> + <line number="1187" hits="1"/> + <line number="1188" hits="1"/> + <line number="1190" hits="1"/> + <line number="1196" hits="0"/> + <line number="1197" hits="0"/> + <line number="1198" hits="0"/> + <line number="1199" hits="0"/> + <line number="1201" hits="1"/> + <line number="1210" hits="0"/> + <line number="1211" hits="0"/> + <line number="1212" hits="0"/> + <line number="1213" hits="0"/> + <line number="1215" hits="0"/> + <line number="1217" hits="1"/> + <line number="1226" hits="0"/> + <line number="1227" hits="0"/> + <line number="1228" hits="0"/> + <line number="1229" hits="0"/> + <line number="1231" hits="0"/> + <line number="1233" hits="1"/> + <line number="1261" hits="0"/> + <line number="1262" hits="0"/> + <line number="1264" hits="0"/> + <line number="1267" hits="0"/> + <line number="1269" hits="1"/> + <line number="1297" hits="0"/> + <line number="1300" hits="0"/> + <line number="1302" hits="0"/> + <line number="1305" hits="0"/> + <line number="1307" hits="1"/> + <line number="1319" hits="0"/> + <line number="1320" hits="0"/> + <line number="1321" hits="0"/> + <line number="1331" hits="0"/> + <line number="1332" hits="0"/> + <line number="1333" hits="0"/> + <line number="1334" hits="0"/> + <line number="1336" hits="1"/> + <line number="1347" hits="0"/> + <line number="1349" hits="1"/> + <line number="1360" hits="0"/> + <line number="1362" hits="1"/> + <line number="1371" hits="1"/> + <line number="1372" hits="0"/> + <line number="1373" hits="1"/> + <line number="1374" hits="1"/> + <line number="1375" hits="0"/> + <line number="1376" hits="0"/> + <line number="1378" hits="0"/> + <line number="1383" hits="1"/> + <line number="1393" hits="0"/> + <line number="1395" hits="0"/> + <line number="1396" hits="0"/> + <line number="1399" hits="0"/> + <line number="1403" hits="0"/> + <line number="1406" hits="0"/> + <line number="1407" hits="0"/> + <line number="1409" hits="0"/> + <line number="1410" hits="0"/> + <line number="1412" hits="1"/> + <line number="1424" hits="0"/> + <line number="1426" hits="0"/> + <line number="1427" hits="0"/> + <line number="1430" hits="0"/> + <line number="1434" hits="0"/> + <line number="1437" hits="0"/> + <line number="1438" hits="0"/> + <line number="1440" hits="0"/> + <line number="1441" hits="0"/> + <line number="1443" hits="1"/> + <line number="1451" hits="0"/> + <line number="1452" hits="0"/> + <line number="1453" hits="0"/> + <line number="1454" hits="0"/> + <line number="1455" hits="0"/> + <line number="1457" hits="1"/> + <line number="1458" hits="1"/> + <line number="1469" hits="0"/> + <line number="1472" hits="0"/> + <line number="1473" hits="0"/> + <line number="1475" hits="0"/> + <line number="1476" hits="0"/> + <line number="1478" hits="0"/> + <line number="1483" hits="0"/> + <line number="1484" hits="0"/> + <line number="1485" hits="0"/> + <line number="1487" hits="0"/> + <line number="1489" hits="1"/> + <line number="1500" hits="0"/> + <line number="1501" hits="0"/> + <line number="1502" hits="0"/> + <line number="1503" hits="0"/> + <line number="1504" hits="0"/> + <line number="1505" hits="0"/> + <line number="1507" hits="0"/> + <line number="1508" hits="0"/> + <line number="1510" hits="1"/> + <line number="1521" hits="0"/> + <line number="1522" hits="0"/> + <line number="1523" hits="0"/> + <line number="1524" hits="0"/> + <line number="1525" hits="0"/> + <line number="1526" hits="0"/> + <line number="1528" hits="0"/> + <line number="1529" hits="0"/> + <line number="1531" hits="1"/> + <line number="1542" hits="0"/> + <line number="1543" hits="0"/> + <line number="1544" hits="0"/> + <line number="1546" hits="0"/> + <line number="1548" hits="0"/> + <line number="1550" hits="1"/> + <line number="1557" hits="0"/> + <line number="1558" hits="0"/> + <line number="1559" hits="0"/> + <line number="1564" hits="1"/> + <line number="1576" hits="0"/> + <line number="1577" hits="0"/> + <line number="1578" hits="0"/> + <line number="1580" hits="0"/> + <line number="1581" hits="0"/> + <line number="1582" hits="0"/> + <line number="1584" hits="0"/> + <line number="1586" hits="1"/> + <line number="1592" hits="1"/> + <line number="1598" hits="1"/> + <line number="1604" hits="0"/> + <line number="1605" hits="0"/> + <line number="1607" hits="1"/> + <line number="1613" hits="0"/> + <line number="1614" hits="0"/> + <line number="1616" hits="1"/> + <line number="1622" hits="0"/> + <line number="1626" hits="0"/> + <line number="1628" hits="1"/> + <line number="1650" hits="0"/> + <line number="1651" hits="0"/> + <line number="1653" hits="0"/> + <line number="1655" hits="0"/> + <line number="1657" hits="0"/> + <line number="1658" hits="0"/> + <line number="1659" hits="0"/> + <line number="1660" hits="0"/> + <line number="1661" hits="0"/> + <line number="1662" hits="0"/> + <line number="1663" hits="0"/> + <line number="1664" hits="0"/> + <line number="1665" hits="0"/> + <line number="1666" hits="0"/> + <line number="1674" hits="0"/> + <line number="1675" hits="0"/> + <line number="1676" hits="0"/> + <line number="1677" hits="0"/> + <line number="1679" hits="0"/> + <line number="1680" hits="0"/> + <line number="1682" hits="0"/> + <line number="1683" hits="0"/> + <line number="1685" hits="0"/> + <line number="1690" hits="0"/> + <line number="1692" hits="0"/> + <line number="1694" hits="0"/> + <line number="1695" hits="0"/> + <line number="1696" hits="0"/> + <line number="1698" hits="0"/> + <line number="1700" hits="0"/> + <line number="1702" hits="0"/> + <line number="1704" hits="1"/> + <line number="1716" hits="0"/> + <line number="1717" hits="0"/> + <line number="1718" hits="0"/> + <line number="1719" hits="0"/> + <line number="1721" hits="0"/> + <line number="1722" hits="0"/> + <line number="1724" hits="1"/> + <line number="1736" hits="0"/> + <line number="1737" hits="0"/> + <line number="1739" hits="0"/> + <line number="1740" hits="0"/> + <line number="1741" hits="0"/> + <line number="1742" hits="0"/> + <line number="1743" hits="0"/> + <line number="1745" hits="1"/> + <line number="1751" hits="1"/> + <line number="1754" hits="1"/> + <line number="1768" hits="0"/> + <line number="1769" hits="0"/> + <line number="1770" hits="0"/> + <line number="1772" hits="0"/> + <line number="1773" hits="0"/> + <line number="1774" hits="0"/> + <line number="1782" hits="0"/> + <line number="1786" hits="0"/> + </lines> + </class> + <class name="hybrid.py" filename="routers/hybrid.py" complexity="0" line-rate="0.3957" branch-rate="0"> + <methods/> + <lines> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="6" hits="1"/> + <line number="8" hits="1"/> + <line number="14" hits="1"/> + <line number="15" hits="1"/> + <line number="16" hits="1"/> + <line number="17" hits="1"/> + <line number="18" hits="1"/> + <line number="19" hits="1"/> + <line number="22" hits="1"/> + <line number="26" hits="1"/> + <line number="27" hits="1"/> + <line number="28" hits="1"/> + <line number="29" hits="1"/> + <line number="30" hits="1"/> + <line number="32" hits="1"/> + <line number="35" hits="1"/> + <line number="39" hits="1"/> + <line number="40" hits="1"/> + <line number="42" hits="1"/> + <line number="61" hits="1"/> + <line number="62" hits="0"/> + <line number="63" hits="0"/> + <line number="64" hits="1"/> + <line number="66" hits="1"/> + <line number="68" hits="1"/> + <line number="76" hits="1"/> + <line number="77" hits="1"/> + <line number="88" hits="1"/> + <line number="90" hits="1"/> + <line number="97" hits="1"/> + <line number="98" hits="1"/> + <line number="99" hits="1"/> + <line number="100" hits="0"/> + <line number="105" hits="1"/> + <line number="106" hits="1"/> + <line number="113" hits="0"/> + <line number="114" hits="0"/> + <line number="116" hits="0"/> + <line number="117" hits="0"/> + <line number="118" hits="0"/> + <line number="120" hits="0"/> + <line number="121" hits="0"/> + <line number="122" hits="0"/> + <line number="124" hits="0"/> + <line number="129" hits="0"/> + <line number="132" hits="0"/> + <line number="141" hits="0"/> + <line number="142" hits="0"/> + <line number="143" hits="0"/> + <line number="145" hits="0"/> + <line number="151" hits="1"/> + <line number="152" hits="1"/> + <line number="159" hits="1"/> + <line number="160" hits="0"/> + <line number="161" hits="0"/> + <line number="162" hits="0"/> + <line number="164" hits="0"/> + <line number="165" hits="1"/> + <line number="166" hits="1"/> + <line number="167" hits="1"/> + <line number="170" hits="1"/> + <line number="181" hits="1"/> + <line number="182" hits="0"/> + <line number="183" hits="1"/> + <line number="184" hits="0"/> + <line number="186" hits="1"/> + <line number="188" hits="1"/> + <line number="196" hits="1"/> + <line number="197" hits="0"/> + <line number="198" hits="0"/> + <line number="200" hits="1"/> + <line number="201" hits="1"/> + <line number="203" hits="1"/> + <line number="213" hits="1"/> + <line number="214" hits="1"/> + <line number="215" hits="1"/> + <line number="217" hits="1"/> + <line number="218" hits="1"/> + <line number="220" hits="1"/> + <line number="232" hits="1"/> + <line number="233" hits="0"/> + <line number="236" hits="1"/> + <line number="239" hits="1"/> + <line number="242" hits="1"/> + <line number="243" hits="1"/> + <line number="245" hits="1"/> + <line number="256" hits="0"/> + <line number="257" hits="0"/> + <line number="261" hits="0"/> + <line number="262" hits="0"/> <line number="263" hits="0"/> - <line number="264" hits="0"/> <line number="265" hits="0"/> - <line number="273" hits="0"/> - <line number="274" hits="0"/> - <line number="278" hits="0"/> - <line number="280" hits="0"/> - <line number="281" hits="0"/> - <line number="284" hits="0"/> - <line number="285" hits="0"/> + <line number="267" hits="0"/> + <line number="268" hits="0"/> + <line number="270" hits="1"/> + <line number="291" hits="0"/> + <line number="292" hits="0"/> <line number="293" hits="0"/> <line number="294" hits="0"/> + <line number="295" hits="0"/> + <line number="297" hits="0"/> + <line number="298" hits="0"/> + <line number="299" hits="0"/> <line number="300" hits="0"/> - <line number="301" hits="0"/> <line number="304" hits="0"/> <line number="305" hits="0"/> + <line number="306" hits="0"/> + <line number="307" hits="0"/> <line number="308" hits="0"/> - <line number="313" hits="0"/> + <line number="311" hits="0"/> + <line number="312" hits="0"/> <line number="314" hits="0"/> - <line number="317" hits="0"/> - <line number="318" hits="0"/> - <line number="319" hits="0"/> - <line number="322" hits="0"/> - <line number="326" hits="0"/> - <line number="337" hits="0"/> - <line number="339" hits="0"/> - <line number="345" hits="0"/> - <line number="346" hits="0"/> - <line number="347" hits="0"/> - <line number="348" hits="0"/> - <line number="352" hits="0"/> - <line number="354" hits="0"/> - <line number="357" hits="0"/> - <line number="358" hits="0"/> - <line number="359" hits="0"/> - <line number="365" hits="0"/> - <line number="373" hits="0"/> - <line number="374" hits="0"/> - <line number="382" hits="0"/> + <line number="320" hits="0"/> + <line number="325" hits="0"/> + <line number="328" hits="0"/> + <line number="329" hits="0"/> + <line number="330" hits="0"/> + <line number="332" hits="0"/> + <line number="334" hits="1"/> + <line number="345" hits="1"/> + <line number="347" hits="1"/> + <line number="348" hits="1"/> + <line number="349" hits="1"/> + <line number="350" hits="1"/> + <line number="355" hits="1"/> + <line number="357" hits="1"/> + <line number="378" hits="0"/> + <line number="379" hits="0"/> + <line number="380" hits="0"/> + <line number="381" hits="0"/> <line number="383" hits="0"/> - <line number="384" hits="0"/> + <line number="385" hits="0"/> + <line number="387" hits="0"/> + <line number="388" hits="0"/> + <line number="389" hits="0"/> <line number="390" hits="0"/> + <line number="391" hits="0"/> + <line number="392" hits="0"/> <line number="393" hits="0"/> <line number="394" hits="0"/> <line number="395" hits="0"/> <line number="396" hits="0"/> <line number="397" hits="0"/> - <line number="398" hits="0"/> - <line number="399" hits="0"/> - <line number="400" hits="0"/> - <line number="403" hits="0"/> - <line number="404" hits="0"/> - <line number="405" hits="0"/> <line number="406" hits="0"/> - <line number="410" hits="0"/> - <line number="411" hits="0"/> + <line number="407" hits="0"/> + <line number="408" hits="0"/> + <line number="409" hits="0"/> + <line number="412" hits="0"/> <line number="413" hits="0"/> + <line number="414" hits="0"/> <line number="416" hits="0"/> <line number="417" hits="0"/> - <line number="418" hits="0"/> <line number="419" hits="0"/> <line number="420" hits="0"/> - <line number="421" hits="0"/> - <line number="428" hits="0"/> + <line number="422" hits="0"/> + <line number="427" hits="0"/> <line number="429" hits="0"/> - <line number="430" hits="0"/> + <line number="431" hits="0"/> <line number="432" hits="0"/> <line number="433" hits="0"/> - <line number="436" hits="0"/> - <line number="441" hits="0"/> - <line number="443" hits="0"/> - <line number="444" hits="0"/> - <line number="445" hits="0"/> - <line number="446" hits="0"/> - <line number="447" hits="0"/> - <line number="448" hits="0"/> - <line number="449" hits="0"/> - <line number="450" hits="0"/> - <line number="452" hits="0"/> + <line number="435" hits="0"/> + <line number="437" hits="0"/> + <line number="439" hits="0"/> + <line number="441" hits="1"/> <line number="453" hits="0"/> <line number="454" hits="0"/> + <line number="455" hits="0"/> + <line number="456" hits="0"/> + <line number="457" hits="0"/> + <line number="458" hits="0"/> + <line number="459" hits="0"/> + <line number="460" hits="0"/> + <line number="461" hits="0"/> + <line number="463" hits="0"/> + <line number="464" hits="0"/> + <line number="466" hits="1"/> + <line number="483" hits="0"/> + <line number="484" hits="0"/> + <line number="486" hits="0"/> + <line number="487" hits="0"/> + <line number="488" hits="0"/> + <line number="489" hits="0"/> + <line number="490" hits="0"/> </lines> </class> - <class name="utils.py" filename="splitters/utils.py" complexity="0" line-rate="0" branch-rate="0"> + <class name="semantic.py" filename="routers/semantic.py" complexity="0" line-rate="0.4848" branch-rate="0"> <methods/> <lines> - <line number="1" hits="0"/> - <line number="2" hits="0"/> - <line number="5" hits="0"/> - <line number="22" hits="0"/> - <line number="55" hits="0"/> - <line number="56" hits="0"/> - <line number="57" hits="0"/> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="5" hits="1"/> + <line number="6" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="9" hits="1"/> + <line number="10" hits="1"/> + <line number="13" hits="1"/> + <line number="16" hits="1"/> + <line number="26" hits="1"/> + <line number="27" hits="1"/> + <line number="28" hits="1"/> + <line number="38" hits="1"/> + <line number="47" hits="0"/> + <line number="48" hits="0"/> + <line number="50" hits="1"/> + <line number="59" hits="0"/> <line number="60" hits="0"/> - <line number="61" hits="0"/> - <line number="62" hits="0"/> - <line number="63" hits="0"/> + <line number="62" hits="1"/> + <line number="68" hits="0"/> + <line number="69" hits="0"/> + <line number="70" hits="0"/> + <line number="72" hits="0"/> + <line number="73" hits="0"/> + <line number="74" hits="0"/> + <line number="76" hits="0"/> + <line number="79" hits="0"/> + <line number="80" hits="0"/> + <line number="88" hits="0"/> + <line number="89" hits="0"/> + <line number="90" hits="0"/> + <line number="92" hits="0"/> </lines> </class> </classes> </package> - <package name="utils" line-rate="0.5342" branch-rate="0" complexity="0"> + <package name="utils" line-rate="0.6371" branch-rate="0" complexity="0"> <classes> <class name="__init__.py" filename="utils/__init__.py" complexity="0" line-rate="1" branch-rate="0"> <methods/> @@ -2553,15 +4238,16 @@ <line number="1" hits="1"/> <line number="2" hits="1"/> <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="10" hits="1"/> - <line number="14" hits="1"/> - <line number="18" hits="1"/> - <line number="22" hits="1"/> - <line number="29" hits="1"/> + <line number="8" hits="1"/> + <line number="12" hits="1"/> + <line number="16" hits="1"/> + <line number="20" hits="1"/> + <line number="24" hits="1"/> + <line number="31" hits="1"/> + <line number="36" hits="1"/> </lines> </class> - <class name="function_call.py" filename="utils/function_call.py" complexity="0" line-rate="0.3667" branch-rate="0"> + <class name="function_call.py" filename="utils/function_call.py" complexity="0" line-rate="0.6211" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> @@ -2571,73 +4257,118 @@ <line number="7" hits="1"/> <line number="8" hits="1"/> <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="0"/> - <line number="14" hits="0"/> - <line number="15" hits="0"/> - <line number="16" hits="0"/> - <line number="18" hits="0"/> - <line number="19" hits="0"/> - <line number="20" hits="0"/> - <line number="24" hits="0"/> - <line number="26" hits="0"/> - <line number="27" hits="0"/> - <line number="28" hits="0"/> + <line number="26" hits="1"/> + <line number="27" hits="1"/> + <line number="29" hits="1"/> + <line number="30" hits="1"/> + <line number="33" hits="1"/> <line number="34" hits="1"/> - <line number="40" hits="1"/> - <line number="44" hits="1"/> - <line number="47" hits="0"/> - <line number="49" hits="0"/> - <line number="50" hits="0"/> - <line number="51" hits="0"/> - <line number="52" hits="0"/> - <line number="54" hits="0"/> - <line number="55" hits="0"/> - <line number="56" hits="0"/> - </lines> - </class> - <class name="llm.py" filename="utils/llm.py" complexity="0" line-rate="0" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="0"/> - <line number="2" hits="0"/> - <line number="4" hits="0"/> - <line number="6" hits="0"/> - <line number="9" hits="0"/> - <line number="10" hits="0"/> - <line number="11" hits="0"/> - <line number="16" hits="0"/> - <line number="28" hits="0"/> - <line number="30" hits="0"/> - <line number="31" hits="0"/> - <line number="32" hits="0"/> - <line number="33" hits="0"/> - <line number="34" hits="0"/> - <line number="35" hits="0"/> + <line number="35" hits="1"/> + <line number="37" hits="1"/> + <line number="43" hits="0"/> + <line number="51" hits="1"/> + <line number="56" hits="1"/> + <line number="57" hits="1"/> + <line number="58" hits="1"/> + <line number="59" hits="1"/> + <line number="60" hits="1"/> + <line number="62" hits="1"/> + <line number="68" hits="1"/> + <line number="69" hits="1"/> + <line number="70" hits="1"/> + <line number="71" hits="0"/> + <line number="72" hits="0"/> + <line number="74" hits="0"/> + <line number="76" hits="1"/> + <line number="82" hits="1"/> + <line number="83" hits="1"/> + <line number="84" hits="1"/> + <line number="85" hits="1"/> + <line number="86" hits="1"/> + <line number="87" hits="1"/> + <line number="88" hits="1"/> + <line number="96" hits="1"/> + <line number="98" hits="1"/> + <line number="104" hits="1"/> + <line number="128" hits="1"/> + <line number="130" hits="1"/> + <line number="138" hits="1"/> + <line number="139" hits="0"/> + <line number="140" hits="1"/> + <line number="141" hits="0"/> + <line number="142" hits="1"/> + <line number="143" hits="1"/> + <line number="144" hits="0"/> + <line number="145" hits="0"/> + <line number="147" hits="0"/> + <line number="150" hits="1"/> + <line number="158" hits="1"/> + <line number="159" hits="1"/> + <line number="160" hits="1"/> + <line number="161" hits="1"/> + <line number="162" hits="1"/> + <line number="165" hits="1"/> + <line number="173" hits="1"/> + <line number="174" hits="0"/> + <line number="175" hits="0"/> + <line number="176" hits="0"/> + <line number="177" hits="0"/> + <line number="179" hits="0"/> + <line number="180" hits="0"/> + <line number="181" hits="0"/> + <line number="185" hits="0"/> + <line number="187" hits="0"/> + <line number="188" hits="0"/> + <line number="189" hits="0"/> + <line number="195" hits="1"/> + <line number="201" hits="1"/> + <line number="204" hits="1"/> + <line number="212" hits="1"/> + <line number="213" hits="1"/> + <line number="214" hits="1"/> + <line number="215" hits="0"/> + <line number="216" hits="1"/> + <line number="217" hits="1"/> + <line number="218" hits="0"/> + <line number="219" hits="0"/> + <line number="220" hits="0"/> + <line number="221" hits="0"/> + <line number="222" hits="0"/> + <line number="223" hits="0"/> + <line number="225" hits="0"/> + <line number="229" hits="1"/> + <line number="245" hits="0"/> + <line number="247" hits="0"/> + <line number="248" hits="0"/> + <line number="249" hits="0"/> + <line number="250" hits="0"/> + <line number="252" hits="0"/> + <line number="253" hits="0"/> + <line number="254" hits="0"/> </lines> </class> - <class name="logger.py" filename="utils/logger.py" complexity="0" line-rate="1" branch-rate="0"> + <class name="logger.py" filename="utils/logger.py" complexity="0" line-rate="0.5263" branch-rate="0"> <methods/> <lines> <line number="1" hits="1"/> <line number="3" hits="1"/> <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> + <line number="9" hits="1"/> + <line number="10" hits="0"/> <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="35" hits="1"/> - <line number="37" hits="1"/> + <line number="27" hits="0"/> + <line number="28" hits="0"/> + <line number="29" hits="0"/> + <line number="30" hits="0"/> + <line number="31" hits="0"/> + <line number="34" hits="1"/> + <line number="36" hits="1"/> <line number="38" hits="1"/> - <line number="40" hits="1"/> + <line number="39" hits="0"/> + <line number="40" hits="0"/> + <line number="41" hits="0"/> <line number="43" hits="1"/> + <line number="46" hits="1"/> </lines> </class> </classes> diff --git a/pyproject.toml b/pyproject.toml index 1e647a6205d510f89c51a887e52c9d4a9905b799..ccec0457191b2ad58dee5b03e8deb63be9ecebb1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,6 @@ dependencies = [ ] [project.optional-dependencies] -hybrid = ["pinecone-text>=0.7.1"] local = [ "torch>=2.1.0,<2.6.0 ; python_version < '3.13'", "transformers>=4.36.2 ; python_version < '3.13'", @@ -51,7 +50,6 @@ docs = ["pydoc-markdown>=4.8.2 ; python_version < '3.12'"] cohere = ["cohere>=5.9.4,<6.00"] all = [ "semantic-router[local]", - "semantic-router[hybrid]", "semantic-router[pinecone]", "semantic-router[vision]", "semantic-router[mistralai]", diff --git a/semantic_router/encoders/aurelio.py b/semantic_router/encoders/aurelio.py index 5f39a4728aff3841a5f49491c580a18d4f3d1b55..2859289b016b88440466e2ee679fede4b183c8b6 100644 --- a/semantic_router/encoders/aurelio.py +++ b/semantic_router/encoders/aurelio.py @@ -45,13 +45,34 @@ class AurelioSparseEncoder(SparseEncoder): def __call__(self, docs: list[str]) -> list[SparseEmbedding]: """Encode a list of documents using the Aurelio Platform embedding API. Documents must be strings, sparse encoders do not support other types. - - :param docs: The documents to encode. - :type docs: list[str] - :return: The encoded documents. - :rtype: list[SparseEmbedding] """ - res: EmbeddingResponse = self.client.embedding(input=docs, model=self.name) + return self.encode_queries(docs) + + def encode_queries(self, docs: List[str]) -> List[SparseEmbedding]: + res: EmbeddingResponse = self.client.embedding( + input=docs, model=self.name, input_type="queries" + ) + embeds = [SparseEmbedding.from_aurelio(r.embedding) for r in res.data] + return embeds + + def encode_documents(self, docs: List[str]) -> List[SparseEmbedding]: + res: EmbeddingResponse = self.client.embedding( + input=docs, model=self.name, input_type="documents" + ) + embeds = [SparseEmbedding.from_aurelio(r.embedding) for r in res.data] + return embeds + + async def aencode_queries(self, docs: List[str]) -> list[SparseEmbedding]: + res: EmbeddingResponse = await self.async_client.embedding( + input=docs, model=self.name, input_type="queries" + ) + embeds = [SparseEmbedding.from_aurelio(r.embedding) for r in res.data] + return embeds + + async def aencode_documents(self, docs: List[str]) -> list[SparseEmbedding]: + res: EmbeddingResponse = await self.async_client.embedding( + input=docs, model=self.name, input_type="documents" + ) embeds = [SparseEmbedding.from_aurelio(r.embedding) for r in res.data] return embeds @@ -65,11 +86,7 @@ class AurelioSparseEncoder(SparseEncoder): :return: The encoded documents. :rtype: list[SparseEmbedding] """ - res: EmbeddingResponse = await self.async_client.embedding( - input=docs, model=self.name - ) - embeds = [SparseEmbedding.from_aurelio(r.embedding) for r in res.data] - return embeds + return await self.aencode_queries(docs) def fit(self, docs: List[str]): """Fit the encoder to a list of documents. AurelioSparseEncoder does not support diff --git a/semantic_router/encoders/base.py b/semantic_router/encoders/base.py index 2442a9aeab34587a06a0cbb29a06c84c226f6817..a9b460aded5929fc25ec20c616bbf6de5870b265 100644 --- a/semantic_router/encoders/base.py +++ b/semantic_router/encoders/base.py @@ -3,6 +3,7 @@ from typing import Any, Coroutine, List, Optional import numpy as np from pydantic import BaseModel, Field, field_validator +from semantic_router.route import Route from semantic_router.schema import SparseEmbedding @@ -60,25 +61,31 @@ class SparseEncoder(BaseModel): arbitrary_types_allowed = True def __call__(self, docs: List[str]) -> List[SparseEmbedding]: - """Encode a list of documents. Documents must be strings, sparse encoders do not - support other types. + """Sparsely encode a list of documents. Documents can be any type, but the encoder must + be built to handle that data type. Typically, these types are strings or + arrays representing images. :param docs: The documents to encode. - :type docs: List[str] + :type docs: List[Any] :return: The encoded documents. :rtype: List[SparseEmbedding] """ raise NotImplementedError("Subclasses must implement this method") - async def acall(self, docs: List[str]) -> list[SparseEmbedding]: - """Encode a list of documents. Documents must be strings, sparse encoders do not - support other types. + def encode_queries(self, docs: List[str]) -> List[SparseEmbedding]: + """Convert query texts to sparse embeddings optimized for querying""" + raise NotImplementedError("Subclasses must implement this method") - :param docs: The documents to encode. - :type docs: List[str] - :return: The encoded documents. - :rtype: List[SparseEmbedding] - """ + def encode_documents(self, docs: List[str]) -> List[SparseEmbedding]: + """Convert document texts to sparse embeddings optimized for storage""" + raise NotImplementedError("Subclasses must implement this method") + + async def aencode_queries(self, docs: List[str]) -> list[SparseEmbedding]: + """Async version of encode_queries""" + raise NotImplementedError("Subclasses must implement this method") + + async def aencode_documents(self, docs: List[str]) -> list[SparseEmbedding]: + """Async version of encode_documents""" raise NotImplementedError("Subclasses must implement this method") def _array_to_sparse_embeddings( @@ -96,8 +103,16 @@ class SparseEncoder(BaseModel): raise ValueError(f"Expected a 2D array, got a {sparse_arrays.ndim}D array.") # get coordinates of non-zero values coords = np.nonzero(sparse_arrays) + if coords[0].size == 0: + # Sparse Embeddings can be all zero, if query tokens do not appear in corpus at all + return [SparseEmbedding(embedding=np.empty((1, 2)))] # create compact array compact_array = np.array([coords[0], coords[1], sparse_arrays[coords]]).T arr_range = range(compact_array[:, 0].max().astype(int) + 1) arrs = [compact_array[compact_array[:, 0] == i, :][:, 1:3] for i in arr_range] return [SparseEmbedding.from_compact_array(arr) for arr in arrs] + + +class FittableMixin: + def fit(self, routes: list[Route]): + pass diff --git a/semantic_router/encoders/bm25.py b/semantic_router/encoders/bm25.py index 6c180179f63640734d279b3e1c387362f879a04c..5377e2e78d49b1e914536bdcbbe3eeb24ec2040a 100644 --- a/semantic_router/encoders/bm25.py +++ b/semantic_router/encoders/bm25.py @@ -1,73 +1,273 @@ -from typing import Any, Dict, List, Optional +from functools import partial +from typing import List -from semantic_router.encoders.tfidf import TfidfEncoder +import numpy as np + +from semantic_router.encoders.base import FittableMixin, SparseEncoder from semantic_router.route import Route from semantic_router.schema import SparseEmbedding +from semantic_router.tokenizers import BaseTokenizer, PretrainedTokenizer from semantic_router.utils.logger import logger -class BM25Encoder(TfidfEncoder): - model: Optional[Any] = None - idx_mapping: Optional[Dict[int, int]] = None +class BM25Encoder(SparseEncoder, FittableMixin): + """BM25Encoder, running a vectorized version of ATIRE BM25 algorithm + + Concept: + - BM25 uses scoring between queries & corpus to retrieve the most relevant documents ∈ corpus + - most vector databases (VDB) store embedded documents and score them versus received queries for retrieval + - we need to break up the BM25 formula into `encode_queries` and `encode_documents`, with the latter to be stored in VDB + - dot product of `encode_queries(q)` and `encode_documents([D_0, D_1, ...])` is the BM25 score of the documents `[D_0, D_1, ...]` for the given query `q` + - we train a BM25 encoder's normalization parameters on a sufficiently large corpus to capture target language distribution + - these trained parameter allow us to balance TF & IDF of query & documents for retrieval (read more on how BM25 fixes issues with TF-IDF) + + ATIRE Paper: https://www.cs.otago.ac.nz/research/student-publications/atire-opensource.pdf + Pinecone Implementation: https://github.com/pinecone-io/pinecone-text/blob/8399f9ff28c4652766c35165c0db9b0eff309077/pinecone_text/sparse/bm25_encoder.py + + :param k1: normalizer parameter that limits how much a single query term `q_i ∈ q` can affect score for document `D_n` + :type k1: float + :param b: normalizer parameter that balances the effect of a single document length compared to the average document length + :type b: float + :param corpus_size: number of documents in the trained corpus + :type corpus_size: int, optional + :param _avg_doc_len: float representing the average document length in the trained corpus + :type _avg_doc_len: float, optional + :param _documents_containing_word: (1, tokenizer.vocab_size) shaped array, denoting how many documents contain `token ∈ vocab` + :type _documents_containing_word: class:`numpy.ndarray`, optional + + """ + type: str = "sparse" + k1: float = 1.5 + b: float = 0.75 + corpus_size: int | None = None + _tokenizer: BaseTokenizer | None + _avg_doc_len: np.float64 | float | None + _documents_containing_word: np.ndarray | None def __init__( self, + tokenizer: BaseTokenizer | None = None, name: str | None = None, + k1: float = 1.5, + b: float = 0.75, + corpus_size: int | None = None, + avg_doc_len: float | None = None, use_default_params: bool = True, - ): + ) -> None: if name is None: name = "bm25" super().__init__(name=name) - try: - from pinecone_text.sparse import BM25Encoder as encoder - except ImportError: - raise ImportError( - "Please install pinecone-text to use BM25Encoder. " - "You can install it with: `pip install 'semantic-router[hybrid]'`" - ) - self.model = encoder() - - if use_default_params: - logger.info("Downloading and initializing default sBM25 model parameters.") - self.model = encoder.default() - self._set_idx_mapping() - - def _set_idx_mapping(self): - # TODO JB: this is training the model somehow - not sure how... - params = self.model.get_params() - doc_freq = params["doc_freq"] - if isinstance(doc_freq, dict): - indices = doc_freq["indices"] - self.idx_mapping = {int(idx): i for i, idx in enumerate(indices)} + self.k1 = k1 + self.b = b + self.corpus_size = corpus_size + self._avg_doc_len = np.float64(avg_doc_len) if avg_doc_len else None + if use_default_params and not tokenizer: + logger.info("Initializing default BM25 model parameters.") + self._tokenizer = PretrainedTokenizer("bert-base-uncased") + elif tokenizer is not None: + self._tokenizer = tokenizer else: - raise TypeError("Expected a dictionary for 'doc_freq'") + raise ValueError( + "Tokenizer not provided. Provide a tokenizer or set `use_default_params` to True" + ) + + def _fit_validate(self, routes: List[Route]): + if not isinstance(routes, list) or not isinstance(routes[0], Route): + raise TypeError("`routes` parameter must be a list of Route objects.") - def fit(self, routes: List[Route]): + def fit(self, routes: List[Route]) -> "BM25Encoder": """Trains the encoder weights on the provided routes. :param routes: List of routes to train the encoder on. :type routes: List[Route] """ - self._fit_validate(routes=routes) - if self.model is None: - raise ValueError("Model is not initialized.") + if not self._tokenizer: + raise ValueError( + "BM25 encoder not initialized. Provide a tokenizer or set `use_default_params` to True" + ) + self._fit_validate(routes) utterances = [utterance for route in routes for utterance in route.utterances] - self.model.fit(corpus=utterances) + utterance_ids = self._tokenizer.tokenize(utterances, pad=True) + corpus = self._tf(utterance_ids) - def __call__(self, docs: List[str]) -> list[SparseEmbedding]: - if self.model is None: - raise ValueError("Model or index mapping is not initialized.") - if len(docs) == 1: - sparse_dicts = self.model.encode_queries(docs) - elif len(docs) > 1: - sparse_dicts = self.model.encode_documents(docs) - else: - raise ValueError("No documents to encode.") + self.corpus_size = len(utterances) - embeds = [] - for i, output in enumerate(sparse_dicts): - if isinstance(output, dict): - embeds.append(SparseEmbedding.from_pinecone_dict(output)) - return embeds + # Calculate document lengths and average + doc_lengths = corpus.sum(axis=1) + self._avg_doc_len = doc_lengths.mean() + + # Calculate document frequencies + documents_containing_word = np.atleast_2d((corpus > 0).sum(axis=0)) + + documents_containing_word[:, 0] *= 0 + self._documents_containing_word = documents_containing_word + + return self + + def _tf(self, docs: np.ndarray) -> np.ndarray: + """Returns term frequency of query terms in trained corpus + + :param docs: 2D shaped array of each document's token ids + :type docs: :class:`numpy.ndarray` + :return: Matrix where value @ (m, n) represents how many times token id `n` appears in document `m` + :rtype: :class:`numpy.ndarray` + """ + if self._tokenizer is None: + raise ValueError( + "Tokenizer not provided. Provide a tokenizer or set `use_default_params` to True" + ) + vocab_size = self._tokenizer.vocab_size + # `np.bincount` doesn't return a consistent shape, we need to ensure minlength + bincount = partial(np.bincount, minlength=vocab_size) + # Bincount returns element count + # e.g. [0, 1, 1, 3, 1] => [1, 3, 0, 1] + tf = np.apply_along_axis(bincount, 1, docs) + + # only change the values of existing non-zero terms, so that the operation doesn't change the sparsity of the matrix, and we don't get a warning that our operation is expensive + # We use `0` as a padding, so ignore it's term frequency + tf[:, 0] *= 0 # type: ignore + return tf + + def _df(self, queries: np.ndarray) -> np.ndarray: + """Returns the amount of times each token in the query appears in trained corpus + + This is done in a faster, vectorized way, instead of looping through each query + + :param queries: 2D shaped array of each query token ids + :type queries: :class:`numpy.ndarray` + :return: Matrix where value @ (m, n) represents how many times token id `n` in query `m` appears in the trained corpus + :rtype: :class:`numpy.ndarray` + """ + if self._documents_containing_word is None: + raise ValueError( + "Encoder not fitted. `BM25Encoder.fit` a corpus, or `BM25Encoder.load` a pretrained encoder." + ) + if self._tokenizer is None: + raise ValueError( + "Tokenizer not provided. Provide a tokenizer or set `use_default_params` to True" + ) + n = queries.shape[0] + # Create row indices -> [[0], [1], [2], ...] (n, 1) shaped matrix + row_indices = np.arange(n)[:, None] + + # Create a (len(queries), vocab_size) mask + mask = np.zeros( + (n, self._tokenizer.vocab_size), dtype=bool + ) # (n_queries, vocab_size) + # Fill the mask with `True` only for the token ids that appear in each query + mask[row_indices, queries] = True + + # Repeat the `(1, vocab_size)` shaped _documents_containing_word matrix `len(queries)` times -> (len(queries), vocab_size) shape + # Multiply the repeated matrix with the mask to result in the document frequency of each token in each query + query_df = mask * self._documents_containing_word + return query_df + + def encode_queries(self, queries: list[str]) -> list[SparseEmbedding]: + """Returns BM25 scores for queries using precomputed corpus scores. + + :param queries: List of queries to encode + :type queries: list + :return: BM25 scores for each query against the corpus + :rtype: np.ndarray + """ + if ( + self.corpus_size is None + or self._avg_doc_len is None + or self._documents_containing_word is None + ): + raise ValueError( + "Encoder not fitted. Please `.fit` the model on a provided corpus or load a pretrained encoder" + ) + if not self._tokenizer: + raise ValueError( + "BM25 encoder not initialized. Provide a tokenizer or set `use_default_params` to True" + ) + if queries == []: + raise ValueError("No documents provided for encoding") + + # Convert queries to token counts + queries_ids = self._tokenizer.tokenize(queries) + df = self._df(queries_ids) # (batch_size, vocab_size) + N = self.corpus_size + df = df + np.where(df > 0, 0.5, 0) + idf = np.divide(N + 1, df, out=np.zeros_like(df), where=df != 0) + idf = np.log( + idf, out=np.zeros_like(df), where=df != 0 + ) # (batch_size, vocab_size) + idf_norm = np.divide( + idf, idf.sum(axis=1)[:, np.newaxis], out=np.zeros_like(idf), where=idf != 0 + ) + + return self._array_to_sparse_embeddings(idf_norm) + + def encode_documents( + self, + documents: list[str], + batch_size: int | None = None, + ) -> list[SparseEmbedding]: + r"""Returns document term frequency normed by itself & average trained corpus length + (This is the right-hand side of the BM25 equation, which gets matmul-ed with the query IDF component) + + LaTeX: \frac{f(d_i, D)}{f(d_i, D) + k_1 \times (1 - b + b \times \frac{|D|}{avgdl})} + where: + f(d_i, D) is frequency of term `d_i ∈ D` + |D| is the document length + avgdl is average document length in trained corpus + + :param documents: List of queries to encode + :type documents: list + :return: Encoded queries (as either sparse or dict) + :rtype: :class:`scipy.sparse.csr_matrix`, list[dict] + """ + if ( + self.corpus_size is None + or self._avg_doc_len is None + or self._documents_containing_word is None + ): + raise ValueError( + "Encoder not fitted. Please `.fit` the model on a provided corpus or load a pretrained encoder" + ) + if not self._tokenizer: + raise ValueError( + "BM25 encoder not initialized. Provide a tokenizer or set `use_default_params` to True" + ) + if documents == []: + raise ValueError("No documents provided for encoding") + batch_size = batch_size or len(documents) + queries_ids = self._tokenizer.tokenize(documents, pad=True) + tf = self._tf(queries_ids) # (batch_size, vocab_size) + tf_sum = tf.sum(axis=1) # (batch_size, 1) + tf_normed = tf / ( + self.k1 + * (1.0 - self.b * self.b * (tf_sum[:, np.newaxis] / self._avg_doc_len)) + + tf + ) # (batch_size, vocab_size) + + return self._array_to_sparse_embeddings(tf_normed) + + def model(self, docs: List[str]) -> list[SparseEmbedding]: + """Encode documents using BM25, with different encoding for queries vs documents to be indexed. + + :param docs: List of documents to encode + :param is_query: If True, use query encoding, else use document encoding + :return: List of sparse embeddings + """ + if not self._tokenizer: + raise ValueError( + "Encoder not fitted. `BM25.index` a corpus, or `BM25.load` a pretrained encoder." + ) + if ( + self.corpus_size is None + or self._avg_doc_len is None + or self._documents_containing_word is None + ): + raise ValueError( + "Encoder not fitted. Please `.fit` the model on a provided corpus or load a pretrained encoder" + ) + + return self.encode_queries(docs) + + def __call__(self, docs: List[str]) -> list[SparseEmbedding]: + return self.encode_queries(docs) diff --git a/semantic_router/encoders/huggingface.py b/semantic_router/encoders/huggingface.py index a62102e5f72960d8c6e3f141eb43f01c48689577..3cd973b3a64a08da1a68780e9f042e6f9f8313cb 100644 --- a/semantic_router/encoders/huggingface.py +++ b/semantic_router/encoders/huggingface.py @@ -1,9 +1,9 @@ """ This module provides the HFEndpointEncoder class to embeddings models using Huggingface's endpoint. -The HFEndpointEncoder class is a subclass of DenseEncoder and utilizes a specified Huggingface -endpoint to generate embeddings for given documents. It requires the URL of the Huggingface -API endpoint and an API key for authentication. The class supports customization of the score +The HFEndpointEncoder class is a subclass of DenseEncoder and utilizes a specified Huggingface +endpoint to generate embeddings for given documents. It requires the URL of the Huggingface +API endpoint and an API key for authentication. The class supports customization of the score threshold for filtering or processing the embeddings. Example usage: @@ -71,7 +71,7 @@ class HuggingFaceEncoder(DenseEncoder): def _initialize_hf_model(self): try: from transformers import AutoModel, AutoTokenizer - except ImportError: + except (ImportError, RuntimeError): raise ImportError( "Please install transformers to use HuggingFaceEncoder. " "You can install it with: " @@ -80,7 +80,7 @@ class HuggingFaceEncoder(DenseEncoder): try: import torch - except ImportError: + except RuntimeError: raise ImportError( "Please install Pytorch to use HuggingFaceEncoder. " "You can install it with: " diff --git a/semantic_router/encoders/tfidf.py b/semantic_router/encoders/tfidf.py index 656ee117e54b60a293c0b425452065258bb5db96..0d6642b7fffaf55e0e31dbe6ed85ff042148ea6b 100644 --- a/semantic_router/encoders/tfidf.py +++ b/semantic_router/encoders/tfidf.py @@ -5,11 +5,12 @@ from typing import Dict, List import numpy as np from semantic_router.encoders import SparseEncoder +from semantic_router.encoders.base import FittableMixin from semantic_router.route import Route from semantic_router.schema import SparseEmbedding -class TfidfEncoder(SparseEncoder): +class TfidfEncoder(SparseEncoder, FittableMixin): idf: np.ndarray = np.array([]) # TODO: add option to use default params like with BM25Encoder word_index: Dict = {} @@ -32,6 +33,22 @@ class TfidfEncoder(SparseEncoder): tfidf = tf * self.idf return self._array_to_sparse_embeddings(tfidf) + def encode_queries(self, docs: List[str]) -> list[SparseEmbedding]: + """Encode documents using TF-IDF""" + return self.__call__(docs) # TF-IDF uses same method for docs and queries + + def encode_documents(self, docs: List[str]) -> list[SparseEmbedding]: + """Encode documents using TF-IDF""" + return self.__call__(docs) # TF-IDF uses same method for docs and queries + + async def aencode_queries(self, docs: List[str]) -> list[SparseEmbedding]: + """Async version of encode_queries""" + return self.__call__(docs) + + async def aencode_documents(self, docs: List[str]) -> list[SparseEmbedding]: + """Async version of encode_documents""" + return self.__call__(docs) + def fit(self, routes: List[Route]): """Trains the encoder weights on the provided routes. diff --git a/semantic_router/routers/hybrid.py b/semantic_router/routers/hybrid.py index 6bc202f511573c3dd4bfb3d89fbd7352b6366da6..9c6680c6fa68db65c4fa433d6248f60c1934b04c 100644 --- a/semantic_router/routers/hybrid.py +++ b/semantic_router/routers/hybrid.py @@ -9,8 +9,8 @@ from semantic_router.encoders import ( BM25Encoder, DenseEncoder, SparseEncoder, - TfidfEncoder, ) +from semantic_router.encoders.base import FittableMixin from semantic_router.index import BaseIndex, HybridLocalIndex from semantic_router.llms import BaseLLM from semantic_router.route import Route @@ -51,6 +51,9 @@ class HybridRouter(BaseRouter): encoder = self._get_encoder(encoder=encoder) # initialize sparse encoder sparse_encoder = self._get_sparse_encoder(sparse_encoder=sparse_encoder) + # fit sparse encoder if needed + if isinstance(sparse_encoder, FittableMixin) and routes: + sparse_encoder.fit(routes) super().__init__( encoder=encoder, sparse_encoder=sparse_encoder, @@ -63,13 +66,6 @@ class HybridRouter(BaseRouter): ) # set alpha self.alpha = alpha - # fit sparse encoder if needed - if ( - isinstance(self.sparse_encoder, TfidfEncoder) - and hasattr(self.sparse_encoder, "fit") - and self.routes - ): - self.sparse_encoder.fit(self.routes) def _set_score_threshold(self): """Set the score threshold for the HybridRouter. Unlike the base router the @@ -92,6 +88,9 @@ class HybridRouter(BaseRouter): :param route: The route to add. :type route: Route """ + + if self.sparse_encoder is None: + raise ValueError("Sparse Encoder not initialised.") # TODO: merge into single method within BaseRouter current_local_hash = self._get_hash() current_remote_hash = self.index._read_hash() @@ -100,6 +99,10 @@ class HybridRouter(BaseRouter): current_remote_hash = current_local_hash if isinstance(routes, Route): routes = [routes] + + self.routes.extend(routes) + if isinstance(self.sparse_encoder, FittableMixin) and self.routes: + self.sparse_encoder.fit(self.routes) # create embeddings for all routes ( route_names, @@ -119,7 +122,6 @@ class HybridRouter(BaseRouter): sparse_embeddings=sparse_emb, ) - self.routes.extend(routes) if current_local_hash.value == current_remote_hash.value: self._write_hash() # update current hash in index else: @@ -136,6 +138,8 @@ class HybridRouter(BaseRouter): :param strategy: The sync strategy to execute. :type strategy: Dict[str, Dict[str, List[Utterance]]] """ + if self.sparse_encoder is None: + raise ValueError("Sparse Encoder not initialised.") if strategy["remote"]["delete"]: data_to_delete = {} # type: ignore for utt_obj in strategy["remote"]["delete"]: @@ -150,7 +154,8 @@ class HybridRouter(BaseRouter): routes=[utt.route for utt in strategy["remote"]["upsert"]], utterances=utterances_text, function_schemas=[ - utt.function_schemas for utt in strategy["remote"]["upsert"] # type: ignore + utt.function_schemas # type: ignore + for utt in strategy["remote"]["upsert"] ], metadata_list=[utt.metadata for utt in strategy["remote"]["upsert"]], sparse_embeddings=sparse_emb, @@ -161,6 +166,8 @@ class HybridRouter(BaseRouter): self._local_upsert(utterances=strategy["local"]["upsert"]) # update hash self._write_hash() + if isinstance(self.sparse_encoder, FittableMixin) and self.routes: + self.sparse_encoder.fit(self.routes) def _get_index(self, index: Optional[BaseIndex]) -> BaseIndex: """Get the index. @@ -179,7 +186,7 @@ class HybridRouter(BaseRouter): def _get_sparse_encoder( self, sparse_encoder: Optional[SparseEncoder] - ) -> Optional[SparseEncoder]: + ) -> SparseEncoder: """Get the sparse encoder. :param sparse_encoder: The sparse encoder to get. @@ -194,31 +201,33 @@ class HybridRouter(BaseRouter): sparse_encoder = sparse_encoder return sparse_encoder - def _encode(self, text: list[str]) -> tuple[np.ndarray, list[SparseEmbedding]]: + def _encode( + self, + text: list[str], + ) -> tuple[np.ndarray, list[SparseEmbedding]]: """Given some text, generates dense and sparse embeddings, then scales them using the chosen alpha value. - :param text: The text to encode. - :type text: list[str] - :return: A tuple of the dense and sparse embeddings. - :rtype: tuple[np.ndarray, list[SparseEmbedding]] + :param text: List of texts to encode + :type text: List[str] + :return: Tuple of dense and sparse embeddings """ if self.sparse_encoder is None: raise ValueError("self.sparse_encoder is not set.") - # TODO: should encode "content" rather than text - # TODO: add alpha as a parameter - # create dense query vector + + # Create dense vector xq_d = np.array(self.encoder(text)) - # xq_d = np.squeeze(xq_d) # Reduce to 1d array. - # create sparse query vector dict - xq_s = self.sparse_encoder(text) - # xq_s = np.squeeze(xq_s) - # convex scaling + + # Create sparse vector, handling BM25's query/document distinction + xq_s = self.sparse_encoder.encode_documents(text) + + # Convex scaling xq_d, xq_s = self._convex_scaling(dense=xq_d, sparse=xq_s) return xq_d, xq_s async def _async_encode( - self, text: List[str] + self, + text: List[str], ) -> tuple[np.ndarray, list[SparseEmbedding]]: """Given some text, generates dense and sparse embeddings, then scales them using the chosen alpha value. @@ -234,7 +243,7 @@ class HybridRouter(BaseRouter): # TODO: add alpha as a parameter # async encode both dense and sparse dense_coro = self.encoder.acall(text) - sparse_coro = self.sparse_encoder.acall(text) + sparse_coro = self.sparse_encoder.aencode_documents(text) dense_vec, xq_s = await asyncio.gather(dense_coro, sparse_coro) # create dense query vector xq_d = np.array(dense_vec) @@ -265,12 +274,18 @@ class HybridRouter(BaseRouter): """ if not self.index.is_ready(): raise ValueError("Index is not ready.") + if self.sparse_encoder is None: + raise ValueError potential_sparse_vector: List[SparseEmbedding] | None = None # if no vector provided, encode text to get vector if vector is None: if text is None: raise ValueError("Either text or vector must be provided") - vector, potential_sparse_vector = self._encode(text=[text]) + xq_d = np.array(self.encoder([text])) + xq_s = self.sparse_encoder.encode_queries([text]) + vector, potential_sparse_vector = self._convex_scaling( + dense=xq_d, sparse=xq_s + ) # convert to numpy array if not already vector = xq_reshape(vector) if sparse_vector is None: @@ -363,7 +378,7 @@ class HybridRouter(BaseRouter): utterances.append(utterance.utterance) metadata.append(utterance.metadata) embeddings = self.encoder(utterances) - sparse_embeddings = self.sparse_encoder(utterances) + sparse_embeddings = self.sparse_encoder.encode_documents(utterances) self.index = HybridLocalIndex() self.index.add( embeddings=embeddings, @@ -380,7 +395,7 @@ class HybridRouter(BaseRouter): emb_d = np.array(self.encoder(X[i : i + batch_size])) # TODO JB: for some reason the sparse encoder is receiving a tuple # like `("Hello",)` - emb_s = self.sparse_encoder(X[i : i + batch_size]) + emb_s = self.sparse_encoder.encode_documents(X[i : i + batch_size]) Xq_d.extend(emb_d) Xq_s.extend(emb_s) # initial eval (we will iterate from here) @@ -427,7 +442,7 @@ class HybridRouter(BaseRouter): Xq_s: List[SparseEmbedding] = [] for i in tqdm(range(0, len(X), batch_size), desc="Generating embeddings"): emb_d = np.array(self.encoder(X[i : i + batch_size])) - emb_s = self.sparse_encoder(X[i : i + batch_size]) + emb_s = self.sparse_encoder.encode_queries(X[i : i + batch_size]) Xq_d.extend(emb_d) Xq_s.extend(emb_s) diff --git a/semantic_router/schema.py b/semantic_router/schema.py index fa6cdd2d40f50a103c69dc7bc2e0039d47f20d50..d5a68081169fd516ce68f8944002efeaffc8d809 100644 --- a/semantic_router/schema.py +++ b/semantic_router/schema.py @@ -5,10 +5,10 @@ from enum import Enum from typing import Any, Dict, List, Optional, Tuple, Union import numpy as np +from aurelio_sdk.schema import SparseEmbedding as BM25SparseEmbedding from pydantic import BaseModel, Field from semantic_router.utils.logger import logger -from aurelio_sdk.schema import SparseEmbedding as BM25SparseEmbedding class EncoderType(Enum): diff --git a/semantic_router/tokenizers.py b/semantic_router/tokenizers.py new file mode 100644 index 0000000000000000000000000000000000000000..0c1d5b34d3b6c235c541d71fc70cb95eb6e103d5 --- /dev/null +++ b/semantic_router/tokenizers.py @@ -0,0 +1,169 @@ +import json +from pathlib import Path + +import numpy as np +from tokenizers import Tokenizer +from tokenizers.normalizers import Sequence + + +class BaseTokenizer: + """Abstract Tokenizer class""" + + @property + def vocab_size(self) -> int: + """Returns the vocabulary size of the tokenizer + + :return: Vocabulary size of tokenizer + :rtype: int + """ + raise NotImplementedError + + @property + def config(self) -> dict: + """The tokenizer config + + :return: dictionary of tokenizer config + :rtype: dict + """ + raise NotImplementedError + + def save(self, path: str | Path) -> None: + """Saves the configuration of the tokenizer + + Saves these files: + - tokenizer.json: saved configuration of the tokenizer + + :param path: Path to save the tokenizer to + :type path: str, :class:`pathlib.Path` + """ + if isinstance(path, str): + path = Path(path) + + with open(path, "w") as fp: + json.dump(self.config, fp) + + @classmethod + def load(cls, path: str | Path) -> "BaseTokenizer": + """Returns a :class:`bm25_engine.tokenizer.BaseTokenizer` object from saved configuration + + Requires these files: + - tokenizer.json: saved configuration of the tokenizer + + :param path: Path to load the tokenizer from + :type path: str, :class:`pathlib.Path` + :returns: Configured BaseTokenizer + :rtype: BaseTokenizer + """ + if isinstance(path, str): + path = Path(path) + + with open(path) as fp: + config = json.load(fp) + return cls(**config) + + def tokenize(self, texts: str | list[str], pad: bool = True) -> np.ndarray: + raise NotImplementedError + + +class HashTokenizer(BaseTokenizer): + def __init__(self) -> None: + super().__init__() + + +class PretrainedTokenizer(BaseTokenizer): + """Wrapper for HuggingFace tokenizers, representing a pretrained tokenizer (i.e. bert-base-uncased). + Extends the :class:`semantic_router.tokenizers.BaseTokenizer` class. + + :param tokenizer: Binding for HuggingFace Rust tokenizers + :type tokenizer: class:`tokenizers.Tokenizer` + :param add_special_tokens: Whether to accept special tokens from the tokenizer (i.e. `[PAD]`) + :type add_special_tokens: bool + :param pad: Whether to pad the input to a consistent length (using `[PAD]` tokens) + :type pad: bool + :param model_ident: HuggingFace ID of the model (i.e. `bert-base-uncased`) + :type model_ident: str + """ + + tokenizer: Tokenizer + add_special_tokens: bool + pad: bool + model_ident: str + + def __init__( + self, + model_ident: str, + custom_normalizer: Sequence | None = None, + add_special_tokens: bool = False, + pad: bool = True, + ) -> None: + """Constructor method""" + super().__init__() + self.add_special_tokens = add_special_tokens + self.model_ident = model_ident + self.tokenizer = Tokenizer.from_pretrained(model_ident) + self.pad = pad + if custom_normalizer: + self.tokenizer.normalizer = custom_normalizer # type: ignore + if pad: + self.tokenizer.enable_padding(direction="right", pad_id=0) + + @property + def vocab_size(self): + """Returns the vocabulary size of the tokenizer + + :return: Vocabulary size of tokenizer + :rtype: int + """ + return self.tokenizer.get_vocab_size() + + @property + def config(self) -> dict: + """The tokenizer config + + :return: dictionary of tokenizer config + :rtype: dict + """ + return { + "model_ident": self.model_ident, + "add_special_tokens": self.add_special_tokens, + "pad": self.pad, + } + + def tokenize(self, texts: str | list[str], pad: bool = True) -> np.ndarray: + """Tokenizes a string or list of strings into a 2D :class:`numpy.ndarray` of token ids + + :param texts: Texts to be tokenized + :type texts: str, list + :param pad: unused here (configured in the constructor) + :type pad: bool + :return: 2D numpy array representing token ids + :rtype: class:`numpy.ndarray` + """ + if isinstance(texts, str): + texts = [texts] + + encodings = self.tokenizer.encode_batch_fast( + texts, add_special_tokens=self.add_special_tokens + ) + + return np.array([e.ids for e in encodings]) + + +class TokenizerFactory: + """Tokenizer factory class""" + + @staticmethod + def get(type_: str, **tokenizer_kwargs) -> BaseTokenizer: + r"""Get a configured :class:`bm25_engine.tokenizer.BaseTokenizer` + + :param type_: Tokenizer type to instantiate + :type type_: str + :param \**kwargs: kwargs to be passed to Tokenizer constructor + :return: Tokenizer + :rtype: `bm25_engine.tokenizer.BaseTokenizer` + """ + match type_: + case "pretrained": + return PretrainedTokenizer(**tokenizer_kwargs) + case _: + return PretrainedTokenizer(**tokenizer_kwargs) diff --git a/tests/functional/encoders/test_bm25_functional.py b/tests/functional/encoders/test_bm25_functional.py new file mode 100644 index 0000000000000000000000000000000000000000..5e8fc1114a3243f673dd1cf120604bacce8c1eaa --- /dev/null +++ b/tests/functional/encoders/test_bm25_functional.py @@ -0,0 +1,55 @@ +import numpy as np +import pytest + +from semantic_router import Route +from semantic_router.encoders.bm25 import BM25Encoder + +UTTERANCES = [ + "A high weight in tf–idf is reached by a high term frequency", + "(in the given document) and a low document frequency of the term", + "in the whole collection of documents; the weights hence tend to filter", + "out common terms. Since the ratio inside the idf's log function is always", + "greater than or equal to 1, the value of idf (and tf–idf) is greater than or equal", + "to 0. As a term appears in more documents, the ratio inside the logarithm approaches", + "1, bringing the idf and tf–idf closer to 0.", +] +QUERIES = ["weights", "ratio logarithm"] + + +@pytest.fixture +def bm25_encoder(): + sparse_encoder = BM25Encoder(use_default_params=True) + sparse_encoder.fit([Route(name="test_route", utterances=UTTERANCES)]) + return sparse_encoder + + +class TestBM25Encoder: + def _sparse_to_vector(self, sparse_embedding, vocab_size): + """Re-constructs the full (sparse_embedding.shape[0], vocab_size) array""" + return ( + np.eye(vocab_size)[sparse_embedding[:, 0].astype(np.uint).tolist()] + * np.atleast_2d(sparse_embedding[:, 1]).T + ).sum(axis=0) + + def test_bm25_scoring(self, bm25_encoder): + vocab_size = bm25_encoder._tokenizer.vocab_size + expected = np.array( + [ + [0.00000, 0.00000, 0.54575, 0.00000, 0.00000, 0.00000, 0.00000], + [0.00000, 0.00000, 0.00000, 0.18864, 0.00000, 0.67897, 0.00000], + ] + ) + q_e = np.stack( + [ + self._sparse_to_vector(v.embedding, vocab_size=vocab_size) + for v in bm25_encoder.encode_queries(QUERIES) + ] + ) + d_e = np.stack( + [ + self._sparse_to_vector(v.embedding, vocab_size=vocab_size) + for v in bm25_encoder.encode_documents(UTTERANCES) + ] + ) + scores = q_e @ d_e.T + assert np.allclose(scores, expected, rtol=1e-4), expected diff --git a/tests/unit/encoders/test_bm25.py b/tests/unit/encoders/test_bm25.py index 6c2133482f8a54f543b199d5de58963439e61dca..408412eb5b64e9306279d1f7eaf61889e7d25dd3 100644 --- a/tests/unit/encoders/test_bm25.py +++ b/tests/unit/encoders/test_bm25.py @@ -1,12 +1,9 @@ -import nltk import numpy as np import pytest from semantic_router.encoders import BM25Encoder from semantic_router.route import Route -nltk.download("punkt_tab") - UTTERANCES = [ "Hello we need this text to be a little longer for our sparse encoders", "In this case they need to learn from recurring tokens, ie words.", @@ -18,7 +15,7 @@ UTTERANCES = [ @pytest.fixture def bm25_encoder(): - sparse_encoder = BM25Encoder(use_default_params=False) + sparse_encoder = BM25Encoder(use_default_params=True) sparse_encoder.fit( [ Route( @@ -44,11 +41,11 @@ def routes(): class TestBM25Encoder: def test_initialization(self, bm25_encoder): - assert bm25_encoder.model is not None + assert bm25_encoder._tokenizer is not None def test_fit(self, bm25_encoder, routes): bm25_encoder.fit(routes) - assert bm25_encoder.model is not None + assert bm25_encoder._tokenizer is not None def test_fit_with_strings(self, bm25_encoder): route_strings = ["test a", "test b", "test c"] @@ -74,11 +71,51 @@ class TestBM25Encoder: ), "Each item in result should be an array" def test_call_method_with_uninitialized_model_or_mapping(self, bm25_encoder): - bm25_encoder.model = None + bm25_encoder._tokenizer = None with pytest.raises(ValueError): bm25_encoder(["test"]) def test_fit_with_uninitialized_model(self, bm25_encoder, routes): - bm25_encoder.model = None + bm25_encoder._tokenizer = None with pytest.raises(ValueError): bm25_encoder.fit(routes) + + def test_encode_queries(self, bm25_encoder): + queries = ["quick brown", "lazy dog", "hello world"] + results = bm25_encoder.encode_queries(queries) + + assert len(results) == len(queries) + assert all([isinstance(result.embedding, np.ndarray) for result in results]) + + def test_encode_queries_empty_list(self, bm25_encoder): + with pytest.raises(ValueError, match="No documents provided for encoding"): + bm25_encoder.encode_queries([]) + + def test_encode_queries_unfitted(self): + encoder = BM25Encoder(use_default_params=True) + with pytest.raises(ValueError, match="Encoder not fitted"): + encoder.encode_queries(["test query"]) + + def test_encode_documents(self, bm25_encoder): + documents = ["quick brown", "lazy dog", "hello world"] + results = bm25_encoder.encode_documents(documents) + + assert len(results) == len(documents) + assert all([isinstance(result.embedding, np.ndarray) for result in results]) + + def test_encode_documents_empty_list(self, bm25_encoder): + with pytest.raises(ValueError, match="No documents provided for encoding"): + bm25_encoder.encode_documents([]) + + def test_encode_documents_unfitted(self): + encoder = BM25Encoder(use_default_params=True) + with pytest.raises(ValueError, match="Encoder not fitted"): + encoder.encode_documents(["test document"]) + + def test_encode_documents_batch_size(self, bm25_encoder): + documents = ["quick brown", "lazy dog", "hello world", "test document"] + batch_size = 2 + results = bm25_encoder.encode_documents(documents, batch_size=batch_size) + + assert len(results) == len(documents) + assert all(isinstance(result.embedding, np.ndarray) for result in results) diff --git a/tests/unit/encoders/test_huggingface.py b/tests/unit/encoders/test_huggingface.py index 1677a450037285885034b73efbc9e26dd4d2b68f..76f28f5bb8564de0c434c778b09a80200c913b4d 100644 --- a/tests/unit/encoders/test_huggingface.py +++ b/tests/unit/encoders/test_huggingface.py @@ -26,7 +26,9 @@ class TestHuggingFaceEncoder: with pytest.raises(ImportError) as error: HuggingFaceEncoder() - assert "Please install Pytorch to use HuggingFaceEncoder" in str(error.value) + assert "Please install transformers to use HuggingFaceEncoder" in str( + error.value + ) @pytest.mark.skipif( os.environ.get("RUN_HF_TESTS") is None, reason="Set RUN_HF_TESTS=1 to run" diff --git a/tests/unit/test_router.py b/tests/unit/test_router.py index 5f90be3d1662e95d13a6ae3e9bfd60663f6c0dea..fca6735a76bc46a7122d328130aaa9909f4e688c 100644 --- a/tests/unit/test_router.py +++ b/tests/unit/test_router.py @@ -282,9 +282,7 @@ def get_test_encoders(): def get_test_routers(): - routers = [SemanticRouter] - if importlib.util.find_spec("pinecone_text") is not None: - routers.append(HybridRouter) + routers = [SemanticRouter, HybridRouter] return routers diff --git a/tests/unit/test_sync.py b/tests/unit/test_sync.py index be99f282b2b839df9ff8e2614bdb384a2a1240bb..9f41108b2c334ac51af3376aac215c7f95f7f7ab 100644 --- a/tests/unit/test_sync.py +++ b/tests/unit/test_sync.py @@ -318,9 +318,7 @@ def get_test_indexes(): def get_test_routers(): - routers = [SemanticRouter] - if importlib.util.find_spec("pinecone_text") is not None: - routers.append(HybridRouter) + routers = [SemanticRouter, HybridRouter] return routers diff --git a/tests/unit/test_tokenizers.py b/tests/unit/test_tokenizers.py new file mode 100644 index 0000000000000000000000000000000000000000..4757ffb82f4fef5ac2b241002cce88f20a13ce3a --- /dev/null +++ b/tests/unit/test_tokenizers.py @@ -0,0 +1,98 @@ +import json +import tempfile + +import numpy as np +import pytest + +from semantic_router.tokenizers import ( + BaseTokenizer, + PretrainedTokenizer, +) + + +class TestBaseTokenizer: + def test_abstract_methods(self): + class ConcreteTokenizer(BaseTokenizer): + pass + + tokenizer = ConcreteTokenizer() + with pytest.raises(NotImplementedError): + _ = tokenizer.vocab_size + with pytest.raises(NotImplementedError): + _ = tokenizer.config + with pytest.raises(NotImplementedError): + tokenizer.tokenize("test") + + def test_save_load(self): + class ConcreteTokenizer(BaseTokenizer): + def __init__(self, test_param) -> None: + self.test_param = test_param + super().__init__() + + @property + def vocab_size(self): + return 100 + + @property + def config(self): + return {"test_param": self.test_param} + + def tokenize(self, texts, pad=True): + pass + + with tempfile.NamedTemporaryFile(suffix=".json") as tmp: + tokenizer = ConcreteTokenizer(test_param="value") + tokenizer.save(tmp.name) + + loaded = ConcreteTokenizer.load(tmp.name) + assert isinstance(loaded, ConcreteTokenizer) + with open(tmp.name) as f: + saved_config = json.load(f) + assert saved_config == {"test_param": "value"} + + +class TestPretrainedTokenizer: + @pytest.fixture + def tokenizer(self): + return PretrainedTokenizer("bert-base-uncased") + + def test_initialization(self, tokenizer): + assert tokenizer.model_ident == "bert-base-uncased" + assert tokenizer.add_special_tokens is False + assert tokenizer.pad is True + + def test_vocab_size(self, tokenizer): + assert isinstance(tokenizer.vocab_size, int) + assert tokenizer.vocab_size > 0 + + def test_config(self, tokenizer): + config = tokenizer.config + assert isinstance(config, dict) + assert "model_ident" in config + assert "add_special_tokens" in config + assert "pad" in config + + def test_tokenize_single_text(self, tokenizer): + text = "Hello world" + tokens = tokenizer.tokenize(text) + assert isinstance(tokens, np.ndarray) + assert tokens.ndim == 2 + assert tokens.shape[0] == 1 # One sequence + assert tokens.shape[1] > 0 # At least one token + + def test_tokenize_multiple_texts(self, tokenizer): + texts = ["Hello world", "Testing tokenization"] + tokens = tokenizer.tokenize(texts) + assert isinstance(tokens, np.ndarray) + assert tokens.ndim == 2 + assert tokens.shape[0] == 2 # Two sequences + + def test_save_load_cycle(self, tokenizer): + with tempfile.NamedTemporaryFile(suffix=".json") as tmp: + tokenizer.save(tmp.name) + loaded = PretrainedTokenizer.load(tmp.name) + + assert isinstance(loaded, PretrainedTokenizer) + assert loaded.model_ident == tokenizer.model_ident + assert loaded.add_special_tokens == tokenizer.add_special_tokens + assert loaded.pad == tokenizer.pad diff --git a/uv.lock b/uv.lock index d0bdc658d5ac61e6057cee985c022e83dc4434d0..1daed64e35d7cc5058f114d412cbe737a7e22b30 100644 --- a/uv.lock +++ b/uv.lock @@ -1556,15 +1556,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256 }, ] -[[package]] -name = "joblib" -version = "1.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/64/33/60135848598c076ce4b231e1b1895170f45fbcaeaa2c9d5e38b04db70c35/joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e", size = 2116621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, -] - [[package]] name = "jupyter-client" version = "8.6.3" @@ -1955,6 +1946,7 @@ wheels = [ ] [[package]] +<<<<<<< HEAD name = "nltk" version = "3.9.1" source = { registry = "https://pypi.org/simple" } @@ -2001,6 +1993,24 @@ wheels = [ ] [[package]] +||||||| parent of bb324f0 (feat: implements vectorised sparse BM25 encoder) +name = "nltk" +version = "3.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "joblib" }, + { name = "regex" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3c/87/db8be88ad32c2d042420b6fd9ffd4a149f9a0d7f0e86b3f543be2eeeedd2/nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868", size = 2904691 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/66/7d9e26593edda06e8cb531874633f7c2372279c3b0f46235539fe546df8b/nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1", size = 1505442 }, +] + +[[package]] +======= +>>>>>>> bb324f0 (feat: implements vectorised sparse BM25 encoder) name = "numpy" version = "1.26.4" source = { registry = "https://pypi.org/simple" } @@ -2358,24 +2368,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3b/1d/a21fdfcd6d022cb64cef5c2a29ee6691c6c103c4566b41646b080b7536a5/pinecone_plugin_interface-0.0.7-py3-none-any.whl", hash = "sha256:875857ad9c9fc8bbc074dbe780d187a2afd21f5bfe0f3b08601924a61ef1bba8", size = 6249 }, ] -[[package]] -name = "pinecone-text" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mmh3" }, - { name = "nltk" }, - { name = "numpy" }, - { name = "python-dotenv" }, - { name = "requests" }, - { name = "types-requests" }, - { name = "wget" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/97/cc/06edd3aefaf566894fb4f6a8c55c5d3990660a7b822706ba1c86c1faa093/pinecone_text-0.9.0.tar.gz", hash = "sha256:f8244a9bc090ee2fc904053a2415cfc114fd8bbfbc9a6ba8b0581c84990d0239", size = 20635 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/7d/c3596a064f11ca1c26c57d1a7022f8b6e724cbf50e8c365ddfb869d47ca7/pinecone_text-0.9.0-py3-none-any.whl", hash = "sha256:7a1ad2e282d10b59f0288a2a4f4b8c583a77378172232fae573cf398a3c44240", size = 23440 }, -] - [[package]] name = "platformdirs" version = "4.3.6" @@ -3400,7 +3392,6 @@ all = [ { name = "mistralai" }, { name = "pillow", marker = "python_full_version < '3.13'" }, { name = "pinecone" }, - { name = "pinecone-text" }, { name = "qdrant-client", version = "1.12.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "qdrant-client", version = "1.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, { name = "tokenizers", marker = "python_full_version < '3.13'" }, @@ -3424,9 +3415,6 @@ fastembed = [ google = [ { name = "google-cloud-aiplatform" }, ] -hybrid = [ - { name = "pinecone-text" }, -] local = [ { name = "llama-cpp-python", marker = "python_full_version < '3.13'" }, { name = "tokenizers", marker = "python_full_version < '3.13'" }, @@ -3482,7 +3470,6 @@ requires-dist = [ { name = "openai", specifier = ">=1.10.0,<2.0.0" }, { name = "pillow", marker = "python_full_version < '3.13' and extra == 'vision'", specifier = ">=10.2.0,<11.0.0" }, { name = "pinecone", marker = "extra == 'pinecone'", specifier = ">=5.0.0,<6.0.0" }, - { name = "pinecone-text", marker = "extra == 'hybrid'", specifier = ">=0.7.1" }, { name = "psycopg2-binary", specifier = ">=2.9.9,<3" }, { name = "pydantic", specifier = ">=2.10.2,<3" }, { name = "pydoc-markdown", marker = "python_full_version < '3.12' and extra == 'docs'", specifier = ">=4.8.2" }, @@ -3494,7 +3481,6 @@ requires-dist = [ { name = "semantic-router", extras = ["cohere"], marker = "extra == 'all'" }, { name = "semantic-router", extras = ["fastembed"], marker = "extra == 'all'" }, { name = "semantic-router", extras = ["google"], marker = "extra == 'all'" }, - { name = "semantic-router", extras = ["hybrid"], marker = "extra == 'all'" }, { name = "semantic-router", extras = ["local"], marker = "extra == 'all'" }, { name = "semantic-router", extras = ["mistralai"], marker = "extra == 'all'" }, { name = "semantic-router", extras = ["pinecone"], marker = "extra == 'all'" }, @@ -3965,12 +3951,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, ] -[[package]] -name = "wget" -version = "3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/6a/62e288da7bcda82b935ff0c6cfe542970f04e29c756b0e147251b2fb251f/wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061", size = 10857 } - [[package]] name = "win32-setctime" version = "1.2.0"