Ë
    –£§jèp  ã                  óø  — d Z ddlmZ ddlZddlZddlmZ ddlZ ej                  d«       ddl	m
Z ddlZddlmZ edz  Zd9d	„Zd:d
„Zg d¢Zd;d„Zd<d„Zd=d„Zg d¢g d¢g d¢dœddgg d¢g d¢dœg d¢g d¢g d¢dœg d¢dgg d¢dœg d¢dgdd gdœg d!¢dgd"d#gdœg d$¢d%d&gg d'¢dœg d(¢g d)¢g d*¢dœg d+¢dgg d,¢dœd-gd.d/gg d0¢dœd1œ
Zd>d2„Zd?d3„Zd4d5œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d@d6„ZdAd7„Zed8k(  r e e«       «       yy)Bz>Build a model-by-model input, fusion, and execution dashboard.é    )ÚannotationsN)ÚPathÚAggé   )ÚROOTzresults/models/dashboardc                 óø  — t        t        dz  j                  d«      «      } g }| D ]‡  }t        j                  |d¬«      5 }|j                  t        |d   j                  «       «      t        j                  |d   |d   g«      t        j                  |d   |d	   g«      d
œ«       d d d «       Œ‰ t        j                  |D �cg c]  }|d   j                  «       ‘Œ c}«      }|t        j                  |«         }t        j                  t        |«      dddt        |«      z  fd¬«      \  }}t        j                  |«      }t!        ||«      D �]a  \  }	}|	j#                  |d   dd|j%                  «       |j'                  «       ¬«      }
t)        d«      D ]�  }t)        d«      D ]  }|d   ||f   }t        j                  |«      sdn|d›|d   ||f   rdnd› �}t        j                  |«      r|t        j*                  |«      kD  rdnd}|	j-                  |||ddd|¬«       Œ� Œ‘ |	j/                  d dgd!d"g«       |	j1                  t)        d«      t)        dd#«      D �cg c]  }|d$›‘Œ c}«       |	j3                  d%«       |	j5                  |d&   › d'�«       |j7                  |
|	d(d)d*¬+«       �Œd |j9                  t:        d,z  d-¬.«       t        j<                  |«       y # 1 sw Y   �ŒÉxY wc c}w c c}w )/Nzdata_processed/pairedz*_cad_ply_targets.npzF)Úallow_pickleÚrun_idÚheater_top_cÚheater_bottom_cÚheater_top_imputedÚheater_bottom_imputed)ÚrunÚvaluesÚimputedr   r   é   gÍÌÌÌÌÌ@T©ÚfigsizeÚconstrained_layoutÚautoÚinferno)ÚaspectÚcmapÚvminÚvmaxé   é   õ   â€”z.0fr   Ú*Ú ÚblackÚwhiteÚcenteré   )ÚhaÚvaÚfontsizeÚcolorr   ÚupperÚloweré   Ú02dzheater zoner   u2    XLS heater input (Â°C; * = linearly interpolated)u   Â°Cgš™™™™™™?g¸…ëQ¸Ž?)ÚaxÚlabelÚfractionÚpadúthermal-process-input.pngé–   ©Údpi)Úsortedr   ÚglobÚnpÚloadÚappendÚstrÚitemÚstackÚconcatenateÚravelÚisfiniteÚpltÚsubplotsÚlenÚ
atleast_1dÚzipÚimshowÚminÚmaxÚrangeÚ	nanmedianÚtextÚ
set_yticksÚ
set_xticksÚ
set_xlabelÚ	set_titleÚcolorbarÚsavefigÚOUTÚclose)ÚpairedÚrowsÚpathÚdataÚrowr   ÚfiniteÚfigÚaxesr-   ÚimageÚlayerÚzoneÚvaluer.   r(   s                   úmodels/build_dashboard.pyÚthermal_previewr`      s³  € Ü”TÐ3Ñ3×9Ñ9Ð:QÓRÓS€FØ€DÛˆÜ�W‰W�T¨Õ.°$Ø�K‰KÜ˜4 ™>×.Ñ.Ó0Ó1ÜŸ(™( D¨Ñ$8¸$Ð?PÑ:QÐ#RÓSÜŸ8™8 TÐ*>Ñ%?ÀÐF]ÑA^Ð$_Ó`ñô ÷ /Ð.ð ô �^‰^¹dÓC¹d°s˜S ™]×0Ñ0Õ2¸dÑCÓD€FØ”B—K‘K Ó'Ñ(€FÜ—‘œS ›Y¨°B¸¼cÀ$»i¹Ð3HÐ]aÔb�I€CˆÜ�=‰=˜Ó€DÜ�t˜T—?‰ˆˆCØ—	‘	˜#˜h™-°¸YÈVÏZÉZË\Ð`f×`jÑ`jÓ`l�	ÓmˆÜ˜1–XˆEÜ˜bž	�Ø˜H™ e¨T kÑ2�Ü%'§[¡[°Ô%7™ÀÀc¸{ÐRUÐV_ÑR`ÐafÐhlÐalÒRmÉ3ÐsuÐJvÐ=w�Ü#%§;¡;¨uÔ#5¸%Ä"Ç,Á,ÈvÓBVÒ:V™Ð\c�Ø—‘˜˜e U¨x¸HÈqÐX]�Õ^ñ	 "ð ð 	�‰�q˜!�f˜w¨Ð0Ô1Ø
�‰”e˜B“i¼EÀ!ÀR¼LÓ!I¹L°D T¨# J¡-¸LÑ!IÔJØ
�‰�mÔ$ b§l¡l°c¸%±j°\ÐAsÐ3tÔ&uØ�‰�U˜r¨¸À4ˆÖHð #ð ‡K�K”Ð1Ñ1°s€KÔ;Ü‡I�Iˆc…N÷/ /Ñ.üò Dùò "Js   Á A&K%ÃK2É"K7Ë%K/	c                óÄ  — i }| d   D ]&  }|j                  |d   g «      j                  |«       Œ( i }|j                  «       D �]   \  }}|D �cg c]  }|d   dk(  sŒ|‘Œ }}|D �cg c]  }|d   ‘Œ	 }}|D �cg c]  }|d   ‘Œ	 }}|D �cg c]%  }|j                  d«      sŒ|j                  d«      ‘Œ' }	}|s|d   d   nd	t	        |«      t        |D �ch c]  }|j                  d
«      ’Œ c}«      |sdn2t	        |«      dk(  r	|d   d›d�nt        |«      d›dt        |«      d›d�||	|d   j                  dd«      dœ||<   �Œ |S c c}w c c}w c c}w c c}w c c}w )NÚmodelsÚfamilyÚstatusÚforward_backward_smokeÚforward_latency_ms_cpuÚoutput_shapeÚsourcer   zforward/backward passedÚparamsÚunavailabler   z.1fú msu   â€“Úreasonr    )rd   Úchecksri   ÚlatencyÚshapesÚsourcesrl   )Ú
setdefaultr9   ÚitemsÚgetrB   r5   rF   rG   )
ÚreportÚgroupedrW   Úresultrc   rT   Úpassedrn   ro   rp   s
             r_   Ú
_summariesrx   0   s¬  € Ø%'€GØ�hÔˆØ×Ñ˜3˜x™=¨"Ó-×4Ñ4°SÕ9ð  à€FØŸ™Ÿ‰ˆ�Ù!%ÓS¡˜#¨¨X©Ð:RÓ)R’# ˆÐSÙ<BÓC¹F°S�3Ð/Ó0¸FˆÐCÙ17Ó8±¨#�#�nÓ%°ˆÐ8Ù04ÓJ±¨¸¿¹ÀÕ8I�3—7‘7˜8Õ$°ˆÐJá/5�d˜1‘g˜hÒ'Ð;TÜ˜&“k¬VÑRXÓ4YÑRXÈ3°S·W±W¸XÕ5FÐRXÑ4YÓ-ZÙ,3‘}ÔTWÐX_ÓT`ÐdeÒTe¸WÀQ¹ZÈÐ<LÈCÑ:PÔnqÐryÓnzÐ{~Ðmð  @Cô  DGð  HOó  DPð  QTð  CUð  UXð  lYØ¨Ø˜1‘g—k‘k (¨BÓ/ñ
ˆˆv‹ð (ð €Mùò TùÚCùÚ8ùÚJùò 5Zs*   ÁE	ÁE	Á&EÁ8EÂ
EÂ!EÃE)
)z2D CNN/U-NetÚ2D_CNN_UNetÚ2d_cnn_unetÚFiLMÚpixel)ÚFNO2dr}   Úfno2dr{   zpixel/field)úDense 3D U-NetÚ3D_UNetÚ3d_unetr{   Úvoxel)úSparse 3D U-NetÚSparse_UNetNÚnoneúsparse voxel)ÚPointNetÚPointNet_segmentationÚpointnet_cad_surface_pointsr…   Úpoint)ÚDGCNNÚDGCNN_dynamic_feature_knnÚdgcnn_cad_surface_pointsr…   rŠ   )zMesh GNNÚGNN_MeshGraphNet_styleÚmeshgraphnetúedge-messagezCAD node)zRisk GNNÚ"GNN_CAD_risk_deformation_multitaskÚcad_risk_deformation_multitaskr�   zCAD node + run)zUV-NetÚUVNet_face_grid_adjacencyÚuvnetr…   z
B-Rep face)zTabular MLPÚtabular_surrogater•   zdirect concatr   c                óP  — | d   D �ci c]  }d|v sŒ|d   |“Œ }}| d   }g }t         D ]ð  \  }}}}	}
|D �cg c]  }|d   |k(  sŒ|‘Œ }}|dv rt        d„ |D «       |d   «      }n|dk(  rt        |d	„ ¬
«      }n|d   }|r|j                  |«      nd }d\  }}}|r&|d   \  }}d||z
  z  t        t	        |«      d«      z  }|dk(  }|j                  ||d   |j                  d«      |j                  d«      |	|
||||r|d   nd |r|d   nd |r|d   nd dœ«       Œò |S c c}w c c}w )NÚ	syntheticÚlossesrc   rb   >   rˆ   rŒ   c              3  óJ   K  — | ]  }d |j                  dd«      v sŒ|–— Œ y­w)Úcad_surface_pointsrh   r    N©rs   )Ú.0rW   s     r_   Ú	<genexpr>z"comparison_rows.<locals>.<genexpr>Y   s)   è ø€ Ðh©J SÐ:NÐRU×RYÑRYÐZbÐdfÓRgÒ:gœS©Jùs   ‚#œ#r   rŽ   c                ó&   — | j                  dd«      S )NÚactual_nodesr   r›   )rW   s    r_   Ú<lambda>z!comparison_rows.<locals>.<lambda>[   s   € °s·w±w¸~ÈqÔ7Qó    )Úkey)NNNéd   gê-�™—q=r‘   rd   ri   rf   Ú
loss_finalÚtraining_threshold_iouÚtraining_threshold_dice)Úmodelrd   ri   rn   ÚfusionÚdomainÚsynthetic_initialÚsynthetic_finalÚsynthetic_reductionÚ	weak_lossÚiouÚdice)ÚCOMPARISON_MODELSÚnextrG   rs   Úabsr9   )rt   ÚweakrW   r—   ÚactualÚoutputÚdisplayrc   Ú
synth_namer¨   r©   Ú
candidatesÚselectedÚsynthÚinitialÚfinalÚ	reductionÚtraineds                     r_   Úcomparison_rowsr¿   R   sƒ  € Ø/5°kÒ/BÓVÑ/B¨ÀhÐRUÂo��X‘ Ñ#Ð/B€IÐVØ�HÑ€FØ€Fß7HÑ3ˆ�˜ V¨VÙ%+ÓG¡V˜c¨s°8©}ÀÓ/F’c Vˆ
ÐGØÐKÑKÜÑh©JÓhÐjtÐuvÑjwÓx‰HØÐ/Ò/Ü˜:Ñ+QÔR‰Hà! !‘}ˆHÙ-7�	—‘˜jÔ)¸TˆØ$4Ñ!ˆ�˜	ÙØ" 8™_‰NˆG�UØ˜w¨™Ñ/´#´c¸'³lÀEÓ2JÑJˆIØÐ@Ñ@ˆØ�‰Ø¨°Ñ(:ÀhÇlÁlÐS[ÓF\Ø—|‘|Ð$<Ó=ÈÐ[aØ!(¸UÐ[dÙ/6˜˜lÒ+¸DÙ5<�4Ð0Ò1À$Ù7>�DÐ2Ò3ÀDñ
õ 	ð 8Ið, €Mùò3 Wùò Hs   ˆ	D’D¶D#ÁD#c                ó\  — | D �cg c]  }|d   ‘Œ	 }}t        j                  t        | «      «      }t        j                  dddd¬«      \  }}t        j
                  | D �cg c]  }|d   r|d   nt         j                  ‘Œ c}t        «      }t        j
                  | D �cg c]  }|d   �|d   nt         j                  ‘Œ c}t        «      }t        j
                  | D �cg c]  }|d	   �|d	   nt         j                  ‘Œ c}t        «      }|d
   j                  ||d¬«       |d
   j                  d«       |d
   j                  d«       |d
   j                  d«       |d   j                  |t        j                  |d«      d¬«       |d   j                  d«       |d   j                  d«       |d   j                  d«       |d   j                  ||d¬«       |d   j                  d«       |d   j                  d«       |D ]7  }	|	j                  ||«       |	j                  «        |	j                  dd¬«       Œ9 |d   j!                  d
dd¬«       |j#                  d«       |j%                  t&        dz  d ¬!«       t        j(                  |«       y c c}w c c}w c c}w c c}w )"Nr§   r   é   )é   é   Tr   ri   rn   r¬   r   z#4472c4)r(   ÚlogÚ
Parameterszcount (log scale)g{®Gáz„?z#ed7d31zActual-input CPU forwardzmilliseconds (log scale)r   z#2f9e75zTwo-step synthetic loss changezreduction (%)Úxg      Ð?)ÚaxisÚalphaz#555gš™™™™™é?)r(   Ú	linewidthuE   Architecture comparison â€” execution and synthetic optimization onlyzmodel-comparison.pngr2   r3   )r7   ÚarangerB   r@   rA   ÚasarrayÚnanÚfloatÚbarhÚ
set_xscalerN   rM   ÚmaximumrK   Úinvert_yaxisÚgridÚaxvlineÚsuptitlerP   rQ   rR   )
rT   rW   ÚnamesÚyrY   rZ   ri   rn   r½   r-   s
             r_   Úcomparison_previewr×   o   sš  € Ù%)Ó*¡T˜cˆS�‹\ T€EÐ*Ü
�	‰	”#�d“)Ó€AÜ—‘˜Q ¨7ÀtÔL�I€CˆÜ�Z‰ZÉtÓTÉtÈ¨#¨hª-˜˜Xš¼R¿V¹VÑCÈtÑTÔV[Ó\€FÜ�j‰jÑ^bÓcÑ^bÐWZ¨C°	©NÐ,F˜#˜iš.ÌBÏFÉFÑRÐ^bÑcÔejÓk€GÜ—
‘
Ñx|Ó}Ñx|Ðqt¸#Ð>SÑ:TÐ:`˜CÐ 5Ò6Ôfh×flÑflÑlÐx|Ñ}ô  @Eó  F€IØˆ�G‡L�L��F )€LÔ,¨d°1©g×.@Ñ.@ÀÔ.GÈÈaÉ×IZÑIZÐ[gÔIhÐjnÐopÑjq×j|Ñj|ð  ~Qô  kRØˆ�G‡L�L�”B—J‘J˜w¨Ó,°I€LÔ>ÀÀQÁ×@RÑ@RÐSXÔ@YÐ[_Ð`aÑ[b×[lÑ[lð  nHô  \Ið  KOð  PQñ  KR÷  K]ñ  K]ð  ^xô  KyØˆ�G‡L�L��I Y€LÔ/°°a±×1BÑ1BÐCcÔ1dÐfjÐklÑfm×fxÑfxð  zIô  gJÛˆØ
�‰�a˜Ô §¡Ô!2°B·G±GÀÈC°GÕ4Pð àˆ�G‡O�O�A˜V¨r€OÔ2Ø‡L�LÐXÔYØ‡K�K”Ð,Ñ,°#€KÔ6Ü‡I�Iˆc…Nùò +ùò UùÚcùÚ}s   …JÁ !JÂ !J$Ã !J)c                ó¼  — g }| D ]Å  }|d   €dn|d   d›d|d   d›d|d   d›d	�}|d
   €dnd|d
   d›d|d   d›d|d   d›�}|d   €dn|d   d›d�}|d   €dn|d   d›}|j                  dt        j                  |d   «      › dt        j                  |d   «      › dt        j                  |d   «      › d|› d|› d|› d|› d�«       ŒÇ dj                  |«      S )Nrª   r   z.5gõ    â†’ r«   z (r¬   z+.1fz%)r­   zloss z.4fz; IoU r®   ú.3fz; Dice r¯   rn   rk   ri   Ú,z<tr><th>r§   z	</th><td>r©   z	</td><td>r¨   z
</td></tr>r    )r9   ÚhtmlÚescapeÚjoin)rT   ÚbodyrW   r—   r³   rn   ri   s          r_   Úcomparison_tablerà   �   sÙ  € Ø€DÛˆØ Ð!4Ñ5Ð=‘EÀcÐJ]ÑF^Ð_bÐEcÐchÐilÐm~Ñið  ADð  iEð  EGð  HKð  Lañ  Hbð  cgð  Ghð  hjð  Dkˆ	Ø˜KÑ(Ð0‰u¸¸cÀ+Ñ>NÈsÐ=SÐSYÐZ]Ð^cÑZdÐehÐYiÐipÐqtÐu{Ñq|ð  ~Að  qBð  7CˆØ˜y™>Ð1‘%¸#¸i¹.ÈÐ9MÈSÐ7QˆØ˜h™-Ð/‘¸¸H¹ÀaÐ7HˆØ�‰�hœtŸ{™{¨3¨w©<Ó8Ð9¸Ä4Ç;Á;ÈsÐS[É}ÓC]ÐB^Ð^gÔhl×hsÑhsÐtwð  yAñ  uBó  iCð  hDð  DMð  NTð  MUð  U^ð  _fð  ^gð  gpð  qzð  p{ð  {Dð  EIð  DJð  JTð  Uõ  	Vð ð �7‰7�4‹=Ðr¡   )u   image input|34Ã—128Ã—128u   Conv2d Ã—2|34â†’16â†’16u   MaxPool2d|128â†’64u   Conv2d Ã—2|16â†’32â†’32)úprocess input|112u   Linear|112â†’64zsplit|scale 32 + bias 32)u   FiLM bottleneck|32Ã—64Ã—64u   ConvTranspose2d|32â†’16zconcat skip|16+16u   Conv2d Ã—2|32â†’16â†’16u   1Ã—1 head|16â†’1 pixel)ÚgeometryÚprocessr¨   u   field input|34Ã—128Ã—128u   1Ã—1 lift|34â†’24)rá   u   Linear|112â†’48zsplit|scale 24 + bias 24)u   FiLM lifted field|24Ã—128Ã—128u   spectral + skip Ã—3|24 channelsu   1Ã—1 head|24â†’1 pixel)u   voxel input|24Ã—32Ã—4Ã—16u   Conv3d Ã—2|24â†’8â†’8u   MaxPool3d|16Ã—2Ã—8u   Conv3d Ã—2|8â†’16â†’16)rá   u   Linear|112â†’32zsplit|scale 16 + bias 16)u   FiLM bottleneck|16Ã—16Ã—2Ã—8u   ConvTranspose3d|16â†’8zconcat skip|8+8u   Conv3d Ã—2|16â†’8â†’8u   1Ã—1 head|8â†’1 voxel)z sparse input|403 coords, 24 featu   MinkowskiConv|24â†’16u   stride-2 down|16â†’32u   mid Conv|32â†’32zXLS branch|not wired)u   transpose Conv|32â†’16zconcat sparse skip|16+16u   sparse head|32â†’1 cell)u   point input|8,192Ã—Cu   shared Conv1d|Câ†’64â†’128zglobal max|128zrepeat + concat|128+128zXLS MLP|proposed, not wiredu   point head|256â†’64â†’1zoutput|one scalar / point)u   point input|512Ã—Czdynamic kNN|k=12u   Edge MLP 1|2Câ†’32â†’32u!   new kNN + Edge MLP 2|64â†’32â†’32zlocal + local + global|32+32+32u   point head|96â†’32â†’1)u   node input|NÃ—32u   node encoder|32â†’48u   edge input|EÃ—8zglobal input|112u   Linear + GELU|112â†’48)u%   edge message Ã—3|48+48+8+48â†’48â†’48u   sum at destination|NÃ—48u   GRU update Ã—3|96â†’48u   node head|48â†’1)u   node input|2Ã—11,956Ã—32u   node encoder|32â†’32u   edge input|2Ã—72,176Ã—8)u   weak-train input|2Ã—150u   Linear + GELU|150â†’32u   smoke alternative|2Ã—112â†’32)u%   edge message Ã—2|32+32+8+32â†’32â†’32u   GRU update Ã—2|64â†’32u   raw head|32â†’(3 + classes)z"node heads|risk, signed, magnitudezmean pool|run defect type)u   face UV grids|6,564Ã—12Ã—8Ã—8u   Conv2d Ã—2|12â†’8â†’8u   mean UV pool|6,564Ã—8zface edges|36,090)u   face message|8+8â†’8u   sum at destination|6,564Ã—8u   face head|8â†’1zCAD summary|6 values + maskszXLS process|50 values + maskszconcatenate|112 total)u   Linear + GELU|112â†’64u   Linear + GELU|64â†’64u   run head|64â†’1)
ú2D CNN / U-Netr}   r   rƒ   úPointNet segmentationúDGCNN segmentationúMeshGraphNet-style GNNúPhysics-constrained risk GNNúUV-Net-style face modelúTabular MLP surrogatec           	     ó  — g }t        | «      D ]k  \  }}|j                  dd«      \  }}|r|j                  d«       |j                  dt        j                  |«      › dt        j                  |«      › d�«       Œm dj                  |«      S )NÚ|r   u$   <span class="layer-arrow">â†’</span>z<div class="layer"><strong>z</strong><small>z</small></div>r    )Ú	enumerateÚsplitr9   rÜ   rÝ   rÞ   )rr   rµ   Úindexr;   r.   Úshapes         r_   Ú_layer_chainrñ   Â   s„   € Ø€FÜ  Ö'‰ˆˆtØ—z‘z # qÓ)‰ˆˆuÙØ�M‰MÐ@ÔAØ�‰Ð3´D·K±KÀÓ4FÐ3GÐGWÔX\×XcÑXcÐdiÓXjÐWkÐkyÐzÕ{ð	 (ð
 �7‰7�6‹?Ðr¡   c                ó    — t         |    }dt        j                  | «      › dt        |d   «      › dt        |d   «      › dt        |d   «      › d�	S )	Nz@<div class="structure" aria-label="Detailed layer structure for zH">
      <div class="lane-label">Geometry</div><div class="layer-chain">râ   zY</div>
      <div class="lane-label">Process</div><div class="layer-chain process-chain">rã   z`</div>
      <div class="lane-label">Fusion / output</div><div class="layer-chain fusion-chain">r¨   z</div>
    </div>)Ú
STRUCTURESrÜ   rÝ   rñ   )r§   rT   s     r_   Ú	structurerô   Ì   s|   € Ü�eÑ€DØOÔPT×P[ÑP[Ð\aÓPbÐOcð dFÜFRÐSWÐXbÑScÓFdÐEeð fSÜS_Ð`dÐenÑ`oÓSpÐRqð rZÜZfÐgkÐltÑguÓZvÐYwð xðð r¡   r    )Únotec           	     óŽ  — t        j                  t        j                  |
j	                  dg «      d¬«      «      }dj                  d„ |
j	                  dg «      D «       «      xs d}t        j                  |
j	                  dd	«      «      }|
j	                  d
«      rdt        j                  |
d
   «      › d�nd}|rdt        j                  |«      › d�nd}dj                  g d‘t        j                  |«      › ‘d‘t        j                  |«      › ‘d‘t        j                  | «      › ‘d‘|› ‘d‘|› ‘d‘|› ‘d‘t        j                  | «      › ‘d‘t        j                  |«      › ‘d‘t        j                  |«      › ‘d‘t        j                  |«      › ‘d‘t        j                  |«      › ‘d‘t        j                  |«      › ‘d‘t        | «      › ‘d‘t        j                  |	«      › ‘d‘|
j	                  dd«      › ‘d‘|› ‘d‘t        j                  |
j	                  d d«      «      › ‘d!‘|› ‘d"‘|› ‘|› ‘d#‘«      S )$Nro   F)Úensure_asciiz, c              3  ó$   K  — | ]  }|d ›–— Œ
 y­w)rÛ   N© )rœ   r^   s     r_   r�   zcard.<locals>.<genexpr>Ù   s   è ø€ ÐJÑ1I¨˜% ˜“|Ñ1Iùs   ‚ri   r   rd   znot executedrl   z<p class="warning">z</p>r    z<p class="note">z)
<article class="model-card" data-group="z4">
  <div class="card-head"><div><p class="eyebrow">z</p><h2>z </h2></div><span class="status">z></span></div>
  <div class="model-grid">
    <figure><a href="z"><img src="z"" alt="Prepared input preview for u�   "></a><figcaption>Prepared geometry input Â· open source gallery</figcaption></figure>
    <div>
      <p class="route"><strong>Route:</strong> rÙ   z; z</p>
      z$
      <dl><dt>Current code</dt><dd>z</dd><dt>Actual checks</dt><dd>rm   r   z</dd><dt>Parameters</dt><dd>z</dd><dt>CPU forward</dt><dd>rn   z'</dd><dt>Output shape(s)</dt><dd><code>z</code></dd></dl>
      z
    </div>
  </div>
</article>)rÜ   rÝ   ÚjsonÚdumpsrs   rÞ   rô   )r§   ÚgroupÚpreviewÚgalleryrâ   Úencoderrã   r¨   rµ   Úcurrentrv   rõ   ro   ri   rd   rl   Ú	note_htmls                    r_   Úcardr  Õ   s›  € ô �[‰[œŸ™ F§J¡J¨x¸Ó$<È5ÔQÓR€FØ�Y‰YÑJ°·±¸HÀbÔ1IÓJÓJÒSÈe€FÜ�[‰[˜Ÿ™ H¨nÓ=Ó>€FØJPÏ*É*ÐU]ÔJ^Ð"¤4§;¡;¨v°hÑ/?Ó#@Ð"AÀÑFÐdf€FÙ>BÐ"¤4§;¡;¨tÓ#4Ð"5°TÑ:È€I÷ó ð )ð Ü)-¯©°UÓ);Ð(<ðð=2ðä26·+±+¸eÓ2DÐ1EðàEMðäNRÏkÉkÐZ_ÓN`ÐMaðð bBðð CIð  BJððJðð �Yð	ð +ð	ð ,3¨)ð	ð 4Vð	ô W[×VaÑVaÐbgÓVhÐUið	ðj0ð	ô 15·±¸HÓ0EÐ/Fðð GLðô MQÏKÉKÐX_ÓL`ÐKaðð bdðô ei×doÑdoÐpwÓdxÐcyðð zðô @D÷  @Kñ  @Kð  LRó  @Sð  Tðð TYðô Z^÷  Zeñ  Zeð  fló  Zmð  Ynððnðô �ÓÐðð$ðô %)§K¡K°Ó$8Ð#9ðð :Yðð Z`×YcÑYcÐdlÐnoÓYpÐXqðð rNðð OUð  NVðð Vsðô tx÷  tñ  tð  @F÷  @Jñ  @Jð  KTð  V[ó  @\ó  t]ð  s^ðð ^Eðð FLð  EMððMðð €hðð ˆkððôð r¡   c                 ó   — t         j                  dd¬«       t        j                  t        dz  j                  «       «      } t        j                  t        dz  j                  «       «      }t        | «      }t        «        t        | |«      }t        |«       d}t        dd|dz   |d	z   d
ddddd|d   d¬«      t        dd|dz   |d	z   dddddd|d   d¬«      t        dd|dz   |dz   d d!dd"d#d$|d%   d&¬«      t        d'd(|d)z   |dz   d*d+d,d-d.d/|d0   ¬1«      t        d2d3|d4z   |d5z   d6d7d8d9d:d;|d<   d=¬«      t        d>d3|d?z   |d5z   d@dAd8dBdCdD|dE   ¬1«      t        dFdG|dHz   |dIz   dJdKdLdMdNdO|dP   ¬1«      t        dQdR|dSz   |dTz   dUdVdWdXdYdZ|d[   d\|d]   d^›d_|d`   d^›da|db   d^›dc|dd   d^›de�	¬«      t        dfdg|dhz   |diz   djdkd8dldmdn|do   ¬1«      t        dpdqdr|dsz   dtdudvdwdxdy|dz   ¬1«      g
}d{t        |«      › d|t        d}d~g«      › dt        g d€¢«      › d�t        g d‚¢«      › dƒd„j                  |«      › d…�}t         d†z  }|j                  |d‡¬ˆ«       |S )‰NT)ÚparentsÚexist_okzresults/models/report.jsonz#results/models/weak_gnn/report.jsonz	../../../rä   r[   z:data_processed/images/visualizations/cad_multiview_128.pngz data_processed/images/index.htmlu6   STEP â†’ six 17-channel orthographic images + 17 masksz2D CNN encoderz*50 XLS + 6 CAD-summary values and 56 masksu/   single linear projection â†’ FiLM at bottleneckzpixel field [view, 1, H, W]zŒThermal/process values generate scale and bias for the deepest image features; skip features and the modulated bottleneck enter the decoder.ry   z:Execution check only: no validated pixel risk mask exists.)r§   rü   rý   rþ   râ   rÿ   rã   r¨   rµ   r   rv   rõ   r}   zimage / fieldz9results/representations/feature_channel_contact_sheet.pngz)aligned 17-channel image/field + 17 masksu   1Ã—1 lift + Fourier blocksu8   single linear projection â†’ FiLM before spectral blockszpixel/field gridz|The current input is the CAD image tensor. A physical thermal operator still needs paired input and target fields over time.zEArchitecture execution only; this is not a learned temperature field.r   r‚   z=data_processed/voxels/visualizations/cad_surface_dense_32.pngz data_processed/voxels/index.htmlu9   STEP â†’ 12-channel dense surface-voxel tensor + 12 masksz3D convolution encoderu2   single linear projection â†’ FiLM at 3D bottleneckzvoxel field [run, 1, X, Y, Z]zWThe process branch modulates the deepest 3D features before the skip-connected decoder.r€   zHThe voxel input represents sampled surfaces, not filled material volume.rƒ   r†   z>data_processed/voxels/visualizations/cad_surface_sparse_64.pngu.   STEP â†’ occupied voxel coordinates + featureszMinkowski sparse encoderzXLS branch proposedz7append/broadcast process embedding at sparse bottleneckzoccupied-voxel fieldz|Geometry-only sparse implementation. Process fusion is not yet wired because MinkowskiEngine is unavailable on this machine.r„   )r§   rü   rý   rþ   râ   rÿ   rã   r¨   rµ   r   rv   rå   rŠ   z;data_processed/points/visualizations/cad_surface_points.pngz data_processed/points/index.htmlu0   STEP â†’ 8,192 surface points + normals/featuresz"shared point MLP + global max poolzXLS MLP proposedz.append global process embedding to every pointzpoint risk/deformation fieldzeThe present PointNet smoke is geometry-only. The diagram shows the intended process-fusion extension.rˆ   z_CAD points are valid pre-process input; scan points belong to the post-process inspection task.ræ   z3results/representations/point_sample_comparison.pngu$   points â†’ dynamic feature-space kNNz!two EdgeConv stages + global poolz7append process embedding to local/global point featureszpoint fieldz~The present DGCNN smoke is geometry-only and capped at 512 points for CPU memory. Process fusion remains a proposed extension.rŒ   rç   Úgraphzresults/graphs/comparison.pngz data_processed/graphs/index.htmlu7   STEP â†’ nodes, mesh edges, curvature/boundary featuresznode/edge message passingu7   112-value process/CAD-summary vector â†’ global encoderz/global embedding appended to every edge messagezCAD-node fieldzsThis is the most direct variable-node CAD representation. The same weights executed on all seven graph resolutions.rŽ   rè   ztrained diagnosticz'results/models/weak_gnn/predictions.pngz"results/models/weak_gnn/index.htmlz11,956-node STEP graphzmessage passingu2   50 XLS + observed/imputed masks â†’ global encoderz'process embedding in every edge messagez9node risk + signed/magnitude deformation; run defect typeu�   Four output heads are active. Magnitude â‰¥ |signed deformation| is enforced by construction; risk/deformation graph smoothness are soft losses.r‘   z'Weak two-run training diagnostic: loss Úloss_initialrÚ   rÙ   r¤   z, IoU r¥   z, Dice r¦   u>   . Type learning is unavailable because both labels are ì°�íž˜.ré   zB-Repz/data_processed/brep/visualizations/faces_uv.pngzdata_processed/brep/index.htmlu5   STEP faces â†’ trimmed 8Ã—8 UV grids + face adjacencyz%per-face 2D CNN + face graph messagesz-append run embedding before face-message headzface risk/fieldzdThe current UV model is geometry-only. Process fusion and a face-to-surface decoder remain proposed.r“   rê   Útabularr1   z!data_processed/tabular/index.htmlz.STEP summary: bbox, area, node/triangle countszfeature scaling + mask appendz 50 XLS channels + validity maskszconcatenate all tabular inputszone run-level valueztThis baseline directly concatenates process and CAD summary features before the MLP; it cannot localize a risk area.r•   u®  <!doctype html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Model input and fusion dashboard</title>
<style>
:root{--ink:#162033;--muted:#667085;--line:#d7dee9;--paper:#f4f7fb;--card:#fff;--blue:#235bc1;--green:#147d64;--amber:#9b6500}
*{box-sizing:border-box} body{margin:0;background:var(--paper);color:var(--ink);font:15px/1.5 system-ui,-apple-system,sans-serif} main{max-width:1240px;margin:auto;padding:32px 20px 64px}
h1{font-size:clamp(28px,4vw,44px);line-height:1.1;margin:.2rem 0} h2{margin:.1rem 0;font-size:23px} .lead{max-width:900px;color:var(--muted);font-size:17px}
.summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px;margin:24px 0} .summary div,.model-card{background:var(--card);border:1px solid var(--line);border-radius:12px} .summary div{padding:14px 16px} .summary strong{display:block;font-size:24px}
.thermal,.recommended,.comparison,.cad-predictions{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:16px;margin-bottom:18px} .thermal img,.comparison img,.cad-predictions img{width:100%;height:auto;display:block} .thermal p,.recommended>p,.comparison>p,.cad-predictions>p{color:var(--muted)} .table-wrap{overflow-x:auto} table{border-collapse:collapse;width:100%;min-width:980px} th,td{padding:8px 10px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top} thead th{color:var(--muted)} tbody th{white-space:nowrap}
.model-card{padding:18px;margin:14px 0} .card-head{display:flex;justify-content:space-between;gap:16px;align-items:flex-start} .eyebrow{color:var(--blue);font-weight:700;text-transform:uppercase;letter-spacing:.08em;font-size:12px;margin:0} .status{color:var(--green);background:#e7f6f1;padding:5px 9px;border-radius:999px;white-space:nowrap}
.model-grid{display:grid;grid-template-columns:minmax(300px,42%) 1fr;gap:20px;margin-top:14px} figure{margin:0} figure img{width:100%;height:270px;object-fit:contain;background:#f9fbfd;border:1px solid var(--line);border-radius:8px} figcaption{color:var(--muted);margin-top:6px}
.route{color:var(--muted);margin-top:0} .structure{display:grid;grid-template-columns:112px minmax(0,1fr);gap:8px 10px;margin:10px 0 15px} .lane-label{font-weight:700;padding-top:8px} .layer-chain{display:flex;align-items:stretch;gap:6px;overflow-x:auto;padding:2px 0 8px} .layer{display:flex;flex-direction:column;justify-content:center;min-width:118px;padding:8px 9px;background:#edf3ff;border-radius:7px} .layer strong{font-size:13px} .layer small{color:var(--muted);font-size:11px} .process-chain .layer{background:#fff1d8} .fusion-chain .layer{background:#e5f6ef} .layer-arrow{display:flex;align-items:center;color:var(--blue);font-weight:800}
dl{display:grid;grid-template-columns:130px 1fr;gap:6px 12px;margin:5px 0} dt{color:var(--muted)} dd{margin:0} code{font-size:12px;word-break:break-word} .note,.warning{padding:9px 11px;border-left:4px solid var(--blue);background:#f1f5ff} .warning{border-color:var(--amber);background:#fff7df}
a{color:var(--blue)} footer{color:var(--muted);margin-top:24px}
@media(max-width:760px){.model-grid{grid-template-columns:1fr} .card-head{display:block} .status{display:inline-block;margin-top:8px} figure img{height:auto} dl{grid-template-columns:110px 1fr}}
</style></head><body><main>
<p><a href="../cad_predictions/index.html">All predictions on CAD</a> Â· <a href="../weak_gnn/index.html">Weak-GNN result</a> Â· <a href="../attributions/index.html">Local response diagnostics</a> Â· <a href="../../../data_processed/index.html">All processed inputs</a> Â· <a href="../report.json">Execution JSON</a></p>
<h1>Model inputs, process fusion, and outputs</h1>
<p class="lead">Each card separates the geometry representation from the XLS process branch and shows where they meet. Execution results prove tensor compatibility and gradients. A separate weak-training diagnostic maps every feasible model back onto common CAD nodes.</p>
<section class="summary"><div><span>Prepared representations</span><strong>6 families</strong></div><div><span>Forward/backward checks</span><strong>19 passed</strong></div><div><span>Independent physical runs</span><strong>2</strong></div><div><span>Validated prediction accuracy</span><strong>Unavailable</strong></div></section>
<section class="cad-predictions"><h2>Every model prediction mapped onto CAD</h2><p>These fields use the 18h01 weak target for a training-set representation comparison. Image, voxel and point outputs use stored source triangles and barycentric coordinates; graph outputs are already node-aligned; UV-Net uses a distance-marked face approximation; the tabular scalar is uniform. Gray regions exceed the 10 mm mapping-support threshold.</p><a href="../cad_predictions/index.html"><img src="../cad_predictions/comparison.png" alt="Weak-trained prediction fields from every model displayed on common CAD nodes"></a></section>
<section class="comparison"><h2>All-model result comparison</h2><p>Parameter count and CPU latency were measured in the same environment, but each model processes a different representation size and output domain, so latency is an operational measurement rather than a fair speed ranking. The two-step losses use a synthetic zero target and differ by output domain; only the within-model decrease checks gradient/optimizer behavior. The final column is the only loss computed from the supplied weak CAD/PLY targets.</p><img src="model-comparison.png" alt="Model parameter, CPU latency and synthetic loss-reduction comparison">
<div class="table-wrap"><table><thead><tr><th>Model</th><th>Output domain</th><th>Process fusion</th><th>Parameters</th><th>CPU forward</th><th>Synthetic loss, step 1â†’2</th><th>Weak-target training result</th></tr></thead><tbody>uú  </tbody></table></div>
<p class="note"><strong>Task comparison:</strong> the risk GNN is currently the closest match to STEP + XLS â†’ risk area + deformation because it produces CAD-node fields and consumes the process vector. Its IoU/Dice are training-set diagnostics from two unvalidated NG runs. CNN/FNO/3D U-Net already accept process conditioning but have no aligned spatial labels; PointNet, DGCNN, UV-Net and Sparse U-Net still need their XLS branch wired.</p></section>
<section class="thermal"><h2>Shared XLS thermal/process branch</h2><p>The plot shows the 34 heater values supplied to process-aware models. The complete vector has 50 XLS channels; values, observed masks and heater-imputation masks are retained separately.</p><img src="thermal-process-input.png" alt="Upper and lower 17-zone heater matrices for both runs"></section>
<section class="recommended"><h2>Requested MLP + encoder-feature concatenation</h2><p>This is the explicit late-fusion variant to test beside the current FiLM models. The process embedding is repeated across pixels, voxels, points, graph nodes or B-Rep faces before concatenation.</p>
<div class="structure" aria-label="Recommended late-fusion model structure">
  <div class="lane-label">Geometry</div><div class="layer-chain">z6prepared geometry|image / voxel / point / graph / facezgeometry encoder|z_geo [B,S,C]zU</div>
  <div class="lane-label">Process</div><div class="layer-chain process-chain">)z,XLS input|50 values + observed/imputed masksu   process MLP|150â†’64â†’32z repeat embedding|z_proc [B,S,32]z\</div>
  <div class="lane-label">Fusion / output</div><div class="layer-chain fusion-chain">)zconcatenate|[z_geo ; z_proc]u   fusion MLP/conv|C+32â†’Cz spatial heads|risk + deformationzglobal pool + head|defect typea  </div>
</div><p class="note">For the current two-run diagnostic, the GNN injects its process embedding into every edge message. CNN/FNO/3D U-Net currently use a single Linear-to-FiLM branch. PointNet, DGCNN, UV-Net and Sparse U-Net currently have no process branch.</p></section>
r    zï
<footer>Post-process PLY scans are target/inspection data. They are excluded from pre-process inference inputs. Proposed fusion blocks are explicitly marked where the current baseline is still geometry-only.</footer>
</main></body></html>z
index.htmlzutf-8)Úencoding)rQ   Úmkdirrú   Úloadsr   Ú	read_textrx   r`   r¿   r×   r  rà   rñ   rÞ   Ú
write_text)rt   r³   ÚsummaryÚ
comparisonÚrelÚcardsÚdocumentrU   s           r_   Úbuildr  ì   sÂ  € Ü‡I�I�d T€IÔ*Ü�Z‰ZœÐ <Ñ<×GÑGÓIÓJ€FÜ�:‰:”tÐCÑC×NÑNÓPÓQ€DÜ˜Ó €GÜÔÜ  ¨Ó.€JÜ�zÔ"Ø
€CäÐ#¨7¸CÐ@|Ñ<|ð  GJð  Kmñ  GmØNÐXhð  s_ð  hYð  bð dð  mtð  uBñ  mCð  JFô	Gô 	�7 /¸3Ð?zÑ;zð  EHð  Ikñ  EkØAÐKgð  r^ð  gað  j|ð Tð  ]dð  elñ  ]mð  t{ô	|ô 	Ð#¨7¸CÐ@Ñ<ð  JMð  Npñ  JpØQÐ[sð  ~jð  sgð  pOØnÐw~ð  @Iñ  xJð  Q[ô	\ô 	Ð$¨NÀCð  IIñ  EIð  SVð  Wyñ  SyØFÐPjð  uJð  SLð  Ukð Tð  ]dð  erñ  ]sô	tô 	Ð*°'À3ð  HEñ  DEð  ORð  Suñ  OuØHÐRvð  ASð  \Lð  UsØ|ð  FMð  Neñ  Ffð  mNô	Oô 	Ð'¨wÀÐDyÑ@yð  DGð  Hjñ  DjØ<ÐFið  tFð  OHð  Q^ð Vð  _fð  gBñ  _Cô	Dô 	Ð+°7ÀCÐHgÑDgÐqtð  vXñ  rXØOÐYtð  xð  Arð  {Kð Kð  T[ð  \tñ  Tuô	vô 	Ð1Ð9MÐWZð  \Eñ  XEð  ORð  Swñ  OwØ.Ð8Ið  THð  Qzð  C~ð hð  qxð  y]ñ  q^Ø;¸DÀÑ<PÐQTÐ;UÐUZÐ[_Ð`lÑ[mÐnqÐZrÐrxÐy}ð  Wñ  zXð  Y\ð  y]ð  ]dð  eið  jCñ  eDð  EHð  dIð  IGð  Hô	Iô 	Ð,°GÀSÐIzÑEzð  EHð  Iiñ  EiØMÐW~ð  I[ð  dSð  \mØ{ð  ELð  Mhñ  Eiô	jô 	Ð*°)ÐE`Ðjmð  oRñ  kRØFÐPoð  z\ð  eEð  Ncð Lð  U\ð  ]pñ  Uqô	rð; €EðBhô, iyð  zDó  iEð  hFð FBô
 COð  QIð  Kkð  Pló  Cmð  Bnð nOÜO[ò  ]Nó  POð  OPð PVÜVbò  dfó  Wgð  Vhð hà‡�ˆƒÐ ð ð?!€HôD �Ñ€DØ‡O�O�H w€OÔ/Ø€Kr¡   Ú__main__)ÚreturnÚNone)rt   Údictr  zdict[str, dict])rt   r  r³   r  r  ú
list[dict])rT   r  r  r  )rT   r  r  r:   )rr   z	list[str]r  r:   )r§   r:   r  r:   )r§   r:   rü   r:   rý   r:   rþ   r:   râ   r:   rÿ   r:   rã   r:   r¨   r:   rµ   r:   r   r:   rv   r  rõ   r:   r  r:   )r  r   )Ú__doc__Ú
__future__r   rÜ   rú   Úpathlibr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotr@   Únumpyr7   rV   r   rQ   r`   rx   r°   r¿   r×   rà   ró   rñ   rô   r  r  Ú__name__Úprintrù   r¡   r_   Ú<module>r#     s·  ðÙ DÝ "ã Û Ý ã Ø €
‡�ˆuÔ Ý Û å à
Ð'Ñ'€óó<ò(Ð óó:ó$ò }ÚWò Vñð 0Ð1DÐEÚWÚqñò {ÚWò Rñò Ø*Ð+Úcñò xØ1Ð2Ø,Ð.IÐJñò Ø1Ð2Ø4Ð6NÐOñò TØ&Ð(@ÐAò Fñò dÚiò xñ%ò }Ø1Ð2Ú\ñ ð 4Ð4Ø3Ð5LÐMÚXññ]3€
ólóð $&ñØðØ #ðØ-0ðØ:=ðØHKðàðà ðà*-óó.Nðb ˆzÒÙ	‰%‹'…Nð r¡   