
    UHjg@                    6   d Z ddlmZ ddlZddlZddlZddlmZ  ee      j                         j                  d   Zedz  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ZddZd dZd!dZ	 	 	 	 	 	 	 	 	 	 d"dZd#dZd#dZd$dZd%dZedk(  r e        yy)&zISummarize map1_01a scene records and their source/target cluster context.    )annotationsN)Path   outmap1_01amap2_02dc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     L/home/exedev/hwanse/tools/summarize_map1_01a_scene_record_cluster_context.py	load_jsonr      s*    ;;=::dnngn677    c                R    | sy | j                  d       d| j                  d       S )NclusterStartHexz..clusterEndHexgetclusters    r   cluster_ranger      s.    kk+,-RO0L/MNNr   c                >    t        | j                  d      xs g       S )NmanifestMaps)listr   r   s    r   cluster_mapsr!      s    N+1r22r   c                    |t        |       v S )N)r!   )r   map_names     r   contains_mapr$   !   s    |G,,,r   c                ,    | j                  dd      dkD  S )NeventRecordCountr   r   r   s    r   	is_strictr'   %   s    ;;)1-11r   c                Z    | j                  dd      dk(  xr | j                  dd      dkD  S )Nr&   r   saveSelectorRefCountr   r   s    r   is_selector_onlyr*   )   s1    ;;)1-2aw{{CY[\7]`a7aar   c                    | j                  d      xs g D ]6  }|j                  d      xs g D ]  }|j                  d      |k(  s|c c S  8 y )NclustersmanifestRecordsrecordVaHexr   )field_map_rootsrecord_va_hexr   records       r   cluster_for_recordr2   -   sZ    "&&z28b kk"34: 	Fzz-(M9	 r   c                   | sy t        |       | j                  d      t        |       | j                  d      xs g | j                  d      xs g | j                  dd      | j                  dd      | j                  dd      t        | t              t        | t
              t        | j                  d      xs g v t        | j                  d      xs g v t
        | j                  d      xs g v t        |       t        |       dS )	NclassificationeventSourceseventFieldLinksr&   r   r)   currentFrontierPairCount)clusterRangeHexr4   r   r5   r6   r&   r)   r7   containsSourcecontainsTargetsourceOutgoingStrictsourceIncomingStricttargetLinkedStrictselectorOnlystrict)r   r   r!   r$   SOURCETARGETr*   r'   r   s    r   compact_clusterrB   5   s    (1!++&67$W-N39r";;'89?R#KK(:A> ',BA F$+KK0JA$N&w7&w7 &7;;~+F+L" M &7;;7H+I+OR P$5F)G)M2N(1G$ r   c                   |syt        |      rTt        |j                  d      xs g v rt        |j                  d      xs g vryt        |j                  d      xs g v ryy|j                  dd      ry	t        |      ry
y)Nzunlinked manifest scene recordr6   r5   zincoming strict entry contextzoutgoing strict source contextzstrict event-linked contextr7   r   z)current frontier selector-only scene listzselector-only scene listzmanifest-only context)r'   r@   r   r*   )r1   r   s     r   role_for_recordrD   K   s}    /gkk"34:;w{{[iOjOpnp@q2gkk.17R83,{{-q1: )"r   c                   | j                  d      }t        ||      }t        |      }i d|d| j                  d      d| j                  d      d| j                  d      d| j                  d      d| j                  d      xs g d| j                  d      xs g d| j                  d      d	|xs i j                  d	      d
|xs i j                  d
      xs ddt        | |      dt	        |xr t        |            d|xs i j                  dd      d|xs i j                  dd      d|xs i j                  d      xs g d|xs i j                  d      xs g S )Nr.   mapStringVaHex
sceneIdHex
sceneGroup	sceneSlottilesetsspritesnextMapRefVaHexr8   r4   zunlinked manifest recordrolehasStrictEventRecordr)   r   r7   r5   r6   )r   r2   rB   rD   boolr'   )r1   r/   r0   r   compacts        r   compact_scene_recordrQ   [   s   JJ}-M -@Gg&G}&**%56 	fjj. 	fjj.	
 	VZZ, 	FJJz*0b 	6::i(.B 	6::&78 	GMr../@A 	7=b--.>?]C] 	0 	W%C71C D 	B 3 34JA N 	#W]$7$78RTU$V 	B++N;Ar  	GMr../@AGR! r   c                   | j                  d      xs g }|j                  d      xs g D cg c]&  }|j                  d      t        k(  rt        ||       ( }}|j                  dd      }|j                  dd      }|D 	cg c])  }	t        |	t              r|	j                  dd      dkD  r|	+ }
}	|j                  d      xs g }|D 	cg c]$  }	t        |	t              rt        |	t              r|	& }}	|D 	cg c]  }	t        |	      s|	 }}	|D 	cg c]  }	t        |	      s|	 }}	|j                  d	      xs i }|j                  d
      xs i }|j                  d      xs i }i dt        dt        dt        |      d|dt        d |D              dt        d |D              d|d|dt        |
      d|j                  dd      d|j                  dd      d|dt        |      dt        |      dt        |      d|D 	cg c]  }	t        |	       c}	d|j                  d      |j                  d      |j                  d d      |j                  d      |j                  d!      |j                  d"      |j                  d#d      |j                  d$d      |j                  dd      |j                  d%      d&d'd(}|S c c}w c c}	w c c}	w c c}	w c c}	w c c}	w ))Nr,   sceneManifestRowsmap$sourceIncomingOnlyStrictClusterCountr    sourceOutgoingStrictClusterCountr7   targetSelectorOnlyClusterscurrentFrontierClusterconfirmedPatternfrontierPatternsourcetargetsourceSceneRecordCountsourceSceneRecordssourceSceneRecordClusteredCountc              3  D   K   | ]  }|j                  d       sd  ywr8   r   Nr   .0rows     r   	<genexpr>z build_summary.<locals>.<genexpr>   s     .oSTWT[T[\mTnq.o     sourceSceneRecordUnlinkedCountc              3  D   K   | ]  }|j                  d       rd  ywra   r   rb   s     r   re   z build_summary.<locals>.<genexpr>   s     -rCWZW^W^_pWqa-rrf    sourceStrictIncomingClusterCount sourceStrictOutgoingClusterCount!sourceCurrentFrontierClusterCounttargetStrictClusterCounttargetSelectorOnlyClusterCountsourceTargetSharedClusterCount$sourceTargetSharedStrictClusterCount*sourceTargetSharedSelectorOnlyClusterCountsourceTargetSharedClustersconfirmedEntryClusterHexr8   eventRecordHexeventPointCountnearestSourceRecordAfterBranchnearestTargetRecordAfterBranchr&   r)   strictTargetLinkFoundblockeda  map1_01a has three scene records in the manifest scan: one unlinked resource record, one incoming strict entry cluster from map1_02b, and one current selector-only frontier cluster shared with map2_02d. The only source/target shared cluster is selector-only, while the strict cluster is incoming-only and map2_02d has no strict target cluster. This keeps map1_01a -> map2_02d blocked until a strict source hotspot, runtime trace, or equivalent control-flow proof is found.)confirmedEntryEventRecordHexconfirmedEntryPointCountcurrentFrontierClusterHexcurrentFrontierSourceRecordHexcurrentFrontierTargetRecordHexcurrentFrontierEventRecordCount#currentFrontierSaveSelectorRefCountcurrentFrontierRoutePairCountrw   promotionStatus
conclusion)
r   r@   rQ   r$   rA   r'   r*   lensumrB   )r/   hotspot_gapstrict_target_link_gaprecord_pattern_contrastr,   r1   source_scene_recordssource_strict_incoming_countsource_strict_outgoing_countr    source_current_frontier_clusterstarget_selector_only_clusterssource_target_shared_clusters$source_target_shared_strict_clusters+source_target_shared_selector_only_clusterscurrent_frontier	confirmedfrontiersummarys                      r   build_summaryr   s   s    "":.4"H "oo&9:@b::e& 	V_5 
 $:#=#=>dfg#h #9#=#=>`bc#d '((W[[9SUV-WZ[-[ 	($ ( %;$>$>?[$\$b`b!'%(\'6-J 	%! % Da+wdmnudvG+w(+w<3@PQX@Y3/ 3 .112JKQr'++,>?E2I&**+<=CH#&#&# 	!#&:";# 	2	#
 	*3.o<P.o+o# 	)#-r;O-r*r# 	+,H# 	+,H# 	,S1Q-R# 	#$:$>$>?Y[\$]# 	)*@*D*DEegh*i# 	%&C# 	)#.K*L# 	/4X0Y# 	5c:e6f#  	%Ol&mGw'?&m!#" 	#IMM2C$D##$ )26F(G$-MM2CQ$G%5%9%9:K%L*2,,7W*X*2,,7W*X+;+?+?@RTU+V/?/C/CDZ\]/^)9)=)=>XZ[)\!7!;!;<S!T$g;#GH Nw(
% ,x3, 'ns/   +K.K)K :K%K%K*&K*K/c                   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| d    d | d!    d"| d#    d$| d%    dd| d&   dd'dd(d)g}| d*   D ]w  }|j                  d+|d,    d-|j                  d.      xs d/ d0|d1    d2|d3    d2|d4    d2|d5    d6|j                  d7      xs d/ d0d8j                  |d9         xs d/ d:       y |j                  g d;       | d<   D ]G  }|j                  d+|d.    d0|d1    d2|d=    d2|d5    d2|d>    d2d8j                  |d?          d:       I |j                  g d@       | dA   D ],  }|j                  d+|d.    d0|d1    d2|d5    d2|dB    d:	       . |j                  d       dCj                  |      S )DNz'# map1_01a Scene Record Cluster Context z- route under test: `r[   z -> r\   `z- source scene records: r]   z- clustered source records: r_   z- unlinked source records: rg   z#- source incoming strict clusters: ri   z#- source outgoing strict clusters: rj   z- target strict clusters: rl   z!- target selector-only clusters: rm   z!- source/target shared clusters: rn   z(- source/target shared strict clusters: ro   z/- source/target shared selector-only clusters: rp   z- current frontier cluster: `r{   z"- current frontier event records: r~   z"- current frontier selector refs: r   z- strict target link found: rw   z- promotion status: `r   r   z## Source Scene Recordsz]| record | cluster | class | role | strict events | selector refs | next map ref | tilesets |z3| --- | --- | --- | --- | ---: | ---: | --- | --- |r^   z| `r.   z` | `r8   -z` | r4   z | rM   rN   r)   z | `rL   , rJ   z |)r   z ## Source/Target Shared Clustersr   zF| cluster | class | events | selector refs | current frontier | maps |z(| --- | --- | ---: | ---: | ---: | --- |rq   r&   r7   r   )r   z ## Target Selector-Only Clustersr   z6| cluster | class | selector refs | current frontier |z| --- | --- | ---: | --- |rW   hasCurrentFrontierPair
)appendr   joinextend)r   linesr1   r   s       r   markdownr      s.   1

 12$wx7H6IK
"7+C#D"EF
&w/P'Q&RS
%g.N&O%PQ
-g6X.Y-Z[
-g6X.Y-Z[
$W-G%H$IJ
+G4T,U+VW
+G4T,U+VW
27;a3b2cd
9'Bn:o9pq
'0K(L'MQO
,W5V-W,XY
,W5Z-[,\]
&w/F'G&HI
(9 :;1=

!
g=3E6 ./ 
&'(fjj9J.K.Rs-SSW&'(F6N+;3,-.c&9O2P1Q R

,-45T$))F:DV:W:^[^9__ac	

 
LL   78 
'+,-T':J2K1LC)*+3w7M/N.Os1233tyyAX7Y6ZZ\^	

 
LL   78 
'+,-T':J2K1LC-./s7;S3T2UUWY	


 
LL99Ur   c                   dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  dd	d
ddd| d    d| d    dd| d    d| d    d| d    dt        j                  t        | d                d	dt        j                  | d          dddd|d d!d"|d d#d$|d g      S )%Nr   c              3    K   | ]B  }d t        j                  t        |d                dt        j                  t        |j                  d      xs d             dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d	                dt        j                  t        |d
                dt        j                  t        |j                  d      xs d             dt        j                  dj	                  |d         xs d       d E yw)<tr><td><code>r.   z</code></td><td><code>r8   r   </code></td><td>r4   	</td><td>rM   rN   r)   z</td><td><code>rL   r   rJ   
</td></tr>N)htmlescapestrr   r   )rc   r1   s     r   re   zhtml_page.<locals>.<genexpr>   s3      	[[VM%:!;<= >[[VZZ0A%B%Ic!JKL M{{3v&6789: ;{{3vf~./0 1{{3v&<=>?@ A{{3v&<=>?@ A[[VZZ0A%B%Ic!JKL M{{499VJ%78?C@A B		s   E	Er^   c              3    K   | ]  }d t        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                dt        j                  dj                  |d	                d
  yw)r   r8   r   r4   r   r&   r)   r7   r   r   r   N)r   r   r   r   rc   r   s     r   re   zhtml_page.<locals>.<genexpr>  s      
 	[[W->%?!@AB C{{3w'789:; <{{3w'9:;<= >{{3w'=>?@A B{{3w'ABCDE F{{499W^%<=>? @	
s   CC!rq   c              3  2  K   | ]  }d t        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                d	  yw)	r   r8   r   r4   r   r)   r   r   N)r   r   r   r   s     r   re   zhtml_page.<locals>.<genexpr>  s       	[[W->%?!@AB C{{3w'789:; <{{3w'=>?@A B{{3w'?@ABC D		s   BBrW   z%<!doctype html><meta charset='utf-8'>z4<title>map1_01a Scene Record Cluster Context</title>a   <style>body{font-family:system-ui,sans-serif;margin:24px;line-height:1.45}table{border-collapse:collapse;width:100%;margin:16px 0}th,td{border:1px solid #ddd;padding:6px 8px;text-align:left;vertical-align:top}th{background:#f4f4f4}code{white-space:nowrap}.summary{max-width:980px}</style>z.<h1>map1_01a Scene Record Cluster Context</h1>z<div class='summary'>z<p><b>Route:</b> <code>r[   z -&gt; r\   z</code></p>z <p><b>source scene records:</b> r]   z/; <b>source/target shared strict clusters:</b> ro   z6; <b>source/target shared selector-only clusters:</b> rp   z; <b>promotion:</b> r   z</p>z<p>r   z</div>z<h2>Source Scene Records</h2>z<table><thead><tr><th>record</th><th>cluster</th><th>class</th><th>role</th><th>strict events</th><th>selector refs</th><th>next map ref</th><th>tilesets</th></tr></thead><tbody>z</tbody></table>z&<h2>Source/Target Shared Clusters</h2>z<table><thead><tr><th>cluster</th><th>class</th><th>events</th><th>selector refs</th><th>current frontier</th><th>maps</th></tr></thead><tbody>z&<h2>Target Selector-Only Clusters</h2>zs<table><thead><tr><th>cluster</th><th>class</th><th>selector refs</th><th>current frontier</th></tr></thead><tbody>)r   r   r   r   )r   source_rowsshared_rowstarget_rowss       r   	html_pager      s[   ))  23 K )) 
 ;<
 
K ))  ;< K 99/> 	k8
!'("3!4GGH<M;NkZ
*73K+L*M N88?@f8g7h i??FGs?t>u v![[W5F-G)HIJ$	P dkk',/016' 	}0 	Z0}1  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok*map1_01a_scene_record_cluster_context.jsonF   )ensure_asciiindentr   r
   r   )mkdir
write_textr   dumps)r   out_dirs     r   write_outputsr   6  sD    MM$M.;;GG

7q9D@ H r   c            	        t        j                  t              } | j                  dt        t
               | j                         }t        t        |j                  dz  i       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field_map_record_roots.jsonzmap1_01a_hotspot_gap.jsonz$map1_01a_strict_target_link_gap.jsonz%map1_01a_record_pattern_contrast.jsonz&wrote scene record cluster context -> r   )argparseArgumentParser__doc__add_argumentr   OUT
parse_argsr   r   r   r   print)parserargsr   s      r   mainr   >  s    $$9F
$<D$,,!>>C$,,!<<bA$,,!GGL$,,!HH"M	G '4<<(	24<<Bn3n2o
pqr   __main__)r   r   )r   dict | Nonereturnz
str | None)r   dictr   z	list[str])r   r   r#   r   r   rO   )r   r   r   rO   )r/   r   r0   r   r   r   )r   r   r   r   )r1   r   r   r   r   r   )r1   r   r/   r   r   r   )
r/   r   r   r   r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   r   None)r   r   )r   
__future__r   r   r   r   pathlibr   __file__resolver   ROOTr   r@   rA   r   r   r!   r$   r'   r*   r2   rB   rD   rQ   r   r   r   r   r   __name__ r   r   <module>r      s    O "     H~''*
Ul		8O3-2b,# 0BBB !B "	B
 
BJ=@;|r zF r   