
    IjJ                       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	 ddl
mZ  ee      j                         j                  d   Zedz  Zd	Zd
ZdZg dZg dZdg dddg dddg dddg dddddgdgZd,dZd-dZd.dZd/dZd0dZd1dZd2d Zd3d!Zefd4d"Zd5d#Z 	 	 	 	 	 	 	 	 	 	 d6d$Z!	 	 	 	 	 	 	 	 	 	 	 	 d7d%Z"d8d&Z#d8d'Z$edfd9d(Z%d:d)Z&d;d*Z'e(d+k(  r e'        yy)<zRGroup nearby field-map scene records and event records into route-root candidates.    )annotationsN)Path	urlencode)accepted_by_map   outi  map1_01amap2_02d)zdirect-strict-event-transitionzsource-outgoing-strict-clusterztarget-strict-clusterz'selector-only-frontier-not-event-linked)z3direct strict event transition map1_01a -> map2_02dz@strict event cluster sourced by map1_01a and linking to map2_02dz)strict target-linked cluster for map2_02dzInon-selector-only current frontier event link or equivalent trigger proofzout/scene_manifest.json)recordVamap
sceneIdHextilesets)pathfieldszout/scene_events.json)r   r   	eventKindpointseventDispatchRefsz'out/save_scene_selector_references.json)labelpathHexrefVaHexresourcesceneMatchedzout/save_selector_frontier.json)sourcetargetdirectEventTransition
scenePairszout/map_render_reviews.jsonacceptedTilesetsmatchesAcceptedc                    d| dS )N0x08x values    =/home/exedev/hwanse/tools/summarize_field_map_record_roots.pyhex32r'   7   s    c{    c                >    t        | t              rt        | d      S d S )N   )
isinstancestrintr$   s    r&   	parse_hexr.   ;   s    's33ub>==r(   c                z    t               }g }| D ])  }||v r|j                  |       |j                  |       + |S )N)setaddappend)valuesseenresultr%   s       r&   uniquer6   ?   sE    5DF D=e	
 Mr(   c                    dt        |        S )Nz../web/game.html?r   )paramss    r&   web_hrefr9   J   s    y0122r(   c                &   g }| j                  d      xs g D ]m  }|j                  d      xs g D ]S  }|j                  d      s|j                  d      s'd|v s,|dd j                         s@|j	                  |d d        U o t        |      S )	Nr   conditionLinkedStringsr   z.cns_      )get
startswithendswithisdigitr2   r6   )eventlinksreflinkeds       r&   event_field_linksrH   N   s    Eyy,-3 *gg67=2 	*F  'FOOF,CvZ`abcdZeZmZmZoVCR[)	** %=r(   c                x    i }| D ]2  }|j                  |j                  d      g       j                  |       4 |S )Nr   )
setdefaultr@   r2   )rowsrefsrows      r&   save_selector_refs_by_varN   W   s=    "$D =
+R077<=Kr(   c                    | D ch c]F  }|j                  d      r3|j                  d      r"|j                  d      |j                  d      fH c}S c c}w )Nr   r   )r@   )frontier_rowsrM   s     r&   frontier_pairsrQ   ^   sR     !778!2 
	CGGH-.  s   AAc                   g }| D ]U  }|j                  d|d   |d   |j                  d      |j                  d      xs g |j                  d      xs g d       W |D ]d  }|j                  d|d   |d   |j                  d      |j                  d	      t        |j                  d
      xs g       t        |      d       f t	        |d       S )Nmanifestr   r   r   r   sprites)kindvar   r   r   rT   rD   r   r   )rU   rV   r   r   r   
pointCount
fieldLinksc                    | d   S )NrV   r#   rM   s    r&   <lambda>znode_rows.<locals>.<lambda>{   s
    D	 r(   key)r2   r@   lenrH   sorted)rS   eventsrK   recordrD   s        r&   	node_rowsrb   f   s    D $%= **\2

:.4"zz),2
 	  	
#<))L1;/eii17R8+E2
 		 $122r(   c                    g }| D ]?  }|r|d   |d   d   d   z
  |kD  r|j                  |g       ,|d   j                  |       A |S )NrV   )r2   )nodesgapclustersnodes       r&   cluster_nodesri   ~   s^    !#H &4:R(8(>>DOOTF#RL%	&
 Or(   c                    |j                  | d         xs i }|j                  d      xs g }| j                  d      xs g }||t        |      xr |d t        |       |k(  dS )Nr   r   )r   recordTilesetsr   )r@   boolr^   )ra   acceptedaccepted_recordaccepted_tilesetsrecord_tilesetss        r&   render_matchrq      st    ll6%=17RO'++J7=2jj,2O-) 12uG_M^I_7`du7u r(   c                   | D cg c]  }|d   dk(  s| }}| D cg c]  }|d   dk(  s| }}t        |D cg c]  }|d   	 c}      }t        |D cg c]  }|d   	 c}      }t        |D 	cg c]  }|j                  d      xs g D ]  }	|	   c}	}      }
g }|D ]{  }|j                  t        |d         g       D ]X  }|j                  |j                  d      |j                  d      xs g |j                  d	      |j                  d
      d       Z } g }t        g ||      D ]5  }t        g ||
      D ]!  }||k7  s	|j                  ||||f|v d       # 7 |D ci c]%  }t	        t        |j                                     |' c}j                         D cg c]  }t        |       }}g }|D ]q  }|j                  t        |d         |d   |j                  d      |j                  d      xs g t        ||      |j                  t        |d         g       d       s d}|rd}|r|sd}t        d |D              r|r|sd}t        | d   d         t        | d   d         ||||
t        |      t        |      t        d |D              t        |d       ||D cg c][  }t        |d         |d   |j                  d      |j                  d      |j                  dd      |j                  d      xs g d] c}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 )NrU   rS   rD   r   rX   rV   r   r   r   r   )selectorr   r   r   )r   r   isCurrentFrontierr   r   )recordVaHexr   r   r   rendersaveSelectorRefszunlinked manifest clusterzstrict event-linked clusterzsave-selector-only clusterc              3  &   K   | ]	  }|d      yw)rt   Nr#   .0rM   s     r&   	<genexpr>z$summarize_cluster.<locals>.<genexpr>   s     
;3"#
;   z&current frontier selector-only clusterr   rd   c              3  ,   K   | ]  }|d    s	d  yw)rt   r   Nr#   ry   s     r&   r{   z$summarize_cluster.<locals>.<genexpr>   s     ']cCH[D\']s   
c                     | d    | d   | d   fS )Nrt   r   r   r#   rZ   s    r&   r[   z#summarize_cluster.<locals>.<lambda>   s$    sCV?W;WY\]eYfhklthu:v r(   r\   r   rW   )ru   r   r   r   rW   rX   )clusterStartHexclusterEndHexclassificationmanifestMapseventSourceseventFieldLinkseventRecordCountsaveSelectorRefCountcurrentFrontierPairCount
routePairsmanifestRecordseventRecords)r6   r@   r'   r2   tupler_   itemsr3   dictrq   anyr^   sum)clustersave_refs_by_varm   frontierrh   manifest_recordsevent_recordsmanifest_mapsevent_sourceslinkevent_linksselector_refsra   rF   route_pairsr   r   rM   itemrecordsr   rD   s                         r&   summarize_clusterr      sp    *1ODLJ4NOO&-Idf1HTIMI4DEDDKEFMMBDDKBCM=b4TXXlE[Ea_abT$b$bcKM" "&&uVD\':B? 	C  GGG,779-3GGJ/GGJ/	" 	 K9=9=9: |;};{;< 	|F""f^dfl]mqy]y#z{	|| Wb*bs5		1D+Es+J*b*i*i*kl$4:lKlG"  .%= **\2

:.4""684 / 3 3E&,4G L
 	 1N6]5

;{
;;VcA D!12wr{401(%%&. #M 2$''][']$][.vw" '

   %U4[1U|#ii5"YY{3#iia8#ii5;

 K PIEBb +cl<

s8   LLLLL$L)3#L.
-*L4*L95A L>c                   t        |      }t        t        | |            D cg c]"  }t        |t	        |      |t        |            $ }}|D cg c]  }|d   s
|d   s|d   r| }}|D cg c]
  }|d   s	| }	}|D cg c]
  }|d   s	| }
}|D cg c]  }|d   s	|d   r| }}i dt        dt        dddt        t              d	t        |      d
t        |      dt        |
      dt        |      dt        |	      dddddt        dt        dt        dt        t              ddddd|iS c c}w c c}w c c}w c c}w c c}w )Nr   r   r   r   r   scopezZnearby field-map scene records and strict event records grouped into route-root candidatesclusterGapHexclusterCountinterestingClusterCountstrictEventLinkedClusterCountselectorOnlyClusterCountcurrentFrontierClusterCount
proofFoundFfieldMapRecordRootsProofFoundfailedFieldMapRecordRootGateIdsmissingEvidenceevidenceRefsevidenceRefCountpromotionStatusblocked
conclusiona  The current map1_01a -> map2_02d frontier belongs to a save-selector-only record cluster. That cluster has no strict event record; its source and target scene tilesets now match the accepted renders after using preceding scene resources. Strict event-linked clusters should remain the safer source for promotable tile transitions until a source coordinate or equivalent hotspot is found.rg   )r   ri   rb   r   rN   rQ   SOURCETARGETr'   CLUSTER_GAPr^   %FAILED_FIELD_MAP_RECORD_ROOT_GATE_IDS&FIELD_MAP_RECORD_ROOT_MISSING_EVIDENCE#FIELD_MAP_RECORD_ROOT_EVIDENCE_REFS)rS   r`   save_selector_refsrP   render_reviewsrm   r   rg   interestingcurrent_frontierstrict_eventselector_onlys               r&   build_summaryr      s    ~.H %Yx%@A 	'#;<N#OQY[ijw[xyH 
  (%&'2H*IWUoMp 	K  0;bGgF`>abb+6V'BT:UGVLV,77CY;Zcjk}c~WM&& 	m 	{+	
 	H 	"3{#3 	(\): 	#C$6 	&s+;'< 	e 	( 	*+P 	A 	; 	C CD  	9!" 	d%. 	K/  cVs5   'EE.
E9E
EE
E#E)Ec                   ddddd| d    d| d    d| d	    d
| d    d| d    d| d    dd| d    dddj                  | d          dt        | d          d| d    d| d    dd| d   dddg}|j                  d | d   D               |j                  g d       |j                  d  | d   D               |j                  g d!       | d"   D ]K  }|j                  d#|j	                  d$       d%dj                  |j	                  d&      xs g        d'       M |j                  g d(       | d)   D ]  }g }|d*   D ]T  }|d+   }|d,   s|d-   r|j                  |d.    d/d0j                  |d1          d2d0j                  |d,          d       V |d3   xs
 |d4   xs dgd5   }|rd6t        |d7d7d8       d9nd:}|j                  d#|d;    d<|d=    d%|d>    d?dj                  |d3         xs d: d?|d@    d?|dA    d?|dB    d?dCj                  |      xs d: d?| d'        |j                  d       dDj                  |      S )ENz# Field Map Record Roots zUNearby manifest scene records and strict event records grouped by executable address.z- interesting clusters: r    / r   z - strict event-linked clusters: r   z- selector-only clusters: r   z- current frontier clusters: r   z- proofFound: `r   `z'- field-map record roots proof found: `r   z&- failed field-map record root gates: , r   z- missing evidence count: r   z- evidence refs: r   z- promotion status: `r   r   z## Failed Gatesc              3  (   K   | ]
  }d | d  yw)z- `r   Nr#   rz   r   s     r&   r{   zmarkdown.<locals>.<genexpr>  s     V43tfAVs   )r   z## Missing Evidencer   c              3  &   K   | ]	  }d |   yw)z- Nr#   r   s     r&   r{   zmarkdown.<locals>.<genexpr>"  s     D2dVDr|   )r   z## Evidence Refsr   z| path | fields |z| --- | --- |r   z| `r   z` | r   z |)r   z## Clustersr   zj| cluster | class | manifest maps | events | selector refs | current frontier | render mismatches | open |z4| --- | --- | --- | ---: | ---: | ---: | --- | --- |rg   r   rv   r   r   r   z `,rk   z` -> `r   r   r   z[open](1r   r`   overview)-r   z`..`r   r   z | r   r   r   z; 
)joinr^   extendr2   r@   r9   )	summarylinesrF   r   
mismatchesra   rv   	first_map	open_links	            r&   markdownr     sG   "
_

"7+D#E"Fc'R`JaIbc
*73R+S*TU
$W-G%H$IJ
'0M(N'OP
',/02
1':Y2Z1[[\]
07Cd;e1f0gh
$S1B)C%D$EF
G$6789
(9 :;1=


'E* 
LLV73T+UVV	LL  
 
LLD1B)CDD	LL   ~& Xs3776?+4		#''(:K:Qr0R/SSUVWX	LL   :& 

/0 	FH%F()&9J2K!!e}oR8H1I(J'K6RURZRZ[abt[uRvQwwxy	 ^,O0GOB4QRS	ajghyCUX'YZ[[\]ps	'+,-T'/2J1K4PWXhPiOjjmyy018S9WEW=X<YY\-./s7;U3V2WWZyy$+,C	{">	

  
LL99Ur(   c                   dj                  d | j                  d      xs g D              }dj                  d | j                  d      xs g D              }dj                  d | j                  d      xs g D              }g }| d   D ],  }d	j                  d
 |d   d d D              xs d}d	j                  d |d   D              xs d}d	j                  d |d   D              xs d}d	j                  d |d   D              xs d}	|d   xs
 |d   xs dgd   }
|
r&dt        j                  t	        |
ddd             dnd}|j                  dt        j                  |d          dt        j                  |d          dt        j                  |d          d | d | d | d |	 d | d!       / d"j                  g d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4| d5    d6| d7    d8| d9    d:| d;    d<	d=d>t        j                  t        | d?                d@dAt        j                  t        | dB                d@dC| dD    dEdFt        j                  | dG          d@dHdIt        j                  | dJ          dKdLd=| dMdNd=| dMdOdP| dQdRdSdTdj                  |       dQdUdVd      S )WNr   c              3  N   K   | ]  }d t        j                  |       d  yw)z
<li><code></code></li>Nhtmlescaper   s     r&   r{   zhtml_page.<locals>.<genexpr>H  s+       T[[&'|4   #%r   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li></li>Nr   r   s     r&   r{   zhtml_page.<locals>.<genexpr>L  s(      ,0$t{{4 !'r   r   c              3     K   | ]h  }d t        j                  |j                  d      xs d       dt        j                  dj                  |j                  d      xs g              d j yw)<tr><td><code>r   r   </code></td><td>r   r   
</td></tr>N)r   r   r@   r   )rz   rF   s     r&   r{   zhtml_page.<locals>.<genexpr>O  sl      
 		[[!6B78 9{{499SWWX%6%<"=>? @	s   A.A0r   rg   z<br>c              3     K   | ]A  }t        j                  |d           dt        j                  |d          |d   rdndz    C yw)r   z -&gt; r   rt   z <strong>current</strong>r   Nr   ry   s     r&   r{   zhtml_page.<locals>.<genexpr>X  sU      
  {{3x=)*'$++c(m2L1MN.12E.F*BP
s   AA	r   
   r   c              3     K   | ]a  }d t        j                  |d          dt        j                  |d          dt        j                  dj                  |d                d c yw)	<code>ru   </code> r   z <code>r   r   </code>Nr   r   r   rz   ra   s     r&   r{   zhtml_page.<locals>.<genexpr>]  sm      
  T[[!678VTY]A[@\ ][[&*<!=>?wH
s   A'A)r   c              3     K   | ]f  }d t        j                  |d          dt        j                  |d          d|d    dt        j                  dj                  |d                 h y	w)
r   ru   r   r   z points rW   z links r   rX   Nr   )rz   rD   s     r&   r{   zhtml_page.<locals>.<genexpr>b  sw      
  T[[}!567xERWL@Y?Z [L)*'$++chhu\GZ>[2\1]_
s   A,A.r   c              3    K   | ]  }|d    d   r{|d    d   sst        j                  |d          dt        j                  dj                  |d    d                dt        j                  dj                  |d    d                d  y	w)
rv   r   r   r   z: <code>r   rk   z</code> -> <code>r   Nr   r   s     r&   r{   zhtml_page.<locals>.<genexpr>g  s      !
 h 23F8<LM^<_ {{6%=)*(4;;sxxxHXYiHj?k3l2m n[[&*:;M*N!OPQQXZ!
s   BBr   r   r   z	<a href="r   r   z
">open</a>r   r   z</code><br><code>r   r   r   z	</td><td>r   r   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z'  <title>Field Map Record Roots</title>z	  <style>z^    body { margin: 24px; background: #101010; color: #eee; font: 14px system-ui, sans-serif; }zJ    table { border-collapse: collapse; width: 100%; margin-bottom: 24px; }zM    th, td { border: 1px solid #333; padding: 6px 8px; vertical-align: top; }z    th { background: #1d1d1d; }z    code { color: #f5d76e; }z    a { color: #9bd4ff; }z
  </style>z</head>z<body>z!  <h1>Field Map Record Roots</h1>z  <p>Interesting clusters: r   r   r   z; strict event-linked: r   z; selector-only: r   z.</p>z  <ul>z    <li>proofFound: <code>r   r   z2    <li>field-map record roots proof found: <code>r   z    <li>evidence refs: r   r   z     <li>promotion status: <code>r   z  </ul>z  <p>r   z</p>z  <h2>Failed Gates</h2>z</ul>z  <h2>Missing Evidence</h2>z  <h2>Evidence Refs</h2>zD  <table><thead><tr><th>path</th><th>fields</th></tr></thead><tbody>z</tbody></table>z  <h2>Clusters</h2>z  <table><thead><tr><th>cluster</th><th>class</th><th>manifest records</th><th>events</th><th>route pairs</th><th>render mismatches</th><th>open</th></tr></thead>z	  <tbody>z</body>z</html>)r   r@   r   r   r9   r2   r,   )r   failed_gatesmissing_evidenceevidence_refsrK   r   pairsr   r`   r   r   r   s               r&   	html_pager   G  s   77 KK ABHb L ww 4;KK@Q4R4XVX  GG 
 ;;~.4" M D:& "
 
 |,Sb1
 
  	 	
 ++ 
 ""34
 
  	 	
  
 !0
 
  	 	
 [[ !
 ""34!
 
 
  	 ^,O0GOB4QRS	 zCiHYRUcf5g,h ijjtu  IL	W->%?@AARSWS^S^_fgv_wSxRy z;;w'789: ;) ( ' , + 
	
1"
F 99 ''' 	' 	#	'
 	Q' 	2' 	' 	i' 	U' 	X' 	*' 	'' 	$' 	' 	'  	!'" 	,#'$ &g.G&H%IWUcMdLe f  '(G HIIZ[bc}[~Z  @E	F%'( 	)'* %T[[W\5J1K%L$M\Z+', =T[[WUtMuIv=w<x  yE  	F-'. "'*<"=!>eD/'0 +4;;w?P7Q+R*SS_`1'2 	3'4 GL123485'6 	"7'8 e$9': 	&;'< !"%(='> 	#?'@ O}o]mnA'B 	C'D 	mE'F BGGDM?"23G'H 	I'J 	K'L 	M' ' 'r(   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |:|j                  j                  dd       |j                  t        |       d	       y y )
NT)parentsexist_okfield_map_record_roots.jsonF)r   :)ensure_ascii
separatorsr   utf-8encoding)mkdir
write_textjsondumpsparentr   )r   out_dirhtml_outs      r&   write_outputsr     s    MM$M.,,88

7:FM 9  dT:Ig.A r(   c                p    | j                         s|S t        j                  | j                  d            S )Nr   r   )existsr   loads	read_text)r   defaults     r&   	load_jsonr    s*    ;;=::dnngn677r(   c            
     >   t        j                  t              } | j                  dt        t
               | j                  dt        d d       | j                         }t        t        |j                  dz  g       t        |j                  dz  g       t        |j                  d	z  g       t        |j                  d
z  g       t        |j                  dz  i             }t        ||j                  |j                         t        d|j                  dz          y )N)descriptionz	--out-dir)typer  z
--html-outz!Optional HTML report output path.)r	  r  helpzscene_manifest.jsonzscene_events.jsonz#save_scene_selector_references.jsonzsave_selector_frontier.jsonzmap_render_reviews.jsonz wrote field map record roots -> r   )argparseArgumentParser__doc__add_argumentr   OUT
parse_argsr   r  r   r   r   print)parserargsr   s      r&   mainr    s    $$9F
$<
4DghD$,,!66;$,,!44b9$,,!FFK$,,!>>C$,,!::B?G '4<<7	,T\\<Y-Y,Z
[\r(   __main__)r%   r-   returnr,   )r%   z
str | Noner  z
int | None)r3   	list[str]r  r  )r8   zdict[str, str]r  r,   )rD   r   r  r  )rK   
list[dict]r  dict[str, list[dict]])rP   r  r  set[tuple[str, str]])rS   r  r`   r  r  r  )re   r  rf   r-   r  zlist[list[dict]])ra   r   rm   dict[str, dict]r  r   )
r   r  r   r  rm   r  r   r  r  r   )rS   r  r`   r  r   r  rP   r  r   r  r  r   )r   r   r  r,   )r   r   r   r   r   zPath | Noner  None)r   r   )r  r  ))r  
__future__r   r  r   r   pathlibr   urllib.parser   map_render_reviewsr   __file__resolver   ROOTr  r   r   r   r   r   r   r'   r.   r6   r9   rH   rN   rQ   rb   ri   rq   r   r   r   r   r   r  r  __name__r#   r(   r&   <module>r%     s   X "     " . H~''*
Ul		) %* & *?
 (Q
 :N
 2M
 .%'89#' #0>330 1< BB*B B #	B
 
BJ+++ #+ 	+
 $+ 
+\>BZz 25d B8]  zF r(   