
    Ij1G                       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g d
Zg dZg dZdg dddg dddg ddg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,dZd-dZd.dZd.dZ edfd/d Z!d0d!Z"e#d"k(  r e"        yy)1zOCompare save-selector scene-record adjacency with strict/confirmed transitions.    )annotationsN)Path)Any   outmap1_01amap2_02d)zstrict-event-backed-adjacencyz!confirmed-review-backed-adjacencyzstrict-hotspot-or-coordinate)z2strict event-backed map1_01a -> map2_02d adjacencyzAconfirmed transition-review backed map1_01a -> map2_02d adjacencyz>strict source coordinate or hotspot backing selector adjacency)z;find a strict event transition backing map1_01a -> map2_02dz8confirm the selector adjacency through transition reviewzEfind a strict source coordinate or hotspot backing selector adjacencyz'out/save_scene_selector_references.json)kindsceneMatchedpathHexresource)pathfieldszout/event_transitions.json)maptargetseventszout/transition_reviews.json)sourcetargetstaterecordVaHexc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)r   fallbacks     J/home/exedev/hwanse/tools/summarize_save_selector_scene_adjacency_index.py	load_jsonr!   /   s*    ;;=::dnngn677    c                z    t               }g }| D ])  }||v r|j                  |       |j                  |       + |S N)setaddappend)valuesseenresultvalues       r    uniquer,   5   sE    5DF D=e	
 Mr"   c                    |  d| S )Nz-> )r   r   s     r    pair_keyr/   @   s    XRx  r"   c                    | D ch c]B  }|j                  d      xs g D ](  }|j                  d      r|r|j                  d      |f* D c}}S c c}}w )Nr   r   )get)event_transitionsrowr   s      r    strict_event_edgesr4   D   sa     %ggi(.B 775>f 
    s   AAc                    | j                         D ch c]Z  }|j                  d      dk(  rD|j                  d      r3|j                  d      r"|j                  d      |j                  d      f\ c}S c c}w )Nr   	confirmedr   r   )r(   r1   )transition_reviewsr3   s     r    confirmed_review_edgesr8   M   sk     &,,.777{*swwx/@SWWXEV 
	CGGH-.  s   AA5c                
   i }| D ]{  }|j                  d      dk7  s|j                  d      dur+|j                  d      xs g }|sC|j                  |j                  d      xs d|d   fg       j                  |       } |S )	Nr
   fieldMapr   Tr   label-)r1   
setdefaultr'   )reference_rowsleavesr3   r   s       r    field_map_leaf_groupsrA   U   s    02F O776?j(CGGN,C4,Owwy!'R3777+2sDH=rBII#NO Mr"   c                Z   t        |       }g }t        |j                               D ]  \  \  }}}t        |d       }t        ||dd        D ]  \  }}|j	                  d      }	|j	                  d      }
|	r|
r|	|
k(  r2|j                  |	|
|||j	                  d      |j	                  d      |j	                  d      |j	                  d      |j	                  d      xs g |j	                  d      xs g d
         t        |      t        d	 |j                         D              |fS )
Nc                @    t        | j                  d      xs dd      S )NrefVaHex0   )intr1   r3   s    r    <lambda>z&adjacent_occurrences.<locals>.<lambda>e   s    s377:3F3M#r/R r"   keyr   r   rD   
sceneIdHextilesets)
r   r   selectorleafPointerHexsourceRecordVaHextargetRecordVaHexsourceSceneIdHextargetSceneIdHexsourceTilesetstargetTilesetsc              3  2   K   | ]  }t        |        y wr$   )len).0rowss     r    	<genexpr>z'adjacent_occurrences.<locals>.<genexpr>w   s     B$CIBs   )	rA   sorteditemszipr1   r'   rW   sumr(   )r?   r@   occurrencesrN   leafrY   orderedr   r   
source_map
target_maps              r    adjacent_occurrencesrd   a   s"   ">2FK"("8 4$#RS!'712;7 	NFFJ/JJ/JZ:3K$$$"&%+ZZ
%;%+ZZ
%;$*JJ|$<$*JJ|$<"(**Z"8">B"(**Z"8">B  	& v;B&--/BBKOOr"   c                B   i }| D ]  }|d   |d   f}|j                  ||d   |d   dg g g g ||v ||v d	      }|dxx   dz  cc<   t        g |d   |d         |d<   t        g |d	   |d
         |d	<   t        g |d   |j                  d      xs d      |d<   t        g |d   |j                  d      xs d      |d<    g }|j                         D ]7  }|d    xr |d    |d<   |d   rdn|d   rdnd|d<   |j	                  |       9 t        |d       S )Nr   r   r   )	r   r   occurrenceCount	selectorsleafPointerssourceRecordstargetRecordsstrictEventBackedconfirmedReviewBackedrf   r   rg   rN   rh   rO   ri   rP   r<   rj   rQ   rk   rl   selectorAdjacencyOnlyzstrict-event-backedzconfirmed-review-backedzselector-adjacency-onlyclassificationc                    | d   | d   fS Nr   r   r.   rH   s    r    rI   z!aggregate_pairs.<locals>.<lambda>   s    XH(F r"   rJ   )r>   r,   r1   r(   r'   r[   )r_   strict_edgesconfirmed_edgespairs
occurrencerK   pairrY   s           r    aggregate_pairsrv   z   s   )+E! m
(#Z%9: * * !$!4%(O%;
&
 
 	1$"#OT+%6#O
:8N#OP[%&[^(<&[jIY>Z&[\^ &'ko)>'k
Ob@c@jgj'k l_ &'ko)>'k
Ob@c@jgj'k l_#m$ D ,01D,E(E(kdSjNkJk$%%)*=%>!)-.E)F%% 	
 	D $FGGr"   c                   |xs t        t        dz  g       }|xs t        t        dz  i       }t        |      }t        |      }t	        |       \  }}}t        |||      }|D 	cg c]4  }	|	j                  d      t        k(  r|	j                  d      t        k(  r|	6 }
}	t        d |D        d       }|.t        t        dg g g g t        t        f|v t        t        f|v ddd	}i |d
|
i}|D 	cg c]
  }	|	d   s	|	 }}	|D 	cg c]
  }	|	d   s	|	 }}	d}i dddt        dt        d|d|dt        |      dt        |      dt        |      dt        |      dt        |      dt        |      dt        d |D              d|d|j                  d      d|j                  d      d|j                  d      d|j                  d       ddt        t        t        t        t        t              d!||d"
S c c}	w c c}	w c c}	w )#Nevent_transitions.jsontransition_reviews.jsonr   r   c              3  T   K   | ]   }|d    t         k(  s|d   t        k(  s| " yw)r   r   N)SOURCETARGETrX   r3   s     r    rZ   z build_summary.<locals>.<genexpr>   s(     eX&1HSQY]^dMdes   (((r   Fznot-selector-adjacent)r   r   rf   rg   rh   ri   rj   rk   rl   rm   rn   r_   rk   rl   al  Save-selector field-map adjacency is a broad scene-list signal: none of the directed adjacent pairs overlap the current strict event-transition edge set or confirmed transition reviews. The current map1_01a->map2_02d pair appears three times as selector 2:0 scene-record adjacency, but it remains selector-adjacency-only without strict hotspot/coordinate evidence.scopez4all save-selector field-map scene-record adjacenciesselectorLeafCountfieldMapReferenceCountadjacentOccurrenceCountuniqueDirectedAdjacentPairCountstrictEventEdgeCountconfirmedReviewEdgeCount!adjacentPairsWithStrictEventCount%adjacentPairsWithConfirmedReviewCount*adjacentPairsWithoutStrictOrConfirmedCountc              3  ,   K   | ]  }|d    s	d  yw)rm   r   Nr.   r}   s     r    rZ   z build_summary.<locals>.<genexpr>   s     9mPSTkPl!9ms   
currentPaircurrentPairOccurrenceCountrf   currentPairStrictEventBacked currentPairConfirmedReviewBacked currentPairSelectorAdjacencyOnlyrm   blocked)

proofFoundsceneAdjacencyStrictProofFoundfailedSceneAdjacencyGateIdsmissingEvidenceremainingProofsevidenceRefsevidenceRefCountpromotionStatuspairRows
conclusion)r!   OUTr4   r8   rd   rv   r1   r{   r|   nextrW   r^   FAILED_SCENE_ADJACENCY_GATE_IDS SCENE_ADJACENCY_MISSING_EVIDENCE SCENE_ADJACENCY_REMAINING_PROOFSSCENE_ADJACENCY_EVIDENCE_REFS)r?   r2   r7   rq   rr   
leaf_countfield_ref_countr_   rs   r3   current_occurrencescurrent_pairstrict_adjacentconfirmed_adjacentr   s                  r    build_summaryr      s   
 *ZYs=U7UWY-Z+]y?X9XZ\/]%&78L,-?@O/CN/S,JKGE"778&3778+<+F 	  eegklL "(&!1\!A&,f%5%H%*5
 HlGM3FGL&+Hss3F/GsHOH).O##6M2N#OO	N G& 	& 	Z	
 	!/ 	"3{#3 	*3u: 	L 1 	#C$8 	,S-A 	05G1H 	5c9mu9m6m 	| 	%l&6&67H&I 	'(8(89L(M  	+L,<,<=T,U!" 	+L,<,<=T,U#$ */'F;;5 =>$ 7 9( IOs   %9H /
H:H
H
H
c                    d| j                  d       ddj                  | j                  d      xs g        d| j                  d       d| j                  d	       d
| j                  d       
S )Nzocc=rf   z selectors=,rg   z strict=rk   z confirmed=rl   z class=rn   )r1   joinrH   s    r    
pair_briefr      s    
sww()* +XXcggk28b9: ;''-./ 0WW456 7)*+		-r"   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)j                  | j                  d*      xs g       xs d+ d,t        | j                  d-      xs g        d.| j                  d/       d0| d1    d	d| d2   dd3dg}|j                  d4 | j                  d-      xs g D               |j                  g d5       | d6   j                  d7      xs g D ]  }|j	                  d8|j                  d9       d:|j                  d;       d:|j                  d<       d:|j                  d=       d:|j                  d>       d:|j                  d?       d@        | d6   j                  d7      s|j	                  dA       |j                  g dB       | d   | d   ft        | dC   fdDE      }|D ],  }|j	                  d8|d    d:|d    dFt        |       dG       . |j	                  d       dHj                  |      S )INz%# Save Selector Scene Adjacency Index z	- scope: r~   z- current route: `r   z -> r   `z- selector leaves: r   z- field-map references: r   z- adjacent occurrences: r   z"- unique directed adjacent pairs: r   z- strict event edges: r   z- confirmed review edges: r   z%- adjacent pairs with strict events: r   z)- adjacent pairs with confirmed reviews: r   z!- selector-adjacency-only pairs: r   z!- current pair occurrence count: r   z(- current pair strict/confirmed backed: r   z / r   z(- current pair selector-adjacency-only: r   z- proof found: r   z&- scene adjacency strict proof found: r   z - failed scene adjacency gates: z, r   r<   z- missing evidence count: r   z- evidence refs: r   z- promotion status: `r   r   z## Missing Evidencec              3  &   K   | ]	  }d |   yw)z- Nr.   rX   items     r    rZ   zmarkdown.<locals>.<genexpr>  s     N2dVNs   )r   z## Current Pair Occurrencesr   zQ| selector | leaf | source record | target record | source scene | target scene |z%| --- | --- | --- | --- | --- | --- |r   r_   z| `rN   z` | `rO   rP   rQ   rR   rS   z` |z| - | - | - | - | - | - |)r   z## Directed Adjacent Pairsr   z| source | target | counts |z| --- | --- | --- |r   c                0    | d   | d   fk7  | d   | d   fS rp   r.   r3   current_keys    r    rI   zmarkdown.<locals>.<lambda>!  +    #h-X7;FHWZ[cWde r"   rJ   z` | z |
)r   r1   rW   extendr'   r[   r   )summarylinesr3   ra   r   s       @r    markdownr      sf   /

GG$%&
WX./tGH4E3FaH
g&9:;<
"7+C#D"EF
"7+D#E"FG
,W5V-W,XY
 )?!@ AB
$W-G%H$IJ
/8[0\/]^
3G<c4d3ef
+G4`,a+bc
+G4P,Q+RS
27;Y3Z2[[^_f  hJ  `K  _L  	M
27;]3^2_`
',/01
09Y1Z0[\
*499W[[A^5_5ece+f+mjm*no
$S5F)G)M2%N$OP
GKK(:;<=
(9 :;1=


7E: 
LLN5F)G)M2NN	LL   }%))-8>B 
#''*%&eCGG4D,E+FeCGGTgLhKi j+,-U377;M3N2OuUXU\U\]oUpTqqtv	


 =!%%m401	LL   8$gh&78K
eG  Ws3x=/s8}oT*S/ARRTUVW	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 | d   j                  d	      xs g D              xs d
}| d   | d   ft        | d   fd      }dj                  d |D              }dj                  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/    d0| d1    d2| d3    d4| d5    d6| d7    d8t        | j                  d      xs g        d9| j                  d:       d;t	        j
                  | d<          d+d=t	        j
                  | d>          d?d@| dAdB| dAdCdD|dEdFdG|dEdHg      S )INr   c              3  N   K   | ]  }d t        j                  |       d  ywz<li>z</li>Nhtmlescaper   s     r    rZ   zhtml_page.<locals>.<genexpr>*  s(      ,0$t{{4 !'   #%r   c              3  N   K   | ]  }d t        j                  |       d  ywr   r   r   s     r    rZ   zhtml_page.<locals>.<genexpr>-  s#     g$T[[./u5gr   r   r   c              3    K   | ]  }d t        j                  |j                  d      xs d       dt        j                  |j                  d      xs d       dt        j                  |j                  d      xs d       dt        j                  |j                  d      xs d       dt        j                  |j                  d      xs d       dt        j                  |j                  d      xs d       d	  y
w)<tr><td><code>rN   r<   </code></td><td><code>rO   rP   rQ   rR   rS   z</code></td></tr>N)r   r   r1   r}   s     r    rZ   zhtml_page.<locals>.<genexpr>.  s      
 	[[!4!;<= >[[)9!:!AcBC D[[)<!=!DEF G[[)<!=!DEF G[[);!<!CDE F[[);!<!CDE F	
s   DDr   r_   z"<tr><td colspan="6">none</td></tr>r   r   r   c                0    | d   | d   fk7  | d   | d   fS rp   r.   r   s    r    rI   zhtml_page.<locals>.<lambda><  r   r"   rJ   c              3     K   | ]X  }d t        j                  |d          dt        j                  |d          dt        j                  t        |             d Z yw)r   r   r   r   z</code></td><td>z
</td></tr>N)r   r   r   r}   s     r    rZ   zhtml_page.<locals>.<genexpr>>  sg       	[[X/0 1[[X/0 1{{:c?+, -	s   AA 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">z4  <title>Save Selector Scene Adjacency Index</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: 12px 0 20px; }zM    th, td { border: 1px solid #333; padding: 6px 8px; vertical-align: top; }z    th { background: #1d1d1d; }z    code { color: #f5d76e; }z
  </style>z</head>z<body>z.  <h1>Save Selector Scene Adjacency Index</h1>z   <p>adjacent occurrences <code>r   z.</code>; unique directed adjacent pairs <code>r   z1</code>; adjacent pairs with strict events <code>r   z5</code>; adjacent pairs with confirmed reviews <code>r   z-</code>; selector-adjacency-only pairs <code>r   z</code>.</p>z)  <p>current pair occurrence count <code>r   z'</code>; strict/confirmed backed <code>r   z</code> / <code>r   z'</code>; selector-adjacency-only <code>r   z</code>; proofFound <code>r   z.</code>; sceneAdjacencyStrictProofFound <code>r   z$</code>; missingEvidenceCount <code>z</code>; evidence refs <code>r   z </code>; promotion status <code>r   z  <p>r   z</p>z+  <h2>Failed Scene Adjacency Gates</h2><ul>z</ul>z  <h2>Missing Evidence</h2><ul>z#  <h2>Current Pair Occurrences</h2>z  <table><thead><tr><th>selector</th><th>leaf</th><th>source record</th><th>target record</th><th>source scene</th><th>target scene</th></tr></thead><tbody>z  </tbody></table>z"  <h2>Directed Adjacent Pairs</h2>zU  <table><thead><tr><th>source</th><th>target</th><th>counts</th></tr></thead><tbody>z</body></html>)r   r1   r[   rW   r   r   )r   failed_gatesmissingcurrent_rowsra   	pair_rowsr   s         @r    	html_pager   )  s   77 4;KK@]4^4dbd L ggg'++N_B`BfdfggG99 
 =)--m<B
 
 
0 
0  8$gh&78K
eG 		   I 99"P>hTW)&8
*73L+M*NN|  ~E  Fg  ~h  }i  iZ  [b  cF  [G  ZH  H}  ~E  Fm  ~n  }o  o\  ]d  eQ  ]R  \S  S_  	`
3G<X4Y3Z  [B  CJ  Ki  Cj  Bk  k{  |C  Df  |g  {h  hO  PW  Xz  P{  O|  |V  W^  _k  Wl  Vm  m[  \c  dD  \E  [F  Fj  kn  ov  oz  oz  {L  oM  oS  QS  kT  jU  Ur  sz  s~  s~  Q	  sR	  rS	  S	s	  t	x	  t		  t		  @
G
  H
Y
  @
Z
  t	[
  s	\
  \
h
  	i

GL12348
5l^5I
)'%8- 	g,_=  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(save_selector_scene_adjacency_index.jsonF)r   :)ensure_ascii
separatorsr   r   r   )mkdir
write_textr   dumpsparentr   )r   out_dirhtml_outs      r    write_outputsr   h  s    MM$M.99EE

7:FM F  dT:Ig.A r"   c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  d	t        t
               | j                  d
t        d d       | j                         }t        t        |j                  g       t        |j                  g       t        |j                  i             }t        ||j                  |j                         t        d|j                  dz          y )N)descriptionz--referencesz#save_scene_selector_references.json)typedefaultz--event-transitionsrx   z--transition-reviewsry   z	--out-dirz
--html-outz!Optional HTML report output path.)r   r   helpz-wrote save selector scene adjacency index -> r   )argparseArgumentParser__doc__add_argumentr   r   
parse_argsr   r!   
referencesr2   r7   r   r   r   print)parserargsr   s      r    mainr   s  s	   $$9F
T3Af;fg
-D#H`B`a
.T3IbCbc
$<
4DghD$//2&$(("-$))2.G
 '4<<7	9$,,Is:s9t
uvr"   __main__)r   r   r   r   returnr   )r(   	list[str]r   r   )r   strr   r   r   r   )r2   
list[dict]r   set[tuple[str, str]])r7   zdict[str, dict]r   r   )r?   r   r   z!dict[tuple[str, str], list[dict]])r?   r   r   ztuple[int, int, list[dict]])r_   r   rq   r   rr   r   r   r   )NN)r?   r   r2   zlist[dict] | Noner7   zdict[str, dict] | Noner   dict)r3   r   r   r   )r   r   r   r   )r   r   r   r   r   zPath | Noner   None)r   r   )$r   
__future__r   r   r   r   pathlibr   typingr   __file__resolver   ROOTr   r{   r|   r   r   r   r   r!   r,   r/   r4   r8   rA   rd   rv   r   r   r   r   r   r   __name__r.   r"   r    <module>r      s-   U "      H~''*
Ul		# 
$  
$   :A
 -.
 .>!  8!	P2HD ,015CC(C /C 
	CL<~<~ 25d Bw" zF r"   