Ë
    `ª§j#k  ã                  óð  — 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	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lZddlmZmZ d	d
lmZmZmZmZmZmZmZmZmZm Z  d	dl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d	dl,m-Z- e"dz  Z.dZ/dZ0dZ1 ed«      Z2e2jg                  «       r?ejh                  jk                   e6e2«      «       dejn                  d<   dejn                  d<   ejp                  fd0d„Z9d1d„Z:d2d„Z;d3d„Z<d4d„Z=d5d6d„Z>d5d7d„Z?d8d„Z@d9d„ZAd:d„ZBdddd d!œ	 	 	 	 	 	 	 	 	 	 	 	 	 d;d"„ZCd<d#„ZDd=d$„ZEd>d%„ZFd?d&„ZGd@d'„ZHd?d(„ZId?d)„ZJd?d*„ZKd?d+„ZLdAd,„ZMdBd-„ZNdCd.„ZOePd/k(  r eO«        yy)DaÑ  Generate local, sample-level input-response diagnostics for prepared models.

The artifacts in this module are deliberately *not* feature importance claims.
They are absolute input-times-gradient responses of an unvalidated model's mean
raw output at one prepared sample (run ``18h01`` where a run is applicable).
They answer which inputs the executed network is locally sensitive to, not what
caused a forming defect or what is predictive in a new production run.
é    )ÚannotationsN)ÚPath)ÚAnyÚCallableÚAgg)Úfont_manager)ÚTensorÚnné   )
Ú	CNN2DUNetÚDGCNNSegÚFNO2dÚMeshGraphProcessorÚPhysicsConstrainedRiskGNNÚPointNetSegÚSparseUNetOptionalÚTabularSurrogateÚUNet3DÚUVNetFaceModel)
ÚROOTÚ
brep_inputÚgraph_inputsÚimage_inputÚpoint_inputsÚprocess_conditionsÚsparse_batch_collateÚsparse_voxel_inputÚtabular_inputÚvoxel_input)Úload_training_datazresults/models/attributionsÚ18h01z6absolute input-times-gradient of mean raw model outputz‚Local response diagnostic only. production_valid=false; no causal, validated-prediction, or cross-sample feature-importance claim.z2/System/Library/Fonts/Supplemental/AppleGothic.ttfÚAppleGothiczfont.familyFzaxes.unicode_minusc                ó0   — t        j                  | |¬«      S )N©Údtype)ÚtorchÚ	as_tensor)Úvaluer%   s     úmodels/attributions.pyÚ_tensorr*   0   s   € Ü�?‰?˜5¨Ô.Ð.ó    c                ó    — |€yt         |z  }|j                  «       sd|› �S t        j                  |dd¬«      }| j	                  |d   «       |S )zFLoad only an existing diagnostic checkpoint, retaining its provenance.Úrandom_initializationzmissing_checkpoint:ÚcpuF)Úmap_locationÚweights_onlyÚ
state_dict)r   Úexistsr&   ÚloadÚload_state_dict)ÚmodelÚ
checkpointÚpathÚpayloads       r)   Ú_loadr9   4   sV   € àÐØ&Ü�*Ñ€DØ�;‰;Œ=Ø$ Z LÐ1Ð1Ü�j‰j˜¨EÀÔF€GØ	×Ñ˜' ,Ñ/Ô0ØÐr+   c                óD   — d| › d�}t         |z  j                  «       r|S |S )zKUse the exact state behind the displayed 18h01 CAD diagnostic when present.z1results/models/cad_predictions/checkpoints/18h01-z.pt)r   r2   )ÚslugÚfallbackÚ	candidates      r)   Ú_preferred_checkpointr>   @   s+   € àCÀDÀ6ÈÐM€IÜ 	Ñ)×1Ñ1Ô3ˆ9ÐA¸ÐAr+   c                ó  — | j                  «        |D �cg c]/  }|j                  «       j                  «       j                  d«      ‘Œ1 }}| j	                  d¬«        ||Ž }|j                  «       dk(  s#t        j                  |«      j                  «       st        d«      ‚|j                  «       j                  «        g }|D ]¹  }|j                  �-t        j                  |j                  «      j                  «       st        d«      ‚|j                  ||j                  z  j                  «       j                  «       j                  «       j!                  «       j#                  t$        j&                  «      «       Œ» |S c c}w )NT)Úset_to_noner   z)attribution output is empty or non-finitez-attribution gradient is missing or non-finite)ÚevalÚdetachÚcloneÚrequires_grad_Ú	zero_gradÚnumelr&   ÚisfiniteÚallÚRuntimeErrorÚmeanÚbackwardÚgradÚappendÚabsr.   ÚnumpyÚastypeÚnpÚfloat32)r5   ÚforwardÚinputsr(   ÚleavesÚresultÚleafs          r)   Ú_grad_x_inputrX   F   s#  € Ø	‡J�J„LÙGMÓNÁv¸eˆe�l‰l‹n×"Ñ"Ó$×3Ñ3°DÕ9Àv€FÐNØ	‡O�O €OÔ%Ù�VÐ€EØ‡{�{ƒ}˜Ò¤§¡°Ó!6×!:Ñ!:Ô!<ÜÐFÓGÐGØ	‡J�JƒL×ÑÔØ€FÛˆØ�9‰9Ð¤E§N¡N°4·9±9Ó$=×$AÑ$AÔ$CÜÐNÓOÐOØ�‰�t˜dŸi™iÑ'×,Ñ,Ó.×5Ñ5Ó7×;Ñ;Ó=×CÑCÓE×LÑLÌRÏZÉZÓXÕYð ð €Mùò Os   •4Fc                ór   — | D �cg c]  }t        |«      ‘Œ } }| | D �cg c]  }d|z   ‘Œ	 c}z   S c c}w c c}w )Nzvalid_mask: )Ústr)ÚnamesÚnames     r)   Ú_names_with_masksr]   V   sA   € Ù#(Ó)¡5˜4ŒS��Y 5€EÐ)Ø±eÓ<±e¨d�N TÓ)°eÑ<Ñ<Ð<ùò *ùÚ<s   …/ž4c           
     ó(  — t        j                  | t        «      j                  d«      } t        j                  | «      d d d…   d t        |t        | «      «       }|D �cg c](  }|t        |«         t        | t        |«         «      dœ‘Œ* c}S c c}w )Néÿÿÿÿ)ÚfeatureÚresponse)rQ   ÚasarrayÚfloatÚreshapeÚargsortÚminÚlenÚint)Úvaluesr[   ÚlimitÚindexÚis        r)   Ú_toprm   [   s{   € Ü�Z‰Z˜¤Ó&×.Ñ.¨rÓ2€FÜ�J‰J�vÓ™t ˜tÑ$Ð%=¤c¨%´°V³Ó&=Ð>€EÙSXÓYÑSXÈa˜œc !›f™´5¸ÄÀAÃ¹Ó3HÓIÐSXÑYÐYùÒYs   Á-Bc           
     óz  — t        |||«      }|D �cg c]  }|d   ‘Œ	 c}d d d…   }|D �cg c]  }|d   ‘Œ	 c}d d d…   }t        j                  dt        ddt	        |«      z  dz   «      fd¬	«      \  }	}
|
j                  t        j                  t	        |«      «      |d
¬«       |
j                  t        j                  t	        |«      «      |d¬«       |
j                  d«       |
j                  |«       |
j                  dd¬«       |	j                  | d¬«       t        j                  |	«       y c c}w c c}w )Nr`   r_   ra   é	   gÍÌÌÌÌÌ@gÃõ(\�ÂÕ?g333333ó?T©ÚfigsizeÚconstrained_layoutz#276fbf)Úcoloré   )Úfontsizeu   absolute input Ã— gradientÚxg      Ð?)ÚaxisÚalphaé–   ©Údpi)rm   ÚpltÚsubplotsÚmaxrg   ÚbarhrQ   ÚarangeÚ
set_yticksÚ
set_xlabelÚ	set_titleÚgridÚsavefigÚclose)r7   ri   r[   Útitlerj   ÚpicksÚrowÚlabelsÚscoreÚfigÚaxs              r)   Ú	_plot_barrŽ   a   s  € Ü�˜ Ó&€EÙ(-Ó.© ˆc�)‹n¨Ñ.©t°¨tÑ4€FÙ(-Ó.© ˆS�‹_¨Ñ.©t°¨tÑ4€EÜ�l‰l A¤s¨3°´c¸&³kÑ0AÀCÑ0GÓ'HÐ#IÐ^bÔc�G€CˆØ‡G�GŒB�I‰I”c˜&“kÓ" E°€GÔ;Ø‡M�M”"—)‘)œC ›KÓ(¨&¸1€MÔ=Ø‡M�MÐ.Ô/Ø‡L�L�ÔØ‡G�G�˜C€GÔ Ø‡K�K�˜#€KÔÜ‡I�Iˆc…Nùò /ùÚ.s
   ’D3«D8c                ó  — t        j                  dd¬«      \  }}|j                  |d¬«      }|j                  |«       |j	                  «        |j                  ||d¬«       |j                  | d¬	«       t        j                  |«       y )
N)é   g      @Trp   Úmagma)Úcmapõ   mean absolute input Ã— gradient)r�   Úlabelry   rz   )r|   r}   Úimshowrƒ   Úset_axis_offÚcolorbarr…   r†   )r7   Úspatialr‡   rŒ   r�   Úimages         r)   Ú	_plot_maprš   o   sk   € Ü�l‰l 8ÀÔE�G€CˆØ�I‰I�g GˆIÓ,€EØ‡L�L�Ô˜Ÿ™Ô*Ø‡L�L�˜2Ð%F€LÔGØ‡K�K�˜#€KÔÜ‡I�Iˆc…Nr+   c                óÆ  — t        d«      D �cg c]  }|j                  |¬«      ‘Œ }}t        j                  dddd¬«      \  }}t	        ||d«      D ]O  \  }}}	|j                  |dd	¬
«      }
|j                  |	«       |j                  «        |j                  |
|d¬«       ŒQ |j                  |«       |j                  | d¬«       t        j                  |«       y c c}w )Né   ©rw   r   )é   g      @Trp   )z
max over Xz
max over Yz
max over Zr‘   Úauto)r’   Úaspectgš™™™™™©?)r�   Úfractionry   rz   )Úranger~   r|   r}   Úzipr•   rƒ   r–   r—   Úsuptitler…   r†   )r7   ri   r‡   rl   ÚprojectionsrŒ   Úaxesrw   r(   r”   r™   s              r)   Ú_plot_volumer§   x   sÄ   € ä/4°Q¬xÓ8©x¨!�6—:‘: 1�:Õ%¨x€KÐ8Ü—‘˜Q ¨9ÈÔN�I€CˆÜ! $¨Ð5_Ö`Ñˆˆe�UØ—‘˜E¨¸�Ó?ˆØ�‰�uÔ˜t×0Ñ0Ô2°C·L±LÀÈ4ÐZ]°LÕ4^ð að ‡L�L�ÔØ‡K�K�˜#€KÔÜ‡I�Iˆc…Nùò 9s   ŽCc           	     ó¬  — t        dt        |«      dz  «      }t        j                  dd¬«      }|j	                  d¬«      }|j                  |d d |…df   |d d |…df   |d d |…d	f   |d d |…   d
d¬«      }|j                  |«       |j                  «        |j                  ||dd¬«       |j                  | d¬«       t        j                  |«       y )Nr   ià.  )r�   é   Trp   Ú3d)Ú
projectionr   é   g      ø?r‘   )ÚcÚsr’   gÍÌÌÌÌÌä?r“   )r�   Úshrinkr”   ry   rz   )r~   rg   r|   ÚfigureÚadd_subplotÚscatterrƒ   r–   r—   r…   r†   )r7   Úposr(   r‡   ÚsteprŒ   r�   Úpointss           r)   Ú_plot_surfacer¶   „   sÐ   € äˆq”#�c“(˜eÑ#Ó$€DÜ
�*‰*˜V¸Ô
=€CØ	�‰ DˆÓ	)€BØ�Z‰Z˜™F˜d˜F A˜I™¨©F¨d¨F°A¨I©¸¹F¸d¸FÀA¸I¹È%ÑPVÐRVÐPVÉ-Ø Gð ó -€Fà‡L�L�Ô˜Ÿ™Ô*¨C¯L©L¸ÀBÈsØ@að -9ô -cà‡K�K�˜#€KÔÜ‡I�Iˆc…Nr+   Ú ©Úspatial_npzÚmap_fileÚprocessÚnotec               ó´   — d|v }
i d| “dd“dt         “d|“d|
rdnd	|v rd
nd“d|
“d|“dt        “d|“dd“dd“dt        “dt        ||«      “d|“d|“d|“d|	“S )Nz"cad_predictions/checkpoints/18h01-r5   ÚstatusÚ	completedÚmethodr6   Úcheckpoint_scopeú18h01 weak-label diagnostic fitÚweak_gnnzweak-label diagnosticú6two-step synthetic zero-output learnability diagnosticÚ"matches_displayed_18h01_predictionÚinput_sourceÚsampleÚoutput_selectorÚproduction_validFÚgeneralization_measuredÚwarningÚfeature_response_topr¹   rº   Úprocess_responser¼   )ÚMETHODÚRUNÚWARNINGrm   )r\   r6   rÆ   rÈ   Úfeature_namesÚfeature_valuesr¹   rº   r»   r¼   Ú	displayeds              r)   Ú_recordrÔ   ‘   sø   € ð 5¸
ÐB€IðØ�ðØ ðØ.6¼ðà�jðà"4Ñ\eÑ7XØ,6¸*Ñ,DÑ(ØIð	ð
 	-¨iðð 	˜ðð '/´ðð 6GÈðð 	˜Eðð $=¸eðð FOÔPWðð 	¤ ^°]Ó Cðð 	�{ðð %/°ðð ;MÈgðð 	�ðð r+   c                óN   — t         t        | |«      t        t        | «      «      dœS )N)rÀ   rÌ   Úfeature_count)rÎ   rm   rh   rg   )ra   r[   s     r)   Ú_process_summaryr×   ¤   s$   € Ü´d¸8ÀUÓ6KÜ ¤ X£Ó/ñ1ð 1r+   c                 ót  ‡— t        «       } t        «       \  }}}}|j                  t        «      }t	        j
                  | d   | d   j                  t        j                  «      gd«      }t	        j
                  ||j                  t        j                  «      gd«      ||dz    }t        |«      }t        |j                  t        |«      d¬«      «      }	t        t	        j                  t        | d   z  d¬«      d	   «      }
t	        j                  t        |z  d¬«      }t        t        |d
   j                  t        «      «      t        |d   j                  t        «      «      z   «      }g }i }dt         ddfdt"        ddffD �]­  \  }}}} ||j$                  d   |	j$                  d   ¬«      Št'        ‰t)        ||«      «      }t+        ‰ˆfd„||	«      \  }}|j-                  d¬«      }|j-                  d¬«      }|j/                  «       j1                  dd«      j1                  dd«      }t3        t4        |› d�z  ||
|› d�«       t7        t4        |› d�z  ||› d�«       t3        t4        |› d�z  |j-                  d«      ||› d�«       |||<   t	        j8                  t4        |› d�z  |||j-                  d«      t	        j:                  |
«      t	        j:                  |«      ¬ «       |j=                  t?        ||| d   d!|
||› d�|› d�tA        |j-                  d«      |«      ¬"«	      «       �Œ° ||fS )#Nrv   Úmaskr   r   r�   ÚsourceF©Úallow_picklerÑ   Úprocess_feature_namesÚgeometry_feature_namesz2D CNN/U-Netz2d-cnn-u-netz3results/models/checkpoints/synthetic_2d_cnn_unet.ptr   Úfno2dz-results/models/checkpoints/synthetic_fno2d.pt©Ú
global_dimc                ó<   •— t        j                   ‰| |«      «      S ©N©r&   Úsigmoid©ÚaÚbr5   s     €r)   Ú<lambda>zimage_models.<locals>.<lambda>¸   s   ø€ ÄuÇ}Á}ÑUZÐ[\Ð^_ÓU`ÔGar+   ©r   r¬   rœ   ©r   r   Ú/Ú-Ú z-channels.pngz: CAD image channel responseú-map.pngz: six-view mean responsez-process.pngz: XLS/CAD-summary responseú.npz©Úchannel_responseÚspatial_responserÍ   rÑ   rÝ   z8mean weak-fit predicted probability across six CAD views©r¹   rº   r»   )!r   r   rk   rÏ   rQ   ÚconcatenaterP   rR   r*   Úrepeatrg   r]   r3   r   ÚlistrZ   r   r   Úshaper9   r>   rX   rJ   ÚlowerÚreplacerŽ   ÚOUTrš   Úsavez_compressedrb   rM   rÔ   r×   )ÚdataÚ	process_xÚprocess_maskÚrun_idsÚprocess_sourceÚrunÚx_npÚp_nprv   ÚprÑ   ÚtabularÚprocess_namesÚoutÚarraysr”   Úclsr;   ÚckptÚloadedÚsaliencyÚprocess_saliencyÚchannelr˜   Ústemr5   s                            @r)   Úimage_modelsr  ©   s/  ø€ Ü‹=€DÔM_ÓMaÑJ˜) \°7¸NØ
�-‰-œÓ
€CÜ�>‰>˜4 ™9 d¨6¡l×&9Ñ&9¼"¿*¹*Ó&EÐFÈÓJ€DÜ�>‰>˜9 l×&9Ñ&9¼"¿*¹*Ó&EÐFÈÓJÈ3ÈsÐUVÉwÐW€DÜ�‹€Aœ7 4§;¡;¬s°4«y¸q ;Ó#AÓB�qÜ%¤b§g¡g¬d°T¸(±^Ñ.CÐRWÔ&XÐYhÑ&iÓj€MÜ�g‰g”d˜^Ñ+¸%Ô@€GÜ%¤d¨7Ð3JÑ+K×+RÑ+RÔSVÓ+WÓ&XÔ[_Ð`gð  iAñ  aB÷  aIñ  aIô  JMó  aNó  \Oñ  'Oó  P€MØ "€CÀB Fà	œ NÐ4iÐjØ	”%˜Ð"QÐRô#Ñˆˆs�D˜$ñ �A—G‘G˜A‘J¨1¯7©7°1©:Ô6ˆÄÀuÔNcÐdhÐjnÓNoÓAp¸Ü%2°5Ó:aÐcdÐfgÓ%hÑ"ˆÐ"Ø—-‘- Y�-Ó/ˆ¸8¿=¹=Èf¸=Ó;U°Ø�{‰{‹}×$Ñ$ S¨#Ó.×6Ñ6°s¸CÓ@ˆÜ”#˜4˜& Ð.Ñ.°¸È5È'ÐQmÐHnÔoÜ”#˜4˜& Ð)Ñ)¨7°u°gÐ=UÐ4VÔWÜ”#˜4˜& Ð-Ñ-Ð/?×/DÑ/DÀQÓ/GÈÐ[`ÐZaÐa{ÐX|Ô}Øˆˆt‰Ü
×ÑœC T F¨$ -Ñ/À'Ð\cØ-=×-BÑ-BÀ1Ó-EÔUW×U_ÑU_Ð`mÓUnÜ24·*±*¸]Ó2Kõ	Mð 	�
‰
”7˜5 &¨$¨x©.Ð:tØ(¨'À$ÀÀt¸}ÐZ^ÐY_Ð_gÐWhÜ#3Ð4D×4IÑ4IÈ!Ó4LÈmÓ#\ô^ö 	_ð#ð$ �ˆ;Ðr+   c                 óD  ‡— t        «       } t        «       \  }}}}|j                  t        «      }t	        j
                  | d   | d   j                  t        j                  «      gd«      d    }t	        j
                  ||j                  t        j                  «      gd«      ||dz    }t        |«      t        |«      }	}t        |j                  d   |	j                  d   ¬«      Št        ‰t        dd«      «      }
t        ‰ˆfd„||	«      \  }}|j                  d	¬
«      }|j                  d¬
«      }t        t	        j                   t"        | d   z  d¬«      d   «      }t	        j                   t"        |z  d¬«      }t        t%        |d   j                  t&        «      «      t%        |d   j                  t&        «      «      z   «      }t)        t*        dz  ||d«       t-        t*        dz  |d«       t)        t*        dz  |j                  d«      |d«       t	        j.                  t*        dz  |||j                  d«      t	        j0                  |«      t	        j0                  |«      ¬«       t3        d|
| d   d||ddt5        |j                  d«      |«      d¬«
      |fS )Nrv   rÙ   r   r   rà   zdense-3d-u-netz/results/models/checkpoints/synthetic_3d_unet.ptc                ó<   •— t        j                   ‰| |«      «      S rã   rä   ræ   s     €r)   ré   zvoxel_model.<locals>.<lambda>Î   s   ø€ Ä5Ç=Á=ÑQVÐWXÐZ[ÓQ\ÔC]r+   )r   r¬   rœ   é   r�   rë   rÚ   FrÛ   rÑ   rÝ   rÞ   zdense-3d-u-net-channels.pngz&Dense 3D U-Net: voxel-channel responsezdense-3d-u-net-map.pngz&Dense 3D U-Net: surface-voxel responsezdense-3d-u-net-process.pngz(Dense 3D U-Net: XLS/CAD-summary responsezdense-3d-u-net.npzrñ   zDense 3D U-Netz)mean weak-fit predicted voxel probabilityzPSurface-only voxel representation; the map is not a solid material-volume field.r¸   )r   r   rk   rÏ   rQ   rõ   rP   rR   r*   r   rø   r9   r>   rX   rJ   r]   r3   r   r÷   rZ   rŽ   rû   r§   rü   rb   rÔ   r×   )rý   rþ   rÿ   r   r  r  r  r  rv   r  r  r  r  r  r˜   r[   Úrawr  r5   s                     @r)   Úvoxel_modelr  È   sœ  ø€ Ü‹=€DÔM_ÓMaÑJ˜) \°7¸NÐip×ivÑivÔwzÓi{ÐcfÜ�>‰>˜4 ™9 d¨6¡l×&9Ñ&9¼"¿*¹*Ó&EÐFÈÓJÈ4ÑP€DÜ�>‰>˜9 l×&9Ñ&9¼"¿*¹*Ó&EÐFÈÓJÈ3ÈsÐUVÉwÐW€DÜ�4‹=œ' $›-€q€AÜ�1—7‘7˜1‘:¨!¯'©'°!©*Ô5€EÄÀeÔMbÐcsð  vgó  Nhó  Ai°vÜ!.¨uÓ6]Ð_`ÐbcÓ!dÑ€HÐØ�m‰m ˆmÓ.€G¸(¿-¹-ÈV¸-Ó:T°ÜœbŸg™g¤d¨T°(©^Ñ&;È%ÔPÐQ`ÑaÓb€EÜ
�'‰'”$˜Ñ'°eÔ
<€CÜ%¤d¨3Ð/FÑ+G×+NÑ+NÌsÓ+SÓ&TÔW[Ð\_Ð`xÑ\y÷  ]Añ  ]Aô  BEó  ]Fó  XGñ  'Gó  H€MÜŒcÐ1Ñ1°7¸EÐCkÔlÜ”Ð/Ñ/°Ð:bÔcÜŒcÐ0Ñ0Ð2B×2GÑ2GÈÓ2JÈMð  \Fô  GÜ×ÑœÐ2Ñ2ÀWÐ_fØ)9×)>Ñ)>¸qÓ)AÔQS×Q[ÑQ[Ð\aÓQbÔz|÷  {Eñ  {Eð  FSó  {TõUäÐ# V¨T°(©^Ð=hÐjoÐqxØ3Ð>VÜ+Ð,<×,AÑ,AÀ!Ó,DÀmÓTØjôlð nuðuð ur+   c                 ó  ‡‡‡— 	 ddl Št        «       }t	        |d	   |d
   «      \  }}t        |t        j                  «      Št        |«      }t        |j                  d   «      Št        dd«      }t        |z  j                  «       rt        ‰|«      }d}n1t        j                  d«       t        |j                  d   «      Šd}d}t        ‰ˆˆˆfd„|«      d   }|j!                  d«      |j!                  d«      }
}	t#        j$                  t        |d   z  d¬«      }t'        |d   «      }t#        j(                  |d   t"        j*                  «      t-        |d   «      }}|t#        j(                  |d	   t"        j*                  «      dz   |z  z   }t/        t0        dz  |	|d«       t3        t0        dz  ||
d«       t#        j4                  t0        dz  |	|
|t#        j(                  |d	   t"        j                  «      t#        j(                  |«      ¬«       t7        d||d   d||	ddd ¬!«	      }d"|v rd#nd$|d%<   d"|v rd&n||d'<   d"|v rd(|d)<   |S |dk7  rd*|d)<   |S # t        $ r} ddddt        d| › �dœcY d} ~ S d} ~ ww xY w)+zGRun a true sparse attribution only when the optional backend is usable.r   NzSparse U-NetÚunavailable_optional_backendÚMinkowskiEngineFzbackend import unavailable: )r5   r¾   ÚbackendrÉ   rË   ÚreasonÚcoordsÚfeaturesr   zsparse-3d-u-netz3results/models/checkpoints/synthetic_sparse_unet.ptrÄ   é   Ú*random_initialization_seed17_no_checkpointz9fixed-seed random initialization; no checkpoint availablec                ó~   •— t        j                   ‰‰j                  | ‰¬«      «      j                  d d …df   «      S )N)r  Úcoordinatesr   )r&   rå   ÚSparseTensorÚF)rç   ÚMEr  r5   s    €€€r)   ré   zsparse_model.<locals>.<lambda>ô   s4   ø€ ¬e¯m©m¹EÀ"Ç/Á/Ð[\ÐjpÀ/ÓBqÓ<r×<tÑ<tÒuvÐxyÐuyÑ<zÔ.{r+   rÚ   rÛ   rÑ   Úgrid_origin_mmÚvoxel_pitch_mmg      à?zsparse-3d-u-net-features.pngz-Sparse U-Net: occupied-voxel feature responsezsparse-3d-u-net-map.pngz-Sparse U-Net: occupied surface-voxel responsezsparse-3d-u-net.npz)Úfeature_responseÚvoxel_responseÚvoxel_center_mmÚvoxel_coordsrÑ   z0mean weak-fit predicted sparse-voxel probabilityzMBackend executed in this environment, but no fitted sparse checkpoint exists.©r¹   rº   r¼   zcad_predictions/checkpointsr¿   Ú!completed_untrained_backend_smoker¾   rÂ   rÁ   z[This is the exact weak-label diagnostic checkpoint used for the displayed sparse CAD field.r¼   zhBackend executed with the two-step synthetic diagnostic checkpoint; it is not a fitted production model.)r  ÚImportErrorrÐ   r   r   r*   r&   Úint32r   rø   r>   r   r2   r9   Úmanual_seedrX   rJ   rQ   r3   r]   rb   rR   rc   rŽ   rû   r¶   rü   rÔ   )Úexcrý   Ú	coords_npÚfeatures_npr  r6   r  Úscoper  r`   r˜   r  r[   ÚoriginÚpitchr³   r‰   r$  r  r5   s                    @@@r)   Úsparse_modelr6  Þ   s¤  ú€ ðoÛ$ô Ó€DÜ1°$°x±.À$ÀzÑBRÓSÑ€Iˆ{Ü�Y¤§¡Ó,€F¼ÀÓ9M¨hÜ˜xŸ~™~¨aÑ0Ó1€EÜ&Ð'8Ð:oÓp€JÜˆzÑ×!Ñ!Ô#Ü�u˜jÓ)ˆØH‰ô 	×Ñ˜"ÔÜ" 8§>¡>°!Ñ#4Ó5ˆØ=ˆØKˆÜ˜UÕ${ð  ~Fó  Gð  HIñ  J€HØ—}‘} QÓ'¨¯©°qÓ)9ˆW€GÜ
�'‰'”$˜˜h™Ñ'°eÔ
<€CÜ˜c /Ñ2Ó3€EÜ—J‘J˜sÐ#3Ñ4´b·j±jÓAÄ5ÈÐM]ÑI^ÓC_ˆE€FØ
”B—J‘J˜t H™~¬r¯z©zÓ:¸RÑ?À5ÑHÑ
H€CÜŒcÐ2Ñ2°G¸UÐDsÔtÜ”#Ð1Ñ1°3¸ÐApÔqÜ×ÑœÐ3Ñ3ÀgÐ^eØ(+¼"¿*¹*ÀTÈ(Á^ÔUW×U]ÑU]Ó:^Ônp×nxÑnxÐy~ÓnõAä
�. &¨$¨x©.ØDÀeÈWÐbwØ4ð  <KôL€Cð $AÀFÑ#J‘KÐPs€Cˆ�MØC`ÐdjÑCjÑ?Ðpu€CÐÑØ$¨Ñ.ØsˆˆF‰ð €Jð 
Ð?Ò	?ð AˆˆF‰Ø€JøôK ò oØ'Ð3QÐ^oØ$)´gÐKgÐhkÐglÐImñoõ 	oûðoús   …I É	I>É$I9É3I>É9I>c                 ó  ‡— t        «       d   } t        j                  | d   | d   j                  t        j                  «      gd«      d    }t        |«      }t        j                  t        | d   z  d¬«      }t        |d   «      }t        j                  |d	   t        j                  «      }g }d
t        ddt        |«      fdt        dddffD �]9  \  }}}	}
}|d d …d |…f   } ||j                  d   fi |t        u rddini ¤ŽŠt        ‰t        |	|
«      «      }t!        ‰ˆfd„|«      d   }|j#                  d¬«      }|j#                  d¬«      }|j%                  «       }t'        t(        |› d�z  |||› d�«       t+        t(        |› d�z  |d | ||› d�«       t        j,                  t(        |› d�z  |||d | t        j                  |«      ¬«       |j/                  t1        ||| d   d|||› d�|› d�|dk(  rdnd ¬!«	      «       �Œ< |S )"Nr   rv   rÙ   r   rÚ   FrÛ   rÑ   Úpos_mmÚPointNetÚpointnetzCresults/models/checkpoints/synthetic_pointnet_cad_surface_points.ptÚDGCNNÚdgcnnz@results/models/checkpoints/synthetic_dgcnn_cad_surface_points.pti   r_   Úké   c                ó:   •— t        j                   ‰| «      «      S rã   rä   ©rç   r5   s    €r)   ré   zpoint_models.<locals>.<lambda>  s   ø€ ´%·-±-ÁÀaÃÔ2Ir+   rë   r�   )r   r¬   z-features.pngz: point-feature responserï   z: CAD point responserð   )r'  Úpoint_responseÚpoint_pos_mmrÑ   z)mean weak-fit predicted point probabilityz7DGCNN uses the executed deterministic 512-point prefix.r·   r+  )r   rQ   rõ   rP   rR   r*   r3   r   r]   rb   r   rg   r   rø   r9   r>   rX   rJ   rù   rŽ   rû   r¶   rü   rM   rÔ   )Úitemr  rv   r  r[   r³   Úrowsr”   r
  r;   r  ÚcapÚzr  r  r`   r˜   r  r5   s                     @r)   Úpoint_modelsrG  
  s:  ø€ Ü‹>˜!Ñ€DÜ�>‰>˜4 ™9 d¨6¡l×&9Ñ&9¼"¿*¹*Ó&EÐFÈÓJÈ4ÑP€DÜ�‹€AÜ
�'‰'”$˜˜h™Ñ'°eÔ
<€CÜ˜c /Ñ2Ó3€EÜ
�*‰*�S˜‘]¤B§J¡JÓ
/€CØ€Dà	”[ *Ð.sÔuxÐy|Óu}Ð~Ø	”(˜GÐ%gÐilÐmô(Ñ#ˆˆs�D˜$ ð Ša��#�ˆg‰Jˆ¡ A§G¡G¨B¡KÑ ZÀÌÁ°S¸"±IÐVXÑ Z˜ÔejÐkpô  sHð  IMð  OSó  sTó  fUÐ\bÜ  Ó(IÈ1ÓMÈaÑPˆØ—-‘- V�-Ó,ˆ¸¿¹È6¸Ó8R¨gØ�{‰{‹}ˆÜ”#˜4˜& Ð.Ñ.°¸À5À'ÐIaÐ@bÔcÜ”c˜t˜f HÐ-Ñ-¨s°4°C¨y¸'ÀeÀWÐL`ÐCaÔbÜ
×ÑœC T F¨$ -Ñ/À'ÐZaØ),¨T¨c¨Ä"Ç*Á*ÈUÓBSõ	Uà�‰”G˜E 6¨4°©>Ð;fÐhmÐovØ+/¨&°¨À4À&ÈÐ@QØ_bÐfiÒ_iÑ"[Ðoqôtö 	uð(ð €Kr+   c                 óV  ‡‡‡— t        t        «       d„ ¬«      } t        «       \  }}}}|j                  t        «      }t        j                  | d   | d   j                  t
        j                  «      gd«      }t        j                  | d   t
        j                  «      j                  «       }|d d …dfxx   dz  cc<   t        j                  ||j                  t
        j                  «      gd«      ||dz    }t        |«      t        |«      t        |«      }}
}	t        | d	   t        j                  «      Št        j                  t        |	«      t        j                  ¬
«      Št!        |	j"                  d   |
j"                  d   |j"                  d   «      Št%        ‰t'        dd«      «      }t)        ‰ˆˆˆfd„|	|
|«      \  }}}|j+                  d«      }|j+                  d«      }t-        t        j.                  t0        | d   z  d¬«      d   «      }t        j.                  t0        |z  d¬«      }t-        t3        |d   j                  t4        «      «      t3        |d   j                  t4        «      «      z   «      }t7        t8        dz  ||d«       t;        t8        dz  t        j.                  t0        | d   z  d¬«      d   |d«       t7        t8        dz  |j+                  d«      |d«       t        j<                  t8        dz  |||j+                  d«      |j+                  d«      t        j.                  t0        | d   z  d¬«      d   t        j                  |«      t        j                  |«      ¬«       t?        d|| d   d||ddtA        |j+                  d«      |«      ¬«	      S ) Nc                ó   — | d   S ©NÚnodes© ©r‰   s    r)   ré   zmesh_model.<locals>.<lambda>%  ó   € °°G²r+   ©Úkeyrv   rÙ   r   Ú	edge_attrr   g     @�@Ú
edge_indexr$   zmesh-gnnz4results/models/checkpoints/synthetic_meshgraphnet.ptc           	     óB   •— t        j                   ‰| ‰||‰«      «      S rã   rä   )rç   rè   r­   ÚbatchrR  r5   s      €€€r)   ré   zmesh_model.<locals>.<lambda>-  s0   ø€ ÔUZ×UbÑUbÑchÐijÐlvÐxyÐ{|ð  Dó  dEô  VFr+   rÚ   FrÛ   rÑ   rÝ   rÞ   zmesh-gnn-features.pngzMesh GNN: node-feature responsezmesh-gnn-map.pngr8  zMesh GNN: CAD-node responsezmesh-gnn-process.pngz"Mesh GNN: XLS/CAD-summary responsezmesh-gnn.npz©Únode_feature_responseÚnode_responseÚedge_feature_responserÍ   r8  rÑ   rÝ   zMesh GNNz,mean weak-fit predicted CAD-node probabilityrô   )!r~   r   r   rk   rÏ   rQ   rõ   rP   rR   rb   Úcopyr*   r&   ÚlongÚzerosrg   r   rø   r9   r>   rX   rJ   r]   r3   r   r÷   rZ   rŽ   rû   r¶   rü   rÔ   r×   )Úgraphrþ   rÿ   r   r  r  r  Úedge_npÚ
process_nprv   Úedger  r  r  Úedge_saliencyr  r`   r˜   r[   r  r  rT  rR  r5   s                        @@@r)   Ú
mesh_modelra  $  sr  ú€ Ü”“Ñ$<Ô=€EÜ7IÓ7KÑ4€Iˆ|˜W nÐSZ×S`ÑS`ÔadÓSeÈSÜ�>‰>˜5 ™: u¨V¡}×';Ñ';¼B¿J¹JÓ'GÐHÈ!ÓL€DÜ�j‰j˜˜{Ñ+¬R¯Z©ZÓ8×=Ñ=Ó?€GÀÊÈAÈÃÐRXÑAXÃÜ—‘ ¨L×,?Ñ,?ÄÇ
Á
Ó,KÐ LÈaÓPÐQTÐUXÐ[\ÑU\Ð]€JÜ˜“¤¨Ó 0´'¸*Ó2EˆQ€t€AÜ˜˜|Ñ,¬e¯j©jÓ9€JÄ5Ç;Á;ÌsÐSTËvÔ]b×]gÑ]gÔCh¸5Ü˜qŸw™w q™z¨4¯:©:°a©=¸!¿'¹'À!¹*ÓE€EÔPUÐV[Ô]rÐs}ð  @vó  ^wó  QxÀvÜ0=¸eõ  FFð  HIð  KOð  QRó  1SÑ-€HˆmÐ-Ø�m‰m˜AÓ€G¨(¯-©-¸Ó*: ÔDUÔVX×V]ÑV]Ô^bÐejÐksÑetÑ^tð  DIô  WJð  KZñ  W[ó  E\¸EÜ
�'‰'”$˜Ñ'°eÔ
<€CÜ%¤d¨3Ð/FÑ+G×+NÑ+NÌsÓ+SÓ&TÔW[Ð\_Ð`xÑ\y÷  ]Añ  ]Aô  BEó  ]Fó  XGñ  'Gó  H€MÜŒcÐ+Ñ+¨W°eÐ=^Ô_Ü”#Ð*Ñ*¬B¯G©G´D¸5À¹?Ñ4JÐY^Ô,_Ð`hÑ,iÐkrð  uRô  SÜŒcÐ*Ñ*Ð,<×,AÑ,AÀ!Ó,DÀmÐUyÔzÜ×Ñœ˜nÑ,ÀGÐ[bØ.;×.@Ñ.@ÀÓ.CÐVf×VkÑVkÐlmÓVnÜ!Ÿw™w¤t¨e°H©oÑ'=ÈEÔRÐS[Ñ\Ôln×lvÑlvÐw|Ól}Ü.0¯j©j¸Ó.GõIô �:˜v u¨X¡Ð8fÐhmÐovØ-Ð8JÜ+Ð,<×,AÑ,AÀ!Ó,DÀmÓTôVð Vr+   c                 óp  ‡‡‡— t        «       } | d   j                  t        «      }| d   }t        ||z  |dz   |z  «      }t	        | d   |   «      }t	        | d   d d …d | d   j
                  d   t        | d   «      z  …f   t        j                  «      Št	        | d   d ‰j
                  d    «      }t	        | d   ||dz    «      }t        j                  |t        j                  ¬«      Št        |j
                  d   |j
                  d   |j
                  d   t        dt        | d	   «      «      «      Št        ‰t        d
d«      «      }t        ‰ˆˆˆfd„|||«      \  }}	}
|j                  d«      }|j                  d«      }t        t!        «       d„ ¬«      }t#        t%        j&                  t(        |d   z  d¬«      d   «      }t%        j&                  t(        dz  d¬«      d   }|D �cg c]  }t+        |«      ‘Œ c}|D �cg c]  }dt+        |«      z   ‘Œ c}z   |D �cg c]  }dt+        |«      z   ‘Œ c}z   }t-        t.        dz  ||d«       t1        t.        dz  | d   |d«       t-        t.        dz  |
j                  d«      |d«       t%        j2                  t.        dz  |||	j                  d«      |
j                  d«      | d   t%        j4                  |«      t%        j4                  |«      ¬ «       t7        d!|dd"||ddt9        |
j                  d«      |«      d#¬$«
      S c c}w c c}w c c}w )%NÚrunsÚnodes_per_runr   Únoder_  rQ  r»   r$   Úclass_nameszrisk-gnnz.results/models/weak_gnn/diagnostic_weak_gnn.ptc           	     óH   •— t        j                   ‰| ‰||‰«      d   «      S )NÚ
risk_logiträ   )rç   rè   r­   rT  r_  r5   s      €€€r)   ré   zrisk_gnn.<locals>.<lambda>D  s6   ø€ ÔUZ×UbÑUbÑchÐijÐlpÐrsÐuvÐx}Óc~ð  @Lñ  dMô  VNr+   r   c                ó   — | d   S rJ  rL  rM  s    r)   ré   zrisk_gnn.<locals>.<lambda>F  rN  r+   rO  rÚ   FrÛ   rÑ   z/data_processed/paired/18h01_cad_ply_targets.npzrÝ   zobserved_mask: zimputed_mask: zrisk-gnn-features.pngz'Constrained risk GNN: CAD-node responsezrisk-gnn-map.pngÚ
cad_pos_mmz)Constrained risk GNN: risk-logit responsezrisk-gnn-process.pngz"Constrained risk GNN: XLS responsezrisk-gnn.npzrU  zConstrained risk GNNz<mean diagnostic weak-fit risk probability on 18h01 CAD nodesz—This checkpoint produces the displayed 18h01 condition; its underlying risk-GNN fit is joint across the two weak-label runs and remains non-production.r¸   )r    rk   rÏ   Úslicer*   rø   rg   r&   rZ  r[  r   r~   r9   r>   rX   rJ   r   r]   rQ   r3   r   rZ   rŽ   rû   r¶   rü   rb   rÔ   r×   )rý   r  ÚnÚslrv   rQ  r»   r  r  r`  r  r`   r˜   r\  r[   Ú	raw_namesr\   r  rT  r_  r5   s                     @@@r)   Úrisk_gnnro  =  s·  ú€ ÜÓ€D t¨F¡|×'9Ñ'9¼#Ó'> ÀDÈÑDYÀÔ`eÐfiÐlmÑfmÐpsÐvwÑpwÐ{|Ño|Ó`}Ð[]ä��V‘˜RÑ Ó!€A¬'°$°v±,ºqÐBmÀ4ÈÁ<×CUÑCUÐVWÑCXÔ\_Ð`dÐekÑ`lÓ\mÑCmÐBmÐ?mÑ2nÔpu×pzÑpzÓ*{ 4Ü˜˜[Ñ)¨.¨4¯:©:°a©=Ð9Ó:€IÄgÈdÐS\ÉoÐ^aÐbeÐhiÑbiÐNjÓFk¸GÔuz÷  vAñ  vAð  BCô  KP÷  KUñ  KUô  vVÐmrÜ% a§g¡g¨a¡j°)·/±/À!Ñ2DÀgÇmÁmÐTUÑFVÔX[Ð\]Ô_bÐcgÐhuÑcvÓ_wÓXxÓy€EÜ�5Ô/°
Ð<lÓmÓn€FÜ0=¸eõ  FNð  PQð  S\ð  ^eó  1fÑ-€HˆmÐ-Ø�m‰m˜AÓ€G¨(¯-©-¸Ó*: Ü”“Ñ$<Ô=€EÔGXÔY[×Y`ÑY`ÔaeÐhmÐnvÑhwÑawð  GLô  ZMð  N]ñ  Z^ó  H_¸uÜ—‘œÐPÑPÐ_dÔeÐf}Ñ~€IÙ+4Ó5©9 4”S˜•Y¨9Ñ5ÑclÓ8mÑclÐ[_Ð9JÌSÐQUËYÓ9VÐclÑ8mÑmñ  [dó  qeñ  [dð  SWð  rBô  EHð  IMó  ENó  rNð  [dñ  qeñ  e€MÜŒcÐ+Ñ+¨W°eÐ=fÔgÜ”#Ð*Ñ*¨D°Ñ,>ÀÐItÔuÜŒcÐ*Ñ*Ð,<×,AÑ,AÀ!Ó,DÀmÐUyÔzÜ×Ñœ˜nÑ,ÀGÐ[bØ.;×.@Ñ.@ÀÓ.CÐVf×VkÑVkÐlmÓVnØ# LÑ1ÄÇÁÈEÓARÔjl×jtÑjtð  vCó  kDõEô Ð)¨6Ð3dØQÐSXÐZaØ-Ð8JÜ+Ð,<×,AÑ,AÀ!Ó,DÀmÓTð rô	sð sùò 6ùÒ8mùò  qes   Ç0L)ÈL.È%L3c            
     ó–  ‡‡	— t        «       } t        | d   «      t        | d   t        j                  «      c}Št	        |j
                  d   «      Š	t        ‰	t        dd«      «      }t        ‰	ˆˆ	fd„|«      d   }|j                  d¬	«      |j                  d
¬	«      }}g d¢}t        j                  t        | d   z  d¬«      d   j                  d¬	«      }t        t        dz  ||d«       t        t        dz  ||d«       t        j                   t        dz  |||t        j"                  |«      ¬«       t%        d|| d   d||dd¬«      S )NÚgridsÚ	adjacencyr   zuv-netz-results/models/checkpoints/synthetic_uvnet.ptc                ó<   •— t        j                   ‰| ‰«      «      S rã   rä   )rç   rr  r5   s    €€r)   ré   zuv_model.<locals>.<lambda>Y  s   ø€ ¬e¯m©m¹EÀ!ÀYÓ<OÔ.Pr+   r   rê   r�   )r   r¬   rœ   )Úx_mmÚy_mmÚz_mmÚnormal_xÚnormal_yÚnormal_zÚkmax_1_per_mmÚkmin_1_per_mmÚgaussian_1_per_mm2Ú
trim_validÚnormal_validÚcurvature_validrÚ   FrÛ   r8  )r   r¬   zuv-net-features.pngz"UV-Net: face-grid channel responsezuv-net-map.pngzUV-Net: B-Rep face responsez
uv-net.npz)r'  Úface_responseÚface_centers_mmrÑ   zUV-Netz.mean weak-fit predicted B-Rep-face probability©r¹   rº   )r   r*   r&   rZ  r   rø   r9   r>   rX   rJ   rQ   r3   r   rŽ   rû   r¶   rü   rb   rÔ   )
rý   rv   r  r  r`   r˜   r[   r³   rr  r5   s
           @@r)   Úuv_modelrƒ  V  s^  ù€ Ü‹<€D¬°°W±Ó(>ÄÈÈ[ÑHYÔ[`×[eÑ[eÓ@f˜˜˜IÜ˜1Ÿ7™7 1™:Ó&€E´°uÔ>SÐT\ð  _Nó  ?Oó  2P¨Ü˜UÔ$PÐRSÓTÐUVÑW€HØ—}‘}¨)�}Ó4°h·m±mÈ°mÓ6SˆW€Gò r€EÜ
�'‰'”$˜˜h™Ñ'°eÔ
<¸XÑ
F×
KÑ
KÐQWÐ
KÓ
X€CÜŒcÐ)Ñ)¨7°EÐ;_Ô`Ü”#Ð(Ñ(¨#¨wÐ8UÔVÜ×Ñœ˜lÑ*¸WÐT[Ðmpô  AC÷  AKñ  AKð  LQó  ARõ  SÜ�8˜V T¨(¡^Ð5eÐglÐnuØ+Ð6FôHð Hr+   c            
     ó  ‡— t        «       } | d   j                  t        «      }t        t	        j
                  | d   | d   j                  t        j                  «      gd«      ||dz    «      }t	        j                  t        | d   z  d¬«      }t        t        |d   j                  t        «      «      t        |d	   j                  t        «      «      z   «      }t        |j                  d   «      Št        ‰t!        d
d«      «      }t#        ‰ˆfd„|«      d   j%                  d«      }t'        t(        dz  ||d«       t	        j*                  t(        dz  |t	        j,                  |«      ¬«       t/        d|| d   d||dd¬«      S )Nrc  rv   rÙ   r   rÚ   FrÛ   rÝ   rÞ   ztabular-mlpz9results/models/checkpoints/synthetic_tabular_surrogate.ptc                ó:   •— t        j                   ‰| «      «      S rã   rä   r@  s    €r)   ré   ztabular_model.<locals>.<lambda>j  s   ø€ ¬e¯m©m¹EÀ!»HÔ.Er+   r   ztabular-mlp-features.pngzTabular MLP: run-level responseztabular-mlp.npz)r'  rÑ   zTabular MLPz(weak-fit predicted run-level probabilityr‚  )r   rk   rÏ   r*   rQ   rõ   rP   rR   r3   r   r]   r÷   rZ   r   rø   r9   r>   rX   rJ   rŽ   rû   rü   rb   rÔ   )rý   r  rv   r  r[   r  r  r5   s          @r)   Útabular_modelr†  d  sg  ø€ Ü‹?€D $ v¡,×"4Ñ"4´SÓ"9˜CÜ”—‘  S¡	¨4°©<×+>Ñ+>¼r¿z¹zÓ+JÐKÈQÓOÐPSÐTWÐZ[ÑT[Ð\Ó]€AÜ
�'‰'”$˜˜h™Ñ'°eÔ
<€CÜœd 3Ð'>Ñ#?×#FÑ#FÄsÓ#KÓLÌtÐTWÐXpÑTq×TxÑTxÔy|ÓT}ÓO~Ñ~Ó€EÜ˜QŸW™W Q™ZÓ(€E´5¸Ô@UÐVcð  faó  Abó  4c¨&Ü˜UÓ$EÀqÓIÈ!ÑL×QÑQÐRSÓT€HÜŒcÐ.Ñ.°¸%ÐAbÔcÜ×ÑœÐ/Ñ/À(ÔZ\×ZdÑZdÐejÓZkÕlÜ�= &¨$¨x©.Ð:dÐfkÐmuØ0Ð;UôWð Wr+   c                ó  — g }| D �]   }dj                  d„ |j                  dg «      d d D «       «      }|j                  d«      xs i }dj                  d„ |j                  dg «      d d D «       «      }|j                  d«      r5dt        j                  |d   «      › d	t        j                  |d
   «      › d�nd}|j	                  dt        j                  |d
   «      › dt        j                  |d   «      › d|› dt        j                  |d   «      › d|› d|xs d› d�«       �Œ# t
        dz  j                  dt        j                  t        «      › dt        j                  t        «      › ddj                  |«      › �d¬«       y )Nr·   c              3  ób   K  — | ]'  }d t        j                  |d   «      › d|d   d›d�–— Œ) y­w©z<li>r`   z: ra   z.3gz</li>N©ÚhtmlÚescape©Ú.0rC  s     r)   Ú	<genexpr>z_page.<locals>.<genexpr>t  sE   è ø€ ð  Nñ  fMÐ]a˜œTŸ[™[¨¨i©Ó9Ð:¸"¸TÀ*Ñ=MÈcÐ<RÐRWÔXñ  fMùó   ‚-/rÌ   é   rÍ   c              3  ób   K  — | ]'  }d t        j                  |d   «      › d|d   d›d�–— Œ) y­wr‰  rŠ  r�  s     r)   r�  z_page.<locals>.<genexpr>v  sF   è ø€ ð  Zñ  nYÐei ¤T§[¡[°°i±Ó%AÐ$BÀ"ÀTÈ*ÑEUÐVYÐDZÐZ_Ô`ñ  nYùr�  rº   z
<img src="z" alt="r5   z local response map">z<article><h2>z</h2><p><code>rÈ   z</code></p>z<p><a href="r¹   zE">machine-readable NPZ</a></p><h3>Geometry/topology channels</h3><ol>z$</ol><h3>XLS/process branch</h3><ol>z"<li>Not wired for this model.</li>z</ol></article>z
index.htmluŒ  <!doctype html><meta charset="utf-8"><title>Local model response diagnostics</title>
<style>body{font:16px/1.5 system-ui;max-width:1180px;margin:2rem auto;padding:0 1rem;color:#172033;background:#f5f7fb}article{background:#fff;border:1px solid #d7dee9;border-radius:10px;padding:1rem;margin:1rem 0}img{max-width:620px;width:100%;border:1px solid #d7dee9}code{background:#eef2f8;padding:.2rem .3rem}.warning{background:#fff1d6;border-left:4px solid #a66a00;padding:1rem}</style>
<p><a href="../dashboard/index.html">Model dashboard</a> Â· <a href="report.json">machine-readable report</a></p><h1>Local input-response diagnostics</h1>
<p class="warning">z Values use zã for one prepared 18h01 sample and the named checkpoint. Where available, each checkpoint is the exact weak-label diagnostic state used for the displayed CAD prediction; a synthetic fallback is named explicitly in the JSON.</p>úutf-8©Úencoding)	ÚjoinÚgetr‹  rŒ  rM   rû   Ú
write_textrÐ   rÎ   )rD  Úcardsr‰   Útopr»   Úprocess_topÚmap_tags          r)   Ú_pager�  q  s^  € Ø€EÜˆØ�g‰gñ  NÐeh×elÑelð  nDð  FHó  fIð  JLð  KLñ  fMó  Nó  NˆØ—'‘'Ð,Ó-Ò3°ˆØ—g‘gñ  ZÐmt×mxÑmxð  zPð  RTó  nUð  VXð  WXñ  nYó  Zó  ZˆØx{×xÑxð  AKô  yL�JœtŸ{™{¨3¨z©?Ó;Ð<¸GÄDÇKÁKÐPSÐT[ÑP\ÓD]ÐC^Ð^sÑtð  RTˆØ�‰�}¤T§[¡[°°W±Ó%>Ð$?¸~ÌdÏkÉkÐZ]Ð^oÑZpÓNqÐMrÐr}ð  Fð  ~Gð  GTô  UY÷  U`ñ  U`ð  adð  erñ  asó  Utð  Tuð  u{ð  |ð  {@ð  @dð  epò  eXð  tXð  dYð  Yhð  iö  	jð ô 	ˆ<Ñ×#Ñ#ð )ô —k‘k¤'Ó*Ð+¨<¼¿¹ÄFÓ8KÐ7Lð  Mpð  qs÷  qxñ  qxð  y~ó  qð  p@ð%Cð NUð $õ Vr+   c            
     óN  — t         j                  dd¬«       t        j                  t	        dt        dt        j                  «       «      «      «       g } t        «       \  }}| j                  |«       t        «       \  }}| j                  |«       | j                  t        «       «       | j                  t        «       «       | j                  t        «       «       | j                  t        «       «       | j                  t        «       «       | j                  t!        «       «       t"        t$        dt&        | dœ}t         dz  j)                  t+        j,                  |dd¬	«      d
¬«       t/        | D �cg c]  }|d   j1                  d«      sŒ|‘Œ c}«       t         dz  S c c}w )NT)ÚparentsÚexist_okr   r  F)rÀ   rÇ   rÉ   rË   Úmodelszreport.jsonr¬   )Úensure_asciiÚindentr“  r”  r¾   r¿   )rû   Úmkdirr&   Úset_num_threadsr~   rf   Úget_num_threadsr  Úextendr  rM   r6  rG  ra  ro  rƒ  r†  rÎ   rÏ   rÐ   r˜  ÚjsonÚdumpsr�  Ú
startswith)rD  Ú
image_rowsÚ_Ú	voxel_rowÚreportr‰   s         r)   Úbuildr¯    s\  € Ü‡I�I�d T€IÔ*Ü	×Ñœ#˜a¤ Q¬×(=Ñ(=Ó(?Ó!@ÓAÔBØ!#€DÜ “N�M€J� D§K¡K°
Ô$;Ü“=�L€Iˆq $§+¡+¨iÔ"8Ø‡K�K”“Ô §¡¬\«^Ô!<¸d¿k¹kÌ*Ë,Ô>WÐY]×YdÑYdÔemÓeoÔYpÐrv×r}Ñr}ô  Gó  Iô  sJð  LP÷  LWñ  LWô  Xeó  Xgô  LhÜ¬#À5ÔU\ÐhlÑm€FÜˆ=Ñ×$Ñ$¤T§Z¡Z°ÀUÐSTÔ%UÐ`gÐ$ÔhÜ	™$Ó
H™$�3 # h¡-×":Ñ":¸;Õ"GŠ3˜$Ñ
HÔIÜ�ÑÐùò Is   Å4F"ÆF"c                 óà   — t        j                  t        ¬«      } | j                  ddd¬«       | j	                  «       }|j
                  s| j                  d«       t        t        «       «       y )N)Údescriptionz--buildÚ
store_truez1generate prepared-sample local response artifacts)ÚactionÚhelpzchoose --build)ÚargparseÚArgumentParserÚ__doc__Úadd_argumentÚ
parse_argsr¯  ÚerrorÚprint)ÚparserÚargss     r)   Úmainr¾  Œ  sS   € Ü×$Ñ$´Ô9€FØ
×Ñ˜	¨,Ð=pÐÔqØ×ÑÓ€DØ�:Š:Ø�‰Ð%Ô&Ü	Œ%‹'…Nr+   Ú__main__)r(   ú
np.ndarrayr%   ztorch.dtypeÚreturnr	   )r5   ú	nn.Moduler6   ú
str | NonerÁ  rZ   )r;   rZ   r<   rZ   rÁ  rZ   )r5   rÂ  rS   zCallable[..., Tensor]rT   r	   rÁ  zlist[np.ndarray])r[   zlist[str] | np.ndarrayrÁ  ú	list[str])é   )ri   rÀ  r[   rÄ  rj   rh   rÁ  úlist[dict[str, Any]])r7   r   ri   rÀ  r[   rÄ  r‡   rZ   rj   rh   rÁ  ÚNone)r7   r   r˜   rÀ  r‡   rZ   rÁ  rÇ  )r7   r   ri   rÀ  r‡   rZ   rÁ  rÇ  )
r7   r   r³   rÀ  r(   rÀ  r‡   rZ   rÁ  rÇ  )r\   rZ   r6   rZ   rÆ   rZ   rÈ   rZ   rÑ   rÄ  rÒ   rÀ  r¹   rÃ  rº   rÃ  r»   zdict[str, Any] | Noner¼   rZ   rÁ  údict[str, Any])ra   rÀ  r[   rÄ  rÁ  rÈ  )rÁ  z2tuple[list[dict[str, Any]], dict[str, np.ndarray]])rÁ  z!tuple[dict[str, Any], np.ndarray])rÁ  rÈ  )rÁ  rÆ  )rD  rÆ  rÁ  rÇ  )rÁ  r   )rÁ  rÇ  )Qr·  Ú
__future__r   rµ  r‹  r¨  Úpathlibr   Útypingr   r   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotr|   r   rO   rQ   r&   r	   r
   Úarchitecturesr   r   r   r   r   r   r   r   r   r   rý   r   r   r   r   r   r   r   r   r   r   Útrain_weak_gnnr    rû   rÏ   rÎ   rÐ   Ú_KOREAN_FONTr2   ÚfontManagerÚaddfontrZ   ÚrcParamsrR   r*   r9   r>   rX   r]   rm   rŽ   rš   r§   r¶   rÔ   r×   r  r  r6  rG  ra  ro  rƒ  r†  r�  r¯  r¾  Ú__name__rL  r+   r)   Ú<module>r×     s´  ðñõ #ã Û Û Ý ß  ã Ø €
‡�ˆuÔ Ý Ý #Û Û ß ÷Z÷ Z÷ Z÷/÷ /÷ /õ /à
Ð*Ñ*€Ø€Ø	A€ðM€ñ
 ÐHÓI€Ø×ÑÔØ×Ñ×$Ñ$¡S¨Ó%6Ô7Ø"/€C‡L�L�ÑØ).€C‡L�LÐ%Ñ&ð 5:·M±Mô /ó	óBóó =ô
Zôóó	ó
ð `dØ#'È$ØñØ$ðØ6@ðØR\ðà ðà2Gðð ðð  .óó&1ó
ó>uó,)óXó4Vó2só2Hó
WóVó
óð ˆzÒÙ…Fð r+   