Ë
    Å�±jº9  ã                  óÊ  — d Z ddlmZ ddlZddlmZ ddlZddlmZ ddl	Z	ddl
Z
ddlZddlZ ee«      j!                  «       j"                  d   Ze
j&                  j)                  d ee«      «       ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& edz  Z'dZ(dZ)dZ*e(ddddgZ+dZ,d„ Z-d„ Z.d„ Z/d"d„Z0d„ Z1d„ Z2d„ Z3d„ Z4d„ Z5d„ Z6d„ Z7d „ Z8e9d!k(  r e8«        yy)#zHFrozen retrospective diagnostics; never select or promote perturbations.é    )ÚannotationsN©Úreplace)ÚPathé   )Únet_returns)ÚdigestÚfingerprintÚrequire_replay)Úconfirmed_score_structure)Ú_score_to_signals)ÚFROZENÚ
MODEL_HASHÚ	evaluatorÚgate_decisionsÚhashesÚprotected_hashesz1results/mlp_threshold_comparison_2026_09_21/finalz'docs/mlp_revisit_protocol_2026_09_21.md)Ú!i_long_entry_activation_thresholdÚ i_long_exit_activation_thresholdÚ-i_long_exit_activation_confirmation_threshold)g      ð¿gš™™™™™©¿çš™™™™™©?ç      ð?ztools/run_mlp_revisit.pyztests/test_mlp_revisit.pyz&tools/run_mlp_entry_loss_experiment.pyz!strategies/mlp_score_structure.py)ÚpositionÚexecute_entryÚexecute_exitÚ
net_returnc                ób   — | j                  t        j                  |dt        d¬«      dz   «       y )Né   F)ÚindentÚdefaultÚ	allow_nanÚ
)Ú
write_textÚjsonÚdumpsÚstr)ÚpathÚpayloads     ú@/Users/jameslopez/projects/TradingBot25/tools/run_mlp_revisit.pyÚ
write_jsonr*   "   s#   € Ø‡O�O”D—J‘J˜w¨q¼#ÈÔOÐRVÑVÕWó    c                óh  ‡‡— t         j                  j                  d«      }i Šdˆˆfd„	}t        | D �ch c]  }|d   ’Œ	 c}«      D ]¤  }dD ]�  }| D ��ci c]3  }|d   |k(  r)|d   dkD  |k(  rt	        ‰D �ci c]  }|||   “Œ
 c}«      |“Œ5 }	}}t        |	j                  «       «      }
|j                  t        |
«      t        dt        |
«      «      d¬	«      D ]  } ||
|   d
¬«       Œ ŒŸ Œ¦ t        |«      D ]  \  }} |||¬«       Œ t        ‰j                  «       «      S c c}w c c}w c c}}w )zEStratify on prior proximity flags, never on new sensitivity outcomes.é9(5Fc           	     óÒ   •— ‰D �ci c]  }|| |   “Œ
 }}t        |«      }‰j                  |t        ||dg ¬«      «      }|dxx   |z  cc<   |�|d   j                  |«       y y c c}w )NF)ÚidÚparamsÚsampleÚcasesr1   r2   )r
   Ú
setdefaultÚdictÚappend)Úrowr1   ÚcaseÚkeyr0   ÚitemÚ
param_colsÚselecteds         €€r)   Úaddzselect_centers.<locals>.add+   sw   ø€ Ù+5Ó6©: C�#�s˜3‘x‘-¨:ˆÐ6Ü˜&Ó!ˆØ×"Ñ" 3¬°¸FÈ5ÐXZÔ([Ó\ˆØˆX‹˜&Ñ ‹ØÐØ�‰M× Ñ  Õ&ð ùò	 7s   †A$Úmlp_weights_file)FTúFragile_0.05r   é
   r   T)r1   )r7   )FN)ÚnpÚrandomÚdefault_rngÚsortedr
   ÚlistÚvaluesÚchoiceÚlenÚminÚ	enumerate)Úrowsr2   r:   Úrngr<   ÚrÚmodelÚflaggedÚkÚpoolrE   Úindexr6   r;   s     `          @r)   Úselect_centersrR   &   s7  ù€ ä
�)‰)×
Ñ
 Ó
)€CØ€Hö'ô ¹Ó=¹°1˜Ð-Ó.¸Ñ=Ö>ˆÛ$ˆGáKOô ^É4ÀaØÐ+Ñ,°Ò5¸1¸^Ñ;LÈqÑ;PÐU\Ò:\ô  ±*Ó =±*¨Q  A a¡D¡°*Ñ =Ó>ÀÑAÈ4ˆDñ ^ä˜$Ÿ+™+›-Ó(ˆFØŸ™¤C¨£K´°R¼¸V»Ó1EÈu˜ÖU�Ù�F˜5‘M¨$Ö/ñ Vñ %ð ?ô   Ö&‰
ˆˆsÙˆC�eÖð 'ä�—‘Ó!Ó"Ð"ùò >ùò !>ùó ^s   ´D$Á!D.
Á5D)Â
D.
Ä)D.
c                ó   ‡ — ˆ fd„}|S )Nc                óÒ   •— ‰r0t        | j                  j                  «       ‰‰¬«      j                  n#t	        j
                  t        | «      t        ¬«      }t        | |||||¬«      S )N)ÚleftÚright©Údtype)Ú
entry_gate)	r   Úactivation_scoreÚto_numpyÚbullish_stater@   ÚonesrG   Úboolr   )Úframer0   ÚstochÚcloseÚhighÚgateÚwidths         €r)   Úsignalzgate_signal.<locals>.signalA   sW   ø€ áô *¨%×*@Ñ*@×*IÑ*IÓ*KÐRWÐ_dÔe×sÒsÜ Ÿg™g¤c¨%£j¼Ô=ð 	ä  ¨°°u¸dÈtÔTÐTr+   © )rd   re   s   ` r)   Úgate_signalrg   @   s   ø€ ôUð €Mr+   c                ó®  — t        | j                  d||«      «      }| j                  j                  |d   |d   f}||   \  }}}}	| j	                  |j                  «       t        || j                  ¬«      |||	«      }
t        |
«      |
d<   ||d<   t        t        |d   |d   | j                  D �ci c]  }|||   “Œ
 c}|¬«      «      |d	<   ||
fS c c}w )
zHUse the actual promotion evaluator with a private policy implementation.Ú6Hr=   ÚArtifact_SHA256)Ú_pine_time_startr   ÚPolicyÚComparison_Fingerprint)ÚcontextÚartifactr0   ÚpolicyÚEvaluation_Key)
r   ÚevaluateÚ_COMPARISONr
   r   Úcopyr4   ÚSCORE_STARTr   Ú
PARAM_COLS)Úmoduler0   Úcacherp   r6   Ú	cache_keyÚscoredr`   ra   rb   ÚtracerO   s               r)   Úreplayr|   H   sõ   € ä
˜Ÿ™¨¨v°uÓ=Ó
>€CØ×#Ñ#×/Ñ/°Ð8JÑ1KÈSÐQbÑMcÐd€IØ!& yÑ!1Ñ€FˆE�5˜$Ø×$Ñ$ V§[¡[£]´D¸ÐRX×RdÑRdÔ4eÐglÐnsÐuyÓz€EÜ% eÓ,€Eˆ,ÑØ€Cˆ�MÜ'¬°SÐ9QÑ5RØÐ&Ñ'ÀF×DUÒDUÓ0VÑDU¸q°°C¸±F±ÐDUÑ0VÐ_eô)gó h€CÐÑà�ˆ:Ðùò 1Ws   Â1Cc                óX   — t         D �ci c]  }|| |   j                  «       “Œ c}S c c}w ©N)Ú
TRACE_KEYSr[   )r{   r8   s     r)   Útrace_arraysr€   U   s,   € Ý2<Ó=±*¨3ˆC��s‘×$Ñ$Ó&Ñ&°*Ñ=Ð=ùÒ=s   ‰'c                ót  ‡‡— i }d| j                   t        j                  |j                  «      k\  | j                   t        j                  |j                  «      t        j
                  d¬«      z   k  z  fd| j                   t        j                  |j                  «      k\  ffD �]Š  \  Š}| j                  |j                  k7  | j                  |j                  k7  z  |z  }t        ˆfd„t        j                  |d   «      D «       «      }t        ˆfd„t        j                  |d   «      D «       «      }	dD �
ci c]  }
|
||
   �|	|
   �|	|
   ||
   z
  nd “Œ c}
Št        t        |j                  «       «      t        | j                  |j                  k7  |z  j                  «       «      t        | j                   |j                   k7  |z  j                  «       «      |j#                  «       r%t%        | j                   |   j&                  d	   «      nd ‰t#        ˆfd
„dD «       «      ¬«      |‰<   �Œ� |S c c}
w )NÚISr   ©ÚdaysÚOOSc              3  óL   •K  — | ]  }|j                  d «      ‰k(  sŒ|–— Œ y­w©ÚnameN©Úget©Ú.0Úprˆ   s     €r)   Ú	<genexpr>zsensitivity.<locals>.<genexpr>`   s%   øè ø€ ÐaÑG�qÈ1Ï5É5ÐQWË=Ð\`ÓK`”ÑGùó   ƒ$�$ÚPeriod_Measurementsc              3  óL   •K  — | ]  }|j                  d «      ‰k(  sŒ|–— Œ y­wr‡   r‰   r‹   s     €r)   rŽ   zsensitivity.<locals>.<genexpr>a   s$   øè ø€ Ð\ÑB�qÀaÇeÁeÈFÃmÐW[ÓF[”ÑBùr�   )Úpnl_pctÚdd_pctÚcalmarr   c              3  óP   •K  — | ]  \  }}‰|   �t        ‰|   «      |k\  –— Œ y ­wr~   ©Úabs)rŒ   rO   ÚlimitÚdiffs      €r)   rŽ   zsensitivity.<locals>.<genexpr>h   s:   øè ø€ ð &[ÙBñ AIÀÀ5ØFJÈ1ÁgÐFYô '*¨$¨q©'£l°eÕ&;ÙBùs   ƒ#&))r’   r   )r“   r   )r”   r   )Úchanged_action_barsÚchanged_position_barsÚchanged_return_barsÚfirst_changed_actionÚdeltasÚmaterial)ÚtimeÚpdÚ	Timestampru   Ú	TRAIN_ENDÚ	TimedeltaÚ	OOS_STARTr   r   Únextr$   Úloadsr4   ÚintÚsumr   r   Úanyr&   Úiloc)ÚbaseÚchangedÚbase_rowr6   rw   ÚresultÚmaskÚactionsÚaÚbr8   r™   rˆ   s              @@r)   Úsensitivityr´   Y   s  ù€ Ø€Fà	�—	‘	œRŸ\™\¨&×*<Ñ*<Ó=Ñ=À$Ç)Á)ÌbÏlÉlÐ[a×[kÑ[kÓNlÔoq×o{Ño{ð  BCô  pDñ  ODñ  CDñ  Eð  	FØ	�—	‘	œRŸ\™\¨&×*:Ñ*:Ó;Ñ;Ð<ô‰
ˆˆdð ×&Ñ&¨'×*?Ñ*?Ñ?ÀD×DUÑDUÐY`×YmÑYmÑDmÑnÐrvÑvˆÜÓaœDŸJ™J xÐ0EÑ'FÔGÓaÓaˆÜÓ\œDŸJ™J sÐ+@Ñ'AÔBÓ\Ó\ˆá:ó<Ù:�Cð ¨¨#©Ð(:¸qÀ¹vÐ?Q�Q�s‘V˜a ™f’_ÐW[Ñ[Ø:ñ<ˆä´°G·K±K³MÓ0BÜ"%¨¯©¸×9IÑ9IÑ(IÈTÑ'Q×&VÑ&VÓ&XÓ"YÜ # d§o¡o¸×9KÑ9KÑ&KÈtÑ%S×$XÑ$XÓ$ZÓ [ØDKÇKÁKÄM¤ T§Y¡Y¨wÑ%7×%<Ñ%<¸QÑ%?Ô!@ÐW[Ø¤#ó &[ÙBó&[ó #[ô	\ˆˆt‹ðð €Mùò<s   Ä:H5c                óx  — g }t         D �]­  }t        j                  t        j                  | j                  ||   z
  «      dk  | j
                  t        j                  |j                  «      t        j                  d¬«      z   k  z  «      }|D �]%  }| j                  ||dz    }|j                  t        t        |«      t        | j
                  j                  |   «      |t        | j                  j                  |   «      ||   t!        | j
                  j                  |   t        j                  |j"                  «      k\  «      |d   |d   |d   t        j                  |j$                  «      j'                  «       t        j                  |j(                  «      j'                  «       ¬«      «       �Œ( �Œ° |S )	Nr   r   rƒ   é   Úi_use_long_exit_confirmationÚi_entry_score_windowÚi_exit_score_window)Úbarr    Ú	thresholdÚscoreÚthreshold_valueÚin_trading_windowÚexit_confirmation_enabledÚentry_windowÚexit_windowÚexecuted_entry_offsetsÚexecuted_exit_offsets)Ú
THRESHOLDSr@   Úflatnonzeror—   rZ   r    r¡   r¢   r£   r¤   r«   r5   r4   r¨   r&   Úfloatr^   ru   r   Útolistr   )r{   r0   rw   rJ   r»   ÚnearrQ   Únearbys           r)   Úproximity_eventsrÊ   m   se  € Ø€Dß�Zˆ	Ü�~‰~œrŸv™v e×&<Ñ&<¸vÀiÑ?PÑ&PÓQÐTWÑWØ!&§¡¬b¯l©l¸6×;KÑ;KÓ.LÌrÏ|É|ÐabÔOcÑ.cÑ!cñeó fˆäˆEØ—Z‘Z  e¨A¡gÐ.ˆFØ�K‰Kœ¤ U£´#°e·j±j·o±oÀeÑ6LÓ2MÐYbÜ˜E×2Ñ2×7Ñ7¸Ñ>Ó?ÐQWÐXaÑQbÜ"& u§z¡z§¡°uÑ'=ÄÇÁÈf×N`ÑN`ÓAaÑ'aÓ"bØ*0Ð1OÑ*PØ#Ð$:Ñ;ÈÐPeÑIfÜ')§~¡~°f×6JÑ6JÓ'K×'RÑ'RÓ'TÜ&(§n¡n°V×5HÑ5HÓ&I×&PÑ&PÓ&RôTö Uò ð  ð €Kr+   c           	     óZ  ‡‡— | j                  «       r$t        | j                  «       «      rt        d«      ‚| j	                  dd¬«       t        «       }dD ]Š  }t        j                  t        j                  |gt        dd¬«      }| t        |«      j                  dz   z  j                  |j                  |j                  z   «       |j                   sŒ~t#        d|› �«      ‚ t%        «       }|j'                  |j)                  d«      «      Št        ˆfd	„t+        j,                  «       D «       «      rt        d
«      ‚t/        t        ‰d   «      j1                  «       «      t2        k7  rt        d«      ‚t5        j6                  t8        dz  j;                  «       «      }|j=                  d|D �cg c]  }|d   ‘Œ	 c}«      Št5        j6                  ‰j>                  «      }t5        j6                  t8        dz  j;                  «       «      }	dD ]  }
||
   |	|
   k7  sŒt        d|
› �«      ‚ t        ˆfd„|D «       «      rt        d«      ‚tA        dD �cg c]  }t8        |z  ‘Œ c}«      }|d   jC                  tA        tD        D �cg c]  }t        |z  ‘Œ c}«      «       tG        |tH        dddgg d¢d¬«      |d   d<   tK        ‰t5        jL                  |dd¬«      ¬«      Š‰|_'        tQ        | dz  |«       tQ        | dz  |«       tQ        | d z  |«       |‰‰|||fS c c}w c c}w c c}w )!NzOutput must be new or emptyT)ÚparentsÚexist_ok)ztools/sync_params.pyztools/check_pine.py)ÚcwdÚtextÚcapture_outputz.logzPreflight failed: ri   c              3  ó4   •K  — | ]  \  }}‰|   |k7  –— Œ y ­wr~   rf   )rŒ   r8   ÚvalueÚ	incumbents      €r)   rŽ   zsetup.<locals>.<genexpr>Š   s   øè ø€ Ð
D±^¡z s¨Eˆ9�S‰>˜UÕ"±^ùó   ƒzIncumbent parameter driftr=   zIncumbent artifact driftúall_results.jsonúcomparison_manifest.json)Údata_sha256ÚcontractÚsource_hasheszHistorical comparison drift: c              3  óN   •K  — | ]  }‰j                   |d       |d   k7  –— Œ y­w)r=   rj   N)Úartifact_hashes)rŒ   rL   Úsnapshots     €r)   rŽ   zsetup.<locals>.<genexpr>•   s1   øè ø€ Ð
eÑ\dÐWXˆ8×#Ñ# AÐ&8Ñ$9Ñ:¸aÐ@QÑ>RÕRÑ\dùs   ƒ"%zArchived model drift)rÕ   úsummary.jsonúincumbent.jsonrÖ   rÙ   r-   r   r   ©r   r¶   é   )ÚstageÚprotocolÚseedÚ
magnitudesÚpivotsÚno_selectionrØ   Úrevisit)Ú,Ú:)Ú	sort_keysÚ
separators)Úmanifest_jsonzprotected_hashes.jsonzreference_hashes.json))Úexistsrª   ÚiterdirÚ
ValueErrorÚmkdirr   Ú
subprocessÚrunÚsysÚ
executableÚREPOr   rˆ   r#   ÚstdoutÚstderrÚ
returncodeÚRuntimeErrorr   Únormalise_paramÚload_winnerr   Úitemsr	   Ú
read_bytesr   r$   r§   Ú	REFERENCEÚ	read_textÚcapture_comparisonrì   r   ÚupdateÚSOURCESr4   ÚPROTOCOLr   r%   rs   r*   )Úoutputrá   Ú	protectedÚscriptrò   rw   Úold_rowsrL   ÚmanifestÚ	referencer8   rˆ   Úreference_hashesr�   rÓ   rÜ   s                 @@r)   Úsetupr  ~   sÜ  ù€ Ø‡}�}„œ3˜vŸ~™~Ó/Ô0ÜÐ6Ó7Ð7Ø
‡L�L˜¨€LÔ-Ü Ó"€IÛAˆÜ�n‰nœcŸn™n¨fÐ5¼4ÀdÐ[_Ô`ˆØ	”4˜“<×$Ñ$ vÑ-Ñ	.×:Ñ:¸3¿:¹:ÈÏ
É
Ñ;RÔSØ�>‹>ÜÐ!3°F°8Ð<Ó=Ð=ð	 Bô
 ‹[€FØ×&Ñ& v×'9Ñ'9¸$Ó'?Ó@€IÜ
Ó
D´V·\±\´^Ó
DÔDÜÐ4Ó5Ð5ÜŒd�9Ð/Ñ0Ó1×<Ñ<Ó>Ó?Ä:ÒMÜÐ3Ó4Ð4Ü�z‰zœ9Ð'9Ñ9×DÑDÓFÓG€HØ×(Ñ(¨ÉxÓ/XÉxÈ!°Ð2DÓ0EÈxÑ/XÓY€HÜ�z‰z˜(×0Ñ0Ó1€HÜ—
‘
œIÐ(BÑB×MÑMÓOÓP€IÛ;ˆØ�C‰=˜I c™NÓ*ÜÐ<¸S¸EÐBÓCÐCð <ô Ó
eÑ\dÓ
eÔeÜÐ/Ó0Ð0Üñ  =Oó  Pñ  =O°Dœy¨4Ó/ð  =Oñ  Pó  QÐØˆ_Ñ×$Ñ$¤V½wÓ,G¹w¸!¬T°A«X¸wÑ,GÓ%HÔIÜ&*°ÄÐPXØ˜�9¢Y¸Tô'C€HˆZÑ˜Ñ#ä�x¬t¯z©z¸(ÈdÐ_iÔ/jÔk€HØ!€FÔÜˆvÐ2Ñ2°HÔ=ÜˆvÐ/Ñ/°Ô;ÜˆvÐ/Ñ/Ð1AÔBØ�9˜h¨	Ð3CÀXÐMÐMùò# 0Yùò PùÚ,Gs   Æ/L
ÉL#ÊL(c                óž  — |j                  t        «       |t        «       k(  sJ d«       ‚|t        |D �cg c]  }t        |z  ‘Œ c}«      k(  sJ d«       ‚t	        |j                  d«      j                  «       «      t        j                  |j                  «      d   k(  sJ ‚t        | dz  t        d|t        |«      dddd¬«      «       y c c}w )	NzProtected artifact driftzReference driftri   r×   zverification.jsonTr   )ÚcompleteÚevaluationsÚprotected_filesÚprotected_unchangedÚsource_input_hashes_unchangedÚ
promotionsÚretrospective)Úvalidate_sourcesrõ   r   r   r	   Ú	data_pathrý   r$   r§   rì   r*   r4   rG   )r  rw   rÜ   r  Ú
referencesÚcountr�   s          r)   Úfinishr  £   sÁ   € Ø×ÑœdÔ#ØÔ(Ó*Ò*ÐFÐ,FÓFÐ*Øœ±:Ó >±:¨a¤¨£°:Ñ >Ó?Ò?ÐRÐARÓRÐ?Ü�&×"Ñ" 4Ó(×3Ñ3Ó5Ó6¼$¿*¹*ÀX×E[ÑE[Ó:\Ð]jÑ:kÒkÐkÐkÜˆvÐ+Ñ+¬T¸4ÈUÜ˜I›¸DÐ`dØ Dô.*õ +ùò !?s   ´C

c                óž	  ‡%‡&‡'— t        | d«      \  Š&}}}}}t        j                  t        dz  j	                  «       «      }t        j                  t        dz  j	                  «       «      g|d   D �cg c]  }|d   ‘Œ	 c}z   }dg|d   D �cg c]  }|d   ‘Œ	 c}z   }	t        ||‰&j                  «      }
t        | dz  t        |	|
¬	«      «       i }d
|d<   t        ‰&||«      \  }}t        | dz  |«       g g g g f\  }}}}t        |
«      D �]H  \  }}t        |d   d¬«      Š't        ‰&‰'|«      \  }}t        ˆ&ˆ'fd„|D «       «      }dD ]+  }t        j                  j                  ||   ||   dd¬«       Œ- |d   }|j                  |d d¬«       t!        ‰&||«      |d<   |j#                  |«       t%        |«      j'                  «       D ��ci c]  \  }}d|› �|“Œ }}}|j(                  j+                  d¬«      j-                  d«      |d<   t/        |‰'‰&«      D ]  }|j#                  t        d5d|i|¤Ž«       Œ  g }t0        D �]  }t2        D �]  }t        ‰'fi |‰'|   |z   i¤Ž}t        ‰&||«      \  } }!| j                  |||¬«       t!        ‰&| |«      | d<   |j#                  | «       t        d5|||dœt5        ||!|| ‰&«      ¤Ž}"|j#                  |"«       |j#                  |"«       t0        j7                  |«      › dt2        j7                  |«      › �}#|j                  t%        |!«      j'                  «       D ��ci c]  \  }}|#› d|› �|“Œ c}}«       �Œ �Œ t        j8                  | |› d�z  fi |¤Ž |j#                  t        |t;        ‰'d    «      j<                  |d!   |d"   D �$cg c]  }$|	|$   ‘Œ	 c}$|d#   d$kD  |d#   d%D �%‡%ci c]P  Š%t?        ‰%«      t        tA        ˆ%fd&„|D «       «      tA        ˆ%fd'„|D «       «      tC        ˆ%fd(„|D «       «      ¬)«      “ŒR c}%¬*«      «       |d+z  d$k(  s�Œ*tE        d,|d-z   › d.tG        |
«      › �d/¬0«       �ŒK t        | d1z  |«       t        | d2z  |«       t        | d3z  |«       t        | d4z  |«       tI        | ‰&|||tG        |«      d-z   «       y c c}w c c}w c c}}w c c}}w c c}$w c c}%w )6NÚ	fragilityrÝ   rÞ   ÚmodelsÚbest_rankedÚfrozen_incumbentrM   zfrozen_centers.json)Ú
case_namesÚcentersÚcurrentÚsourcer0   Údiagnostic_center©r!  c              3  ód   •‡K  — | ]&  Št        ˆˆfd „‰j                  D «       «      sŒ#‰–— Œ( y­w)c              3  ó4   •K  — | ]  }‰|   ‰|   k(  –— Œ y ­wr~   rf   )rŒ   rO   r0   rL   s     €€r)   rŽ   z*run_fragility.<locals>.<genexpr>.<genexpr>½   s!   øè ø€ Ð2`ÑN_È°1°Q±4¸6À!¹9Õ3DÑN_ùrÔ   N)Úallrv   )rŒ   rL   rw   r0   s    @€€r)   rŽ   z run_fragility.<locals>.<genexpr>½   s%   ùè ø€ Ða¡8˜a¬sÔ2`Èf×N_ÒN_Ó2`Õ/`œ¡8ùs   „$0©0)zTotal P&L %zMax Drawdown %zCalmar Ratior>   zTotal Tradesgê-�™—q=g»½×Ùß|Û=)ÚrtolÚatolr/   g        )Ú	center_idr»   ÚdeltaÚgatesÚcenter_zdatetime64[ns]rW   Úint64Útime_nsr)  Ú_z.npzr=   r1   r2   r>   r   )r   r   c              3  óX   •K  — | ]!  }t        |d    «      ‰k(  sŒ|d   d   dkD  –— Œ# y­w)r*  r‚   rš   r   Nr–   ©rŒ   ÚxÚ	magnitudes     €r)   rŽ   z run_fragility.<locals>.<genexpr>Û   s6   øè ø€ ÐtÉGÀqÔWZÐ[\Ð]dÑ[eÓWfÐjsÓWs  $¡Ð(=Ñ >ÀÕ BÉGùs   ƒ*š*c              3  óR   •K  — | ]  }t        |d    «      ‰k(  sŒ|d   d   –— Œ  y­w)r*  r‚   rŸ   Nr–   r1  s     €r)   rŽ   z run_fragility.<locals>.<genexpr>Ü   s+   øè ø€ Ð f¹g¸ÌÈQÈwÉZËÐ\eÓIe  4¡¨Õ!4¹gùó   ƒ'š'c              3  óR   •K  — | ]  }t        |d    «      ‰k(  sŒ|d   d   –— Œ  y­w)r*  r‚   rš   Nr–   r1  s     €r)   rŽ   z run_fragility.<locals>.<genexpr>Ý   s1   øè ø€ Ð#tÉGÀqÔWZÐ[\Ð]dÑ[eÓWfÐjsÓWs A d¡GÐ,AÕ$BÉGùr5  )Úany_actionsÚany_materialÚmax_action_bars)r)  rM   r1   r2   rN   Úflagged_countr´   r?   zCompleted centers r   Ú/T)Úflushúresults.jsonzsensitivity.jsonzcenter_summary.jsonzproximity_events.jsonrf   )%r  r$   r§   rþ   rÿ   rR   rv   r*   r4   r|   rI   r¦   r@   ÚtestingÚassert_allcloser  r   r5   r€   rü   r    r[   ÚastyperÊ   rÄ   ÚDELTASr´   rQ   Úsavez_compressedr   Ústemr&   rª   ÚmaxÚprintrG   r  )(r  rÓ   rÜ   r  r  r  ÚsummaryÚmr2   r  r  rx   Úbaseliner/  ÚresultsÚcomparisonsÚcenter_summariesÚeventsÚnumberÚcenterr®   r¬   Úoriginalr8   r)  rÒ   ÚarraysÚeventÚchangesr»   r*  Úchanged_paramsr6   r{   r™   ÚtagÚir3  rw   r0   s(                                        `@@r)   Úrun_fragilityrV  ­   s  ú€ ÜCHÈÐQ\ÓC]Ñ@€FˆI�x ¨J¸Ü�j‰jœ) nÑ4×?Ñ?ÓAÓB€GÜ�Z‰ZœÐ%5Ñ5×@Ñ@ÓBÓCÐDÐbiÐjrÒbsÓGtÑbsÐ]^ÈÈ-ÓHXÐbsÑGtÑt€EØ$Ð%¸WÀXÒ=NÓ(OÑ=N¸¨¨7«Ð=NÑ(OÑO€JÜ˜X u¨f×.?Ñ.?Ó@€GÜˆvÐ-Ñ-¬t¸zÐSZÔ/[Ô\Ø€EØ#€IˆhÑÜ˜ ¨EÓ2�K€HˆaÜˆvÐ(Ñ(¨(Ô3Ø57¸¸RÀ°^Ñ2€Gˆ[Ð*¨FÜ# G×,‰ˆ�Ü�f˜XÑ&Ð/BÔCˆÜ ¨°Ó6‰ˆ�$äÔa¡8ÓaÓaˆÛdˆCÜ�J‰J×&Ñ& x°¡}°h¸s±mÈ%ÐV[Ð&Õ\ð eà˜4‘Lˆ	Ø�‰ )°tÀ2ˆÔFÜ*¨6°8¸XÓFˆ�ÑØ�‰�xÔ Ü;GÈÓ;M×;SÑ;SÔ;UÔVÑ;U©Z¨S°%�G˜C˜5�/ 5Ñ(Ð;UˆÑVØ ŸI™I×.Ñ.Ð5EÐ.ÓF×MÑMÈgÓVˆˆyÑÜ% d¨F°FÖ;ˆEØ�M‰Mœ$Ñ<¨Ð<°eÑ<Õ=ð <àˆß#˜ˆIß˜�Ü!% fÑ!W°¸FÀ9Ñ<MÐPUÑ<UÐ0VÑ!W�Ü# F¨N¸EÓB‘
��UØ—
‘
 Y¸)È5�
ÔQÜ-¨f°c¸8ÓD��G‘Ø—‘˜sÔ#Üð O i¸9ÈEñ OÜ)¨$°°xÀÀfÓMñO�à×"Ñ" 4Ô(Ø—‘˜tÔ$Ü#×)Ñ)¨)Ó4Ð5°Q´v·|±|ÀEÓ7JÐ6KÐL�Ø—‘Ä|ÐTYÓGZ×G`ÑG`ÔGbÔcÑGb¹¸¸e #  a¨ u˜~¨uÑ4ÐGbÒcÖdò  ð $ô 	×Ñ˜F¨	 {°$Ð%7Ñ7ÑB¸6ÒBØ×Ñ¤¨yÄÀVÐL^ÑE_Ó@`×@eÑ@eØ˜(Ñ#À6È'Â?Ó+SÁ?¸a¨J°q«MÀ?Ñ+SØ˜^Ñ,¨qÑ0ÀÈÑ@Xñ
 "+ô	,ñ "+�Iô	 ˜Y›¬ÜÓtÉGÓtÓtÜ Ó f¹gÓ fÓfÜ #Ó#tÉGÓ#tÓ tô*vñ vð "+ñ	,ô!-ô 	.ð �B‰;˜!ÔÜÐ& v¨a¡x j°´#°g³,°Ð@È×MðO -ôP ˆv˜Ñ&¨Ô0ÜˆvÐ*Ñ*¨KÔ8ÜˆvÐ-Ñ-Ð/?Ô@ÜˆvÐ/Ñ/°Ô8Ü
ˆ6�6˜8 Y°
¼CÀ»LÈ1Ñ<LÕMùòk HuùÚ(Oùó& Wùó" dùò ,Tùò,s%   Á2R/ÂR4ÇR9Ì<R?Î+SÏ	AS
c           
     óŒ  — |�5t        j                  |dz  j                  «       «      j                  d«      st	        d«      ‚t        | d«      \  }}}}}}d|d<   t        ||i «      \  }}	t        d«      |_        t        ||i «      \  }
}||
k(  sJ d«       ‚t        D ](  }t        j                  j                  |	|   ||   «       Œ* t        |d	¬
«      g}|	j                  | dz  d¬«       dD ]�  }t        |«      |_        t        |t        |d|› �¬«      i d|› �«      \  }}t        |||«      |d<   t!        |	||||«      |d<   |j#                  |«       |j                  | d|› d�z  d¬«       Œƒ t%        | dz  |«       t%        | dz  t        dt'        |dz  j)                  «       «      ¬«      «       t+        | ||||d«       y )Nz
audit.jsonÚpassedz*Verified fragility study must finish firstÚentry_gatesr   r!  r   zDisabled gate metrics differrH  )rl   zbaseline_bars.csvF)rQ   rß   Úhigher_low_r#  r+  r´   z	_bars.csvr=  zcontrol_verification.jsonT)Úactions_returns_metrics_equalÚprior_audit_sha256é   )r$   r§   rÿ   rŠ   rï   r  r|   rg   r   r   r@   r>  Úassert_array_equalr4   Úto_csvr   r´   r5   r*   r	   rý   r  )r  Úpriorrw   rÓ   rÜ   r  r  r/  Ú	canonicalr¬   ÚdisabledÚcontrolr8   rI  rd   r6   r{   s                    r)   Úrun_entry_gatesrd  è   sÖ  € Ø€}œDŸJ™J¨°Ñ(<×'GÑ'GÓ'IÓJ×NÑNÈxÔXÜÐEÓFÐFÜ<AÀ&È-Ó<XÑ9€FˆI�x ¨J¸Ø#€IˆhÑÜ˜V Y°Ó3�O€IˆtÜ*¨1›~€FÔÜ˜v y°"Ó5Ñ€HˆgØ˜Ò Ð@Ð"@Ó@Ð ßˆÜ
�
‰
×%Ñ% d¨3¡i°¸±Õ>ð ä�I jÔ1Ð2€GØ‡K�K�Ð,Ñ,°E€KÔ:ÛˆÜ#.¨uÓ#5ˆÔ Ü˜F¤D¨¸[ÈÈÐ;PÔ$QÐSUÐYdÐejÐdkÐWlÓm‰
ˆˆUÜ% f¨c°9Ó=ˆˆG‰Ü(¨¨u°iÀÀfÓMˆˆMÑØ�‰�sÔØ�‰�V ¨E¨7°)Ð<Ñ<ÀEˆÕJð ô ˆv˜Ñ&¨Ô0ÜˆvÐ3Ñ3´TÐX\Ü! 5¨<Ñ#7×"CÑ"CÓ"EÓFô6Hô Iä
ˆ6�6˜8 Y°
¸AÕ>r+   c                 ó¢  — t        j                  t        ¬«      } | j                  dddg¬«       | j                  ddt        ¬«       | j                  d	t        ¬
«       | j                  «       }|j                  dk(  r$t        |j                  j                  «       «       y t        |j                  j                  «       |j                  «       y )N)Údescriptionrá   r  zentry-gates)Úchoicesz--outputT)ÚrequiredÚtypez--prior-fragility)ri  )ÚargparseÚArgumentParserÚ__doc__Úadd_argumentr   Ú
parse_argsrá   rV  r  Úresolverd  Úprior_fragility)ÚparserÚargss     r)   Úmainrs    sŸ   € Ü×$Ñ$´Ô9€FØ
×Ñ˜¨+°}Ð)EÐÔFØ
×Ñ˜
¨T¼ÐÔ=Ø
×ÑÐ+´$ÐÔ7Ø×ÑÓ€DØ‡z�z�[Ò Ü�d—k‘k×)Ñ)Ó+Õ,ä˜Ÿ™×+Ñ+Ó-¨t×/CÑ/CÕDr+   Ú__main__)ra  ):rl  Ú
__future__r   rj  Údataclassesr   r$   Úpathlibr   rñ   ró   Únumpyr@   Úpandasr¡   Ú__file__ro  rÌ   rõ   r'   Úinsertr&   Ústrategies.mlp_accountingr   Ústrategies.mlp_comparisonr	   r
   r   Ústrategies.mlp_score_structurer   Ústrategies.strategy_mlp_scoresr   Ú#tools.run_mlp_entry_loss_experimentr   r   r   r   r   r   rþ   r  rÄ   rA  r  r   r*   rR   rg   r|   r€   r´   rÊ   r  r  rV  rd  rs  Ú__name__rf   r+   r)   Ú<module>r‚     sÿ   ðÙ NÝ "ã Ý Û Ý Û Û 
ã Û áˆHƒ~×ÑÓ×'Ñ'¨Ñ*€Ø ‡�‡��‘3�t“9Ô Ý 1ß IÑ IÝ DÝ <÷÷ ð ÐFÑF€	Ø4€ð?€
à	€ØÐ/Ð1LØ3Ð5XðZ€àH€
òXò#ò4ó
ò>òò(ò""NòJ+ò8Nòv?ò4	Eð ˆzÒÙ…Fð r+   