Files
turboquant/tests/__pycache__/test_polar_quant.cpython-312-pytest-9.0.2.pyc

281 lines
46 KiB
Plaintext
Raw Normal View History

<EFBFBD>
[<5B><>i<EFBFBD>;<00><01><><00>dZddlmZddlZddlmcmZddl Z ddl
Z
ddl m Z m Z ddlZgd<05>Zdd<06>Zdd<07>Zdd<08>Zdd <09>ZGd
<EFBFBD>d <0B>ZGd <0C>d <0A>ZGd<0E>d<0F>ZGd<10>d<11>ZGd<12>d<13>ZGd<14>d<15>Zy)uUnit tests for PolarQuant encode/decode.
Tests the core algorithms from llama-turbo.cpp using pure Python
implementations that mirror the C++ logic. This ensures correctness
without requiring C++ compilation.
Refs: #54 — [Tests] Add unit tests for PolarQuant encode/decode
<EFBFBD>)<01> annotationsN)<02>List<73>Tuple)g<>y<EFBFBD>):<3A>˿gt$<24><><EFBFBD>~ÿg<C3BF><67><EFBFBD><EFBFBD><E995B2>gDio<69><6F>ɴ<EFBFBD>g<EFBFBD><67>e<EFBFBD>c]<5D><>g8gDio<69><6F>g/<2F>$<06><><EFBFBD>g/<2F>$<06><>?g8gDio<69>?g<><67>e<EFBFBD>c]<5D>?gDio<69><6F>ɴ?g<><67><EFBFBD><EFBFBD>?gt$<24><><EFBFBD>~<7E>?g<>y<EFBFBD>):<3A><>?g<>Q<EFBFBD><1E><><EFBFBD>?gffffff<66>?c<01><<00>t|<00>}d}||krTtd||dz<00>D]6}t|||z<00>D]"}||}|||z}||z||<||z
|||z<<00>$<00>8|dz}||kr<01>Tdtj|<01>z }t|<01>D]}||xx|zcc<<00>|S)zxFast Walsh-Hadamard Transform (in-place, normalized).
Mirrors the C++ implementation in llama-turbo.cpp:17-33.
<20>r<00><00><00>?)<04>len<65>range<67>math<74>sqrt)<08>a<>n<>h<>i<>j<>x<>y<>scales <20>4/private/tmp/turboquant-54/tests/test_polar_quant.py<70>fwhtr s<><00><00>
<0C>A<EFBFBD><06>A<EFBFBD> <09>A<EFBFBD>
<0B>a<EFBFBD>%<25><16>q<EFBFBD>!<21>Q<EFBFBD><11>U<EFBFBD>#<23> !<21>A<EFBFBD><1A>1<EFBFBD>a<EFBFBD>!<21>e<EFBFBD>_<EFBFBD> !<21><01><15>a<EFBFBD>D<EFBFBD><01><15>a<EFBFBD>!<21>e<EFBFBD>H<EFBFBD><01><18>1<EFBFBD>u<EFBFBD><01>!<21><04><1C>q<EFBFBD>5<EFBFBD><01>!<21>a<EFBFBD>%<25><08>  !<21> !<21>
<EFBFBD>a<EFBFBD><07><01> <0C>a<EFBFBD>%<25> <10>$<24>)<29>)<29>A<EFBFBD>,<2C> <1E>E<EFBFBD> <12>1<EFBFBD>X<EFBFBD><16><01> <09>!<21><04><05> <0A><04><16> <0A>H<EFBFBD>c<01><><00>d}t|tdz
<00>}tdd<03>D]!}t|t|z
<00>}||ks<01>|}|}<01>#|S)z2Find nearest Lloyd-Max codebook index for a value.rr<00>)<03>abs<62>TURBO4_CENTROIDSr )<05>val<61>best_idx<64>min_distr<00>dists r<00>quantize_valuer!8s^<00><00><10>H<EFBFBD><12>3<EFBFBD>)<29>!<21>,<2C>,<2C>-<2D>H<EFBFBD> <12>1<EFBFBD>b<EFBFBD>\<5C><19><01><12>3<EFBFBD>)<29>!<21>,<2C>,<2C>-<2D><04> <0F>(<28>?<3F><1B>H<EFBFBD><18>H<EFBFBD> <19>
<14>Orc<01><><00>t|<00>}t|<00>}t|<02>tjt d<01>|D<00><00><00>}d|dzz }g}|D]#}||z}t |<07>}|j|<08><00>%t|dz<00>} t|<01>D]2}
|
dzdk(r||
dz| |
dz<<00>| |
dzxx||
dzdzzcc<<00>4t| <09>|fS) ztPolarQuant Turbo4 Encode (CPU reference).
Mirrors llama-turbo.cpp:36-68.
Returns (packed_bytes, norm).
c3<01>&K<00>|] }||z<00><01><00> y<00>w<01>N<><00><02>.0rs r<00> <genexpr>z,polar_quant_encode_turbo4.<locals>.<genexpr>Os<00><00><><00>0<>1<EFBFBD><11>Q<EFBFBD><15>0<><30><00>r <00><><EFBFBD>&<26> .>rr<00><00><00><>) r
<00>listrr r <00>sumr!<00>append<6E> bytearrayr <00>bytes) <0B>src<72>d<>rotated<65>norm<72>inv_norm<72>indicesr<00>
normalized<EFBFBD>idx<64>packedrs r<00>polar_quant_encode_turbo4r<Ds<><00><00> <0C>C<EFBFBD><08>A<EFBFBD><12>3<EFBFBD>i<EFBFBD>G<EFBFBD><08><17>M<EFBFBD> <10>9<EFBFBD>9<EFBFBD>S<EFBFBD>0<><07>0<>0<> 1<>D<EFBFBD><13>d<EFBFBD>T<EFBFBD>k<EFBFBD>"<22>H<EFBFBD><10>G<EFBFBD><16><1C><03><18>8<EFBFBD>^<5E>
<EFBFBD><1C>Z<EFBFBD>(<28><03><0F><0E><0E>s<EFBFBD><1B><1C> <17>q<EFBFBD>A<EFBFBD>v<EFBFBD> <1E>F<EFBFBD> <12>1<EFBFBD>X<EFBFBD>7<><01> <0C>q<EFBFBD>5<EFBFBD>A<EFBFBD>:<3A>$<24>Q<EFBFBD>Z<EFBFBD>$<24>.<2E>F<EFBFBD>1<EFBFBD><01>6<EFBFBD>N<EFBFBD> <12>1<EFBFBD><01>6<EFBFBD>N<EFBFBD>w<EFBFBD>q<EFBFBD>z<EFBFBD>Q<EFBFBD><EFBFBD>$<24>6<> 6<>N<EFBFBD> 7<> <11><16>=<3D>$<24> <1E>rc<01><><00>dg|z}t|<02>D]0}|dzdk(r ||dzdz}n ||dzdz }t||z||<<00>2t|<03>|S)zRPolarQuant Turbo4 Decode (CPU reference).
Mirrors llama-turbo.cpp:71-78.
<20>rrr+r,)r rr)r3r6r4<00>dstrr:s r<00>polar_quant_decode_turbo4r@dsr<00><00>
<0F>%<25>!<21>)<29>C<EFBFBD> <12>1<EFBFBD>X<EFBFBD>.<2E><01> <0C>q<EFBFBD>5<EFBFBD>A<EFBFBD>:<3A><15>a<EFBFBD>1<EFBFBD>f<EFBFBD>+<2B><04>$<24>C<EFBFBD><15>a<EFBFBD>1<EFBFBD>f<EFBFBD>+<2B><11>"<22>C<EFBFBD>!<21>#<23>&<26><14>-<2D><03>A<EFBFBD><06> .<2E> <09><13>I<EFBFBD> <0E>Jrc<01>r<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zejjdgd<07><01>d
d<08><04>Z y ) <0B>TestEncodeDecodeRoundtripu)decode(encode(x)) ≈ x within tolerance.c <01>x<00>gd<01>}t|<01>}d}||k(}|s<>tjd|fd||f<02>dtj<00>vstj
t<00>rtj t<00>nddtj<00>vstj
|<01>rtj |<01>ndtj |<02>tj |<03>d<07>z}dd |iz}ttj|<06><00><00>d
x}x}}t|<01>\}}t||d<02>} t|| <09>D<00>]{\}
} |
| z
} t| <0C>}d } || k}|<0E>sStjd |fd || f<02>dtj<00>vstj
t<00>rtj t<00>nddtj<00>vstj
|
<EFBFBD>rtj |
<EFBFBD>nddtj<00>vstj
| <0B>rtj | <0B>ndtj |<04>tj | <0A>d<11>z}tjd|
<EFBFBD>d| <0B><00><04>dzd|iz}ttj|<0F><00><00>d
x} x}x}} <0A><01>~y
)z@Encode then decode a known vector recovers approximate original.)r <00><00>?<3F>333333ӿg<D3BF><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?皙<><E79A99><EFBFBD><EFBFBD>ɿ皙<C9BF><E79A99><EFBFBD><EFBFBD><EFBFBD>?<3F>ffffff<66>?g333333<33><33><EFBFBD><E79A99><EFBFBD><EFBFBD><EFBFBD>?皙<><E79A99><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?皙<><E79A99><EFBFBD><EFBFBD>ٿ皙<D9BF><E79A99><EFBFBD><EFBFBD><EFBFBD>?<3F>333333<33>?<3F><00><>r>r<00><01>==<3D>z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr
r3<00><04>py0<79>py1<79>py3<79>py6<79>assert %(py8)s<>py8NrD<00><01><<3C>z;%(py5)s
{%(py5)s = %(py0)s((%(py1)s - %(py2)s))
} < %(py8)sr<00>orig<69>rec<65>rTrU<00>py2<79>py5rYzRoundtrip error too large: <20> -> <20>
>assert %(py10)s<>py10)r
<00>
@pytest_ar<61>_call_reprcompare<72> @py_builtins<6E>locals<6C>_should_repr_global_name<6D> _saferepr<70>AssertionError<6F>_format_explanationr<r@<00>zipr<00>_format_assertmsg)<10>selfr3<00> @py_assert2<74> @py_assert5<74> @py_assert4<74> @py_format7<74> @py_format9r;r6<00> recoveredr]r^<00> @py_assert3<74> @py_assert7<74> @py_assert6<74> @py_format11s r<00>test_identity_vectorz.TestEncodeDecodeRoundtrip.test_identity_vector}s<><00><00>:<3A><03><12>3<EFBFBD>x<EFBFBD><1D>2<EFBFBD><1D>x<EFBFBD>2<EFBFBD>~<7E><1D><1D><1D>x<EFBFBD>2<EFBFBD><1D><1D><1D><1D><1D><1D>s<EFBFBD><1D><1D><1D>s<EFBFBD><1D><1D><1D><1D><1D><1D>3<EFBFBD><1D><1D><1D>3<EFBFBD><1D><1D><1D>x<EFBFBD><1D><1D><1D>2<EFBFBD><1D><1D><1D><1D><1D><1D><1D>0<><13>5<> <0C><06><04>-<2D>f<EFBFBD>d<EFBFBD>B<EFBFBD>?<3F> <09><1D>S<EFBFBD>)<29>,<2C> X<01>I<EFBFBD>D<EFBFBD>#<23><1B>c<EFBFBD>z<EFBFBD> W<>3<EFBFBD>z<EFBFBD>?<3F> W<>S<EFBFBD> W<>?<3F>S<EFBFBD>(<28> W<> W<> W<>?<3F>S<EFBFBD> W<> W<> W<> W<> W<> W<>3<EFBFBD> W<> W<> W<>3<EFBFBD> W<> W<> W<> W<> W<> W<>t<EFBFBD> W<> W<> W<>t<EFBFBD> W<> W<> W<> W<> W<> W<>c<EFBFBD> W<> W<> W<>c<EFBFBD> W<> W<> W<>?<3F> W<> W<> W<>S<EFBFBD> W<> W<> W<>,G<><04>v<EFBFBD>T<EFBFBD>RU<52>QV<51>*W<> W<> W<> W<> W<> W<> W<> W<> Xrc<01>^<00>ddl}|jd<03>td<04>D<00>cgc]}|jdd<05><00><02>}}t |<03>\}}t ||d<04>}t ||<06>D<00><07>cgc]\}}t||z
<00><00><02>} }}t| <09>}
t| <09>t| <09>z } d} |
| k} | s<>tjd| fd|
| f<02>d tj<00>vstj|
<EFBFBD>rtj |
<EFBFBD>nd tj | <0C>d
<EFBFBD>z}tj"d |
<EFBFBD><00><02>d zd |iz}t%tj&|<0F><00><00>dx} } d} | | k} | s<>tjd| fd| | f<02>dtj<00>vstj| <0B>rtj | <0B>ndtj | <0C>d
<EFBFBD>z}tj"d| <0B><00><02>d zd |iz}t%tj&|<0F><00><00>dx} } ycc}wcc}}w)zRoundtrip on a 128-dim vector.rN<>*<00><>rGr rZ<00>z%(py0)s < %(py3)s<>max_err<72>rTrVzMax roundtrip error too large: <20>
>assert %(py5)srarN<00>mean_errz Mean roundtrip error too large: )<14>random<6F>seedr <00>gaussr<r@rmr<00>maxr/r
rerfrgrhrirjrnrkrl)ror<><00>_r3r;r6ru<00>o<>r<>errorsrr<>rp<00> @py_assert1<74> @py_format4<74> @py_format6s r<00>test_random_vector_128z0TestEncodeDecodeRoundtrip.test_random_vector_128<32>sk<00><00><15><0E> <0B> <0B>B<EFBFBD><0F>-2<>3<EFBFBD>Z<EFBFBD>8<><01>v<EFBFBD>|<7C>|<7C>A<EFBFBD>s<EFBFBD>#<23>8<><03>8<>0<><13>5<> <0C><06><04>-<2D>f<EFBFBD>d<EFBFBD>C<EFBFBD>@<40> <09>*-<2D>S<EFBFBD>)<29>)<<3C>=<3D><14><11>A<EFBFBD>#<23>a<EFBFBD>!<21>e<EFBFBD>*<2A>=<3D><06>=<3D><15>f<EFBFBD>+<2B><07><16>v<EFBFBD>;<3B><13>V<EFBFBD><1B>,<2C><08><1C>I<>w<EFBFBD><13>}<7D>I<>I<>I<>w<EFBFBD><13>I<>I<>I<>I<>I<>I<>w<EFBFBD>I<>I<>I<>w<EFBFBD>I<>I<>I<><13>I<>I<>I<> ?<3F><07>y<EFBFBD>I<>I<>I<>I<>I<>I<>I<><1D>L<>x<EFBFBD>#<23>~<7E>L<>L<>L<>x<EFBFBD>#<23>L<>L<>L<>L<>L<>L<>x<EFBFBD>L<>L<>L<>x<EFBFBD>L<>L<>L<>#<23>L<>L<>L<>!A<>(<28><1A>L<>L<>L<>L<>L<>L<>L<><4C>9<><39> >s <00>H$<04>(H)c<01><><00>dgdz}t|<01>\}}t||d<02>}|D<00>]-}t|<05>}d}||k}|<08>stjd|fd||f<02>dt j <00>vstjt<00>rtjt<00>nddt j <00>vstj|<05>rtj|<05>ndtj|<06>tj|<07>d<08>z} tjd |<05><00><02>d
zd | iz}
ttj|
<EFBFBD><00><00>d x}x}}<07><01>0y ) zZero vector roundtrips to zero.r>rg{<14>G<EFBFBD>z<EFBFBD>?rZ)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} < %(py6)srrrSz)Zero vector roundtrip produced non-zero: <20>
>assert %(py8)srYN) r<r@rrerfrgrhrirjrnrkrl) ror3r;r6rurrprqrrrsrts r<00>test_zero_vectorz*TestEncodeDecodeRoundtrip.test_zero_vector<6F>s<><00><00><12>e<EFBFBD>b<EFBFBD>j<EFBFBD><03>0<><13>5<> <0C><06><04>-<2D>f<EFBFBD>d<EFBFBD>B<EFBFBD>?<3F> <09><1D> V<01>C<EFBFBD><16>s<EFBFBD>8<EFBFBD> U<>d<EFBFBD> U<>8<EFBFBD>d<EFBFBD>?<3F> U<> U<> U<>8<EFBFBD>d<EFBFBD> U<> U<> U<> U<> U<> U<>3<EFBFBD> U<> U<> U<>3<EFBFBD> U<> U<> U<> U<> U<> U<>s<EFBFBD> U<> U<> U<>s<EFBFBD> U<> U<> U<>8<EFBFBD> U<> U<> U<>d<EFBFBD> U<> U<> U<>&O<>PS<50>u<EFBFBD>$U<> U<> U<> U<> U<> U<> U<> U<> Vrc
<01><00>dgdzdgz}t|<01>\}}t||d<04>}td<05>|D<00><00>}td<06>|D<00><00>}||z
}t|<07>}d} || z}
||
z } d} | | k} | <0A>s<>t j
d | fd
| | f<02>d t j<00>vst jt<00>rt jt<00>nd d t j<00>vst j|<05>rt j|<05>nd d t j<00>vst j|<06>rt j|<06>nd t j|<08>d t j<00>vst j|<05>rt j|<05>nd t j| <09>t j| <0C>d<0E>z}dd|iz}tt j|<0F><00><00>dx}x}x} x}
x} x} } y)z1Single non-zero element roundtrips approximately.r>r+r rc3<01>&K<00>|] }||z<00><01><00> y<00>wr$r%r&s rr(z=TestEncodeDecodeRoundtrip.test_unit_vector.<locals>.<genexpr><3E><00><00><00><><00>-<2D>A<EFBFBD>!<21>a<EFBFBD>%<25>-<2D>r)c3<01>&K<00>|] }||z<00><01><00> y<00>wr$r%r&s rr(z=TestEncodeDecodeRoundtrip.test_unit_vector.<locals>.<genexpr><3E>s<00><00><><00>2<>1<EFBFBD><11>Q<EFBFBD><15>2<>r)r*rDrZ)zT(%(py5)s
{%(py5)s = %(py0)s((%(py1)s - %(py2)s))
} / (%(py6)s + %(py8)s)) < %(py13)sr<00> orig_energy<67>
rec_energy)rTrUr`rarWrY<00>py13zassert %(py15)s<>py15N) r<r@r/rrerfrgrhrirjrkrl)ror3r;r6rur<>r<>rvrrrw<00> @py_assert9<74> @py_assert10<31> @py_assert12<31> @py_assert11<31> @py_format14<31> @py_format16s r<00>test_unit_vectorz*TestEncodeDecodeRoundtrip.test_unit_vector<6F>sT<00><00><12>e<EFBFBD>b<EFBFBD>j<EFBFBD>C<EFBFBD>5<EFBFBD> <20><03>0<><13>5<> <0C><06><04>-<2D>f<EFBFBD>d<EFBFBD>B<EFBFBD>?<3F> <09><1A>-<2D><13>-<2D>-<2D> <0B><18>2<> <09>2<>2<>
<EFBFBD><1E><1A>+<2B>I<>s<EFBFBD>+<2B>,<2C>I<>d<EFBFBD>I<> <0B>d<EFBFBD>0B<30>I<>,<2C>0B<30>C<>I<>c<EFBFBD>I<>C<>c<EFBFBD>I<>I<>I<>I<>C<>c<EFBFBD>I<>I<>I<>I<>I<>I<>s<EFBFBD>I<>I<>I<>s<EFBFBD>I<>I<>I<>I<>I<>I<>;<3B>I<>I<>I<>;<3B>I<>I<>I<>I<>I<>I<><1A>I<>I<>I<><1A>I<>I<>I<>,<2C>I<>I<>I<>I<>I<>I<> <0B>I<>I<>I<> <0B>I<>I<>I<>d<EFBFBD>I<>I<>I<>c<EFBFBD>I<>I<>I<>I<>I<>I<>I<>Ir<00>dim<69>r<00> <00>@r}c<01>0<00>ddl}|j|<01>t|<01>D<00>cgc]}|jdd<03><00><02>}}t |<04>\}}t |<05>}d}||z} || k(}
|
<EFBFBD>s7t jd|
fd|| f<02>dtj<00>vst jt
<00>rt jt
<00>nddtj<00>vst j|<05>rt j|<05>ndt j|<07>d tj<00>vst j|<01>rt j|<01>nd t j|<08>d
<EFBFBD>z} d d | iz} tt j| <0C><00><00>dx}x}
x}} d}||kD} | s<>t jd | fd||f<02>dtj<00>vst j|<06>rt j|<06>ndt j|<07>d<10>z}dd|iz}tt j|<0F><00><00>dx} }t|||<01>}t |<10>}||k(}
|
<EFBFBD>s#t jd|
fd||f<02>dtj<00>vst jt
<00>rt jt
<00>nddtj<00>vst j|<10>rt j|<10>ndt j|<07>d tj<00>vst j|<01>rt j|<01>nd d<15>z}dd|iz}tt j|<11><00><00>dx}}
ycc}w)z*Roundtrip works for power-of-2 dimensions.rNrGrrP<00>z=%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == (%(py5)s // %(py7)s)r
r;r<><00>rTrUrVra<00>py7<79>assert %(py10)srd<00><01>>)z%(py0)s > %(py3)sr6r<>zassert %(py5)sra<00>z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)sru<00>rTrUrVra<00>assert %(py7)sr<73>)r<>r<>r r<>r<r
rerfrgrhrirjrkrlr@)ror<>r<>r<>r3r;r6rprx<00> @py_assert8rrrtryr<>r<>r<>ru<00> @py_format8s r<00>test_various_dimensionsz1TestEncodeDecodeRoundtrip.test_various_dimensions<6E>s<><00><00> <16><0E> <0B> <0B>C<EFBFBD><18>-2<>3<EFBFBD>Z<EFBFBD>8<><01>v<EFBFBD>|<7C>|<7C>A<EFBFBD>s<EFBFBD>#<23>8<><03>8<>0<><13>5<> <0C><06><04><12>6<EFBFBD>{<7B>&<26>Q<EFBFBD>&<26>c<EFBFBD>Q<EFBFBD>h<EFBFBD>&<26>{<7B>h<EFBFBD>&<26>&<26>&<26>&<26>{<7B>h<EFBFBD>&<26>&<26>&<26>&<26>&<26>&<26>s<EFBFBD>&<26>&<26>&<26>s<EFBFBD>&<26>&<26>&<26>&<26>&<26>&<26>6<EFBFBD>&<26>&<26>&<26>6<EFBFBD>&<26>&<26>&<26>{<7B>&<26>&<26>&<26>&<26>&<26>&<26>c<EFBFBD>&<26>&<26>&<26>c<EFBFBD>&<26>&<26>&<26>Q<EFBFBD>&<26>&<26>&<26>&<26>&<26>&<26>&<26><17><0F>t<EFBFBD>a<EFBFBD>x<EFBFBD><0F><0F><0F>t<EFBFBD>a<EFBFBD><0F><0F><0F><0F><0F><0F>t<EFBFBD><0F><0F><0F>t<EFBFBD><0F><0F><0F>a<EFBFBD><0F><0F><0F><0F><0F><0F><0F>-<2D>f<EFBFBD>d<EFBFBD>C<EFBFBD>@<40> <09><12>9<EFBFBD>~<7E>$<24>~<7E><13>$<24>$<24>$<24>$<24>~<7E><13>$<24>$<24>$<24>$<24>$<24>$<24>s<EFBFBD>$<24>$<24>$<24>s<EFBFBD>$<24>$<24>$<24>$<24>$<24>$<24>9<EFBFBD>$<24>$<24>$<24>9<EFBFBD>$<24>$<24>$<24>~<7E>$<24>$<24>$<24>$<24>$<24>$<24><13>$<24>$<24>$<24><13>$<24>$<24>$<24>$<24>$<24>$<24>$<24><>9s<00>NN)r<><00>int) <0C>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__rzr<>r<>r<><00>pytest<73>mark<72> parametrizer<65>r%rrrBrBzsC<00><00>3<> X<01>M<01>"V<01> J<01> <0C>[<5B>[<5B><1C><1C>U<EFBFBD>$5<>6<> %<25>7<> %rrBc<01><00>eZdZdZd<02>Zd<03>Zy)<05>TestInnerProductPreservationuOQ·K ≈ Q·dequant(quant(K)) — inner products preserved through compression.c<01>X<00>ddl}|jd<03>td<04>D<00>cgc]}|jdd<05><00><02>}}td<04>D<00>cgc]}|jdd<05><00><02>}}t d<06>t ||<04>D<00><00>}t |<04>\}}t||d<04>}t d<07>t ||<08>D<00><00>} t|<05>dkDr<>t|| z
<00>t|<05>z }
d } |
| k} | s<>tjd
| fd |
| f<02>d tj<00>vstj|
<EFBFBD>rtj|
<EFBFBD>nd tj| <0B>d <0A>z} tjd|
<EFBFBD><00><02>dzd| iz}t!tj"|<0E><00><00>dx} } yycc}wcc}w)z8Inner product of two vectors is approximately preserved.rN<>{r}rGc3<01>,K<00>|] \}}||z<00><01><00>y<00>wr$r%<00>r'r<00>bs rr(zNTestInnerProductPreservation.test_inner_product_approximate.<locals>.<genexpr><3E>s<00><00><><00>2<><04><01>1<EFBFBD>a<EFBFBD>!<21>e<EFBFBD>2<><32><00>c3<01>,K<00>|] \}}||z<00><01><00>y<00>wr$r%r<>s rr(zNTestInnerProductPreservation.test_inner_product_approximate.<locals>.<genexpr><3E>s<00><00><><00>@<40>d<EFBFBD>a<EFBFBD><11>A<EFBFBD><01>E<EFBFBD>@<40>r<EFBFBD><00><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ư>g<00>?rZr~<00> rel_errorr<72>zInner product error too large: r<>ra)r<>r<>r r<>r/rmr<r@rrerfrgrhrirjrnrkrl)ror<>r<><00>q<>k<>true_ip<69>k_packed<65>k_norm<72> k_dequant<6E> compressed_ipr<70>rpr<>r<>r<>s r<00>test_inner_product_approximatez;TestInnerProductPreservation.test_inner_product_approximate<74>sA<00><00><15><0E> <0B> <0B>C<EFBFBD><18>+0<><13>:<3A> 6<>a<EFBFBD>V<EFBFBD>\<5C>\<5C>!<21>S<EFBFBD> !<21> 6<><01> 6<>+0<><13>:<3A> 6<>a<EFBFBD>V<EFBFBD>\<5C>\<5C>!<21>S<EFBFBD> !<21> 6<><01> 6<><16>2<><03>A<EFBFBD>q<EFBFBD> <09>2<>2<><07>5<>Q<EFBFBD>7<><18><08>&<26>-<2D>h<EFBFBD><06><03>D<> <09><1C>@<40>c<EFBFBD>!<21>Y<EFBFBD>.?<3F>@<40>@<40> <0A> <0F>w<EFBFBD><<3C>$<24> <1E><1B>G<EFBFBD>m<EFBFBD>3<>4<>s<EFBFBD>7<EFBFBD>|<7C>C<>I<EFBFBD>#<23> R<>9<EFBFBD>t<EFBFBD>#<23> R<> R<> R<>9<EFBFBD>t<EFBFBD> R<> R<> R<> R<> R<> R<>9<EFBFBD> R<> R<> R<>9<EFBFBD> R<> R<> R<>t<EFBFBD> R<> R<> R<>'F<>y<EFBFBD>k<EFBFBD>%R<> R<> R<> R<> R<> R<> R<> <1F><> 7<><37> 6s <00>F"<04> F'c<01><><00>ddl}|jd<03>td<04>D<00>cgc]}|jdd<05><00><02>}}t d<06>|D<00><00>}t |<03>\}}t ||d<04>}t d<07>|D<00><00>}|dkDr<>t||z
<00>|z } d }
| |
k} | s<>tjd
| fd | |
f<02>d tj<00>vstj| <09>rtj| <09>nd tj|
<EFBFBD>d <0A>z} tjd| <09><00><02>dzd| iz} ttj | <0A><00><00>dx} }
yycc}w)z=Self inner product (norm squared) is approximately preserved.rNi<4E>r<>rGc3<01>&K<00>|] }||z<00><01><00> y<00>wr$r%<00>r'rs rr(zGTestInnerProductPreservation.test_self_inner_product.<locals>.<genexpr><3E>s<00><00><><00>,<2C>Q<EFBFBD>1<EFBFBD>q<EFBFBD>5<EFBFBD>,<2C>r)c3<01>&K<00>|] }||z<00><01><00> y<00>wr$r%r<>s rr(zGTestInnerProductPreservation.test_self_inner_product.<locals>.<genexpr><3E>s<00><00><><00>3<>A<EFBFBD>!<21>a<EFBFBD>%<25>3<>r)r<>rDrZr~r<>r<>zNorm preservation error: r<>ra)r<>r<>r r<>r/r<r@rrerfrgrhrirjrnrkrl)ror<>r<>r<00> true_norm_sqr;r6ru<00> rec_norm_sqr<71>rpr<>r<>r<>s r<00>test_self_inner_productz4TestInnerProductPreservation.test_self_inner_product<63>s<><00><00><15><0E> <0B> <0B>C<EFBFBD><18>+0<><12>9<EFBFBD> 5<>a<EFBFBD>V<EFBFBD>\<5C>\<5C>!<21>S<EFBFBD> !<21> 5<><01> 5<><1A>,<2C>!<21>,<2C>,<2C> <0C>0<><11>3<> <0C><06><04>-<2D>f<EFBFBD>d<EFBFBD>B<EFBFBD>?<3F> <09><19>3<><19>3<>3<> <0B> <17>$<24> <1E><1B>L<EFBFBD>;<3B>6<>7<>,<2C>F<>I<EFBFBD>"<22> K<>9<EFBFBD>s<EFBFBD>?<3F> K<> K<> K<>9<EFBFBD>s<EFBFBD> K<> K<> K<> K<> K<> K<>9<EFBFBD> K<> K<> K<>9<EFBFBD> K<> K<> K<>s<EFBFBD> K<> K<> K<>&?<3F> <09>{<7B>$K<> K<> K<> K<> K<> K<> K<> <1F><> 6s<00>EN)r<>r<>r<>r<>r<>r<>r%rrr<>r<><00>s<00><00>Y<>S<01>,Lrr<>c<01>"<00>eZdZdZd<02>Zd<03>Zd<04>Zy)<06>TestWHTOrthogonalityu1WHT^T · WHT = I — the transform is orthogonal.c <01>d<00>gd<01>}t|<01>}t|<01>t|<01>t||<01>D<00>]{\}}||z
}t|<05>}d}||k}|<08>sSt j
d|fd||f<02>dt j<00>vst jt<00>rt jt<00>nddt j<00>vst j|<03>rt j|<03>nddt j<00>vst j|<04>rt j|<04>ndt j|<06>t j|<07>d<08>z} t jd |<03>d
|<04><00><04>d zd | iz}
tt j|
<EFBFBD><00><00>d x}x}x}}<07><01>~y )z9Applying WHT twice (forward = inverse) recovers original.)r r><00><00><>rDrNrFrHg<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rGrKrLg333333<33>?rErMgffffff<66><66>rIr<>rZr\rr]r^r_z WHT^2 != I: rbrcrdN) r.rrmrrerfrgrhrirjrnrkrl) ror3<00>originalr]r^rvrrrwrxrtrys r<00>test_wht_is_orthogonal_16z.TestWHTOrthogonality.test_wht_is_orthogonal_16<31>s
<00><00>:<3A><03><17><03>9<EFBFBD><08> <0A>S<EFBFBD> <09> <0C>S<EFBFBD> <09><1C>X<EFBFBD>s<EFBFBD>+<2B> J<01>I<EFBFBD>D<EFBFBD>#<23><1B>c<EFBFBD>z<EFBFBD> I<>3<EFBFBD>z<EFBFBD>?<3F> I<>T<EFBFBD> I<>?<3F>T<EFBFBD>)<29> I<> I<> I<>?<3F>T<EFBFBD> I<> I<> I<> I<> I<> I<>3<EFBFBD> I<> I<> I<>3<EFBFBD> I<> I<> I<> I<> I<> I<>t<EFBFBD> I<> I<> I<>t<EFBFBD> I<> I<> I<> I<> I<> I<>c<EFBFBD> I<> I<> I<>c<EFBFBD> I<> I<> I<>?<3F> I<> I<> I<>T<EFBFBD> I<> I<> I<>\<5C>$<24><16>t<EFBFBD>C<EFBFBD>5<EFBFBD>+I<> I<> I<> I<> I<> I<> I<> I<> Jrc<01><><00>ddl}|jd<03>td<04>D<00>cgc]}|jdd<05><00><02>}}t d<06>|D<00><00>}t |<03>t d<07>|D<00><00>}||z
}t |<06>}d}||k} | <09>sStjd | fd
||f<02>d tj<00>vstjt <00>rtjt <00>nd d tj<00>vstj|<04>rtj|<04>nd d tj<00>vstj|<05>rtj|<05>nd tj|<07>tj|<08>d<0E>z}
tjd|<04>d|<05><00><04>dzd|
iz} ttj| <0B><00><00>dx}x}x} }ycc}w)z!WHT preserves L2 norm (isometry).rNir<>r c3<01>&K<00>|] }||z<00><01><00> y<00>wr$r%r&s rr(z?TestWHTOrthogonality.test_wht_preserves_norm.<locals>.<genexpr>s<00><00><><00>.<2E>Q<EFBFBD>1<EFBFBD>q<EFBFBD>5<EFBFBD>.<2E>r)c3<01>&K<00>|] }||z<00><01><00> y<00>wr$r%r&s rr(z?TestWHTOrthogonality.test_wht_preserves_norm.<locals>.<genexpr>
r<>r)g-C<1C><>6?rZr\r<00> orig_norm_sq<73> wht_norm_sqr_zWHT doesn't preserve norm: rbrcrd)r<>r<>r r<>r/rrrerfrgrhrirjrnrkrl) ror<>r<>r3r<>r<>rvrrrwrxrtrys r<00>test_wht_preserves_normz,TestWHTOrthogonality.test_wht_preserves_norms<><00><00><15><0E> <0B> <0B>C<EFBFBD><18>-2<>2<EFBFBD>Y<EFBFBD>7<><01>v<EFBFBD>|<7C>|<7C>A<EFBFBD>s<EFBFBD>#<23>7<><03>7<><1A>.<2E>#<23>.<2E>.<2E> <0C> <0C>S<EFBFBD> <09><19>-<2D><13>-<2D>-<2D> <0B> <20>+<2B>-<2D>
<EFBFBD>s<EFBFBD>-<2D>.<2E>
<EFBFBD><14>
<EFBFBD>.<2E><14>5<>
<EFBFBD>
<EFBFBD><04><00>
<EFBFBD>.<2E><14>
<EFBFBD>
<EFBFBD> <09>6<EFBFBD>
<EFBFBD>
<EFBFBD><04><00><13>
<EFBFBD>
<EFBFBD> <09> <09><13>
<EFBFBD>
<EFBFBD> <09>6<EFBFBD>
<EFBFBD>
<EFBFBD><04><00> <20>
<EFBFBD>
<EFBFBD> <09> <09> <20>
<EFBFBD>
<EFBFBD> <09>6<EFBFBD>
<EFBFBD>
<EFBFBD><04><00>#.<2E>
<EFBFBD>
<EFBFBD> <09> <09>#.<2E>
<EFBFBD>
<EFBFBD> <09> <09>/<2F>
<EFBFBD>
<EFBFBD> <09> <09>26<32>
<EFBFBD>
<EFBFBD><04><00>*<2A>,<2C><1E>t<EFBFBD>K<EFBFBD>=<3D> I<>
<EFBFBD>
<EFBFBD>
<EFBFBD><04><00>
<EFBFBD>
<EFBFBD>
<EFBFBD><EFBFBD>8s<00>G#c <01>T<00>dgdgdzz}t|<01>dtjd<04>z }|D<00>]u}||z
}t|<04>}d}||k}|<07>sPt j
d|fd||f<02>dt j<00>vst jt<00>rt jt<00>ndd t j<00>vst j|<03>rt j|<03>nd d
t j<00>vst j|<02>rt j|<02>nd
t j|<05>t j|<06>d <0B>z}t jd |<03><00><02>d zd|iz} tt j| <09><00><00>dx}x}x}}<06><01>xy)z-WHT of [1,0,0,...] produces equal components.r r>r+rr<>rZr\rr<00>expectedr_zWHT identity vector wrong: rcrdN) rr r rrerfrgrhrirjrnrkrl)
ror3r<>rrvrrrwrxrtrys
r<00>test_wht_identity_vectorz-TestWHTOrthogonality.test_wht_identity_vectors <00><00><12>e<EFBFBD>s<EFBFBD>e<EFBFBD>b<EFBFBD>j<EFBFBD> <20><03> <0C>S<EFBFBD> <09><17><14><19><19>2<EFBFBD><1D>&<26><08><16> S<01>C<EFBFBD><1A>X<EFBFBD>~<7E> R<>3<EFBFBD>~<7E>&<26> R<><14> R<>&<26><14>-<2D> R<> R<> R<>&<26><14> R<> R<> R<> R<> R<> R<>3<EFBFBD> R<> R<> R<>3<EFBFBD> R<> R<> R<> R<> R<> R<>s<EFBFBD> R<> R<> R<>s<EFBFBD> R<> R<> R<> R<> R<> R<>X<EFBFBD> R<> R<> R<>X<EFBFBD> R<> R<> R<>&<26> R<> R<> R<><14> R<> R<> R<>1L<31>S<EFBFBD>E<EFBFBD>/R<> R<> R<> R<> R<> R<> R<> R<> SrN)r<>r<>r<>r<>r<>r<>r<>r%rrr<>r<><00>s<00><00>;<3B> J<01> 
<EFBFBD>Srr<>c<01>.<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zd<06>Zy)<08>TestCodebookCorrectnessz*Centroids match Lloyd-Max for N(0, 1/128).c<01><<00>tt<00>}d}||k(}|s<>tjd|fd||f<02>dt j
<00>vstj t<00>rtjt<00>nddt j
<00>vstj t<00>rtjt<00>ndtj|<01>tj|<02>d<06>z}dd|iz}ttj|<05><00><00>d x}x}}y )
z(4-bit codebook has exactly 16 centroids.rrPrRr
rrSrXrYN)
r
rrerfrgrhrirjrkrl)rorprqrrrsrts r<00>test_codebook_has_16_entriesz4TestCodebookCorrectness.test_codebook_has_16_entries#s<><00><00><12>#<23>$<24>*<2A><02>*<2A>$<24><02>*<2A>*<2A>*<2A>*<2A>$<24><02>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>s<EFBFBD>*<2A>*<2A>*<2A>s<EFBFBD>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>#<23>*<2A>*<2A>*<2A>#<23>*<2A>*<2A>*<2A>$<24>*<2A>*<2A>*<2A><02>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*rc <01>N<00>td<01>D<00>]<5D>}t|}td|z
}||z}t|<04>}d}||k}|<07>s\tjd|fd||f<02>dt j <00>vstjt<00>rtjt<00>nddt j <00>vstj|<02>rtj|<02>nddt j <00>vstj|<03>rtj|<03>ndtj|<05>tj|<06>d <09>z}tjd
|<01>d |<02>d d|z
<00>d |<03><00><08>d zd|iz} ttj| <09><00><00>dx}x}x}}<06><01><>y)z8Centroids should be approximately symmetric around zero.<2E>r+rMrZ)z;%(py5)s
{%(py5)s = %(py0)s((%(py1)s + %(py2)s))
} < %(py8)sr<00>neg<65>posr_z!Codebook not symmetric: centroid[z]=z , centroid[rcrdN) r rrrerfrgrhrirjrnrkrl)
rorr<>r<>rvrrrwrxrtrys
r<00>test_codebook_is_symmetricz2TestCodebookCorrectness.test_codebook_is_symmetric's<><00><00><16>q<EFBFBD><18> <0E>A<EFBFBD>"<22>1<EFBFBD>%<25>C<EFBFBD>"<22>2<EFBFBD><01>6<EFBFBD>*<2A>C<EFBFBD><1A>S<EFBFBD>y<EFBFBD> <0E>3<EFBFBD>y<EFBFBD>><3E> <0E>C<EFBFBD> <0E>><3E>C<EFBFBD>'<27> <0E> <0E><04><00> <0E>><3E>C<EFBFBD> <0E> <0E> <0A>v<EFBFBD> <0E> <0E><04><00><17> <0E> <0E> <0A>I<EFBFBD><17> <0E> <0E> <0A>v<EFBFBD> <0E> <0E><04><00><1B> <0E> <0E> <0A>I<EFBFBD><1B> <0E> <0E> <0A>v<EFBFBD> <0E> <0E><04><00>!<21> <0E> <0E> <0A>I<EFBFBD>!<21> <0E> <0E> <0A>I<EFBFBD>"<22> <0E> <0E> <0A>I<EFBFBD>%(<28> <0E> <0E><04><00>4<>A<EFBFBD>3<EFBFBD>b<EFBFBD><13><05>[<5B><12>A<EFBFBD><14><06>b<EFBFBD>QT<51>PU<50>V<> <0E> <0E> <0E><04><00> <0E> <0E> <0E>  rc<01><><00>tdd<02>D]<5D>}t|}t|dz
}||kD}|s<>tjd|fd||f<02>tj|<02>tj|<03>d<05>z}tj
dt|dz
<00>dt|<00><00><04>dzd |iz}t tj|<06><00><00>d
x}x}}<03><>y
) z%Centroids must be in ascending order.rrr<><00>z%(py1)s > %(py4)s<>rU<00>py4zCodebook not ordered: z >= <20>
>assert %(py6)srWN)r rrerfrjrnrkrl)ror<00> @py_assert0rvrp<00> @py_format5rss r<00>test_codebook_is_orderedz0TestCodebookCorrectness.test_codebook_is_ordered1s<><00><00><16>q<EFBFBD>"<22><1C> <0E>A<EFBFBD>#<23>A<EFBFBD>&<26> <0E>)9<>!<21>a<EFBFBD>%<25>)@<40> <0E>&<26>)@<40>@<40> <0E><04><00> <0E>&<26>)@<40> <0E> <0E> <0A>I<EFBFBD>'<27> <0E> <0E> <0A>I<EFBFBD>*A<01> <0E> <0E><04><00>)<29>)9<>!<21>A<EFBFBD>#<23>)><3E>(?<3F>t<EFBFBD>DT<44>UV<55>DW<44>CX<43>Y<> <0E> <0E> <0E><04><00> <0E> <0E> <0E> rc<01><><00>td}d}| }||k}|s<>tjd|fd||f<02>tj|<01>tj|<02>d<05>z}tjdtd<00><00><02>dzd|iz}t tj |<06><00><00>d x}x}x}}td
}d }||kD}|s<>tjd |fd ||f<02>tj|<01>tj|<02>d<05>z}tjdtd
<00><00><02>dzd|iz}t tj |<08><00><00>d x}x}}y )z1Codebook should span approximately [-0.35, 0.35].rg333333<33>?rZ)z%(py1)s < -%(py4)sr<73>zMin centroid too high: z
>assert %(py7)sr<73>N<><4E><EFBFBD><EFBFBD><EFBFBD>g<00>?r<>r<>zMax centroid too low: r<>rW)rrerfrjrnrkrl) ror<>rvrqrpr<>r<>r<>rss r<00>test_codebook_covers_unit_rangez7TestCodebookCorrectness.test_codebook_covers_unit_range8s<><00><00><1F><01>"<22>[<5B>d<EFBFBD>[<5B>d<EFBFBD>U<EFBFBD>[<5B>"<22>U<EFBFBD>*<2A>[<5B>[<5B>[<5B>"<22>U<EFBFBD>[<5B>[<5B>[<5B>"<22>[<5B>[<5B>[<5B>d<EFBFBD>[<5B>[<5B>[<5B>.E<>FV<46>WX<57>FY<46>EZ<45>,[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B><1F><02>#<23>[<5B>d<EFBFBD>[<5B>#<23>d<EFBFBD>*<2A>[<5B>[<5B>[<5B>#<23>d<EFBFBD>[<5B>[<5B>[<5B>#<23>[<5B>[<5B>[<5B>d<EFBFBD>[<5B>[<5B>[<5B>.D<>EU<45>VX<56>EY<45>DZ<44>,[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[rc <01><><00>dD]<5D>}t|<01>}d}||k}d}||k}|r|s<>tjd||fd|||f<03>tj|<03>dt j
<00>vstj |<02>rtj|<02>ndtj|<05>d<07>z}tjd|<02>d |<01><00><04>d
zd |iz}ttj|<08><00><00>d x}x}x}}<05><>y ) z8All quantized values map to valid 4-bit indices [0, 15].)r<>rOrJr>rGrDr rr+<00><02><=r<><00>z%(py1)s <= %(py4)sz%(py4)s <= %(py6)sr:<00>rUr<>rWzIndex out of range: z for value r<>rYN)
r!rerfrjrgrhrirnrkrl) rorr:r<>rprqrvrsrts r<00>#test_quantize_maps_to_valid_indicesz;TestCodebookCorrectness.test_quantize_maps_to_valid_indices=s<><00><00>9<> P<01>C<EFBFBD> <20><13>%<25>C<EFBFBD><14> O<>1<EFBFBD><03>><3E> O<>r<EFBFBD> O<><03>r<EFBFBD>><3E> O<> O<> O<> O<>1<EFBFBD><03>r<EFBFBD> O<> O<> O<>1<EFBFBD> O<> O<> O<> O<> O<> O<><03> O<> O<> O<><03> O<> O<> O<>r<EFBFBD> O<> O<> O<>%9<>#<23><15>k<EFBFBD>#<23><15>#O<> O<> O<> O<> O<> O<> O<> O<> PrN) r<>r<>r<>r<>r<>r<>r<>r<>r<>r%rrr<>r<> s <00><00>4<>+<2B><0E><0E>\<01>
Prr<>c<01>(<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zy)<07>TestBitPackingz#No buffer overflows in bit packing.c <01>h<00>dD<00>]<5D>}ddl}|j|<01>t|<01>D<00>cgc]}|jdd<04><00><02>}}t |<04>\}}t |<05>}d}||z}||k(} | <09>s7t jd| fd||f<02>dtj<00>vst jt
<00>rt jt
<00>ndd tj<00>vst j|<05>rt j|<05>nd t j|<06>d
tj<00>vst j|<01>rt j|<01>nd
t j|<07>d <0B>z}
d d |
iz} tt j| <0B><00><00>dx}x} x}}<08><01><>ycc}w)z$4-bit packing halves the byte count.r<>rNrGrrPr<>r
r;r<>r<>r<>rd)r<>r<>r r<>r<r
rerfrgrhrirjrkrl) ror<>r<>r<>r3r;rprxr<>rrrtrys r<00>test_packed_size_is_halfz'TestBitPacking.test_packed_size_is_halfKs <00><00>$<24> +<2B>C<EFBFBD> <19> <12>K<EFBFBD>K<EFBFBD><03> <1C>16<31>s<EFBFBD><1A><<3C>A<EFBFBD>6<EFBFBD><<3C><<3C><01>3<EFBFBD>'<27><<3C>C<EFBFBD><<3C>1<>#<23>6<>I<EFBFBD>F<EFBFBD>A<EFBFBD><16>v<EFBFBD>;<3B> *<2A><11> *<2A>#<23><11>(<28> *<2A>;<3B>(<28>*<2A> *<2A> *<2A> *<2A>;<3B>(<28> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A>3<EFBFBD> *<2A> *<2A> *<2A>3<EFBFBD> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A>v<EFBFBD> *<2A> *<2A> *<2A>v<EFBFBD> *<2A> *<2A> *<2A>;<3B> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A>#<23> *<2A> *<2A> *<2A>#<23> *<2A> *<2A> *<2A><11> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A>  +<2B><>=s<00>F/c <01><><00>td<01>D<00>cgc]}|dzdk(rdnd<05><02>}}t|<02>\}}tddd<02>D<00>]<5D>}|dz}||dz}||dz dz}d}||k} d}
||
k} | r| s<>tjd| | fd |||
f<03>tj|<08>d
t j <00>vstj|<06>rtj|<06>nd
tj|
<EFBFBD>d <0B>z} d d | iz} ttj| <0A><00><00>dx}x} x} }
d}||k} d}
||
k} | r| s<>tjd| | fd |||
f<03>tj|<08>dt j <00>vstj|<07>rtj|<07>ndtj|
<EFBFBD>d <0B>z} d d | iz} ttj| <0A><00><00>dx}x} x} }
<EFBFBD><01><>ycc}w)z0Even-indexed values go in low nibble (bits 0-3).rrrr>r r+r,r<>r<><00>
low_nibbler<EFBFBD>rXrYN<> high_nibble)
r r<rerfrjrgrhrirkrl)rorr3r;r<><00>byte_idxrrr<>rprqrvrsrts r<00>test_even_index_in_low_nibblez,TestBitPacking.test_even_index_in_low_nibbleTst<00><00>49<34><12>9<EFBFBD>=<3D>a<EFBFBD>a<EFBFBD>!<21>e<EFBFBD>q<EFBFBD>j<EFBFBD>s<EFBFBD>c<EFBFBD>)<29>=<3D><03>=<3D>-<2D>c<EFBFBD>2<> <09><06><01><17>q<EFBFBD>"<22>a<EFBFBD><1F> *<2A>A<EFBFBD><18>A<EFBFBD>v<EFBFBD>H<EFBFBD><1F><08>)<29>D<EFBFBD>0<>J<EFBFBD>!<21>(<28>+<2B>q<EFBFBD>0<>D<EFBFBD>8<>K<EFBFBD><15> (<28>1<EFBFBD>
<EFBFBD>(<28> (<28>b<EFBFBD> (<28>
<EFBFBD>b<EFBFBD>(<28> (<28> (<28> (<28> (<28>1<EFBFBD>
<EFBFBD>b<EFBFBD> (<28> (<28> (<28>1<EFBFBD> (<28> (<28> (<28> (<28> (<28> (<28>
<EFBFBD> (<28> (<28> (<28>
<EFBFBD> (<28> (<28> (<28>b<EFBFBD> (<28> (<28> (<28> (<28> (<28> (<28> (<28><14> )<29>1<EFBFBD> <0B>)<29> )<29>r<EFBFBD> )<29> <0B>r<EFBFBD>)<29> )<29> )<29> )<29> )<29>1<EFBFBD> <0B>r<EFBFBD> )<29> )<29> )<29>1<EFBFBD> )<29> )<29> )<29> )<29> )<29> )<29> <0B> )<29> )<29> )<29> <0B> )<29> )<29> )<29>r<EFBFBD> )<29> )<29> )<29> )<29> )<29> )<29> )<29> *<2A><> >s<00>G0c<01><><00>tdg<01>}|ddz}|ddz }d}||k(}|s<>tjd|fd||f<02>dtj<00>vstj
|<02>rtj |<02>ndtj |<04>d <09>z}tjd
|<02><00><02>d zd |iz}ttj|<07><00><00>d x}}d}||k(}|s<>tjd|fd||f<02>dtj<00>vstj
|<03>rtj |<03>ndtj |<04>d <09>z}tjd|<03><00><02>d zd |iz}ttj|<07><00><00>d x}}t|}td}||z
} t| <09>}
d} |
| k} | s<>tjd| fd|
| f<02>dtj<00>vstj
t<00>rtj t<00>ndtj |<05>tj |<08>tj |
<EFBFBD>tj | <0B>d<15>z} dd| iz}ttj|<0E><00><00>d x}x}x} x}
x} } t|}td}||z
} t| <09>}
d} |
| k} | s<>tjd| fd|
| f<02>dtj<00>vstj
t<00>rtj t<00>ndtj |<05>tj |<08>tj |
<EFBFBD>tj | <0B>d<15>z} dd| iz}ttj|<0E><00><00>d x}x}x} x}
x} } y )z9Decode correctly unpacks low and high nibbles before WHT.<2E><>rr+r,<00>
rP)z%(py0)s == %(py3)s<>low_idxr<78>zLow nibble wrong: r<>raN<> <00>high_idxzHigh nibble wrong: r*rZ)z<%(py7)s
{%(py7)s = %(py0)s((%(py2)s - %(py4)s))
} < %(py10)sr)rTr`r<>r<>rdzassert %(py12)s<>py12) r2rerfrgrhrirjrnrkrlrr)ror;r r rpr<>r<>r<>rvrqrxr<>r<>ry<00> @py_format13s r<00>$test_decode_extracts_correct_nibblesz3TestBitPacking.test_decode_extracts_correct_nibblesdsZ<00><00><17><04>v<EFBFBD><1D><06><19><11>)<29>d<EFBFBD>"<22><07><19>!<21>9<EFBFBD><01>><3E><08><1C><<3C>w<EFBFBD>"<22>}<7D><<3C><<3C><<3C>w<EFBFBD>"<22><<3C><<3C><<3C><<3C><<3C><<3C>w<EFBFBD><<3C><<3C><<3C>w<EFBFBD><<3C><<3C><<3C>"<22><<3C><<3C><<3C> 2<>7<EFBFBD>)<29><<3C><<3C><<3C><<3C><<3C><<3C><<3C><1D>?<3F>x<EFBFBD>2<EFBFBD>~<7E>?<3F>?<3F>?<3F>x<EFBFBD>2<EFBFBD>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>x<EFBFBD>?<3F>?<3F>?<3F>x<EFBFBD>?<3F>?<3F>?<3F>2<EFBFBD>?<3F>?<3F>?<3F>!4<>X<EFBFBD>J<EFBFBD>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>$<24>G<EFBFBD>,<2C>K<>/?<3F><02>/C<>K<>,<2C>/C<>C<>K<>s<EFBFBD>C<>D<>K<>t<EFBFBD>K<>D<>t<EFBFBD>K<>K<>K<>K<>D<>t<EFBFBD>K<>K<>K<>K<>K<>K<>s<EFBFBD>K<>K<>K<>s<EFBFBD>K<>K<>K<>,<2C>K<>K<>K<>/C<>K<>K<>K<>D<>K<>K<>K<>t<EFBFBD>K<>K<>K<>K<>K<>K<>K<>K<>#<23>H<EFBFBD>-<2D>L<>0@<40><12>0D<30>L<>-<2D>0D<30>D<>L<>s<EFBFBD>D<>E<>L<><04>L<>E<><04>L<>L<>L<>L<>E<><04>L<>L<>L<>L<>L<>L<>s<EFBFBD>L<>L<>L<>s<EFBFBD>L<>L<>L<>-<2D>L<>L<>L<>0D<30>L<>L<>L<>E<>L<>L<>L<><04>L<>L<>L<>L<>L<>L<>L<>Lrc<01><><00>d}ddl}|jd<04>t|<01>D<00>cgc]}|jdd<05><00><02>}}t |<04>\}}t |||<01>}t |<07>}||k(} | <09>s#tjd| fd||f<02>dtj<00>vstjt <00>rtjt <00>ndd tj<00>vstj|<07>rtj|<07>nd tj|<08>d
tj<00>vstj|<01>rtj|<01>nd
d <0B>z}
d d |
iz} ttj| <0B><00><00>dx}} d<0E>|D<00>} t| <0C>} | s<>ddtj<00>vstjt<00>rtjt<00>ndtj| <0C>tj| <0A>d<11>z}ttj|<0E><00><00>dx} } ycc}w)z2No overflow with maximum typical dimension (4096).irNi<4E>rGrPr<>r
rur<>r<>r<>r<>c3<01>FK<00>|]}tj|<01><00><01><00>y<00>wr$<00>r <00>isfiniter&s rr(z@TestBitPacking.test_max_dimension_no_overflow.<locals>.<genexpr>~<00><00><00><><00>7<><01>4<EFBFBD>=<3D>=<3D><11>#<23>7<><37><00>!<01>,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}<7D>all<6C>rTr`r<>)r<>r<>r r<>r<r@r
rerfrgrhrirjrkrlr)ror<>r<>r<>r3r;r6rurprrr<>r<>r<>rvr<>s r<00>test_max_dimension_no_overflowz-TestBitPacking.test_max_dimension_no_overflowusS<00><00><12><03><15><0E> <0B> <0B>C<EFBFBD><18>-2<>3<EFBFBD>Z<EFBFBD>8<><01>v<EFBFBD>|<7C>|<7C>A<EFBFBD>s<EFBFBD>#<23>8<><03>8<>0<><13>5<> <0C><06><04>-<2D>f<EFBFBD>d<EFBFBD>C<EFBFBD>@<40> <09><12>9<EFBFBD>~<7E>$<24>~<7E><13>$<24>$<24>$<24>$<24>~<7E><13>$<24>$<24>$<24>$<24>$<24>$<24>s<EFBFBD>$<24>$<24>$<24>s<EFBFBD>$<24>$<24>$<24>$<24>$<24>$<24>9<EFBFBD>$<24>$<24>$<24>9<EFBFBD>$<24>$<24>$<24>~<7E>$<24>$<24>$<24>$<24>$<24>$<24><13>$<24>$<24>$<24><13>$<24>$<24>$<24>$<24>$<24>$<24>$<24>7<>Y<EFBFBD>7<>7<>s<EFBFBD>7<>7<>7<>7<>7<>7<>7<>7<>7<>s<EFBFBD>7<>7<>7<>s<EFBFBD>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<><37> 9s<00>IN)r<>r<>r<>r<>rrrrr%rrr<>r<>Hs<00><00>-<2D>+<2B>*<2A> M<01>" 8rr<>c<01>(<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zy)<07> TestEdgeCasesz#Edge cases and boundary conditions.c<01><><00>tjtttf<03>5dg}t |<01>ddd<02>y#1swYyxYw)z@Non-power-of-2 dimension should still work (or fail gracefully).r N)r<><00>raises<65>
ValueError<EFBFBD>
IndexError<EFBFBD>ZeroDivisionErrorr<)ror3s r<00> test_single_element_vector_failsz.TestEdgeCases.test_single_element_vector_fails<6C>s<<00><00><14>]<5D>]<5D>J<EFBFBD>
<EFBFBD>4E<EFBFBD>F<> G<> +<2B><16>%<25>C<EFBFBD> %<25>c<EFBFBD> *<2A> +<2B> +<2B> +<2B>s <00>=<03>Ac <01>8<00>dgdz}t|<01>\}}t||d<02>}t|<04>t|<04>z }|D<00>]\}||z
}t |<07>}d} || k}
|
<EFBFBD>s7t j d|
fd|| f<02>dtj<00>vst jt<00>rt jt<00>nddtj<00>vst j|<06>rt j|<06>nddtj<00>vst j|<05>rt j|<05>ndt j|<08>t j| <09>d <09>z} d
d | iz} tt j| <0C><00><00>d x}x}x}
} <09><01>_y ) z!Vector with all identical values.rDrrGrZr\rr<00>meanr_r<>rdN) r<r@r/r
rrerfrgrhrirjrkrl) ror3r;r6rur"rrvrrrwrxrtrys r<00>test_all_same_valuesz"TestEdgeCases.test_all_same_values<65>s<><00><00><12>e<EFBFBD>b<EFBFBD>j<EFBFBD><03>0<><13>5<> <0C><06><04>-<2D>f<EFBFBD>d<EFBFBD>B<EFBFBD>?<3F> <09><12>9<EFBFBD>~<7E><03>I<EFBFBD><0E>.<2E><04><1C> )<29>C<EFBFBD><1A>T<EFBFBD>z<EFBFBD> (<28>3<EFBFBD>z<EFBFBD>?<3F> (<28>S<EFBFBD> (<28>?<3F>S<EFBFBD>(<28> (<28> (<28> (<28>?<3F>S<EFBFBD> (<28> (<28> (<28> (<28> (<28> (<28>3<EFBFBD> (<28> (<28> (<28>3<EFBFBD> (<28> (<28> (<28> (<28> (<28> (<28>s<EFBFBD> (<28> (<28> (<28>s<EFBFBD> (<28> (<28> (<28> (<28> (<28> (<28>T<EFBFBD> (<28> (<28> (<28>T<EFBFBD> (<28> (<28> (<28>?<3F> (<28> (<28> (<28>S<EFBFBD> (<28> (<28> (<28> (<28> (<28> (<28> (<28> )rc<01><><00>gd<01>}t|<01>\}}tj}||<03>}|s<>ddtj<00>vst j t<00>rt jt<00>ndt j|<04>dtj<00>vst j |<03>rt j|<03>ndt j|<05>d<05>z}tt j|<06><00><00>dx}}t||d<07>}d<08>|D<00>}t|<04>}|s<>d d
tj<00>vst j t<00>rt jt<00>nd
t j|<04>t j|<08>d <0B>z} tt j| <09><00><00>dx}}y) z'Large input values don't cause NaN/Inf.)gY@gY<>gI@gI<>g9@g9<>g$@g$<24>g@g<14>g@g<00>r r<>rDrOzJassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.isfinite
}(%(py3)s)
}r r6)rTr`rVraNrc3<01>FK<00>|]}tj|<01><00><01><00>y<00>wr$rr&s rr(z2TestEdgeCases.test_large_values.<locals>.<genexpr><3E>rrrrr) r<r rrgrhrerirjrkrlr@r)
ror3r;r6r<>rrr<>rurvr<>s
r<00>test_large_valueszTestEdgeCases.test_large_values<65>s<><00><00>;<3B><03>0<><13>5<> <0C><06><04><13>}<7D>}<7D>"<22>}<7D>T<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>t<EFBFBD>"<22>"<22>"<22>t<EFBFBD>"<22>"<22>"<22>}<7D>"<22>"<22>"<22>"<22>"<22>"<22>T<EFBFBD>"<22>"<22>"<22>T<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>-<2D>f<EFBFBD>d<EFBFBD>B<EFBFBD>?<3F> <09>7<>Y<EFBFBD>7<>7<>s<EFBFBD>7<>7<>7<>7<>7<>7<>7<>7<>7<>s<EFBFBD>7<>7<>7<>s<EFBFBD>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7rc<01><><00>td<01>D<00>cgc]
}d|zdz<00><02> }}t|<02>\}}t||d<01>}d<04>|D<00>}t|<06>}|s<>ddt j
<00>vst jt<00>rt jt<00>ndt j|<06>t j|<07>d<07>z}tt j|<08><00><00>dx}}ycc}w) z%Alternating positive/negative values.rr<>rGc3<01>FK<00>|]}tj|<01><00><01><00>y<00>wr$rr&s rr(z7TestEdgeCases.test_alternating_signs.<locals>.<genexpr><3E>rrrrrN) r r<r@rrgrhrerirjrkrl) rorr3r;r6rur<>rvr<>s r<00>test_alternating_signsz$TestEdgeCases.test_alternating_signs<6E>s<><00><00>(-<2D>b<EFBFBD> <09>2<>1<EFBFBD><02>q<EFBFBD>y<EFBFBD>3<EFBFBD><EFBFBD>2<><03>2<>0<><13>5<> <0C><06><04>-<2D>f<EFBFBD>d<EFBFBD>B<EFBFBD>?<3F> <09>7<>Y<EFBFBD>7<>7<>s<EFBFBD>7<>7<>7<>7<>7<>7<>7<>7<>7<>s<EFBFBD>7<>7<>7<>s<EFBFBD>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<>7<><37>3s<00>C*N)r<>r<>r<>r<>r r#r&r)r%rrrr<00>s<00><00>-<2D>+<2B>)<29>8<>8rr)r<00> List[float]<5D>returnr*)r<00>floatr+r<>)r3r*r+zTuple[bytes, float])r3r2r6r,r4r<>r+r*)r<><00>
__future__r<00>builtinsrg<00>_pytest.assertion.rewrite<74> assertion<6F>rewriterer <00>struct<63>typingrrr<>rrr!r<r@rBr<>r<>r<>r<>rr%rr<00><module>r4s<><00><01><04>#<23><00><00> <0B> <0A><1E> <0A><02><10> <0A>0 <14><1F>@<0F>,B%<25>B%<25>R(L<01>(L<01>^'S<01>'S<01>\!P<01>!P<01>P68<>68<>z"8<>"8r