Ë
    ÷v±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l1m2Z2m3Z3m4Z4 dd	l5m6Z6 dd
l7m8Z8m9Z9 dZ:e:a;g d¢Z<edz  dz  Z=edz  dz  Z>edz  dz  Z?da@deAd<   daBdeAd<   daCdeAd<   g d¢ZDg d¢ZEdZFdZGdZHd>d„ZId?d„ZJd>d„ZKd@d„ZLdAdBd „ZMdCd!„ZNdDd"„ZOdEd#„ZPdFd$„ZQdGd%„ZR	 	 	 dH	 	 	 	 	 	 	 	 	 dId'„ZSdJd(„ZTdKd)„ZUdLd*„ZV eW«       ZXdMd+„ZYdNdOd,„ZZdPd-„Z[dQd.„Z\dRd/„Z]	 dN	 	 	 dSd0„Z^dTd1„Z_	 dU	 	 	 	 	 	 	 dVd2„Z`dWd3„ZadXd4„Zb	 	 	 	 	 	 	 	 dYd5„ZcdYd6„Zddde8d&d&ddddddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dZd7„Zed8„ Zfd9„ Zgd:„ Zhd;„ Zid[d<„Zjekd=k(  r ej«        yy)\a  
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)ÚComparisonSnapshotÚrequire_replayÚfingerprint)ÚCOMMISSION_RATE)ÚDEFAULT_WORKER_FRACTIONÚresolve_worker_countÚCOINBASE_BTCUSD©Ú4HÚ6HÚ8HÚ12HÚ1DÚresultsÚwinnersÚsweepsÚreportszComparisonSnapshot | NoneÚ_COMPARISONú
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    úi/Users/jameslopez/projects/TradingBot25/.worktrees/mlp-comparable-measurement/tools/run_mlp_deep_sweep.pyÚwinner_pathrO   l   s   € ÜÐBÄ5À'ÈÈ2È$ÈdÐSÑSÐSó    c                ó   — dt         › d| › d�S )Nz"strategies/params/mlp/mlp_weights_rH   z.json)rK   rL   s    rN   Úartifact_pathrR   p   s   € Ø/´¨w°a¸°t¸5ÐAÐArP   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, rI   Ú-)ÚgetÚREPOrK   Úexists)rM   Ú_TF_MINUTESÚperiodÚmlp_paths       rN   Ú	data_pathra   t   sm   € à e°5ÀÈdÑS€KØ�_‰_˜R Ó$€FÜ�f‰}˜uÑ$¬%¨°°6°(¸$Ð'?Ñ?€HØ‡�ÔØˆÜ�&‰=œe˜W A b T¨Ð.Ñ.Ð.rP   c                óx   — t        | t        «      r | j                  «       j                  «       dv S t	        | «      S )N>   Ú1ÚyesÚtrue)Ú
isinstanceÚstrÚstripÚlowerÚbool)Úvs    rN   Úas_boolrl   ~   s.   € Ü�!”SÔØ�w‰w‹y�‰Ó Ð$8Ð8Ð8Ü�‹7€NrP   c                ój   — 	 t        j                  | «      r|S t        | «      S # t        $ r |cY S w xY w©N)ÚpdÚisnaÚfloatÚ	Exception)rk   Údefaults     rN   Úas_floatrt   „   s4   € ðÜ�7‰7�1Œ:ØˆNÜ�Q‹xˆøÜò ØŠðús   ‚$ ™
$ ¤2±2c                ó†  — t        | «      }|j                  «       sy t        t        j                  |j                  «       «      «      }|st        d|› �«      ‚t        |d   «      }t        |j                  dd«      «      |d<   t        |j                  dd«      «      |d<   t        |j                  dd«      «      |d<   |S )Nz'Existing winner has no replayable row: r   r5   Fr2   r1   T)
rO   r]   ÚlistÚcsvÚ
DictReaderÚopenÚ
ValueErrorÚdictrl   r[   )rM   ÚpathÚrowsÚrows       rN   Úload_winnerr   �   s®   € Ü�r‹?€DØ�;‰;Œ=ØÜ”—‘˜tŸy™y›{Ó+Ó,€DÙÜÐBÀ4À&ÐIÓJÐJÜ
ˆt�A‰w‹-€CÜ")¨#¯'©'Ð2HÈ%Ó*PÓ"Q€CÐÑÜ+2°3·7±7Ð;ZÐ\aÓ3bÓ+c€CÐ'Ñ(Ü*1°#·'±'Ð:XÐZ^Ó2_Ó*`€CÐ&Ñ'Ø€JrP   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/   r0   rE   Fr   ç     @�Àr+   )r   r[   )Úweights_pathÚartÚrecÚparamss       rN   Ú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ð  €MrP   c                óz   — t        t        | |«      ||z
  «      } t        | |z
  |z  «      }t        |||z  z   d«      S )Né   )ÚminÚmaxÚround)ÚvalueÚstartÚstopÚstepÚns        rN   Úsnapr•   ±   sB   € Ü”�E˜5Ó! 4¨$¡;Ó/€EÜˆu�u‰} Ñ$Ó%€AÜ�˜˜T™Ñ! 1Ó%Ð%rP   c                ó¼   — | d   t        | d   «      t        | d   «      t        | d   «      t        | d   «      t        t        | j                  dd«      «      «      fS )Nr,   r-   r.   r/   r0   r5   F)rt   rj   rl   r[   )Úps    rN   Ú	param_keyr˜   ·   sf   € à	Ð
ÑÜ�Ð6Ñ7Ó8Ü�Ð5Ñ6Ó7Ü�ÐBÑCÓDÜ�Ð.Ñ/Ó0ÜŒW�Q—U‘UÐ1°5Ó9Ó:Ó;ðð rP   c                ó.  — g d¢}|D ]6  }|| v sŒt        j                  t        | |   «      «      rŒ*t        d|› �«      ‚ t	        t        | d   «      j                  «       «      t        | d   «      t        | d   «      t        | d   «      t        dt        | j                  dd«      «      «      t        | j                  d	d
«      «      t        | j                  dd«      «      t        t        | j                  dd«      «      «      t        | j                  dd«      «      t        | j                  dd«      «      t        dt        t        | j                  dd«      «      «      «      t        dt        t        | j                  dd«      «      «      «      dœS )N)r-   r.   r/   r0   r3   r4   r6   r7   zNonfinite parameter: r,   r-   r.   r/   r„   r0   r1   Tr2   Fr3   r   r4   r…   r5   rE   r6   r7   r+   )ÚnpÚisfiniterq   rz   rg   r   Úresolvert   rŽ   r[   rl   Úint)r—   ÚnumericÚkeys      rN   Únormalise_paramr    Â   sc  € òm€Gó ˆØ�!Š8œBŸK™K¬¨a°©f«Õ6ÜÐ4°S°EÐ:Ó;Ð;ð ô  ¤ QÐ'9Ñ%:Ó ;× CÑ CÓ EÓFÜ-5°aÐ8[Ñ6\Ó-]Ü,4°QÐ7YÑ5ZÓ,[Ü9AØÐ=Ñ>ó:
ô &)¨¬h°q·u±uÐ=XÐZ]Ó7^Ó._Ó%`Ü(/°·±Ð6TÐVZÓ0[Ó(\Ü)0°·±Ð7VÐX]Ó1^Ó)_Üœx¨¯©Ð.?ÀÓ(CÓDÓEÜ$,¨Q¯U©UÐ3MÈwÓ-WÓ$XÜ '¨¯©Ð.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ñð rP   Fc	                ó®  — t        | «      }	t        |xs g «      }
|	r|
j                  |	d   «       t        t	        | «      «      j                  «       r|
j                  t	        | «      «       | dk(  rEt        dk(  r<t        t	        d«      «      j                  «       r|
j                  t	        d«      «       t        |
D �ch c]$  }t        t        |«      j                  «       «      ’Œ& c}«      }|�|n|rdnd}|�|n|rdnd}|�|n|rd	nd}|�|n|rd
nd}|rdnd}|st        d«      ‚t        d|t        |«      z  «      }t        j                  j                  |«      }g }g d¢}t!        |«      D �]<  }|j#                  t%        t'        |j)                  t        j*                  ||d«      «      «      t'        |j)                  t        j*                  ||d«      «      «      t'        |j)                  t        j*                  ||d«      «      «      t'        |j)                  t        j*                  d|d«      «      «      ||dz     d   ||dz     d   ddt-        |j)                  ddg«      «      t/        |j)                  g d¢«      «      t/        |j)                  g d¢«      «      ¬«      «       �Œ? g }|D ]–  }
|	r*t        t        |	d   «      j                  «       «      |
k(  r|	n
t1        |
«      }|j#                  t%        t3        |«      dt        |«      ¬«      «       |D ])  }|j#                  t%        ||
dt        |«      ¬«      «       Œ+ Œ˜ |S c c}w )Nr,   r"   r   r!   g     À‚Àg     ÀrÀg     À‚@g     Àr@g     p‡Àg     p‡@g      y@g      Y@g      I@zNo artifacts availabler   ))FF)FT)TF)TTg      @g      $@r„   é   rE   r…   FT)rE   rE   rE   é   é   r¢   é   )r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   Úfrozen)ÚsourceÚAdditional_Threshold_BudgetÚequal_tuning)r,   r§   r¨   )r   ÚsetÚaddr   rR   r]   rK   Úsortedrg   rœ   rz   rŽ   Úlenrš   ÚrandomÚdefault_rngÚrangeÚappendr{   rq   ÚchoiceÚarangerj   r�   rŠ   r    )rM   ÚsamplesÚseedÚextra_weightsÚwideÚentry_loÚentry_hiÚexit_loÚexit_hiÚcurrentÚweightsr|   Úweight_choicesÚtrail_hiÚbudgetÚrngÚ	templatesÚconfirmation_pairsÚindexÚbalancedr¦   Útemplates                         rN   Úgenerate_candidatesrÇ   Û   sþ  € ô ˜"‹o€GÜ�-Ò% 2Ó&€GÙØ�‰�GÐ.Ñ/Ô0ÜŒM˜"ÓÓ×%Ñ%Ô'Ø�‰”M "Ó%Ô&Ø	ˆT‚z”eÐ0Ò0´T¼-ÈÓ:NÓ5O×5VÑ5VÔ5XØ�‰”M %Ó(Ô)ÜÁ7ÓKÁ7¸4œS¤ d£×!3Ñ!3Ó!5Õ6À7ÑKÓL€NØ#Ð/‰x¹t±eÈ€HØ#Ð/‰x¹d±dÈ€HØ Ð,‰g¹D±5Àe€GØ Ð,‰g¹4±4ÀT€GÙ‰t €Hñ ÜÐ1Ó2Ð2Ü��Gœs >Ó2Ñ2Ó3€FÜ
�)‰)×
Ñ
 Ó
%€CØ€IÚUÐÜ�v—ˆØ×ÑœÜ.3°C·J±J¼r¿y¹yÈÐS[Ð]_Ó?`Ó4aÓ.bÜ-2°3·:±:¼b¿i¹iÈÐQXÐZ]Ó>^Ó3_Ó-`Ü:?ÀÇ
Á
Ì2Ï9É9ÐU\Ð^eÐgjÓKkÓ@lÓ:mÜ&+¨C¯J©J´r·y±yÀÀXÈrÓ7RÓ,SÓ&TØ);¸EÀA¹IÑ)FÀqÑ)IØ*<¸UÀQ¹YÑ*GÈÑ*JØ¸Ü!% c§j¡j°%¸°Ó&?Ó!@Ü # C§J¡JÒ/DÓ$EÓ FÜ!$ S§Z¡ZÒ0EÓ%FÓ!Gô
Iö 
	Jð ð €HÛ!ˆÙ#¬¬D°Ð9KÑ1LÓ,M×,UÑ,UÓ,WÓ(XÐ\cÒ(c‘ô  jCð  DKó  jLˆØ�‰œœ_¨VÓ4¸XÔcfÐgpÓcqÔrÔsÛ!ˆHØ�O‰OœD ¸GÈNÔx{ð  }Fó  yGô  Hõ  Iñ "ð "ð
 €OùòC Ls   Ã )Mc                ó  — t         rt         j                  «       n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         rt         j'                  |«      n
t)        |«      }|j+                  d«      xs g }t         r7|t-        j.                  t         j0                  «      d   d   k7  rt3        d	«      ‚|D �cg c]  }|t4        vsŒ||j
                  vsŒ|‘Œ }}|r/t3        d
t6        j8                  j;                  |«      › d|› d�«      ‚t         �r t=        t>        jA                  |xs t=        t4        «      g d¢z   «      «      }|D �cg c]	  }||vsŒ|‘Œ }	}|	rt3        d|	› �«      ‚|j                  |jB                  t        jD                  tF        «      k\  |f   }
tI        jJ                  |
jM                  tN        ¬«      «      jQ                  «       st3        d«      ‚|ddg   dk  jS                  «       jS                  «       rt3        d«      ‚tU        ||xs d «      }|g d¢   j#                  «       }dD ]  }||j
                  v sŒ||   ||<   Œ tW        ||d   «      |d<   t         r8tI        jJ                  |jX                  «      jQ                  «       st3        d«      ‚|t         r"|d   jM                  tH        jZ                  «      n|d d …df   |d   jM                  tH        jZ                  «      |d   jM                  tH        jZ                  «      fS c c}w c c}w )NÚtimeÚsT)ÚunitÚutc)ÚdropÚfeature_colsÚcontractÚfeature_schemaz@Artifact feature schema differs from incumbent comparison schemazStale artifact z8: expects features not in current FEATURE_COLS or data: z. Retrain to skip.)ÚcloseÚhighÚstoch_peak_normzMissing comparison features: ©Údtypez$Nonfinite comparison prices/featuresrÑ   rÒ   r   zNonpositive comparison prices)rÉ   rÑ   rÒ   )Úmvrv_regimeÚlayersÚactivation_scorezNonfinite model scoresrÓ   é	   ).r'   Úframero   Úread_csvra   Úcolumnsrg   ri   rh   ÚapiÚtypesÚis_numeric_dtypeÚto_datetimeÚdtÚtz_localizeÚlocr
   ÚcopyÚreset_indexÚartifactr   r[   ÚjsonÚloadsÚmanifest_jsonrz   Ú_FEATURE_COLSÚosr|   Úbasenamerv   r{   ÚfromkeysrÉ   Ú	Timestampr   rš   r›   Úto_numpyrq   ÚallÚanyr   r   rØ   Úfloat64)rM   r†   ÚfullrË   r‡   Úart_colsÚcÚmissing_from_currentÚrequiredÚmissingÚmeasuredÚXÚscoredÚcols                 rN   Úload_scored_framerý   
  sˆ  € Ý"-Œ;×ÑÔ´2·;±;¼yÈ»}Ó3M€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å0;Œ+×
Ñ
˜|Ô
,ÔARÐS_ÓA`€CØ�w‰w�~Ó&Ò,¨"€HÝ�x¤4§:¡:¬k×.GÑ.GÓ#HÈÑ#TÐUeÑ#fÒfÜÐ[Ó\Ð\Ù'/Ód¡x !°1¼MÒ3IÈaÐW[×WcÑWcÒNcšA xÐÐdÙÜØœbŸg™g×.Ñ.¨|Ó<Ð=ð >-Ø-AÐ,BÐBTðVó
ð 	
ö ÜœŸ™ xÒ'F´4¼Ó3FÒJnÑ&nÓoÓpˆÙ&Ó8™h˜¨!°4ª-’1˜hˆÐ8ÙÜÐ<¸W¸IÐFÓGÐGØ—8‘8˜DŸI™I¬¯©´kÓ)BÑBÀHÐLÑMˆÜ�{‰{˜8×,Ñ,´5Ð,Ó9Ó:×>Ñ>Ô@ÜÐCÓDÐDØ�'˜6Ð"Ñ# qÑ(×-Ñ-Ó/×3Ñ3Ô5ÜÐ<Ó=Ð=Ü˜$ Ò 0¨DÓ1€AØÒ+Ñ,×1Ñ1Ó3€FÛˆØ�$—,‘,ÒØ˜s™)ˆF�3ŠKð  ô "-¨Q°°H±Ó!>€FÐÑÝœ2Ÿ;™; v×'>Ñ'>Ó?×CÑCÔEÜÐ1Ó2Ð2ØÅ;�4Ð)Ñ*×3Ñ3´B·J±JÔ?ÐTUÒVWÐYZÐVZÑT[Ð]aÐbiÑ]j×]sÑ]sÔtv×t~Ñt~Ó]ð  BFð  GMñ  BN÷  BWñ  BWô  XZ÷  Xbñ  Xbó  Bcð  cð  cùò1 eùò 9s   ÆO7Æ"O7Æ1O7È'	O<È1O<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/   rÔ   rE   )Úaxis)	rš   Úarrayrt   rò   r�   Úabsrï   r�   Úsum)Úscoresr‰   ÚmarginÚ
thresholdsÚdists        rN   Úfragile_countr  0  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Ó$Ó%Ð%rP   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É   rE   ©Údaysr£   g      à?éÿÿÿÿr   g     Ôv@)ro   rî   Ú	Timedeltar­   rŽ   Úilocr
  )ÚdfÚscore_startÚendÚsls       rN   Úis_yearsr  =  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ÐMrP   c                ód  — |d   }t         r$t         j                  |t         j                  |   fn|}||vr	 t        | |«      ||<   ||   t        u r—t        |«      }|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œ
¥«       |j                  dt         rt         j                  nd¬ «       |S ||   \  }}}	}
t         rWt        |j                  d!d"«      «      r<d#|vs-t        j                  |j                   «      j#                  «       st	        d$«      ‚t        |«      }t$        |d%<   t'        |j)                  «       |||	|
«      }||d&   t+        j,                  t.        «      t+        j0                  d'¬(«      z   k     j)                  «       }i i i i f\  }}}}t3        |t$        |¬)«      }t5        |t$        t.        «      }t7        |j                  dd	«      |j                  dd	«      t9        |j                  dd«      «      ||j                  dd	«      «      }t+        j,                  t:        «      }t3        ||d&   |k     j)                  «       t$        |¬)«      }t3        |t:        |¬)«      }g }g }t<        D �]  \  }}}||d&   t+        j,                  |«      t+        j0                  d'¬(«      z   k     j)                  «       }i }t3        ||t>        |¬*«      }t        ||t9        |j                  dd«      «      t>        k\  ¬+«      } | j                  |xs d,d-i«       |jA                  | «       t9        |j                  dd«      «      t>        k\  sŒÙ|jA                  tC        |j                  dd.«      «      «       �Œ tE        |«      tF        k\  rXtC        t        jH                  |«      «      }!tC        t        jJ                  |«      «      }"t9        tM        d/„ |D «       «      «      }#nd	}!d.}"tE        t<        «      }#|d&   jO                  «       t+        j,                  tP        «      k\  rSt3        |tP        d'|¬*«      }$t9        |$j                  dd«      «      dk(  rDd0D ]  }%|$j                  |%«      d1k(  sŒd	|$|%<   Œ n"tR        D �&ci c]  }&|&t        jT                  “Œ }$}&t        jT                  x}'x}(})d#|jV                  v rª||d&   t+        j,                  tP        «      k\     }*tE        |*«      dkD  rztE        |*«      }+tC        |*d#   d2k(  jM                  «       |+z  d3z  «      }'tC        |*d#   dk(  jM                  «       |+z  d3z  «      }(tC        |*d#   d'k(  jM                  «       |+z  d3z  «      })d4t$        t.        |fd5t$        tY        t+        j,                  t:        «      t+        j0                  d'¬6«      z
  «      |fd7t:        t.        |fd8tP        d |ffD ]=  \  },}-}.}/t        |,|-|.¬9«      } | j                  |/xs d,d-i«       |jA                  | «       Œ? tZ        D �&ci c]  }&|&||&   “Œ
 }}&t         �r;t+        j0                  d:d;d<d=d>d?œ|    ¬@«      }0t]        j^                  t         j`                  «      dA   dB   }1|jb                  jK                  «       t+        j,                  |1dC   «      k  xr‡ |jb                  jO                  «       t+        j,                  t.        «      t+        j0                  d'¬(«      z   |0z
  k\  xr7 |jb                  t+        j,                  tP        «      k\  jM                  «       dDk\  }2|j                  t         j                  t         j                  |   |2rdEndF¬G«       t         rAt        t        t         j                  |dH   tZ        D �&ci c]  }&|&||&   “Œ
 c}&¬I«      «      |dJ<   t]        jd                  |tX        ¬K«      |dL<   |j                  dMd«      |dM<   |j                  |«       |j                  i d|“dtg        |«      “d|j                  dd1«      “dN|j                  dd1«      “dO|j                  dd«      “d|j                  dd1«      “dP|j                  dd1«      “dQ|j                  dd«      “d|!“d|"“d|#“dt]        jd                  |D �3cg c]  }3ti        |3d;«      ‘Œ c}3«      “d|$j                  dt        jT                  «      “dR|$j                  dt        jT                  «      “dS|$j                  dt        jT                  «      “dT|$j                  dt        jT                  «      “dU|$j                  dt        jT                  «      “|'|(|)tk        |dV   |dW«      tk        |dV   |dX«      |j                  ddY«      dZœ¥«       |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 c c}3w )[Nr,   z	  [SKIP] ú: T©Úflushr8   r   r9   r„   r:   ç     8�Àr;   r<   r=   r>   r?   Ú	CompositeÚMin_Trades_FloorÚSub1_CalmarÚSub2_CalmarÚ	WFO_ScoreÚWFO_Min_FoldÚWFO_Neg_Foldséc   ÚWFO_Fold_Calmarsr@   r§   Ústale)
rA   rB   úOOS_Calmar RatioúOOS_Max Drawdown %rC   ÚOOS_Neutral_PctÚOOS_Bull_PctúFragile_0.05úFragile_1.0r§   ÚfailedÚ )ÚEvaluation_StatusÚComparison_Fingerprintr5   FrÖ   z(Missing or nonfinite MVRV execution gateÚ_pine_time_startrÉ   rE   r	  )r  Úraw_metrics)r  Ú
min_tradesr-  )r‘   r  ÚeligibleÚcoverageÚemptyç     ÀXÀc              3  ó,   K  — | ]  }|d k  sŒ	d–— Œ y­w)r   rE   N© )Ú.0rõ   s     rN   Ú	<genexpr>zevaluate.<locals>.<genexpr>‡  s   è ø€ Ð;¡\ °Q¸³Uœ!¡\ùs   ‚
�)r<   r;   r:   ç      $Àr  éd   ÚISÚSub1)ÚnanosecondsÚSub2ÚOOS)Únamer‘   r  r¢   é   rŒ   é   é   r   )ÚhoursrÏ   Úhistory_coverageÚrequired_start_byr£   ÚcompleteÚ
incomplete)r+  ÚArtifact_SHA256r*  rG  )Úcontextræ   r‰   ÚEvaluation_Key)rs   ÚPeriod_Measurementsr¨   ÚSub1_SortinoÚSub1_TradesÚSub2_SortinoÚSub2_TradesrA   rB   r"  r#  rØ   gš™™™™™©?rD   Ú	candidate)rC   r$  r%  r&  r'  r§   )6r'   r   Úartifact_hashesrý   rz   Úprintrë   r|   rì   Ú_STALE_SENTINELr{   Úupdater[   rl   rš   r›   rÖ   rð   r   r   rä   ro   rî   r	   r  r   r  r   r�   r   r   r   r±   rq   r­   r   Úmeanr�   r  rŽ   r   ÚMETRIC_COLSÚnanrÜ   rg   Ú
PARAM_COLSrç   rè   ré   rÉ   Údumpsr   r�   r  )4rM   r‰   Úcacher½   Ú	cache_keyÚexcÚresultrû   Ú
stoch_peakÚ	close_arrÚhigh_arrÚsignal_paramsÚsigsÚ
train_sigsÚraw_isÚraw_sub1Úraw_sub2Úraw_oosÚmetricsÚyearsÚcompÚsplitÚsub1Úsub2Úfold_calmarsÚall_periodsrH   Ú	oos_startÚoos_endÚfold_windowÚraw_foldÚfold_metricsr_   Ú	wfo_scoreÚwfo_minÚwfo_negÚoosÚ_kÚkÚoos_bear_pctÚoos_neutral_pctÚoos_bull_pctÚoos_sigsr”   r>  r‘   r  ÚrawÚbarr0  Úcoveredrõ   s4                                                       rN   Úevaluater�  G  s»
  € ØÐ'Ñ(€GÝ\g”×(Ñ(¨'´;×3NÑ3NÈwÑ3WÑXÐmt€IØ˜Ñð	/Ü0°°WÓ=ˆE�)Ñð ˆYÑœ?Ñ*ä�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ð 	�‰¨ÕdoÌ×I`ÒI`ÐuwˆÔxØˆØ.3°IÑ.>Ñ+€FˆJ˜	 8Ý”w˜vŸz™zÐ*@À%ÓHÔIØ Ñ&¬b¯k©k¸&×:LÑ:LÓ.M×.QÑ.QÔ.SÜÐGÓHÐHÜ˜“L€MÜ(3€MÐ$Ñ%Ü˜VŸ[™[›]¨M¸:ÀyÐRZÓ[€Dà�d˜6‘l¤R§\¡\´)Ó%<¼r¿|¹|ÐQRÔ?SÑ%SÑSÑT×YÑYÓ[€JØ*,¨b°"°b¨.Ñ'€FˆH�h Ü 
¼ÐQWÔX€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ÐqyÔz€Dô ˜Z´_ÐRZÔ[€Dà€LØ€Kß!* Ñˆˆ9�gØ  ¨FÑ!3´b·l±lÀ7Ó6KÌbÏlÉlÐ`aÔNbÑ6bÑ!bÑc×hÑhÓjˆØˆÜ(¨À)ÔXjð  yAô  BˆÜ˜I¨7¼SÀ×AQÑAQÐR`ÐbcÓAdÓ=eÔi{Ñ={Ô|ˆØ�‰�hÒ7 :¨wÐ"7Ô8Ø×Ñ˜6Ô"Üˆ|×Ñ °Ó2Ó3Ô7IÓIØ×Ñ¤ l×&6Ñ&6°~ÀuÓ&MÓ NÖOð "+ô ˆ<ÓÔ/Ò/Üœ"Ÿ'™' ,Ó/Ó0ˆ	ÜœŸ™˜|Ó,Ó-ˆÜ”cÑ;¡\Ó;Ó;Ó<‰àˆ	ØˆÜ”i“.ˆàˆF�|×ÑÓœRŸ\™\¬)Ó4Ò4Ü ´)ÈÐW^Ô_ˆô ˆ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à#'¬´iÀÐ"HÈ6ÔS^Ô`cÔdf×dpÑdpô  rAó  eBô  EG÷  EQñ  EQð  ^_ô  E`ñ  e`ó  aað  ckð  Klð  ouô  wFô  HQð  S[ð  n\ð  _dô  foð  quð  w~ð  ^ó  "@Ñˆˆe�S˜#Ü˜4 u°#Ô6ˆØ�‰�cÒ2˜j¨'Ð2Ô3Ø×Ñ˜6Õ"ð "@õ 5?Ó?±J¨q˜a ¨¡™l°J€FÐ?ÞÜ�l‰l q¨q°qÀÈÑ!LÈRÑ!PÔQˆÜ—:‘:œk×7Ñ7Ó8¸ÑDÐEWÑXˆØ—;‘;—?‘?Ó$¬¯©°XÐ>QÑ5RÓ(SÑSò KØ—{‘{—‘Ó(¬B¯L©L¼Ó,CÄbÇlÁlÐXYÔFZÑ,ZÐ]`Ñ,`Ñ`òKàŸ™¤r§|¡|´IÓ'>Ñ>×CÑCÓEÈÑJð 	ð 	�‰¬[×-DÑ-DÜ&1×&AÑ&AÀ'Ñ&JÙ6=©
À<ð 	ô 	Qõ Ü#.¬t¼K×<SÑ<SÐ^dÐevÑ^wõ  Xbó  Acñ  Xbð  STð  BCð  EKð  LMñ  ENñ  BNð  Xbñ  Acô  0dó  $eˆÐÑ Ü$(§J¡J¨{ÄCÔ$H€FÐ Ñ!Ø,2¯J©JÐ7TÐVWÓ,X€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øôK ò 	/Ü�IœbŸg™g×.Ñ.¨wÓ7Ð8¸¸3¸%Ð@ÈÕMÜ.ˆE�)×ûð	/üòT /ùò" @ùò Acùò" ,Os/   ·g Ò:hÙh#ß	h(ãh-ç	hç9hèhc                óB   — |a |r|j                  t        «       | ai a|ay rn   )r'   Úvalidate_sourcesr\   r)   r*   rK   )rM   ÚassetÚsnapshots      rN   Úinit_workerr†  Õ  s'   € à€KÙØ×!Ñ!¤$Ô'Ø€JØ€MØ�ErP   c                óZ   — t         �t        €t        d«      ‚t        t         | t        «      S )Nz sweep worker was not initialized)r)   r*   ÚRuntimeErrorr�  )r‰   s    rN   Úevaluate_workerr‰  ß  s(   € ÜÐœ]Ð2ÜÐ=Ó>Ð>Ü”J ¬Ó6Ð6rP   c                ót  — 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        | j                  dd«      dk(  «      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„   r=   r>   r  r  r7  r  rB   r*  rE  r  r  r  r2  r  r<   r9   )r�   rt   r[   r  )r~   Ú
fragile_okÚ	compositeÚpnl_ddÚdrawdownÚsub_okÚoos_sortinos          rN   Ú
rank_tupler‘  å  sv  € Ü”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äˆC�G‰GÐ'¨Ó4¸
ÑBÓCÜˆI˜‰MÓÜˆF�Q‰J‹ØØØØ	ˆ	Ü	ŒX�c—g‘g˜o¨rÓ2Ó3Ó	4Ð4Ü�—‘˜¨Ó/Ó0Ü�—‘˜ cÓ*Ó+ØÜ�—‘˜¨Ó/Ó0ØÜ�—‘˜¨Ó,Ó-ðð rP   c                óÈ   — t        | «      }t        t        z   D �ci c]  }||j                  |d«      “Œ }}t	        j
                  |g«      j                  |d¬«       y c c}w )Nr)  F©rÄ   )rO   rW  rU  r[   ro   Ú	DataFrameÚto_csv)rM   r~   r|   ry  Úordereds        rN   Úwrite_winnerr—  þ  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| j                  d«      rK| j                  d«      |j                  d«      k7  s(| j                  d«      dk7  s|j                  d«      dk7  ryt        |j                  d«      d«      }t        |j                  d«      d
«      }t        | j                  dd«      «      |k  ryt        | j                  dd
«      «      |k  ryt        t        | j                  d«      d«      «      }t        t        |j                  d«      d«      «      }t        | j                  d«      d«      }|t        k\  xr |t        k\  xr	 |t        k  }|rCt        | j                  d«      d
«      }	t        |j                  d«      d
«      }
|	|
t
        z
  k  ryy)Nr§   r¼   Fr=   r„   r   r&  r  r  r7  r  r  r+  r*  rE  r<   r@   rC   rB   T)r[   rt   r�   ÚOOS_MIN_TRADESÚOOS_BEAR_PCT_SKIPÚOOS_SORTINO_DELTA)Úbestr¼   Ústored_winnerÚ
ref_pnl_ddÚ
ref_calmarÚbest_oos_tradesÚref_oos_tradesrz  Úoos_gate_appliesÚbest_oos_sortinoÚref_oos_sortinos              rN   Ú
promotabler¥    s  € à€˜$Ÿ(™( 8Ó,°	Ò9ØÜ�—‘˜¨Ó-Ó.°!Ò3ØÜ�—‘˜¨Ó,Ó-°Ò2ØÜ�—‘˜¨Ó.Ó/°1Ò4¼ÀÇÁÈ-ÐY^ÓA_Ó8`ÐdeÒ8eØÜ
Œ8�D—H‘H˜_¨bÓ1Ó2Ó3°qÒ8ØØ�H‰HÐ-Ô.Ø�x‰xÐ0Ó1°W·[±[ÐAYÓ5ZÒZØ�x‰xÐ+Ó,°
Ò:Ø�{‰{Ð.Ó/°:Ò=ØÜ˜'Ÿ+™+ nÓ5°rÓ:€JÜ˜'Ÿ+™+ nÓ5°tÓ<€JÜ�—‘˜¨Ó-Ó.°Ò;ØÜ�—‘˜¨Ó/Ó0°:Ò=Øô œ( 4§8¡8Ð,>Ó#?ÀÓEÓF€OÜœ '§+¡+Ð.@Ó"AÀ3ÓGÓH€NÜ˜DŸH™H ^Ó4°cÓ:€Làœ>Ñ)ò 	-ØœnÑ,ò	-àÔ,Ñ,ð ñ
 Ü# D§H¡HÐ-@Ó$AÀ5ÓIÐÜ" 7§;¡;Ð/BÓ#CÀUÓKˆØ˜oÔ0AÑAÒAØØrP   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   rE   )r�   rŽ   Údivmodr°   r±   )	ÚtotalÚworkersÚshard_countÚbaseÚextraÚrangesr‘   Úordinalr  s	            rN   Úpartition_candidate_rangesr¯  0  s{   € à�‚zØˆ	Ü”c˜!˜W“o uÓ-€KÜ˜ Ó,�K€Dˆ%Ø€FØ€EÜ˜Ö%ˆØ�d‰l 7¨U¢?™a¸Ñ:ˆØ�‰�u˜c�lÔ#Ø‰ð &ð €MrP   c           
     óÆ   — i }g }t        |d«      D ]M  \  }}|j                  t        | ||«      «       |sŒ%|dz  dk(  sŒ.t        | › d|d›dt	        |«      d›�d¬«       ŒO |S )	NrE   éˆ  r   ú: evaluated Ú,Ú/Tr  )Ú	enumerater±   r�  rQ  r­   )rM   Ú
candidatesÚshow_progressrY  r#   Úidxr‰   s          rN   Úevaluate_candidates_sequentialr¹  ?  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ð €NrP   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Úsuffixry   ÚpickleÚdumpÚHIGHEST_PROTOCOLÚreplace)r|   ÚpayloadÚ	temp_pathÚhandles       rN   Ú_write_pickle_atomicrÆ  M  s[   € Ø× Ñ  §¡¨vÑ!5Ó6€IØ	�‰˜Ô	 Ü�‰�G˜V¬f×.EÑ.EÕF÷ 
à×Ñ�dÕ÷ 
Ð	ús   °'A1Á1A:c                óv  — |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	|j                  d«      a
t        rt        j                  t        «       t        | |d¬«      }t        |dt        | |d   |d	   |d   |dœ«       y # 1 sw Y   �ŒxY w)NÚrbÚversionrE   rM   zinvalid sweep shard metadatar¶  r  r   r‘   z#invalid sweep shard candidate ranger„  r…  F)r·  r®  )rÉ  r„  rM   r®  r‘   r  r#   )ry   r¿  Úloadr[   rz   rf   rv   r­   rg   rK   r'   rƒ  r\   r¹  rÆ  )rM   Ú
input_pathÚoutput_pathrÅ  rÃ  r¶  r#   s          rN   Úrun_internal_shardrÍ  T  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Ø—+‘+˜jÓ)€KÝÜ×$Ñ$¤TÔ*Ü,¨R°È5ÔQ€GÜØàÜØØ˜yÑ)Ø˜WÑ%Ø˜5‘>Øñ	
õ÷ 
Ñ	ús   ’D.Ä.D8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        | ||	|
||	|
 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Œ-|j1                  dd¬«      dd  }t3        d|› d|› �«      ‚ 	 g }d}|D �]  \  }}	}
}}|	|k7  s|j=                  «       st3        d«      ‚|j                  d«      5 }t?        j@                  |«      }d d d «       dt        | ||	|
f}jC                  d«      |jC                  d «      |jC                  d!«      |jC                  d"«      |jC                  d#«      |jC                  d$«      f}|jC                  d%«      }||k7  s!tE        |tF        «      rt        |«      |
|	z
  k7  rt3        d&«      ‚|jI                  |«       |
}�Œ |t        |«      k7  st        |«      t        |«      k7  rt3        d'«      ‚|t        |«      fcd d d «       S # t4        $ rZ |D ]S  \  }}}|j7                  «       € |j9                  «        |j-                  «        |j:                  rŒD|j/                  «        ŒU ‚ w xY w# 1 sw Y   �Œ|xY w# 1 sw Y   y xY w)(NrE   z: retrying with z subprocess shardsTr  z
mlp-sweep-rZ   )Úprefixzshard-Ú04dz
.input.pklz.output.pklz.log)rÉ  r„  rM   r®  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„  rM   r®  r‘   r  r#   zinvalid sweep shard outputz5sweep shard merge did not preserve candidate coverage)%r¯  r­   r¹  rQ  ÚtempfileÚTemporaryDirectoryrK   r   rµ  rÆ  r'   ry   Ú
subprocessÚPopenÚsysÚ
executablerg   Ú__file__rœ   r\   ÚSTDOUTr±   ÚwaitrÑ   Ú	read_textrˆ  rr   ÚpollÚ	terminateÚclosedr]   r¿  rÊ  r[   rf   rv   Úextend)rM   r¶  r©  r­  Útemp_dirÚ	temp_rootÚspecsÚ	processesr®  r‘   r  rË  rÌ  Úlog_pathÚ
log_handleÚprocessÚ
returncodeÚtailrH   ÚmergedÚexpected_startrÅ  ÚoutputÚexpectedÚactualÚshard_resultss                             rN   Úevaluate_candidates_subprocessrø  q  sá  € ô
 (¬¨J«¸ÓA€FÜ
ˆ6ƒ{�aÒÜ-¨b°*Ó=¸qÐ@Ð@ä	ˆRˆDÐ ¤ V£ Ð-?Ð
@ÈÕMÜ	×	$Ñ	$¨j¼¸¸qÀÀÀAÐ,FÕ	GÈ8Ü˜“Nˆ	ØˆØ>@ˆ	ð5	Ü)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ðK *;óN 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“{Ð"÷e 
HÑ	Gøôd ò 	Û*3Ñ&�˜ QØ—<‘<“>Ð)Ø×%Ñ%Ô'Ø—L‘L”NØ!×(Ó(Ø×$Ñ$Õ&ð +4ð ð	ú÷ (Ñ'ú÷A 
HÐ	GúsL   Á/OÂ D=MÆ>(MÇ&AOÈ(N8È>D
OÍAN5Î!N5Î5OÎ8OÎ=OÏOc                ó€  — |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        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)NrE   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)rQ  r­   r¹  rŽ   r�   ÚmpÚget_contextÚ
concurrentÚfuturesÚProcessPoolExecutorr†  rK   r'   rµ  Úmapr‰  r±   ÚOSErrorÚPermissionErrorrø  rr   Úevaluate_candidates)rM   r¶  r©  Ú
chunk_sizerý  r#   Úpoolr¸  r\  r[  Ú	shard_excs              rN   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   Â2E Ã
AD<Ä"D<Ä0E Ä<EÅE ÅF=ÅF8Å+E=Å7F=Å=	F5ÆF0Æ%F5Æ&F8Æ*F=Æ0F5Æ5F8Æ8F=c                óZ  — t        | ||||	|
|||¬«	      }t        | «      }|rt        |«      nd }|r"t        |«      }d|d<   |j	                  d|«       t        | |D �cg c]  }|d   ‘Œ	 c}«      a|r|t        j                  k7  rt        d«      ‚t        |t        |«      |«      }t        | ||«      \  }}|j                  t        d¬«       |d   }t        d	„ |D «       d «      }|�tt        |xs i «       |r|d
   |k7  rt        d«      ‚t        t!        | |i «      «      }t#        j$                  |d¬«      t#        j$                  |d¬«      k7  rt        d«      ‚t        j'                  t(        «       d`d„}|D �cg c]  } ||«      sŒ|‘Œ }}|r|d   n|}t+        |||«      }|sî|rì|�êt-        t/        |j1                  d«      d«      «      }t-        t/        |j1                  d«      d«      «      } t/        |j1                  d«      d«      }!|t2        k\  r~| t2        k\  ru|!t4        k  rlt/        |j1                  d«      d«      }"t/        |j1                  d«      d«      }#|"|#t6        z
  k  r*t9        d| › d|"d›d|#d›dt6        › d|› d| › d|!d›d�d¬«       t;        |xr |xr |d u «      }$t<        j?                  dd¬«       t<        d t@        › d!| › d"�z  }%tC        jD                  |d | «      jG                  |%d#¬$«       |r|s|$r²tI        | «      jK                  «       t        jL                  k7  rt        d%«      ‚t        jN                  D ],  \  }&}'tQ        |&«      jK                  «       |'k7  sŒ#t        d&«      ‚ t        | «      |k7  rt        d'«      ‚t        j'                  t(        «       tS        | |«       i d(| “d)t        j                  “d*t        jT                  “d+|xs i j1                  d,«      “d-d.“d/d0“d1t        |«      “d2|“d3tW        |%jY                  t(        «      «      “d4t;        |xr |xs |$«      “d5t;        |«      “d6|r|j1                  d,«      ntZ        j\                  “d7|r|j1                  d8«      ntZ        j\                  “d9|r|j1                  d:«      ntZ        j\                  “d;|r|j1                  d«      ntZ        j\                  “d<|j1                  d«      “d=|j1                  d«      “i d>|j1                  d?«      “d@|j1                  dA«      “dB|j1                  dC«      “dD|j1                  dE«      “dF|j1                  dG«      “dH|j1                  dI«      “dJ|j1                  dK«      “dL|j1                  dM«      “dN|j1                  d,«      “dO|j1                  d8«      “dP|j1                  dQ«      “dR|j1                  dS«      “dT|j1                  dU«      “dV|j1                  dW«      “dX|j1                  d:«      “dY|j1                  dZ«      “d[|j1                  d«      “¥|j1                  d\«      |j1                  d«      |j1                  d]«      |j1                  d^«      |j1                  dZ«      |j1                  d,«      |j1                  d8«      d_œ¥S c c}w c c}w )aN)r·   r¸   r¹   rº   r»   r¼   r§   r   r,   z2Comparison context changed since adaptive baselineT)rŸ   Úreversec              3  óJ   K  — | ]  }|j                  d «      dk(  sŒ|–— Œ y­w)r§   r¼   N)r[   )r5  Úrs     rN   r6  z_run_tf.<locals>.<genexpr>
  s    è ø€ ÐH¡˜1¨1¯5©5°«?¸iÓ+G”Q¡ùs   ‚#œ#rI  z2Incumbent identity changed since adaptive baseline©Ú	sort_keysú$Incumbent replay is not reproduciblec                ó¨  — | j                  d«      dk7  xr½ | j                  d«      dk(  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¼   r*  rE  r=   r„   r   r&  r  r  r7  r  r  )r[   rt   r�   )r~   s    rN   Ú_gate_passesz_run_tf.<locals>._gate_passes  sÓ   € à�G‰G�HÓ Ñ*ò AØ—‘Ð+Ó,°
Ñ:òAä˜Ÿ™ °Ó5Ó6¸Ñ:òAô ˜Ÿ™ °Ó4Ó5¸Ñ:òAô ˜Ÿ™ °Ó6Ó7¸!Ñ;ò	Aô
 ˜Ÿ™ °Ó6Ó7¸!Ñ;òAô ”H˜SŸW™W _°bÓ9Ó:Ó;¸qÑ@ð	
rP   r@   r„   rC   rB   r7  z  [OOS BLOCK] z: new OOS_Sortino=z.3fz < ref=u    âˆ’ z (trades: best=z, ref=z, bear=z.0fz%)r  ©ÚparentsÚexist_okÚ'optimization_sweep_strategy_mlp_scores_rH   rI   Fr“  z(Comparison data changed before promotionz,Comparison artifact changed before promotionz"Incumbent changed before promotionÚ	timeframer+  Úcomparison_manifestÚstored_calmar_provenancer<   Úhistorical_discrepancyz=Unresolved; stored metrics excluded from numerical comparisonÚhistorical_search_budgetzNUnknown and unequal; equal additional trials do not erase historical selectionÚ	evaluatedr©  Ú
sweep_fileÚpromotedr¥  Úcurrent_calmarÚcurrent_pnl_ddr=   Úcurrent_wfo_minr  Úcurrent_oos_sortinoÚbest_sourceÚbest_weightsÚ
best_entryr-   Ú	best_exitr.   Ú	best_confr/   Ú
best_trailr0   Úbest_suppress_bearr5   Úbest_tradesr8   Úbest_pnlr9   Úbest_drawdownr>   Úbest_calmarÚbest_pnl_ddÚbest_compositer  Úbest_sub1_calmarr  Úbest_sub2_calmarr  Úbest_wfo_scorer  Úbest_wfo_minÚbest_wfo_negr  r   rA   r&  r'  )Úbest_oos_pnlr£  Úbest_fragile_0_05Úbest_fragile_1_0Úoverall_wfo_negÚoverall_calmarÚoverall_pnl_dd)r~   údict[str, Any]Úreturnrj   )/rÇ   r   r{   r    ÚinsertÚcapture_comparisonr'   r   rz   r   r­   r
  Úsortr‘  Únextr   r�  rç   rX  rƒ  r\   r¥  r�   rt   r[   r™  rš  r›  rQ  rj   Ú	SWEEP_DIRÚmkdirrK   ro   r”  r•  ra   Ú
read_bytesrX   Ú	artifactsr   r—  ré   rg   Úrelative_torš   rV  )(rM   r´   rµ   Útop_kÚpromoter¶   r©  Úworker_fractionÚforce_promoter·   r¸   r¹   rº   r»   Úexpected_comparison_fingerprintÚexpected_incumbent_identityr¶  r¼   r�  r—   Úresolved_workersr#   Úactual_workersÚbest_overallÚcur_evalÚrepeatedr  r  Úgate_passingrœ  Úcan_promoteÚ
best_oos_tÚ	ref_oos_tÚbear_pctÚbest_oos_sorÚref_oos_sorÚforce_writingÚoutr|   r~  s(                                           rN   Ú_run_tfr^  î  sû  € ô % R¨°$¸ÈDØ.6ÀØ-4¸gôG€Jô ˜"‹o€Gá%,”D˜”M°$€MÙÜ! 'Ó*ˆØ%ˆ�ÑØ×Ñ˜!˜WÔ%ô % RÉÓ)TÉÀA¨!Ð,>Ó*?ÈÑ)TÓU€KÙ&Ð+JÌk×NeÑNeÒ+eÜÐMÓNÐNÜ+¨G´S¸³_ÀoÓVÐÜ1°"°jÐBRÓSÑ€Gˆ^à‡L�L”Z¨€LÔ.Ø˜1‘:€LÜÑH¡ÓHÈ$ÓO€HàÐ Ü�x’~ 2Ô&Ù&¨8Ð4DÑ+EÐIdÒ+dÜÐQÓRÐRÜ!¤(¨2¨w¸Ó";Ó<ˆÜ�:‰:�h¨$Ô/´4·:±:¸hÐRVÔ3WÒWÜÐCÓDÐDÜ× Ñ ¤Ô&ó	
ñ  'Ó:™w˜!©,°q­/’A˜w€LÐ:Ù*ˆ<˜Š?°€DÜ˜T 8¨]Ó;€Kñ ™<¨HÐ,@Üœ $§(¡(Ð+=Ó">ÀÓDÓEˆ
Üœ §¡Ð.@Ó!AÀ3ÓGÓHˆ	Ü˜DŸH™H ^Ó4°cÓ:ˆØœÒ'¨I¼Ò,GÈHÔWhÒLhÜ# D§H¡HÐ-@Ó$AÀ5ÓIˆLÜ" 8§<¡<Ð0CÓ#DÀeÓLˆKØ˜kÔ,=Ñ=Ò=ÜØ$ R DÐ(:¸<ÈÐ:Lð MØ& sÐ+¨5Ô1BÐ0Cð D%Ø%/ L°°y°kÀÈÐRUÈÐVXðZð õ	ô ˜ÒQ¨<ÒQ¸MÈTÐ<QÓR€Mä‡O�O˜D¨4€OÔ0Ü
Ð?Ä¸wÀaÈÀtÈ4ÐPÑ
P€CÜ‡L�L�˜˜%�Ó!×(Ñ(¨°EÐ(Ô:á‘K¡Mä�R‹=×#Ñ#Ó%¬×)9Ñ)9Ò9ÜÐGÓHÐHÜ$×.Ô.‰IˆD�#Ü�D‹z×$Ñ$Ó&¨#Ó-Ü Ð!OÓPÐPð /ô �r‹?˜mÒ+ÜÐAÓBÐBÜ×$Ñ$¤TÔ*Ü�R˜Ôð+Ø�Rð+à ¤+×"9Ñ"9ð+ð 	œ{×8Ñ8ð+ð 	# ]Ò%8°b×$=Ñ$=¸nÓ$Mð	+ð
 	!Ð"að+ð 	#Ð$tð+ð 	”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 Ó/ð/+ð0 	�D—H‘H˜]Ó+ð1+ð2 	˜Ÿ™Ð"2Ó3ð3+ð4 	�t—x‘x Ó/ð5+ð6 	�t—x‘x Ó/ð7+ð8 	˜$Ÿ(™( ;Ó/ð9+ð: 	˜DŸH™H ]Ó3ð;+ð< 	˜DŸH™H ]Ó3ð=+ð> 	˜$Ÿ(™( ;Ó/ð?+ð@ 	˜Ÿ™ Ó0ðA+ðB 	˜Ÿ™ Ó1ðC+ðD 	˜4Ÿ8™8Ð$6Ó7ñE+ðF Ÿ™Ð!2Ó3Ø ŸH™HÐ%8Ó9Ø!ŸX™X nÓ5Ø ŸH™H ]Ó3à'×+Ñ+¨OÓ<Ø&×*Ñ*¨>Ó:Ø&×*Ñ*¨>Ó:òU+ð +ùòU *UùòD ;s   ÁZ#
Å<Z(Æ
Z(c            	     óò   — t         dv rt        dt        ¬«      S t         dv rEt        dt        t	        j
                  t        «      t	        j                  d¬«      z
  «      d¬«      S t        d	t         › �«      ‚)
a3  Declare minimum available-history coverage, never infer it from input rows.

    Younger assets cannot cover 2017. Require six months before the fixed
    consistency split; this is a bounded-history comparison, not proof that
    an export contains every bar since listing. Unknown assets fail closed.
    )r   ÚCOINBASE_ETHUSDzfull-score-window)ÚkindrD  )ÚBINANCE_SOLUSDÚBINANCE_LINKUSDzbounded-available-historyé´   r	  )ra  rD  Úminimum_pre_split_daysz!No history coverage contract for )	rK   r{   r   rg   ro   rî   r   r  rz   r4  rP   rN   Úhistory_coverage_contractrf  z  sl   € ô Ð6Ñ6ÜÐ,ÄÔLÐLÜÐ5Ñ5ÜÐ4Ü&)¬"¯,©,´Ó*GÌ"Ï,É,Ð\_ÔJ`Ñ*`Ó&aØ+.ô0ð 	0ô Ð8¼¸Ð@Ó
AÐArP   c                ój  — t        | «      }|r|d   n|d   }t        j                  t        |«      j	                  «       «      d   }t        j                  t        | «      |t        t        | t        |t        t        «       t        t        t        t         t"        t$        t&        t(        dd¬«      ¬«      S )Nr,   r   rÎ   zOclose decisions; next interval exposure/entry fee; additive fees; terminal markzydeclared history bounds; at least two retained OOS bars; finite measured features; retain gaps; drop unconfirmed last row)rÐ   Ú
commissionrC  Útrain_startr  Ú	train_endro  rj  ÚfoldsÚmin_fold_tradesÚmin_valid_foldsÚ	executionr0  )Úrepor„  rM   rÏ   )r   rç   rè   r   rG  r   Úcapturera   r\   rK   r{   r   rf  r
   r   r	   r   r   r   r   r   )rM   r½   ÚwinnerÚschema_pathÚschemas        rN   rB  rB  Š  s”   € Ü˜‹_€FÙ06�&Ð+Ò,¸GÀA¹J€KÜ�Z‰Zœ˜[Ó)×4Ñ4Ó6Ó7¸ÑG€FÜ×%Ñ%¤i°£m°WÄ4ÌuÐY[Ü V¼Ü'@Ó'BÜ"-¼;ÔR[Ü )´Ì	Ü&8ÔJ]Ø qð  [ô\ô]ð ]rP   c                óÆ  — t         t        }}	 | a t        |«      }|€t        d| › d|› �«      ‚t	        |«      }d|d<   t        ||d   g«      at        t        ||i «      «      }t        t        ||i «      «      }||k7  r:t        j                  |d¬«      t        j                  |d¬«      k7  rt        d«      ‚t        j                  t        «       |||ca aS # ||ca aw xY w)	NzNo incumbent for Ú r¼   r§   r,   Tr  r  )rK   r'   r   rz   r    rB  r   r�  rç   rX  rƒ  r\   )r„  rM   Úprevious_assetÚprevious_snapshotrq  r‰   r~   Úagains           rN   Úreplay_incumbentry  ˜  sé   € ä(-¬{Ð%€Nð?ØˆÜ˜R“ˆØˆ>ÜÐ0°°°q¸¸Ð=Ó>Ð>Ü  Ó(ˆØ$ˆˆxÑÜ(¨¨fÐ5GÑ.HÐ-IÓJˆÜœX b¨&°"Ó5Ó6ˆÜœx¨¨F°BÓ7Ó8ˆØ�%Š<ä�z‰z˜#¨Ô.´$·*±*¸UÈdÔ2SÒSÜ Ð!GÓHÐHÜ×$Ñ$¤TÔ*Øà+Ð->Ðˆ‰{ø˜^Ð->Ðˆ‰{ús   ŽCC ÃC c                 ó8   — t         }	 t        | i |¤Ž|a S # |a w xY wrn   )r'   r^  )ÚargsÚkwargsÚpreviouss      rN   Úrun_tfr~  ¯  s$   € ä€HðÜ˜Ð' Ñ'à‰ø�h‰ús   ˆ
 •c                 óÚ  — 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«       | j                  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                  d0d t         j                  ¬«       | j                  «       }|j                  a|j                  rs|j                  r|j                  r|j                  s| j!                  d1«       t#        |j                  t%        |j                  «      t%        |j                  «      «       y t&        j)                  d2d2¬3«       g }t+        |j,                  «      D ]ø  \  }}t/        d4|› d5|j0                  d6›d7�d2¬8«       |j3                  t5        ||j0                  |j6                  |d9z  z   |j8                  |j:                  xs |j<                  |j>                  |j@                  |jB                  |j<                  |jD                  |jF                  |jH                  |jJ                  |jL                  |jN                  |jP                  ¬:«      «       Œú t&        d;z  }tS        jT                  |«      jW                  |d<¬=«       t/        d>|jY                  tZ        «      › �«       t/        tS        jT                  |«      j]                  d<¬=«      «       y )?NzRun deeper MLP threshold sweeps)ÚdescriptionrÑ  zAAsset identifier, e.g. COINBASE_ETHUSD (default: COINBASE_BTCUSD))rs   Úhelpz--timeframesÚ+)Únargsrs   Úchoicesz	--samplesiPÃ  z“Total additional trial budget per timeframe; evenly divided across models with remainder unused, plus one frozen row per model and incumbent replay)Útypers   r�  z--seedi
'5)r…  rs   z--top-kiÐ  z--extra-weightsÚ*z`Additional MLP artifact JSONs to include as candidate weight files for every selected timeframe.)rƒ  rs   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!--expected-comparison-fingerprintz--expected-incumbent-identityz	--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ñ  )rM  r·   r¸   r¹   rº   r»   rN  rO  zmlp_deep_sweep_summary.csvFr“  z
Summary written: )/ÚargparseÚArgumentParserÚadd_argumentÚ_DEFAULT_ASSETÚTFSr�   rq   r   ÚSUPPRESSÚ
parse_argsr„  rK   Ú_internal_shardÚ	_shard_tfÚ_shard_inputÚ_shard_outputÚerrorrÍ  r   Ú
REPORT_DIRrF  rµ  Ú
timeframesrQ  r´   r±   r~  rµ   rJ  rK  rM  r¶   r©  rL  r·   r¸   r¹   rº   r»   rN  rO  ro   r”  r•  rI  r\   Ú	to_string)Úparserr{  Ú	summariesÚoffsetrM   Úsummary_paths         rN   Úmainrœ  ¸  sç  € Ü×$Ñ$Ð1RÔS€FØ
×Ñ˜	¬>Ø`ð ô bà
×Ñ˜¨c¼3ÌÐÔLØ
×Ñ˜¬#°uð DiÐô jà
×Ñ˜¤s°HÐÔ=Ø
×Ñ˜	¬°TÐÔ:Ø
×ÑÐ)°¸bØð ô Aà
×Ñ˜¬#°qð@ð ô Að ×ÑÐ+´%ÔAXØJð ô Là
×ÑÐ;Ô<Ø
×ÑÐ7Ô8Ø
×Ñ˜¨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Ø@D×@dÑ@dØ<@×<\Ñ<\ô^õ 	_ð 1ô Ð <Ñ<€LÜ‡L�L�Ó×"Ñ" <°uÐ"Ô=Ü	Ð × 8Ñ 8¼Ó >Ð?Ð
@ÔAÜ	Œ"�,‰,�yÓ
!×
+Ñ
+°%Ð
+Ó
8Õ9rP   Ú__main__)rM   rg   r@  r   )rM   rg   r@  rg   )rk   r   r@  rj   )r„   )rk   r   rs   rq   r@  rq   )rM   rg   r@  údict[str, Any] | None)r†   rg   r@  r?  )
r�   rq   r‘   rq   r’   rq   r“   rq   r@  rq   )r—   r?  r@  útuple[Any, ...])r—   r?  r@  r?  )NFNNNN)rM   rg   r´   r�   rµ   r�   r¶   úlist[str] | Noner·   rj   r¸   úfloat | Noner¹   r¡  rº   r¡  r»   r¡  r@  úlist[dict[str, Any]])rM   rg   r†   rg   r@  z7tuple[pd.DataFrame, np.ndarray, np.ndarray, np.ndarray])r  z	pd.Seriesr‰   r?  r  rq   r@  r�   )r  zpd.DataFramer  rg   r  rg   r@  rq   )rM   rg   r‰   r?  rY  zBdict[str, tuple[pd.DataFrame, np.ndarray, np.ndarray, np.ndarray]]r@  r?  rn   )rM   rg   r„  rg   r@  ÚNone)r‰   r?  r@  r?  )r~   r?  r@  rŸ  )rM   rg   r~   r?  r@  r£  )rœ  r?  r¼   rž  r�  rž  r@  rj   )r¨  r�   r©  r�   r@  zlist[tuple[int, int]])T)rM   rg   r¶  r¢  r·  rj   r@  r¢  )r|   r   rÃ  r?  r@  r£  )rM   rg   rË  r   rÌ  r   r@  r£  )rM   rg   r¶  r¢  r©  r�   r@  z tuple[list[dict[str, Any]], int])"rM   rg   r´   r�   rµ   r�   rJ  r�   rK  rj   r¶   r   r©  r�   rL  rq   rM  rj   r·   rj   r¸   r¡  r¹   r¡  rº   r¡  r»   r¡  rN  r(   rO  r(   r@  r?  )r@  r£  )lÚ__doc__Ú
__future__r   r‰  Úconcurrent.futuresr  rw   rë   rç   Úmultiprocessingr  r¿  Úpathlibr   rÝ  rÛ  Útypingr   Únumpyrš   Úpandasro   rß  rá  rœ   Úparentr\   r|   rA  rg   Úconfigr   r   r   r	   r
   r   r   r   r   r   Ústrategies.strategy_mlp_scoresr   rê   r   r   r   r   r   Ústrategies.mlp_comparisonr   r   r   Ústrategies.mlp_accountingr   Útools.worker_utilsr   r   rŒ  rK   r�  rJ   rE  r•  r'   Ú__annotations__r)   r*   rW  rU  r›  r™  rš  rO   rR   ra   rl   rt   r   rŠ   r•   r˜   r    rÇ   rý   r  r  ÚobjectrR  r�  r†  r‰  r‘  r—  r¥  r¯  r¹  rÆ  rÍ  rø  r
  r^  rf  rB  ry  r~  rœ  Ú__name__r4  rP   rN   Ú<module>rµ     s  ðòõ #ã Û Û 
Û 	Û Û Û Ý Û Û Ý ã Û ã 
áˆHƒ~×ÑÓ×&Ñ&×-Ñ-€Ø ‡�‡��‘3�t“9Ô ÷÷ ÷ ÷÷ ÷ VÑ UÝ 5ß Lð #€Ø€Ú%€Ø�IÑ 	Ñ)€
Ø�9Ñ˜xÑ'€	Ø�IÑ 	Ñ)€
Ø)-€Ð&Ó -Ø€
ˆJÓ Ø[_€ÐXÓ _ò€
ò€ð" Ð Ø€ØÐ óTóBó/óôóóó,&óóð2 puØPTØNRð,Ø".ð,ØAMð,à!-ð,à?Kð,àWkó,ó^#cóL
&óNñ “(€óKô\ó7óó26ð 7;ð)Ø3ð)Ø?Có)óXð$ ðØðà$ðð ðð ó	óóð:\#Øð\#à$ð\#ð ð\#ð &ó	\#ó~ð> .2À!Ø$;Ø!&°UØ$(À4Ø#'ÀØ9=Ø59ðIØ*ðIØ<?ðIà!ðIð ðIð /3ðIð "ð	Ið 5Að	Ið
 !ðIð
 3?ðIð -7ðIð )3ðIð ?MóIòXBò ]ò?ò.ó<:ð~ ˆzÒÙ…Fð rP   