Ë
    cIºjÎa  ã                  ó   — d Z ddlmZ ddl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ZddlZddlmZmZ ddlmc mZ ddl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$m%Z% dd
l&m'Z' dZ(ddd„Z)dd„Z*d d!d„Z+d"d„Z,d#d„Z-d$d„Z. G d„ dej^                  «      Z0 G d„ dej^                  «      Z1 ejd                  «       d%d„«       Z3d&d„Z4d'd„Z5d(d„Z6d)d„Z7d*d„Z8e9dk(  r e8«        yy)+aÒ  Paper-inspired TAG U-Net conditional diffusion diagnostic.

This is a compact adaptation of Ferguson et al., *Topology-Agnostic Graph
U-Nets for Scalar Field Prediction on Unstructured Meshes* (2024).  It keeps
the paper's key mechanics: balanced kd-tree pooling into 3-D groups of up to
eight, mean pooling, copied unpooling, 12-NN coarse graphs, EdgeConv-style
max aggregation, encoder/decoder concatenation skips, and coordinates at each
convolution.  The paper predicts a scalar field directly; here the U-Net is a
DDPM denoiser conditioned on the same CAD/XLS vectors as ``graph_6000``.

It is deliberately a bounded, CPU weak-label diagnostic: two NG scans are not
enough to validate a generative deformation model.
é    )ÚannotationsN)ÚPath)ÚAnyÚAgg)ÚTensorÚnn)ÚcKDTree)ÚATTRÚEXPÚINPÚMODÚOUTÚSCALE_MMÚaverage_precisionÚchamferÚprepare_variantÚscheduleÚtensor)Úseed_everythingÚgraph_unet_6000c                ó  ‡ ‡‡‡— g Šdˆˆˆ ˆfd„Š ‰t        j                  t        ‰ «      t         j                  ¬«      «       t        j                  t        ‰ «      t         j                  ¬«      }t        ‰«      D ]
  \  }}|||<   Œ |S )zDBalanced kd-tree leaves, represented as a fine -> coarse assignment.c                ó@  •— t        | «      ‰k  r‰j                  | «       y ‰|    }t        t        j                  t        j
                  |d¬«      «      «      }| t        j                  |d d …|f   d¬«         }t        |«      dz  } ‰|d | «        ‰||d  «       y )Nr   )ÚaxisÚ	mergesort)Úkindé   )ÚlenÚappendÚintÚnpÚargmaxÚptpÚargsort)	ÚindexÚlocalr   ÚorderÚmidpointÚleavesÚmaximum_leaf_sizeÚpointsÚsplits	        €€€€ú5gen_models/models/graph_unet_conditional_diffusion.pyr+   zkd_groups.<locals>.split.   s�   ø€ Üˆu‹:Ð*Ò*Ø�M‰M˜%Ô ØØ�u‘ˆÜ”2—9‘9œRŸV™V E°Ô2Ó3Ó4ˆØ”b—j‘j ¢q¨$ w¡°kÔBÑCˆÜ�u“: ‘?ˆÙˆe�I�XÐÔ¡ u¨X¨YÐ'7Õ!8ó    ©Údtype)r$   ú
np.ndarrayÚreturnÚNone)r    Úaranger   Úint64ÚemptyÚ	enumerate)r*   r)   Ú
assignmentÚgroupÚindicesr(   r+   s   ``   @@r,   Ú	kd_groupsr:   *   sg   û€ à!€F÷9ð 9ñ 
Œ"�)‰)”C˜“K¤r§x¡xÔ
0Ô1Ü—‘œ#˜f›+¬R¯X©XÔ6€JÜ# FÖ+‰ˆˆwÀ5¨Z¸Ò-@Ð+ØÐr-   c                ó
  — t        |j                  «       «      dz   }t        j                  |dft        j                  «      }t        j
                  j                  ||| «       |t        j                  ||¬«      d d …d f   z  S )Né   é   ©Ú	minlength)r   Úmaxr    ÚzerosÚfloat32ÚaddÚatÚbincount)r*   r7   ÚcountÚouts       r,   Úpooled_positionsrH   >   sc   € Ü�
—‘Ó Ó! AÑ%€EÜ
�(‰(�E˜1�:œrŸz™zÓ
*€CÜ‡F�F‡I�Iˆc�:˜vÔ&Ø”—‘˜Z°5Ô9º!¸T¸'ÑBÑBÐBr-   c           
     ó>  — t        | «      dk  r%t        j                  dt        j                  ¬«      S t	        | «      j                  | t        |dz   t        | «      «      d¬«      \  }}t        t        j                  |«      «      D ���ch c]+  \  }}|dd D ]  }||k7  sŒ	t        |«      t        |«      f’Œ  Œ- }}}}||D ��ch c]	  \  }}||f’Œ c}}z  }t        j                  t        |«      t        j                  ¬«      j                  S c c}}}w c c}}w )zLDestination/source edge index for a bidirectional, duplicate-free kNN graph.r   )r   r   r.   r<   )ÚkÚworkersN)r   r    rA   r4   r	   ÚqueryÚminr6   Ú
atleast_2dr   ÚasarrayÚsortedÚT)r*   rJ   Ú_Ú
neighboursÚiÚrowÚjÚpairss           r,   Úbidirectional_knnrX   E   sì   € ä
ˆ6ƒ{�Q‚œrŸx™x¨´b·h±hÔ?Ð?Ü˜F“O×)Ñ)¨&´C¸¸A¹¼sÀ6»{Ó4KÐUVÐ)ÓW�M€A€zÜ,5´b·m±mÀJÓ6OÔ,PÕlÑ,P¡& ! SÐZ]Ð^_Ð^`ÓZaÐUVÐefÐjkÓekŒc�!‹f”c˜!“fÒÐZaÐÐ,P€EÒlØ	¡Ô'¡™˜˜Aˆq�!Šf Ò'Ñ'€EÜ�:‰:”f˜U“m¬2¯8©8Ô4×6Ñ6Ð6ùô mùÛ's   ÂDÂ"DÃDc                ó`  — | j                  t        j                  «      g}|j                  t        j                  «      g}g }| }t	        d«      D ]W  }t        |d«      }|j                  |«       t        ||«      }|j                  |«       |j                  t        |d«      «       ŒY |||dœS )zEThree pool stages exactly following the paper's 3-D pooling schedule.r=   é   é   )Ú	positionsÚedgesÚassignments)	Úastyper    rB   r4   Úranger:   r   rH   rX   )r*   Úedge0r\   r]   r^   ÚcurrentrR   Úassigns           r,   Ú	hierarchyrd   N   s�   € à—‘œrŸz™zÓ*Ð+€Ið �\‰\œ"Ÿ(™(Ó#Ð$€EØ€KØ€GÜ�1ŽXˆÜ˜7 AÓ&ˆØ×Ñ˜6Ô"Ü" 7¨FÓ3ˆØ×Ñ˜Ô!Ø�‰Ô& w°Ó3Õ4ð ð #¨UÀ;ÑOÐOr-   c                ó„  — | j                  t        j                  «      }|j                  D ��ch c]-  \  }}||k7  sŒ||k  sŒ||k  sŒt	        |«      t	        |«      f’Œ/ }}}||D ��ch c]	  \  }}||f’Œ c}}z  }t        j
                  t        |«      t        j                  ¬«      j                  S c c}}w c c}}w )zAMake source/destination explicit and add reverse edges if needed.r.   )r_   r    r4   rQ   r   rO   rP   )ÚedgeÚ
node_countÚaÚsÚdrW   s         r,   Úas_edge_indexrk   _   s™   € à�‰”B—H‘HÓ€AØ*+¯#ª#Ô^©#¡$ ! Q°°a³¸AÀ
»NÈqÐS]Ë~Œc�!‹f”c˜!“fÒ¨#€EÑ^Ø	¡Ô'¡™˜˜Aˆq�!Šf Ò'Ñ'€EÜ�:‰:”f˜U“m¬2¯8©8Ô4×6Ñ6Ð6ùó _ùÛ's   ¯B6½B6ÁB6Á	B6Á*B<c                óD  — t        j                  || j                  d   f| j                  | j                  ¬«      }|j                  d|| «       t        j                  ||¬«      j                  | j                  «      j                  d«      j                  d«      }||z  S )Nr<   ©Údevicer/   r   r>   )
ÚtorchrA   Úshapern   r/   Ú
index_add_rE   ÚtoÚ
clamp_min_Ú	unsqueeze)Úxr7   Úoutput_countrG   Údenoms        r,   Ú	pool_meanrx   g   sz   € Ü
�+‰+�| Q§W¡W¨Q¡ZÐ0¸¿¹ÈÏÉÔ
Q€CØ‡N�N�1�j !Ô$Ü�N‰N˜:°Ô>×AÑAÀ!Ç'Á'ÓJ×UÑUÐVWÓX×bÑbÐcdÓe€EØ�‰;Ðr-   c                  ó.   ‡ — e Zd ZdZddˆ fd„Zdd„Zˆ xZS )ÚEdgeConvzGEdgeConv with explicit edge delta/distance as a CAD geometry extension.c                ó(  •— t         ‰| �  «        || _        t        j                  t        j
                  |dz  dz   |dz  «      t        j                  «       t        j
                  |dz  |«      «      | _        t        j                  |«      | _	        y )Nr   é
   )
ÚsuperÚ__init__Úcoordinate_scale_mmr   Ú
SequentialÚLinearÚSiLUÚmessageÚBatchNorm1dÚnorm)ÚselfÚchannelsr   Ú	__class__s      €r,   r~   zEdgeConv.__init__p   sm   ø€ Ü‰ÑÔØ#6ˆÔ ä—}‘}Ü�I‰I�h ‘l RÑ'¨°A©Ó6¼¿¹»	Ü�I‰I�h ‘l HÓ-ó
ˆŒô —N‘N 8Ó,ˆ�	r-   c                ój  — |d   |d   }}||   ||   z
  | j                   z  }|j                  dd¬«      }||j                  d«      z  }t        j                  ||   ||   ||   z
  ||   | j                   z  |||fd«      }	| j                  |	«      }
t        j                  |t        j                   «      }|j                  d|d d …d f   j                  |
«      |
dd¬«       t        j                  t        j                  |«      ||«      }t        j                  | j                  ||z   «      «      S )Nr   r<   T)ÚdimÚkeepdimg:Œ0âŽyE>Úamax)ÚreduceÚinclude_self)r   r…   Ú	clamp_minro   Úcatrƒ   Ú	full_likeÚinfÚscatter_reduce_Ú	expand_asÚwhereÚisfiniteÚFÚsilu)r†   ru   Úpositionrf   ÚsrcÚdstÚdeltaÚlengthÚ	directionÚmessage_inputrƒ   rG   s               r,   ÚforwardzEdgeConv.forwardz   s)  € à˜‘7˜D ™GˆSˆØ˜#‘ ¨#¡Ñ.°$×2JÑ2JÑJˆØ—‘ ¨4�Ó0ˆØ˜F×,Ñ,¨TÓ2Ñ2ˆ	ÜŸ	™	 1 S¡6¨1¨S©6°A°c±F©?¸HÀS¹MÈD×LdÑLdÑ<dÐfkÐmvÐx~Ð"ð  BCó  DˆØ—,‘,˜}Ó-ˆÜ�o‰o˜a¤%§)¡) Ó,ˆØ×Ñ˜A˜s¢1 d 7™|×5Ñ5°gÓ>ÀÐPVÐeiÐÔjô �k‰kœ%Ÿ.™.¨Ó-¨s°AÓ6ˆÜ�v‰v�d—i‘i  a¡Ó(Ó)Ð)r-   )g     @�@)r‡   r   r   Úfloatr1   r2   )ru   r   r™   r   rf   r   r1   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r~   r    Ú__classcell__©rˆ   s   @r,   rz   rz   n   s   ø„ ÙQö-÷*r-   rz   c                  óF   ‡ — e Zd ZdZddˆ fd„Zd	d„Zd
d„Zdd„Zdd„Zˆ xZ	S )ÚTagUNetDenoiserzBThree-resolution TAG U-Net serving as a conditional DDPM denoiser.c           	     óv  •— t         ‰| �  «        || _        g | _        g | _        g | _        t        |d   «      D ]·  \  }}| j                  d|› �t        j                  |t        j                  ¬«      «       | j                  j                  d|› �«       | j                  d|› �t        j                  |d   |   t        j                  ¬«      «       | j                  j                  d|› �«       Œ¹ t        |d   «      D ][  \  }}| j                  d|› �t        j                  |t        j                  ¬«      «       | j
                  j                  d|› �«       Œ] t        j                  t        j                  ||«      t        j                   «       t        j                  ||«      «      | _        t        j                  t        j                  d|«      t        j                   «       t        j                  ||«      «      | _        t        j                  |d	z  d
z   |«      | _        t        j(                  t+        d«      D �cg c]  }t-        |«      ‘Œ c}«      | _        t-        |«      | _        t        j(                  t+        d«      D �cg c]  }t        j                  |d	z  |«      ‘Œ c}«      | _        t        j(                  t+        d«      D �cg c]  }t-        |«      ‘Œ c}«      | _        t        j                  t        j                  ||«      t        j                   «       t        j                  |d
«      «      | _        t        j                  t        j                  ||d	z  «      t        j                   «       t        j                  |d	z  d
«      «      | _        y c c}w c c}w c c}w )Nr\   Ú	position_r.   Úedge_r]   r^   Úassignment_é   r   r<   r=   )r}   r~   Úwidthr\   r]   r^   r6   Úregister_bufferro   Ú	as_tensorrB   r   Úlongr   r€   r�   r‚   ÚcondÚtimeÚinputÚ
ModuleListr`   rz   ÚencÚ
bottleneckÚdecode_projectÚdecÚepsilonÚrisk)	r†   Úcondition_dimÚgraphr¯   rT   Úprh   rR   rˆ   s	           €r,   r~   zTagUNetDenoiser.__init__Œ   së  ø€ Ü‰ÑÔØˆŒ
ØˆŒØˆŒ
ØˆÔÜ˜e KÑ0Ö1‰DˆAˆqØ× Ñ  9¨Q¨C ´%·/±/À!Ì5Ï=É=Ô2YÔZÐ\`×\jÑ\j×\qÑ\qÐt}Ð~ð  ~Að  sBô  ]CØ× Ñ  5¨¨ ¬e¯o©o¸eÀG¹nÈQÑ>OÔW\×WaÑWaÔ.bÔcÐei×eoÑeo×evÑevÐy~ð  @Að  Bð  xCõ  fDð 2ô ˜e MÑ2Ö3‰DˆAˆqØ× Ñ  ;¨q¨cÐ!2´E·O±OÀAÌUÏZÉZÔ4XÔYÐ[_×[kÑ[k×[rÑ[rð  vAð  BCð  ADð  tEõ  \Fð 4ä—M‘M¤"§)¡)¨M¸5Ó"AÄ2Ç7Á7Ã9ÌbÏiÉiÐX]Ð_dÓNeÓfˆŒ	Ü—M‘M¤"§)¡)¨B°Ó"6¼¿¹»	Ä2Ç9Á9ÈUÐTYÓCZÓ[ˆŒ	Ü—Y‘Y˜u q™y¨1™}¨eÓ4ˆŒ
Ü—=‘=¼5À¼8Ó!D¹8°a¤(¨5¥/¸8Ñ!DÓEˆŒÜ" 5›/ˆŒÜ Ÿm™mÔRWÐXYÔRZÓ,[ÑRZÈQ¬R¯Y©Y°u¸q±yÀ%Õ-HÐRZÑ,[Ó\ˆÔÜ—=‘=¼5À¼8Ó!D¹8°a¤(¨5¥/¸8Ñ!DÓEˆŒÜ—}‘}¤R§Y¡Y¨u°eÓ%<¼b¿g¹g»iÌÏÉÐSXÐZ[ÓI\Ó]ˆŒÜ—M‘M¤"§)¡)¨E°5¸A±:Ó">ÄÇÁÃ	Ì2Ï9É9ÐUZÐ^_ÑU_ÐabÓKcÓdˆ�	ùò "Eùâ,[ùÚ!Ds   É	N,Ê N1ËN6c                ó    — t        | ||   «      S )N)Úgetattr)r†   Únamesr$   s      r,   Ú_getzTagUNetDenoiser._get¡   s   € Ä7È4ÐQVÐW\ÑQ]ÓC^Ð<^r-   c           	     óx  — t        j                  t        j                  dt        j                  d«      d|j
                  t         j                  ¬«      «      }|d d …d f   j                  «       |d    z  dz  }| j                  t        j                  |j                  «       |j                  «       fd«      «      S )Nr   iè  rZ   rm   g      >@r<   )ro   ÚexpÚlinspaceÚmathÚlogrn   rB   r¡   r´   r�   ÚsinÚcos)r†   ÚstepÚfr¿   s       r,   Ú_timezTagUNetDenoiser._time¢   sƒ   € Ü�I‰I”e—n‘n Q¬¯©°«¸À$Ç+Á+ÔUZ×UbÑUbÔcÓdˆØ’�D�‰M×ÑÓ! A d¡GÑ+¨cÑ1ˆØ�y‰yœŸ™ A§E¡E£G¨Q¯U©U«WÐ#5°qÓ9Ó:Ð:r-   c                ón  — | j                  t        j                  |d d …d f   | j                  |«      | j	                  |«      fd«      «      }g }t        d«      D ]­  } | j                  |   || j                  | j                  |«      | j                  | j                  |«      «      }|j                  |«       | j                  | j                  |«      }t        ||t        | j                  | j                  |dz   «      «      «      }Œ¯ | j                  || j                  | j                  d«      | j                  | j                  d«      «      }dD ]   }|| j                  | j                  |«         } | j                  d|z
     t        j                  |||   fd«      «      } | j                   d|z
     || j                  | j                  |«      | j                  | j                  |«      «      }Œ¢ | j#                  |«      j%                  d«      | j'                  |«      j%                  d«      fS )Nr<   r=   )r   r<   r   r   )rµ   ro   r�   r³   rÍ   r`   r·   rÃ   r\   r]   r   r^   rx   r   r¸   r¹   rº   r»   Úsqueezer¼   )r†   ru   ÚtÚ	conditionÚhÚskipsÚlevelr7   s           r,   Ú_singlezTagUNetDenoiser._single§   sÊ  € Ø�J‰J”u—y‘y !¢A t G¡*¨d¯i©i¸	Ó.BÀDÇJÁJÈqÃMÐ!RÐTUÓVÓWˆØ ˆÜ˜1–XˆEØ�—‘˜‘  4§9¡9¨T¯^©^¸UÓ#CÀTÇYÁYÈtÏzÉzÐ[`ÓEaÓbˆAÐdi×dpÑdpÐqrÔdsØŸ™ 4×#3Ñ#3°UÓ;ˆJÜ˜!˜Z¬¨T¯Y©Y°t·~±~ÀuÈqÁyÓ-QÓ)RÓS‰Að ð �O‰O˜A˜tŸy™y¨¯©¸Ó;¸T¿Y¹YÀtÇzÁzÐSTÓ=UÓVˆÛˆEØ�$—)‘)˜D×,Ñ,¨eÓ4Ñ5ˆAØ.�×#Ñ# A¨¡IÑ.¬u¯y©y¸!¸UÀ5¹\Ð9JÈAÓ/NÓOˆAØ#�—‘˜˜U™Ñ# A t§y¡y°·±ÀÓ'GÈÏÉÐSW×S]ÑS]Ð_dÓIeÓf‰Að ð �|‰|˜A‹×&Ñ& qÓ)¨4¯9©9°Q«<×+?Ñ+?ÀÓ+BÐBÐBr-   c                óÜ  — t        | j                  | j                  d«      «      }t        |«      dk(  st        |«      |z  rt        d«      ‚t	        dt        |«      |«      D �cg c]'  }| j                  ||||z    ||||z    ||||z    «      ‘Œ) }}t        j                  |D �cg c]  }|d   ‘Œ	 c}«      t        j                  |D �cg c]  }|d   ‘Œ	 c}«      fS c c}w c c}w c c}w )Nr   z%TAG U-Net requires full CAD-node runsr<   )r   rÃ   r\   Ú
ValueErrorr`   rÕ   ro   r�   )r†   ru   rÐ   rÑ   Únri   rG   Úitems           r,   r    zTagUNetDenoiser.forwardµ   sá   € ä�—	‘	˜$Ÿ.™.¨!Ó,Ó-ˆÜˆq‹6�QŠ;œ#˜a›& 1š*¬JÐ7^Ó,_Ð&_ÜKPÐQRÔSVÐWXÓSYÐZ[ÔK\Ó]ÑK\Àaˆt�|‰|˜A˜a  !¡˜H a¨¨!¨A©# h°	¸!¸A¸a¹CÐ0@ÕAÐK\ˆÐ]Ü�y‰y©cÓ2©c d˜$˜q›'¨cÑ2Ó3´U·Y±YÑTWÓ?XÑTWÈDÀÀQÃÐTWÑ?XÓ5YÐYÐYùò ^ùÚ2ùÒ?Xs   Á%,CÂ&C$ÃC)
)é    )r½   r   r¾   údict[str, Any]r¯   r   r1   r2   )rÂ   z	list[str]r$   r   r1   r   )rË   r   r1   r   )ru   r   rÐ   r   rÑ   r   r1   ztuple[Tensor, Tensor])
r¢   r£   r¤   r¥   r~   rÃ   rÍ   rÕ   r    r¦   r§   s   @r,   r©   r©   Š   s#   ø„ ÙLöeó* _ó;ó
C÷Zr-   r©   c           
     óð  — t        j                  t        |«      t        j                  «       j	                  |«      ¬«      }t        j                  t        j                  dt        |«      dz
  |t        ¬«      «      d d d…   }t        |«      D ]Ô  \  }} | |t        j                  t        |«      ft        |«      t         j                  ¬«      |«      \  }	}
|d||   z
  j                  «       |	z  z
  ||   j                  «       z  }|t        |«      dz
  k(  rdnt        ||dz      «      }|dk  r|n/||   j                  «       |z  d||   z
  j                  «       |	z  z   }ŒÖ |j                  dd«      S )N)Ú	generatorr   r<   r.   éÿÿÿÿ)ro   Úrandnr   Ú	GeneratorÚmanual_seedr    ÚuniquerÆ   r   r6   Úfullr²   ÚsqrtÚclamp)ÚmodelrÑ   ÚabarÚsample_stepsÚseedru   ÚsequencerT   rË   ÚepsrR   Úx0Úpreviouss                r,   Úsamplerî   ½   s;  € ä�‰”C˜	“N¬e¯o©oÓ.?×.KÑ.KÈDÓ.QÔR€AÜ�y‰yœŸ™ Q¬¨D«	°A©°|Ì3ÔOÓPÑQUÐSUÐQUÑV€HÜ˜XÖ&‰ˆˆ4Ù�qœ%Ÿ*™*¤c¨!£f Y´°D³	ÄÇÁÔLÈiÓX‰ˆˆQØ�1�t˜D‘z‘>×'Ñ'Ó)¨CÑ/Ñ/°4¸±:·?±?Ó3DÑDˆØœc (›m¨aÑ/Ò/‘2´S¸À!ÀaÁ%¹Ó5IˆØ˜Q’,‰B D¨¡N×$7Ñ$7Ó$9¸BÑ$>À!ÀdÈ8ÁnÑBT×AZÑAZÓA\Ð_bÑAbÑ$b‰ð	 'ð
 �7‰7�2�q‹>Ðr-   c                óÆ  — t        |d   «      t        |d   «      }}t        j                  t        |«      D �cg c]  }t	        | |||d|z   «      ‘Œ c}«      j                  «       }t        j                  «       5   | t        j                  |«      t        j                  t        |«      t        j                  ¬«      |«      \  }	}
d d d «       t        j                  
«      j                  «       }t        |d   «      }|d   |d   }}g }t        |d   «      D �]  \  }}t        ||z  |d	z   |z  «      }|d d …|f   j                  d
«      t         z  }|d d …|f   j#                  d
«      t         z  }|j                  «       |   t         z  }|||d d …d f   z  z   }|||d d …d f   z  z   }|d   |   j%                  t&        «      }||   dk\  }t        ||z  j)                  «       «      }|d|› d�   }|j+                  t-        |«      t/        t1        j2                  ||z
  «      j                  «       «      t/        t1        j4                  t1        j                  ||z
  dz  «      «      «      t7        ||«      t7        ||«      t9        ||   |«      |t;        d	t        ||z  j)                  «       «      «      z  d|z  t;        d	t        |j)                  «       |j)                  «       z   «      «      z  dœt/        |j                  «       «      t/        |j;                  «       «      dœ«       �Œ t        |d   «      }t1        j<                  t>        t@        › d�z  |d   |||jC                  |||«      t         z  |d   |d   |jC                  |||d	«      z  t         z  z   |jC                  ||«      |d   t1        jD                  d«      ¬«	       |S c c}w # 1 sw Y   �ŒxY w)NrÑ   Úsigned_target_scaledi3(5r.   Únodes_per_runÚpos_mmÚnormalÚrun_idr<   r   Úrisk_binaryg      à?Úscan_points_Ú_cad_mmr   )ÚAPú
IoU_at_0.5zDice_at_0.5)ÚrunÚMAE_mmÚRMSE_mmÚCAD_correspondent_Chamfer_mmÚregistered_scan_Chamfer_mmr¼   Úmean_stochastic_std_mmÚmax_stochastic_std_mmú_generated.npz)NNÚrun_defect_classÚunvalidated_run_level_labels)rô   Ú
cad_pos_mmÚ
cad_normalÚgenerated_signed_normal_mmÚgenerated_pointcloud_mmÚrisk_probabilityÚdefect_typeÚdefect_type_status)#r   ro   Ústackr`   rî   ÚnumpyÚno_gradÚ
zeros_likerA   r   r²   Úsigmoidr   r6   ÚsliceÚmeanr   Ústdr_   ÚboolÚsumr   Ústrr¡   r    Úabsrä   r   r   r@   Úsavez_compressedr   ÚNAMEÚreshaperO   )ræ   Údatarç   Úsamplesrè   rÑ   ÚtargetrT   Ú	generatedrR   ÚlogitÚscorerØ   Úposró   ÚresultrV   rú   Úslr  r  ÚtruthÚcloudÚ	referenceÚyr¿   ÚinterÚscanÚrunss                                r,   Úmetrics_and_writer*  É   sk  € Ü˜t KÑ0Ó1´6¸$Ð?UÑ:VÓ3Wˆv€IÜ—‘ÔafÐgnÔaoÓpÑaoÐ\]œV E¨9°d¸LÈ(ÐUVÉ,ÕWÐaoÑpÓq×wÑwÓy€IÜ	�‰�¡U¬5×+;Ñ+;¸FÓ+CÄUÇ[Á[ÔQTÐU[ÓQ\Ôdi×dnÑdnÔEoÐqzÓ%{™(˜!˜U�Ü�M‰M˜%Ó ×&Ñ&Ó(€E¬c°$°Ñ2GÓ.H¨!ÐX\Ð]eÑXfÐhlÐmuÑhvÈvÈ#Ø€FÜ˜D ™N×+‰ˆˆ3Ü�1�Q‘3˜˜1™˜a™Ó ˆ¨²1°b°5Ñ)9×)>Ñ)>¸qÓ)AÄHÑ)L $ÐT]Ò^_ÐacÐ^cÑTd×ThÑThÐijÓTkÔnvÑTvÈcØ—‘“˜rÑ"¤XÑ-ˆ°s¸VÀdÊ1ÈdÈ7ÁmÑ=SÑ7S¨uÐadÐgmÐpuÒvwÐy}Ðv}Ñp~Ñg~Ña~ÐU^Ø�Ñ Ñ#×*Ñ*¬4Ó0ˆ°e¸B±iÀ2±o°!ÌsÐTUÐXYÑTY×S^ÑS^ÓS`ÓOaÀuØ�l 3 % wÐ/Ñ0ˆØ�‰œc #›h´%¼¿¹¸tÀE¹zÓ8J×8OÑ8OÓ8QÓ2RÔ_dÔeg×elÑelÔmo×mtÑmtÐvzð  |Añ  wAð  DEñ  vEó  nFó  fGó  `Hô  jqð  rwð  yBó  jCô  cjð  kpð  rvó  cwô  HYð  Z_ð  `bñ  Zcð  efó  Hgð  w|ô  }@ð  ABô  CFð  HIð  JKñ  HK÷  GPñ  GPó  GRó  CSó  }Tñ  wTð  efð  glñ  elô  mpð  qrô  svð  wx÷  w|ñ  w|ó  w~ð  @÷  Dñ  Dó  Fñ  wFó  sGó  mHñ  eHñ  AIô  ejð  kn÷  ksñ  ksó  kuó  evô  QVð  WZ÷  W^ñ  W^ó  W`ó  Qañ  bö  	cð ,ô 
ˆT�(‰^Ó	€DÜ×Ñœ¤  nÐ5Ñ5¸dÀ8¹nÐY\Ðioð  MV÷  M^ñ  M^ð  _fð  gkð  lmó  Mnô  owñ  Mwð  QTð  U^ñ  Q_ð  `fð  gpñ  `qð  r{÷  rCñ  rCð  DKð  LPð  QRð  STó  rUñ  `Uô  V^ñ  `^ñ  Q^ð  qv÷  q~ñ  q~ð  Cð  DEó  qFð  TXð  Ykñ  Tlô  AC÷  AKñ  AKð  Ljó  Akõ  lØ€Mùò qß	‰ús   ¹OÁ;AOÏO c                óp  — t        |d   «      }|d   }d}|j                  «       j                  d«      } | t        j                  t        |«      «      t        j                  t        |«      t        j                  ¬«      |«      \  }}|j                  «       j                  «        |j                  d d …||t        |«      z   …f   j                  «       j                  d«      j                  «       j                  «       }|j                  «       j                  d«      } | t        j                  t        |«      «      t        j                  t        |«      fdt        j                  ¬«      |«      \  }	}t        d«      d   }
d	|
z
  j                  «        |	z  |
j                  «       z  }|j                  «       j                  «       j                  «        |j                  d d …||t        |«      z   …f   j                  «       j                  d«      j                  «       j                  «       }t         d
dt#        t%        j&                  |«      d d d…   «      D ��cg c]&  \  }}|d	z   t)        ||   «      t+        ||   «      dœ‘Œ( c}}t#        t%        j&                  |«      d d d…   «      D ��cg c]&  \  }}|d	z   t)        ||   «      t+        ||   «      dœ‘Œ( c}}dœ}t,        t         › d�z  j/                  t1        j2                  |dd¬«      d¬«       t5        j6                  d	ddd¬«      \  }}t9        |||fdd«      D ]‘  \  }}}}t%        j&                  |«      dd  d d d…   }|j;                  |D �cg c]
  }d|d	z   › �‘Œ c}d d d…   ||   d d d…   |¬«       |j=                  |«       |j?                  d«       |jA                  dd¬«       Œ“ |jC                  d«       |jE                  t,        t         › d �z  d!¬"«       t5        jF                  |«       y c c}}w c c}}w c c}w )#NrÑ   Úprocess_feature_namesr|   Tr.   r   é   é   r<   zBabsolute local gradients, fixed DDPM state; not causal attributionFrÞ   )ÚrankÚsource_nameÚmean_absolute_gradient)ÚvariantÚmethodÚproduction_validÚrisk_featuresÚdeformation_featuresz_process_gradient.jsonr   ©Úensure_asciiÚindentúutf-8©Úencoding)é   é   ©ÚfigsizeÚconstrained_layout)zweak-risk logit sensitivityz denoised deformation sensitivity)z#495f9dz#a85b35iôÿÿÿzprocess feature )Úcolorzmean absolute local gradientru   çš™™™™™É?©r   Úalphaz@graph_unet_6000: fixed-state sensitivity diagnostic (not causal)z_process_gradient.pngé    ©Údpi)$r   ÚcloneÚrequires_grad_ro   rA   r   r²   r  ÚbackwardÚgradr  Údetachr  rã   r   rä   r  r6   r    r#   r  r¡   r
   Ú
write_textÚjsonÚdumpsÚpltÚsubplotsÚzipÚbarhÚ	set_titleÚ
set_xlabelÚgridÚsuptitleÚsavefigÚclose)ræ   r  ÚbaserÂ   ÚstartÚcrR   r  r¼   rë   rç   rì   ÚdeformrT   rJ   ÚpayloadÚfigÚaxr   ÚvaluesÚtitlerB  Útops                          r,   Úattributionre  Ú   sü  € Ü�$�{Ñ#Ó$€D¨dÐ3JÑ.K eÐUWÈUØ�
‰
‹×#Ñ# DÓ)€A±e¼E¿K¹KÌÈAËÓ<OÔQV×Q\ÑQ\Ô]`ÐabÓ]cÔkp×kuÑkuÔQvÐxyÓ6z©8¨1¨eð  }B÷  }Gñ  }Gó  }I÷  }Rñ  }Rô  }Tð  ]^÷  ]cñ  ]cò  deð  glð  mrô  svð  w|ó  s}ñ  m}ð  g}ð  d}ñ  ]~÷  ]Bñ  ]Bó  ]D÷  ]Iñ  ]Ið  JKó  ]L÷  ]Sñ  ]Só  ]U÷  ][ñ  ][ó  ]]ð  VZØ�
‰
‹×#Ñ# DÓ)€A±E¼%¿+¹+ÄcÈ!ÃfÓ:MÌuÏzÉzÔ[^Ð_`Ó[aÐZcÐdfÔmr×mwÑmwÔOxÐyzÓ4{©6¨3°ô  CKð  LNó  COð  PRñ  CSð  ~Bð  Z[ð  \`ñ  Z`÷  Yfñ  Yfó  Yhð  Xhð  ilñ  Xlð  mq÷  mvñ  mvó  mxñ  Xxð  UWð  z|÷  z@ñ  z@ó  zB÷  zGñ  zGó  zI÷  zRñ  zRô  zTð  ]^÷  ]cñ  ]cò  deð  fkð  lqô  ruð  v{ó  r|ñ  l|ð  f|ð  d|ñ  ]}÷  ]Añ  ]Aó  ]C÷  ]Hñ  ]Hð  IJó  ]K÷  ]Rñ  ]Ró  ]T÷  ]Zñ  ]Zó  ]\ð  V\ÜÐ*nð  EJô  zCô  DF÷  DNñ  DNð  OSó  DTñ  UYð  WYð  UYñ  DZô  z[ô  ]\ñ  z[ñ  svð  stð  uvð  fgð  hiñ  fiô  x{ð  |Að  BCñ  |Dó  xEô  _dð  eið  jkñ  eló  _mó  ^nð  z[ò  ]\ô  U^ô  _a÷  _iñ  _ið  jpó  _qñ  rvð  tvð  rvñ  _wô  Uxô  vyñ  Uxñ  NQð  NOð  PQð  @ð  ABñ  Bô  QTð  UZð  [\ñ  U]ó  Q^ô  x}ð  ~Dð  EFñ  ~Gó  xHó  wIð  Uxò  vyñ  z€GÜ	ŒtˆfÐ*Ð+Ñ+×7Ñ7¼¿
¹
À7ÐX]ÐefÔ8gÐqxÐ7ÔyÜ�l‰l˜1˜Q vÀÔF�G€CˆÜ&)¨"¨d°6¨]Ð;}ð  Tö  'UÑ"ˆˆf�e˜UÜ�J‰J�vÓ˜s˜tÐ$¡T r TÑ*ˆ¨D¯I©IÑY\Ó6]ÑY\ÐTUÐ9IÈ!ÈAÉ#ÈÒ7OÐY\Ñ6]Ñ^bÐ`bÐ^bÑ6cÐdjÐknÑdoÑptÐrtÐptÑduð  }B¨Iô  -Cð  DH÷  DRñ  DRð  SXô  DYð  Z^÷  Ziñ  Zið  jHô  ZIð  JN÷  JSñ  JSð  Y\ð  ceð  JSõ  Jfð 'Uà‡L�LÐSÔTÐVY×VaÑVaÔbfÔjnÐioð  pEð  hFñ  cFð  KNÐVaô  WOô  PS÷  PYñ  PYð  Z]õ  P^ùó ]\ùó  vyùò 7^s   É"+P'Ê7+P-Î P3
c                ó2  — t        | d   d   «      }t        j                  t        t        › d�z  fi t        |d   «      D ��ci c]  \  }}d|› �|“Œ c}}¤t        |d   «      D ��ci c]  \  }}d|› �|“Œ c}}¤t        |d   «      D ��ci c]  \  }}d	|› d
|dz   › �|“Œ c}}¤Ž dddddd|d   D �cg c]  }t        |«      ‘Œ c}|d   D �cg c]  }t        |j                  d   «      ‘Œ c}ddt        | d   «      › d�ddgdœ}	t        t        › d�z  j                  t        j                  |	dd¬«      d¬«       t        j                  dd¬«      }
|
j                  dddd ¬!«      }g d"¢}t        t        |d   |«      «      D ]‚  \  }\  }}t        j                   d#t        |«      dz
  t#        d$t        |«      «      t        ¬%«      }|j%                  ||d#f   ||df   ||df   d|d&z  z   |d'|› d(t        |«      d)›d*�d+¬,«       Œ„ |j'                  d-«       |j)                  d.«       |j+                  d/«       |j-                  d0«       |j/                  d1¬2«       |j1                  d3d4«       |
j                  ddd«      }|j3                  |D �cg c]  }|d5   ‘Œ	 c}|D �cg c]  }|d6   ‘Œ	 c}d7¬8«       |j3                  |D �cg c]  }|d5   ‘Œ	 c}|D �cg c]  }|d9   ‘Œ	 c}d:¬8«       |j5                  d;«       |j'                  d<«       |j)                  d5«       |j7                  d=¬>«       |j/                  «        |
j9                  t        t        › d?�z  d@¬A«       t        j:                  |
«       t        j<                  t>        t        › dB�z  «      }|dC   }|dD   }|dE   dF   }|dG   d   }t        j<                  t>        dHz  «      }t        j@                  dddId¬«      \  }
}t        dJ|fdK|ff«      D ]ô  \  }\  }}|dE   dF   }|||d d …d f   z  z   }|dG   d   }t        tC        |«      dLdMdNf|dOdPdff«      D ]¬  \  }\  }}} }!|||f   j%                  |d d …d#f   |d d …df   |d| d#|!d¬Q«      }"|||f   j'                  |› d(|› �«       |||f   j)                  dR«       |||f   j+                  dS«       |||f   jE                  dT«       |
jG                  |"|||f   dU¬V«       Œ® Œö |
jI                  |› dW�«       |
j9                  t>        t        › dX|› dY�z  dZ¬A«       t        j:                  |
«       t        jJ                  t>        d[z  jM                  d¬«      «      }#tO        d\„ |#d]   D «       «      }$t        j@                  d^¬_«      \  }
}d`dag}%|$db   d   dc   |d   dc   g}&|$db   d   d9   dd   xs d#|d   d9   dd   xs d#g}'t        jP                  d«      }(|jS                  |(dez
  |&df|› dg�dh¬i«       |jU                  «       }|jS                  |(dez   |'dfdjdk¬i«       |jW                  |(|%«       |j+                  dl«       |j+                  dm«       |j'                  dn«       |j7                  dod=¬p«       |j/                  dq¬r«       |j/                  ds¬r«       |
j9                  t>        t        › dt�z  d@¬A«       t        j:                  |
«       y c c}}w c c}}w c c}}w c c}w c c}w c c}w c c}w c c}w c c}w )uNrô   rÞ   z_hierarchy.npzr\   Ú
positions_r]   Úedges_r^   Úpool_assignment_Ú_to_r<   ziTopology-Agnostic Graph U-Nets for Scalar Field Prediction on Unstructured Meshes (Ferguson et al., 2024)zV3-level kd-tree TAG U-Net denoiser; source paper is direct scalar regression, not DDPMzGbalanced kd-tree leaves, at most 8 3-D nodes; mean pool / copied unpoolz>EdgeConv max aggregation with CAD coordinates each convolutionzRprepared CAD edge_index with explicit relative delta xyz and Euclidean edge lengthzz12-NN bidirectional edges after each pool, with relative delta xyz and Euclidean length recomputed from coarse coordinatesz=same XLS/global heater values and validity mask as graph_6000Fz NG run(s), no held-out testz+registration and defect extents unvalidatedzAheater footprints unavailable; local heater projection mask false)ÚpaperÚ
adaptationÚpoolingÚconvolutionÚlevel_0Úcoarse_levelsÚsizesr]   rÑ   r4  Úlimitationsz_hierarchy.jsonr   r7  r:  r;  )r=  gš™™™™™@Tr?  Ú3d)Ú
projection)z#274c77z#6096baz#a3cef1z#f6bd60r   i„  r.   é   zlevel z: Ú,z nodesgÍÌÌÌÌÌä?)ri   r]  ÚlabelrE  z!CAD kd-tree Graph U-Net hierarchyzX mmzY mmzZ mmé   )Úfontsizeé   i¿ÿÿÿÚepochÚdenoisezdenoise MSE)rw  r¼   zrisk BCErÈ   zbounded CPU fit lossrC  )rE  z_hierarchy.pngrF  rG  r  r  r  r  )r   rÞ   r  zgraph_6000_generated.npz)r|   rZ   zgraph_6000 baselinezgraph_unet_6000 TAGzgenerated deformation |mm|Úviridisr.  zweak risk probabilityÚmagma)r]  ri   ÚcmapÚvminÚvmaxÚ
rasterizedz
CAD X (mm)z
CAD Z (mm)Úequalg
×£p=
ç?)ra  Úshrinkz> same CAD X-Z view / same colour scales: baseline vs TAG U-NetrR   ú_comparison.pngéª   úreport.jsonc              3  ó2   K  — | ]  }|d    dk(  sŒ|–— Œ y­w©r2  Ú
graph_6000N© ©Ú.0Úvs     r,   Ú	<genexpr>zfigures.<locals>.<genexpr>û   s8   è ø€ ð  SRÑ^rÐYZÐvwð  yBñ  wCð  EQó  wQÔSTÑ^rùs   ‚�Úvariants)rZ   gffffff@)r@  rŠ  r   Úmetricsrû   rø   g
×£p=
Ç?g
×£p=
×?z MAE mmz#36648b)rw  rB  zweak APz#ce7e3azMAE (lower)zAP (higher)z;Graph baseline vs paper-inspired TAG U-Net (weak-label fit)r&  rD  z
upper left)Úloczupper rightz_metric_comparison.png),r  r    r  r   r  r6   r   r   rp   rN  rO  rP  rQ  ÚfigureÚadd_subplotrS  rÆ   rM   ÚscatterrU  rV  Ú
set_ylabelÚ
set_zlabelÚlegendÚ	view_initÚplotÚ
set_yscalerW  rY  rZ  Úloadr   rR  r  Ú
set_aspectÚcolorbarrX  ÚloadsÚ	read_textÚnextr3   ÚbarÚtwinxÚ
set_xticks))r  r¾   Úhistoryr‘  rú   rT   r¿   Úerh   Úsummaryr`  ra  ÚcolorsrÔ   ÚcolÚidsÚax2rÒ   Úgenr   ró   Údispr¼   r[  Úaxesrw  rj   r$  ÚrrU   Úvaluerc  r  ÚlimitÚshownÚbaselineÚoldÚlabsÚmaeÚapru   s)                                            r,   Úfiguresr¸  æ   s  € ÜˆD�‰N˜2ÑÓ€Cä×Ñœœt˜f NÐ3Ñ3ñ  AÔV_Ð`eÐfqÑ`rÔVsÔ7tÑVsÉsÈqÐQR¸*ÀQÀCÐ8HÈÑ8JÐVsÒ7tð  Aô  T]ð  ^cð  dkñ  ^lô  Tmô  ynñ  Tmñ  MPð  MNð  OPð  |Bð  CDð  BEð  zFð  GHñ  zHð  Tmò  ynð  Aô  `ið  joð  p}ñ  j~ô  `ô  r@ñ  `ñ  Y\ð  YZð  [\ð  uEð  FGð  EHð  HLð  MNð  OPñ  MPð  LQð  sRð  STñ  sTð  `ò  r@ò  Að Að  Ogð  r{ð  JJð  Uið  zv	ð  P
U
ð  V
a
ò  P
b
ó  	c
ñ  P
b
ð  K
L
ô  @
C
ð  D
E
õ  @
F
ð  P
b
ñ  	c
ð  FKð  LSò  FTó  l
Uñ  FTð  ABô  m
p
ð  q
r
÷  q
x
ñ  q
x
ð  y
z
ñ  q
{
õ  m
|
ð  FTñ  l
Uð  bað  uzô  MPð  QUð  V^ñ  Q_ó  M`ð  Lað  a}ð  J~ð  lð  mpð  Iqñ  r€GÜŒDˆ6�Ð	!Ñ!×-Ñ-¬d¯j©j¸ÈeÐ[\Ô.]ÐgnÐ-ÔoÜ�
‰
˜8°tÔ<€CÀÇÁÐQRÐSTÐUVÐbfÀÓAg¸bÚ4€FÜ"¤3 u¨[Ñ'9¸&Ó#AÖB‰ˆ‰gˆq�Ü�K‰K˜œ#˜a›& ™(¤3 s¬3¨q«6£?¼Ô=ˆ¸b¿j¹jÈÈ3ÈqÈ5ÉÐRSÐTWÐXYÐTYÑRZÐ[\Ð]`ÐabÐ]bÑ[cÐfgÐhmÐnoÑhoÑfoÐruð  Eð  FKð  ELð  LNô  ORð  STó  OUð  VWð  NXð  X^ð  }_ð  fi¸jõ  ?jð Cà‡L�LÐ4Ô5°b·m±mÀFÔ6KÈBÏMÉMÐZ`ÔLaÐbd×boÑboÐpvÔbwÐxz÷  yBñ  yBð  LMð  yBô  yNð  OQ÷  O[ñ  O[ð  \^ð  _bô  OcØ�‰˜˜!˜AÓ€C §¡¹gÓ)F¹g¸¨!¨G«*¸gÑ)FÑ^eÓGfÑ^eÐYZÈÈ)ËÐ^eÑGfÐmz Ô {Ð|÷  }Eñ  }Eñ  [bó  Fcñ  [bð  VWð  GHð  IPó  GQð  [bñ  Fcñ  xó  d@ñ  xð  stð  efð  gmó  enð  xñ  d@ð  GQð  }Eô  }Rð  SV÷  Sañ  Sað  bgô  Shð  il÷  ivñ  ivð  wMô  iNð  OR÷  O]ñ  O]ð  ^eô  Ofð  gj÷  goñ  goð  vxð  goô  gyð  z}÷  zDñ  zDô  zFØ‡K�K””t�f˜NÐ+Ñ+°€KÔ4´S·Y±Y¸s´^ä
�‰””t�f˜NÐ+Ñ+Ó,€C°#°lÑ2C¨cÈ3È|ÑK\ÀFÐbeð  gCñ  cDð  EIñ  cJÐ]að  PSð  Tfñ  Pgð  hjñ  Pkð  KOô  qs÷  qxñ  qxô  y|ð  }Wñ  yWó  qXð  lpÜ�\‰\˜!˜A fÀÔE�H€CˆÜ"Ð%:¸4Ð$@ÐBWÐX[ÐA\Ð#]Ö^‰ˆ‰IˆU�1Ø
Ð(Ñ
)¨$Ñ
/ˆ°c¸&ÀÂ1ÀTÀ6ÁÑ:JÑ6J°ÈQÐOaÑMbÐceÑMfÈ1Ü,5¼¸A»Ð?[Ð\eÐfhÐ7iÐklð  nEð  FMð  NOð  kPð  7Qö  -RÑ(ˆCÑ(��u˜T %Ø�s˜3�w‘-×'Ñ'¨ªa°¨c©
°5º¸1¸±:ÀÈÈtÐYZÐ`eÐquÐ'ÓvˆEÐw{Ð|ð  ADð  }Dñ  xE÷  xOñ  xOð  SXð  RYð  Y[ð  \að  [bð  Pcô  xdð  eið  jmð  nqð  jqñ  er÷  e}ñ  e}ð  ~Jô  eKð  LPð  QTð  UXð  QXñ  LY÷  Ldñ  Ldð  eqô  Lrð  swð  x{ð  |ð  xñ  s@÷  sKñ  sKð  LSô  sTð  UX÷  Uañ  Uað  bgð  koð  psð  twð  pwñ  kxð  @Cð  Uaõ  UDñ -Rð _ð ‡L�L�C�5ÐVÐWÔXÐY\×YdÑYdÔehÔlpÐkqÐqrÐsvÐrwð  xGð  jHñ  fHð  MPÐYdô  ZQô  RU÷  R[ñ  R[ð  \_ô  R`Ü�Z‰Zœ˜]Ñ*×5Ñ5¸wÐ5ÓGÓH€HÌdñ  SRÐ^fÐgqÒ^ró  SRó  ORÈ#Ü�<‰< Ô(�F€Cˆ¨|Ð<MÐ.N¨ÐTWÐXaÑTbÐceÑTfÐgoÑTpÐqxÐy{Ñq|ð  ~Fñ  rGð  THÈsð  MPð  QZñ  M[ð  \^ñ  M_ð  `fñ  Mgð  hlñ  Mmò  Mrð  qrð  szð  {}ñ  s~ð  Eñ  sFð  GKñ  sLò  sQð  PQð  LRð  IKô  UW÷  U^ñ  U^ð  _`ó  Uað  STð  bd÷  bhñ  bhð  ijð  knñ  inð  orð  svð  @Cð  Dð  DKð  }Lð  S\ð  bhô  b]ð  `b÷  `hñ  `hó  `jð  ^_ð  kl÷  kpñ  kpð  qrð  svñ  qvð  wyð  z}ð  DMð  T]ð  kpô  k^ð  _a÷  _lñ  _lð  mnð  osô  _tð  uw÷  uBñ  uBð  CPô  uQð  RS÷  R^ñ  R^ð  _lô  Rmð  np÷  nzñ  nzð  {xô  nyð  z|÷  zAñ  zAð  GJð  QSð  zAô  zTð  UW÷  U^ñ  U^ð  coð  U^ô  Upð  qr÷  qyñ  qyð  ~K	ð  qyô  qL	ð  M	P	÷  M	X	ñ  M	X	ô  Y	\	ô  `	d	ð  _	e	ð  e	{	ð  ]	|	ñ  Y	|	ð  A
D
ð  M	X	ô  M	E
ô  F
I
÷  F
O
ñ  F
O
ð  P
S
õ  F
T
ùó' 8uùó  ynùó  r@ùò 	c
ùò  l
Uùò *GùÒGfùò  Fcùò  d@s6   Á[)Á([/Â[5Â6[;Ã\ Ê\Ê*\

Ë\Ë \
c                óº  — t        «        t        t        t        t        fD �cg c]  }|j                  dd¬«      ‘Œ c} t        d«      }t        j                  t        j                  dz  d¬«      }t        |d   t        |d   «      «      }t        |d   |«      }t        |d	   d
   «      }t        t!        |d   j"                  d   «      || j$                  ¬«      }t'        |d   «      }t'        |d   «      }	t'        |d   «      }
t)        | j*                  «      }t,        j.                  j1                  |j3                  «       | j4                  d¬«      }t        |
«      |
j7                  «       z
  |
j7                  «       j9                  d«      z  j;                  d¬«      }g }t=        d«      dd f}t?        | j@                  «      D �]^  }|jC                  «        t-        jD                  d| j*                  t        |	«      f«      }t-        jF                  |	«      }||   jI                  «       |	z  d||   z
  jI                  «       |z  z   } ||||«      \  }}tK        jL                  ||«      }tK        jN                  ||
|¬«      }|d|z  z   }|jQ                  «        t,        jR                  jT                  jW                  |j3                  «       d«       |jY                  «        t-        jZ                  |«      j]                  «       j_                  «       }|ja                  |dz   t=        |j]                  «       «      t=        |j]                  «       «      t=        |j]                  «       «      tc        ||d   je                  tf        «      «      xs ddœ«       t=        |j]                  «       «      |d   k  s�Œôt=        |j]                  «       «      |dz   |ji                  «       jk                  «       D ��ci c]$  \  }}||j]                  «       jm                  «       “Œ& c}}f}�Œa |jo                  |d   «       |jq                  «        t        tr        › d�z  }t-        jt                  |ji                  «       dd|d   D �cg c]  }t        |«      ‘Œ c}t!        |j"                  d   «      dd œ|«       tw        |||| jx                  | jz                  «      }t}        ||«       t        ||||«       tr        d!dd"| j$                  › d#�t!        |d$   «      t!        |j"                  d   «      |d   D �cg c]  }t        |«      ‘Œ c}||d   |d   |t        |j�                  t        j                  «      «      dt        |d	   «      › d%�d&œ}t        tr        › d'�z  jƒ                  t…        j†                  |dd¬(«      d)¬*«       t        d+z  }t…        jˆ                  |j‹                  d)¬*«      «      } | d,   D �cg c]  }|j�                  d-«      tr        k7  sŒ|‘Œ c}|gz   | d,<   dtr        |› d.�d/tr        › d0|› d1�d2d3œ| d4<   |jƒ                  t…        j†                  | dd¬(«      d)¬*«       t        d5z  }!|!j‹                  d)¬*«      }"d6}#t�        d7„ | d,   D «       «      }$|$d8   d
   }%|d
   }&d9j‘                  g d:‘|#› ‘d;‘t        |d	   «      › ‘d<‘|› ‘d=‘|%d>   d?›‘d@‘|%dA   d?›‘d@‘|%dB   dC   d?›‘d@‘|%dB   dD   dE›‘d@‘|%dF   dG›‘dH‘|&d>   d?›‘d@‘|&dA   d?›‘d@‘|&dB   dC   d?›‘d@‘|&dB   dD   dE›‘d@‘|&dF   dG›‘dI‘tr        › ‘d0‘|› ‘dJ‘tr        › ‘dK‘tr        › ‘dL‘tr        › ‘dM‘tr        › ‘dN‘tr        › ‘dO‘«      }'|#|"v r(t“        j”                  dP|'|"t’        j–                  ¬Q«      }"n|"|'z  }"|!jƒ                  |"d)¬*«       |S c c}w c c}}w c c}w c c}w c c}w )RNT)ÚparentsÚexist_okrŠ  z$data_processed/graphs/graph_6000.npzF)Úallow_pickleÚ
edge_indexrò   rô   rÞ   rÑ   r<   )r¯   rð   Úrisk_targetgñhãˆµøä>)ÚlrÚweight_decayéÈ   )r@   r’   r   )Ú
pos_weightgffffffÖ?g      @rõ   g        )r{  Útotalr|  r¼   rø   r   z.ptzCpaper-inspired 3-level TAG U-Net EdgeConv conditional DDPM denoiserr\   )Ú
state_dictÚarchitectureÚpaper_reproductionÚhierarchy_sizesr½   r4  zbpaper-inspired TAG U-Net with 3 kd-tree pool/unpool levels, EdgeConv max aggregation, concat skipsz�the paper uses direct scalar-field regression with larger ReLU EdgeConv networks and much more training data; this compact width-z8 SiLU backbone is adapted as a conditional DDPM denoiserrñ   z> weak/unvalidated NG run(s); no held-out generalization result)r2  rÅ  rÆ  Úpaper_differencerñ   r½   rÇ  r¥  Ú	best_lossÚ
best_epochr‘  Ú
checkpointr4  Ú
limitationz_report.jsonr7  r:  r;  r‡  r�  r2  z+ CAD X-Z; identical deformation/risk scaleszgen_models/outputs/rR   r…  z.weak-label fit only; not a held-out comparison)r³  Ú	candidateÚ
fixed_viewÚartifactÚstatusÚtag_graph_unet_comparisonz
index.htmlÚTAG_GRAPH_UNET_ENTRYc              3  óJ   K  — | ]  }|j                  d «      dk(  sŒ|–— Œ y­wr‰  )ÚgetrŒ  s     r,   r�  zrun.<locals>.<genexpr>  s#   è ø€ ÐYÑ"4˜Q¸¿¹¸iÓ8HÈLÓ8X”qÑ"4ùs   ‚#œ#r‘  Ú zB<section id=tag-graph-unet><h2>TAG Graph U-Net candidate</h2><!-- zg --><p>Paper-inspired three-level kd-tree Graph U-Net inside the conditional DDPM. It is a weak-label, z;-run fit and is not a validation result.</p><table><tr><th>u–   </th><th>MAE mm â†“</th><th>CAD Chamfer mm â†“</th><th>weak AP â†‘</th><th>IoU@0.5 â†‘</th><th>uncertainty mm â†“</th></tr><tr><td>graph_6000</td><td>rû   z.3fz	</td><td>rý   r¼   rø   rù   z.4frÿ   z.2fz*</td></tr><tr><td>graph_unet_6000</td><td>z</td></tr></table><p><a href=uE   _comparison.png>same-view graph baseline vs TAG U-Net</a> Â· <a href=uL   _metric_comparison.png>metric comparison</a> Â· <a href=../processed_inputs/uD   _hierarchy.png>kd-tree hierarchy</a> Â· <a href=../processed_inputs/uF   _hierarchy.json>hierarchy JSON</a> Â· <a href=../feature_attributions/u1   _process_gradient.png>attribution</a> Â· <a href=z._report.json>full run report</a></p></section>z(<section id=tag-graph-unet>.*?</section>)Úflags)Lr   r   r   r   r
   Úmkdirr   r    rœ  r   Úparentrk   r   rd   r  r©   r   rp   r¯   r   r   Údiffusion_stepsro   ÚoptimÚAdamWÚ
parametersÚlearning_rater  r�   rå   r¡   r`   ÚepochsÚ	zero_gradÚrandintÚ
randn_likerä   r—   Úmse_lossÚ binary_cross_entropy_with_logitsrK  r   ÚutilsÚclip_grad_norm_rË   r  rM  r  r   r   r_   r  rÄ  ÚitemsrI  Úload_state_dictÚevalr  Úsaver*  r  rè   re  r¸  Úrelative_torN  rO  rP  rŸ  r   rÔ  r¡  ÚjoinÚreÚsubÚS)(Úargsr¿   r  Úrawra   r¾   rú   ræ   rÑ   r  r¼   rç   ÚoptrÂ  r¥  Úbestr{  rÐ   ÚnoiseÚxtrë   r  r|  ÚrlossÚlossr  rJ   rŽ  rË  ÚmetricÚreportÚshared_pathÚsharedÚgallery_pathÚgalleryÚmarkerÚbase_reportÚbase_18Útag_18Úentrys(                                           r,   rú   rú   ÿ   sq  € ÜÔÄcÌ#ÌcÔRVÑEWÓXÑEWÀ˜Ÿ™¨°d˜Õ;ÐEWÒXÜ	˜Ó	&€D¬B¯G©G´C·J±JÐ?eÑ4eÐsxÔ,y¨ô  BOð  PSð  T`ñ  Paô  beð  fjð  ksñ  ftó  buó  Bvð  |Aô  ~Gð  HLð  MUñ  HVð  W\ó  ~]ð  x}ÜˆD�‰N˜2ÑÓ€CÜ
œ#˜d ;Ñ/×5Ñ5°aÑ8Ó9¸%ÀdÇjÁjÔ
Q€EÔ\bÐcgÐhsÑctÓ\uÐR[ô  ~Dð  EIð  J`ñ  Eaó  ~bÐv|ô  hnð  osð  tAñ  oBó  hCð  cgô  IQð  RV÷  Rfñ  Rfó  Igð  DHô  lq÷  lwñ  lw÷  l}ñ  l}ð  ~C÷  ~Nñ  ~Nó  ~Pð  TX÷  Tfñ  Tfð  txð  l}ó  lyð  hkô  GJð  KOó  GPð  QU÷  QYñ  QYó  Q[ñ  G[ð  ]a÷  ]eñ  ]eó  ]g÷  ]qñ  ]qð  rsó  ]tñ  Ft÷  E{ñ  E{ð  @Cð  E{ó  EDð  zDð  MOð  ELô  V[ð  \aó  Vbð  cdð  eið  Ujð  PTÜ�t—{‘{×#ˆØ�‰Œœ%Ÿ-™-¨¨$×*>Ñ*>ÄÀFÃ¸~ÓN˜ÔUZ×UeÑUeÐflÓUmÈuÐquÐvwÑqx×q}Ñq}Óqð  AGñ  rGð  IJð  KOð  PQñ  KRñ  IR÷  HXñ  HXó  HZð  [`ñ  H`ñ  r`Ðnpñ  kpð  qsð  tuð  vó  k@ñ  ajð  adð  ejô  IJ÷  ISñ  ISð  TWð  X]ó  I^ð  AHô  ef÷  eGñ  eGð  HMð  NRð  ^hô  eið  _dð  ovð  wzð  {@ñ  w@ñ  o@ð  jnð  AE÷  ANñ  ANô  APô  QV÷  QYñ  QY÷  Q_ñ  Q_÷  Qoñ  Qoð  pu÷  p@ñ  p@ó  pBð  CEô  QFð  GJ÷  GOñ  GOô  GQô  X]÷  Xeñ  Xeð  fkó  Xl÷  Xsñ  Xsó  Xu÷  X{ñ  X{ó  X}ð  RWð  ~E÷  ~Lñ  ~Lð  V[ð  \]ñ  V]ô  fkð  lp÷  lwñ  lwó  lyó  fzô  EJð  KR÷  KYñ  KYó  K[ó  E\ô  dið  jo÷  jvñ  jvó  jxó  dyô  P	ð  Q	V	ð  W	[	ð  \	i	ñ  W	j	÷  W	q	ñ  W	q	ô  r	v	ó  W	w	ó  x	ò  ~	ð  |	~	ñ  M	ô  ~@
Ü�—‘“Ó  Q¡Ô'¬e°D·K±K³MÓ.BÀ5ÈÁ7Ðlq×l|Ñl|Ól~÷  mEñ  mEô  mGô  LHñ  mGÑehÐefÐghÈAÈaÏhÉhËj×N^ÑN^ÓN`ÑL`ð  mGò  LHð  .Iªð $ð 
×Ñ˜$˜q™'Ô" 5§:¡:¤<¼3Ä$ÀÀs¸|Ñ;K°
ÌEÏJÉJÐej×euÑeuÓewð  HMð  chð  LQð  R]ò  L^ó  {_ñ  L^ð  GHô  |ð  @Aõ  |Bð  L^ñ  {_ô  psð  t}÷  tCñ  tCð  DEñ  tFó  pGð  [`ñ  Xað  blô  MmÜ˜U 4¨¨T¯\©\¸$×:KÑ:KÓL€FÌ[ÐY^Ð_cÔMdÔelÐmqÐrwÐxð  AGô  fHÜð  +Oð  ejð  @Að  BF÷  BLñ  BLð  AMð  MEð  ~Fô  WZð  [_ð  `oñ  [pó  Wqô  BEð  FO÷  FUñ  FUð  VWñ  FXó  BYð  }Bð  CNò  }Oó  lPñ  }Oð  xyô  mpð  qrõ  msð  }Oñ  lPð  [bð  osð  tuñ  ovð  D	H	ð  I	J	ñ  D	K	ð  V	\	ô  j	m	ð  n	x	÷  n	D
ñ  n	D
ô  E
H
÷  E
O
ñ  E
O
ó  n	P
ó  j	Q
ð  e
j
ô  {
~
ð  
Cð  DLñ  
Mó  {
Nð  z
Oð  OMð  x
Nñ  O€FÜŒDˆ6�Ð	Ñ×*Ñ*¬4¯:©:°fÈ%ÐWXÔ+YÐcjÐ*Ôkô ˜Ñ%€KÜ�Z‰Z˜×-Ñ-°wÐ-Ó?Ó@€FØ%+¨JÒ%7ÓTÑ%7 ¸1¿5¹5ÀÓ;KÌtÓ;Sš!Ð%7ÑTÐX^ÐW_Ñ_€Fˆ:Ñà ÜØ˜ÐHÐIØ)¬$¨¨q°°°_ÐEØBñ+€FÐ&Ñ'ð ×Ñœ4Ÿ:™: f¸5ÈÔKÐV]ÐÔ^ô ˜Ñ%€LØ×$Ñ$¨gÐ$Ó6€GØ#€FÜÑY &¨Ò"4ÓYÓY€KØ˜)Ñ$ RÑ(€GØ�B‰Z€F÷Mó MÐQð MÐRXÐQYð Mð Z$ð Mä$'¨¨X©Ó$7Ð#8ðMð9ðMð  #˜eðMð$+ðMð ,3°8Ñ+<¸SÐ*Að	Mð BKð	Mð LSÐSqÑKrÐsvÐJwð	Mð xAð	Mð BIð  JPñ  BQð  RVñ  BWð  X[ð  A\ð	Mð \eð	Mð fmð  ntñ  fuð  vBñ  fCð  DGð  eHð	Mð HQð	Mð RYð  Zrñ  Rsð  twð  Qxð	Mðx0ð	Mð
 17°xÑ0@ÀÐ/EðMð
 FOðMð
 PVÐVtÑOuÐvyÐNzðMð
 {DðMð
 EKð  LRñ  ESð  TXñ  EYð  Z]ð  D^ðMð
 ^gðMð
 hnð  ouñ  hvð  wCñ  hDð  EHð  gIðMð
 IRðMð
 SYð  Zrñ  Ssð  twð  RxðMð
xðMô  ˜&ðMð !"ðMð #& ðMð'ðMô �vðMð,ðMô -1¨6ðMð2,ðMô -1¨6ðMð20ðMô 15¨vðMð6ðMô �vðMð LôM€Eð �ÑÜ—&‘&ÐDÀeÈWÔ\^×\`Ñ\`Ôa‰à�5ÑˆØ×Ñ˜G¨gÐÔ6Ø€Mùòc Yùó LHùò {_ùò lPùò Us#   £_Ï:)_Ò_Ô8_×=_Ø_c                 ó   — t        j                  t        ¬«      } | j                  dd¬«       | j                  dt        d¬«       | j                  dt
        d	¬«       | j                  d
t        d¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  «       }|j                  st        d«      ‚t        t        j                  t        |«      dd¬«      «       y )N)Údescriptionz--allow-diagnostic-weak-labelsÚ
store_true)Úactionz--epochsr|   )ÚtypeÚdefaultz--learning-rategü©ñÒMbP?z--diffusion-stepsr.  z--sample-stepsz	--samplesr=   z--widthrÚ   zQPass --allow-diagnostic-weak-labels: only weak, unvalidated labels are available.Fr   r7  )ÚargparseÚArgumentParserr¥   Úadd_argumentr   r¡   Ú
parse_argsÚallow_diagnostic_weak_labelsÚ
SystemExitÚprintrO  rP  rú   )Úparserrï  s     r,   Úmainr  4  sÖ  € Ü×"Ñ"¬wÔ7€F¸×8KÑ8KÐLlð  uAÐ8Kô  9Bð  CI÷  CVñ  CVð  Waô  gjð  suð  CVô  Cvð  w}÷  wJñ  wJð  K\ô  bgð  ptð  wJô  wuð  v|÷  vIñ  vIð  J]ô  cfð  oqð  vIô  vrð  sy÷  sFñ  sFð  GWô  ]`ð  ikð  sFô  slð  ms÷  m@ñ  m@ð  ALô  RUð  ^_ð  m@ô  m`ð  ag÷  atñ  atð  u~ô  DGð  PRð  atô  aSð  Y_÷  Yjñ  Yjó  Ylð  TXØ×,Ò,´:ð  ?Ró  4Sð  .SÜ	Œ$�*‰*”S˜“Y¨E¸Ô
;Õ<r-   Ú__main__)rZ   )r*   r0   r)   r   r1   r0   )r*   r0   r7   r0   r1   r0   )r[   )r*   r0   rJ   r   r1   r0   )r*   r0   ra   r0   r1   rÛ   )rf   r0   rg   r   r1   r0   )ru   r   r7   r   rv   r   r1   r   )ræ   r©   rÑ   r   rç   r   rè   r   ré   r   r1   r   )ræ   r©   r  rÛ   rç   r   r  r   rè   r   r1   úlist[dict[str, Any]])ræ   r©   r  rÛ   r1   r2   )
r  rÛ   r¾   rÛ   r¥  zlist[dict[str, float]]r‘  r  r1   r2   )rï  zargparse.Namespacer1   rÛ   )r1   r2   ):r¥   Ú
__future__r   r  rO  rÇ   rì  Úpathlibr   Útypingr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotrQ  r  r    ro   r   r   Útorch.nn.functionalÚ
functionalr—   Úscipy.spatialr	   Ú,gen_models.models.four_conditional_diffusionr
   r   r   r   r   r   r   r   r   r   r   Úmodels.trainingr   r  r:   rH   rX   rd   rk   rx   ÚModulerz   r©   r  rî   r*  re  r¸  rú   r  r¢   r‹  r-   r,   Ú<module>r      só   ðñõ #ã Û Û Û 	Ý Ý ã Ø €
‡�ˆuÔ Ý Û Û ß ß Ð Ý !÷÷ ÷ ñ õ ,ð €ôó(Cô7óPó"7óô*ˆr�y‰yô *ô80Z�b—i‘iô 0Zðf €‡�ƒòó ðóó"	^óT
ó22ój=ð
 ˆZÒ™�Ðr-   