
    sLJj:                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ee
      j                         j                  d   Zedz  Zedz  Zed	z  Zdd
ZddZddZddZ	 d	 	 	 	 	 ddZddZddZedfddZddZedk(  r e        yy)zcSummarize the source-side runtime exit poll without treating failed save staging as route evidence.    )annotationsN)Path)Any   outz;runtime_selected_pointer_source_exit_branch_state_poll.jsonzJruntime_selected_pointer_source_exit_branch_state_load_confirmed_poll.jsonc                B    dj                  d | xs g D              xs dS )N,c              3  2   K   | ]  }t        |        y wN)str).0values     G/home/exedev/hwanse/tools/summarize_runtime_source_exit_poll_context.py	<genexpr>zlist_text.<locals>.<genexpr>   s     95CJ9s   -)join)valuess    r   	list_textr      s     889FLb99@S@    c                   | j                  d      xs g D cg c]B  }|j                  d      |j                  d      |j                  d      xs g D cg c].  }t        |t              r|j                  d      n
t        |      0 c}|j                  d      |j                  d      |j                  d      |j                  d	      |j                  d
      |j                  d      xs g |j                  d      xs g |j                  d      xs g |j                  d      xs g |j                  d      |j                  d      |j                  d      dE c}}S c c}w c c}}w )NrowsnamesampleCount	selectorsselectorcandidateTileoutsideTilecandidateSidecameraCandidateObservedcameraOutsideObservedactorCandidateSlotstrailCandidateSlotsactorOutsideSlotstrailOutsideSlotsrouteSelectorHitCountcurrentRootHitCountbranchStateAllZero)r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   )get
isinstancedictr   )analysisrowitems      r   candidate_rowsr.      sG   , <<'-2+ * ' GGFO77=1  GGK06B )34(>$CIM !WW_577=1 WW_5'*ww/H'I%(WW-D%E#&77+@#A#GR#&77+@#A#GR!$)<!=!C!$)<!=!C%(WW-D%E#&77+@#A"%''*>"?%	
 	s   =E*3E%	CE*%E*c                   |j                  d      xs i }|j                  d      xs |j                  d      xs g }|j                  d      xs g }|j                  d      xs g }|j                  d      xs d}||v }|j                  d      }t        |      }	i d| d	|d|d|d|d
|j                  d
      d|j                  d      d|dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |	      d|	S )NsourceExitAnalysisobservedPublicSaveSelectorsobservedSelectorspublicSaveSelectorssourceSaveSelector0:0classificationsourcesourceSaveObservedr   sequenceCountsourceExitRawClassificationcandidateObservedanyCandidateObservedoutsideObservedanyOutsideObservedactorOrTrailCandidateObserved anyActorOrTrailCandidateObservedactorOrTrailOutsideObservedanyActorOrTrailOutsideObservedanyReachedRouteSelectorContextanyReachedCurrentRootcandidateRowCountcandidateRows)r(   r.   boollen)
r7   source_pollr+   observed_publicobserved_selectorspublic_selectorssource_save_selectorsource_save_observedraw_classificationr   s
             r   
poll_briefrP   0   s   34:H!oo&CDyUrHsywyO$)<=C"'<=C#<<(<=F/?B!&67(#D&2 	& 	/	
 	/ 	{}5 	9 	&'9 	T(,,/E"FG 	4-A BC 	(hll;].^)_ 	&tHLL9Y,Z'[ 	)$x||<\/]*^ 	 hll3J&K!L 	SY  	! r   c                    t               }g }| D ]X  }t        |t        t        f      rt	        j
                  |d      n|}||v r7|j                  |       |j                  |       Z |S )NT)	sort_keys)setr)   r*   listjsondumpsaddappend)r   seenr   r   keys        r   unique_orderedr[   M   se    5D
C 3=edD\3Rdjj$/X]$;

5 Jr   c                   |xs i }t        d|       }t        d|      }|j                  d      r|n|}d}t        |j                  d      xs |j                  d            }t        |j                  d      xs |j                  d            }t        |j                  d      xs |j                  d            }t        |j                  d      xs |j                  d            }	t        |j                  d      xs |j                  d            }
t        |j                  d	      xs |j                  d	            }t        |j                  d
      xs |j                  d
            }|j                  d      }|j                  d      }|sd}d}d}n8|s|rd}d}d}n-|	s|
sd}d}|j                  d      rd}nd}n|xs |xs d}d}d}i d|j                  d      d|j                  d      xs | j                  d      d|j                  d      xs | j                  d      d|j                  d      xs | j                  d      d|d|dt        t	        |j                  d      xs g       t	        |j                  d      xs g       z         dt        t	        |j                  d      xs g       t	        |j                  d      xs g       z         d|j                  d      xs g d|j                  d      d |j                  d       d|d!|d"|d|	d|
d	|||||j                  d#      |j                  d$      xs g |||d%|xs ||d&S )'N6runtime_selected_pointer_source_exit_branch_state_pollEruntime_selected_pointer_source_exit_branch_state_load_confirmed_pollr8   r5   rC   rD   r;   r=   r?   rA   r:   zsource-save-not-observedblockeda  The source-side runtime poll staged a public selector 0:0 save, but the original input path did not observe selector 0:0 at runtime. The poll only observed non-route selector state, so its exit-path coordinate rows cannot prove a strict map1_01a source hotspot.zroute-observed	candidatez>A source-side runtime poll observed selector 2:0/current root.z+source-save-observed-candidate-not-observeda2  The raw source-exit poll and the load-confirmed prefix both observed public selector 0:0. Even with source-save observation, none of the four map1_01a exit candidate tiles, outside tiles, selector 2:0, or the current root were observed, so this remains source-load context rather than strict hotspot proof.a[  The original source-exit poll did not observe the staged source save, but the load-confirmed prefix did observe public selector 0:0. Even in that load-confirmed run, none of the four map1_01a exit candidate tiles, outside tiles, selector 2:0, or the current root were observed, so this remains source-load context rather than strict hotspot proof.z"source-save-observed-exit-nonroutezThe source-side runtime poll observed the staged source save, but it remains non-promoting unless selector 2:0/current root or a strict source hotspot is observed.r7   	sourceMap	targetMap
sourceSaver4   r1   r3   r2   r   r9   %sourceExitLoadConfirmedClassificationsourceExitRuntimeClassificationrE   rF   F)rA   rC   rD   rE   rF   rawSourcePollloadConfirmedExitPollpromotionStatusstrictSourceHotspotProofFoundroutePromotionEvidenceFound
conclusion)rP   r(   rG   r[   rT   )rI   load_confirmed_source_pollrawload_confirmed	preferredrM   rN   	route_hitcurrent_hitcandidate_observedoutside_observedactor_trail_candidateactor_trail_outsiderO   load_confirmed_classificationr6   promotion_statusrk   s                     r   build_summaryrx   Y   s    "<!Ar
M{
[CO"N #1"4"45I"JPSI (< = iASASThAijSWW=>v.BTBTUuBvwIsww67f>;M;MNe;fgKcgg&9:en>P>PQd>efCGG$56_.:L:LM^:_` /0gN4F4FGf4g -.c.2D2DEb2c !>?$2$6$67T$U!3$M 	
 
k)&U
(8F$77'(4 X  7t:LtPt$P 	")--)"/33K@`KOOT_D`" 	/33K@`KOOT_D`" 	044\BckooVbFc	"
 	2" 	2" 	&~67=2>>%%&CDJKL(
" 	~./526n>P>PQf>g>mkm9nn 
" 	Y]]+>?E2" 	y}}]3"  	7!"" 	&'9#"$ 	01N%"& 	*>'"( 	/)"* 	++", 	()>-". (;*3!,&]]+>?"7=2!/+).'0'?K C" "r   c                   ddd| j                  d       d| j                  d       dd| j                  d	       d
| j                  d       ddt        | j                  d             dt        | j                  d             ddt        | j                  d             dd| j                  d       d| j                  d       d| j                  d       dd| j                  d       dd| j                  d       dd| j                  d       d| j                  d       d | j                  d!       dd| j                  d"      xs ddd#dd$d%g}| j                  d&      xs i | j                  d'      xs i fD ]  }|j                  d(|j                  d)       d*|j                  d	       d+|j                  d       d+|j                  d       d,t        |j                  d             d-t        |j                  d             d*|j                  d.       d/|j                  d0       d+|j                  d       d/|j                  d       d1        |j                  g d2       | j                  d3      xs g D ]  }|j                  d4      xs i }|j                  d5      xs i }|j                  dj	                  g d(|j                  d6       d-|j                  d7       d8|j                  d9       d|j                  d7       d8|j                  d9       d:|j                  d;       d+|j                  d       d,t        |j                  d<             d*|j                  d=       d/|j                  d>       d,t        |j                  d?             d@t        |j                  dA             d-t        |j                  dB             d@t        |j                  dC             d*|j                  dD       d/|j                  dE       d+|j                  dF      rdGndH d1              dIj	                  |      dIz   S )JNz"# Runtime Source Exit Poll Context z
- route: `ra   z` -> `rb   `z!- source save selector observed: r8   z (`r4   z`)z%- public selectors staged/observed: `r3   z` / `r1   z- observed selectors: `r2   z- sample/sequence count: r   z / r9   z- classification: `re   z#- raw source-exit classification: `r:   z"- load-confirmed classification: `rd   z- route/current observed: rC   rD   z- promotion status: `rh   rk   z## Poll Coveragezr| poll | source observed | samples | sequences | selectors | public observed | candidate/outside | route/current |z3| --- | --- | ---: | ---: | --- | --- | --- | --- |rf   rg   z| `r7   z` | z | z | `z` | `r;   /r=   z |)rz   z| sequence | candidate | samples | selectors | camera cand/out | actor cand/out | trail cand/out | route/current | branch state |z8| --- | --- | ---: | --- | --- | --- | --- | --- | --- |rF   r   r   r   xr	   yz` r   r   r   r    r!   z`/`r#   r"   r$   r%   r&   r'   zall-zeromixed
)r(   r   rX   extendr   )summarylinesr,   r`   outsides        r   markdownr      s}   ,

W[[-.fW[[5M4NaP
+GKK8L,M+NcRYR]R]^rRsQttvw
/	'++F[:\0]/^^cdmnunyny  {X  oY  eZ  d[  [\  	]
!)GKK8K,L"M!NaP
#GKK$>#?s7;;C_B`a
gkk*KLMQO
-gkk:W.X-YYZ[
,W[[9`-a,bbcd
$W[[1Q%R$SSVW^WbWbczW{V|}
,= >?qA
L!'R

|='E* O,2GKK@W4X4^\^_ 
#''(#$D1E)F(Gs377S`KaJbbeww'(Ysww?R7S-T,U V#''"?@AB$ww*+,Acgg6G.H-Iww789377CZ;[:\\^	`	

 
LL  
 {{?+1r 
GGO,2	''-(.BL Lc L#''&/" L% L	c(:'; L1 LY]]3=O<P L Q LC !L!"L#*;;s#3"4L46L7:ww7O6PLPSLww}%&L&*L+4SWW[5I+J*KLKOL ww012L 34L 58GG<S4T3ULVL #''"789:	L ;>	L ?HPcHd>e=f	Lg	L
 #''"789:L
 ;>L
 ?HPcHd>e=fL
 gkL ww./0L 12L 36'':O2P1QL RUL !WW%9:zHL IKL		

 99Ud""r   c                F    dt        j                  t        |              dS )Na  <!doctype html><meta charset="utf-8"><title>Runtime Source Exit Poll Context</title><style>body{font-family:sans-serif;line-height:1.4}table{border-collapse:collapse}td,th{border:1px solid #ccc;padding:4px 6px}code{background:#f3f3f3;padding:1px 3px}</style><pre>z</pre>)htmlescaper   )r   s    r   	html_pager      s)    	 HW-./v	7r   c                    |dz  j                  t        j                  | dd      d       |:|j                  j	                  dd       |j                  t        |       d       y y )	N%runtime_source_exit_poll_context.jsonF)r	   :)ensure_ascii
separatorsutf-8encodingTparentsexist_ok)
write_textrU   rV   parentmkdirr   )r   out_dirhtml_outs      r   write_outputsr      sk    66BB

7:F C  dT:Ig.A r   c                    t        j                         } | j                  dt               | j                  ddd       | j	                         }t
        dz  }t        j                         s|j                         r|j                  st        j                  |j                  d	            }|j                  M|j                  j                  j                  d
d
       |j                  j                  t!        |      d	       t#        d|        y t        j                         r)t        j                  t        j                  d	            ni }t$        j                         r)t        j                  t$        j                  d	            ni }t'        ||      }t)        |t
        |j                         t#        dt
        dz          y )Nz
--html-out)typez--allow-missing-source-poll
store_truezRebuild even when the large raw source poll is absent. By default, an existing compact summary is preserved so raw-poll evidence is not accidentally overwritten with an empty source summary.)actionhelpr   r   r   Tr   z6retained existing runtime source exit poll context -> )r   z*wrote runtime source exit poll context -> )argparseArgumentParseradd_argumentr   
parse_argsOUTSOURCE_POLLexistsallow_missing_source_pollrU   loads	read_textr   r   r   r   r   printLOAD_CONFIRMED_SOURCE_POLLrx   r   )parserargssummary_pathr   rI   rl   s         r   mainr     s   $$&F
40
%E	   D@@LL$7$7$9$B`B`**\33W3EF==$MM  &&td&CMM$$Yw%7'$JF|nUVITI[I[I]$**[22G2DEceK &,,. 	

-777IJ 
 K)CDG'37	6s=d7d6e
fgr   __main__)r   zlist[Any] | Nonereturnr   )r+   dict[str, Any]r   zlist[dict[str, Any]])r7   r   rI   r   r   r   )r   	list[Any]r   r   r   )rI   r   rl   zdict[str, Any] | Noner   r   )r   r   r   r   )r   r   r   r   r   zPath | Noner   None)r   r   )__doc__
__future__r   r   r   rU   pathlibr   typingr   __file__resolver   ROOTr   r   r   r   r.   rP   r[   rx   r   r   r   r   __name__ r   r   <module>r      s    i "      H~''*
UlQQ #oo A4:	 9=__ 5_ _D0#f <?X\ Bh@ zF r   