Ë
    qµjµ   ã                   ó  — d dl Zd dlmc mZ d dlZd dlmZ d dl	Z
d dlZd dlmZmZ d dlmZ d dlmZmZmZmZ d„ Zd„ Zd„ Zej4                  j7                  dd	d
g«      d„ «       Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%y)é    N)Úreplace)ÚComparisonSnapshotÚrequire_replay)ÚVERSIONÚ
THRESHOLDSÚDELTASÚstability_periodsc            #      óÒ  — t        dddddœddddd	d	dd
dddœ
¤Ž}|j                  | «       t        dddœdddœ¬«      }|j                  dd|d   dt        j                  t        t        dt
        D �����cg c]F  }t        D ];  }t        ||t        «       D ���cg c]  \  }}}t        ||||¬«      ‘Œ c}}}¬«      ‘Œ= ŒH c}}}}}¬«      «      ¬«       |S c c}}}w c c}}}}}w )NÚsameÚcompleteÚ	candidate)ÚComparison_FingerprintÚEvaluation_StatusÚsourceg      $@g       @g      Y@r   ç      ð?é   g      @ç        )
úP&L/DD RatioúCalmar RatiozTotal P&L %úFragile_0.05ÚSub1_CalmarÚSub2_CalmarÚWFO_Neg_FoldszOOS_Total TradesúOOS_Sortino RatioÚOOS_Bear_Pctg      $À)Úpnl_pctÚdd_pct)ÚcenterÚ	perturbedÚconfigurationr   ÚpassedT)ÚnameÚstartÚend)Ú	thresholdÚdeltaÚperiods)Úversionr!   Útrials)ÚEvaluation_KeyÚStability_Evaluation_KeyÚStability_ContextÚStability_StatusÚStability_Report© )ÚdictÚupdateÚjsonÚdumpsr   r   r   r	   )Ú	overridesÚrowÚperiodÚkÚdÚnÚsÚes           úD/Users/jameslopez/projects/TradingBot25/tests/test_mlp_comparison.pyÚvalidr=      s  € Ü
ð ' fÀ
ÐS^ñ 'Ø"%°rÈ$Ø"#°BÀrØ#$¸!ÐRTØ"$ñ&ñ'€Cð
 ‡J�JˆyÔÜ T°TÑ:ÐRVÐbfÑFgÔh€FØ‡J�J˜oÈØÐ6Ñ7È(ÜŸ™¤D´Àå>H÷ZÙ>H¸×RXÈQô  1¨AÜ0Ô2õ84Ù2‘G�A�q˜!ô 9=¸VÈ!ÐSTÐZ[Ö8\Ø2ó84ö 5ØRXð5Ø>HõZô%[ó \ð ô ]ð
 €Jùô84ùö Zs   Á7#C $ÂC8Â4C $ÃC $c                  óÄ  — t        «       } t        di dddœ¤Ž}t        di ddddœ¤Ž}t        j                  } || ||«      }|�sXd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	d
t        j                  «       v st        j                  |«      rt        j                  |«      nd
dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}}t        j                  }ddi}t        di |¤Ž} ||||«      }| }|�sˆddt        j                  «       v st        j                  t        «      rt        j                  t        «      nd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                  |«      rt        j                  |«      nd
dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}t        j                  }d}t        |¬«      } ||||«      }| }|�sˆddt        j                  «       v st        j                  t        «      rt        j                  t        «      nd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                  |«      rt        j                  |«      nd
dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}t        j                  }ddi}t        di |¤Ž} ||||«      }| }|�sˆddt        j                  «       v st        j                  t        «      rt        j                  t        «      nd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                  |«      rt        j                  |«      nd
dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}t        j                  }d}t        |¬«      } |||«      }
|
 }|�sGddt        j                  «       v st        j                  t        «      rt        j                  t        «      nd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                  |«      rt        j                  |«      nd
t        j                  |
«      dœz  }t        t        j                  |«      «      ‚d x}x}x}x}
}y )Nr   g      "@)r   r   g     @�@g     8�@)r   r   r   z^assert %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.promotable
}(%(py3)s, %(py4)s, %(py5)s)
}Úsweepr   Ú	incumbentÚ
historical)Úpy0Úpy2Úpy3Úpy4Úpy5Úpy7r   z„assert not %(py11)s
{%(py11)s = %(py2)s
{%(py2)s = %(py0)s.promotable
}(%(py7)s
{%(py7)s = %(py3)s(**%(py5)s)
}, %(py8)s, %(py9)s)
}r=   )rB   rC   rD   rF   rG   Úpy8Úpy9Úpy11é   )r   z�assert not %(py11)s
{%(py11)s = %(py2)s
{%(py2)s = %(py0)s.promotable
}(%(py7)s
{%(py7)s = %(py3)s(WFO_Neg_Folds=%(py5)s)
}, %(py8)s, %(py9)s)
}r   r   Úother)r   z�assert not %(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.promotable
}(%(py7)s
{%(py7)s = %(py3)s(Comparison_Fingerprint=%(py5)s)
}, %(py8)s)
})rB   rC   rD   rF   rG   rH   Úpy10r/   )
r=   r?   Ú
promotableÚ@py_builtinsÚlocalsÚ
@pytest_arÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)r   r@   rA   Ú@py_assert1Ú@py_assert6Ú@py_format8Ú@py_assert4Ú@py_assert10Ú@py_assert12Ú@py_format13Ú@py_assert9Ú@py_assert11Ú@py_format12s                r<   Ú1test_incompatible_high_history_is_provenance_onlyr`      sµ  € Ü“€IÜÑA¨¸RÑ@ÑA€IÜÑc¨%ÀÐ]aÑbÑc€JÜ×ÑÐ=Ñ˜I y°*Ó=Ð=Ò=×=×=×=×=Õ=Œ5×=×=Ó=Œ5×=×=Ô=Ð×=×=×=×=×=Ð=˜I×=×=Ó=˜I×=×=×=×=×=Ò= y×=×=Ó= y×=×=×=×=×=Ò=°*×=×=Ó=°*×=×=Ô=Ð=×=×=×=×=×=Ò=Ü×ÑÐZÐ)<¸bÐ(AÐZ¤Ñ BÐ(AÑ BÐZÑÐ BÀIÈzÓZÐZÐZÐZÐZÒZ×Z×Z×Z×ZÕZŒu×Z×ZÓZŒu×Z×ZÔZÐ×Z×Z×Z×Z×ZÐZ¤×Z×ZÓZ¤×Z×ZÔZÐ(A×Z×ZÒZÐ B×Z×Z×Z×Z×ZÐZÀI×Z×ZÓZÀI×Z×Z×Z×Z×ZÒZÈz×Z×ZÓZÈz×Z×ZÔZÐZ×Z×Z×Z×Z×Z×ZÐZÜ×ÑÐN°AÐN¤°AÔ 6ÐNÑÐ 6¸	À:ÓNÐNÐNÐNÐNÒN×N×N×N×NÕNŒu×N×NÓNŒu×N×NÔNÐ×N×N×N×N×NÐN¤×N×NÓN¤×N×NÔN°A×N×NÒNÐ 6×N×N×N×N×NÐN¸	×N×NÓN¸	×N×N×N×N×NÒNÀ:×N×NÓNÀ:×N×NÔNÐN×N×N×N×N×N×NÐNÜ×ÑÐT¨¸Ð(;ÐT¤Ñ <Ð(;Ñ <ÐTÑÐ <¸iÈÓTÐTÐTÐTÐTÒT×T×T×T×TÕTŒu×T×TÓTŒu×T×TÔTÐ×T×T×T×T×TÐT¤×T×TÓT¤×T×TÔTÐ(;×T×TÒTÐ <×T×T×T×T×TÐT¸i×T×TÓT¸i×T×T×T×T×TÒTÈ×T×TÓTÈ×T×TÔTÐT×T×T×T×T×T×TÐTÜ×ÑÐQ¸WÐQ¤¸WÔ EÐQÑÐ EÀyÓQÐQÐQÐQÐQÒQ×Q×Q×Q×QÕQŒu×Q×QÓQŒu×Q×QÔQÐ×Q×Q×Q×Q×QÐQ¤×Q×QÓQ¤×Q×QÔQ¸W×Q×QÒQÐ E×Q×Q×Q×Q×QÐQÀy×Q×QÓQÀy×Q×QÔQÐQ×Q×Q×Q×Q×Q×QÑQó    c                  ój
  — t        d!i ddi¤Ž} t        «       }t        j                  } || |«      }|�s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dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}}t        j                  }d}t        ||¬	«      } || |«      }| }|�sˆ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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œz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}ddiddiddiddiddiddiddiddiddiddif
D �]  }
t        j                  }t        | fi |
¤Ž} |||«      }| }|�sËt        j                  |
«      dz   dt        j                  «       v st        j                  t        «      rt        j                  t        «      nd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dt        j                  «       v st        j                  |
«      rt        j                  |
«      ndt        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      d œz  }t        t        j                  |«      «      ‚d x}x}x}}�Œ y )"Nr   éc   zUassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.promotable
}(%(py3)s, %(py4)s)
}r?   r   r@   )rB   rC   rD   rE   Úpy6z{})r.   z“assert not %(py11)s
{%(py11)s = %(py2)s
{%(py2)s = %(py0)s.promotable
}(%(py3)s, %(py9)s
{%(py9)s = %(py4)s(%(py5)s, Stability_Report=%(py7)s)
})
}r0   )rB   rC   rD   rE   rF   rG   rI   rJ   r-   Úfailedr.   r+   rL   r   r   r   r   éÿÿÿÿr   é   r   rK   r   Ú
incompleter   z†
>assert not %(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.promotable
}(%(py7)s
{%(py7)s = %(py3)s(%(py4)s, **%(py5)s)
}, %(py8)s)
}Úchange)rB   rC   rD   rE   rF   rG   rH   rM   r/   )r=   r?   rN   rO   rP   rQ   rR   rS   rT   rU   r0   Ú_format_assertmsg)r   r@   rV   Ú@py_assert5Ú@py_format7rW   Ú@py_assert8rZ   r[   r\   ri   r]   r^   r_   s                 r<   ÚItest_execution_guard_replaces_raw_proximity_without_weakening_other_gatesrn   '   s  € ÜÑ-˜¨Ð,Ñ-€IÜ“€IÜ×ÑÐ1Ñ˜I yÓ1Ð1Ò1×1×1×1×1Õ1Œ5×1×1Ó1Œ5×1×1Ô1Ð×1×1×1×1×1Ð1˜I×1×1Ó1˜I×1×1×1×1×1Ò1 y×1×1Ó1 y×1×1Ô1Ð1×1×1×1×1×1Ò1Ü×ÑÐRÈDÐR¬4°	ÈDÔ+QÐRÑ 	Ð+QÓRÐRÐRÐRÐRÒR×R×R×R×RÕRŒu×R×RÓRŒu×R×RÔRÐ×R×R×R×R×RÐR 	×R×RÓR 	×R×R×R×R×RÒR¬4×R×RÓR¬4×R×R×R×R×RÒR°	×R×RÓR°	×R×RÔRÈD×R×RÒRÐ+Q×R×RÒRÐR×R×R×R×R×R×RÐRØ&¨Ð1Ð4FÈÐ3MØ.°Ð8¸>È1Ð:MØ! 1Ð%¨°rÐ':¸_ÈaÐ<PØ" AÐ&Ð)<¸lÐ(KØ'¨Ð+ô	-ˆô
 ×#Ñ#ÐQ¤D¨Ñ$=°fÑ$=ÐQÑ#Ð$=¸yÓIÐQÐIÐIÐQÒI×QÖQÈ6×Q×Q×Q×Q×QÓQ”5×Q×QÓQ”5×Q×QÔQÐ#×Q×Q×Q×Q×QÐQ¤D×Q×QÓQ¤D×Q×Q×Q×Q×QÒQ¨×Q×QÓQ¨×Q×Q×Q×Q×QÒQ°f×Q×QÓQ°f×Q×QÔQÐ$=×Q×Q×Q×Q×QÐQ¸y×Q×QÓQ¸y×Q×QÔQÐI×Q×Q×Q×Q×Q×QÐQñ-ra   Ústatusre   rh   c           	      óV  — t        | ¬«      }t        j                  }t        «       } |||«      }| }|�s3ddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      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                  |«      dœz  }t        t        j                  |«      «      ‚d x}x}x}}t        j                  t        «      5  t        |«       d d d «       y # 1 sw Y   y xY w)N)r   zpassert not %(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.promotable
}(%(py5)s
{%(py5)s = %(py3)s()
}, %(py6)s)
}r?   r=   r@   )rB   rC   rD   rF   rd   rH   )r=   r?   rN   rO   rP   rQ   rR   rS   rT   rU   ÚpytestÚraisesÚ
ValueErrorr   )ro   r@   rV   rY   Ú@py_assert7r]   Ú@py_format10s          r<   Ú0test_failed_or_incomplete_incumbent_fails_closedrv   4   sç   € ä¨Ô/€IÜ×ÑÐ3¤£Ð3Ñ ¨Ó3Ð3Ð3Ð3Ð3Ò3×3×3×3×3Õ3Œu×3×3Ó3Œu×3×3Ô3Ð×3×3×3×3×3Ð3¤×3×3Ó3¤×3×3Ô3 ×3×3×3×3×3Ð3¨×3×3Ó3¨×3×3Ô3Ð3×3×3×3×3×3Ö3Ü	�‰”zÕ	"Ü�yÔ!÷ 
#×	"Ñ	"ús   Æ
FÆF(c                 óà  — t        j                  dt        j                  d«      d   g«      }t        j                  t        j                  d«      «      }| j	                  t         d|«       i }t        j
                  d||«      }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                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }d
d|iz  }	t        t        j                  |	«      «      ‚d x}x}}t         j
                  }
d} |
|||«      }||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                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  |«      rt        j                  |«      nd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}x}}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                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }d
d|iz  }	t        t        j                  |	«      «      ‚d x}x}}t        ||j                   dz   ¬«      }| j	                  t         d|«       t        j
                  d||«      d   }|d   }||k7  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}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                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }d
d|iz  }	t        t        j                  |	«      «      ‚d x}x}}t#        j$                  |d   «      }t        |«      }t         j&                  }t        |«      }d}||z   }||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                  |«      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}x}x}}d#„ |D «       }
t)        |
«      }|s•d$d%t        j                  «       v st        j                  t(        «      rt        j                  t(        «      nd%t        j                  |
«      t        j                  |«      d&œz  }t        t        j                  |«      «      ‚d x}
}y )'NÚ6HÚmlp_weights_fileÚ_COMPARISONrK   ©ú==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚcache©rB   Úpy1rD   rd   úassert %(py8)srH   )za%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.evaluate
}(%(py4)s, %(py5)s, %(py6)s)
} == %(py10)sr?   ÚparamsÚfirst)rB   rC   rE   rF   rd   rH   rM   zassert %(py12)sÚpy12Ú )Úmanifest_jsonr   ©ú!=)z%(py1)s != %(py4)s©r€   rE   úassert %(py6)srd   r   ÚPeriod_Measurementsé   )z|%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == (%(py10)s
{%(py10)s = %(py5)s(%(py8)s
{%(py8)s = %(py6)s.WFO_FOLDS
})
} + %(py12)s)r'   )rB   r€   rD   rF   rd   rH   rM   r„   zassert %(py15)sÚpy15c              3   óP   K  — | ]  }d |v xs |j                  d«      dk(  –— Œ  y­w)ÚentriesÚcoverageÚemptyN©Úget)Ú.0r6   s     r<   Ú	<genexpr>z5test_snapshot_and_compatible_cache.<locals>.<genexpr>K   s.   è ø€ Ð^ÑV]ÈFˆy˜FÐ"ÒG f§j¡j°Ó&<ÀÑ&GÓGÑV]ùs   ‚$&ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall©rB   rC   rE   )r?   Úcapture_comparisonÚload_winnerÚnormalise_paramÚsetattrÚevaluater}   rQ   Ú_call_reprcomparerO   rP   rR   rS   rT   rU   r   r†   r2   ÚloadsÚ	WFO_FOLDSr—   )ÚmonkeypatchÚsnapshotr‚   r~   rƒ   Ú@py_assert2rk   rY   rl   Ú@py_format9rV   Ú@py_assert3rt   r]   Ú@py_format11r\   ÚchangedÚ@py_assert0Ú@py_format5r'   r^   Ú@py_assert13Ú@py_format14Ú@py_format16s                           r<   Ú"test_snapshot_and_compatible_cacher­   <   sý  € Ü×'Ñ'¨¬u×/@Ñ/@ÀÓ/FÐGYÑ/ZÐ.[Ó\€HÜ×"Ñ"¤5×#4Ñ#4°TÓ#:Ó;€FØ×Ñœ˜}¨hÔ7Ø€EÜ�N‰N˜4 ¨Ó/€EÜˆu‹:Ð˜Ðˆ:˜‰?××Õˆ:˜×××××ÑŒ3××ÓŒ3×××××Òˆu××Óˆu××Ôˆ:××Ò˜××××××ÓÜ�>‰>Ð7˜$Ð7‰>˜$ ¨Ó.Ð7Ð.°%Ñ7×7×7Ö7Ð.°%×7×7×7×7×7Ñ7Œ5×7×7Ó7Œ5×7×7Ô7ˆ>×7×7Ò7˜$×7×7×7×7×7Ð7 ×7×7Ó7 ×7×7×7×7×7Ò7¨×7×7Ó7¨×7×7Ô7Ð.×7×7×7×7×7Ð7°%×7×7Ó7°%×7×7×7×7×7×7×7Üˆu‹:Ð˜Ðˆ:˜‰?××Õˆ:˜×××××ÑŒ3××ÓŒ3×××××Òˆu××Óˆu××Ôˆ:××Ò˜××××××ÓÜ�h¨h×.DÑ.DÀsÑ.JÔK€GØ×Ñœ˜}¨gÔ6Ü�>‰>˜$ ¨Ó.Ð/GÑHÐkÈEÐRjÑLkÐkÐHÐLkÑk×k×kÕkÐHÐLk×k×kÓkÐH×k×kÒkÐLk×k×k×k×k×k×kÓkÜˆu‹:Ð˜Ðˆ:˜‰?××Õˆ:˜×××××ÑŒ3××ÓŒ3×××××Òˆu××Óˆu××Ôˆ:××Ò˜××××××ÓÜ�j‰j˜Ð4Ñ5Ó6€GÜˆw‹<Ð3œuŸ™Ð3œ3˜Ó/Ð3°!Ð3Ð/°!Ñ3Ð3ˆ<Ð3Ñ3×3×3Ö3ˆ<Ð3×3×3×3×3×3Ñ3Œ3×3×3Ó3Œ3×3×3×3×3×3Ò3ˆw×3×3Ó3ˆw×3×3Ô3ˆ<×3×3×3×3×3Ð3œ3×3×3Ó3œ3×3×3×3×3×3Ò3œu×3×3Ó3œu×3×3Ô3˜×3×3Ò3Ð/×3×3Ò3°!×3×3×3×3×3×3×3Ñ3Ù^ÑV]Ó^Ð^Œ3Ð^Ó^Ð^Ñ^×^×^×^×^Õ^Œ3×^×^Ó^Œ3×^×^Ô^Ð^×^×^Ò^Ð^×^×^×^×^×^Ó^ra   c                 ób  — t        j                  d«      d   }t        j                  d|g«      }t        j                  |j
                  d   d   «      }t        j                  |d   d   d   d   d<   t        ||t        j                  |«      j                  «       ff¬«      }| j                  t         d|«       t        j                  t        «      5  t        t        j                   dt        j"                  t        j                  d«      «      i «      «       d d d «       y # 1 sw Y   y xY w)	Nrx   ry   r   rK   ÚlayersÚW)Ú	artifactsrz   )r?   rš   r™   r2   rŸ   r±   ÚnpÚnanr   r3   Úencoderœ   rq   rr   rs   r   r�   r›   )r¡   Úpathr¢   Úpayloads       r<   Útest_nan_model_is_failed_replayr·   N   sé   € Ü×Ñ˜TÓ"Ð#5Ñ6€DÜ×'Ñ'¨¨t¨fÓ5€HÜ�j‰j˜×+Ñ+¨AÑ.¨qÑ1Ó2€GÜ&(§f¡f€GˆHÑ�aÑ˜Ñ˜aÑ  Ñ#Ü�x¨T´4·:±:¸gÓ3F×3MÑ3MÓ3OÐ,PÐ+RÔS€HØ×Ñœ˜}¨hÔ7Ü	�‰”zÕ	"Ü”u—~‘~ d¬E×,AÑ,AÄ%×BSÑBSÐTXÓBYÓ,ZÐ\^Ó_Ô`÷ 
#×	"Ñ	"ús   ÃAD%Ä%D.c            	      ó¶  ‡— t        j                  ddddg¬«      } i }| D ]W  }|d   dk(  sŒ|j                  |d   g «      j                  |j	                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}«       ŒY 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                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}t        |j                  «       «      Šˆfd„‰D «       }
t!        |
«      }|s•ddt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |
«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}
}y c c}}w )Nrx   é   éM   zMstrategies/params/mlp/mlp_weights_COINBASE_BTCUSD_6H_grouped_v1_seed9090.json)Úextra_weightsr   Úequal_tuningry   r   )ú>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr}   Ú	per_modelr   r�   rH   c              3   ó.   •K  — | ]  }|‰d    k(  –— Œ y­w)r   Nr/   )r”   ÚrowsÚvaluess     €r<   r•   z9test_equal_additional_threshold_budget.<locals>.<genexpr>b   s   øè ø€ Ð4©V Tˆt�v˜a‘yÕ ©Vùs   ƒr–   r—   r˜   )r?   Úgenerate_candidatesÚ
setdefaultÚappendÚitemsr}   rQ   rž   rO   rP   rR   rS   rT   rU   ÚlistrÁ   r—   )Ú
candidatesr¾   r5   r7   Úvr£   rk   rY   rl   r¤   rV   r¥   r©   rÁ   s                @r<   Ú&test_equal_additional_threshold_budgetrÉ   Y   s”  ø€ Ü×*Ñ*¨4°°RØWðHYô Z€Jà€IÛˆØˆx‰=˜NÓ*Ø× Ñ  Ð%7Ñ!8¸"Ó=×DÑDÐUX×U^ÑU^ÔU`ÔE|ÑU`ÉcÈaÐPQÐdeÐi{Ód{ÀaÈÁcÐU`ÒE|Õ}ð ô ˆy‹>Ð˜QÐˆ>˜QÑ××Õˆ>˜Q×××××ÑŒ3××ÓŒ3×××××Òˆy××Óˆy××Ôˆ>××Ò˜Q××××××ÓÜ�)×"Ñ"Ó$Ó%€FÛ4©VÓ4Ð4Œ3Ð4Ó4Ð4Ñ4×4×4×4×4Õ4Œ3×4×4Ó4Œ3×4×4Ô4Ð4×4×4Ò4Ð4×4×4×4×4×4Ó4ùó F}s   ÁIÁ+Ic                 óX  — t         j                  }t        j                  dt        j                  d«      d   g«      }| dz  }|j	                  |j
                  dz   «       t        j                  |j                  «      d   }|j                  d   d   }t        j                  ||g|t         j                  d|¬«      }|j                  }|j                  }||k7  }	|	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$                  |«      rt        j&                  |«      ndt        j&                  |«      dœz  }
dd|
iz  }t)        t        j*                  |«      «      ‚d x}x}	}t        j                  |j                  «      }|d   D ]F  }| |z  }|j,                  j/                  dd¬«       |j	                  ||z  j1                  «       «       ŒH | dz  j3                  d«       |j	                  |j
                  «       t        j                  ||g| t         j                  d|¬«      }|j                  }|j                  }||k7  }	|	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$                  |«      rt        j&                  |«      ndt        j&                  |«      dœz  }
dd|
iz  }t)        t        j*                  |«      «      ‚d x}x}	}y )Nrx   ry   zbars.csvó   
Úcontractr   )ÚrepoÚassetÚtfrÌ   r‡   )zT%(py2)s
{%(py2)s = %(py0)s.fingerprint
} != %(py6)s
{%(py6)s = %(py4)s.fingerprint
}Úchanged_dataÚoriginal)rB   rC   rE   rd   r�   rH   Úsource_hashesT)ÚparentsÚexist_okzstrategies/mlp_accounting.pyz# changed accountingÚchanged_accounting)r?   ÚREPOr™   rš   Úwrite_bytesÚdatar2   rŸ   r†   r±   r   ÚcaptureÚASSETÚfingerprintrQ   rž   rO   rP   rR   rS   rT   rU   ÚparentÚmkdirÚ
read_bytesÚ
write_text)Útmp_pathrÍ   rÑ   r   rÌ   ÚartifactrÐ   rV   rk   r¥   rl   r¤   Úmanifestrµ   ÚtargetrÕ   s                   r<   Ú/test_real_data_and_source_hashes_change_contexträ   e   s†  € Ü�:‰:€DÜ×'Ñ'¨¬u×/@Ñ/@ÀÓ/FÐGYÑ/ZÐ.[Ó\€HØ˜
Ñ"€FØ
×Ñ�x—}‘} uÑ,Ô-Ü�z‰z˜(×0Ñ0Ó1°*Ñ=€HØ×!Ñ! !Ñ$ QÑ'€HÜ%×-Ñ-¨f°x°jÀtÜŸ+™+¨$¸ôC€Là×#Ñ#Ð; x×';Ñ';Ð;Ð#Ð';Ñ;×;×;Õ;Ð#Ð';×;×;×;×;×;Ñ;ˆ<×;×;Ó;ˆ<×;×;Ô;Ð#×;×;×;×;×;Ð; x×;×;Ó; x×;×;Ô;Ð';×;×;×;×;×;×;Ó;Ü�z‰z˜(×0Ñ0Ó1€HØ˜Ô)ˆØ˜D‘ˆØ�‰×Ñ D°4ÐÔ8Ø×Ñ˜D 4™K×3Ñ3Ó5Õ6ð *ð Ð.Ñ.×:Ñ:Ð;QÔRØ
×Ñ�x—}‘}Ô%Ü+×3Ñ3°F¸X¸JÈXÜŸ+™+¨$¸ôCÐà×)Ñ)ÐA¨X×-AÑ-AÐAÐ)Ð-AÑA×A×AÕAÐ)Ð-A×A×A×A×A×AÑAÐ×A×AÓAÐ×A×AÔAÐ)×A×A×A×A×AÐA¨X×A×AÓA¨X×A×AÔAÐ-A×A×A×A×A×A×AÔAra   c                 ó*  — dd l }dd l}t        j                  d«      }t        j                  d|d   g«      }|j                  |j                  |j                  «      «      j                  d d }t        ||j                  d¬«      j                  «       ¬«      }| j                  t        d|«       t        j                  dt        j                  |«      i «      }|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}	}t)        j*                  t,        «      5  t/        |«       d d d «       y # 1 sw Y   y xY w)Nr   rx   ry   éd   F)Úindex)rØ   rz   r   rh   r{   )z%(py1)s == %(py4)sr‰   rŠ   rd   )ÚioÚpandasr?   rš   r™   Úread_csvÚBytesIOrØ   Úilocr   Úto_csvr´   rœ   r�   r›   rQ   rž   rS   rT   rU   rq   rr   rs   r   )r¡   rè   ÚpdÚwinnerr¢   Úframer5   r¨   r¥   r£   r©   rl   s               r<   Ú&test_real_truncated_data_is_incompleterñ   {   s  € ÛÛÜ×Ñ˜tÓ$€FÜ×'Ñ'¨¨vÐ6HÑ/IÐ.JÓK€HØ�K‰K˜Ÿ
™
 8§=¡=Ó1Ó2×7Ñ7¸¸Ð=€EÜ�x e§l¡l¸ lÓ&?×&FÑ&FÓ&HÔI€HØ×Ñœ˜}¨hÔ7Ü
�.‰.˜œu×4Ñ4°VÓ<¸bÓ
A€CØÐ"Ñ#Ð3 |Ð3Ð# |Ñ3×3×3Õ3Ð# |×3×3Ó3Ð#×3×3Ò3 |×3×3×3×3×3×3Ó3Ü	�‰”zÕ	"Ü�sÔ÷ 
#×	"Ñ	"ús   Å4F	Æ	Fc           	      ó$  ‡— t         j                  Šˆfd„}| j                  t         d|«       | j                  t         dd„ «       t        j                  t
        d¬«      5  t        j                  ddd	d
dd¬«       d d d «       y # 1 sw Y   y xY w)Nc                 óN   •—  ‰| ||«      }|j                  d«      dk(  rd|d<   |S )Nr   Úcurrentre   r   r’   )rÏ   r‚   r~   r5   rÑ   s       €r<   re   z;test_force_does_not_bypass_failed_incumbent.<locals>.failed‹   s2   ø€ Ù�r˜6 5Ó)ˆØ�:‰:�hÓ 9Ò,Ø'/ˆCÐ#Ñ$Øˆ
ra   r�   Úwrite_winnerc                  ó,   — t        j                  d«      S ©Nzmust not write©rq   Úfail©Úargss    r<   Ú<lambda>z=test_force_does_not_bypass_failed_incumbent.<locals>.<lambda>‘   ó   € ¼V¿[¹[ÐIYÔ=Zra   zIncumbent replay©Úmatchrx   r   rK   é
   FT)Úforce_promote©r?   r�   rœ   rq   rr   rs   Úrun_tf)r¡   re   rÑ   s     @r<   Ú+test_force_does_not_bypass_failed_incumbentr  ‰   si   ø€ Ü�~‰~€Hôð
 ×Ñœ˜z¨6Ô2Ø×Ñœ˜~Ñ/ZÔ[Ü	�‰”zÐ);Ö	<Ü�‰�T˜1˜a  U¸$Õ?÷ 
=×	<Ñ	<ús   Á!BÂBc                 ó(  ‡‡— t         j                  ŠdŠˆˆfd„}| j                  t         d|«       | j                  t         dd„ «       t        j                  t
        d¬«      5  t        j                  ddd	d
d«       d d d «       y # 1 sw Y   y xY w)Nr   c                 óh   •—  ‰| ||«      }|j                  d«      dk(  r‰dz  Š|dxx   ‰z  cc<   |S )Nr   rô   rK   r   r’   )rÏ   r‚   r~   r5   ÚcountrÑ   s       €€r<   Úunstablez>test_run_tf_rejects_nonreproducing_incumbent.<locals>.unstable™   s@   ø€ á�r˜6 5Ó)ˆØ�:‰:�hÓ 9Ò,Ø�Q‰JˆEØ�Ó 5Ñ(ÓØˆ
ra   r�   rõ   c                  ó,   — t        j                  d«      S r÷   rø   rú   s    r<   rü   z>test_run_tf_rejects_nonreproducing_incumbent.<locals>.<lambda>¡   rý   ra   znot reproduciblerþ   rx   rK   r   Fr  )r¡   r  r  rÑ   s     @@r<   Ú,test_run_tf_rejects_nonreproducing_incumbentr
  –   sl   ù€ Ü�~‰~€HØ€Eõð ×Ñœ˜z¨8Ô4Ø×Ñœ˜~Ñ/ZÔ[Ü	�‰”zÐ);Ö	<Ü�‰�T˜1˜a  UÔ+÷ 
=×	<Ñ	<ús   Á%BÂBc                  óÂ   — t        j                  d«      } d| d<   t        j                  t        d¬«      5  t        j
                  | «       d d d «       y # 1 sw Y   y xY w)Nrx   r³   Ú!i_long_entry_activation_thresholdzNonfinite parameterrþ   )r?   rš   rq   rr   rs   r›   )rï   s    r<   Ú.test_nonfinite_incumbent_parameter_is_rejectedr  ¦   sG   € Ü×Ñ˜tÓ$€FØ27€FÐ.Ñ/Ü	�‰”zÐ)>Ö	?Ü×Ñ˜fÔ%÷ 
@×	?Ñ	?ús   ¶AÁAc                 óð   ‡— | dz  Š‰j                  d«       |j                  t        dˆfd„«       t        j                  t
        d¬«      5  t        j                  d«       d d d «       y # 1 sw Y   y xY w)Nz
winner.csvzmlp_weights_file,Calmar Ratio
Úwinner_pathc                 ó   •— ‰S )Nr/   )rÏ   rµ   s    €r<   rü   z?test_existing_empty_winner_is_not_a_new_asset.<locals>.<lambda>°   s   ø€ ¹ra   zno replayable rowrþ   rx   )rß   rœ   r?   rq   rr   rs   rš   )rà   r¡   rµ   s     @r<   Ú-test_existing_empty_winner_is_not_a_new_assetr  ­   sU   ø€ Ø�lÑ"€DØ‡O�OÐ5Ô6Ø×Ñœ˜}«oÔ>Ü	�‰”zÐ)<Ö	=Ü×Ñ˜$Ô÷ 
>×	=Ñ	=ús   ÁA,Á,A5)&ÚbuiltinsrO   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterQ   r2   Údataclassesr   Únumpyr²   rq   Ústrategies.mlp_comparisonr   r   Útools.run_mlp_deep_sweepÚrun_mlp_deep_sweepr?   Ú"strategies.mlp_execution_stabilityr   r   r   r	   r=   r`   rn   ÚmarkÚparametrizerv   r­   r·   rÉ   rä   rñ   r  r
  r  r  r/   ra   r<   Ú<module>r     s�   ðß  „ ƒÝ ã Û ç HÝ (ß ]Ó ]òò Rò
Rð ‡�×Ñ˜ H¨lÐ#;Ó<ñ"ó =ð"ò_ò$aò	5òBò,ò
@ò,ò &ó ra   