Ë
    ¦IºjÚy  ã                  óh  — 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mZ ddlZddlmZmZ ddlmc mZ dd	lmZmZmZ dd
lmZ ej@                  jC                  dddœ«       edz  Z"d„ dD «       \  Z#Z$Z%Z&dZ'dZ(ejR                  fd)d„Z*d*d„Z+d+d„Z,d,d„Z-d-d„Z.d.d„Z/d/d„Z0 G d„ dejb                  «      Z2d0d„Z3d1d„Z4d2d„Z5d3d„Z6 ejn                  «       d4d „«       Z8d5d!„Z9d6d"„Z:d7d#„Z;d8d$„Z<d9d%„Z=d:d&„Z>d;d'„Z?e@d(k(  r e?«        yy)<ae  Four compact conditional-diffusion diagnostics for prepared CAD/run data.

Each representation predicts CAD-correspondent signed normal displacement and a
weak defect-risk field.  Generated points are always reconstructed as
``p_generated = p_CAD + n_CAD * displacement``.  This is intentionally a
weak-label experiment, not a production training pipeline.
é    )ÚannotationsN)ÚPath)ÚAnyÚAgg)ÚcKDTree)ÚTensorÚnn)ÚROOTÚfixed_physical_normalizeÚsplit_embedded_units)Úseed_everythingzDejaVu SansF)zfont.familyzaxes.unicode_minusÚ
gen_modelsc              #  ó.   K  — | ]  }t         |z  –— Œ y ­w)N)ÚEXP)Ú.0Únames     ú/gen_models/models/four_conditional_diffusion.pyÚ	<genexpr>r       s   è ø€ ÐpÑ.o d”s˜T•zÑ.oùs   ‚©Úprocessed_inputsÚmodelsÚoutputsÚfeature_attributionsç      >@)Úimage_2dÚvoxel_3dÚ
point_6000Ú
graph_6000c                ó0   — t        j                  | |¬«      S )N©Údtype)ÚtorchÚ	as_tensor)Úxr!   s     r   Útensorr%   %   s   € Ü�?‰?˜1 EÔ*Ð*ó    c                ó²  — | d   j                  t        j                  «      j                  «       }| d   j                  t        «      }| d   j                  t
        «      }t        |«      \  }}|j                  «       }t        j                  t        |«      t        «      }d| d   | d   fd| d   | d	   ffD ]Z  \  }}}	t        d
d«      D ]E  }
|› |
d›�}||v sŒ|	|
d
z
     sŒ||
d
z
     ||j                  |«      <   d||j                  |«      <   ŒG Œ\ ||z  }t        t        j                  ||d«      d    t        j                  |«      |«      d   }t        j                  ||j                  t        j                  «      |j                  t        j                  «      f   ||D �cg c]  }|› d�‘Œ	 c}z   |D �cg c]  }|› d�‘Œ	 c}z   fS c c}w c c}w )NÚ	process_xÚprocess_feature_validÚprocess_feature_namesu   ìƒ�ë¶€ì˜¨ë�„Úheater_top_cÚheater_top_imputedu   í•˜ë¶€ì˜¨ë�„Úheater_bottom_cÚheater_bottom_imputedé   é   Ú02dTr   z	:observedz:imputed)ÚastypeÚnpÚfloat32ÚcopyÚboolÚstrr   ÚtolistÚzerosÚlenÚrangeÚindexr   ÚwhereÚasarrayÚr_)ÚitemÚrawÚobservedÚnamesÚbaseÚunitsÚimputedÚprefixÚvaluesÚflagsÚzoner   ÚvalidÚvalueÚns                  r   Úprocess_vectorrN   )   s.  € Ø
ˆ{Ñ
×
"Ñ
"¤2§:¡:Ó
.×
3Ñ
3Ó
5€CÀ$ÐG^ÑB_×BfÑBfÔgkÓBl°xØÐ(Ñ)×0Ñ0´Ó5€EÔEYÐZ_ÓE`±{°t¸UÐim×itÑitÓivÐbfÜ�h‰h”s˜3“x¤Ó&€GØ#1°4¸Ñ3GÈÐNbÑIcÐ"dÐguÐw{ð  }Nñ  xOð  QUð  Vmñ  Qnð  goó  "pÑˆ�˜Ü˜!˜R–LˆDØ�X˜d 3˜ZÐ(ˆDØ�tŠ|  d¨Q¡h£Ø(.¨t°a©xÑ(8��D—J‘J˜tÓ$Ñ%ÐVZ¸'À$Ç*Á*ÈTÓBRÒ:Sñ !ð "pð
 �wÑ€EÜ$¤R§X¡X¨e°S¸!Ó%<¸TÑ%BÄBÇJÁJÈtÓDTÐV[Ó\Ð]^Ñ_€EÜ�5‰5�˜Ÿ™¬¯
©
Ó3°W·^±^ÄBÇJÁJÓ5OÐOÑPÐRVÑswÓYxÑswÐnoÐ]^Ð\_Ð_hÒZiÐswÑYxÑRxñ  UYó  |Zñ  UYð  PQð  @Að  Bð  BJò  }Kð  UYñ  |Zñ  SZð  Zð  ZùÒYxùò  |Zs   Æ)GÆ=Gc           	     ó‚  — t        j                  |t        j                  | ddd¬«      d«      j                  t         j                  «      }t        j
                  t        j                  t        j                  |«      d¬«      d«      }t        j                  ||z  dd«      j                  t         j                  «      S )zIRepresentation-only fixed summary scaling; no outcome information is fit.ç        )ÚnanÚposinfÚneginfr   ©Úaxisgü©ñÒMbP?iöÿÿÿé
   )	r3   r=   Ú
nan_to_numr2   r4   ÚmaximumÚmedianÚabsÚclip)r$   ÚmaskrL   Úscales       r   Ústandardizer^   7   s~   € ä�H‰H�Tœ2Ÿ=™=¨°¸2ÀbÔIÈ2ÓN×UÑUÔVX×V`ÑV`Óa€EÜ�J‰J”r—y‘y¤§¡¨£°QÔ7¸Ó>€EÜ�7‰7�5˜5‘= # rÓ*×1Ñ1´"·*±*Ó=Ð=r&   c           	     óÌ  — t        | «      j                  | t        |dz   t        | «      «      d¬«      \  }}t	        j
                  |«      }|dd…dd…f   }|j                  d   |k  r^t        j                  |t	        j                  t	        j                  t        | «      «      dd…df   ||j                  d   z
  d¬«      f   }|j                  t        j                  «      S )z?Deterministic local message neighborhoods; first query is self.r/   )ÚkÚworkersNrT   )r   ÚqueryÚminr:   r3   Ú
atleast_2dÚshapeÚc_ÚrepeatÚaranger2   Úint64)ÚcoordinatesÚcountÚ_r<   Úresults        r   Úknn_neighborsrn   >   s½   € ä�{Ó#×)Ñ)¨+¼¸UÀQ¹YÌÈKÓHXÓ9YÐcdÐ)Óe�H€A€uÜ�M‰M˜%Ó €EØ’1�a‘b�5‰\€FØ‡|�|�A�˜ÒÜ—‘�vœrŸy™y¬¯©´3°{Ó3CÓ)DÂQÈÀWÑ)MÈuÐW]×WcÑWcÐdeÑWfÑOfÐmnÔoÐoÑpˆØ�=‰=œŸ™Ó"Ð"r&   c                ój
  — | dk(  �r‘t        j                  t        dz  d¬«      5 }|d   |d   z  j                  «       }t        j                  |«      }|t        j
                  dt        |«      dz
  t        d	t        |«      «      t         j                  ¬
«         }|d   j                  dd«      |   }|d   j                  dd«      |   }|d   j                  dddd«      j                  d|d   j                  d   «      |   }|d   j                  dddd«      j                  d|d   j                  d   «      |   }d d d «       t         j                  dz  dz  |dz  dz  |dz  f   }t        «      |t        |d«      ddt        |«      ddœfS | dk(  r§t        j                  t        dz  d¬«      5 }|d   j                  t         j                   «      }	|d   |	t#        |d   «      z  z   }|d   |d   }}d d d «       t        j$                  |«      t        «      |t        	d«      ddt        |«      d dœfS | d!k(  rªt        j                  t        d"z  d¬«      5 }t        j
                  dt        |d#   «      dz
  d	t         j                  ¬
«      }|d#   |   |d   |   |d   |   |d   |   f\  }}}}d d d «       t        «      |t        |d$«      d"d%t        |«      d&dœfS | d'k(  �rót        j                  t        d(z  d¬«      5 }|d#   |d   |d   |d   |d)   f\  }}}}}
t        j&                  |«      }t        j(                  t        |«      dft         j                   «      }t         j*                  j-                  ||
d   ||
d      «       t         j*                  j-                  |d d …df   |
d   d«       t         j                  ||t        j.                  |d«      z  f   }t         j                  ||f   }t1        t        |«      «      D �cg c]  }g ‘Œ }}|
j2                  D ]+  \  }}|t5        |«         j7                  t5        |«      «       Œ- t        j8                  t;        |«      D ��cg c]  \  }}|d d$ |gd$z  z   d d$ ‘Œ c}}t         j                  «      }d d d «       t        «      |d(d*t        |«      d+›d,�t        |«      d-dœfS t=        | «      ‚# 1 sw Y   �Œ¸xY w# 1 sw Y   �ŒxY w# 1 sw Y   �ŒRxY wc c}w c c}}w # 1 sw Y   ŒtxY w).Nr   ú+data_processed/images/cad_multiview_128.npzF©Úallow_pickleÚ
silhouetteÚ
visibilityr   r/   ip  r    Úxyz_mméÿÿÿÿé   Únormalr$   é   Úfeature_validi @  éè  é€   é   zOsix CAD orthographic views with explicit 2-D pixel-neighbor message aggregationz@4 nearest selected image-grid pixels in the same view; not a CNN)ÚsourceÚrepresentationÚnodesÚdenoiser_adapterr   z/data_processed/voxels/cad_surface_sparse_64.npzÚvoxel_coordsÚgrid_origin_mmÚvoxel_pitch_mmé   zM64-grid sparse CAD surface voxels with 3-D voxel-neighbor message aggregationz;6 nearest sparse voxel-grid neighbours; not a dense 3-D CNNr   z,data_processed/points/cad_surface_points.npzÚpos_mmé   zOdeterministic 6,000 CAD surface points with PointNet-style local/global poolingz<8-nearest local pooling plus per-run global max/mean contextr   z$data_processed/graphs/graph_6000.npzÚ
edge_indexzCAD graph nodes (Ú,z< nodes) with edge-index message passing at each denoise stepzAprepared graph edge-index, up to 8 adjacent CAD nodes per message)r3   Úloadr
   ÚravelÚflatnonzeroÚlinspacer:   rc   ri   ÚreshapeÚ	transposere   rf   r^   rn   r2   r4   ÚfloatÚ
empty_likeÚ
zeros_liker9   ÚaddÚatrX   r;   ÚTÚintÚappendr>   Ú	enumerateÚ
ValueError)r   ÚaÚkeepÚidsÚposrx   r$   r\   Úimage_coordinatesÚcoordsÚedgeÚsummedÚdegreerl   Ú	adjacencyr~   Údestinationr<   ÚrowÚ
neighbourss                       r   Úload_representationr§   H   sµ  € ØˆzÓÜ�W‰W”TÐIÑIÐX]Õ^ÐbcØ�l‘O a¨¡oÑ5×<Ñ<Ó>ˆDÄbÇnÁnÐUYÓFZÀØ”b—k‘k !¤S¨£X°¡\´3°t¼SÀ»XÓ3FÌbÏhÉhÔWÑXˆCØ�H‘+×%Ñ% b¨!Ó,¨SÑ1ˆC¸A¸h¹K×<OÑ<OÐPRÐTUÓ<VÐWZÑ<[°6Ø�#‘× Ñ   A q¨!Ó,×4Ñ4°R¸¸3¹¿¹Àa¹ÓIÈ#ÑNˆAØ�_Ñ%×/Ñ/°°1°a¸Ó;×CÑCÀBÈÈ#ÉÏÉÐUVÉÓXÐY\Ñ]ˆD÷ _ô ŸE™E #¨)Ñ"4°tÑ";¸cÀYÑ>OÐTWÑ=WÐY\Ð_bÑYbÐ"bÑcÐØ�FœK¨¨4Ó0°$¼ÐFWÐYZÓ8[ð  iVð  j{ô  FIð  JMó  FNð  dfñ  ^gð  gð  	gØˆzÒÜ�W‰W”TÐMÑMÐ\aÕbÐfgØ�~Ñ&×-Ñ-¬b¯j©jÓ9ˆFÀÐCSÑATÐW]Ô`eÐfgÐhxÑfyÓ`zÑWzÑAz¸3Ø˜‘f˜a Ñ0ˆtˆA÷ cð ”B—M‘M #Ó&¬°A°tÓ(<¸dÄMÐRXÐZ[ÓD\ð  j[ð  o~ô  ILð  MPó  IQð  gdñ  _eð  eð  	eØˆ|ÒÜ�W‰W”TÐJÑJÐY^Õ_ÐcdÜ—+‘+˜a¤ Q x¡[Ó!1°AÑ!5°tÄ2Ç8Á8ÔLˆCØ#$ X¡;¨sÑ#3°Q°x±[ÀÑ5EÀqÈÁvÈcÁ{ÐTUÐVeÑTfÐgjÑTkÐ#kÑ ˆC�˜˜D÷ `ð �FœK¨¨4Ó0°$¼ÀcÈ1Ó8Mð  [Ið  ]nô  y|ð  }@ó  yAð  WUñ  PVð  Vð  	VØˆ|ÓÜ�W‰W”TÐBÑBÐQVÕWÐ[\Ø)*¨8©°a¸±kÀ1ÀSÁ6È1È_ÑK]Ð_`ÐamÑ_nÐ)nÑ&ˆC�˜˜D $ô —]‘] 1Ó%ˆF´·±¼#¸a»&À!¸ÄbÇjÁjÓ0Q vÜ�F‰F�I‰I�f˜d 1™g q¨¨a©¡zÔ2´B·F±F·I±I¸fÂQÈÀT¹lÈDÐQRÉGÐUVÔ4WÜ—‘�a˜¤"§*¡*¨V°QÓ"7Ñ7Ð7Ñ8ˆAÄÇÁÀtÈTÀzÑAR¸$Ü%*¬3¨q«6¤]Ó3¡] š ]ˆIÐ3Ø'+§v¤vÑ#�˜¨y¼¸V»Ñ/E×/LÑ/LÌSÐQ\ÓM]Õ/^ vÜŸ™ÔS\Ð]fÔSgÔ$hÑSgÁZÀUÈC c¨"¨1 g°°¸!±Ñ&;¸R¸aÒ%@ÐSgÒ$hÔjl×jrÑjrÓsˆJ÷ Xð �FœK¨¨4Ó0°$¸
ÐOuð  L]ô  ^að  beó  ^fð  ghð  ]ið  ieð  Jfô  qtð  uxó  qyð  ORñ  ESð  Sð  	SÜ
�TÓ
Ð÷E _Ñ^ú÷ cÑbú÷ `Ñ_üò 4ùã$h÷ XÐWúsR   ¥DS7Æ;ATÉ'ATÌDT)Ð$	TÐ-AT)ÒT#ÒT)Ó7TÔTÔTÔT)Ô)T2c                 óf  — g } t        t        dz  j                  d«      «      D ]l  }t        j                  |d¬«      5 }|j
                  D �ci c]  }|||   “Œ
 }}d d d «       | j                  t        d   j                  «       «      |f«       Œn | st        d«      ‚| S c c}w # 1 sw Y   ŒLxY w)Nzdata_processed/pairedz*_cad_ply_targets.npzFrq   Úrun_idz?Four-representation diagnostic requires at least one paired run)
Úsortedr
   Úglobr3   rŠ   Úfilesr—   r7   r@   ÚRuntimeError)ÚrecordsÚpathrš   Úkeyr@   s        r   Úpaired_recordsr±   o   s¥   € Ø€GÜœÐ6Ñ6×<Ñ<Ð=TÓUÖVˆÜ�W‰W�T¨Õ.°!ÐTU×T[ÒT[Ó<\ÑT[ÈS¸SÀ!ÀCÁ&¹[ÐT[°TÐ<\×.Ø�‰œ˜D ™N×/Ñ/Ó1Ó2°DÐ9Õ:ð Wñ œ,Ð'hÓiÐiØ€Nùò =]×.Ð.ús   ¾B'ÁB"ÁB'Â"B'Â'B0	c                óÔ	  — t         j                  dd¬«       t        | «      \  }}}}}}t        «       }|d   d   d   }|d   d   d   }	t	        |«      j                  |d¬«      \  }
}t        j                  |«      j                  «       rt        j                  |«      s|	|   }|t        j                  t        j                  j                  |dd¬«      d	«      z  }g }g }g }g }g }g }|D �]¢  \  }}t        |«      \  }}t        |d
   j                  «       «      }t        j                   |d   |   |d   |   |d   |   f   dz  }t        j"                  t%        |«      dft'        |«      t        j(                  «      }||z  }t        j                   |dz  |||t        j*                  |d   t%        |«      d¬«      ||j-                  t        j(                  «      f   }|j/                  |j-                  t        j(                  «      «       |j/                  t        j0                  |d   |   t2         t2        «      t2        z  «       |j/                  |d   |df   «       |j/                  |d   |df   «       |j/                  |«       �Œ¥ t        j4                  |D ��
cg c]  \  }}
|‘Œ	 c}
}«      |||j-                  t        j6                  «      t        j8                  |«      t        j8                  |«      j-                  t        j(                  «      t        j8                  |«      j-                  t        j(                  «      t        j8                  |«      j-                  t        «      t        j6                  t%        |«      «      |t        j4                  |«      t        j4                  |t        «      ||t        j4                  |D �
�cg c]!  \  }
}t;        |d   j                  «       «      ‘Œ# c}}
«      dœ}|j=                  |D ��ci c]  \  }}d|› d�|d   “Œ c}}«       t        j>                  t         | › d�z  fi |¤Ž t         | › d�z  jA                  tC        jD                  i |¥tG        |d   jH                  d   «      d|ddœ¥d d!¬"«      d#¬$«       |jK                  «       D ��ci c]  \  }}||“Œ
 c}}d%|iz  S c c}
}w c c}}
w c c}}w c c}}w )&zMMap each prepared representation onto the paired CAD target only by geometry.T©ÚparentsÚexist_okr   r/   Ú
cad_pos_mmÚ
cad_normal)ra   )rU   Úkeepdimsg�íµ ÷Æ°>Úheater_projection_validÚ%provisional_heater_top_c_per_cad_nodeÚ(provisional_heater_bottom_c_per_cad_nodeÚ'provisional_heater_delta_c_per_cad_nodeg     @@g     @�@NrT   Úcad_to_scan_normal_residual_mmÚweak_defect_probabilityÚweak_defect_maskÚdefect_class)r©   r†   rx   Únearest_paired_cad_nodeÚ	conditionÚsigned_target_scaledÚrisk_targetÚrisk_binaryÚnodes_per_runÚneighbor_index_one_runr*   r¹   Úrepresentation_featuresÚrepresentation_feature_validÚrun_defect_classÚscan_points_Ú_cad_mmÚscan_pos_cad_mmz.npzz.jsonrÂ   zcKDTree CAD position onlyzweak/unvalidated diagnostic)Úcondition_dimÚnearest_paired_cad_mappingr¹   Úlabel_statusFry   ©Úensure_asciiÚindentúutf-8©ÚencodingÚinfo)&ÚINPÚmkdirr§   r±   r   rb   r3   ÚisfiniteÚallÚanyrX   ÚlinalgÚnormrN   r6   r@   rf   Úfullr:   r�   r4   rg   r2   r—   r[   ÚSCALE_MMr>   Úint32Úconcatenater7   ÚupdateÚsavez_compressedÚ
write_textÚjsonÚdumpsr–   re   Úitems)r   r�   rx   Úfeaturesr\   r¦   r×   r®   Úcad_posr·   rl   ÚnearestÚall_conditionÚ
all_targetÚall_riskÚ
all_binaryÚ	all_localÚprocess_namesÚrunr@   ÚprocrK   ÚlocalÚ
local_maskrÂ   ÚrÚoutputr°   rL   s                                r   Úprepare_variantrø   x   sr  € ä‡I�I�d T€IÔ*Ü4GÈÓ4MÑ1€Cˆ�˜4 ¨TÔYgÓYiÈwØ�a‰j˜‰m˜LÑ)€G¸À¹
À1¹ÀlÑ8S¨:Ü˜Ó!×'Ñ'¨°QÐ'Ó7�J€A€wÜ�;‰;�vÓ×"Ñ"Ô$¬B¯F©F°6¬NÀZÐPWÑEX¸FØ
Œb�j‰jœŸ™Ÿ™¨°QÀ˜ÓFÈÓMÑM€FØ€M �j¨b X¸R°*È2ÀÐjlÈ}Ü‰	ˆˆTÜ,¨TÓ2ÑˆˆmÜ�TÐ3Ñ4×9Ñ9Ó;Ó<ˆô —‘�dÐBÑCÀGÑLÈdÐS}ÑN~ð  @Gñ  OHð  JNð  Oxñ  Jyð  zAñ  JBð  Bñ  Cð  FJñ  JˆÜ—W‘Wœc #›h¨˜]¬E°%«L¼"¿*¹*ÓEˆ
ÀuÐPZÑGZÀuÜ—E‘E˜# ™+ v¨u°jÄ"Ç)Á)ÈDÐQUÉJÔX[Ð\_ÓX`ÐghÔBiÐksÐuy÷  vAñ  vAô  BD÷  BLñ  BLó  vMð  Mñ  Nˆ	Ø×Ñ˜Y×-Ñ-¬b¯j©jÓ9Ô:¸J×<MÑ<MÌbÏgÉgÐVZÐ[{ÑV|ð  ~Eñ  WFô  IQð  HQô  S[ó  O\ô  _gñ  Ogô  =hØ�‰˜Ð6Ñ7¸À¸
ÑCÔDÀj×FWÑFWÐX\Ð]oÑXpÐqxÐz{Ðq{ÑX|ÔF}ð  @I÷  @Pñ  @Pð  QVö  @Wð ô Ÿ
™
±Ô#9±©#¨!¨A¢A°Ò#9Ó:ÀcÐU[Ðx÷  yGñ  yGô  HJ÷  HPñ  HPó  yQô  `b÷  `nñ  `nð  o|ó  `}ô  WY÷  Weñ  Weð  fpó  Wq÷  Wxñ  Wxô  y{÷  yCñ  yCó  WDô  UW÷  Ucñ  Ucð  dló  Um÷  Utñ  Utô  uw÷  uñ  uó  U@ô  QS÷  Q_ñ  Q_ð  `jó  Qk÷  Qrñ  Qrô  swó  Qxô  KM÷  KSñ  KSô  TWð  X[ó  T\ó  K]ð  yCô  ^`÷  ^hñ  ^hð  ivó  ^wô  TV÷  T^ñ  T^ð  _hô  jnó  Toð  L	T	ð  v	z	ô  P
R
÷  P
Z
ñ  P
Z
ñ  KRô  [
Sñ  KRñ  AGð  ABð  CGô  \
_
ð  `
d
ð  e
s
ñ  `
t
÷  `
y
ñ  `
y
ó  `
{
õ  \
|
ð  KRò  [
Só  P
Tñ  U€FØ
‡M�MÑX_Ô`ÑX_ÉHÈCÐPT�\ #  gÐ.°Ð5FÑ0GÑGÐX_Ò`ÔaÜ×Ñœ   d˜mÑ+Ñ6¨vÒ6ÜˆdˆV�5ˆ>Ñ×%Ñ%¤d§j¡jð  2~°Dð  2~Ì3ÈvÐVaÑOb×OhÑOhÐijÑOkÓKlð  Mhð  ENð  `}ò  2~ð  MRð  [\ô  ']ð  hoÐ%ô  pØ)/¯©¬Ô8©™:˜3 ˆC�‰J¨Ò8¸FÀD¸>ÑIÐIùó	 $:ùó  [
SùÛ`ùó 9s   Ê'S
Ï&S&ÐS
Ò<S$c                  ó.   ‡ — e Zd ZdZddˆ fd„Zdd„Zˆ xZS )ÚTopologyConditionalDDPMa)  Denoiser with a representation-specific local message every DDPM step.

    ``point_6000`` additionally follows the PointNet pattern: local kNN pooling
    plus global mean/max pooling for each process run. The other three variants
    use their own 2-D, 3-D or CAD-graph neighbourhood index.
    c                ó,  •— t         ‰
| �  «        || _        || _        t	        j
                  t        |«      D �cg c]
  }|||z  z   ‘Œ c}d¬«      }| j                  dt        j                  |t        j                  ¬«      «       t        j                  t        j                  ||«      t        j                  «       t        j                  ||«      t        j                  «       «      | _        t        j                  t        j                  d|«      t        j                  «       t        j                  ||«      «      | _        ||dk(  rdndz  }	t        j                  t        j                  d|z   |	z   |z   |«      t        j                  «       t        j                  |d«      «      | _        t        j                  t        j                  ||	z   |d	z  «      t        j                  «       t        j                  |d	z  d«      «      | _        y c c}w )
Nr   rT   r¦   r    é   r   rw   r/   ry   )ÚsuperÚ__init__rÆ   Úvariantr3   râ   r;   Úregister_bufferr"   r#   Úlongr	   Ú
SequentialÚLinearÚSiLUÚcÚtÚerö   )ÚselfrÎ   rÆ   r¦   rÿ   ÚwidthÚ	run_countÚirß   Úmessage_widthÚ	__class__s             €r   rþ   z TopologyConditionalDDPM.__init__™   sF  ø€ Ü‰ÑÔ¨}˜DÔ.È7¸d¼lÜ�~‰~ÄUÈ9ÔEUÓVÑEUÀ˜z¨A¨m©OÓ;ÐEUÑVÐ]^Ô_ˆØ×Ñ˜\¬5¯?©?¸4ÄuÇzÁzÔ+RÔSÜ�}‰}œRŸY™Y }°UÓ;¼B¿G¹G»IÄbÇiÁiÐPUÐV[ÓF\Ô]_×]dÑ]dÓ]fÓgˆŒÔpr×p}Ñp}ô  A÷  Hñ  Hð  IKð  LQó  Rô  SU÷  SZñ  SZó  S\ô  ]_÷  ]fñ  ]fð  glð  mró  ]só  qtÐimÔioØ g°Ò&=¡À1ÑEˆÜ�}‰}œRŸY™Y q¨5¡y°=Ñ'@À5Ñ'HÈÓOÔPR×PWÑPWÓPYÔZ\×ZcÑZcÐdiÐjkÓZlÓmˆŒÔvx÷  wDñ  wDô  EG÷  ENñ  ENð  OTð  Wdñ  Odð  ejð  lmñ  emó  Enô  oq÷  ovñ  ovó  oxô  y{÷  yBñ  yBð  CHð  JKñ  CKð  LMó  yNó  wOÐosÕouùò	 Ws   ºHc                ó:  — | j                  |«      }|| j                     j                  d«      }| j                  dk(  r°|j	                  d| j
                  |j                  d   «      }|j                  dd¬«      j                  |«      j                  |«      }|j                  dd¬«      j                  j                  |«      j                  |«      }t        j                  |||gd«      }	n|}	t        j                  t        j                  dt        j                   d«      d|j"                  ¬	«      «      }
|d d …d f   j%                  |j"                  «      |
d    z  d
z  }| j'                  t        j                  |j)                  «       |j+                  «       gd«      «      }| j-                  t        j                  |d d …d f   ||	|gd«      «      j/                  d«      | j1                  t        j                  ||	gd«      «      j/                  d«      fS )Nr/   r   rv   T)Úkeepdimr   r{   r‡   r    r   )r  r¦   Úmeanrÿ   rŽ   rÆ   re   Ú	expand_asÚ
reshape_asÚmaxrH   r"   ÚcatÚexpr�   ÚmathÚlogr!   Útor  ÚsinÚcosr  Úsqueezerö   )r  r$   r  r  Úzrô   Úgroupsr  rX   ÚmessageÚfÚpÚhs                r   ÚforwardzTopologyConditionalDDPM.forward    s0  € Ø
�&‰&�‹)ˆ˜1˜TŸ_™_Ñ-×2Ñ2°1Ó5�UØ�<‰<˜<Ò'Ø—9‘9˜R × 2Ñ 2°1·7±7¸2±;Ó?ˆFÀfÇkÁkÐRSÐ\`ÀkÓFa×FkÑFkÐlrÓFs×F~ÑF~ð  @Aó  GBÀð  LR÷  LVñ  LVð  WXð  aeð  LVó  Lf÷  Lmñ  Lm÷  Lwñ  Lwð  x~ó  L÷  LJñ  LJð  KLó  LMð  DKô  W\÷  W`ñ  W`ð  bgð  hlð  mtð  auð  vwó  Wxñ  OVØˆgÜ
�)‰)”E—N‘N 1¤d§h¡h¨t£n°a¸q¿w¹wÔGÓ
HˆÈAÊaÐPTÈfÉIÏLÉLÐYZ×Y`ÑY`ÓLaÐbcÐdhÑbiÑLiÐjmÑLmÈ!Ðqu×qwÑqwÔx}÷  yBñ  yBð  DE÷  DIñ  DIó  DKð  LM÷  LQñ  LQó  LSð  CTð  UVó  yWó  rXÐopð  ae÷  agñ  agô  hm÷  hqñ  hqð  stò  uvð  w{ð  u{ñ  s|ð  }~ð  Fð  GHð  rIð  JKó  hLó  aM÷  aUñ  aUð  VWó  aXð  Z^÷  Z`ñ  Z`ô  af÷  ajñ  ajð  lmð  nuð  kvð  wxó  ayó  Zz÷  ZBñ  ZBð  CDó  ZEð  aEð  ZEr&   )é`   ry   )rÎ   r–   rÆ   r–   r¦   ú
np.ndarrayrÿ   r7   r	  r–   r
  r–   ÚreturnÚNone)r$   r   r  r   r  r   r%  ztuple[Tensor, Tensor])Ú__name__Ú
__module__Ú__qualname__Ú__doc__rþ   r"  Ú__classcell__)r  s   @r   rú   rú   ’   s   ø„ ñöO÷Er&   rú   c                ó^   — t        j                  dt        j                  dd| «      z
  d«      S )Nr/   g-Cëâ6?ç{®Gáz”?r   )r"   Úcumprodr�   )Ústepss    r   Úscheduler0  ¨   s&   € ¬5¯=©=¸¼5¿>¹>È$ÈsÐSXÓ;YÑ9YÐZ[Ó+\Ð$\r&   c           	     óJ  — |j                  «       sy t        j                  |  d¬«      }||   j                  t        «      }t	        t        j
                  |«      t        j                  dt        |«      dz   «      z  |z  j                  «       |j                  «       z  «      S )NÚstable)Úkindr/   )	rÜ   r3   Úargsortr2   r�   Úcumsumrh   r:   Úsum)ÚscoreÚyÚorders      r   Úaverage_precisionr:  ©   s¢   € Ø�5‰5Œ7˜4Ü
�*‰*�e�V Ô
*€E¨a°©h¯o©o¼eÓ.D¨AÌUÔTV×T]ÑT]Ð^_ÓT`Ôac×ajÑajÐklÔmpÐqrÓmsÐtuÑmuÓavÑTvÐwxÑTx×S}ÑS}ÓSð  AB÷  AFñ  AFó  AHñ  THó  NIð  GIr&   c                ó   — d| dz   › �S )zDPortable raster label; exact Korean source names remain in NPZ/JSON.zprocess feature r/   © )r<   s    r   Úascii_process_labelr=  ®   s   € à˜e a™i˜[Ð)Ð)r&   c           
     óP  — t        j                  dt        | «      dz
  t        dt        | «      «      t        ¬«      }t        j                  dt        |«      dz
  t        dt        |«      «      t        ¬«      }t        j                  t        | |   «      d    t        ||   «      d    «      j                  «       }t        |j                  d«      j                  j                  «       |j                  d«      j                  j                  «       z   j                  «       dz  «      S )Nr   r/   i   r    ry   )r3   r�   r:   rc   r–   r"   Úcdistr%   r  r�   rH   r  r@   )rš   ÚbÚixÚiyÚds        r   ÚchamferrD  ±   sª  € Ü	‡{�{�1”S˜“V˜A‘Xœc #¤c¨!£f›o´CÔ8€B¼R¿[¹[ÈÌ3ÈqË6ÐRSÉ8ÔTWÐX[Ô\_Ð`aÓ\bÓTcÔjmÔ=n¸"Ôrw×r}Ñr}ô  Eð  FGð  HJñ  FKó  Lð  MQñ  Rô  SYð  Z[ð  \^ñ  Z_ó  S`ð  aeñ  Sfó  sg÷  soñ  soó  sqÐpqô  zð  AB÷  AFñ  AFð  GHó  AI÷  APñ  AP÷  AUñ  AUó  AWð  XY÷  X]ñ  X]ð  ^_ó  X`÷  Xgñ  Xg÷  Xlñ  Xló  Xnñ  An÷  @tñ  @tó  @vð  wxñ  @xó  zyð  sy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    rv   )r"   Úrandnr:   Ú	GeneratorÚmanual_seedr3   Úuniquer�   r–   r˜   rß   r  ÚsqrtÚclamp)ÚmodelrÂ   ÚabarÚsample_stepsÚseedr$   Úseqr  r`   Úepsrl   Úx0Úpreviouss                r   ÚsamplerU  µ   s*  € ä‡k�k”#�i“.¬5¯?©?Ó+<×+HÑ+HÈÓ+NÔO€AÔUW×U^ÑU^Ô_a×_jÑ_jÐklÔmpÐquÓmvÐwxÑmxð  zFô  MPô  `Qó  VRñ  SWð  UWð  SWñ  VXÐQTÜ˜Ž~‰ˆˆ!Ù�A”e—j‘j¤# a£& ¬3¨q«6¼¿
¹
ÔCÀIÓN‰ˆˆAÐTUÐWXÐY]Ð^_ÑY`ÑW`×VfÑVfÓVhÐilÑVlÑTlÐnrÐstÑnu×nzÑnzÓn|ÑS|ÐPRð  NOô  QTð  UXó  QYð  Z[ñ  Q[ò  N[ñ  HJô  adð  ehð  ijð  klñ  ilñ  emó  anð  Gð  x@ð  ABò  xBñ  rtð  HLð  MUñ  HV÷  H[ñ  H[ó  H]ð  ^`ñ  H`ð  bcð  dhð  iqñ  drñ  br÷  axñ  axó  azð  {~ñ  a~ñ  H~ñ  pqð à�7‰7�2�a‹=Ðr&   c                ó  — t        |d   «      }t        |d   «      }t        |d   «      }	|d   j                  t        «      }
t        |d   «      }t	        |d   «      }t        |«      }t        |j                  d   ||d   | |¬	«      }t        j                  j                  |j                  «       |d
¬«      }t	        |	«      |	j                  «       z
  |	j                  «       j                  d«      z  j                  d¬«      }g }t        d«      dd f}t!        |«      D �]ñ  }|j#                  «        t        j$                  d|t	        |«      f«      }t        j&                  |«      }||   j)                  «       |z  d||   z
  j)                  «       |z  z   } ||||«      \  }}t+        j,                  ||«      }t+        j.                  ||	|¬«      }|d|z  z   }|j1                  «        |j3                  «        t        j4                  |«      j7                  «       j9                  «       }|j;                  |dz   t        |j7                  «       «      t        |j7                  «       «      t        |j7                  «       «      t=        ||
«      xs ddœ«       t        |j7                  «       «      }||d   k  s�Œž||dz   |j?                  «       jA                  «       D ��ci c]$  \  }}||j7                  «       jC                  «       “Œ& c}}f}�Œô |jE                  |d   «       |jG                  «        t        jH                  t!        |«      D � cg c]  } tK        ||||d| z   «      ‘Œ c} «      j9                  «       }!t        jL                  «       5   |t        jN                  |«      t        jP                  t	        |«      t        jR                  ¬«      |«      \  }"}d d d «       t        j4                  «      j9                  «       }|d   |d   }$}#g }%tU        |d   «      D �]ò  \  }&}'tW        |&|z  |&dz   |z  «      }(|!d d …|(f   jY                  d«      tZ        z  })|!d d …|(f   j]                  d«      tZ        z  }*|j9                  «       |(   tZ        z  }+|#|$|)d d …d f   z  z   },|#|$|+d d …d f   z  z   }-|
|(   }.||(   dk\  }/t        |/|.z  j                  «       «      }0t=        ||(   |.«      |0t_        dt        |/|.z  j                  «       «      «      z  d|0z  t_        dt        |/j                  «       |.j                  «       z   «      «      z  dœ}1|d|'› d�   }2|%j;                  ta        |'«      t        tc        |)|+z
  «      jY                  «       «      t        te        j(                  te        jX                  |)|+z
  dz  «      «      «      tg        |,|-«      tg        |,|2«      |1t        |*jY                  «       «      t        |*j_                  «       «      dœ«       �Œõ th        jk                  dd¬«       t        jl                  |j?                  «       |j                  d   |d | |d!   d"   d#œth        | › d$�z  «       te        jn                  tp        | › d%�z  |d   |#|$|!js                  |||«      tZ        z  |#d&   |$d&   |!js                  |||d«      z  tZ        z  z   |js                  ||«      |d'   te        jt                  d(«      ¬)«	       | |d!   |t        |j                  d   «      ||d   |d   |%|d*   jw                  «       ta        th        | › d$�z  jy                  tz        «      «      d+œ
S c c}}w c c} w # 1 sw Y   �Œ˜xY w),NrÂ   rÃ   rÄ   rÅ   rÆ   r©   r/   rÇ   ©r
  gñhãˆµøä>)ÚlrÚweight_decayéÈ   )r  Úinfr   )Ú
pos_weightçffffffÖ?rP   )ÚepochÚtotalÚdenoiseÚriskÚAPry   i3(5r    r†   rx   ç      à?)rb  z
IoU_at_0.5zDice_at_0.5rË   rÌ   )rò   ÚMAE_mmÚRMSE_mmÚCAD_correspondent_Chamfer_mmÚregistered_scan_Chamfer_mmra  Úmean_stochastic_std_mmÚmax_stochastic_std_mmTr³   Fr×   r�   )Ú
state_dictrÎ   rÆ   Úproduction_validrÿ   r�   ú.ptú_generated.npz)NNrÊ   Ú,constant_diagnostic_unlearnable_single_class)r©   r¶   r·   Úgenerated_signed_normal_mmÚgenerated_pointcloud_mmÚrisk_probabilityÚdefect_typeÚdefect_type_statusr¹   )
rÿ   r   rÆ   rÎ   ÚhistoryÚ	best_lossÚ
best_epochÚmetricsr¹   Ú
checkpoint)>r%   r2   r6   r–   r:   r0  rú   re   r"   ÚoptimÚAdamWÚ
parametersr6  Ú	clamp_minrL  r�   r;   Ú	zero_gradÚrandintÚ
randn_likerK  ÚFÚmse_lossÚ binary_cross_entropy_with_logitsÚbackwardÚstepÚsigmoidÚdetachÚnumpyr—   r:  rj  rè   ÚcloneÚload_state_dictÚevalÚstackrU  Úno_gradr’   r9   r  r˜   Úslicer  rà   Ústdr  r7   rZ   r3   rD  ÚMODrÙ   Úsaverä   ÚOUTrŽ   r>   r8   Úrelative_tor
   )3r   ÚdataÚepochsrX  Údiffusion_stepsÚsamplesrO  rÂ   Útargetra  ÚbinaryrM   ÚrunsrN  rM  ÚoptÚpwÚhistÚbestr^  r  ÚnoiseÚxtrR  Úlogitr`  ÚrlossÚlossr7  Ú
loss_valuer`   Úvr  Ú	generatedrl   r�   rx   rm   Újrò   Úslr  rŽ  ÚtgtÚpredÚrefr8  r   ÚbothÚrisk_metricsÚscans3                                                      r   Útrain_variantr®  ½   s  € Ü�T˜+Ñ&Ó'€I´°tÐ<RÑ7SÓ0T¨Ô[aÐbfÐgtÑbuÓ[vÐVZð  @Dð  ERñ  @S÷  @Zñ  @Zô  [_ó  @`Ðx~ô  dgð  hlð  m|ñ  h}ó  d~ð  bcô  EHð  IMð  NVñ  IWó  EXð  @Dô  _gð  hwó  _xð  Z^ô  @Wð  Xa÷  Xgñ  Xgð  hiñ  Xjð  klð  mqð  rJñ  mKð  LPð  [_ô  @`ð  zô  fk÷  fqñ  fq÷  fwñ  fwð  x}÷  xHñ  xHó  xJð  NPð  ^bð  fwó  fcð  beô  jmð  nró  jsð  tx÷  t|ñ  t|ó  t~ñ  j~ð  @D÷  @Hñ  @Hó  @J÷  @Tñ  @Tð  UVó  @Wñ  iW÷  h^ñ  h^ð  cfð  h^ó  hgð  egð  npð  imô  x}ð  ~Có  xDð  EFð  GKð  wLð  rvÜ�v—ˆØ�‰Œœ5Ÿ=™=¨¨?¼CÀ»K¸>ÓJ˜ÔRW×RbÑRbÐciÓRjÈEÐosÐtuÑov×o{Ño{Óo}ð  Eñ  pEð  GHð  IMð  NOñ  IPñ  GP÷  FVñ  FVó  FXð  Y^ñ  F^ñ  p^Ðlnñ  joð  prð  stð  u~ó  jñ  `ið  `cð  diô  IJ÷  ISñ  ISð  TWð  X]ó  I^ð  AHô  fg÷  fHñ  fHð  INð  OSð  _aô  fbð  `eð  ipð  qtð  uzñ  qzñ  izð  dhð  |@÷  |Iñ  |Iô  |Kð  LO÷  LTñ  LTô  LVô  ^c÷  ^kñ  ^kð  lqó  ^r÷  ^yñ  ^yó  ^{÷  ^Añ  ^Aó  ^Cð  X]ð  EI÷  EPñ  EPð  Z_ð  `añ  Zaô  joð  pt÷  p{ñ  p{ó  p}ó  j~ô  INð  OV÷  O]ñ  O]ó  O_ó  I`ô  hmð  ns÷  nzñ  nzó  n|ó  h}ô  CTð  UZð  [aó  Cbò  Chð  fhñ  Qiô  EjÜ˜4Ÿ;™;›=Ó)ˆ
Ø˜˜Q™Ô z°%¸±'Ð[`×[kÑ[kÓ[m×[sÑ[sÔ[uÔ:vÑ[uÑTWÐTUÐVW¸1¸Q¿X¹X»Z×=MÑ=MÓ=OÑ;OÐ[uÒ:vÐ&w¢ð ð 
×Ñ˜$˜q™'Ô" E§J¡J¤L¼E¿K¹Kô  HMð  NUô  HVó  IWñ  HVð  CDÌÐPUÐV_Ð`dÐeqÐrzÐ{|Ñr|ÕI}ð  HVñ  IWó  =X÷  =^ñ  =^ó  =`°)Ü	�‰�¡5¬×)9Ñ)9¸&Ó)AÄ%Ç+Á+ÌcÐRXËkÔ`e×`jÑ`jÔBkÐluÓ#v™(˜!˜U�Ü
�-‰-˜Ó
×
$Ñ
$Ó
&€E°4¸±>À$ÀxÁ.¨F¨ÐY[ÐRXÜ˜4 ™>×*‰ˆˆ#Ü��1‘�a˜‘c˜1‘WÓˆ Iªa°¨d¡O×$8Ñ$8¸Ó$;¼HÑ$D˜tÈ)ÒTUÐVXÐTXÉ/×J]ÑJ]Ð^_ÓJ`ÔaiÑJiÀcÐou×o{Ño{Óo}ð  Añ  pBô  CKñ  pKÐknð  RUð  V\ð  ]aò  bcð  dhð  bhñ  ]iñ  Viñ  Rið  MQð  orð  syð  z}ò  ~ð  @Dð  ~Dñ  zEñ  sEñ  oEð  knð  IOð  PRñ  ISð  GHð  W\ð  ]_ñ  W`ð  bdñ  Wdð  UVô  knð  pqð  rsñ  ps÷  oxñ  oxó  ozó  k{ð  fjô  Pað  bgð  hjñ  bkð  lmó  Pnð  |@ô  ADð  EFô  GJð  LMð  NOñ  LO÷  KTñ  KTó  KVó  GWó  AXñ  |Xð  ghð  imñ  gmô  nqð  rsô  twð  xy÷  x}ñ  x}ó  xð  @A÷  @Eñ  @Eó  @Gñ  xGó  tHó  nIñ  gIñ  JJð  }Ið  QUð  Xdð  ehð  dið  ipð  Vqñ  Qrð  LPð  tz÷  tAñ  tAô  ILð  MPó  IQô  [`ô  adð  eið  jmñ  emó  an÷  asñ  asó  auó  [vô  AFô  GI÷  GNñ  GNô  OQ÷  OVñ  OVð  X\ð  ]`ñ  X`ð  cdñ  Wdó  Oeó  Gfó  Agô  G	N	ð  O	S	ð  T	W	ó  G	X	ô  v	}	ð  ~	B
ð  C
G
ó  v	H
ð  P
\
ô  v
{
ð  |

÷  |
Dñ  |
Dó  |
Fó  v
Gô  `eð  fi÷  fmñ  fmó  foó  `pñ  Bqö  trð +ä‡I�I�d D€IÔ)¬5¯:©:ÀE×DTÑDTÓDVÐgp×gvÑgvÐwxÑgyð  KLð  `eð  ptð  HLð  MSñ  HTð  Ugñ  Hhñ  7iô  jmð  quð  pvð  vyð  nzñ  jzô  ,{Ü×Ñœ˜t˜f NÐ3Ñ3¸4À¹>ÐUXÐdjð  GP÷  GXñ  GXð  Y`ð  aeð  fgó  Ghô  iqñ  Gqð  KNð  OXñ  KYð  Z`ð  ajñ  Zkð  lu÷  l}ñ  l}ð  ~Eð  FJð  KLð  MNó  lOñ  ZOô  PXñ  ZXñ  KXð  kp÷  kxñ  kxð  y}ð  ~ó  k@ð  MQð  Rdñ  Meô  y{÷  yCñ  yCð  Dró  ysõ  tØ¨D°©LÈÔ[^Ð_h×_nÑ_nÐopÑ_qÓ[rð  ~Bð  OSð  TUñ  OVð  dhð  ijñ  dkð  v|ð  W[ð  \uñ  Wv÷  W}ñ  W}ó  Wô  MPô  RUð  Y]ð  X^ð  ^að  Vbñ  Rb÷  Qoñ  Qoô  ptó  Quó  Mvñ  wð  wùó ;wùò IWß	‰ús   Ë%)]0Í]6ÎA];Ý;^c                óú	  — t        |d   «      }t        |j                  d   t        |d   «      |d   | t	        |d   «      ¬«      }|j                  t        j                  |d¬«      d	   «       |j                  «        |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«      }d}t        j&                  t	        |«      f|t        j                  ¬«      } ||||«      \  }}
t)        d«      |   }d|z
  j+                  «        |z  |j+                  «       z  }|j!                  «       j                  «       j                  «        |j                  dd…||t	        |«      z   …f   j!                  «       j                  d«      j#                  «       j%                  «       }t-        j.                  dddd¬«      \  }}|d   |ddf|d   |ddffD ]Ä  \  }}}}t1        j2                  |«      dd ddd…   }|D �cg c]  }t5        t        |«      «      ‘Œ c}ddd…   }|j7                  |||   ddd…   |d¬«       |j9                  d«       |j;                  d«       |j=                  |«       |j?                  dd¬ «       |jA                  d!d"¬#«       ŒÆ |jC                  | › d$�«       |jE                  tF        | › d%�z  d&¬'«       t-        jH                  |«       t1        j2                  |«      ddd…   }t1        j2                  |«      ddd…   }| d(d)d)tK        |jM                  tN        «      «      tQ        |«      D ��cg c]3  \  }}|dz   t        |«      dz   tK        ||   «      tS        ||   «      d*œ‘Œ5 c}}tQ        |«      D ��cg c]3  \  }}|dz   t        |«      dz   tK        ||   «      tS        ||   «      d*œ‘Œ5 c}}d+œ}tF        | › d,�z  jU                  tW        jX                  |d)d¬-«      d.¬/«       yc c}w c c}}w c c}}w )0z?Fixed-state risk and denoised-deformation gradient diagnostics.rÂ   r/   rÆ   rÇ   r©   rW  T)Úweights_onlyrj  r*   rV   r    Nr   é   é   ry   )r±  g      @©ÚfigsizeÚconstrained_layoutzweak-risk logit sensitivityz#495f9dz denoised deformation sensitivityz#a85b35iôÿÿÿrv   zmean absolute gradient)ÚcolorÚlabelzmean absolute local gradientzXLS process feature indexzlower rightr‡   )ÚlocÚfontsizer$   g)\�Âõ(Ì?)rU   ÚalphazC: fixed-state local sensitivity diagnostic (not causal attribution)z_process_gradient.pngé–   ©ÚdpizŽabsolute local gradients with fixed diffusion state; risk uses mean logit at t=0, deformation uses mean |x0 estimate| at t=15 of 30 with x_t=0F)ÚrankÚfeature_index_one_basedÚsource_nameÚmean_absolute_gradient)rÿ   Úmethodrk  Úcausalrx  Úrisk_featuresÚdeformation_featuresz_process_gradient.jsonrÑ   rÔ   rÕ   )-r%   rú   re   r–   r:   r‰  r"   rŠ   rŠ  rˆ  Úrequires_grad_r9   r  r  rƒ  ÚgradrZ   r†  r‡  rß   r0  rK  ÚpltÚsubplotsr3   r4  r=  ÚbarhÚ
set_xlabelÚ
set_ylabelÚ	set_titleÚlegendÚgridÚsuptitleÚsavefigÚATTRÚcloser7   r’  r
   r˜   r�   rå   ræ   rç   ) r   r“  rx  Úbase_conditionrM  rC   ÚstartrÂ   ÚzeroÚt0rl   r   Ú
risk_valuer„  ÚtimestepÚepsilonrN  rS  Údeformation_valueÚfigÚaxesÚaxrL   Útitler¶  Útopr<   ÚlabelsÚ
risk_orderÚdeformation_orderr¾  Úpayloads                                    r   Úattributionrå  Í   sG  € ä˜$˜{Ñ+Ó,€NÔ4KÈN×L`ÑL`ÐabÑLcÔdgÐhlÐm|Ñh}Ód~ð  @Dð  E]ñ  @^ð  _cô  nqð  rvð  wñ  r@ó  nAô  5B¨eð  DI÷  DYñ  DYô  Z_÷  Zdñ  Zdð  eoð  }Aô  ZBð  COñ  ZPô  DQð  SX÷  S]ñ  S]ô  S_Ø
Ð&Ñ
'€E¨r¨Ø×"Ñ"Ó$×3Ñ3°DÓ9€IÄÇÁÌCÐPYËNÓ@[¸4Ô`e×`kÑ`kÔloÐpyÓlzô  BG÷  BLñ  BLô  aMÐ]_ñ  W\ð  ]að  bdð  enó  Woñ  OVð  OPð  QVð  pu÷  pzñ  pzó  p|÷  pEñ  pEô  pGð  S\÷  Sañ  Saò  bcð  dið  joô  psð  tyó  pzñ  jzð  dzð  bzñ  S{÷  Sñ  Só  SA÷  SFñ  SFð  GHó  SI÷  SPñ  SPó  SR÷  SXñ  SXó  SZð  HRØ×"Ñ"Ó$×3Ñ3°DÓ9€IÀ¸4ÌUÏZÉZÔY\Ð]fÓYgÐXiÐjnÔuz×uÑuô  NAÀHñ  LQð  RVð  W_ð  `ió  Ljñ  BKð  BIð  JKô  pxð  y{ó  p|ð  }Añ  pBð  koð  HIð  JNñ  HN÷  GTñ  GTó  GVð  FVð  W^ñ  F^ð  _c÷  _hñ  _hó  _jñ  Fjð  CEð  km÷  kqñ  kqó  ks÷  kxñ  kxó  kz÷  kCñ  kCô  kEð  Xa÷  Xfñ  Xfò  ghð  inð  otô  uxð  y~ó  uñ  oð  ið  gñ  X@÷  XDñ  XDó  XF÷  XKñ  XKð  LMó  XN÷  XUñ  XUó  XW÷  X]ñ  X]ó  X_ð  FWÜ�\‰\˜!˜A hÀ$ÔG�H€CˆØ"& q¡'¨*Ð5RÐS\Ð!]Ð_cÐdeÑ_fÐgxð  z\ð  ]fð  _gó  !hÑˆˆ5��uÜ�J‰J�uÓ˜c˜dÐ#¡D b DÑ)ˆÑ_bÓ1cÑ_bÐV[Ô2EÄcÈ%ÃjÕ2QÐ_bÑ1cÑdhÐfhÐdhÑ1i¨&Ø
�‰��u˜S‘z¡$ B $Ñ'¨eÐ:RˆÔSÐTV×TaÑTað  cAô  UBð  CE÷  CPñ  CPð  Qlô  Cmð  np÷  nzñ  nzð  {@ô  nAð  BD÷  BKñ  BKð  P]ð  ghð  BKô  Bið  jl÷  jqñ  jqð  wzð  ADð  jqõ  jEð !hð ‡L�L�D�6Ð\Ð]Ô^Ð_b×_jÑ_jÔkoÐswÐrxð  yNð  qOñ  lOð  TWÐ_jô  `Xô  Y\÷  Ybñ  Ybð  cfô  YgÜ—‘˜JÓ'©¨"¨Ñ-€JÜŸ
™
Ð#4Ó5±d¸°dÑ;Ðàð cØ!ØÜ˜*×0Ñ0´Ó6Ó7ô @Ið  JTô  @Uô  Vñ  @Uñ  r|ð  rvð  w| 4¨!¡8ÌÈEË
ÐUVÉÔfiÐjoÐpuÑjvÓfwô  TYð  Zdð  ejñ  Zkó  Tló  mð  @Uò  Vô NWð  Xiô  Njô  !kñ  Njñ  @Jð  @Dð  EJ¨$°©(ÌsÐSXËzÐ\]É~ÔmpÐqvÐw|Ñq}Óm~ô  [`ð  arð  sxñ  ayó  [zó  "{ð  Njò  !kñ€Gô 
ˆtˆfÐ*Ð+Ñ+×7Ñ7Ü�
‰
�7¨°qÔ9ÀGð 8õ Mùò 2dùó Vùó !ks   Ë)S,Ð18S1Ñ:8S7c                ó¸  — t        j                  dddd¬«      \  }}|d   }| dk(  r´t        j                  t        dz  d	¬
«      5 }t        j
                  |d   d   |d   d   t        j                  «      }ddd«       |j                  d¬«      }|j                  ||d¬«       |j                  d«       |j                  d«       |j                  d«       �n&| dk(  ré|j                  |«       |j                  dddd¬«      }|d   }t        j                  j                  |d   d¬«      }	|j!                  |dd…df   |dd…df   |dd…df   |	ddd¬«      }
|j                  |
|dd¬«       |j                  d«       |j                  d «       |j                  d!«       |j#                  d"«       |j%                  d#d$«       �n8|d   }t        j                  j                  |d   d¬«      }	|j!                  |dd…df   |dd…df   |	ddd¬«      }
| d%k(  rx|d&   }t        j&                  dt)        |«      dz
  t+        d't)        |«      «      t,        ¬(«      D ]4  }||dd…f   D ]&  }|j/                  |||gdf   |||gdf   d)d*d+¬,«       Œ( Œ6 |j                  |
|d¬«       |j                  dd-d.t)        |«      d/›d0�d1œ|    «       |j                  d «       |j                  d"«       |j1                  d2«       t)        |d3   «      d4z  }t3        |d5   «      D ]V  \  }}|d6   |t-        |d7   «      z  d8d8|z   …f   }|d   j/                  t        j4                  d|dz   «      |d9d:|› d;�¬<«       ŒX |d   j                  d=«       |d   j                  d>«       |d   j                  d?«       |d   j7                  «        |d   j9                  d@¬A«       |d   j;                  dBdCdD|d   j<                  dEdFdGdHdIœ¬J«       |j?                  | › dK�«       |jA                  tB        | › dL�z  dM¬N«       t        jD                  |«       y# 1 sw Y   �ŒÚxY w)OzDShow the real prepared representation and the two condition vectors.r/   ry   )é   gÍÌÌÌÌÌ@Tr³  r   r   rp   Frq   rs   Údepth_mmNÚviridis)ÚcmapzCAD depth (mm))rÞ  r·  z'real 2-D input: CAD view 0 depth pixelszpixel xzpixel yr   Ú3d)Ú
projectionr†   rÈ   rT   )r  Úsrê  Ú
rasterizedz(norm of prepared representation featuresç
×£p=
ç?)rÞ  r·  Úshrinkz)real 3-D input: sparse CAD surface voxelsú
CAD X (mm)z
CAD Y (mm)ú
CAD Z (mm)é   iÂÿÿÿr   rÇ   i&  r    z#607d8bç
×£p=
Ç?g333333Ó?)r¶  Úlwrº  z*real point input: 6,000 CAD surface pointszreal graph input: r‰   z CAD nodes + edges)r   r   r   Úequalr*   rw   r©   rÂ   rÆ   rV   Úogš™™™™™@z XLS process)ÚmarkerÚmsr·  z0condition actually supplied to every CAD elementz4process feature index (source names retained in NPZ)zfixed physical normalized valueç      Ð?©rº  g{®Gáz„?r-  z^local provisional heater values: zero-imputed
local heater validity mask: false for these runsr‡   z#fff2ccz#d99b00gÍÌÌÌÌÌì?)Ú	facecolorÚ	edgecolorrº  )Ú	transformr¹  Úbboxz1: prepared input and XLS/heater condition summaryz.pngéª   r¼  )#rÈ  rÉ  r3   rŠ   r
   r=   rQ   ÚimshowÚcolorbarrÍ  rË  rÌ  ÚdelaxesÚadd_subplotrÝ   rÞ   ÚscatterÚ
set_zlabelÚ	view_initr�   r:   rc   r–   ÚplotÚ
set_aspectr˜   rh   rÎ  rÏ  ÚtextÚ	transAxesrÐ  rÑ  rØ   rÓ  )r   r“  rÜ  rÝ  rÞ  r~   ÚimageÚshownr�   ÚfeatureÚdrawr¦   ÚnodeÚ	neighbourÚprocess_widthr<   rò   rH   s                     r   Úprocessed_input_figurer  ç   sÒ  € ä—‘˜Q ¨9ÈÔN�I€CˆØ	ˆa‰€BØˆzÒÜ�W‰W”TÐIÑIÐX]Õ^ÐbhÜ—H‘H˜V LÑ1°!Ñ4°f¸ZÑ6HÈÑ6KÌRÏVÉVÓTˆE÷ _à—	‘	˜% i�	Ó0ˆ°#·,±,¸uÈÐSc°,Ô2dØ
�‰Ð>Ô?ÀÇÁÈyÔAYÐ[]×[hÑ[hÐirÖ[sØ	�Ò	Ø�‰�BŒ˜CŸO™O¨A¨a°¸T˜OÓB˜Ø�‰Nˆ¤2§9¡9§>¡>°$Ð7PÑ2QÐWX >Ó#Y˜7Ø�Z‰Z˜šA˜a˜C™ ¢Q q S¡¨#ªa°¨c©(°W¸qÀiÐ[_ˆZÓ`ˆØ�‰�T˜RÐ&PÐX[ˆÔ\Ø
�‰Ð@ÔAÀ"Ç-Á-ÐP\ÔB]Ð^`×^kÑ^kÐlxÔ^yÐz|÷  {Hñ  {Hð  IUô  {Vð  WY÷  Wcñ  Wcð  dfð  gjö  Wkà�8‰nˆ¬¯	©	¯©°tÐ<UÑ7VÐ]^¨Ó(_˜gØ�z‰z˜#ša ˜d™) Sª¨A¨¡Y°'¸QÀYÐ[_ˆzÓ`ˆØ�<ÒØÐ6Ñ7ˆJÜŸ™ A¤s¨3£x°!¡|´S¸¼cÀ#»hÓ5GÌs×S�Ø!+¨D°"°1°"¨HÔ!5�IØ—G‘G˜C  yÐ 1°1Ð 4Ñ5°s¸DÀ)Ð;LÈaÐ;OÑ7PÐXaÐfiÐqt�GÕuñ "6ð Tð 	�‰�T˜bÐ(RˆÔSØ
�‰Ð!Lð  \Hð  Ykô  loð  psó  ltð  uvð  kwð  wIð  WJñ  Kð  LPñ  Qô  	RØ
�‰�lÔ# R§]¡]°<Ô%@À"Ç-Á-ÐPWÔBXÜ˜Ð4Ñ5Ó6¸!Ñ;€MÜ˜t H™~Ö.‰	ˆˆcØ�KÑ  ¤s¨4°Ñ+@Ó'AÑ!AÀ"ÀRÈÑEUÐBUÐ!UÑVˆØˆQ‰�‰”R—Y‘Y˜q ¨q¡Ó1°&ÀÀsÐTWÐSXÐXdÐQeˆÕfð /ð 	ˆ�G×ÑÐHÔIØˆ�G×ÑÐMÔNÐPTÐUVÑPW×PbÑPbð  dEô  QFØˆ�G‡N�NÔ�d˜1‘g—l‘l¨�lÔ-Øˆ�G‡L�L��SÐzð  FJð  KLñ  FM÷  FWñ  FWð  abð  u~ð  KTð  ]_ñ  h`€Lô  aØ‡L�L�D�6ÐJÐKÔLØ‡K�K”˜˜˜d�mÑ#¨€KÔ-¬s¯y©y¸­~÷= _Ñ^ús   Á2QÑQc                óè  — t         j                  dd¬«       t        j                  dddd¬«      \  }}t	        |j                  «       | «      D ]¿  \  }}|d   }|j                  |D �cg c]  }|d   ‘Œ	 c}|D �cg c]  }|d   ‘Œ	 c}d	¬
«       |j                  |D �cg c]  }|d   ‘Œ	 c}|D �cg c]  }|d   ‘Œ	 c}d¬
«       |j                  d«       |j                  |d   «       |j                  d¬«       |j                  d¬«       ŒÁ |j                  d«       |j                  t         dz  d¬«       t        j                  |«       t        j                  dddd¬«      \  }}t        | «      D �]
  \  }}t        j                   t         |d   › d�z  «      }	|	d   }
|	d   }|	d   d   }|
||d d …d f   z  z   }|	d   d   }t        t#        |«      d d!d"f|d#d$d%ff«      D ]˜  \  }\  }}}}|||f   }|j%                  |d d …d&f   |d d …df   |d|d&|d¬'«      }|j'                  d(«       |j                  |d   › d)|› �«       |j)                  d*«       |j+                  d+«       |j-                  ||d,¬-«       Œš �Œ |j                  |› d.�«       |j                  t         |› d/�z  d0¬«       t        j                  |«       t        j                  d1¬2«      \  }}|j/                  d3«       g d4¢}t        j0                  d5d6d«      }t	        ||«      D ]e  \  }}|j3                  t        j4                  |d7fd8dd9d:¬;«      «       |j7                  |d<z   d=|d>d>¬?«       |j9                  d@dA|d<z   d7fdBdCi¬D«       Œg |j3                  t        j4                  dEdddFdG¬;«      «       |j7                  dHdIdJd>d>¬?«       |j3                  t        j4                  dKdddLdM¬;«      «       |j7                  dNdIdOd>d>¬?«       |j9                  d@dPdQdBdCi¬D«       |j7                  dHdRdSd>dT¬U«       |j                  t         dVz  d0dW¬X«       t        j                  |«       y c c}w c c}w c c}w c c}w )YNTr³   ry   )é   é   r³  rt  r^  r`  zdenoise MSE)r·  ra  zrisk BCEr  rÿ   gš™™™™™É?rû  r‡   )r¹  zCFour conditional diffusion denoising losses (weak-label diagnostic)zloss_comparison.pngé    r¼  r}   )r0   r‡   rm  r¶   r·   ro  )r   rv   rq  rv   zgenerated deformation |mm|ré  r²  z&weak risk / unvalidated run-level typeÚmagmar/   r   )r  rí  rê  ÚvminÚvmaxrî  rö  Ú
rñ  rò  gffffffæ?)rÞ  rð  z; fixed CAD projection and colour scales; generated sample 0z_four_variant_comparison.pngr   )r  gÍÌÌÌÌÌ@)r´  Úoff)z2D CAD views
4 pixel messagesz!3D sparse voxels
6 voxel messagesz"6k CAD points
kNN + global poolingz~6k CAD graph
edge messagesg{®Gáz´?rï  g=
×£p=â?rô  z#e8f0fez#2855a6)ÚfcÚecg
×£p=
·?gq=
×£på?Úcenter)ÚhaÚvaÚ )g\�Âõ(\ß?gq=
×£pÝ?Ú
arrowstylez->)Ú
arrowprops)gš™™™™™Ù?rú  z#eaf6ecz#278343rc  r]  z,process_x + masks
provisional heaters + mask)rï  rú  z#fff1e6z#ae5f15g=
×£p=ê?u0   DDPM signed d
â†’ CAD + normal Ã— d
risk overlay)rï  r]  )g333333ã?r]  g{®Gáz¤?zeAll local heater projections are mask=false (heater_projection_valid=false); values are zero-imputed.z#8a4b00)r   r¶  zarchitecture.pngÚtight)r½  Úbbox_inches)r‘  rÙ   rÈ  rÉ  Úzipr‹   r  Ú
set_yscalerÍ  rÏ  rÎ  rÐ  rÑ  rÓ  r˜   r3   rŠ   rZ   r  r	  rË  rÌ  r  rU   r�   Ú	add_patchÚ	Rectangler
  Úannotate)Úreportsrò   rÜ  rÝ  rÞ  Úrepr!  r$   Úcolrš   r�   rx   ÚdispÚcloudra  r¥   rH   rß  rê  ÚhirC  rá  Úxxr·  s                           r   Úfiguresr3    s×  € Ü‡I�I�d D€IÔ)´C·L±LÀÀ1ÈVÐgkÔ4l©8¨3¨tÜ�d—j‘j“l 7Ö+‰ˆˆ3Ø
ˆi‰.ˆ˜Ÿ™±aÓ!8±a° ! G£*°aÑ!8ÑPQÓ9RÑPQÈ1¸!¸I»,ÐPQÑ9RÐYf˜ÔgÐhj×hoÑhoñ  FGó  qHñ  FGð  ABÐqrÐszÓq{ð  FGñ  qHñ  ]^ó  I_ñ  ]^ð  XYð  JKð  LRó  JSð  ]^ñ  I_ð  fpÐhoô  iqð  rt÷  rñ  rð  @Eô  rFð  GI÷  GSñ  GSð  TWð  Xañ  Tbô  Gcð  df÷  dkñ  dkð  rtð  dkô  duð  vx÷  vñ  vð  IJð  võ  vKð ,à‡L�LÐVÔWÐX[×XcÑXcÔdgÐh}Ñd}ð  CFÐXcô  YGô  HK÷  HQñ  HQð  RUô  HVä�\‰\˜!˜A fÀÔE�H€CˆÜ˜W×%‰ˆˆCÜ
�'‰'”#˜˜Y™Ð(¨Ð7Ñ7Ó
8ˆ¸Q¸|¹_¸ÐTUÐVbÑTcÈVÐijð  lHñ  jIð  JNñ  jOÐdhð  VYð  Z`ð  aeò  fgð  hlð  flñ  amñ  Zmñ  Vmð  PUð  tuð  vHñ  tIð  JLñ  tMð  osÜ*3´c¸$³iÐ@\Ð]fÐgiÐ5jÐlpð  rZð  [bð  cdð  leð  5fö  +gÑ&ˆCÑ&�˜˜d 2Ø�C˜�G‰}ˆB˜rŸz™z¨%²°!°©*°Uº1¸Q¸3±ZÀ&È1ÐRVÐ\]ÐceÐqu˜zÓv˜QÐwy÷  xEñ  xEð  FMô  xNð  OQ÷  O[ñ  O[ð  _bð  clñ  _mð  ^nð  npð  qvð  pwð  \xô  Oyð  z|÷  zGñ  zGð  HTô  zUð  VX÷  Vcñ  Vcð  dpô  Vqð  ru÷  r~ñ  r~ð  @ð  DFð  NPð  r~õ  rQò +gð &ð ‡L�L�C�5ÐSÐTÔUÐWZ×WbÑWbÔcfÐjmÐinð  oKð  hLñ  dLð  QTÐWbô  XUô  VY÷  V_ñ  V_ð  `cô  VdÜ�<‰< Ô)�F€Cˆ¨"¯'©'°%¬.ò  AP¸ô  SU÷  S^ñ  S^ð  _bð  cfð  ghó  Sið  QRÜ˜˜&–M‰ˆˆ5 2§<¡<´·±¸rÀ#¸hÀsÈ2ÐQZÐ^gÔ0hÔ#iÐjl×jqÑjqÐrtÐuxÑrxÐy|ð  ~Cð  GOð  S[Ðjqô  k\ð  ]_÷  ]hñ  ]hð  ikð  luð  wyð  z}ñ  w}ð  ~Að  vBð  O[ð  \`ð  Nað  ]hõ  ]b�MØ‡L�L”—‘˜y¨¨B°)¸yÔIÔJÈ2Ï7É7ÐSUÐVYð  [Jð  NVð  ZbÈ7ô  Lcð  df÷  dpñ  dpô  qt÷  q~ñ  q~ð  Hð  IKð  LNð  R[ð  _hô  qiô  djð  km÷  krñ  krð  svð  wzð  {oð  s{ð  Gð  krô  kHð  IK÷  ITñ  ITð  UWð  Xað  bkð  xDð  EIð  wJð  ITô  IKð  LN÷  LSñ  LSð  TVð  WZð  [Bð  FNð  U^ð  LSô  L_Ø‡K�K”Ð&Ñ&¨3¸7€KÔCÄCÇIÁIÈcÅNùò "9ùÒ9Rùò  qHùò  I_s   Á(Q 
Á:Q%ÂQ*
Â0Q/c                ó:  — | d   d   }dj                  d„ | d   D «       «      }dj                  d„ | d   D «       «      }dj                  d„ | d   D «       «      }t        d	z  j                  d
t        | d   «      › d|› d|› d|› d|› d|› d|› d|› d|› d�d¬«       y )Nr™  rv   r"  c              3  óÎ   K  — | ]]  }d |d   › d|d   › d|d   d›d|d   d   d   d	›d|d   d   d
   d	›d|d   d   d   d	›d|d   d   d   d	›d|d   d   d   d   › d�–— Œ_ y­w)z<tr><td>rÿ   z	</td><td>rÆ   ru  z.4frw  rv   rd  z.3fre  rf  rg  ra  rb  z
</td></tr>Nr<  ©r   rö   s     r   r   zgallery.<locals>.<genexpr>!  s¢  è ø€ ð  Dñ  qCð  lm�8˜A˜i™L˜>¨°1°_Ñ3EÐ2FÀiÐPQÐR]ÑP^Ð_bÐOcÐclÐmnÐoxÑmyÐz|Ñm}ð  Gñ  nHð  ILð  mMð  MVð  WXð  Ybñ  Wcð  dfñ  Wgð  hqñ  Wrð  svð  Vwð  w@ð  ABð  CLñ  AMð  NPñ  AQð  Rpñ  Aqð  ruð  @vð  vð  @Að  BKñ  @Lð  MOñ  @Pð  Qmñ  @nð  orð  sð  s|ð  }~ð  Hñ  }Ið  JLñ  }Mð  NTñ  }Uð  VZñ  }[ð  |\ð  \fô  gñ  qCùs   ‚A#A%Úvariantsu    Â· c              3  ó:   K  — | ]  }d |d   › d|d   › d�–— Œ y­w)z<a href=../processed_inputs/rÿ   z.png>z prepared input</a>Nr<  r6  s     r   r   zgallery.<locals>.<genexpr>"  s8   è ø€ ð  Hñ  uGÐopÐ5°a¸	±l°^À5ÈÈ9ÉÈÐViÔjñ  uGùs   ‚c              3  óF   K  — | ]  }d |d   › d|d   › d|d   › d�–— Œ y­w)z <a href=../feature_attributions/rÿ   z_process_gradient.png>z2 attribution</a> (<a href=../feature_attributions/z _process_gradient.json>JSON</a>)Nr<  r6  s     r   r   zgallery.<locals>.<genexpr>#  sk   è ø€ ð  pñ  ]oð  XYÐ?ÀÀ)Á¸~ÐMcÐdeÐfoÑdpÐcqð  rdð  efð  gpñ  eqð  drð  rRô  Sñ  ]oùs   ‚!z
index.htmlaK  <!doctype html><meta charset=utf-8><title>CAD conditional diffusion diagnostics</title><style>body{font:16px/1.5 system-ui;max-width:1280px;margin:2rem auto;padding:0 1rem;background:#f6f8fb}.w{background:#fff2cc;border-left:5px solid #d99b00;padding:1rem}img{max-width:100%;background:white;border:1px solid #ccd3df}table{border-collapse:collapse;background:white}td,th{padding:.5rem;border:1px solid #ccd3df;text-align:right}td:first-child,th:first-child{text-align:left}</style><h1>CAD + process conditional-diffusion representations</h1><p class=w><b>Weak-label diagnostic only.</b> zä NG run(s), registration and defect extents are unvalidated, and local heater projection is invalid. Type is an observed diagnostic label, never a validated classifier.</p><h2>Prepared representation and condition inputs</h2><p>z[</p><img src=architecture.png><h2>Denoising loss</h2><img src=loss_comparison.png><h2>Same z( CAD view and colour scale</h2><img src=zg_four_variant_comparison.png><table><tr><th>representation</th><th>nodes/run</th><th>best loss</th><th>z MAE mm</th><th>zY RMSE mm</th><th>CAD-correspondent Chamfer mm</th><th>registered-scan Chamfer mm</th><th>z weak AP</th></tr>z3</table><h2>Feature attribution diagnostics</h2><p>z.</p><p><a href=report.json>full report</a></p>rÔ   rÕ   )Újoinr‘  rå   r:   )Úreportrò   ÚrowsÚinputsÚattributionss        r   Úgalleryr?    sŸ  € Øˆv‰�rÑ€CØ	�‰ñ  Dð  qwð  xBò  qCó  Dó  
D€DØ�;‰;ñ  HÐtzð  |Fò  uGó  Hó  H€FØ—‘ñ  pð  ]cð  dnò  ]oó  pó  p€LÜˆÑ×!Ñ!ð  '~	ô  	B
ð  C
I
ð  J
P
ñ  C
Q
ó  	R
ð  ~	S
ð  S
wð  x~ð  wð  Zð  [^ð  Z_ð  _Gð  HKð  GLð  Lsð  twð  sxð  xHð  ILð  HMð  Mfð  gjð  fkð  k}ð  ~Bð  }Cð  Cvð  wCð  vDð  Drð  #uð  FÐ!õ  Gr&   c                ó  — t        «        t        t        t        t        fD �cg c]  }|j                  dd¬«      ‘Œ c} g }t        D ]„  }t        |«      }t        ||«       t        ||| j                  | j                  | j                  | j                  | j                  «      }t        ||t        |› d�z  «       |j!                  |«       Œ† d   D �cg c]  }t#        |«      ‘Œ }}t%        ||d   «       dd||d|d	   j'                  «       d
dœddddt)        |«      › d�gdddddœdœ}t        dz  j+                  t-        j.                  |dd¬«      d¬«       t1        |«       t        dz  j+                  dd¬«       |S c c}w c c}w )NTr³   rl  r©   rv   Ú:four_conditional_diffusion_weak_label_diagnostic_completedFzcCAD/process conditioning -> signed-normal deformation diffusion -> p=CAD+n*d plus weak risk overlayrÊ   Úunvalidated_run_level_labels)rL   Ústatusz*registration_independently_validated=falsez)defect extent/identity not fully reviewedzKheater_projection_valid=false; local values zero-imputed with explicit maskzonly z* NG run(s) and one CAD; no held-out resultzgen_models/processed_inputszgen_models/modelszgen_models/outputszgen_models/feature_attributionsr   )rC  rk  r™  r7  Úcommon_contractrr  Úcritical_limitationsÚoutput_directorieszreport.jsonry   rÑ   rÔ   rÕ   z	README.mdz–Gradient plots are local post-fit sensitivity diagnostics of the weak-label risk head. They are not causal process attribution or feature importance.
)r   rØ   r�  r‘  rÒ  rÙ   ÚVARIANTSrø   r  r®  r”  Úlearning_rater•  r–  rO  rå  r—   r7   r3  r8   r:   rå   ræ   rç   r?  )	Úargsr   r,  r   r“  r-  r$   r™  r;  s	            r   rò   rò   '  s¥  € ÜÔÄcÌ#ÌcÔRVÑEWÓXÑEWÀ˜Ÿ™¨°d˜Õ;ÐEWÒXÐbdÐZaßˆÜ˜TÓ"ˆÔ$:¸4ÀÔ$EÌ=ÐY]Ð^bÐcg×cnÑcnÐos÷  pBñ  pBð  CG÷  CWñ  CWð  X\÷  Xdñ  Xdð  ei÷  evñ  evó  LwÀsô  yDð  EIð  JNô  ORð  VZð  U[ð  [^ð  S_ñ  O_ô  y`ð  ah÷  aoñ  aoð  psõ  atð à˜xš.Ó	)™.�QŒ#ˆa�&˜.€DÐ	)ÜˆG�D˜‘HÔÐ0lð  AFð  NRð  ^eð  x]ð  uyð  zLñ  uM÷  uTñ  uTó  uVð  `~ñ  lð  XDð  Epð  q~ð  A	F	ô  G	J	ð  K	O	ó  G	P	ð  F	Q	ð  Q	{	ð  |	ð  W}	ð  g
Dð  Nað  l@ð  Xyñ  S
zñ  '{˜vÜˆÑ×"Ñ"¤4§:¡:¨fÀ%ÈqÔ#QÐ[bÐ"ÔcÔdkÐlrÔdsÔuyð  {Fñ  vF÷  uRñ  uRð  Slð  v}ð  uRô  u~ð  FLð  Lùò Yùò 
*s   £FÃF
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                  «       }|j                  st        d«      ‚t        |«      }t        t        j                  |d   |d   D �cg c]  }|d   |d   dœ‘Œ c}dœdd¬«      «       y c c}w )N)Údescriptionz--allow-diagnostic-weak-labelsÚ
store_true)Úactionz--epochsé   )ÚtypeÚdefaultz--learning-rategü©ñÒMb`?z--diffusion-stepsr²  z--sample-stepsr  z	--samplesr}   zjPass --allow-diagnostic-weak-labels: paired registration, defect extent and heater projection are invalid.rC  r7  rÿ   ru  )r   r¢  )rC  r7  Fry   rÑ   )ÚargparseÚArgumentParserr*  Úadd_argumentr–   r�   Ú
parse_argsÚallow_diagnostic_weak_labelsÚ
SystemExitrò   Úprintræ   rç   )r   rI  r;  r$   s       r   ÚmainrX  0  s  € Ü×Ñ¬'Ô2€A°1·>±>ÐBbÐjv°>Ô3wÐxy÷  yGñ  yGð  HRô  X[ð  dfð  yGô  ygð  hi÷  hvñ  hvð  wHô  NSð  \`ð  hvô  hað  bc÷  bpñ  bpð  qDô  JMð  VXð  bpô  bYð  Z[÷  Zhñ  Zhð  iyô  Bð  KMð  Zhô  ZNð  OP÷  O]ñ  O]ð  ^iô  orð  {|ð  O]ô  O}ð  CD÷  COñ  COó  CQð  ~BØ×,Ò,´Jð  @ló  5mð  /mÜˆt‹9€F”Uœ4Ÿ:™:°°xÑ0@ð  CIð  JTò  CUó  MVñ  CUÐ}~ÐUVÐW`ÑUaÐijÐkvÑiwÓMxð  CUñ  MVñ  'Wð  ejð  rsô  tõ  uùò  MVs   Ã7DÚ__main__)r$   r$  r!   ztorch.dtyper%  r   )r@   zdict[str, np.ndarray]r%  ztuple[np.ndarray, list[str]])r$   r$  r\   r$  r%  r$  )rj   r$  rk   r–   r%  r$  )r   r7   r%  zEtuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, dict[str, Any]])r%  z'list[tuple[str, dict[str, np.ndarray]]])r   r7   r%  údict[str, Any])r/  r–   r%  r   )r7  r$  r8  r$  r%  zfloat | None)r<   r–   r%  r7   )rš   r$  r@  r$  r%  r�   )rM  rú   rÂ   r   rN  r   rO  r–   rP  r–   r%  r   )r   r7   r“  rZ  r”  r–   rX  r�   r•  r–   r–  r–   rO  r–   r%  rZ  )r   r7   r“  rZ  rx  r   r%  r&  )r   r7   r“  rZ  r%  r&  )r,  zlist[dict[str, Any]]rò   r7   r%  r&  )r;  rZ  r%  r&  )rI  zargparse.Namespacer%  rZ  )r%  r&  )Ar*  Ú
__future__r   rQ  Úhtmlræ   r  Úpathlibr   Útypingr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotrÈ  r‡  r3   Úscipy.spatialr   r"   r   r	   Útorch.nn.functionalÚ
functionalr€  Úmodels.datar
   r   r   Úmodels.trainingr   ÚrcParamsrã   r   rØ   r�  r‘  rÒ  rà   rG  r4   r%   rN   r^   rn   r§   r±   rø   ÚModulerú   r0  r:  r=  rD  rŒ  rU  r®  rå  r  r3  r?  rò   rX  r'  r<  r&   r   Ú<module>rj     s=  ðñõ #ç !× !Ý Ý ã Ø €
‡�ˆuÔ Ý Û Ý !Û ß ß Ð ç LÑ LÝ +ð
 × Ñ × Ñ ¨=ÐPUÑVÔ Wà
ˆ\Ñ€ÙpÑ.oÓpÑ €€Sˆ#ˆtØ€Ø?€ð 05¯}©}ô +óZó>ó#ó$óNóJô4E˜bŸi™iô Eó, ]óIó
*óyð €‡�ƒòó ðówó Mó4#>óLSó$GóLóuð ˆZÒ™�Ðr&   