Ë
    8§jóR  ã                  ó¤  — 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
Z
 e
j                  d«       ddlmZ ddlmZ ddlZdd	gej&                  d
<   dej&                  d<   dZ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d-d„Zd-d„Z d/d„Z!d0d„Z"d-d„Z#d-d„Z$d-d„Z%d1d„Z&d2d „Z'd3d!„Z(d4d"„Z)d5d#„Z*d6d$„Z+e,d%k(  r e+«        yy)7u  Create deterministic, local HTML/PNG galleries for processed POC artifacts.

This is deliberately a reader: it never changes NPZ inputs, their schemas, or
their family index.json files.  Run from the repository root with:

    .venv/bin/python ì „ì²˜ë¦¬/visualize_processed.py
é    )ÚannotationsN)ÚPath)ÚAnyÚAgg)ÚLineCollectionzApple SD Gothic NeozDejaVu Sanszfont.familyFzaxes.unicode_minus©ÚimagesÚvoxelsÚpointsÚgraphsÚbrepÚtabularÚpaireda	  
body{font:15px/1.45 system-ui,sans-serif;margin:0;background:#f7f8fa;color:#18212f}
main{max-width:1280px;margin:auto;padding:28px}.card{background:#fff;border:1px solid #dfe5ec;border-radius:8px;padding:18px;margin:16px 0}
img{max-width:100%;height:auto;border:1px solid #dfe5ec}.thumb{max-height:250px;object-fit:contain}a{color:#0758aa}table{border-collapse:collapse;width:100%;font-size:13px}th,td{border:1px solid #dfe5ec;padding:5px;text-align:left}th{background:#edf3fa}code{font-size:12px} .muted{color:#526170}
c                 óV   — t        t        «      j                  «       j                  d   S )Né   )r   Ú__file__ÚresolveÚparents© ó    õ    ì „ì²˜ë¦¬/visualize_processed.pyÚroot_defaultr   $   s    € Ü”‹>×!Ñ!Ó#×+Ñ+¨AÑ.Ð.r   c                ó�   — t        t        t        d«      j                  j	                  | |«      «      «      j                  dd«      S )NÚosÚ\Ú/)Ústrr   Ú
__import__ÚpathÚrelpathÚreplace)ÚtargetÚstarts     r   Úrelr$   (   s8   € ÜŒt”J˜tÓ$×)Ñ)×1Ñ1°&¸%Ó@ÓAÓB×JÑJÈ4ÐQTÓUÐUr   c                ón   — t        j                  | «      }|j                  dk(  r|j                  «       S |S )Nr   )ÚnpÚasarrayÚndimÚitem)ÚvalueÚas     r   Úscalarr,   ,   s+   € Ü
�
‰
�5Ó€AØ—v‘v ’{ˆ1�6‰6‹8Ð)¨Ð)r   c                ó€   — t        j                  | «      j                  «       D �cg c]  }t        |«      ‘Œ c}S c c}w )N)r&   r'   Útolistr   )r*   Úxs     r   Ústringsr0   1   s2   € ÜŸJ™J uÓ-×4Ñ4Ô6Ó7Ñ6�qŒC��FÐ6Ñ7Ð7ùÒ7s   ¦;c           	     ó´  — t        j                  | t        ¬«      }|t        j                  |«         }t	        |«      sdddœS |rBt        t        t        j                  t        j                  |«      d«      «      d«      }| |dœS t        j                  |ddg«      \  }}||k  r|t        t        |«      dz  d«      z   }t        |«      t        |«      dœS )	N)Údtypeg        g      ð?)ÚvminÚvmaxéc   gê-�™—q=r   g{®Gáz„?)r&   r'   ÚfloatÚisfiniteÚlenÚmaxÚ
percentileÚabs)ÚvaluesÚ	symmetricr+   ÚqÚloÚhis         r   Úsafe_limitsrA   5   s²   € Ü
�
‰
�6¤Ô'€A¨Q¬r¯{©{¸1«~Ñ->¨ÜˆqŒ6 2¨rÑ2Ð2ÙÜ””b—m‘m¤B§F¡F¨1£I¨rÓ2Ó3°UÓ;ˆÈaÈRÐYZÑD[Ð=[Ü�]‰]˜1˜q "˜gÓ&�F€BˆØ	ˆR‚x�bœ3œs 2›w s™{¨EÓ2Ñ2�Ü˜"“I¤u¨R£yÑ1Ð1r   c                ó�   — |j                   j                  dd¬«       | j                  |dd¬«       t        j                  | «       y )NT©r   Úexist_oké–   Útight)ÚdpiÚbbox_inches)ÚparentÚmkdirÚsavefigÚpltÚclose)Úfigr   s     r   ÚsaverO   ?   s7   € Ø‡K�K×Ñ˜d¨TÐÔ2ð ‡K�K�˜#¨7€KÔ3´S·Y±Y¸sµ^r   c                ó$  — | d   | d   | d   }}}| j                  d|dk7  «      }g d¢}t        j                  dd¬	«      }|j                  d
dg d¢¬«      }	t	        j
                  t        d
«      D �
�cg c]/  }
t        d«      D �cg c]  }|j                  |	|
|f   «      ‘Œ c}‘Œ1 c}}
«      }t        ||   «      t        ||   «      }}d }d| v r%t        | d   d   «      }| d
z  |d
z  | d
z  |d
z  g}t        |«      D �]  \  }}t        j                  j                  ||    ||   «      }t        j                  j                  ||    ||   «      } |d|f   j                  |fd|ddœ|¤Ž} |d|f   j                  |fd|ddœ|¤Ž}|d|f   |d|f   fD ]F  }|j                  d«       |j                  |«       |j!                  g «       |j#                  g «       ŒH |dk(  sŒê|d|f   j%                  d«       |d|f   j%                  d«       �Œ |j'                  |j                  |	d   «      d¬«       |j'                  |j                  |	d   «      d¬«       |j)                  |› d�«       t+        ||«       yc c}w c c}}
w )NÚdepth_mmÚcurvature_magnitude_per_mmÚcurvature_validÚ
visibilityr   )z+Xu   âˆ’Xz+Yu   âˆ’Yz+Zu   âˆ’Z)é   gÍÌÌÌÌÌ@Úconstrained)ÚfigsizeÚlayouté   é   )r   r   r   r   r   r   g)\�Âõ(¬?)Úwidth_ratiosé   Úfield_of_view_mmÚviridisÚupper)ÚcmapÚextentÚoriginr   ÚmagmaÚequalzdepth
mmz|curvature|
1/mm)r   r\   z#front-most depth (mm), shared scale)ÚcaxÚlabel)r   r\   ú+curvature magnitude (1/mm); white = unknownzE: six orthographic CAD views; square physical FOV, no axis stretchingz–Six front-most z-buffer CAD views. Curvature white means source curvature mapping is invalid/unknown; no thickness, thermal, or stress field is shown.)ÚgetrL   ÚfigureÚadd_gridspecr&   r'   ÚrangeÚadd_subplotrA   r6   Ú	enumerateÚmaÚmasked_whereÚimshowÚ
set_aspectÚ	set_titleÚ
set_xticksÚ
set_yticksÚ
set_ylabelÚcolorbarÚsuptitlerO   )ÚdÚoutÚtitleÚdepthÚcurvÚokÚvisibleÚnamesrN   ÚgridÚrowÚcolÚaxesÚ	depth_limÚlimra   ÚsideÚiÚnameÚdmÚcmÚim0Úim1r+   s                           r   Úplot_imagesr�   F   s©  € Ø˜
‘m QÐ'CÑ%DÀaÐHYÑFZ�ˆ4€EØ�e‰e�L %¨1¡*Ó-€GÚ6€EÜ
�*‰*˜Y¨}Ô
=€CØ×Ñ˜A˜qÒ/AÐÓB€DÜ�:‰:ÔX]Ð^_ÔX`ÔaÑX`ÐQTÄ5ÈÄ8ÓLÁ8¸C˜Ÿ™¨¨S°#¨X©Õ7À8ÓLÐX`ÒaÓb€DÜ   w¡Ó0´+¸dÀ2¹hÓ2Gˆs€IÐRVÈØ˜QÑÜ�QÐ)Ñ*¨1Ñ-Ó.ˆ¸4¸%À¹'À4ÈÁ6ÈDÈ5ÐQRÉ7ÐTXÐYZÑTZÐ9[°Ü˜U×#‰ˆˆ4Ü�U‰U×Ñ ¨¡ ¨U°1©XÓ6ˆ¼R¿U¹U×=OÑ=OÐQSÐTUÑQVÐPVÐX\Ð]^ÑX_Ó=`¸Øˆd�1�Q�3‰i×Ñ˜rÐ^¨	¸&ÈÑ^ÐT]Ñ^ˆØˆd�1�Q�3‰i×Ñ˜rÐV¨¸ÀwÑVÐRUÑVˆØ�q˜�s‘)˜T ! A #™YÓ'ˆA¨¯©°gÔ)>ÀÇÁÈDÔ@QÐST×S_ÑS_Ð`bÔScÐef×eqÑeqÐrtÕeuÐ'Ø�‹6�4˜˜!˜‘9×'Ñ'¨Ô4°d¸1¸Q¸3±i×6JÑ6JÐK^Ö6_ð $ð ‡L�L�˜#Ÿ/™/¨$¨s©)Ó4Ð<a€LÔbØ‡L�L�˜#Ÿ/™/¨$¨s©)Ó4Ð<i€LÔjØ‡L�L�E�7Ð_Ð`ÔaÜˆˆc„Nð dùò MùÓas   Á3J
ÂJÂ"J
ÊJ
c                ó|   — t        j                  t        j                  |d¬«      d«      }| j                  |«       y )Nr   ©Úaxisg�íµ ÷Æ°>)r&   ÚmaximumÚptpÚset_box_aspect)ÚaxÚpÚspans      r   Ú_set_3d_aspectr—   ]   s*   € Ü�:‰:”b—f‘f˜Q QÔ'¨Ó.€D°×0AÑ0AÀ$Õ0Gr   c                ó&  — d| v rdnd}| |   }t        | j                  dt        j                  g «      «      «      }| j                  d«      }d|v rN|j	                  d«      }|d d …|f   }d}	| j                  dt        j
                  |t        «      «      d d …|f   }
n•d|v rN|j	                  d«      }|d d …|f   }d	}	| j                  dt        j
                  |t        «      «      d d …|f   }
nCt        j                  t        |«      «      t        j                  t        |«      t        «      d
}	}
}t        j                  d¬«      }|j                  dddd¬«      }|j                  ddd«      }|j                  ddd«      }t        j                  |
|t        j                  «      }t        ||
   «      } |j                  |d d …df   |d d …df   |d d …df   f|dddœ|¤Ž t!        ||«       |j#                  d«        |j                  |d d …df   |d d …df   f|dddœ|¤Ž}|j%                  d«       |j'                  d|dk(  rdnd› d�«       |j)                  d|dk(  rdnd› d�«       |j#                  d«        |j                  |d d …df   |d d …df   f|dddœ|¤Ž |j%                  d«       |j'                  d|dk(  rdnd› d�«       |j)                  d|dk(  rdnd› d�«       |j#                  d«       |j+                  ||||gd |	¬!«       d"| v rt-        t/        | d"   «      «      nd#}|j1                  |› d$t        |«      d%›d&|› �d'¬(«       t3        ||«       t        t/        | j                  d)d*«      «      «      }|rd+S d,S )-NÚpos_mmÚ
pos_nativeÚfeature_namesr/   rR   úcurvature magnitude (1/mm)Úfeature_validÚlocal_surface_variationz"local surface variation (unitless)zno scalar descriptor)é   ç      @©rW   r   é   Ú3d©Ú
projectionrY   r   gš™™™™™é?r^   )ÚcÚsr`   z3D sample; physical aspectrd   zX (ÚmmÚnativeÚ)zZ (zXZ broadsidezY (zXY plang
×£p=
ç?)r”   Úshrinkrf   ÚframezCAD millimetre frameú: Ú,u    points â€” çR¸…ëQð?©ÚyÚdiagnostic_post_processFzaDiagnostic post-process scan in its native unregistered frame; it is not a CAD-aligned predictor.zˆDeterministic CAD surface samples with triangle/barycentric correspondence. Scalar is geometric curvature, not stress or a defect label.)r0   rh   r&   r'   ÚindexÚ	ones_likeÚboolÚzerosr8   rL   ri   rl   ÚwhereÚnanrA   Úscatterr—   rr   rq   Ú
set_xlabelru   rv   r   r,   rw   rO   )rx   ry   rz   Úpkeyr•   r   r/   Újr*   rf   ÚvalidrN   Úa0Úa1Úa2ÚcolorÚkwÚimr¬   Ú
diagnostics                       r   Úplot_pointsrÅ   a   s€  € Ø 1‘}‰8¨,€D¸A¸d¹G¸Ü�A—E‘E˜/¬2¯:©:°b«>Ó:Ó;€EØ	�‰ˆc‹
€AØ# uÑ,Ø�K‰KÐ4Ó5ˆ¸qÂÀ1À¹v°uÐOkÀuØ—‘�o¤r§|¡|°A´tÓ'<Ó=ºaÀ¸cÑB‰Ø	" eÑ	+Ø�K‰KÐ1Ó2ˆ¸AºaÀ¸c¹F°EÐLpÀEØ—‘�o¤r§|¡|°A´tÓ'<Ó=ºaÀ¸cÑB‰Ü "§¡¬¨Q«Ó 0´"·(±(¼3¸q»6Ä$Ó2GÐI_˜�ˆ%Ü
�*‰*˜YÔ
'€C¨c¯o©o¸aÀÀ!ÐPT¨oÓ.U¨ÐZ]×ZiÑZiÐjkÐlmÐnoÓZpÐWYÐux÷  vEñ  vEð  FGð  HIð  JKó  vLÐrtÜ�H‰H�U˜E¤2§6¡6Ó*€E´¸UÀ5¹\Ó1J¨BØ€B‡J�Jˆq’�1�‰v�aš˜!˜‘f˜Qšq ˜s™VÐI u°¸ÑIÀbÒIÌ>ÐZ\Ð]^ÔK_Ðac×amÑamð  oKô  bLØ	ˆ�‰�A’a˜�c‘F˜1šQ˜q˜S™6Ð	G U¨b°yÑ	GÀBÑ	G€BÈÏÉÐW^ÔI_Ðac×anÑanÐqtð  ~Bð  DLò  ~LÑuyð  RZð  u[ð  [\ð  p]ô  b^ð  `b÷  `mñ  `mð  psð  |@ð  BJò  |Jñ  txð  PXð  sYð  YZð  n[ô  `\ð  ^`÷  ^jñ  ^jð  kyô  ^zØ€B‡J�Jˆq’�1�‰v�aš˜!˜‘fÐB ¨°)ÑB¸rÒBÀBÇMÁMÐRYÔDZÐ\^×\iÑ\iÐloÐx|ð  Gò  yGÑptð  MUð  pVð  VWð  kXô  ]Yð  []÷  [hñ  [hð  knð  w{ð  }Eò  wEñ  osð  KSð  nTð  TUð  iVô  [Wð  Y[÷  Yeñ  Yeð  foô  YpØ‡L�L�˜˜B˜r˜
¨3°e€LÔ<Ø'.°!¡|ŒC”�q˜‘zÓ"Ô#Ð9O€EØ‡L�L�E�7˜"œS ›V A˜J l°5°'Ð:¸d€LÔCÄTÈ#ÈcÄ]Ü”f˜QŸU™UÐ#<¸eÓDÓEÓF€JÙs}Ðoð Xð WðXr   c           
     óæ  — | d   | d   }}t        | d   «      }d|v r|j                  d«      nd}| j                  dt        j                  |t
        «      «      d d …|f   }t        j                  ||d d …|f   t        j                  «      }t        j                  d¬«      }	|	j                  d	d
d	d¬«      }
|	j                  d	d
d
«      }t        |||f   «      } |
j                  |d d …df   |d d …d	f   |d d …d
f   fd|ddœ|¤Ž}t        |
t        j                  t        j                  d«      t        j                   | d   «      g«      «       |
j#                  d«        |j                  |d d …df   |d d …d
f   fd|ddœ|¤Ž |j%                  d«       |j'                  d«       |j)                  d«       |j#                  d«       |	j+                  ||
|gd¬«       t-        t/        | j                  dt        j                  «      «      «      }t        j                   | d   «      j1                  «       }|	j3                  |› dt5        |«      d›d|› d|d›d�d ¬!«       t7        |	|«       y")#NÚvoxel_coordsr/   r›   rR   r   r�   )é   é   r¡   r   rY   r£   r¤   é   rc   ©r§   r¦   r`   r¢   Ú	grid_dimsúoccupied surface voxelsrd   zvoxel Xzvoxel ZzXZ occupied surface projectionrg   ©r”   rf   Úvoxel_pitch_mmr­   r®   z occupied surface voxels; grid z, pitch z.4gz mmr¯   r°   zjSurface-only triangle-sampled occupancy, not filled-solid occupancy, SDF, thickness, or an interior field.)r0   r³   rh   r&   r´   rµ   r·   r¸   rL   ri   rl   rA   r¹   r—   Úvstackr¶   r'   rr   rq   rº   ru   rv   r6   r,   r.   rw   r8   rO   )rx   ry   rz   r¦   r/   r   r¼   r½   ÚvalrN   r¾   r¿   rÂ   rÃ   ÚpitchÚdimss                   r   Úplot_sparse_voxelsrÔ   y   s¿  € Øˆ^Ñ˜a ™f€q€A¬g°a¸Ñ6HÓ.I eØ5QÐUZÑ5Zˆ�‰Ð0Ô1Ð`a€AØ�E‰E�/¤2§<¡<°´$Ó#7Ó8º¸1¸Ñ=€EÄ2Ç8Á8ÈEÐRSÒTUÐVWÐTWÑRXÔY[×Y_ÑY_ÓC`¸sÜ�
‰
˜6Ô"€C s§¡°q¸¸1È Ó'M BÐRU×RaÑRaÐbcÐdeÐfgÓRhÈrÜ�1�U˜1�W‘:Ó€B : 2§:¡:¨a²°!°©f°Q²q¸°s±V¸AºaÀ¸c¹FÐ#_ÀQÈÐRYÑ#_Ð\^Ñ#_ ÔaoÐprÔsu×s|Ñs|ô  A÷  Gñ  Gð  HIó  Jô  KM÷  KUñ  KUð  VWð  Xcñ  Vdó  Keð  ~fó  tgô  bhð  jl÷  jvñ  jvð  wPô  jQØ€B‡J�Jˆq’�1�‰v�aš˜!˜‘fÐ9˜q 3¨GÑ9°bÒ9¸2¿=¹=ÈÔ;QÐSU×S`ÑS`ÐajÔSkÐmo×mzÑmzð  |Eô  nFð  HJ÷  HTñ  HTð  Uuô  HvØ‡L�L�˜˜2�wÐ%R€LÔSÜ
”�q—u‘uÐ-¬r¯v©vÓ6Ó7Ó
8€E¼r¿z¹zÈ!ÈKÉ.Ó?Y×?`Ñ?`Ó?b¸$Ø‡L�L�E�7˜"œS ›V A˜JÐ&EÀdÀVÈ8ÐTYÐZ]ÐS^Ð^aÐbÐei€LÔjÔlpÐqtÐuxÔlyØwr   c                ó   — | d   }t        | d   «      }d|v r|j                  d«      nd}d|v r|j                  d«      n|}||   dkD  }t        j                  |«      }||   |   }	t	        j
                  d¬«      }
|
j                  dd	dd
¬«      }|
j                  dd	d«      }|
j                  dd	d	«      } |j                  |d d …df   |d d …df   |d d …df   fd|	ddœt        |	«      ¤Ž}t        |t        j                  t        j                  d	«      t        j                  | d   «      g«      «       |j                  d«       |j                  d   dz  } |j                  t        j                   j#                  |d d …|d d …f    ||d d …|d d …f   «      fddit        |	«      ¤dddœ¤Ž |j                  d|› �«       |j%                  d«       |j'                  d«       |j                  |j)                  d¬«      ddd¬«       |j                  d«       |j%                  d«       |j'                  d«       |
j+                  |||gd¬«       |
j-                  |› dt/        |j                  «      › d �d!¬"«       t1        |
|«       y#)$Nr/   r›   Úsurface_occupancyr   rR   )é   r    r¡   r   r¢   r£   r¤   rY   rÉ   rc   rË   rÌ   rÍ   r`   Úlowerrd   )rb   Úaspectzcurvature XZ slice y=zZ voxelzX voxelr�   ÚGreys)r`   rb   rÙ   zsurface occupancy XZ projectionrœ   rÎ   z: dense tensor z; surface-onlyr¯   r°   zjBounded dense tensor with surface occupancy only; it is not a filled CAD solid or a signed-distance field.)r0   r³   r&   ÚargwhererL   ri   rl   r¹   rA   r—   rÐ   r¶   r'   rr   Úshaperp   rn   ro   rº   ru   r9   rv   rw   ÚlistrO   )rx   ry   rz   r/   r   ÚoccÚcurÚoccupiedÚcoordsr<   rN   r¾   r¿   rÀ   rÃ   r±   s                   r   Úplot_dense_voxelsrâ   †   s™  € Øˆ�f€A”G˜A˜oÑ.Ó/ˆeÐYlÐpuÑYu°U·[±[ÐATÔ5UÐ{|°Ø5QÐUZÑ5Zˆ�‰Ð0Ô1Ð`c€CØˆs‰V�A‰X€HœbŸk™k¨(Ó3�v¸A¸c¹FÀ8Ñ<L°VÜ�
‰
˜8Ô$€C¨¯©¸¸1¸QÈ$¨Ó)O bÐTW×TcÑTcÐdeÐfgÐhiÓTjÐQSÐor×o~Ño~ð  @Að  BCð  DEó  pFÐlnØ€r‡z�z�&š˜1˜‘+˜f¢Q q S™k¨&²°1°©+Ðf¸¸FÈÑfÔR]Ð^dÓReÑf€BÔhvÐwyÔz|÷  {Dñ  {Dô  FH÷  FNñ  FNð  OPó  FQô  RT÷  R\ñ  R\ð  ]^ð  _jñ  ]kó  Rlð  Emó  {nô  ioð  qs÷  q}ñ  q}ð  ~Wô  qXØ‡g�gˆa�j�!�m€A�Y�R—Y‘YœrŸu™u×1Ñ1°8ºA¸aÂ¸E±?Ð2BÀ1ÀSÊÈ1ÊQÀYÁ<ÓPñ  SÐV]ð  SÔ`kÐlrÓ`sð  Sð  |Cð  KRô  Sð  UW÷  Uañ  Uað  dyð  z{ð  y|ð  b}ô  U~ð  @B÷  @Mñ  @Mð  NWô  @Xð  Z\÷  Zgñ  Zgð  hqô  ZrØ‡I�Iˆh�l‰l ˆlÓ"¨°wÀg€IÔNÐPR×P\ÑP\Ð]~ÔPð  BD÷  BOñ  BOð  PYô  BZð  \^÷  \iñ  \ið  jsô  \tØ‡L�L�˜˜2�wÐ%A€LÔBÀCÇLÁLÐTYÐSZÐZiÔjnÐop×ovÑovÓjwÐixð  yGð  RHð  KOÀLô  EPô  RVð  WZð  [^ô  R_Øwr   c                ó–  — | dz  }|j                  «       sy 	 t        j                  |j                  d¬«      «      j	                  dg «      D ])  }|d|j	                  d«      › �k(  sŒt        |d   «      c S  	 t        |j                  dd«      d   «      S # t        j                  t        t        f$ r Y Œ>w xY w# t        $ r Y y w xY w)	Nz
index.jsonúutf-8©ÚencodingÚresolutionsÚgraph_Úrequested_node_budgetÚ_r   )ÚexistsÚjsonÚloadsÚ	read_textrh   ÚintÚJSONDecodeErrorÚKeyErrorÚ	TypeErrorÚrsplitÚ
ValueError)Ú
family_dirÚstemÚidxr�   s       r   Úgraph_requestedrø   ’   s¸   € Ø�<Ñ€CØ�:‰:Œ< ð=Ü—:‘:˜cŸm™m°W˜mÓ=Ó>×BÑBÀ=ÐQSÖTˆCØ˜ §¡Ð(?Ó @ÐAÐBÓBÌ3ÈsÐSjÑOkÓKlÒDlñ Uô �D—K‘K  AÓ& qÑ)Ó*Ð	*øô × Ñ ¤(¬IÐ6Ò<¹Ð<ûäÒ"™dÐ"ús0   ˜AB Á(B Á8B Á:B< ÂB9Â8B9Â<	CÃCc           
     ó  — | d   }| d   }| d   }t        | j                  dt        j                  g «      «      «      }| j                  dt        j                  |t
        «      «      }t        |«      D �	�
cg c]  \  }	}
d|
v sŒ|	‘Œ }}	}
|s"t        |«      D �	�
cg c]  \  }	}
d|
v sŒ|	‘Œ }}	}
|r|d   nd}|d d …|f   }t        j                  ||d d …|f   t        j                  «      }t        j                  d	d
d¬«      \  }}t        j                  ||d      d d …dd
gf   ||d	      d d …dd
gf   gd	¬«      }|d   j                  t        |ddd¬«      «       |d   j                  |d d …df   |d d …d
f   d	d¬«       |d   j                  «        |d   j!                  d«       |d   j#                  d«       |d   j%                  d«       |d   j'                  d«        |d	   j                  |d d …df   |d d …d
f   ft)        ddt+        |«      z  «      |ddœt-        |||f   «      ¤Ž}|d	   j!                  d«       |d	   j#                  d«       |d	   j%                  d«       |d	   j'                  d«       |j/                  ||d	   |r||   nd› ¬«       |j1                  |› d|�|nd › d!t+        |«      d"›d#|j2                  d	   d"›d$�d%¬&«       t5        ||«       d'|r||   › d)�S d(› d)�S c c}
}	w c c}
}	w )*Nr™   Ú
edge_indexr/   r›   r�   Úanalytic_k1Úmean_curvaturer   r   rY   )é   rÉ   r¡   r�   z#386a8cg333333Ã?g¸…ëQ¸Þ?©ÚcolorsÚ
linewidthsÚalphaz#13283a©r§   r¦   rd   úX (mm)úZ (mm)z topology wireframe, XZ broadsideg333333ã?i¸  rc   rË   z-source-mapped curvature; gray/white = invalidÚ	curvaturerÎ   z: requested Úunknownz nodes; actual r®   z; z directed edgesr¯   r°   z@Topology uses the exported edge_index. Curvature panel displays za scalarzH only where its source-valid mask is true; no physical label is implied.)r0   rh   r&   r'   r´   rµ   rm   r·   r¸   rL   ÚsubplotsÚstackÚadd_collectionr   r¹   Ú	autoscalerq   rº   ru   rr   r9   r8   rA   rv   rw   rÜ   rO   )rx   ry   rz   Ú	requestedr•   Úer/   r   r½   r‡   ÚnÚ
candidatesr¼   ÚvvrÑ   rN   r”   ÚedgesrÃ   s                      r   Ú
plot_graphr  �   s�  € Øˆ�k€A�Q�|‘_�1¨¨#© a´g¸a¿e¹eÀOÔTV×T^ÑT^Ð_aÓTbÓ>cÓ6d°Ðlm×lqÑlqð  sBô  CE÷  COñ  COð  PQô  RVó  CWó  mXÐfkä& uÔ-ÔDÑ-‘c�a˜°À!Ò1C’Ð-€JÑDÙ´	¸%Ô0@Ô"ZÑ0@©¨¨1ÐDTÐXYÒDY¢1Ð0@�zÑ"ZÙ!€j�‚m q€AØŠQˆqˆS�z€B”r—x‘x  1¢Q q S¡6¬"¯&©&Ó1�3Ü�<‰<˜˜! FÔ+�F€CˆÜ
�(‰(�A�a˜‘d‘GšA˜q ˜e˜GÑ$ a¨¨!©¡gªa°°1°¨gÑ&6Ð7¸QÔ
?€EØ€q�E×Ñœ¨°YÈ#ÐTWÔXÔYÐ[]Ð^_Ñ[`×[hÑ[hÐijÒklÐmnÐknÑioÐpqÒrsÐtuÐruÑpvÐyzð  ~GÐ[hô  \Hð  JLð  MNñ  JO÷  JYñ  JYô  J[ð  ]_ð  `añ  ]b÷  ]mñ  ]mð  nuô  ]vð  xzð  {|ñ  x}÷  xHñ  xHð  IQô  xRð  TVð  WXñ  TY÷  Tdñ  Tdð  emô  Tnð  prð  stñ  pu÷  pñ  pð  @bô  pcØ€rˆ!�u‡}�}�Q’q˜�s‘V˜Aša ˜c™FÐd¤S¨¨T´#°a³&©[Ó%9¸CÀWÑdÌ{Ð[\Ð]_Ð`aÐ]aÑ[bÓOcÑd€BÐfhÐijÑfk×fvÑfvÐw~Ôfð  BDð  EFñ  BG÷  BRñ  BRð  S[ô  B\ð  ^`ð  abñ  ^c÷  ^nñ  ^nð  owô  ^xð  z|ð  }~ñ  z÷  zIñ  zIð  Jyô  zzØ‡L�L��r˜!‘u±% e¨A¢h¸[Ð%I€LÔKØ‡L�L�E�7˜,°IÐ4I¡yÈyÐ&YÐYhÔilÐmnÓioÐpqÐhrÐrtÐuv×u|Ñu|Ð}~Ñuð  ABð  uCð  CRð  Sð  VZ€Lô  [ô  ]að  beð  fiô  ]jØMÑZ_ÈeÐTUÉhÐMpð  qyð  zð  zÐeoÐMpð  qyð  zð  zùó EùÛ"Zs   Á6K;ÂK;ÂLÂ'Lc                óœ	  — | d   | d   }}| d   }| d   }| d   }t        j                  t        |«      df«      }t        j                  |d¬«      }	t	        t        |«      «      D ].  }
||
   ||
      }t        |«      r|j                  d	«      nd	||
<   Œ0 t        j                  d
¬«      }|j                  ddd«      }| j                  d«      }t        |	 j                  «       «      }|�Ë|j                  d   r¼|	|d	      |	|d      z  }t        j                  ||d	|f      d d …d	dgf   ||d|f      d d …d	dgf   gd¬«      }|j                  t        |ddd¬«      «       |j!                  ||	d	f   ||	df   dd¬«       d|j                  d   d›dt        |j                  «       «      d›d|› d�}n%|j!                  |d d …d	f   |d d …df   dd¬«       d}|j#                  «        |j%                  d«       |j'                  d«       |j)                  d«       |j+                  d«       t-        | j                  d t        j.                  d!gt        |«      z  «      «      «      }| j                  d"t        j0                  t        |«      «      «      }g }t2        j5                  |«      D ]u  }t        j6                  t        j.                  |«      |k(  «      d	   }t        |«      r*|j9                  |t        j:                  ||   «         «       t        |«      d#k(  sŒu n t        j<                  d$«      j?                  «       }|jA                  d%«       t	        dd&«      D �
cg c]  }
|j                  dd|
«      ‘Œ }}
|d d …d d …d d …d	f   ||z     }tC        |«      }t-        | j                  d't        j.                  d(g«      «      «      d	   }d }tE        ||«      D ]Œ  \  }}t         jF                  jI                  ||   ||   z   ||d d …d d …d	f   «      }  |jJ                  | fd)|i|¤Ž}|j'                  d*|› d+||   › d,�«       |jM                  g «       |jO                  g «       ŒŽ |�|jQ                  ||d-d.|› d/�¬0«       |jS                  |› d+t        |«      d›d1|› �d2¬3«       tU        ||«       |› d4|› d5�S c c}
w )6Nr™   Ú
trim_validÚnormal_validr  rS   r¢   )r   rY   r�   r   )é   é   r¡   rY   r   rú   z#497b96g¸…ëQ¸¾?gáz®GáÚ?rþ   g      à?z#172b3ar  zreal directed face adjacency: r®   z edges (z drawable); z. faces without UV samples omitted from previewz+no positive adjacency exported; points onlyrd   zface-centroid graph, XZ (mm)r  r  Úsurface_kindÚ Úface_area_mm2rÉ   rc   z#d7dde5rZ   Úcurvature_feature_namesÚcurvature_channel_0r`   zface r­   z-
trim+curvature-valid UV grid (gray = masked)g×£p=
×ã?ç{®Gáz”?z (1/mm), shared scale)r”   r«   Úpadrf   z STEP B-Rep faces; g®Gáz®ï?r°   z3; original edge_index is unchanged. UV panels show z… (1/mm) with a shared numeric scale and actual trim/curvature-valid masks; they are geometric fields, not thermal/stress/defect maps.)+r&   r¶   r8   Úanyrk   ÚmeanrL   ri   rl   rh   rï   ÚsumrÜ   r  r	  r   r¹   r
  rq   rr   rº   ru   r0   r'   ÚonesÚdictÚfromkeysr·   ÚappendÚargmaxÚget_cmapÚcopyÚset_badrA   Úziprn   ro   rp   rs   rt   rv   rw   rO   )!rx   ry   rz   ÚposÚtrimÚ	normal_okr|   Úcurv_okÚcentÚcentroid_validr‡   r>   rN   r¾   ÚedgeÚomittedÚkeepÚsegÚnoteÚkindsÚareaÚchosenÚkindÚidsÚuv_cmapÚuv_axesÚ	uv_valuesÚuv_limÚfeature_nameÚlast_imr+   Úface_idÚdatas!                                    r   Ú	plot_breprB  ­   s£  € Ø�‰k˜!˜L™/ˆ€C°Q°~Ñ5F¨9ÈQÈ{É^ÈÐefÐgxÑeyÐ]dÜ	�‰”3�s“8˜A�,Ó	€DÜ—6‘6˜$ EÔ*€NÜ”3�s“8Ž_ˆØ
ˆa‰&��a‘‰/ˆ´°A´ 1§6¡6¨!¤9¸A˜4 š7ð ä�
‰
˜6Ô"€C s§¡°q¸¸1Ó'= BÀAÇEÁEÈ,ÓDW¸tÜ�N�?×'Ñ'Ó)Ó*€GØÐ˜DŸJ™J qšMØ˜D ™GÑ$ ~°d¸1±gÑ'>Ñ>ˆÜ�H‰H�d˜4  $ ™<Ñ(ª¨A¨a¨5¨Ñ1°$°t¸A¸d¸F±|Ñ2DÂQÈÈ!ÀuÀWÑ2MÐNÐTUÔVˆÐXZ×XiÑXiÔjxÐy|ð  ENð  Z]ð  dgô  khô  YiØ
�
‰
�4˜ qÐ(Ñ)¨$¨~¸aÐ/?Ñ*@À2È	ˆ
ÔRÐ[yÐz~÷  {Eñ  {Eð  FGñ  {Hð  IJð  zKð  KSô  TWð  X\÷  X`ñ  X`ó  Xbó  Tcð  deð  Sfð  frð  szð  r{ð  {ið  ZjÑTXà
�
‰
�4š˜!˜‘9˜T¢! A #™Y¨¨iˆ
Ô8Ð?l¸$Ø‡L�L„N�B—M‘M 'Ô*¨B¯L©LÐ9WÔ,XÐZ\×ZgÑZgÐhpÔZqÐsu÷  tAñ  tAð  BJô  tKÜ
�!—%‘%˜¤r§z¡z°2°$´s¸3³x±-Ó'@ÓAÓ
B€EÈÏÉÈÔ_a×_fÑ_fÔgjÐknÓgoÓ_pÓIqÀDØ€FÜ—‘˜eÖ$ˆÜ�H‰H”R—Z‘Z Ó&¨Ñ,Ó-¨aÑ0ˆÜˆsŒ8�V—]‘] 3¤r§y¡y°°c±Ó';Ñ#<Ô=Üˆv‹;˜‹>™5ð %ô �L‰L˜Ó!×&Ñ&Ó(€G¨'¯/©/¸)Ô*DÜ-2°1°Q¬ZÓ8©Z¨ˆS�_‰_˜Q˜q Õ#¨Z€GÐ8Ø’1’Q’q˜�7‰m˜D ™LÑ)€IÜ�yÓ!€F´¸¿¹Ð>WÔXZ×XbÑXbÐdyÐczÓX{Ó8|Ó0}Ð~ñ  1A <Ø€GÜ˜ Ö(‰	ˆˆ'Ü�U‰U×Ñ $ w¡-°¸Ñ0@Ñ"@Ð AÀ$ÀwÊqÒQRÐSTÀ}ÑBUÓVˆÐ`hÐ`a×`hÑ`hÐimñ  aEÐszð  aEð  ~Dñ  aEÐX_ð  GH÷  GRñ  GRð  UZð  [bð  Zcð  ceð  fkð  lsñ  ftð  euð  ucð  Sdô  Geð  gh÷  gsñ  gsð  tvô  gwð  xy÷  xDñ  xDð  EGõ  xHð )àÐ˜CŸL™L¨°GÀ3È3ÐXdÐWeÐezÐU{˜LÔ|Ø‡L�L�E�7˜"œS ›X a˜LÐ(;¸D¸6ÐBÀS€LÔIÌ4ÐPSÐTWÌ=ØˆVÐFÀ|Ànð  UZð  [ð  [ùò 9s   Í*S	c           	     óp  — | d   j                  t        «      }t        | d   «      }t        | d   «      }t        j                  dt        dt        |«      dz  «      f¬«      \  }}|j                  |j                  dd	d
d¬«      }|j                  t        t        |«      «      |«       |j                  t        t        |«      «      |d¬«       |j                  d«       |j                  d«       |j                  ||d	d
gd¬«       |j                  |› dt        |«      › d�d¬«       t!        ||«       y)NÚprocess_feature_validÚprocess_feature_namesÚrun_idr×   rZ   g
×£p=
Ç?r¡   ÚBluesr   r   Úauto)r`   r3   r4   rÙ   r\   )ÚfontsizeÚrunz:process-channel availability (not magnitude; units differ)zmissing / observed)r”   Úticksrf   r­   z raw process channelsg)\�Âõ(ð?r°   z¬PNG is an availability grid, intentionally not a raw-value bar chart because process channels have unlike units. The gallery table shows values, units, and missing markers.)Úastyper6   r0   rL   r  r9   r8   rp   ÚTrs   rk   rt   rº   rr   rv   rw   rO   )	rx   ry   rz   Úpresentr   ÚrunsrN   r”   rÃ   s	            r   Úplot_tabularrP  Î   sB  € ØÐ%Ñ&×-Ñ-¬eÓ4€G¼GÀAÐF]ÑD^Ó<_°eÔfmÐnoÐpxÑnyÓfzÐaeÜ�<‰< ¤C¨¬#¨e«*°S©.Ó$9Ð :Ô;�F€CˆÀÇ	Á	È'Ï)É)ÐY`ÐfgÐmnÐv|À	Ó@}¸RØ‡M�M”%œ˜D›	Ó" 4Ô(¨"¯-©-¼¼cÀ%»jÓ8IÈ%ÐYZ¨-Ô*[Ð]_×]jÑ]jÐkpÔ]qÐsu×sÑsð  A}ô  t~Ø‡L�L��r  1 Ð,@€LÔAÀ3Ç<Á<ÐSXÐRYÐY[Ô\_Ð`eÓ\fÐ[gÐg|ÐP}ð  AEÀ<ô  DFô  HLð  MPð  QTô  HUð zr   c           
     ó`  — t        j                  d¬«      \  }}|j                  d«       |dg| j                  «       D ��cg c],  \  }}|› dt	        |j
                  «      › d|j                  › �‘Œ. c}}z   }|j                  ddd	j                  |«      d
d¬«       t        ||«       yc c}}w )N)é
   rÊ   r¡   Úoffz3No specialized visualizer applies; exported arrays:r­   Ú r  g¸…ëQ¸î?Ú
ÚtopÚ	monospace)ÚvaÚfamilyzArray inventory preview.)
rL   r  r�   ÚitemsrÝ   rÜ   r2   ÚtextÚjoinrO   )rx   ry   rz   rN   r”   ÚkÚvÚliness           r   Úplot_fallbackr`  Ö   s  € Ü�<‰< Ô'�F€Cˆ¨¯©°¬ÀÐF{Ð?|ð  lm÷  lsñ  lsô  luô  ~vñ  luñ  ehð  efð  ghð  BCð  ADð  DFô  GKð  LM÷  LSñ  LSó  GTð  FUð  UVð  WX÷  W^ñ  W^ð  V_ò  `ð  luò  ~vñ  @v¸Ø‡G�GˆC��D—I‘I˜eÓ$¨°[€GÔAÄ4ÈÈCÄ=ÐYsùó ~vs   Á1B*c                óÐ  ‡‡‡	— d| vryt        | d   «      }t        | d   «      Š| d   Š	| d   Šdj                  ˆˆˆ	fd„t        |«      D «       «      }dj                  d„ ‰D «       «      }t        | d   «      }| d	   d
   }dj                  d„ t        ||«      D «       «      }d|› d|› d|› dt	        j
                  t        t        | j                  dd«      «      «      «      › d�	S )NÚ	process_xr  rE  rF  rD  c           
   3  óÀ   •‡K  — | ]T  \  Š}d t        j                  |«      z   dz   dj                  ˆˆˆfd„t        t	        ‰«      «      D «       «      z   dz   –— ŒV y­w)ú<tr><td>ú</td>r  c              3  ó’   •K  — | ]>  }d ‰|‰f   r-t        j                  t        t        ‰|‰f   «      d«      «      nd› d�–— Œ@ y­w)z<td>ú.7gz"<span class="muted">missing</span>re  N)ÚhtmlÚescapeÚformatr6   )Ú.0r‡   r¼   r}   r/   s     €€€r   Ú	<genexpr>z'table_html.<locals>.<genexpr>.<genexpr>Þ   su   øè ø€ ð  >Gñ  vFð  qrÀÐqsÐtuÐvwÐtwÒqxÄTÇ[Á[ÔQWÔX]Ð^_Ð`aÐbcÐ`cÑ^dÓXeÐfkÓQlÔEmð  eð  Efð  fkô  ?lñ  vFùs   ƒAAz</tr>N)rh  ri  r\  rk   r8   )rk  rˆ   r¼   r}   rO  r/   s     @€€€r   rl  ztable_html.<locals>.<genexpr>Þ   s“   ùè ø€ ð  oñ  ^nñ  TZð  TUð  VZ�œDŸK™K¨Ó-Ñ-¨gÑ5°b·g±gõ  >Gô  v{ô  |ð  @Dó  |Eô  vFó  >Gó  7Gñ  Gð  HOõ  Oñ  ^nùs   „AAc              3  óN   K  — | ]  }d t        j                  |«      › d�–— Œ y­w)z<th>z</th>N)rh  ri  )rk  rJ  s     r   rl  ztable_html.<locals>.<genexpr>ß   s$   è ø€ Ð@¹4°C�4œŸ™ CÓ(Ð)¨Ô/¹4ùs   ‚#%Úgeometry_feature_namesÚ
geometry_xr   c              3  ón   K  — | ]-  \  }}d t        j                  |«      › dt        |«      d›d�–— Œ/ y­w)rd  z	</td><td>rg  z
</td></tr>N)rh  ri  r6   )rk  r  r^  s      r   rl  ztable_html.<locals>.<genexpr>á   s8   è ø€ ÐmÑZlÑSVÐSTÐUV�HœTŸ[™[¨›^Ð,¨I´e¸A³h¸s°^À:ÔNÑZlùs   ‚35zV<h2>Raw process vectors (channel [unit])</h2><table><thead><tr><th>channel [unit]</th>z</tr></thead><tbody>zw</tbody></table><h2>Fixed CAD geometry summary</h2><table><thead><tr><th>feature</th><th>value</th></tr></thead><tbody>z</tbody></table><p class=muted>Úsplit_metadataz</p>)	r0   r\  rm   r)  rh  ri  r   r,   rh   )
rx   r   ÚrowsÚheadÚ	geo_namesÚgeoÚgrowsr}   rO  r/   s
          @@@r   Ú
table_htmlrw  Û   so  ú€ Ø˜!Ñ BÜ
�!Ð+Ñ,Ó
-€E´G¸A¸h¹KÓ4H¨tÈAÈkÉNÈ!Ð_`ÐaxÑ_yÐ\^Ø	�‰õ  oô  ^gð  hmô  ^nó  oó  
o€DØ	�‰Ñ@¹4Ó@Ó	@€DÜ�aÐ0Ñ1Ó2€I¸¸,¹ÈÑ8J°CØ
�'‰'ÑmÔZ]Ð^gÐhkÔZlÓmÓ
m€EØcÐdhÐciÐi}ð  Cð  ~Dð  D{ð  |Að  {Bð  Baô  bf÷  bmñ  bmô  nqô  rxð  yz÷  y~ñ  y~ð  Oð  PRó  ySó  rTó  nUó  bVð  aWð  W[ð  \ð  \r   c                óÄ  — t        j                  |d¬«      5 }|j                  D �ci c]  }|||   “Œ
 }}d d d «       ||j                  › d�z  }| › d|j                  › �}| dk(  rt        ||«      }	nª| dk(  rt        ||«      }	n—| dk(  rdv rt        |||«      nt        |||«      }	ns| d	k(  r#t        ||t        ||j                  «      «      }	nK| d
k(  rt        ||«      }	n8| dk(  rt        ||«      }	n%| dk(  r|j                  «       rd}	nt        ||«      }	|j                  d«      }
|j                  |
j                  «       r|
j                  nd d|j                  z   |	j!                  «       D ��ci c]1  \  }}|t#        |j$                  «      t'        |j(                  «      dœ“Œ3 c}}dœ}|| dk(  rt+        |«      fS dfS c c}w # 1 sw Y   �Œ›xY wc c}}w )NF)Úallow_picklez.pngr­   r	   r   r
   rÇ   r   r   r   r   uœ   STEP/XLS inputs matched to the fused PLY outcome and defect CSV. Includes 2Ã—17 heater maps, provisional CAD overlays, scan residuals, and weak area labels.z.schema.jsonzvisualizations/)rÜ   r2   )Ú
source_npzÚschemaÚpreviewÚdescriptionÚarraysr  )r&   ÚloadÚfilesrö   rˆ   r�   rÅ   rÔ   râ   r  rø   rB  rP  rë   r`  Úwith_suffixrZ  rÝ   rÜ   r   r2   rw  )rY  ÚnpzÚ
visual_dirrõ   Úrawr]  rx   r|  rz   r}  r{  r^  Úentrys                r   Ú
render_oner†  å   sR  € Ü	�‰� %Õ	(¨CÀcÇiÂiÓ3PÁiÀ°A°c¸!±f±HÀi°Ð3P×	(Ø˜#Ÿ(™(˜ 4Ð(Ñ(€G°6°(¸"¸S¿X¹X¸JÐ0G¨%ØˆxÒ¤[°°7¸5Ó%A™Ø	�Ò	¤{°1°W¸UÓ'C™;Ø	�Ò	ÈnÐ`aÑNaÔ'9¸!¸GÀEÔ'JÔgxÐyzð  |Cð  DIó  hJ™;Ø	�Ò	¤z°!°G¸EÄ/ÐR\Ð]`×]eÑ]eÓBfÓ'g™;Ø	�Š¤Y¨q°¸Ó%?™Ø	�Ò	¬°Q°w¸uÓ(E™KØ	�Ò	˜gŸn™nÔ.ð s‰Ü# A g¨eÓ4ˆ+Ø�?‰?˜>Ó*€FØŸ™¸¿¹¼¨&¯+ª+ÈdÐ]nÐov×o{Ño{Ñ]{ð  KVð  [\÷  [bñ  [bô  [dô  `eñ  [dñ  TWð  TUð  VWð  abô  lpð  qr÷  qxñ  qxó  lyô  BEð  FG÷  FMñ  FMó  BNñ  cOñ  aOð  [dò  `eñ  f€EØ 6¨9Ò#4”*˜Q“-Ð<Ð<¸"Ð<Ð<ùò 4Q×	(Ñ	(üó `es!   ˜G§G
´GÅ96GÇ
GÇGc                óH  — | dz  |z  }g }|D ]»  }dt        j                  |d   «      › d�}|d   r|dt        j                  |d   «      › d�z  }|j                  dt        j                  |d   «      › d	t        j                  |d
   «      › d|› dt        j                  |d   «      › dt        j                  |d   «      › d�«       Œ½ |dk(  rdnd}d|› dt        › dt        j                  |«      › d|› dj	                  |«      › |› d�}	|dz  j                  |	d¬«       y )NÚdata_processedú	<a href="rz  z">raw NPZ</a>r{  u    Â· <a href="z">schema</a>z<section class="card"><h2>z</h2><p>r}  z</p><p>z</p><img src="r|  z" alt="preview for z"></section>r   z`<p><a href="../../results/graphs/viewer.html">Open existing interactive graph comparison</a></p>r  z,<!doctype html><meta charset="utf-8"><title>z gallery</title><style>uO   </style><main><p><a href="../index.html">â†� all processed families</a></p><h1>z gallery</h1>ú</main>ú
index.htmlrä   rå   )rh  ri  r$  ÚCSSr\  Ú
write_text)
ÚrootrY  ÚentriesÚtabular_detailÚ	directoryÚcardsr  ÚlinksÚextrar[  s
             r   Úfamily_pager•  ö   s  € ØÐ#Ñ# FÑ*€I°"¨EÛˆØœ$Ÿ+™+ a¨¡oÓ6Ð7°}ÐEˆØˆXŠ;˜ ¬t¯{©{¸1¸X¹;Ó/GÐ.HÈÐUÑU˜Ø�‰Ð1´$·+±+¸aÀ¹oÓ2NÐ1OÈxÔX\×XcÑXcÐdeÐfsÑdtÓXuÐWvÐv}ð  Dð  ~Eð  ESô  TX÷  T_ñ  T_ð  `að  bkñ  `ló  Tmð  Snð  nAô  BF÷  BMñ  BMð  NOð  P\ñ  N]ó  B^ð  A_ð  _kð  lõ  	mð ð syð  {Cò  sCÑnð  IK€EØ7¸°xÐ?VÔWZÐV[ð  \kô  lp÷  lwñ  lwð  x~ó  lð  k@ð  @Mð  NSð  MTð  UW÷  U\ñ  U\ð  ]bó  Ucð  Tdð  esð  dtð  t{ð  
|€DØˆ|Ñ×'Ñ'¨°gÐ'Õ>r   c                ó¬  — ddddddddœ}d	}|j                  «       D ]�  \  }}|j                  |«      }| d
z  |z  dz  t        |«      z  }|j                  «       r>d|› d|› dt	        j
                  t        |«      «      › dt	        j
                  |«      › d�	nd	}|d|› d|› d|› d|› d�	z  }Œ‘ dt        › d|› d�}	| d
z  dz  j                  |	d¬«       y )Nzcad_multiview_256.pngzcad_surface_sparse_64.pngzcad_surface_points.pngzgraph_12000.pngzfaces_uv.pngzprocess_and_geometry.pngz18h01_cad_ply_targets.pngr   r  rˆ  Úvisualizationsr‰  z%/index.html"><img class="thumb" src="z/visualizations/z" alt="z preview thumbnail"></a>z#<section class="card"><h2><a href="z/index.html">z</a></h2><p>z= NPZ preview(s), each with raw artifact and schema links.</p>z
</section>zS<!doctype html><meta charset="utf-8"><title>Processed data galleries</title><style>zÕ</style><main><h1>Processed data galleries</h1><p class="muted">Static local scientific artifact reports. Previews are descriptive only: no defect targets, untrained predictions, or fabricated physical fields.</p>rŠ  r‹  rä   rå   )rZ  rh   r   rë   rh  ri  rŒ  r�  )
rŽ  ÚsummaryÚ	preferredr’  rY  ÚcountÚthumbÚ
thumb_pathÚimager[  s
             r   Ú	root_pagerž    s�  € Ø/Ð9TÐ^vð  ARð  Zhð  sMð  Wrñ  s€IØ
€EØŸ™ž‰ˆˆuØ�m‰m˜FÓ#ˆØÐ(Ñ(¨Ñ/Ð0@Ñ@ÄÀUÃÑKˆ
ð r|÷  rCñ  rCô  rE�˜6˜(Ð"GÈÀxÐO_Ô`d×`kÑ`kÔloÐpuÓlvÓ`wÐ_xÐxô  AE÷  ALñ  ALð  MSó  ATð  @Uð  Umñ  nð  KMˆØÐ6°v°h¸mÈFÈ8ÐS_Ð`eÐ_fð  gdð  ejð  dkð  kuð  vñ  	v‰ð	 (ð
 _Ô_bÐ^cð  dyð  zð  y@ð  @Gð  
H€DØ	Ð
Ñ˜<Ñ'×3Ñ3°DÀ'Ð3ÕJr   c                óÊ  — | dz  }i }t         D ]Æ  }||z  }|j                  dd¬«       |dz  }|j                  d¬«       g }d}t        |j                  d«      «      D ])  }t	        ||||«      \  }	}
|j                  |	«       ||
z  }Œ+ |dz  j                  t        j                  ||d	œd
d¬«      d¬«       t        | |||«       t        |«      ||<   ŒÈ t        | |«       |S )Nrˆ  TrC   r—  )rD   r  z*.npzzmanifest.json)rY  r�  FrY   )Úensure_asciiÚindenträ   rå   )ÚFAMILIESrJ   ÚsortedÚglobr†  r$  r�  rì   Údumpsr•  r8   rž  )rŽ  Ú	processedr˜  rY  r‘  Úvisualr�  r�  r‚  r…  Údetails              r   Úgenerater©    s  € ØÐ#Ñ#€I¸B WßˆØ˜FÑ"ˆ	 I§O¡O¸DÈ$ OÔ$OÐXaÐbrÑXrÐQWÐtz÷  uAñ  uAð  KOð  uAô  uPØˆ 2�NÜ˜)Ÿ.™.¨Ó1Ö2ˆCÜ$ V¨C°°yÓA‰MˆE�6À7Ç>Á>ÐRWÔCXÐZhÐlrÑZrÑZhð 3à	�Ñ	×+Ñ+¬D¯J©JÀÐRYÑ7ZÐhmÐuvÔ,wð  BIÐ+ô  	JÜ�D˜ ¨Ô7ÌÈWË¸Àºð ô ˆd�7Ô G˜^r   c                 óø   — t        j                  d¬«      } | j                  dt        t	        «       d¬«       | j                  «       }t        t        j                  t        |j                  «      d¬«      «       y )Nz=Generate local visual galleries for every data_processed NPZ.)r}  z--rootz4repository root (default: inferred from this script))ÚtypeÚdefaultÚhelpF)r   )ÚargparseÚArgumentParserÚadd_argumentr   r   Ú
parse_argsÚprintrì   r¥  r©  rŽ  )ÚapÚargss     r   Úmainrµ    sP   € Ü×ÑÐ+jÔk€BØ‡O�O�H¤$¬|«~ÐCy€OÔzØ	�‰‹€Dœ%¤§
¡
¬8°D·I±IÓ+>ÈEÔ RÕSr   Ú__main__)Úreturnr   )r"   r   r#   r   r·  r   )r*   znp.ndarray | Anyr·  r   )r*   ú
np.ndarrayr·  z	list[str])F)r<   r¸  r=   rµ   r·  zdict[str, float])rN   z
plt.Figurer   r   r·  ÚNone)rx   údict[str, np.ndarray]ry   r   rz   r   r·  r   )r”   r   r•   r¸  r·  r¹  )rõ   r   rö   r   r·  ú
int | None)
rx   rº  ry   r   rz   r   r  r»  r·  r   )rx   rº  r·  r   )
rY  r   r‚  r   rƒ  r   rõ   r   r·  ztuple[dict[str, Any], str])
rŽ  r   rY  r   r�  zlist[dict[str, Any]]r�  r   r·  r¹  )rŽ  r   r˜  údict[str, int]r·  r¹  )rŽ  r   r·  r¼  )r·  r¹  )-Ú__doc__Ú
__future__r   r®  rh  rì   Úpathlibr   Útypingr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotrL   Úmatplotlib.collectionsr   Únumpyr&   ÚrcParamsr¢  rŒ  r   r$   r,   r0   rA   rO   r�   r—   rÅ   rÔ   râ   rø   r  rB  rP  r`  rw  r†  r•  rž  r©  rµ  Ú__name__r   r   r   Ú<module>rÉ     sö   ðñõ #ã Û Û Ý Ý ã Ø €
‡�ˆuÔ Ý Ý 1Û ð  5°mÐD€‡�ˆ]Ñ Ø%*€‡�Ð!Ñ "àP€ð€ó/óVó*ó
8ô2óDódó.HóXó0
xó	xó#ózó [óBzótó
\ó=ó"?ó	Kó	,óTð ˆZÒ™�Ðr   