
    8j                         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       B/Users/jameslopez/projects/TradingBot25/tests/test_mlp_artifact.py_random_layersr      s    
))


%C s4y1}% &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(  }|st        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 )	N7   ==)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(  }	|	st        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#uQU|e++:QR\\6(#R.ww!'!w'!!!!w'!!!!!!q!!!q!!!w!!!'!!!!!!!88=1VAY=>


%%adH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 )
N5   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(  }|st	        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(  }|st	        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%                  |       |rt	        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)V3DPTUD	*6{"{d""""{d"""{""""""d"""d""""""">"2"l2222"l222"222222l222l2222222x=0s=!0S[0![0000![000000s000s000=000!000000S000S000000000000[0000000 #FCM :FQHRD288DrzzD8z)DbhhD"**Dh*.DDDDD8zDDDDDD2DDD2DDD8DDDDDDrDDDrDDDzDDDDDDDh*DDDDDDb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JJ))!R0JJ))!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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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*s6{*|{****|{***|***{*******r3   c           	      n   |dz  }t        t        |      t        g dd             t        t        |            }t        |      }t        |      }||u }|st	        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}|st	        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   } |||      }| }|sd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{Gz?   )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)^IA%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4T444T444444+444444u444u4444444 	

4#d)^IA%FG
TTYY[1_diikAo>?"3t9-U""""vU""""""v"""v""""""U"""U""""""">>P%/!"4Q"7P9I!9LQ9OP>"79OPPPPPPPPPPP2PPP2PPP>PPP"7PPP9O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   