Ë
    Bp±j  ã                   óŠ   — d Z ddlZddlmc mZ ddlZddl	Z
ddlZddlmZ ddlmZmZmZ d
d„Z G d„ d«      Z G d„ d	«      Zy)að  
TDD RED tests for the MLP weights artifact (save/load) and FEATURE_COLS contract
in strategies/strategy_mlp_scores.py.

Contract under test:
  - FEATURE_COLS: the 49 CSV column names in the exact order produced by
    strategies.strategy_activation_scores._prepare_features (which the MLP
    strategy reuses). This is the single source of truth for feature order.
  - save_mlp_artifact / load_mlp_artifact: JSON round-trip is bit-exact for
    float64 weights; load is cached by (path, mtime).
é    N©Ú_prepare_features)ÚFEATURE_COLSÚload_mlp_artifactÚsave_mlp_artifactc           
      óþ   — t         j                  j                  |«      }t        t	        | «      dz
  «      D �cg c]9  }|j                  d| |dz      | |   f¬«      |j                  d| |dz      ¬«      f‘Œ; c}S c c}w )Né   ç      à?)ÚscaleÚsizegš™™™™™¹?)ÚnpÚrandomÚdefault_rngÚrangeÚlenÚnormal)ÚarchÚseedÚrngÚis       úh/Users/jameslopez/projects/TradingBot25/.worktrees/mlp-comparable-measurement/tests/test_mlp_artifact.pyÚ_random_layersr      s‡   € Ü
�)‰)×
Ñ
 Ó
%€Cô ”s˜4“y 1‘}Ô%óñ &ˆAð 
�‰˜# T¨!¨a©%¡[°$°q±'Ð$:ˆÓ	;Ø	�‰˜# D¨¨Q©¡KˆÓ	0ò	2à%ñð ùò s   ¹>A:c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚTestFeatureColsc                 ó<  — t        t        «      }d}||k(  }|sþt        j                  d|fd||f«      dt	        j
                  «       v st        j                  t         «      rt        j                  t         «      nddt	        j
                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )	Né7   ©ú==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   r   )Úpy0Úpy1Úpy3Úpy6zassert %(py8)sÚpy8)
r   r   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)ÚselfÚ@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9s         r   Útest_length_is_55z!TestFeatureCols.test_length_is_55"   s”   € ô ”<Ó Ð& BÐ&Ð  BÑ&×&×&Õ&Ð  B×&×&×&×&×&Ñ&Œs×&×&Ó&Œs×&×&×&×&×&Ò&”<×&×&Ó&”<×&×&Ô&Ð ×&×&Ò& B×&×&×&×&×&×&Ô&ó    c           	      óú  — t        t        «      D ��ci c]  \  }}|t        |dz   «      dz  “Œ }}}t        j                  |g«      }ddlm}  ||t        ¬«      }|j                  }d}||k(  }	|	s­t        j                  d|	fd||f«      d	t        j                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      t        j                  |«      d
œz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}	}t!        j"                  t        D �cg c]  }||   ‘Œ	 c}«      }t         j$                  j'                  |d   |«       y c c}}w c c}w )Nr	   g      Y@r   r   )Úfeature_cols)r	   r   r   )z-%(py2)s
{%(py2)s = %(py0)s.shape
} == %(py5)sÚX)r   Úpy2Úpy5zassert %(py7)sÚpy7)Ú	enumerater   ÚfloatÚpdÚ	DataFrameÚ%strategies.strategy_activation_scoresr   Úshaper$   r%   r&   r'   r(   r)   r*   r+   r   ÚarrayÚtestingÚassert_array_equal)r,   r   ÚcolÚvaluesÚdfÚ_pfr6   Ú@py_assert1r/   Ú@py_assert3Ú@py_format6Ú@py_format8ÚcÚexpecteds                 r   Ú#test_order_matches_prepare_featuresz3TestFeatureCols.test_order_matches_prepare_features'   s  € ô
 ;DÄLÔ:QÔRÑ:Q±°°3�#”u˜Q ™U“| eÑ+Ñ+Ð:QˆÑRÜ�\‰\˜6˜(Ó#ˆÝRÙ�¤Ô.ˆØ�w‰wÐ!˜'Ð!ˆw˜'Ñ!×!×!Õ!ˆw˜'×!×!×!×!×!Ñ!ˆq×!×!Ó!ˆq×!×!Ô!ˆw×!×!Ò!˜'×!×!×!×!×!×!Ó!Ü—8‘8µÓ=±¨1˜V A›Y°Ñ=Ó>ˆÜ
�
‰
×%Ñ% a¨¡d¨HÕ5ùó Sùò
 >s   “E2Ä;E8c           	      ó  — t        t        «      }t        |«      }d}||k(  }|�s[t        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  t         «      rt        j                  t         «      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}x}x}}y )
Né5   r   )zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} == %(py9)sr   Úsetr   )r   r    r7   Úpy4r"   Úpy9úassert %(py11)sÚpy11)rP   r   r   r$   r%   r&   r'   r(   r)   r*   r+   )r,   rH   r.   Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12s          r   Útest_duplicates_are_intentionalz/TestFeatureCols.test_duplicates_are_intentional4   sÊ   € ô ”|Ó$Ð+ŒsÐ$Ó%Ð+¨Ð+Ð%¨Ñ+×+×+Ö+Ð%¨×+×+×+×+×+Ñ+Œs×+×+Ó+Œs×+×+×+×+×+Ò+”3×+×+Ó+”3×+×+×+×+×+Ò+”|×+×+Ó+”|×+×+Ô+Ð$×+×+Ò+Ð%×+×+Ò+¨×+×+×+×+×+×+Ö+r3   N)Ú__name__Ú
__module__Ú__qualname__r2   rM   rY   © r3   r   r   r   !   s   „ ò'ò
6ó,r3   r   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚTestArtifactRoundTripc           	      óä  — g d¢}t        |d¬«      }|dz  }t        t        |«      |dd¬«       t        t        |«      «      }|d   }||k(  }|s™t	        j
                  d	|fd
||f«      t	        j                  |«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      nddœz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}}|d   }|t        k(  }|s¥t	        j
                  d	|fd
|t        f«      t	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      nddœz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}}|d   }
t        |
«      }t        |«      }||k(  }|�sSt	        j
                  d	|fd||f«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |
«      t	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      nddt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}
x}x}}t        ||d   «      D �]»  \  \  }}\  }}g }
|j                  }t         j"                  }||k(  }|}|r#|j                  }t         j"                  }||k(  }|}|�st	        j
                  d	|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t         «      rt	        j                  t         «      ndt	        j                  |«      dœz  }dd|iz  }|
j%                  |«       |rét	        j
                  d	fdf«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t         «      rt	        j                  t         «      ndt	        j                  |«      dœz  }dd |iz  }|
j%                  |«       t	        j&                  |
d!«      i z  }d"d#|iz  }t        t	        j                  |«      «      ‚d x}x}
x}x}x}x}x}}t         j(                  j+                  ||«       t         j(                  j+                  ||«       �Œ¾ y )$N)é1   é   é   r	   é   ©r   zmlp_weights_TEST_6H.jsonÚCOINBASE_BTCUSDÚ6H)ÚassetÚ	timeframer   r   )z%(py1)s == %(py3)s)r    r!   zassert %(py5)sr8   r5   r   Úlayers)zN%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py9)s
{%(py9)s = %(py6)s(%(py7)s)
}r   )r   r7   rQ   r"   r9   rR   rS   rT   )zJ%(py4)s
{%(py4)s = %(py2)s.dtype
} == %(py8)s
{%(py8)s = %(py6)s.float64
}ÚW2r   )r7   rQ   r"   r#   z%(py10)sÚpy10)zP%(py14)s
{%(py14)s = %(py12)s.dtype
} == %(py18)s
{%(py18)s = %(py16)s.float64
}Úb2)Úpy12Úpy14Úpy16Úpy18z%(py20)sÚpy20r   zassert %(py23)sÚpy23)r   r   Ústrr   r$   r%   r)   r&   r'   r(   r*   r+   r   r   ÚzipÚdtyper   Úfloat64ÚappendÚ_format_booloprA   rB   )r,   Útmp_pathr   rj   ÚpathÚartÚ@py_assert0r-   Ú@py_format4rI   rG   rH   rU   r.   rW   rX   ÚWÚbrk   rm   rV   Ú@py_assert13Ú@py_assert17Ú@py_assert15r1   Ú@py_format11Ú@py_format19Ú@py_format21Ú@py_format22Ú@py_format24s                                 r   Útest_roundtrip_bit_exactz.TestArtifactRoundTrip.test_roundtrip_bit_exact;   sB  € ÚˆÜ ¨1Ô-ˆØÐ4Ñ4ˆäœ#˜d›) VÐ3DÐPTÕUÜ¤ D£	Ó*ˆà�6‰{Ð"ˆ{˜dÑ"×"×"Õ"ˆ{˜d×"×"Ó"ˆ{×"×"×"×"×"Ð"˜d×"×"Ó"˜d×"×"×"×"×"×"Ó"Ø�>Ñ"Ð2Ð"¤lÑ2×2×2Õ2Ð"¤l×2×2Ó2Ð"×2×2×2×2×2Ð2¤l×2×2Ó2¤l×2×2×2×2×2×2Ó2Ø�x‘=Ð0Œs�=Ó!Ð0¤S¨£[Ð0Ð! [Ñ0×0×0Ö0Ð! [×0×0×0×0×0Ñ0Œs×0×0Ó0Œs×0×0Ô0�=×0×0Ò0Ð!×0×0×0×0×0Ð0¤S×0×0Ó0¤S×0×0×0×0×0Ò0¨×0×0Ó0¨×0×0Ô0 [×0×0×0×0×0×0Õ0Ü # F¨C°©M× :Ñ‰FˆQ�‘H�R˜ÙD�2—8‘8ÐDœrŸz™zÐD�8˜zÑ)ÔD¨b¯h©hÐD¼"¿*¹*ÐD¨h¸*Ñ.D×D×D×DÐD�8˜z×D×D×D×D×DÑD�2×D×DÓD�2×D×DÔD�8×D×D×D×D×DÐDœr×D×DÓDœr×D×DÔD˜z×D×D×D×D×D×DÕD¨h¸*×D×D×D×D×DÑD¨b×D×DÓD¨b×D×DÔD¨h×D×D×D×D×DÐD¼"×D×DÓD¼"×D×DÔD¸*×D×D×D×D×D×D×D×D×D×D×D×D×DÖDÜ�J‰J×)Ñ)¨!¨RÔ0Ü�J‰J×)Ñ)¨!¨RÖ0ñ !;r3   c           	      óª  — t        g d¢d¬«      }|dz  }t        t        |«      |ddddd	ii¬
«       t        t        |«      «      }|d   d   }d}||k(  }|slt	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}x}}|d   d   }d}||k(  }|slt	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}x}}|d   d   d   d   }d	}||k(  }|slt	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}x}}d}|d   }||v }|slt	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}x}}y )N)ra   rc   é   r	   r‹   re   zmlp_weights_META_1D.jsonrf   Ú1DÚphase1Úval_lossr
   )rh   ri   ÚtrainingÚmetarh   r   )z%(py1)s == %(py4)s)r    rQ   zassert %(py6)sr"   ri   r�   Ú
activation)Úin)z%(py1)s in %(py4)s)	r   r   rt   r   r$   r%   r)   r*   r+   )
r,   rz   rj   r{   r|   r}   rH   r-   Ú@py_format5r0   s
             r   Útest_metadata_recordedz,TestArtifactRoundTrip.test_metadata_recordedK   sª  € Ü¢°AÔ6ˆØÐ4Ñ4ˆÜÜ�‹I�vÐ%6À$Ø ¨SÐ 1Ð2õ	
ô  ¤ D£	Ó*ˆØ�6‰{˜7Ñ#Ð8Ð'8Ð8Ð#Ð'8Ñ8×8×8Õ8Ð#Ð'8×8×8Ó8Ð#×8×8Ò8Ð'8×8×8×8×8×8×8Ó8Ø�6‰{˜;Ñ'Ð/¨4Ð/Ð'¨4Ñ/×/×/Õ/Ð'¨4×/×/Ó/Ð'×/×/Ò/¨4×/×/×/×/×/×/Ó/Ø�6‰{˜:Ñ& xÑ0°Ñ<ÐCÀÐCÐ<ÀÑC×C×CÕCÐ<À×C×CÓCÐ<×C×CÒCÀ×C×C×C×C×C×CÓCØÐ*˜s 6™{Ð*ˆ|˜{Ð*×*×*Õ*ˆ|˜{×*×*Ó*ˆ|×*×*Ò*˜{×*×*×*×*×*×*Ô*r3   c           	      ón  — |dz  }t        t        |«      t        g d¢d¬«      «       t        t        |«      «      }t        |«      }t        |«      }||u }|�s€t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      nddt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndd	t        j                  «       v st	        j                  |«      rt	        j                  |«      nd	t	        j                  |«      t	        j                  |«      d
t        j                  «       v st	        j                  |«      rt	        j                  |«      nd
dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}dd l}	dd l}
|
j                  d«       t        t        |«      t        g d¢d¬«      «       |	j                  t        |«      |
j                  «       dz   |
j                  «       dz   f«       t        t        |«      «      }||u}|sÆt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndd
t        j                  «       v st	        j                  |«      rt	        j                  |«      nd
dœz  }dd|iz  }t        t	        j                  |«      «      ‚d }t         j"                  }|d   d   d   }|d   d   d   } |||«      }| }|s½ddt        j                  «       v st	        j                  t         «      rt	        j                  t         «      ndt	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }t        t	        j                  |«      «      ‚d x}x}x}x}}y )Nzmlp_weights_CACHE_4H.json)rd   é   r	   é   re   )Úis)zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} is %(py8)sr   rt   r{   Úfirst)r   r    r7   rQ   r"   r#   zassert %(py10)srl   r   g{®Gáz„?é   )úis not)z%(py0)s is not %(py2)sÚsecond)r   r7   zassert %(py4)srQ   rj   zZassert not %(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.array_equal
}(%(py4)s, %(py6)s)
}r   )r   r7   rQ   r"   r#   )r   rt   r   r   r$   r%   r&   r'   r(   r)   r*   r+   ÚosÚtimeÚsleepÚutimer   Úarray_equal)r,   rz   r{   r™   rH   r.   rV   r1   r„   r�   rž   rœ   rG   Ú@py_format3r“   Ú@py_assert9rW   s                    r   Ú&test_load_is_cached_until_file_changesz<TestArtifactRoundTrip.test_load_is_cached_until_file_changesX   sz  € ØÐ5Ñ5ˆÜœ#˜d›)¤^²IÀAÔ%FÔGÜ!¤# d£)Ó,ˆÜ!$ T£Ð4Ô  Ó+Ð4Ð+¨uÐ4×4×4Ö4Ð+¨u×4×4×4×4×4Ñ4Ô ×4×4Ó4Ô ×4×4×4×4×4Ò4¤×4×4Ó4¤×4×4×4×4×4Ò4 T×4×4Ó4 T×4×4Ô4 ×4×4Ò4Ð+×4×4×4×4×4Ð4¨u×4×4Ó4¨u×4×4×4×4×4×4Õ4ó 	ÛØ�
‰
�4ÔÜœ#˜d›)¤^²IÀAÔ%FÔGØ
�‰”�T“˜TŸY™Y›[¨1™_¨d¯i©i«k¸A©oÐ>Ô?Ü"¤3 t£9Ó-ˆØ˜UÐ"×"×"Õ"ˆv˜U×"×"×"×"×"Ñ"ˆv×"×"Ó"ˆv×"×"×"×"×"Ò"˜U×"×"Ó"˜U×"×"×"×"×"×"Ñ"Ü—>‘>ÐP %¨¡/°!Ñ"4°QÑ"7ÐP¸ÀÑ9IÈ!Ñ9LÈQÑ9OÐP‘>Ð"7Ð9OÓPÐPÐPÐPÐPÑP×P×P×P×PÕP”2×P×PÓP”2×P×PÔP�>×P×PÒPÐ"7×P×PÒPÐ9O×P×PÒPÐP×P×P×P×P×P×PÑPr3   N)rZ   r[   r\   r‰   r”   r¤   r]   r3   r   r_   r_   :   s   „ ò1ò +óQr3   r_   )r   )Ú__doc__Úbuiltinsr&   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter$   Únumpyr   Úpandasr<   Úpytestr>   r   Ústrategies.strategy_mlp_scoresr   r   r   r   r   r_   r]   r3   r   Ú<module>r®      sB   ðñ
÷ „ Ó Û Û å C÷ñ ó÷,ñ ,÷2,Qò ,Qr3   