Ë
    sw±jb  ã                   ó  — d Z ddlZddlmc mZ ddlZddlZddl	m
Z ej                  j                  ej                  j                  ej                  j                  e«      d«      «      ZdZ G d„ d«      Z G d„ d«      Z G d	„ d
«      Zy)zßAsset selection must pair the same asset's chart and winner paths.

The stale-global regression uses temporary files so private chart exports are
not needed. Winner path checks use the repository's tracked winner fixtures.
é    Nz..ÚCOINBASE_ETHUSDc                   óœ   — e Zd ZdZd„ Zej                  j                  d ee	j                  j                  «       «      «      d„ «       Zd„ Zy)Ú	TestTfMapzD`_tf_map(asset)` must build asset-specific paths, not just BTC ones.c                 óÖ  — t        j                  t        «      }|j                  } |«       }t	        |«      }t         j
                  }|j                  } |«       }t	        |«      }||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                  |«      rt        j                  |«      ndt        j                  |«      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                  t         «      rt        j                  t         «      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}x}x}	x}x}x}}y )	N©ú==)zÚ%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.keys
}()
})
} == %(py18)s
{%(py18)s = %(py9)s(%(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s
{%(py12)s = %(py10)s._TF_PERIODS
}.keys
}()
})
}ÚsetÚtf_mapÚmrt)Úpy0Úpy1Úpy3Úpy5Úpy7Úpy9Úpy10Úpy12Úpy14Úpy16Úpy18zassert %(py20)sÚpy20)r   Ú_tf_mapÚNON_BTC_ASSETÚkeysr	   Ú_TF_PERIODSÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)Úselfr
   Ú@py_assert2Ú@py_assert4Ú@py_assert6Ú@py_assert11Ú@py_assert13Ú@py_assert15Ú@py_assert17Ú@py_assert8Ú@py_format19Ú@py_format21s               úm/Users/jameslopez/projects/TradingBot25/.worktrees/mlp-comparable-measurement/tests/test_mlp_results_table.pyÚ,test_returns_a_path_per_configured_timeframez6TestTfMap.test_returns_a_path_per_configured_timeframe   sP  € Ü—‘œ]Ó+ˆØ—;‘;Ð@‘;“=Ð@Œs�=Ó!Ð@¬¯©Ð@¨×)=Ñ)=Ð@Ñ)=Ó)?Ð@¤SÐ)?Ó%@Ð@Ð!Ð%@Ñ@×@×@Ö@Ð!Ð%@×@×@×@×@×@Ñ@Œs×@×@Ó@Œs×@×@×@×@×@Ò@�6×@×@Ó@�6×@×@Ô@�;×@×@Ò@�=×@×@Ò@Ð!×@×@×@×@×@Ð@¤S×@×@Ó@¤S×@×@×@×@×@Ò@¬×@×@Ó@¬×@×@Ô@¨×@×@Ò@Ð)=×@×@Ò@Ð)?×@×@Ò@Ð%@×@×@×@×@×@×@×@Ö@ó    z	tf,periodc                 óL  — t        j                  t        «      }||   }dt        › 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}}y )	Nz	data/mlp/z, ú.csvr   )z%(py1)s == %(py4)s©r   Úpy4úassert %(py6)sÚpy6)r   r   r   r   r   r!   r"   r#   )	r$   ÚtfÚperiodr
   Ú@py_assert0Ú@py_assert3r%   Ú@py_format5Ú@py_format7s	            r/   Ú/test_path_embeds_the_requested_asset_and_periodz9TestTfMap.test_path_embeds_the_requested_asset_and_period   sp   € ä—‘œ]Ó+ˆØ�b‰zÐF˜y¬¨°r¸&¸ÀÐFÐFˆzÐFÑF×F×FÕFˆzÐF×F×FÓFˆz×F×FÒFÐF×F×F×F×F×F×FÔFr1   c                 ó�  — t        j                  d«      }t        j                  t        «      }t         j                  D ]…  }||   }||   }||k7  }|slt	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}Œ‡ y )NÚCOINBASE_BTCUSD)ú!=)z%(py1)s != %(py4)sr4   r6   r7   )	r   r   r   r   r   r   r!   r"   r#   )	r$   ÚbtcÚethr8   r:   r;   r%   r<   r=   s	            r/   Ú#test_different_assets_never_collidez-TestTfMap.test_different_assets_never_collide   s   € Ü�k‰kÐ+Ó,ˆÜ�k‰kœ-Ó(ˆÜ—/”/ˆBØ�r‘7Ð%˜c "™gÐ%�7˜gÑ%×%×%Õ%�7˜g×%×%Ó%�7×%×%Ò%˜g×%×%×%×%×%×%Ô%ñ "r1   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   ÚpytestÚmarkÚparametrizeÚlistr   r   Úitemsr>   rD   © r1   r/   r   r      sJ   „ ÙNòAð ‡[�[×Ñ˜[©$¨s¯©×/DÑ/DÓ/FÓ*GÓHñGó IðGó&r1   r   c                   ó^   — e Zd ZdZej
                  j                  dg d¢«      d„ «       Zd„ Zy)ÚTestWinnerPathzE`winner_path(tf, asset)` must resolve to the real on-disk winner CSV.r8   )Ú4HÚ6HÚ8HÚ12HÚ1Dc                 ó@  — t        j                  |t        «      }t         j                  }dt        › d|› d�}||z  }||k(  }|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                  t         «      rt	        j                  t         «      ndt	        j                  |«      t	        j                  |«      dœz  }d	d
|iz  }t        t	        j                  |«      «      ‚d x}x}x}}t        j                  j                  t        t!        |«      «      }	t        j                  }|j"                  } ||	«      }
|
�st	        j$                  d|	› �«      dz   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                  |	«      rt	        j                  |	«      ndt	        j                  |
«      dœz  }t        t	        j                  |«      «      ‚d x}x}}
y )NÚ(optimization_winner_strategy_mlp_scores_Ú_r3   r   )z>%(py0)s == (%(py4)s
{%(py4)s = %(py2)s.WINNER_DIR
} / %(py6)s)Úwpr   )r   Úpy2r5   r7   zassert %(py9)sr   zexpected real fixture at zd
>assert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py5)s)
}ÚosÚabs_wp)r   rZ   r5   r   r   )r   Úwinner_pathr   Ú
WINNER_DIRr   r   r   r   r    r!   r"   r#   r[   ÚpathÚjoinÚ	REPO_ROOTÚstrÚexistsÚ_format_assertmsg)r$   r8   rY   r;   Ú@py_assert5Ú@py_assert7Ú@py_assert1Ú@py_format8Ú@py_format10r\   r'   s              r/   Ú:test_explicit_non_btc_asset_resolves_to_a_file_that_existszITestWinnerPath.test_explicit_non_btc_asset_resolves_to_a_file_that_exists'   s|  € ä�_‰_˜R¤Ó/ˆÜ—^‘^ÐiÐ(PÔQ^ÐP_Ð_`ÐacÐ`dÐdhÐ&iÐi�^Ð&iÑiÐiˆrÐiÑi×i×iÕiˆrÐi×i×i×i×i×iÑiˆr×i×iÓiˆr×i×i×i×i×iÒi”S×i×iÓi”S×i×iÔi�^×i×iÒiÐ&i×i×i×i×i×i×iÕiÜ—‘—‘œi¬¨R«Ó1ˆÜ�w‰wÐKˆw�~‰~ÐK‰~˜fÓ%ÐKÒ%×KÖKÐ)BÀ6À(Ð'K×K×K×K×K×KÓKŒr×K×KÓKŒr×K×KÔKˆw×K×KÒKˆ~×K×K×K×K×KÐK˜f×K×KÓK˜f×K×KÔKÐ%×K×K×K×K×KÕKr1   c                 ó  — |j                  t        dt        «       t        j                  }d} ||«      }t        j                  }d} ||t        «      }||k(  }|�s—t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      t	        j                  |«      t	        j                  |«      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t	        j                  |«      dœ	z  }	dd	|	iz  }
t        t	        j                  |
«      «      ‚d x}x}x}x}x}x}}y )
NÚASSETrQ   r   )zŸ%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.winner_path
}(%(py4)s)
} == %(py15)s
{%(py15)s = %(py10)s
{%(py10)s = %(py8)s.winner_path
}(%(py12)s, %(py13)s)
}r   r   )	r   rZ   r5   r7   Úpy8r   r   Úpy13Úpy15zassert %(py17)sÚpy17)Úsetattrr   r   r]   r   r   r   r   r    r!   r"   r#   )r$   Úmonkeypatchrg   r;   re   Ú@py_assert9r(   Ú@py_assert14rf   Ú@py_format16Ú@py_format18s              r/   Ú.test_default_asset_falls_back_to_module_globalz=TestWinnerPath.test_default_asset_falls_back_to_module_global.   s  € Ø×ÑœC ¬-Ô8Ü�‰ÐL˜tÐL‰˜tÓ$ÐL¬¯©ÐL¸ÐL©¸¼mÓ(LÐLÐ$Ð(LÑL×L×LÖLÐ$Ð(L×L×L×L×L×LÑLŒs×L×LÓLŒs×L×LÔLˆ×L×LÒL˜t×L×LÒLÐ$×L×L×L×L×LÐL¬×L×LÓL¬×L×LÔL¨×L×LÒL¸×L×L×L×L×LÐL¼m×L×LÓL¼m×L×LÔLÐ(L×L×L×L×L×L×L×LÔLr1   N)	rE   rF   rG   rH   rI   rJ   rK   rj   rw   rN   r1   r/   rP   rP   $   s2   „ ÙOà‡[�[×Ñ˜TÒ#BÓCñLó DðLóMr1   rP   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚTestGlobalPairingHazardz˜
    The real hazard: ASSET and TF_MAP are independent mutable globals.
    main() pairs them correctly; a direct caller of evaluate_tf() need not.
    c                 óü  — |j                  t        dt        «       |j                  t        dt        j                  t        «      «       t        j                  D �]Ÿ  }t        j
                  |   }t        |v }|s¥t        j                  d|fdt        |f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}t        j                  } ||«      }t        |«      }	t        |	v }|�s t        j                  d|fd	t        |	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                  |«      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}x}}	�Œ¢ y )Nrl   ÚTF_MAP)Úin)z%(py0)s in %(py3)sr   ©r   r   úassert %(py5)sr   )zq%(py0)s in %(py10)s
{%(py10)s = %(py2)s(%(py8)s
{%(py8)s = %(py5)s
{%(py5)s = %(py3)s.winner_path
}(%(py6)s)
})
}rb   r   r8   )r   rZ   r   r   r7   rm   r   zassert %(py12)sr   )rq   r   r   r   r   r{   r   r   r   r   r    r!   r"   r#   r]   rb   )r$   rr   r8   r%   rg   Ú@py_format4Ú@py_format6r&   rf   rs   Ú@py_format11Ú@py_format13s               r/   Ú=test_mains_paired_reassignment_keeps_asset_and_tf_map_in_synczUTestGlobalPairingHazard.test_mains_paired_reassignment_keeps_asset_and_tf_map_in_sync9   s‹  € ð 	×ÑœC ¬-Ô8Ø×ÑœC ¬3¯;©;´}Ó+EÔFô —/•/ˆBÜ$'§J¡J¨r¡NÐ2”= NÐ2×2×2Õ2”= N×2×2×2×2×2Ñ2”=×2×2Ó2”=×2×2Ô2 N×2×2×2×2×2×2Ñ2Ü(+¯©Ð<©¸Ó(;Ð<¤CÐ(;Ó$<Ð<”=Ð$<Ð<×<×<Ö<”=Ð$<×<×<×<×<×<Ñ<”=×<×<Ó<”=×<×<×<×<×<Ò<¤C×<×<Ó<¤C×<×<×<×<×<Ò<¬×<×<Ó<¬×<×<Ô<¨×<×<×<×<×<Ð<¸×<×<Ó<¸×<×<Ô<Ð(;×<×<Ò<Ð$<×<×<×<×<×<×<×<ñ "r1   c                 óØ  — |j                  |«       |j                  t        dt        «       |t        j                  d   z  }|j
                  j                  d¬«       |j                  d«       |dz  }|j                  «        |j                  t        d|«       t        j                  d«      j                  d«       |j                  t        j                  d	d
„ «       t        j                  }d} ||«      }d }||u }	|	sÝt        j                  d|	fd||f«      dt        j                  «       v st        j                  t        «      rt        j                   t        «      ndt        j                   |«      t        j                   |«      t        j                   |«      t        j                   |«      dœz  }
dd|
iz  }t#        t        j$                  |«      «      ‚d x}x}x}x}	}y )Nrl   rQ   T)Úparentsz#time,close,high
1609459200,100,100
Úwinnersr^   zmlp_weights_file
fake.json
Úgenerate_signalsc                  ó,   — t        j                  d«      S )Nzmixed asset data)rI   Úfail)ÚargsÚkwargss     r/   Ú<lambda>zkTestGlobalPairingHazard.test_evaluate_tf_never_pairs_one_assets_data_with_anothers_winner.<locals>.<lambda>Q   s   € ´F·K±KÐ@RÔ4Sr1   ©Úis)zQ%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.evaluate_tf
}(%(py4)s)
} is %(py9)sr   )r   rZ   r5   r7   r   zassert %(py11)sÚpy11)Úchdirrq   r   r   r{   ÚparentÚmkdirÚ
write_textr]   ÚstratÚevaluate_tfr   r   r   r   r    r!   r"   r#   )r$   rr   Útmp_pathÚstale_data_fileÚ
winner_dirrg   r;   re   r,   rf   ri   Ú@py_format12s               r/   ÚAtest_evaluate_tf_never_pairs_one_assets_data_with_anothers_winnerzYTestGlobalPairingHazard.test_evaluate_tf_never_pairs_one_assets_data_with_anothers_winnerD   sN  € à×Ñ˜(Ô#Ø×ÑœC ¬-Ô8Ø"¤S§Z¡Z°Ñ%5Ñ5ˆØ×Ñ×$Ñ$¨TÐ$Ô2Ø×"Ñ"Ð#JÔKØ 	Ñ)ˆ
Ø×ÑÔØ×ÑœC ¨zÔ:Ü�‰˜Ó×(Ñ(Ð)HÔIà×ÑœCŸI™IÐ'9ÙSô	Uä�‰Ð,˜tÐ,‰˜tÓ$Ð,¨Ð,Ð$¨Ð,×,×,Õ,Ð$¨×,×,×,×,×,Ñ,Œs×,×,Ó,Œs×,×,Ô,ˆ×,×,Ò,˜t×,×,Ò,Ð$×,×,Ò,¨×,×,×,×,×,×,×,Ð,r1   c                 óØ  — |j                  |«       |j                  t        dddi«       t        j                  dt        ¬«      }d }||u }|s™t        j                  d|fd||f«      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}}y )Nr{   rQ   zdoes/not/exist.csv)Úassetr�   )z%(py0)s is %(py3)sÚresultr}   r~   r   )r�   rq   r   r•   r   r   r   r   r   r    r!   r"   r#   )r$   rr   r–   r�   r%   rg   r   r€   s           r/   Ú>test_evaluate_tf_ignores_tf_map_entirely_for_an_explicit_assetzVTestGlobalPairingHazard.test_evaluate_tf_ignores_tf_map_entirely_for_an_explicit_assetT   s’   € Ø×Ñ˜(Ô#à×ÑœC ¨DÐ2FÐ+GÔHô
 —‘ ¬]Ô;ˆØÐˆv˜ˆ~××Õˆv˜×××××Ñˆv××Óˆv××Ô˜××××××Òr1   N)rE   rF   rG   rH   rƒ   rš   rž   rN   r1   r/   ry   ry   3   s   „ ñò
	=ò-ó 	r1   ry   )rH   Úbuiltinsr   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   r[   rI   Útools.mlp_results_tableÚmlp_results_tabler   r_   Úabspathr`   ÚdirnameÚ__file__ra   r   r   rP   ry   rN   r1   r/   Ú<module>r¨      sl   ðñ÷
 „ ƒ	ã å %à�G‰G�O‰O˜BŸG™GŸL™L¨¯©¯©¸Ó)BÀDÓIÓJ€	à!€÷&ñ &÷&Mñ M÷*ò *r1   