Ë
    €^±jß¥  ã            	      óˆ  — U d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z
ddlZddlmZ ddlZddlZddlmZ ddlZddlZddlZ ee«      j1                  «       j2                  j2                  Zej6                  j9                  d ee«      «       ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3 d	Z4e4a5g d
¢Z6edz  dz  Z7edz  dz  Z8edz  dz  Z9da:de;d<   da<de;d<   g d¢Z=g d¢Z>dZ?dZ@dZAd6d„ZBd7d„ZCd6d„ZDd8d„ZEd9d:d„ZFd;d„ZGd<d„ZHd=d„ZId>d „ZJd?d!„ZK	 	 	 d@	 	 	 	 	 	 	 	 	 dAd#„ZLdBd$„ZMdCd%„ZNdDd&„ZO eP«       ZQdEd'„ZRdFd(„ZSdGd)„ZTdHd*„ZUdId+„ZV	 dJ	 	 	 dKd,„ZWdLd-„ZX	 dM	 	 	 	 	 	 	 dNd.„ZYdOd/„ZZdPd0„Z[	 	 	 	 	 	 	 	 dQd1„Z\dQd2„Z]dde2d"d"ddddf		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dRd3„Z^dSd4„Z_e`d5k(  r e_«        yy)Ta  
Deeper threshold sweep for BTC MLP presets.

This intentionally keeps MLP weights fixed and explores threshold/config
parameters around the current winners and artifact recommendations. It reuses
strategy_mlp_scores' score-to-signal block and canonical calculate_metrics so
candidate metrics stay comparable to optimizer winners.

Examples:
    .venv/bin/python tools/run_mlp_deep_sweep.py --timeframes 6H 8H 12H 1D --samples 50000
    .venv/bin/python tools/run_mlp_deep_sweep.py --timeframes 6H --samples 10000 --promote
é    )ÚannotationsN)ÚPath)ÚAny)
Ú	OOS_STARTÚSCORE_STARTÚSUBPERIOD_SPLITÚ	TRAIN_ENDÚTRAIN_STARTÚ	WFO_FOLDSÚWFO_MIN_OOS_TRADESÚWFO_MIN_VALID_FOLDSÚcomposite_scoreÚget_min_trades)ÚFEATURE_COLSÚ_prepare_featuresÚ_score_to_signalsÚcalculate_metricsÚload_mlp_artifactÚmlp_forward)ÚDEFAULT_WORKER_FRACTIONÚresolve_worker_countÚCOINBASE_BTCUSD©Ú4HÚ6HÚ8HÚ12HÚ1DÚresultsÚwinnersÚsweepsÚreportsz
str | NoneÚ
_WORKER_TFzIdict[str, tuple[pd.DataFrame, np.ndarray, np.ndarray, np.ndarray]] | NoneÚ_WORKER_CACHE©Úmlp_weights_fileÚ!i_long_entry_activation_thresholdÚ i_long_exit_activation_thresholdÚ-i_long_exit_activation_confirmation_thresholdÚi_trailing_stop_thresholdÚi_use_long_exit_confirmationÚi_use_long_entry_confirmationÚi_regime_windowÚi_regime_entry_min_scoreÚi_mvrv_suppress_bearÚi_exit_score_windowÚi_entry_score_window)úTotal TradesúTotal P&L %úSharpe RatioúSortino RatioúCalmar RatioúP&L/DD RatioúMax Drawdown %ú% In MarketúOOS_Total TradesúOOS_Total P&L %úOOS_Sortino RatioÚOOS_Bear_Pctç      ð?é   g     @U@c                ó*   — t         dt        › d| › d�z  S )NÚ(optimization_winner_strategy_mlp_scores_Ú_ú.csv)Ú
WINNER_DIRÚASSET©Útfs    úd/Users/jameslopez/projects/TradingBot25/results/mlp_comparison_migration_2026_09_21/initial_sweep.pyÚwinner_pathrI   i   s   € ÜÐBÄ5À'ÈÈ2È$ÈdÐSÑSÐSó    c                ó   — dt         › d| › d�S )Nz"strategies/params/mlp/mlp_weights_rB   z.json)rE   rF   s    rH   Úartifact_pathrL   m   s   € Ø/´¨w°a¸°t¸5ÐAÐArJ   c                ó¸   — ddddddœ}|j                  | | «      }t        dz  dz  t        › d	|› d
�z  }|j                  «       r|S t        dz  t        › d| › d
�z  S )NÚ240Ú360Ú480Ú720r   r   ÚdataÚmlpz, rC   Ú-)ÚgetÚREPOrE   Úexists)rG   Ú_TF_MINUTESÚperiodÚmlp_paths       rH   Ú	data_pathr[   q   sm   € à e°5ÀÈdÑS€KØ�_‰_˜R Ó$€FÜ�f‰}˜uÑ$¬%¨°°6°(¸$Ð'?Ñ?€HØ‡�ÔØˆÜ�&‰=œe˜W A b T¨Ð.Ñ.Ð.rJ   c                óx   — t        | t        «      r | j                  «       j                  «       dv S t	        | «      S )N>   Ú1ÚyesÚtrue)Ú
isinstanceÚstrÚstripÚlowerÚbool)Úvs    rH   Úas_boolrf   {   s.   € Ü�!”SÔØ�w‰w‹y�‰Ó Ð$8Ð8Ð8Ü�‹7€NrJ   c                ój   — 	 t        j                  | «      r|S t        | «      S # t        $ r |cY S w xY w©N)ÚpdÚisnaÚfloatÚ	Exception)re   Údefaults     rH   Úas_floatrn   �   s4   € ðÜ�7‰7�1Œ:ØˆNÜ�Q‹xˆøÜò ØŠðús   ‚$ ™
$ ¤2±2c                ó:  — t        | «      }|j                  «       sy t        t        j                  |j                  «       «      «      }|sy t        |d   «      }t        |j                  dd«      «      |d<   t        |j                  dd«      «      |d<   d|d<   |S )Nr   r/   Fr,   r?   r+   )	rI   rW   ÚlistÚcsvÚ
DictReaderÚopenÚdictrf   rU   )rG   ÚpathÚrowsÚrows       rH   Úload_winnerrx   Š   sŒ   € Ü�r‹?€DØ�;‰;Œ=ØÜ”—‘˜tŸy™y›{Ó+Ó,€DÙØÜ
ˆt�A‰w‹-€CÜ")¨#¯'©'Ð2HÈ%Ó*PÓ"Q€CÐÑÜ+2°3·7±7Ð;ZÐ\aÓ3bÓ+c€CÐ'Ñ(Ø*+€CÐ&Ñ'Ø€JrJ   c                ó  — t        | «      }|d   j                  di «      j                  di «      }| |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      d	d
ddd
d	d	dœ}|S )NÚmetaÚtrainingÚrecommended_thresholdsr'   ç        r(   r)   r*   r?   Fr   ç     @�Àr%   )r   rU   )Úweights_pathÚartÚrecÚparamss       rH   Úrecommended_from_artifactrƒ   ˜   s–   € Ü
˜LÓ
)€CØ
ˆf‰+�/‰/˜* bÓ
)×
-Ñ
-Ð.FÈÓ
K€Cà(Ø-0¯W©WÐ5XÐZ]Ó-^Ø,/¯G©GÐ4VÐX[Ó,\Ø9<¿¹Ø;¸Só:
ð &)§W¡WÐ-HÈ#Ó%NØ()Ø).ØØ$+Ø %Ø Ø !ñ€Fð  €MrJ   c                óz   — t        t        | |«      ||z
  «      } t        | |z
  |z  «      }t        |||z  z   d«      S )Né   )ÚminÚmaxÚround)ÚvalueÚstartÚstopÚstepÚns        rH   ÚsnaprŽ   ®   sB   € Ü”�E˜5Ó! 4¨$¡;Ó/€EÜˆu�u‰} Ñ$Ó%€AÜ�˜˜T™Ñ! 1Ó%Ð%rJ   c                ó¼   — | d   t        | d   «      t        | d   «      t        | d   «      t        | d   «      t        t        | j                  dd«      «      «      fS )Nr&   r'   r(   r)   r*   r/   F)rn   rd   rf   rU   ©Úps    rH   Ú	param_keyr’   ´   sf   € à	Ð
ÑÜ�Ð6Ñ7Ó8Ü�Ð5Ñ6Ó7Ü�ÐBÑCÓDÜ�Ð.Ñ/Ó0ÜŒW�Q—U‘UÐ1°5Ó9Ó:Ó;ðð rJ   c                ó¨  — t        | d   «      t        | d   «      t        | d   «      t        | d   «      t        dt        | j                  dd«      «      «      ddd	d
t	        | j                  dd«      «      t        dt        t        | j                  dd«      «      «      «      t        dt        t        | j                  dd«      «      «      «      dœS )Nr&   r'   r(   r)   r}   r*   r?   Fr   r~   r/   r0   r1   r%   )ra   rn   r‡   rU   rf   Úintr�   s    rH   Únormalise_paramr•   ¿   sÇ   € ä Ð"4Ñ 5Ó6Ü-5°aÐ8[Ñ6\Ó-]Ü,4°QÐ7YÑ5ZÓ,[Ü9AØÐ=Ñ>ó:
ô &)¨¬h°q·u±uÐ=XÐZ]Ó7^Ó._Ó%`Ø()Ø).ØØ$+Ü '¨¯©Ð.DÀeÓ(LÓ MÜ" 1¤c¬(°1·5±5Ð9NÐPQÓ3RÓ*SÓ&TÓUÜ # A¤s¬8°A·E±EÐ:PÐRSÓ4TÓ+UÓ'VÓ Wñð rJ   Fc	                ó
  ‡!‡"— t         j                  j                  |«      }	t        | «      }
t	        | «      }|xs g }g }|
r|j                  t        |
«      «       t        j                  j                  |«      r#|j                  t        t        |«      «      «       |D ]%  }|j                  t        t        |«      «      «       Œ' | dk(  rVt        dk(  rMt	        d«      }t        j                  j                  |«      r#|j                  t        t        |«      «      «       t        «       Š"g Š!d"ˆ!ˆ"fd„}|rdnd\  }}|rdnd\  }}|�|n|}|�|n|}|�|n|}|�|n|}|rd	nd
}t        j                  d|d«      }|D ]k  }t        |«      }t        |j!                  dd«      «      }t#        |t        j$                  t        j&                  ||z
  «      «         «      |d<    ||d«       Œm t)        d||z
  dz  «      }t)        d||z
  dz  «      }t+        |dz  «      }t)        d||z
  «      }|�rlt)        d|t-        |«      z  «      }t/        |«      D �]E  \  }}t1        |«      D �]0  }t        |«      }t3        |	j5                  t        |d   «      |«      ||d«      |d<   t3        |	j5                  t        |d   «      |«      ||d«      |d<   t3        |	j5                  t        |d   «      |«      ||d«      |d<   t#        |	j7                  t        j                  d|d«      «      «      |d<   t9        |	j7                  ddg«      «      |d<   t+        |	j7                  g d¢«      «      |d<   t+        |	j7                  g d¢«      «      |d<    ||d|› �«       �Œ3 �ŒH t;        |D �ch c]  }|d   ’Œ	 c}«      } t1        |«      D �]5  }t=        |	j7                  | «      «      t#        |	j7                  t        j                  ||d«      «      «      t#        |	j7                  t        j                  ||d«      «      «      t#        |	j7                  t        j                  ||d«      «      «      t#        |	j7                  t        j                  d|d«      «      «      ddddt9        |	j7                  ddg«      «      t+        |	j7                  g d¢«      «      t+        |	j7                  g d¢«      «      d œ} ||d!«       �Œ8 ‰!S c c}w )#Nr   r   r   c                óŠ   •— t        | «      }t        |«      }|‰v ry ‰j                  |«       ||d<   ‰j                  |«       y )NÚsource)r•   r’   ÚaddÚappend)r‘   r˜   ÚppÚkeyÚoutÚseens       €€rH   r™   z generate_candidates.<locals>.addì   s?   ø€ Ü˜QÓˆÜ˜‹mˆØ�$‰;ØØ�‰�ŒØˆˆ8‰Ø�
‰
�2�rJ   )g     À‚Àg     À‚@)ç     ÀrÀg     Àr@)g     p‡Àg     p‡@)rŸ   g      y@g      Y@g      I@r}   g      @r*   Úseedg      @g      $@gÍÌÌÌÌÌä?r   r?   r'   r(   r)   FTr/   )r?   r?   r?   é   é   é   é   r0   r1   Úlocal_r&   r~   r%   Úbroad)r‘   údict[str, Any]r˜   ra   ÚreturnÚNone)ÚnpÚrandomÚdefault_rngrx   rL   rš   r•   Úosru   rW   rƒ   rE   ÚsetÚarangert   rn   rU   rk   ÚargminÚabsr‡   r”   ÚlenÚ	enumerateÚrangerŽ   ÚnormalÚchoicerd   Úsortedra   )#rG   Úsamplesr    Úextra_weightsÚwideÚentry_loÚentry_hiÚexit_loÚexit_hiÚrngÚcurrentÚown_artifactÚseedsr   Úalt_12hr™   Ú_entry_lo_defÚ_entry_hi_defÚ_exit_lo_defÚ_exit_hi_defÚtrail_hiÚallowed_trailÚsÚ	raw_trailÚlocal_sigma_entryÚlocal_sigma_exitÚlocal_nÚbroad_nÚper_seedÚirB   r‘   Úweight_choicesr�   rž   s#                                    @@rH   Úgenerate_candidatesrÓ   Ò   sŽ  ù€ ô �)‰)×
Ñ
 Ó
%€CÜ˜"‹o€GÜ  Ó$€LØ!Ò' R€Mà"$€EÙØ�‰”_ WÓ-Ô.Ü	‡w�w‡~�~�lÔ#Ø�‰”_Ô%>¸|Ó%LÓMÔNÛ%ˆØ�‰”_Ô%>¸|Ó%LÓMÕNð &ð 
ˆT‚z”eÐ0Ò0ô   Ó&ˆÜ�7‰7�>‰>˜'Ô"Ø�L‰LœÔ)BÀ7Ó)KÓLÔMä!$£€DØ "€Cöñ 7;¡?ÀÑ €M�=Ù6:¡?ÀÑ€L�<Ø#Ð/‰x°]€HØ#Ð/‰x°]€HØ"Ð/‰w°\€GØ"Ð/‰w°\€GÙ.2™5¸€Hä—I‘I˜c 8¨SÓ1€MÛˆÜ�‹GˆÜ˜QŸU™UÐ#>ÀÓDÓEˆ	Ü).¨}¼R¿Y¹YÄrÇvÁvÈmÐ^gÑNgÓGhÓ=iÑ/jÓ)kˆÐ
%Ñ&ÙˆAˆv�ð	 ô
 ˜s X°Ñ%8¸CÑ$?Ó@ÐÜ˜t g°Ñ&7¸3Ñ%>Ó?Ðä�'˜D‘.Ó!€GÜ�!�W˜wÑ&Ó'€GÚÜ�q˜'¤S¨£ZÑ/Ó0ˆÜ˜e×$‰DˆAˆqÜ˜8—_�Ü˜“G�Ü9=Ø—J‘Jœx¨Ð*MÑ(NÓOÐQbÓcØ˜h¨ó:�Ð5Ñ6ô 9=Ø—J‘Jœx¨Ð*LÑ(MÓNÐP`ÓaØ˜W dó9�Ð4Ñ5ô FJØ—J‘Jœx¨Ð*YÑ(ZÓ[Ð]mÓnØ˜W dóF�ÐAÑBô 27°s·z±zÄ"Ç)Á)ÈCÐQYÐ[^ÓB_Ó7`Ó1a�Ð-Ñ.Ü,0°·±¸UÀD¸MÓ1JÓ,K�Ð(Ñ)Ü+.¨s¯z©zÒ:OÓ/PÓ+Q�Ð'Ñ(Ü,/°·
±
Ò;PÓ0QÓ,R�Ð(Ñ)Ù�A˜ ˜s�|Ö$ò% %ð %ô* ¹EÓB¹E°q˜QÐ1Ó2¸EÑBÓC€NÜ�7�^ˆä # C§J¡J¨~Ó$>Ó ?Ü16°s·z±zÄ"Ç)Á)ÈHÐV^Ð`cÓBdÓ7eÓ1fÜ05°c·j±jÄÇÁÈ7ÐT[Ð]aÓAbÓ6cÓ0dÜ=BÀ3Ç:Á:ÌbÏiÉiÐX_ÐahÐjnÓNoÓCpÓ=qÜ).¨s¯z©z¼"¿)¹)ÀCÈÐSVÓ:WÓ/XÓ)YØ,-Ø-2Ø Ø(/Ü$(¨¯©°U¸D°MÓ)BÓ$CÜ#& s§z¡zÒ2GÓ'HÓ#IÜ$'¨¯
©
Ò3HÓ(IÓ$Jñ
ˆñ 	ˆAˆwŽð ð" €Jùò% Cs   Î&S?c                ó:  — t        j                  t        | «      «      }|j                  j                  j                  «       j                  j                  «       |_        t         j                  j                  j                  |d   «      rdnd }t        j                  |d   |d¬«      j                  j                  d «      |d<   |j                  |d   t        k\     j                  «       j!                  d¬«      }t#        |«      }|j%                  d«      xs g }|D �cg c]  }|t&        vsŒ||j                  vsŒ|‘Œ }}|r/t)        dt*        j,                  j/                  |«      › d|› d	�«      ‚t1        ||xs d «      }|g d
¢   j                  «       }	dD ]  }
|
|j                  v sŒ||
   |	|
<   Œ t3        ||d   «      |	d<   |	|d d …df   |d   j5                  t6        j8                  «      |d   j5                  t6        j8                  «      fS c c}w )NÚtimerÊ   T)ÚunitÚutc)ÚdropÚfeature_colszStale artifact z8: expects features not in current FEATURE_COLS or data: z. Retrain to skip.)rÕ   ÚcloseÚhigh)Úmvrv_regimeÚlayersÚactivation_scoreé	   rÚ   rÛ   )ri   Úread_csvr[   Úcolumnsra   rc   rb   ÚapiÚtypesÚis_numeric_dtypeÚto_datetimeÚdtÚtz_localizeÚlocr
   ÚcopyÚreset_indexr   rU   Ú_FEATURE_COLSÚ
ValueErrorr­   ru   Úbasenamer   r   Úto_numpyrª   Úfloat64)rG   r   ÚfullrÖ   r€   Úart_colsÚcÚmissing_from_currentÚXÚscoredÚcols              rH   Úload_scored_framer÷   4  sá  € Ü�;‰;”y “}Ó%€DØ—<‘<×#Ñ#×)Ñ)Ó+×/Ñ/×5Ñ5Ó7€D„LÜ—&‘&—,‘,×/Ñ/°°V±Ô=‰3À4€DÜ—>‘> $ v¡,°T¸tÔD×GÑG×SÑSÐTXÓY€Dˆ�LØ�8‰8�D˜‘L¤KÑ/Ñ0×5Ñ5Ó7×CÑCÈÐCÓN€Dä
˜LÓ
)€CØ�w‰w�~Ó&Ò,¨"€HÙ'/Ód¡x !°1¼MÒ3IÈaÐW[×WcÑWcÒNcšA xÐÐdÙÜØœbŸg™g×.Ñ.¨|Ó<Ð=ð >-Ø-AÐ,BÐBTðVó
ð 	
ô 	˜$ Ò 0¨DÓ1€AØÒ+Ñ,×1Ñ1Ó3€FÛˆØ�$—,‘,ÒØ˜s™)ˆF�3ŠKð  ô "-¨Q°°H±Ó!>€FÐÑØ�1’Q˜�T‘7˜D ™M×2Ñ2´2·:±:Ó>ÀÀVÁ×@UÑ@UÔVX×V`ÑV`Ó@aÐaÐaùò es   Ä"HÄ0HÄ?Hc           	     óŒ  — t        j                  t        |d   «      t        |d   «      t        |d   «      gt         j                  ¬«      }t        j                  t        j
                  | j                  t         j                  «      d d …d f   |d d d …f   z
  «      d¬«      }t        t        j                  ||k  «      «      S )Nr'   r(   r)   )Údtyper?   )Úaxis)	rª   Úarrayrn   rï   r†   r±   rî   r”   Úsum)Úscoresr‚   ÚmarginÚ
thresholdsÚdists        rH   Úfragile_countr  L  s¡   € Ü—‘ä�VÐ?Ñ@ÓAÜ�VÐ>Ñ?Ó@Ü�VÐKÑLÓMð	
ô
 �j‰jô€Jô �6‰6”"—&‘&˜Ÿ™¬¯©Ó4²Q¸°WÑ=À
È4ÒQRÈ7Ñ@SÑSÓTÐ[\Ô]€DÜŒr�v‰v�d˜V‘mÓ$Ó%Ð%rJ   c                ó:  — | | d   t        j                  |«      k\  | d   t        j                  |«      t        j                  d¬«      z   k  z     }t        |«      dk  ryt	        d|d   j
                  d   |d   j
                  d   z
  j                  dz  «      S )	NrÕ   r?   ©Údaysr¡   ç      à?éÿÿÿÿr   g     Ôv@)ri   Ú	TimestampÚ	Timedeltar²   r‡   Úilocr  )ÚdfÚscore_startÚendÚsls       rH   Úis_yearsr  Y  s�   € Ø	ˆR�‰Zœ2Ÿ<™<¨Ó4Ñ4¸¸F¹ÄbÇlÁlÐSVÓFWÔZ\×ZfÑZfÐlmÔZnÑFnÑ9nÑoÑ	p€BÜ
ˆ2ƒw�‚{ØÜˆs�R˜‘Z—_‘_ RÑ(¨2¨f©:¯?©?¸1Ñ+=Ñ=×CÑCÀfÑLÓMÐMrJ   c                ó\  — |d   }||vr	 t        | |«      ||<   ||   t        u rnt        |«      }|j                  i 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d“dg “dd“d	ddd	d	d	d	dd|j                  dd«      dœ
¥«       |S ||   \  }}}}	t        |«      }
t        |
d<   t        |j                  «       |
|||	«      }||d   t        j                  t        «      t        j                   d ¬!«      z   k     j                  «       }t#        |t        ¬"«      }t%        |t        t        «      }t'        |j                  dd	«      |j                  dd	«      t)        |j                  dd«      «      ||j                  dd	«      «      }t        j                  t*        «      }t#        ||d   |k     j                  «       t        ¬"«      }t#        |t*        ¬"«      }g }t,        D ]¨  \  }}}||d   t        j                  |«      t        j                   d ¬!«      z   k     j                  «       }t#        ||t.        ¬#«      }t)        |j                  dd«      «      t.        k\  sŒ|j1                  t3        |j                  dd$«      «      «       Œª t5        |«      t6        k\  rXt3        t9        j:                  |«      «      }t3        t9        j<                  |«      «      }t)        t?        d%„ |D «       «      «      }nd	}d$}t5        t,        «      }|d   jA                  «       t        j                  tB        «      k\  rRt#        |tB        d ¬#«      }t)        |j                  dd«      «      dk(  rDd&D ]  }|j                  |«      d'k(  sŒd	||<   Œ n"tD        D �ci c]  }|t8        jF                  “Œ }}t8        jF                  x}x} }!d(|jH                  v rª||d   t        j                  tB        «      k\     }"t5        |"«      dkD  rzt5        |"«      }#t3        |"d(   d)k(  j?                  «       |#z  d*z  «      }t3        |"d(   dk(  j?                  «       |#z  d*z  «      } t3        |"d(   d k(  j?                  «       |#z  d*z  «      }!tJ        D �ci c]  }|||   “Œ
 }}|j                  |«       |j                  i d|“dtM        |«      “d|j                  dd'«      “d+|j                  dd'«      “d,|j                  dd«      “d|j                  dd'«      “d-|j                  dd'«      “d.|j                  dd«      “d|“d|“d|“dtO        jP                  |D �$cg c]  }$tS        |$d/«      ‘Œ c}$«      “d|j                  dt8        jF                  «      “d0|j                  dt8        jF                  «      “d1|j                  dt8        jF                  «      “d2|j                  dt8        jF                  «      “d3|j                  dt8        jF                  «      “|| |!tU        |d4   |d5«      tU        |d4   |d6«      |j                  dd7«      d8œ¥«       |S # t        $ rD}t        dt        j                  j                  |«      › d|› �d¬«       t        ||<   Y d }~�Œ}d }~ww xY wc c}w c c}w c c}$w )9Nr&   z	  [SKIP] ú: T©Úflushr2   r   r3   r}   r4   ç     8�Àr5   r6   r7   r8   r9   Ú	CompositeÚMin_Trades_FloorÚSub1_CalmarÚSub2_CalmarÚ	WFO_ScoreÚWFO_Min_FoldÚWFO_Neg_Foldséc   ÚWFO_Fold_Calmarsr:   r˜   Ústale)
r;   r<   úOOS_Calmar RatioúOOS_Max Drawdown %r=   ÚOOS_Neutral_PctÚOOS_Bull_PctúFragile_0.05úFragile_1.0r˜   Ú_pine_time_startrÕ   r?   r  )r  )r  Ú
min_tradesç     ÀXÀc              3  ó,   K  — | ]  }|d k  sŒ	d–— Œ y­w)r   r?   N© )Ú.0rò   s     rH   Ú	<genexpr>zevaluate.<locals>.<genexpr>˜  s   è ø€ Ð;¡\ °Q¸³Uœ!¡\ùs   ‚
�)r6   r5   r4   ç      $ÀrÜ   r  éd   ÚSub1_SortinoÚSub1_TradesÚSub2_SortinoÚSub2_Tradesé   r;   r<   r  r  rÞ   gš™™™™™©?r>   Ú	candidate)r=   r   r!  r"  r#  r˜   )+r÷   rì   Úprintr­   ru   rí   Ú_STALE_SENTINELrt   ÚupdaterU   r   r   ré   ri   r  r	   r  r   r  r   r”   r   r   r   rš   rk   r²   r   rª   Úmeanr†   rü   r‡   r   ÚMETRIC_COLSÚnanrá   Ú
PARAM_COLSr   ÚjsonÚdumpsrˆ   r  )%rG   r‚   ÚcacheÚweightsÚexcÚresultrõ   Ú
stoch_peakÚ	close_arrÚhigh_arrÚsignal_paramsÚsigsÚ
train_sigsÚmetricsÚyearsÚcompÚsplitÚsub1Úsub2Úfold_calmarsrB   Ú	oos_startÚoos_endÚfold_windowÚfold_metricsÚ	wfo_scoreÚwfo_minÚwfo_negÚoosÚ_kÚkÚoos_bear_pctÚoos_neutral_pctÚoos_bull_pctÚoos_sigsr�   rò   s%                                        rH   Úevaluater[  c  s  € ØÐ'Ñ(€GØ�eÑð	-Ü.¨r°7Ó;ˆE�'‰Nð ˆW�~œÑ(ä�f“ˆØ�‰ð 	A�~ qð 	A¨-¸ð 	A¸nÈfð 	AØ'¨ð	AØ1?Àð	AØIWÐY\ð	Aà(¨#ð	Aà/<¸cð	AàCNÐPSð	Að +¨Að	Að 0=¸fð	Að GTÐU[ð	Að $ Vð		Að .<¸Vð		Að FUÐVXð		Að
 +¨Bð	Að
 1CÀAð	Að
 [^Ø-3ÈØ.1À3Ð[^Ø(+¸RÐPRØ"(§*¡*¨X°wÓ"?ò	Aô 		Bð ˆØ.3°G©nÑ+€FˆJ˜	 8Ü˜“L€MÜ(3€MÐ$Ñ%Ü˜VŸ[™[›]¨M¸:ÀyÐRZÓ[€Dà�d˜6‘l¤R§\¡\´)Ó%<¼r¿|¹|ÐQRÔ?SÑ%SÑSÑT×YÑYÓ[€JÜ 
¼ÔD€GÜ�Z¤¬iÓ8€EÜØ�‰�N CÓ(Ø�‰�O SÓ)ÜˆG�K‰K˜¨Ó*Ó+ØØ�‰�M 3Ó'ó€Dô �L‰LœÓ)€EÜ˜Z¨
°6Ñ(:¸UÑ(BÑC×HÑHÓJÔXcÔd€Dô ˜Z´_ÔE€Dà€Lß!*Ñˆˆ9�gØ  ¨FÑ!3´b·l±lÀ7Ó6KÌbÏlÉlÐ`aÔNbÑ6bÑ!bÑc×hÑhÓjˆÜ(¨À)ÔXjÔkˆÜˆ|×Ñ °Ó2Ó3Ô7IÓIØ×Ñ¤ l×&6Ñ&6°~ÀuÓ&MÓ NÕOð	 "+ô
 ˆ<ÓÔ/Ò/Üœ"Ÿ'™' ,Ó/Ó0ˆ	ÜœŸ™˜|Ó,Ó-ˆÜ”cÑ;¡\Ó;Ó;Ó<‰àˆ	ØˆÜ”i“.ˆàˆF�|×ÑÓœRŸ\™\¬)Ó4Ò4Ü ´)ÈÔJˆô ˆs�w‰w�~ qÓ)Ó*¨aÒ/ÛG�Ø—7‘7˜2“; %Ó'Ø!�C˜’Gñ Hõ #.Ó.¡+˜Qˆq”"—&‘&‰y +ˆÐ.ô 57·F±FÐ:€LÐ:�? \Ø˜Ÿ™Ñ$Ø˜˜V™¬¯©´YÓ(?Ñ?Ñ@ˆÜˆx‹=˜1ÒÜ�H“ˆAÜ# X¨mÑ%<ÀÑ%B×$GÑ$GÓ$IÈAÑ$MÐPSÑ$SÓTˆLÜ# X¨mÑ%<ÀÑ%B×$GÑ$GÓ$IÈAÑ$MÐPSÑ$SÓTˆOÜ# X¨mÑ%<ÀÑ%B×$GÑ$GÓ$IÈAÑ$MÐPSÑ$SÓTˆLå4>Ó?±J¨q˜a ¨¡™l°J€FÐ?Ø
‡M�M�'ÔØ
‡M�Mð	
Ø˜ð	
à¤¨uÓ 5ð	
ð ˜4Ÿ8™8 N°EÓ:ð	
ð ˜DŸH™H _°eÓ<ð		
ð
 ˜4Ÿ8™8 N°AÓ6ð	
ð ˜4Ÿ8™8 N°EÓ:ð	
ð ˜DŸH™H _°eÓ<ð	
ð ˜4Ÿ8™8 N°AÓ6ð	
ð ˜ð	
ð ˜Gð	
ð ˜Wð	
ð ¤§
¡
ÁÓ+NÁ¸A¬E°!°Q­KÀÑ+NÓ Oð	
ð  §¡¨¼¿¹Ó ?ð	
ð ˜sŸw™w }´b·f±fÓ=ð	
ð   §¡¨¼"¿&¹&Ó!Að	
ð   §¡¨¼¿¹Ó ?ð!	
ð" ! #§'¡'Ð*:¼B¿F¹FÓ"Cð#	
ð$ )Ø.Ø(Ü)¨*Ð5GÑ*HÈ&ÐRVÓWÜ(¨Ð4FÑ)GÈÐQTÓUØ—j‘j ¨;Ó7ò/	
ôð6 €MøôU ò 	-Ü�IœbŸg™g×.Ñ.¨wÓ7Ð8¸¸3¸%Ð@ÈÕMÜ,ˆE�'�Nûð	-üò@ /ùò @ùò ,Os)   ‹Y ÎZÒ
Z$ÕZ)Ù	ZÙ9ZÚZc                ó   — | a i a|ay rh   )r#   r$   rE   )rG   Úassets     rH   Úinit_workerr^  Õ  s   € à€JØ€MØ�ErJ   c                óZ   — t         �t        €t        d«      ‚t        t         | t        «      S )Nz sweep worker was not initialized)r#   r$   ÚRuntimeErrorr[  )r‚   s    rH   Úevaluate_workerra  Ü  s(   € ÜÐœ]Ð2ÜÐ=Ó>Ð>Ü”J ¬Ó6Ð6rJ   c                ó:  — t        t        | j                  dd«      «      dk(  «      }t        | j                  dd«      «      }t        | j                  dd«      «      }t        t        | j                  dd«      d«      «      }t        t        | j                  dd	«      «      dkD  «      t        t        | j                  d
d	«      «      dkD  «      z   }t        | j                  dd	«      d	«      }t        |dkD  «      t        |dkD  «      |||| t        t        | j                  dd«      «      «       t        | j                  dd«      «      t        | j                  dd«      «      |t        | j                  dd	«      «      |t        | j                  dd«      «      fS )Nr"  r   r  r}   r7   r8   r  r  r+  r  r<   r  r  r  r&  r  r6   r3   )r”   rn   rU   r±   )rw   Ú
fragile_okÚ	compositeÚpnl_ddÚdrawdownÚsub_okÚoos_sortinos          rH   Ú
rank_tupleri  â  s]  € Ü”X˜cŸg™g n°aÓ8Ó9¸QÑ>Ó?€JÜ˜Ÿ™ ¨cÓ2Ó3€IÜ�c—g‘g˜n¨cÓ2Ó3€FÜ”8˜CŸG™GÐ$4°fÓ=¸vÓFÓG€HÜ”˜#Ÿ'™' -°Ó7Ó8¸1Ñ<Ó=ÄÄHÈSÏWÉWÐUbÐdiÓMjÓDkÐnoÑDoÓ@pÑp€FÜ˜3Ÿ7™7Ð#6¸Ó>ÀÓF€KäˆI˜‰MÓÜˆF�Q‰J‹ØØØØ	ˆ	Ü	ŒX�c—g‘g˜o¨rÓ2Ó3Ó	4Ð4Ü�—‘˜¨Ó/Ó0Ü�—‘˜ cÓ*Ó+ØÜ�—‘˜¨Ó/Ó0ØÜ�—‘˜¨Ó,Ó-ðð rJ   c                óÈ   — t        | «      }t        t        z   D �ci c]  }||j                  |d«      “Œ }}t	        j
                  |g«      j                  |d¬«       y c c}w )NÚ F©Úindex)rI   r9  r7  rU   ri   Ú	DataFrameÚto_csv)rG   rw   ru   rV  Úordereds        rH   Úwrite_winnerrq  ú  sY   € Ü�r‹?€DÜ*4´{Ò*BÓCÑ*B Qˆq�#—'‘'˜!˜R“.Ñ Ð*B€GÐCÜ‡L�L�'�Ó×"Ñ" 4¨uÐ"Õ5ùò Ds   ›Ac           
     ó&  — |�| j                  d«      dk(  ryt        | j                  dd«      «      dk  ryt        | j                  dd«      «      dk7  ryt        | j                  d	d
«      «      dk  st        | j                  dd
«      «      dk  ryt        t        | j                  dd«      «      «      dk7  ryt        t        |j                  dd«      «      t        |xs i j                  dd«      «      «      }t        t        |j                  dd
«      «      t        |xs i j                  dd
«      «      «      }t        | j                  dd«      «      |k  ryt        | j                  dd
«      «      |k  ryt        t        | j                  d«      d«      «      }t        t        t        |xs i j                  d«      d«      t        |j                  d«      d«      «      «      }t        | j                  d«      d«      }|t        k\  xr |t        k\  xr	 |t
        k  }|rjt        | j                  d«      d
«      }	t        t        |j                  d«      d
«      t        |xs i j                  d«      d
«      «      }
|	|
t        z
  k  ryy)Nr˜   rÀ   Fr7   r}   r   r"  r  r  r+  r  r  r6   r:   r=   r<   T)rU   rn   r”   r‡   ÚOOS_MIN_TRADESÚOOS_BEAR_PCT_SKIPÚOOS_SORTINO_DELTA)ÚbestrÀ   Ústored_winnerÚ
ref_pnl_ddÚ
ref_calmarÚbest_oos_tradesÚref_oos_tradesrW  Úoos_gate_appliesÚbest_oos_sortinoÚref_oos_sortinos              rH   Ú
promotabler     sU  € à€˜$Ÿ(™( 8Ó,°	Ò9ØÜ�—‘˜¨Ó-Ó.°!Ò3ØÜ�—‘˜¨Ó,Ó-°Ò2ØÜ�—‘˜¨Ó.Ó/°1Ò4¼ÀÇÁÈ-ÐY^ÓA_Ó8`ÐdeÒ8eØÜ
Œ8�D—H‘H˜_¨bÓ1Ó2Ó3°qÒ8Øô Ü�—‘˜^¨SÓ1Ó2Ü�-Ò% 2×*Ñ*¨>¸3Ó?Ó@ó€Jô Ü�—‘˜^¨UÓ3Ó4Ü�-Ò% 2×*Ñ*¨>¸5ÓAÓBó€Jô �—‘˜¨Ó-Ó.°Ò;ØÜ�—‘˜¨Ó/Ó0°:Ò=Øô œ( 4§8¡8Ð,>Ó#?ÀÓEÓF€OÜœ#Ü�-Ò% 2×*Ñ*Ð+=Ó>ÀÓDÜ�—‘Ð/Ó0°#Ó6óó €Nô ˜DŸH™H ^Ó4°cÓ:€Làœ>Ñ)ò 	-ØœnÑ,ò	-àÔ,Ñ,ð ñ
 Ü# D§H¡HÐ-@Ó$AÀ5ÓIÐÜÜ�W—[‘[Ð!4Ó5°uÓ=Ü�mÒ) r×.Ñ.Ð/BÓCÀUÓKó
ˆð ˜oÔ0AÑAÒAØØrJ   c                óÎ   — | dk  rg S t        t        d|«      | «      }t        | |«      \  }}g }d}t        |«      D ]&  }||z   ||k  rdndz   }|j	                  ||f«       |}Œ( |S )zIReturn balanced, contiguous ranges covering every candidate exactly once.r   r?   )r†   r‡   Údivmodr´   rš   )	ÚtotalÚworkersÚshard_countÚbaseÚextraÚrangesrŠ   Úordinalr  s	            rH   Úpartition_candidate_rangesr‰  9  s{   € à�‚zØˆ	Ü”c˜!˜W“o uÓ-€KÜ˜ Ó,�K€Dˆ%Ø€FØ€EÜ˜Ö%ˆØ�d‰l 7¨U¢?™a¸Ñ:ˆØ�‰�u˜c�lÔ#Ø‰ð &ð €MrJ   c           
     óÆ   — i }g }t        |d«      D ]M  \  }}|j                  t        | ||«      «       |sŒ%|dz  dk(  sŒ.t        | › d|d›dt	        |«      d›�d¬«       ŒO |S )	Nr?   éˆ  r   ú: evaluated Ú,Ú/Tr  )r³   rš   r[  r3  r²   )rG   Ú
candidatesÚshow_progressr<  r   Úidxr‚   s          rH   Úevaluate_candidates_sequentialr’  H  sr   € ð
 QS€EØ€GÜ  ¨QÖ/‰ˆˆVØ�‰”x  F¨EÓ2Ô3Ú˜S 4™Z¨1›_Ü�R�D˜ S¨ G¨1¬S°«_¸QÐ,?Ð@ÈÖMð 0ð €NrJ   c                óú   — | j                  | j                  dz   «      }|j                  d«      5 }t        j                  ||t        j
                  ¬«       d d d «       |j                  | «       y # 1 sw Y   ŒxY w)Nz.tmpÚwb)Úprotocol)Úwith_suffixÚsuffixrs   ÚpickleÚdumpÚHIGHEST_PROTOCOLÚreplace)ru   ÚpayloadÚ	temp_pathÚhandles       rH   Ú_write_pickle_atomicrŸ  V  s[   € Ø× Ñ  §¡¨vÑ!5Ó6€IØ	�‰˜Ô	 Ü�‰�G˜V¬f×.EÑ.EÕF÷ 
à×Ñ�dÕ÷ 
Ð	ús   °'A1Á1A:c                ó  — |j                  d«      5 }t        j                  |«      }d d d «       j                  d«      dk7  s|j                  d«      | k7  rt	        d«      ‚|j                  d«      }t        |t        «      r1|j                  dd«      |j                  d	d«      z
  t        |«      k7  rt	        d
«      ‚t        |d   «      a	t        | |d¬«      }t        |dt        | |d   |d	   |d   |dœ«       y # 1 sw Y   Œ×xY w)NÚrbÚversionr?   rG   zinvalid sweep shard metadatar�  r  r   rŠ   z#invalid sweep shard candidate ranger]  F)r�  rˆ  )r¢  r]  rG   rˆ  rŠ   r  r   )rs   r˜  ÚloadrU   rì   r`   rp   r²   ra   rE   r’  rŸ  )rG   Ú
input_pathÚoutput_pathrž  rœ  r�  r   s          rH   Úrun_internal_shardr¦  ]  s÷   € à	�‰˜Ô	 &Ü—+‘+˜fÓ%ˆ÷ 
à‡{�{�9Ó Ò" g§k¡k°$Ó&7¸2Ò&=ÜÐ7Ó8Ð8Ø—‘˜\Ó*€JÜ�j¤$Ô'¨7¯;©;°u¸aÓ+@À7Ç;Á;ÈwÐXYÓCZÑ+ZÔ^aÐblÓ^mÒ+mÜÐ>Ó?Ð?ä�˜Ñ Ó!€EÜ,¨R°È5ÔQ€GÜØàÜØØ˜yÑ)Ø˜WÑ%Ø˜5‘>Øñ	
õ÷ 
Ð	ús   ’C>Ã>Dc                ó”  — t        t        |«      |«      }t        |«      dk  rt        | |«      dfS t        | › dt        |«      › d�d¬«       t	        j
                  dt        › d| › d�¬«      5 }t        |«      }g }g }	 t        |«      D ]ú  \  }\  }	}
|d	|d
›d�z  }|d	|d
›d�z  }|d	|d
›d�z  }t        |dt        | ||	|
||	|
 dœ«       |j                  d«      }t        j                  t        j                  t        t        t         «      j#                  «       «      dt        dd| dt        |«      dt        |«      gt$        |t        j&                  ¬«      }|j)                  ||	|
||f«       |j)                  |||f«       Œü |D ]R  \  }}}|j+                  «       }|j-                  «        |dk7  sŒ-|j/                  dd¬«      dd  }t1        d|› d|› �«      ‚ 	 g }d}|D �]  \  }}	}
}}|	|k7  s|j;                  «       st1        d«      ‚|j                  d«      5 }t=        j>                  |«      }d d d «       dt        | ||	|
f}jA                  d«      |jA                  d «      |jA                  d!«      |jA                  d"«      |jA                  d#«      |jA                  d$«      f}|jA                  d%«      }||k7  s!tC        |tD        «      rt        |«      |
|	z
  k7  rt1        d&«      ‚|jG                  |«       |
}�Œ |t        |«      k7  st        |«      t        |«      k7  rt1        d'«      ‚|t        |«      fcd d d «       S # t2        $ rZ |D ]S  \  }}}|j5                  «       € |j7                  «        |j+                  «        |j8                  rŒD|j-                  «        ŒU ‚ w xY w# 1 sw Y   �Œ|xY w# 1 sw Y   y xY w)(Nr?   z: retrying with z subprocess shardsTr  z
mlp-sweep-rT   )Úprefixzshard-Ú04dz
.input.pklz.output.pklz.log)r¢  r]  rG   rˆ  rŠ   r  r�  r”  ú--assetú--_internal-shardú--_shard-tfú--_shard-inputú--_shard-output)ÚcwdÚstdoutÚstderrr   zutf-8r›  )ÚencodingÚerrorsi`ðÿÿzsweep shard failed (z): z"sweep shard coverage is incompleter¡  r¢  r]  rG   rˆ  rŠ   r  r   zinvalid sweep shard outputz5sweep shard merge did not preserve candidate coverage)$r‰  r²   r’  r3  ÚtempfileÚTemporaryDirectoryrE   r   r³   rŸ  rs   Ú
subprocessÚPopenÚsysÚ
executablera   Ú__file__ÚresolverV   ÚSTDOUTrš   ÚwaitrÚ   Ú	read_textr`  rl   ÚpollÚ	terminateÚclosedrW   r˜  r£  rU   r`   rp   Úextend)rG   r�  rƒ  r‡  Útemp_dirÚ	temp_rootÚspecsÚ	processesrˆ  rŠ   r  r¤  r¥  Úlog_pathÚ
log_handleÚprocessÚ
returncodeÚtailrB   ÚmergedÚexpected_startrž  ÚoutputÚexpectedÚactualÚshard_resultss                             rH   Úevaluate_candidates_subprocessrÒ  w  sÞ  € ô
 (¬¨J«¸ÓA€FÜ
ˆ6ƒ{�aÒÜ-¨b°*Ó=¸qÐ@Ð@ä	ˆRˆDÐ ¤ V£ Ð-?Ð
@ÈÕMÜ	×	$Ñ	$¨j¼¸¸qÀÀÀAÐ,FÕ	GÈ8Ü˜“Nˆ	ØˆØ>@ˆ	ð4	Ü)2°6Ö):Ñ%�™˜% Ø&¨6°'¸#°¸jÐ)IÑI�
Ø'¨F°7¸3°-¸{Ð*KÑK�Ø$¨°¸¨}¸DÐ'AÑA�Ü$Øà#$Ü!&Ø Ø#*Ø!&Ø"Ø&0°°sÐ&;ñôð &Ÿ]™]¨4Ó0�
Ü$×*Ñ*äŸ™ÜœD¤›N×2Ñ2Ó4Ó5Ø!ÜØ+Ø%ØØ(Ü˜J›Ø)Ü˜KÓ(ðô Ø%Ü%×,Ñ,ô!�ð$ —‘˜g u¨c°;ÀÐIÔJØ× Ñ  '¨:°xÐ!@ÕAðI *;óL 2;Ñ-�˜ XØ$Ÿ\™\›^�
Ø× Ñ Ô"Ø “?Ø#×-Ñ-°wÀyÐ-ÓQÐRWÐRXÐY�DÜ&Ð)=¸j¸\ÈÈTÈFÐ'SÓTÐTñ 2;ð (*ˆØˆÜ38Ñ/ˆG�U˜C ¨aØ˜Ò&¨k×.@Ñ.@Ô.BÜ"Ð#GÓHÐHØ×!Ñ! $Ô'¨6ÜŸ™ VÓ,�÷ (àœ5 " g¨u°cÐ:ˆHà—
‘
˜9Ó%Ø—
‘
˜7Ó#Ø—
‘
˜4Ó Ø—
‘
˜9Ó%Ø—
‘
˜7Ó#Ø—
‘
˜5Ó!ðˆFð #ŸJ™J yÓ1ˆMØ˜Ò!¬°MÄ4Ô)HÌCÐP]ÓL^ÐbeÐhmÑbmÒLmÜ"Ð#?Ó@Ð@Ø�M‰M˜-Ô(Ø ŠNð% 49ð& œS ›_Ò,´°F³¼sÀ:»Ò0NÜÐVÓWÐWØ”s˜6“{Ð"÷c 
HÑ	Gøôb ò 	Û*3Ñ&�˜ QØ—<‘<“>Ð)Ø×%Ñ%Ô'Ø—L‘L”NØ!×(Ó(Ø×$Ñ$Õ&ð +4ð ð	ú÷ (Ñ'ú÷ 
HÐ	GúsL   Á/N>Â D6MÆ7(MÇAN>È!N1È7D
N>ÍAN.ÎN.Î.N>Î1N;Î6N>Î>Oc                óv  — |dk(  r+t        | › dt        |«      d›d�d¬«       t        | |«      dfS t        | › dt        |«      d›d|› d�d¬«       t        dt	        d	t        |«      t        d|d
z  «      z  «      «      }t        j                  d«      }g }	 t        j                  j                  ||t        | t        f¬«      5 }t        |j                  t        ||¬«      d«      D ]?  \  }}|j                  |«       |dz  dk(  sŒ t        | › d|d›dt        |«      d›�d¬«       ŒA 	 d d d «       ||fS # 1 sw Y   ŒxY w# t         t"        f$ rf}	t        | › d|	› d�d¬«       	 t%        | ||«      cY d }	~	S # t&        $ r/}
t        | › d|
› d�d¬«       t)        | |d«      cY d }
~
cY d }	~	S d }
~
ww xY wd }	~	ww xY w)Nr?   z: evaluating r�  z candidates sequentiallyTr  z candidates with z worker processeséú   r…   Úspawn)Úmax_workersÚ
mp_contextÚinitializerÚinitargs)Ú	chunksizer‹  r   rŒ  rŽ  z: worker pool unavailable (Ú)z#: subprocess sharding unavailable (z(); falling back to sequential evaluation)r3  r²   r’  r‡   r†   ÚmpÚget_contextÚ
concurrentÚfuturesÚProcessPoolExecutorr^  rE   r³   Úmapra  rš   ÚOSErrorÚPermissionErrorrÒ  rl   Úevaluate_candidates)rG   r�  rƒ  Ú
chunk_sizer×  r   Úpoolr‘  r?  r>  Ú	shard_excs              rH   rä  rä  Õ  sÌ  € Ø�!‚|Ü���M¤# j£/°!Ð!4Ð4LÐMÐUYÕZÜ-¨b°*Ó=¸qÐ@Ð@ä	ˆRˆD�œc *›o¨aÐ0Ð0AÀ'ÀÐJ[Ð
\ÐdhÕiÜ�Qœ˜C¤ Z£´C¸¸7ÀQ¹;Ó4GÑ!GÓHÓI€JÜ—‘ Ó(€JØ€Gð:Ü×Ñ×3Ñ3ØØ!Ü#Øœ%�[ð	 4ô 
ð
 Ü(¨¯©´/À:ÐYc¨Ó)dÐfgÖh‘��VØ—‘˜vÔ&Ø˜‘: “?Ü˜R˜D ¨S°¨G°1´S¸³_ÀQÐ4GÐHÐPTÖUñ  i÷
ð" �GÐÐ÷#
ð 
ûô ”_Ð%ò :Ü��Ð/°¨u°AÐ6¸dÕCð	:Ü1°"°jÀ'ÓJÕJøÜò 	:Ü�R�DÐ;¸I¸;ÐFnÐoÐw{Õ|Ü& r¨:°qÓ9×9Ò9ûð	:þð	:úsm   Â-E ÃAD7Ä"D7Ä+E Ä7E Ä<E ÅF8ÅF3Å&E8Å2F8Å8	F0ÆF+Æ F0Æ!F3Æ%F8Æ+F0Æ0F3Æ3F8c                óT  — t        | ||||	|
|||¬«	      }t        | «      }|rt        |«      nd }|r"t        |«      }d|d<   |j	                  d|«       t        |t        |«      |«      }t        | ||«      \  }}|j                  t        d¬«       |d   }t        d„ |D «       d «      }|�^|�\t        |j                  dd	«      «      }t        |j                  dd	«      «      }|dkD  r!||d
z  k  rt        d| › d|d›d|d›d�d¬«       d[d„}|D �cg c]  } ||«      sŒ|‘Œ }}|r|d   n|}t        |||«      }|�s>|�r;|��8t        t        |j                  d«      d«      «      }t        t!        t        |xs i j                  d«      d«      t        |j                  d«      d«      «      «      }t        |j                  d«      d«      }|t"        k\  r¥|t"        k\  rœ|t$        k  r“t        |j                  d«      d	«      } t!        t        |j                  d«      d	«      t        |xs i j                  d«      d	«      «      }!| |!t&        z
  k  r*t        d| › d| d›d|!d›dt&        › d|› d|› d|d›d�d¬«       |xr |xr |d u }"t(        j+                  dd¬«       t(        d t,        › d!| › d"�z  }#t/        j0                  |d | «      j3                  |#d#¬$«       |r|s|"rt5        | |«       i d%| “d&t        |«      “d'|“d(t7        |#j9                  t:        «      «      “d)t=        |xr |xs |"«      “d*t=        |«      “d+|r|j                  d«      nt>        j@                  “d,|r|j                  d-«      nt>        j@                  “d.|r|j                  d/«      nt>        j@                  “d0|r|j                  d«      nt>        j@                  “d1|j                  d«      “d2|j                  d3«      “d4|j                  d5«      “d6|j                  d7«      “d8|j                  d9«      “d:|j                  d;«      “d<|j                  d=«      “i d>|j                  d?«      “d@|j                  dA«      “dB|j                  dC«      “dD|j                  d«      “dE|j                  d-«      “dF|j                  dG«      “dH|j                  dI«      “dJ|j                  dK«      “dL|j                  dM«      “dN|j                  d/«      “dO|j                  dP«      “dQ|j                  d«      “dR|j                  dS«      “dT|j                  d«      “dU|j                  dV«      “dW|j                  dX«      “dY|j                  dP«      “¥|j                  d«      |j                  d-«      dZœ¥S c c}w )\N)rº   r»   r¼   r½   r¾   rÀ   r˜   r   T)rœ   Úreversec              3  óJ   K  — | ]  }|j                  d «      dk(  sŒ|–— Œ y­w)r˜   rÀ   N)rU   )r)  Úrs     rH   r*  zrun_tf.<locals>.<genexpr>
  s    è ø€ ÐH¡˜1¨1¯5©5°«?¸iÓ+G”Q¡ùs   ‚#œ#r6   r+  r  z	  [WARN] z: cur_eval Calmar=z.3fz! is <50% of stored winner Calmar=ue    â€” winner artifact was likely overwritten during training; using stored metrics as promotion floor.r  c                ó|  — | j                  d«      dk7  xr§ t        | j                  dd«      «      dkD  xr‡ t        | j                  dd«      «      dk(  xrg t        | j                  dd	«      «      dkD  xrG t        | j                  d
d	«      «      dkD  xr' t        t        | j                  dd«      «      «      dk(  S )Nr˜   rÀ   r7   r}   r   r"  r  r  r+  r  r  )rU   rn   r”   )rw   s    rH   Ú_gate_passeszrun_tf.<locals>._gate_passes  s¹   € à�G‰G�HÓ Ñ*ò AÜ˜Ÿ™ °Ó5Ó6¸Ñ:òAä˜Ÿ™ °Ó4Ó5¸Ñ:òAô ˜Ÿ™ °Ó6Ó7¸!Ñ;òAô ˜Ÿ™ °Ó6Ó7¸!Ñ;ò	Aô
 ”H˜SŸW™W _°bÓ9Ó:Ó;¸qÑ@ð	
rJ   r:   r}   r=   r<   z  [OOS BLOCK] z: new OOS_Sortino=z < ref=u    âˆ’ z (trades: best=z, ref=z, bear=z.0fz%)©ÚparentsÚexist_okÚ'optimization_sweep_strategy_mlp_scores_rB   rC   Frl  Ú	timeframeÚ	evaluatedrƒ  Ú
sweep_fileÚpromotedr  Úcurrent_calmarÚcurrent_pnl_ddr7   Úcurrent_wfo_minr  Úcurrent_oos_sortinoÚbest_sourceÚbest_weightsr&   Ú
best_entryr'   Ú	best_exitr(   Ú	best_confr)   Ú
best_trailr*   Úbest_suppress_bearr/   Úbest_tradesr2   Úbest_pnlr3   Úbest_drawdownr8   Úbest_calmarÚbest_pnl_ddÚbest_compositer  Úbest_sub1_calmarr  Úbest_sub2_calmarr  Úbest_wfo_scorer  Úbest_wfo_minÚbest_wfo_negr  rz  Úbest_oos_pnlr;   r}  Úbest_fragile_0_05r"  Úbest_fragile_1_0r#  Úoverall_wfo_neg)Úoverall_calmarÚoverall_pnl_dd)rw   r§   r¨   rd   )!rÓ   rx   rt   r•   Úinsertr   r²   rä  Úsortri  Únextrn   rU   r3  r  r”   r‡   rs  rt  ru  Ú	SWEEP_DIRÚmkdirrE   ri   rn  ro  rq  ra   Úrelative_torV   rd   rª   r8  )$rG   r¸   r    Útop_kÚpromoter¹   rƒ  Úworker_fractionÚforce_promoterº   r»   r¼   r½   r¾   r�  rÀ   rw  Úresolved_workersr   Úactual_workersÚbest_overallÚcur_evalÚ
stored_calÚeval_calrí  rë  Úgate_passingrv  Úcan_promoteÚ
best_oos_tÚ	ref_oos_tÚbear_pctÚbest_oos_sorÚref_oos_sorÚforce_writingr�   s$                                       rH   Úrun_tfr*  ó  sR  € ô % R¨°$¸ÈDØ.6ÀØ-4¸gôG€Jô ˜"‹o€Gñ &-”D˜”M°$€MÙÜ! 'Ó*ˆØ%ˆ�ÑØ×Ñ˜!˜WÔ%ä+¨G´S¸³_ÀoÓVÐÜ1°"°jÐBRÓSÑ€Gˆ^à‡L�L”Z¨€LÔ.Ø˜1‘:€LÜÑH¡ÓHÈ$ÓO€Hð Ð Ð 9Ü˜m×/Ñ/°ÀÓFÓGˆ
Ü˜hŸl™l¨>¸5ÓAÓBˆØ˜Š>˜h¨°cÑ)9Ò9ÜØ˜B˜4Ð1°(¸3°ð @Ø$ SÐ)ð *EðFàMQõó
ñ  'Ó:™w˜!©,°q­/’A˜w€LÐ:Ù*ˆ<˜Š?°€DÜ˜T 8¨]Ó;€Kò š<¨HÑ,@Üœ $§(¡(Ð+=Ó">ÀÓDÓEˆ
ÜœÜ�mÒ) r×.Ñ.Ð/AÓBÀCÓHÜ�X—\‘\Ð"4Ó5°sÓ;ó
ó ˆ	ô ˜DŸH™H ^Ó4°cÓ:ˆØœÒ'¨I¼Ò,GÈHÔWhÒLhÜ# D§H¡HÐ-@Ó$AÀ5ÓIˆLÜÜ˜Ÿ™Ð&9Ó:¸EÓBÜ˜-Ò-¨2×2Ñ2Ð3FÓGÈÓOóˆKð ˜kÔ,=Ñ=Ò=ÜØ$ R DÐ(:¸<ÈÐ:Lð MØ& sÐ+¨5Ô1BÐ0Cð D%Ø%/ L°°y°kÀÈÐRUÈÐVXðZð õ	ð "ÒG lÒG°xÀ4Ð7G€Mä‡O�O˜D¨4€OÔ0Ü
Ð?Ä¸wÀaÈÀtÈ4ÐPÑ
P€CÜ‡L�L�˜˜%�Ó!×(Ñ(¨°EÐ(Ô:á‘K¡MÜ�R˜Ôð&Ø�Rð&à”S˜“_ð&ð 	�>ð&ð 	”c˜#Ÿ/™/¬$Ó/Ó0ð	&ð
 	”D˜'Ò1 kÒC°mÓDð&ð 	”d˜;Ó'ð&ð 	¹(˜(Ÿ,™, ~Ô6ÌÏÉð&ð 	¹(˜(Ÿ,™, ~Ô6ÌÏÉð&ð 	¹8˜8Ÿ<™<¨Ô7ÌÏÉð&ð 	ÁH˜xŸ|™|Ð,?Ô@ÔRT×RXÑRXð&ð 	�t—x‘x Ó)ð&ð 	˜Ÿ™Ð!3Ó4ð&ð 	�d—h‘hÐBÓCð&ð 	�T—X‘XÐ@ÓAð&ð 	�T—X‘XÐMÓNð&ð  	�d—h‘hÐ:Ó;ð!&ð" 	˜dŸh™hÐ'=Ó>ñ#&ð$ 	�t—x‘x Ó/ð%&ð& 	�D—H‘H˜]Ó+ð'&ð( 	˜Ÿ™Ð"2Ó3ð)&ð* 	�t—x‘x Ó/ð+&ð, 	�t—x‘x Ó/ð-&ð. 	˜$Ÿ(™( ;Ó/ð/&ð0 	˜DŸH™H ]Ó3ð1&ð2 	˜DŸH™H ]Ó3ð3&ð4 	˜$Ÿ(™( ;Ó/ð5&ð6 	˜Ÿ™ Ó0ð7&ð8 	˜Ÿ™ Ó1ð9&ð: 	˜4Ÿ8™8Ð$6Ó7ð;&ð< 	˜Ÿ™Ð!2Ó3ð=&ð> 	˜DŸH™HÐ%8Ó9ð?&ð@ 	˜TŸX™X nÓ5ðA&ðB 	˜DŸH™H ]Ó3ðC&ðF 	˜<×+Ñ+¨OÓ<ñG&ðH '×*Ñ*¨>Ó:Ø&×*Ñ*¨>Ó:òK&ð &ùòK ;s   ÄV%ÄV%c                 ój  — t        j                  d¬«      } | j                  dt        d¬«       | j                  ddt        t        ¬«       | j                  d	t
        d
d¬«       | j                  dt
        d¬«       | j                  dt
        d¬«       | j                  ddg d¬«       | j                  dt
        dd¬«       | j                  dt        t        d¬«       | j                  ddd¬«       | j                  ddd ¬«       | j                  d!dd"¬«       | j                  d#t        d d$¬«       | j                  d%t        d d&¬«       | j                  d't        d d(¬«       | j                  d)t        d d*¬«       | j                  d+dt         j                  ¬«       | j                  d,d t         j                  ¬«       | j                  d-d t         j                  ¬«       | j                  d.d t         j                  ¬«       | j                  «       }|j                  a|j                  rs|j                  r|j                  r|j                  s| j!                  d/«       t#        |j                  t%        |j                  «      t%        |j                  «      «       y t&        j)                  d0d0¬1«       g }t+        |j,                  «      D ]â  \  }}t/        d2|› d3|j0                  d4›d5�d0¬6«       |j3                  t5        ||j0                  |j6                  |d7z  z   |j8                  |j:                  xs |j<                  |j>                  |j@                  |jB                  |j<                  |jD                  |jF                  |jH                  |jJ                  |jL                  ¬8«      «       Œä t&        d9z  }tO        jP                  |«      jS                  |d:¬;«       t/        d<|jU                  tV        «      › �«       t/        tO        jP                  |«      jY                  d:¬;«      «       y )=NzRun deeper MLP threshold sweeps)Údescriptionrª  zAAsset identifier, e.g. COINBASE_ETHUSD (default: COINBASE_BTCUSD))rm   Úhelpz--timeframesÚ+)Únargsrm   Úchoicesz	--samplesiPÃ  z$Approximate candidates per timeframe)Útyperm   r-  z--seedi
'5)r1  rm   z--top-kiÐ  z--extra-weightsÚ*z`Additional MLP artifact JSONs to include as candidate weight files for every selected timeframe.)r/  rm   r-  z	--workersr   z•Worker processes for candidate evaluation. Use 0 for auto, currently 50%% of logical CPUs capped by candidate count; use 1 for sequential evaluation.z--worker-fractionz+Logical CPU fraction used when --workers=0.z	--promoteÚ
store_truezWrite improved winner CSVs)Úactionr-  z--force-promotez~Write best gate-passing candidate even when no prior winner exists (use for first-ever run on a new asset). Implies --promote.z--wideuN   Double the threshold search ranges: entry Â±600, exit/conf Â±750, trail 0-100.z
--entry-loz%Override entry threshold lower bound.z
--entry-hiz%Override entry threshold upper bound.z	--exit-loz$Override exit threshold lower bound.z	--exit-hiz$Override exit threshold upper bound.r«  r¬  r­  r®  z2internal shard mode requires tf, input, and outputTrî  z
=== r  r�  z requested samples ===r  iñ  )r  rº   r»   r¼   r½   r¾   zmlp_deep_sweep_summary.csvFrl  z
Summary written: )-ÚargparseÚArgumentParserÚadd_argumentÚ_DEFAULT_ASSETÚTFSr”   rk   r   ÚSUPPRESSÚ
parse_argsr]  rE   Ú_internal_shardÚ	_shard_tfÚ_shard_inputÚ_shard_outputÚerrorr¦  r   Ú
REPORT_DIRr  r³   Ú
timeframesr3  r¸   rš   r*  r    r  r  r  r¹   rƒ  r  rº   r»   r¼   r½   r¾   ri   rn  ro  r  rV   Ú	to_string)ÚparserÚargsÚ	summariesÚoffsetrG   Úsummary_paths         rH   ÚmainrI  t  s°  € Ü×$Ñ$Ð1RÔS€FØ
×Ñ˜	¬>Ø`ð ô bà
×Ñ˜¨c¼3ÌÐÔLØ
×Ñ˜¬#°uÐCiÐÔjØ
×Ñ˜¤s°HÐÔ=Ø
×Ñ˜	¬°TÐÔ:Ø
×ÑÐ)°¸bØð ô Aà
×Ñ˜¬#°qð@ð ô Að ×ÑÐ+´%ÔAXØJð ô Là
×Ñ˜¨LÐ?[ÐÔ\Ø
×ÑÐ)°,ð[ð ô \ð ×Ñ˜¨Ømð ô oà
×Ñ˜¬5¸$ÐElÐÔmØ
×Ñ˜¬5¸$ÐElÐÔmØ
×Ñ˜¬5¸$ÐEkÐÔlØ
×Ñ˜¬5¸$ÐEkÐÔlØ
×ÑÐ+°LÄx×GXÑGXÐÔYØ
×Ñ˜¨t¼(×:KÑ:KÐÔLØ
×ÑÐ(°$¼X×=NÑ=NÐÔOØ
×ÑÐ)°4¼h×>OÑ>OÐÔPØ×ÑÓ€Dð �J‰J€Eà×ÒØ�~Š~ T×%6Ò%6¸d×>PÒ>PØ�L‰LÐMÔNÜ˜4Ÿ>™>¬4°×0AÑ0AÓ+BÄDÈ×I[ÑI[ÓD\Ô]Øä×Ñ˜T¨DÐÔ1Ø€IÜ §¡Ö0‰
ˆ�Ü��r�d˜"˜TŸ\™\¨!Ð,Ð,BÐCÈ4ÕPØ×Ñœ  D§L¡L°$·)±)¸fÀt¹mÑ2KØ $§
¡
¨D¯L©LÒ,N¸D×<NÑ<NØ $× 2Ñ 2°D·L±LÀ$×BVÑBVØ.2×.@Ñ.@ÀtÇyÁyØ)-¯©ÀÇÁØ(,¯©¸d¿l¹lôLõ 	Mð 1ô Ð <Ñ<€LÜ‡L�L�Ó×"Ñ" <°uÐ"Ô=Ü	Ð × 8Ñ 8¼Ó >Ð?Ð
@ÔAÜ	Œ"�,‰,�yÓ
!×
+Ñ
+°%Ð
+Ó
8Õ9rJ   Ú__main__)rG   ra   r¨   r   )rG   ra   r¨   ra   )re   r   r¨   rd   )r}   )re   r   rm   rk   r¨   rk   )rG   ra   r¨   údict[str, Any] | None)r   ra   r¨   r§   )
r‰   rk   rŠ   rk   r‹   rk   rŒ   rk   r¨   rk   )r‘   r§   r¨   útuple[Any, ...])r‘   r§   r¨   r§   )NFNNNN)rG   ra   r¸   r”   r    r”   r¹   úlist[str] | Nonerº   rd   r»   úfloat | Noner¼   rN  r½   rN  r¾   rN  r¨   úlist[dict[str, Any]])rG   ra   r   ra   r¨   z7tuple[pd.DataFrame, np.ndarray, np.ndarray, np.ndarray])rý   z	pd.Seriesr‚   r§   rþ   rk   r¨   r”   )r
  zpd.DataFramer  ra   r  ra   r¨   rk   )rG   ra   r‚   r§   r<  zBdict[str, tuple[pd.DataFrame, np.ndarray, np.ndarray, np.ndarray]]r¨   r§   )rG   ra   r]  ra   r¨   r©   )r‚   r§   r¨   r§   )rw   r§   r¨   rL  )rG   ra   rw   r§   r¨   r©   rh   )rv  r§   rÀ   rK  rw  rK  r¨   rd   )r‚  r”   rƒ  r”   r¨   zlist[tuple[int, int]])T)rG   ra   r�  rO  r�  rd   r¨   rO  )ru   r   rœ  r§   r¨   r©   )rG   ra   r¤  r   r¥  r   r¨   r©   )rG   ra   r�  rO  rƒ  r”   r¨   z tuple[list[dict[str, Any]], int])rG   ra   r¸   r”   r    r”   r  r”   r  rd   r¹   rM  rƒ  r”   r  rk   r  rd   rº   rd   r»   rN  r¼   rN  r½   rN  r¾   rN  r¨   r§   )r¨   r©   )aÚ__doc__Ú
__future__r   r5  Úconcurrent.futuresrÞ  rq   r­   r:  ÚmultiprocessingrÜ  r˜  Úpathlibr   r¶  r´  Útypingr   Únumpyrª   Úpandasri   r¸  rº  r»  ÚparentrV   ru   r  ra   Úconfigr   r   r   r	   r
   r   r   r   r   r   Ústrategies.strategy_mlp_scoresr   rë   r   r   r   r   r   Útools.worker_utilsr   r   r8  rE   r9  rD   r  rA  r#   Ú__annotations__r$   r9  r7  ru  rs  rt  rI   rL   r[   rf   rn   rx   rƒ   rŽ   r’   r•   rÓ   r÷   r  r  Úobjectr4  r[  r^  ra  ri  rq  r  r‰  r’  rŸ  r¦  rÒ  rä  r*  rI  Ú__name__r(  rJ   rH   Ú<module>r_     sÛ  ðòõ #ã Û Û 
Û 	Û Û Û Ý Û Û Ý ã Û ã 
áˆHƒ~×ÑÓ×&Ñ&×-Ñ-€Ø ‡�‡��‘3�t“9Ô ÷÷ ÷ ÷÷ ÷ Mð #€Ø€Ú%€Ø�IÑ 	Ñ)€
Ø�9Ñ˜xÑ'€	Ø�IÑ 	Ñ)€
Ø€
ˆJÓ Ø[_€ÐXÓ _ò€
ò€ð" Ð Ø€ØÐ óTóBó/óôóóó,&óóð& puØPTØNRð_Ø".ð_ØAMð_à!-ð_à?Kð_àWkó_óDbó0
&óNñ “(€óoódó7óó06ð 7;ð6Ø3ð6Ø?Có6órð$ ðØðà$ðð ðð ó	óóð4[#Øð[#à$ð[#ð ð[#ð &ó	[#ó|ð> .2À!Ø$;Ø!&°UØ$(À4Ø#'Àð~Ø*ð~Ø<?ð~à!ð~ð ð~ð /3ð~ð "ð	~ð 5Að	~ð
 !ð~ð
 3?ð~ð
 KYó~óB7:ðt ˆzÒÙ…Fð rJ   