
    UHjB                    0   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dZd	Zd
ZdZddZddZddZddZddZddZ	 d	 	 	 	 	 	 	 	 	 	 	 ddZddZddZd dZd!dZedk(  r e        yy)"zESummarize strict event source coverage for the current route blocker.    )annotationsN)Path)Any   outmap1_01amap2_02dmap1_02bc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     C/home/exedev/hwanse/tools/summarize_strict_event_source_coverage.py	load_jsonr      s*    ;;=::dnngn677    c                    | j                         si S | j                  d      }d}|j                  |      si S t        j                  |t        |      d  j                  d            S )Nr   r   zwindow.HWANSE_MAPS = z;
)r   r   
startswithr   r   lenrstrip)r   textprefixs      r   	load_mapsr      s[    ;;=	>>7>+D$F??6"	::d3v;<(//677r   c                ~    t               }g }| D ]+  }|r||v r
|j                  |       |j                  |       - |S N)setappendadd)valuesseenresultvalues       r   uniquer(   $   sG    5DF e	
 Mr   c                h   g }| D ]  }|j                  d      }|st        |j                  d      xs g       D ]s  }|j                  |||j                  d      |j                  d      |j                  d      |j                  d      t        |j                  d      xs g       d       u  |S )	NmaptargetsrecordVaHex
sceneIdHex	eventKindrawPointCountactivePoints)sourcetargetr,   r-   r.   r/   activePointCount)getr(   r"   r   )event_transitionsrowseventr1   r2   s        r   event_pairsr8   /   s    D" 5!UYYy17R8 		FKK  $yy7#ii5"YY{3!&?!;$'		.(A(GR$H 			 Kr   c                :   i }| j                         D ]  }|j                  d      }|j                  d      }|r|s*|j                  ||fdddd      }|j                  d      }|dk(  r|dxx   dz  cc<   f|dk(  r|dxx   dz  cc<   y|d	xx   dz  cc<    |S )
Nr1   r2   r   )	confirmedrejectedotherstater:   r   r;   r<   )r$   r4   
setdefault)transition_reviewscountsreviewr1   r2   rowr=   s          r   transition_review_countsrC   B   s    *,F$++- H%H%V 0q[\2]^

7#K!j 
Oq OLAL Mr   c                ~   g }| j                  d      xs g D ]!  }|j                  d      sg }||j                  d      xs g v r|j                  d       ||j                  d      xs g v r|j                  d       ||j                  d      xs g v r|j                  d       |s|j                  |j                  d	      |j                  d
      |j                  d      ||j                  d      xs g |j                  d      xs g |j                  d      xs g |j                  d      d       $ |S )NclusterseventRecordCounteventSourcesevent-sourceeventFieldLinksevent-target-linkmanifestMapsmanifest-recordclusterStartHexclusterEndHexclassification)rM   rN   rO   rolesrK   rG   rI   rF   )r4   r"   )field_rootsmap_namer6   clusterrP   s        r   strict_cluster_rolesrT   T   s*   D??:.4" {{-.N39r:LL($56<"=LL,-N39r:LL*+&{{+<=$[[9%kk*:;#KK7=2#KK7=2&{{+<=C ',> ?	
 		, Kr   c                   |xs i }t        |      }t        |      t        |D cg c]%  }|j                  d      s|j                  d      ' c}      }t        |D cg c]  }|d   	 c}      }	i }
|D ]&  }|
j	                  |d   g       j                  |       ( g }t        |      D ]  t        |
j                  g       D cg c]  }|d   	 c}      }t        fd|D              }t        fd|D              }|j                  t        fd|D              t        |      |||d        |D cg c]  }|d   t        k(  s|d   t        k(  s|  }}|D cg c]  }|j                  d      t        k(  s| }}|D cg c]  }|d   t        k(  s| }}|D cg c]  }|d   t        k(  s|d   t        k(  s|  }}t        |t              }t        |t              }|j                  d      xs g }|D cg c]	  }||vs| }}t        |       xs |j                  d	      xs d
}t        t        t        |v t        |	v t        |      t        |      t        |      t        |      t        d |D              t        d |D              t        d |D              t        |      dd}t        t        t        |      j                  t        t        f      xs i j                  dd
      j                  t        t        f      xs i j                  dd
      |d}i ddddd|dt        |      dt        |      dt        |	      dt        |      d|rt        t        |      |z  dz  d      nd
d|d |	d!|d"|d#|d$|d%|d|d&|d'dd(d)S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )*Nr*   r2   r1   c              3  l   K   | ]+  }j                  |f      xs i j                  d d       - yw)r:   r   Nr4   .0r2   review_countsr1   s     r   	<genexpr>z build_summary.<locals>.<genexpr>   s5     n\b**FF+;<BGGUVWn   14c              3  l   K   | ]+  }j                  |f      xs i j                  d d       - yw)r;   r   NrW   rX   s     r   r[   z build_summary.<locals>.<genexpr>   s5     lZ`))66*:;ArFFzSTUlr\   c              3  L   K   | ]  }|j                  d       k(  sd  yw)r*   r   NrW   )rY   rB   r1   s     r   r[   z build_summary.<locals>.<genexpr>   s!     #_#cggenX^F^A#_s   $$)r1   rF   targetCountr+   confirmedReviewCountrejectedReviewCountreachableFromStartmapCountr   c              3  0   K   | ]  }d |d   v sd  yw)rH   rP   r   N rY   rB   s     r   r[   z build_summary.<locals>.<genexpr>   s     4q3R`dghodpRpQ4q   c              3  0   K   | ]  }d |d   v sd  yw)rJ   rP   r   Nre   rf   s     r   r[   z build_summary.<locals>.<genexpr>   s     4v3ReilmtiuRuQ4vrg   c              3  0   K   | ]  }d |d   v sd  yw)rL   rP   r   Nre   rf   s     r   r[   z build_summary.<locals>.<genexpr>   s     1qO`dghodpOp!1qrg   blocked)r1   r2   sourceIsStrictEventSourcetargetIsStrictEventTargetsourceStrictEventCounttargetStrictIncomingCountdirectStrictPairCountsourceStrictClusterRoleCount%sourceAsEventSourceStrictClusterCount%sourceAsEventTargetStrictClusterCount"sourceAsManifestStrictClusterCounttargetStrictClusterRoleCountpromotionStatusr:   r;   )r1   r2   ro   r`   ra   eventRecordstitlezStrict Event Source CoveragescopezGglobal source-map coverage of extracted strict event transition recordsfieldMapCountstrictEventRecordCountstrictEventSourceMapCountstrictEventTargetMapCountstrictEventPairCount strictEventSourceCoveragePercentd      strictEventSourcesstrictEventTargets
sourceRowsrouteStatussourceStrictClusterRolestargetStrictClusterRolesconfirmedReferencereachableStrictSourceUncoveredFa  Extracted strict event transitions cover a small set of source maps. map1_01a is not a strict event source; its strict cluster role is incoming/manifest context from map1_02b -> map1_01a, while map2_02d is not an extracted strict event target. Therefore map1_01a -> map2_02d still needs a strict source hotspot, captured selector 2:0 save, or runtime selected-pointer trace before promotion.)promotionAllowedru   
conclusion)r8   rC   r(   r4   r>   r"   sortedsumr   SOURCETARGETCONFIRMED_SOURCECONFIRMED_TARGETrT   round)mapsr5   r?   rQ   playable_progresspairsrB   source_mapspairtarget_mapspairs_by_sourcesource_rowsr+   r:   r;   direct_pairssource_eventstarget_incomingconfirmed_pairssource_rolestarget_roles	reachablenamereachable_uncoveredfield_map_countroute_statusconfirmed_referencerZ   r1   s                              @@r   build_summaryr   o   sX    */R)*E,-?@M4EXSQV#''%.XYKU;T$x.;<K-/O D""4>26==dCDK% _5H5HQS5TUT$x.UVnfmnn	ldkll ##_1B#_ _w<$-#+
 		 &+dTd8n.F4PX>]cKcDdLd$5RS69QSRMR(-Jh61ItJOJ(-{hCS1SX\]eXfjzXzt{O{'V<L'V<L!%%&:;ArI,5QD[9P4QQ$iI#4#8#8#DIO%+{%:%+{%:"%m"4%(%9!$\!2(+L(9144q,4q1q144v,4v1v.11q|1q.q(+L(9$L  #"!$_!5!.!2!24DFV3W!X!^\^ c cdoqr s - 1 13CEU2V W ][]bbcmopq'/Z 	 	!#&7"8	
 	$S%5 	$S%5 	E
 	+dsE3{3Co3UY\2\^_,`yz 	k 	k 	k 	| 	#L 	#L 	1  	i!" 	)*=#$ "$B+ e Y; V eRJ{ Rs^   N/N/"N4N9
N>N> N>*OOO$O.O OO	OOc                   | d   }| d   }ddd| j                  d       d| j                  d       d	| j                  d
       d| j                  d       dd| j                  d       d|j                  d       d|j                  d       dd|j                  d       d|j                  d       d|j                  d       d|j                  d       d|j                  d       d|j                  d        d!| j                  d"       d#| j                  d$       dd| j                  d%      xs ddd&dd|j                  d       d|j                  d       dd'|j                  d       d(|j                  d)       d*|j                  d+       dd,dd-d.g}| j                  d/      xs g D ]  }|j                  d0|j                  d       d1|j                  d2       d3|j                  d4       d3|j                  d)       d3|j                  d+       d3d5j                  |j                  d6      xs g       xs d7 d8        |j                  g d9       | j                  d:      xs g D ]  }|j                  d0|j                  d;       d<|j                  d=       d1d5j                  |j                  d>      xs g       xs d7 d3d5j                  |j                  d?      xs g       xs d7 d3d5j                  |j                  d@      xs g       xs d7 d3d5j                  |j                  dA      xs g       xs d7 d8        | j                  d:      s|j                  dB       |j                  ddCddDd5j                  | j                  dE      xs g       xs d7 dFd5j                  | j                  dG      xs g       xs d7 dg       dHj                  |      S )INr   r   z# Strict Event Source Coverage z- field maps: ry   z- strict event records: rz   z- strict event source maps: r{    (r~   z%)z- strict event pairs: r}   z
- route: `r1   z -> r2   `z"- route direct strict pair count: ro   z#- route source strict event count: rm   z&- route target strict incoming count: rn   z*- route source as strict source clusters: rq   z/- route source as strict target-link clusters: rr   z,- route source as manifest strict clusters: rs   z- promotion: `ru   z` / allowed `r   r   z## Confirmed Referencez- direct strict pair count: z- confirmed review count: r`   z- rejected review count: ra   z## Strict Source MapszR| source | events | targets | confirmed reviews | rejected reviews | target maps |z)| --- | ---: | ---: | ---: | ---: | --- |r   z| `z` | rF   z | r_   , r+   -z |)r   z%## Current Route Strict Cluster Rolesr   z=| cluster | roles | manifests | event sources | event links |z| --- | --- | --- | --- | --- |r   rM   ..rN   rP   rK   rG   rI   z| - | - | - | - | - |z## Reachable Source Coveragez- reachable from start: rb   z7- reachable maps without strict event source coverage: r   
)r4   r"   joinextend)summaryrouter:   linesrB   s        r   markdownr      sY   M"E,-I(

_567
"7;;/G#H"IJ
&w{{3N'O&PPRSZS^S^  `B  TC  SD  DF  	G
 -C!D EF
UYYx()eii.A-B!D
,UYY7N-O,PQ
-eii8P.Q-RS
0;V1W0XY
4UYY?f5g4hi
9%))Dk:l9mn
6uyyAe7f6gh
%678gkkRdFeEffgh
L!'R
 

Y]]8,-T)--2I1J!L
&y}}5L'M&NO
$Y]]3I%J$KL
#IMM2G$H#IJ

\39E< {{<(.B 
#''(#$D1C)D(ESQ^I_H``cww-./s377;P3Q2RRUyy+1r29c:">	

 
LL   {{56<" 
#''+,-R0H/Iyy)/R07C8yy06B7>3?syy06B7>3?syy!239r:AcB"	F	

 ;;12,-	LL
&

"499W[[9M-N-TRT#U#\Y\"]^
A$))GKKXxLyL}  CA  CH  EH  BI  	J
  99Ur   c                   dIddj                  fd| j                  d      xs g D              }dj                  fd| j                  d      xs g D              xs d}| j                  d      xs i }| j                  d	      xs i }dj                  g d
dddd | j                  d             dd | j                  d             dd | j                  d             d | j                  d             dd | j                  d             dd |j                  d             d |j                  d             dd |j                  d              dd! |j                  d"             dd# |j                  d$             dd% |j                  d&             dd' |j                  d(             dd) |j                  d*             dd+ | j                  d,             d- | j                  d.             dd/d0 | j                  d1      xs d2       d3d4d5 |j                  d             d |j                  d             d6 |j                  d              d7 |j                  d8             d9 |j                  d:             d;d<d=|d>d?d@|d>dAdB dCj                  | j                  dD      xs g       xs dE       dFdG dCj                  | j                  dH      xs g       xs dE       dF      S )JNc                >    t        j                  t        |             S r    )htmlescapestr)r'   s    r   esczhtml_page.<locals>.esc  s    {{3u:&&r   r   c              3  r  K   | ]  }d  |j                  d             d |j                  d             d |j                  d             d |j                  d             d |j                  d             d dj                  |j                  d	      xs g       xs d
       d  yw)<tr><td><code>r1   </code></td><td>rF   	</td><td>r_   r`   ra   r   r+   r   
</td></tr>Nr4   r   rY   rB   r   s     r   r[   zhtml_page.<locals>.<genexpr>  s      
 	*+, -377-./0 1377=)*+ ,3771234 53770123 4499SWWY/526=#>? @	
s   B4B7r   c              3    K   | ]  }d  |j                  d             d |j                  d             d dj                  |j                  d      xs g       xs d       d dj                  |j                  d	      xs g       xs d       d dj                  |j                  d
      xs g       xs d       d dj                  |j                  d      xs g       xs d       d  yw)r   rM   r   rN   r   r   rP   r   r   rK   rG   rI   r   Nr   r   s     r   r[   zhtml_page.<locals>.<genexpr>  s     	 	!2345RCGGO<T8U7V W499SWWW-34;<= >499SWW^4:;BsCD E499SWW^4:;BsCD E499SWW%67=2>E#FG H		s   C9C<r   z;<tr><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td></tr>r   r   zP<!doctype html><meta charset="utf-8"><title>Strict Event Source Coverage</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1100px;margin:24px auto}table{border-collapse:collapse;width:100%}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z%<h1>Strict Event Source Coverage</h1>z<ul>z<li>field maps: ry   z</li>z<li>strict event records: rz   z<li>strict event source maps: r{   r   r~   z%)</li>z<li>strict event pairs: r}   z<li>route: <code>r1   z -&gt; r2   z</code></li>z$<li>route direct strict pair count: ro   z%<li>route source strict event count: rm   z(<li>route target strict incoming count: rn   z,<li>route source as strict source clusters: rq   z1<li>route source as strict target-link clusters: rr   z.<li>route source as manifest strict clusters: rs   z<li>promotion: <code>ru   z</code>; allowed r   z</ul>z<p>r   r   z</p>z<h2>Confirmed Reference</h2>z	<p><code>z</code>; direct strict pairs z; confirmed reviews r`   z; rejected reviews ra   z.</p>z<h2>Strict Source Maps</h2>z<table><thead><tr><th>source</th><th>events</th><th>targets</th><th>confirmed reviews</th><th>rejected reviews</th><th>target maps</th></tr></thead><tbody>z</tbody></table>z+<h2>Current Route Strict Cluster Roles</h2>z<table><thead><tr><th>cluster</th><th>roles</th><th>manifests</th><th>event sources</th><th>event links</th></tr></thead><tbody>z"<h2>Reachable Source Coverage</h2>z<p>Reachable from start: <code>r   rb   r   z</code></p>z><p>Reachable maps without strict event source coverage: <code>r   )r'   r   returnr   )r   r4   )r   r   	role_rowsr   r:   r   s        @r   	html_pager     s   ' )) 
 ;;|,2
 
K 		 	 ;;9:@b	 	 	G 
G  KK&,"E017RI99 #\# 	y# 	0# 		#
 3w{{?;<=UC# %S5M)N%O$PPUV# )W[[9T-U)V(WWYZ]^e^i^i  kM  _N  [O  ZP  PW  	X# #3w{{3I'J#K"LER# C		( 345WS8AT=U<VVbc# /s599=T3U/V.WW\]# 0EII>V4W0X/YY^_# 33uyyA\7]3^2__de# 7s599El;m7n6ootu# <C		Jq@r<s;ttyz# 9UYYGk=l9m8nnst#   GKK0A$B CDDUVYZaZeZefxZyVzU{  |A  	B!#" 	##$ c'++l+1r2348%#& 	''#( C	h/01Y]]8=T9U8V W"9==1H#IJK L /E!FGH I	.C DEFe	M)#0 	&1#2 	f3#4 	5#6 	7#8 	69#: 	K;#< 	=#> 	?#@ 	-A#B *#diiDX8Y8_]_.`.gdg*h)iituC#D ITYYW^WbWb  dD  XE  XK  IK  NL  NS  PS  JT  IU  U`  	aE# # #r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okz!strict_event_source_coverage.jsonFr   )ensure_asciiindentr   r   r   !strict_event_source_coverage.html)mkdir
write_textr   dumpsr   )r   out_dirs     r   write_outputsr   M  sd    MM$M.22>>

7q9D@ ?  22>>y?Q\c>dr   c            
        t        j                  t              } | j                  dt        t
               | j                         }t        t        |j                  dz        t        |j                  dz  g       t        |j                  dz  i       t        |j                  dz  i       t        |j                  dz  i             }t        ||j                         t        d	|j                  d
z          y )N)descriptionz	--out-dir)typedefaultzmaps.jszevent_transitions.jsonztransition_reviews.jsonzfield_map_record_roots.jsonzplayable_progress.jsonz&wrote strict event source coverage -> r   )argparseArgumentParser__doc__add_argumentr   OUT
parse_argsr   r   r   r   r   print)parserargsr   s      r   mainr   V  s    $$9F
$<D$,,*+$,,!992>$,,!::B?$,,!>>C$,,!992>G '4<<(	24<<Be3e2f
ghr   __main__)r   r   r   r   r   r   )r   r   r   dict)r$   	list[str]r   r   )r5   
list[dict]r   r   )r?   r   r   zdict[tuple[str, str], dict])rQ   r   rR   r   r   r   r    )r   r   r5   r   r?   r   rQ   r   r   zdict | Noner   r   )r   r   r   r   )r   r   r   r   r   None)r   r   )r   
__future__r   r   r   r   pathlibr   typingr   __file__resolver   ROOTr   r   r   r   r   r   r   r(   r8   rC   rT   r   r   r   r   r   __name__re   r   r   <module>r      s    K "      H~''*
Ul		  88&$@ &*W
W!W W 	W
 #W 
Wt@F>Bei zF r   