+
    8j  c                       R t ^ RIt^ RIHu Ht ^ RIt^ RI	t
^ RIt^ RIHt ^ RIHtHtHt R	R lt ! R R4      t ! R R4      tR# )
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           
      ,   \         P                  P                  V4      p\        \	        V 4      ^,
          4       Uu. uFK  pVP                  RW^,           ,          W,          3R7      VP                  RW^,           ,          R7      3NKM  	  up# u upi )         ?)scalesizeg?)nprandomdefault_rngrangelennormal)archseedrngis   &&  B/Users/jameslopez/projects/TradingBot25/tests/test_mlp_artifact.py_random_layersr      s    
))


%C s4y1}% &A 
#Ta%[$'$:	;	#DQK	0	2%  s   ABc                   2   a  ] tR t^!t o R tR tR tRtV tR# )TestFeatureColsc                   \        \        4      p^7q!V8H  q3'       Eg%   \        P                  ! R
V3RW34      RR\        P
                  ! 4       9   g!   \        P                  ! \         4      '       d   \        P                  ! \         4      MRRR\        P
                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRR\        P                  ! V4      R\        P                  ! V4      /,          pRRV/,          p\        \        P                  ! V4      4      hR	;p;r2R	# )7   py0r   py1r   py3py6zassert %(py8)spy8N==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)s)
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_55!TestFeatureCols.test_length_is_55"   s     < &B&B&&&&& &&&&&&s&&&&s&&&&&&&<&&&&<&&& &&&B&&&&&&&&    c           	     \   \        \        4       UUu/ uF  w  rV\        V^,           4      R,          bK!  	  ppp\        P                  ! V.4      p^ RIHp V! V\        R7      pVP                  pRqV8H  q'       g   \        P                  ! RV	3RWx34      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R\        P                  ! V4      /,          p
RR	V
/,          p\        \        P                  ! V4      4      hR
;p;r\         P"                  ! \         Uu. uF  qV,          NK  	  up4      p\         P$                  P'                  V^ ,          V4       R
# u uppi u upi )r   g      Y@r   )feature_colsr   Xpy2py5zassert %(py7)spy7N)r   r   r    )z-%(py2)s
{%(py2)s = %(py0)s.shape
} == %(py5)s)	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_pfr5   @py_assert1r-   @py_assert3@py_format6@py_format8cexpecteds   &             r   #test_order_matches_prepare_features3TestFeatureCols.test_order_matches_prepare_features'   s	   
 ;DL:QR:Q#uQU|e++:QR\\6(#R.ww!'!'!!!!!w!!!!!!q!!!!q!!!w!!!'!!!!!!!!88=1AYY=>


%%adH5 S
 >s   %F#"F)c                   \        \        4      p\        V4      p^5q2V8H  qD'       Eg   \        P                  ! RV3RW#34      RR\
        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRRR\
        P                  ! 4       9   g!   \        P                  ! \         4      '       d   \        P                  ! \         4      MRRR\
        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRR\        P                  ! V4      R\        P                  ! V4      R	\        P                  ! V4      /,          pR
RV/,          p\        \        P                  ! V4      4      hR;p;p;rCR# )5   r   r   r   setr6   r   py4r   py9assert %(py11)spy11Nr    )zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} == %(py9)s)rP   r   r   r"   r#   r$   r%   r&   r'   r(   r)   )r*   rG   r,   @py_assert8@py_assert7@py_format10@py_format12s   &      r   test_duplicates_are_intentional/TestFeatureCols.test_duplicates_are_intentional4   s     |$+s$%+++++++%++++++s++++s+++++++3++++3+++++++|++++|+++$+++%+++++++++++r2    N)	__name__
__module____qualname____firstlineno__r0   rL   rY   __static_attributes____classdictcell____classdict__s   @r   r   r   !   s     '
6, ,r2   r   c                   2   a  ] tR t^:t o R tR tR tRtV tR# )TestArtifactRoundTripc                   . R&Op\        V^R7      pVR,          p\        \        V4      VRRR7       \        \        V4      4      pVR,          qfV8H  qw'       g   \        P
                  ! R'V3R(Wb34      R\        P                  ! V4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pR	R
V/,          p	\        \        P                  ! V	4      4      hR;rgVR,          qf\        8H  qw'       g   \        P
                  ! R'V3R(V\        34      R\        P                  ! V4      RR\        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MR/,          pR	R
V/,          p	\        \        P                  ! V	4      4      hR;rgVR,          p
\        V
4      p\        V4      qV8H  q'       Eg   \        P
                  ! R'V3R)W34      RR\        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRR\        P                  ! V
4      R\        P                  ! V4      RR\        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRRR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      /,          pRRV/,          p\        \        P                  ! V4      4      hR;p
;p;r\        W5R,          4       EF#  w  w  ppw  pp. p
VP                  p\         P"                  pVV8H  qqm'       d$   VP                  p\         P"                  pVV8H  pTpV'       Egp   \        P
                  ! R'V3R*VV34      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      RR\        P                  ! 4       9   g!   \        P                  ! \         4      '       d   \        P                  ! \         4      MRR\        P                  ! V4      /,          pRRV/,          pV
P%                  V4       V'       Ed   \        P
                  ! R'X3R+XX34      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R R\        P                  ! 4       9   g!   \        P                  ! \         4      '       d   \        P                  ! \         4      MRR!\        P                  ! V4      /,          pR"R#V/,          pV
P%                  V4       \        P&                  ! V
^ 4      / ,          pR$R%V/,          p\        \        P                  ! V4      4      hR;p;p
;p;p;p;p;pp\         P(                  P+                  VV4       \         P(                  P+                  VV4       EK&  	  R# ),1   r   zmlp_weights_TEST_6H.jsonCOINBASE_BTCUSD6H)asset	timeframer   r   r   zassert %(py5)sr7   Nr4   r   layersr   r   r6   rQ   r   r8   rR   rS   rT   W2r   r   z%(py10)spy10py12b2py14py16py18z%(py20)spy20zassert %(py23)spy23)rg         r   r    )z%(py1)s == %(py3)s)zN%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py9)s
{%(py9)s = %(py6)s(%(py7)s)
})zJ%(py4)s
{%(py4)s = %(py2)s.dtype
} == %(py8)s
{%(py8)s = %(py6)s.float64
})zP%(py14)s
{%(py14)s = %(py12)s.dtype
} == %(py18)s
{%(py18)s = %(py16)s.float64
})r   r   strr   r"   r#   r'   r$   r%   r&   r(   r)   r   r   zipdtyper   float64append_format_boolopr@   rA   )r*   tmp_pathr   rm   pathart@py_assert0r+   @py_format4rH   rF   rG   rU   r,   rW   rX   Wbrn   rq   rV   @py_assert13@py_assert17@py_assert15r/   @py_format11@py_format19@py_format21@py_format22@py_format24s   &&                            r   test_roundtrip_bit_exact.TestArtifactRoundTrip.test_roundtrip_bit_exact;   ss   1-44#d)V3DPTUD	*6{"d"""""{"""{""""""d""""d"""""""">"2l22222"l222"222222l2222l22222222x=0s=!0S[0[00000!000000s0000s000=000!000000S0000S00000000000000[00000000 #FM :FQHRD288DrzzD8z)DDbhhD"**Dh*.DDDDD8zDDDDDD2DDDD2DDD8DDDDDDrDDDDrDDDzDDDDDDDDDh*DDDDDDbDDDDbDDDh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DDDJJ))!R0JJ))!R0 !;r2   c           	     t   \        . RO^R7      pVR,          p\        \        V4      VRRRRR//R7       \        \        V4      4      pVR	,          R
,          pRqeV8H  qw'       gy   \        P
                  ! RV3RWV34      R\        P                  ! V4      R\        P                  ! V4      /,          pRRV/,          p	\        \        P                  ! V	4      4      hR;p;rvVR	,          R,          pRqeV8H  qw'       gy   \        P
                  ! RV3RWV34      R\        P                  ! V4      R\        P                  ! V4      /,          pRRV/,          p	\        \        P                  ! V	4      4      hR;p;rvVR	,          R,          R,          R,          pRqeV8H  qw'       gy   \        P
                  ! RV3RWV34      R\        P                  ! V4      R\        P                  ! V4      /,          pRRV/,          p	\        \        P                  ! V	4      4      hR;p;rvRqTR	,          qeV9   qw'       gy   \        P
                  ! RV3RWV34      R\        P                  ! V4      R\        P                  ! V4      /,          pRRV/,          p	\        \        P                  ! V	4      4      hR;p;rvR# )rg   rh   zmlp_weights_META_1D.jsonri   1Dphase1val_lossr   )rk   rl   trainingmetark   r   rQ   zassert %(py6)sr   Nrl   r   
activation)rg   rx      r   r    )z%(py1)s == %(py4)s)in)z%(py1)s in %(py4)s)	r   r   ry   r   r"   r#   r'   r(   r)   )
r*   r   rm   r   r   r   rG   r+   @py_format5r.   s
   &&        r   test_metadata_recorded,TestArtifactRoundTrip.test_metadata_recordedK   s   A644Iv%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86{;'/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CC*6{*{*****|***|***{********r2   c                	   VR ,          p\        \        V4      \        . RO^R7      4       \        \        V4      4      p\        V4      p\        V4      qUVJ qf'       Eg   \        P
                  ! RV3RWS34      RR\        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRRR\        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRRR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R	\        P                  ! V4      R
R\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          p\        \        P                  ! V4      4      hR;p;rV^ RIp	^ RIp
V
P                  R4       \        \        V4      \        . RO^R7      4       V	P                  \        V4      V
P                  4       ^,           V
P                  4       ^,           34       \        \        V4      4      pWJq'       g   \        P
                  ! RV3RW34      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRRR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          p\        \        P                  ! V4      4      hRp\         P"                  qR,          ^ ,          ^ ,          qKR,          ^ ,          ^ ,          q\! WE4      qf'       * q'       g   RRR\        P                  ! 4       9   g!   \        P                  ! \         4      '       d   \        P                  ! \         4      MRR\        P                  ! V4      R\        P                  ! V4      R	\        P                  ! V4      R
\        P                  ! V4      /,          p\        \        P                  ! V4      4      hR;p;p;p;roR# )zmlp_weights_CACHE_4H.jsonrh   r   r   r   ry   r6   r   rQ   r   r   firstzassert %(py10)sro   Ng{Gz?secondzassert %(py4)srm   zZassert not %(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.array_equal
}(%(py4)s, %(py6)s)
}r   )      r   )is)zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} is %(py8)s)is not)z%(py0)s is not %(py2)s)r   ry   r   r   r"   r#   r$   r%   r&   r'   r(   r)   ostimesleeputimer   array_equal)r*   r   r   r   rG   r,   rV   r/   r   r   r   r   rF   @py_format3r   @py_assert9rW   s   &&               r   &test_load_is_cached_until_file_changes<TestArtifactRoundTrip.test_load_is_cached_until_file_changesX   s   55#d)^IA%FG!#d),!$T4 +4u44444+444444 4444 444444444444444444T4444T444444+444444u4444u44444444 	

4#d)^IA%FG
TTYY[1_diikAo>?"3t9-"""""v""""""v""""v"""""""U""""U"""""""">>P/!"4Q"7P9I!9LQ9OP>"7PPPPPPPPPPP2PPPP2PPP>PPP"7PPP9OPPPPPPPPPPPr2   r[   N)	r\   r]   r^   r_   r   r   r   r`   ra   rb   s   @r   re   re   :   s     1 +Q Qr2   re   )    )__doc__builtinsr$   _pytest.assertion.rewrite	assertionrewriter"   numpyr   pandasr;   pytestr=   r   strategies.strategy_mlp_scoresr   r   r   r   r   re   r[   r2   r   <module>r      sB   
      C , ,2,Q ,Qr2   