Ë
    ®­¨jda  ã                  óÚ  — 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mZmZ dd
lmZ edz  ZdZej@                  fdd„Z!dd„Z"d d„Z#d!d„Z$ G d„ dejJ                  «      Z&d"d„Z'd#d„Z(d$d„Z)d%d&d„Z* ejV                  «       d'd„«       Z,d(d„Z-d)d„Z.d*d„Z/d+d„Z0d,d„Z1e2dk(  r e1«        yy)-a  Conditional DDPM diagnostic for CAD/process -> deformed scan point clouds.

The model diffuses the CAD-node signed normal deformation, not free 3-D point
positions.  A generated point cloud is reconstructed as ``CAD + normal * d``;
this keeps every generated point traceable to its source CAD node and makes a
node-level risk/defect overlay possible.

The two supplied AC28 runs are deliberately treated as a weak-label diagnostic:
their PLY-to-CAD registrations, defect extent, and heater-zone projection have
all been marked invalid in the prepared artifacts.  The command cannot claim
production performance or held-out generalization.
é    )ÚannotationsN)ÚPath)ÚAnyÚAgg)ÚTensorÚnné   )ÚROOTÚfixed_physical_normalizeÚsplit_embedded_units)Úseed_everythingzresults/models/diffusiong      >@c                ó0   — t        j                  | |¬«      S )N©Údtype)ÚtorchÚ	as_tensor)Úvaluer   s     ú*gen_models/models/conditional_diffusion.pyÚ_tensorr   &   s   € Ü�?‰?˜5¨Ô.Ð.ó    c                óª  — t        j                  | d   t         j                  «      j                  «       }t        j                  | d   t        «      }t        j                  | d   «      j                  t        «      }t        |«      \  }}|j                  «       }t        j                  t        |«      t        ¬«      }d| d   | d   fd| d	   | d
   ffD ]M  \  }}}	t        dd«      D ]8  }
|› |
d›�}||v sŒ|	|
dz
     sŒ|j                  |«      }||
dz
     ||<   d||<   Œ: ŒO ||z  }t        t        j                  ||d«      d   t        j                  |«      |«      d   }t        j                  ||j                  t         j                  «      |j                  t         j                  «      g«      j                  t         j                  «      S )zGNormalize global XLS values and append observed/imputed validity masks.Ú	process_xÚprocess_feature_validÚprocess_feature_namesr   u   ìƒ�ë¶€ì˜¨ë�„Úheater_top_cÚheater_top_imputedu   í•˜ë¶€ì˜¨ë�„Úheater_bottom_cÚheater_bottom_imputedr	   é   Ú02dTr   N)ÚnpÚasarrayÚfloat32ÚcopyÚboolÚastypeÚstrr   ÚtolistÚzerosÚlenÚrangeÚindexr   ÚwhereÚconcatenate)ÚitemÚrawÚobservedÚnamesÚ
base_namesÚunitsÚimputedÚprefixÚvaluesÚimputed_zonesÚzoneÚkeyr,   ÚusableÚ
normalizeds                  r   Ú_process_vectorr=   *   sª  € ä
�*‰*�T˜+Ñ&¬¯
©
Ó
3×
8Ñ
8Ó
:€CÜ�z‰z˜$Ð6Ñ7¼Ó>€HÜ�J‰J�tÐ3Ñ4Ó5×<Ñ<¼SÓA€EÜ,¨UÓ3Ñ€J�Ø×"Ñ"Ó$€JÜ�h‰h”s˜3“x¤tÔ,€Gà	˜˜nÑ-¨tÐ4HÑ/IÐJØ	˜Ð/Ñ0°$Ð7NÑ2OÐPó*Ñ%ˆ�˜ô ˜!˜R–LˆDØ�H˜T #˜JÐ'ˆCØ�jÒ  ]°4¸!±8Ó%<Ø"×(Ñ(¨Ó-�Ø# D¨1¡HÑ-��E‘
Ø!%�˜’ñ !ð	*ð ˜Ñ€FÜ)¬"¯(©(°6¸3ÀÓ*BÀ4Ñ*HÌ"Ï*É*ÐU_ÓJ`ÐbgÓhÐijÑk€JÜ�>‰>˜: x§¡´r·z±zÓ'BÀGÇNÁNÔSU×S]ÑS]ÓD^Ð_Ó`×gÑgÔhj×hrÑhrÓsÐsr   c                 ó\  ‡— t        t        dz  j                  d«      «      } t        | «      dk7  rt	        dt        | «      › �«      ‚g }| D ]„  }t        j                  |d¬«      5 }|j                  D �ci c]  }|||   “Œ
 }}ddd«       d}|D �cg c]	  }|vsŒ|‘Œ }}|rt	        |j                  › d	|› �«      ‚|j                  |f«       Œ† t        |d
   d   d   j                  d
   «      Št        ˆfd„|D «       «      rt	        d«      ‚|‰dœS c c}w # 1 sw Y   ŒšxY wc c}w )zJLoad both paired artifacts without promoting their weak targets to labels.zdata_processed/pairedz*_cad_ply_targets.npzé   z<Expected exactly two paired runs for this diagnostic, found F)Úallow_pickleN)
Ú
cad_pos_mmÚ
cad_normalr   r   Úcad_to_scan_normal_residual_mmÚcad_to_scan_distance_mmÚweak_defect_probabilityÚweak_defect_maskÚ%provisional_heater_top_c_per_cad_nodeÚheater_projection_validz	 missing r   r	   rA   c              3  óN   •K  — | ]  \  }}|d    j                   d   ‰k7  –— Œ y­w)rA   r   N)Úshape)Ú.0Ú_r/   Úcounts      €r   Ú	<genexpr>zload_data.<locals>.<genexpr>S   s+   øè ø€ Ð
G¹w±G°A°tˆ4�Ñ×#Ñ# AÑ&¨%Õ/¹wùs   ƒ"%z<The paired runs do not have a shared CAD-node correspondence)ÚrecordsÚnodes_per_run)Úsortedr
   Úglobr*   ÚRuntimeErrorr!   ÚloadÚfilesÚnameÚappendÚintrJ   Úany)	ÚpathsrO   ÚpathÚsourcer:   r/   ÚrequiredÚmissingrM   s	           @r   Ú	load_datar_   A   s6  ø€ ä”DÐ2Ñ2×8Ñ8Ð9PÓQÓR€EÜ
ˆ5ƒz�Q‚ÜÐYÔZ]Ð^cÓZdÐYeÐfÓgÐgØ8:€GÛˆÜ�W‰W�T¨Õ.°&Ø06·²Ó=±¨�C˜ ™Ñ$°ˆDÐ=÷ /ðXˆñ #+Ó>¡(˜3¨c¸ªo’3 (ˆÐ>ÙÜ $§)¡) ¨I°g°YÐ?Ó@Ð@Ø�‰˜˜d�|Õ$ð ô �˜‘
˜1‘˜lÑ+×1Ñ1°!Ñ4Ó5€EÜ
Ó
G¹wÓ
GÔGÜÐYÓZÐZØ°Ñ7Ð7ùò >÷ /Ð.üò ?s*   Á&DÁ5DÂDÂ	D)ÂD)ÄDÄD&	c                ór  — t        j                  | d   t         j                  «      dz  }t        j                  | d   t         j                  «      }t        t        j                  | d   «      j	                  «       «      }t        j                  | d   t         j                  «      }t        j                  | d   t         j                  «      }t        j                  | d   t         j                  «      }t        j
                  |||gd¬	«      d
z  }t        j                  t        |«      dft        |«      t         j                  ¬«      }||z  }t        | «      }	t        j                  |	d   t        |«      d¬	«      }
t        j                  |||||
gd¬	«      t        t        |	«      «      g d¢|| dœfS )zOBuild per-node condition features using values only when their masks permit it.rA   ç     @�@rB   rH   rG   Ú(provisional_heater_bottom_c_per_cad_nodeÚ'provisional_heater_delta_c_per_cad_noder	   ©Úaxisg     @@r   Nr   )Útop_cÚbottom_cÚdelta_c)Úglobal_process_featuresÚ!local_provisional_heater_channelsrH   Ú&local_values_zero_imputed_when_invalid)r!   r"   r#   r%   r/   ÚstackÚfullr*   Úfloatr=   Úrepeatr.   rX   )r/   ÚposÚnormalÚprojection_validÚtopÚbottomÚdeltaÚlocal_valuesÚ
local_maskÚglobal_processÚglobal_per_nodes              r   Ú_conditionsrz   X   s^  € ä
�*‰*�T˜,Ñ'¬¯©Ó
4°vÑ
=€CÜ�Z‰Z˜˜\Ñ*¬B¯J©JÓ7€FÜœBŸJ™J tÐ,EÑ'FÓG×LÑLÓNÓOÐô �*‰*�TÐAÑBÄBÇJÁJÓ
O€CÜ�Z‰Z˜ÐGÑHÌ"Ï*É*ÓU€FÜ�J‰J�tÐEÑFÌÏ
É
ÓS€EÜ—8‘8˜S &¨%Ð0°qÔ9¸EÑA€LÜ—‘œ#˜c›( A˜¬Ð.>Ó(?ÄrÇzÁzÔR€JØ *Ñ,€LÜ$ TÓ*€NÜ—i‘i ¨tÑ 4´c¸#³hÀQÔG€OÜ�>‰>˜3 ¨°jÀ/ÐRÐYZÔ[Ü#&¤s¨>Ó':Ó#;Ú-MØ#3Ø6FÐ2Fñ	^ð ð r   c                  óB   ‡ — e Zd ZdZddˆ fd„Zeddd„«       Zd	d„Zˆ xZS )
ÚConditionalDisplacementDDPMzISmall node-wise conditional epsilon model with a deterministic risk head.c           
     ó`  •— t         ‰| �  «        t        j                  t        j                  ||«      t        j
                  «       t        j                  ||«      t        j
                  «       «      | _        t        j                  t        j                  d|«      t        j
                  «       t        j                  ||«      «      | _        t        j                  t        j                  |dz  dz   |«      t        j
                  «       t        j                  ||«      t        j
                  «       t        j                  |d«      «      | _        t        j                  t        j                  ||dz  «      t        j
                  «       t        j                  |dz  d«      «      | _	        y )Né   r?   r	   )
ÚsuperÚ__init__r   Ú
SequentialÚLinearÚSiLUÚ	conditionÚtimeÚdenoiserÚrisk)ÚselfÚcondition_dimÚhiddenÚ	__class__s      €r   r€   z$ConditionalDisplacementDDPM.__init__q   s.  ø€ Ü‰ÑÔÜŸ™¤r§y¡y°ÀÓ'GÌÏÉËÔTV×T]ÑT]Ð^dÐflÓTmÔoq×ovÑovÓoxÓyˆŒÜ—M‘M¤"§)¡)¨B°Ó"7¼¿¹»ÄBÇIÁIÈfÐV\ÓD]Ó^ˆŒ	ÜŸ™¤b§i¡i°¸±
¸Q±ÀÓ&GÌÏÉËÔTV×T]ÑT]Ð^dÐflÓTmÔoq×ovÑovÓoxÔz|÷  {Dñ  {Dð  EKð  MNó  {Oó  PˆŒÜ—M‘M¤"§)¡)¨F°F¸a±KÓ"@Ä"Ç'Á'Ã)ÌRÏYÉYÐW]ÐabÑWbÐdeÓMfÓgˆ�	r   c           	     óB  — |dz  }t        j                  t        j                  dt        j                  d«      || j
                  | j                  ¬«      «      }| d d …d f   |d    z  dz  }t        j                  |j                  «       |j                  «       gd¬«      S )Nr?   r   ra   )Údevicer   g      I@r	   ©Údim)
r   ÚexpÚlinspaceÚmathÚlogr�   r   ÚcatÚsinÚcos)Útr�   ÚhalfÚfreqÚphases        r   Útime_embeddingz*ConditionalDisplacementDDPM.time_embeddingx   s{   € à�a‰xˆÜ�y‰yœŸ™¨¬4¯8©8°FÓ+;¸TÈ!Ï(É(ÐZ[×ZaÑZaÔbÓcˆØ’!�T�'‘
˜T $™ZÑ'¨$Ñ.ˆÜ�y‰y˜%Ÿ)™)›+ u§y¡y£{Ð3¸Ô;Ð;r   c                ó&  — | j                  |«      }| j                  | j                  |«      «      }| j                  t	        j
                  |d d …d f   ||gd¬«      «      j                  d«      }|| j                  |«      j                  d«      fS )Nr	   rŽ   )r„   r…   r›   r†   r   r”   Úsqueezer‡   )rˆ   Únoisy_displacementÚtimestepr„   Úencodedr…   Úepsilons          r   Úforwardz#ConditionalDisplacementDDPM.forward   s€   € Ø—.‘. Ó+ˆØ�y‰y˜×,Ñ,¨XÓ6Ó7ˆØ—-‘-¤§	¡	Ð+=ºaÀ¸gÑ+FÈÐQUÐ*VÐ\]Ô ^Ó_×gÑgÐhiÓjˆØ˜Ÿ	™	 'Ó*×2Ñ2°1Ó5Ð5Ð5r   )é€   )r‰   rX   rŠ   rX   ÚreturnÚNone)r~   )r—   r   r�   rX   r¤   r   )rž   r   rŸ   r   r„   r   r¤   ztuple[Tensor, Tensor])	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r€   Ústaticmethodr›   r¢   Ú__classcell__)r‹   s   @r   r|   r|   o   s%   ø„ ÙSöhð ó<ó ð<÷6r   r|   c                ót   — t        j                  dd| «      }d|z
  }t        j                  |d¬«      }|||dœS )Ng-Cëâ6?ç{®Gáz”?r	   r   rŽ   )ÚbetaÚalphaÚabar)r   r‘   Úcumprod)Ústepsr®   r¯   r°   s       r   Ú	_scheduler³   †   s:   € Ü�>‰>˜$  eÓ,€DØ�‰H€EÜ�=‰=˜ AÔ&€DØ 5°$Ñ7Ð7r   c                ób  — t        |j                  «       «      }|dk(  ry t        j                  |  d¬«      }||   j	                  t        j
                  «      }t        j                  |«      t        j                  dt        |«      dz   «      z  }t        ||z  j                  «       |z  «      S )Nr   Ústable)Úkindr	   )
rX   Úsumr!   Úargsortr&   Úfloat64ÚcumsumÚaranger*   rn   )ÚscoreÚtargetÚ	positivesÚorderÚyÚ	precisions         r   Ú_aprÂ   �   sˆ   € Ü�F—J‘J“LÓ!€IØ�A‚~ØÜ�J‰J˜�v HÔ-€EØˆu‰×ÑœRŸZ™ZÓ(€AÜ—	‘	˜!“œrŸy™y¨¬C°«F°Q©JÓ7Ñ7€IÜ�)˜a‘-×$Ñ$Ó&¨Ñ2Ó3Ð3r   c                ó¾  — | dk\  }|j                  t        «      }t        ||z  j                  «       «      }t	        | |«      |t        dt        ||z  j                  «       «      «      z  d|z  t        dt        |j                  «       «      t        |j                  «       «      z   «      z  t        |j                  «       «      t        |j                  «       «      dœS )Nç      à?r	   r?   )ÚAPz
IoU_at_0.5zDice_at_0.5Úpredicted_positive_nodesÚtarget_positive_nodes)r&   r%   rX   r·   rÂ   Úmax)r¼   r½   ÚpredrÀ   Úintersections        r   Ú_risk_metricsrË   —   s®   € Ø�B‰;€DØ�‰”dÓ€AÜ˜˜q™—~‘~Ó'Ó(€LÜ�e˜Q“-¨|¼cÀ!ÄSÈ$ÐQRÉ(ÏÉÓIYÓEZÓ>[Ñ/[Ø˜|Ñ+¬c°!´S¸¿¹»³_ÄsÈ1Ï5É5Ë7Ã|Ñ5SÓ.TÑTÜ(+¨D¯H©H«J«ÔRUÐVW×V[ÑV[ÓV]ÓR^ñ`ð `r   c                ó„  ‡— dˆfd„}t         || «      «      t         ||«      «      }}t        j                  |d   |d   «      j                  d«      }t	        |j                  d«      j                  j                  «       |j                  d«      j                  j                  «       z   j                  «       dz  «      S )zKSymmetric point-set Chamfer in millimetres, with deterministic subsampling.c                ó�   •— t        | «      ‰k  r| S | t        j                  dt        | «      dz
  ‰t        j                  ¬«         S )Nr   r	   r   )r*   r!   r‘   Úint64)ÚaÚ
max_pointss    €r   Úsamplez_chamfer.<locals>.sample¢   s:   ø€ Üˆq‹6�ZÒØˆHØ”—‘˜Q¤ A£¨¡
¨J¼b¿h¹hÔGÑHÐHr   Nr   r	   r?   )rÏ   ú
np.ndarrayr¤   rÒ   )	r   r   Úcdistr�   rn   Úminr7   Úmeanr/   )rÉ   r½   rÐ   rÑ   rÏ   ÚbÚdistances     `    r   Ú_chamferrØ       s–   ø€ õIô ‘6˜$“<Ó ¤'©&°«.Ó"9€q€AÜ�{‰{˜1˜T™7 A d¡GÓ,×4Ñ4°QÓ7€HÜ�(—,‘,˜q“/×(Ñ(×-Ñ-Ó/°(·,±,¸q³/×2HÑ2H×2MÑ2MÓ2OÑO×UÑUÓWÐZ[Ñ[Ó\Ð\r   c           	     ó"  — t        j                  «       j                  |«      }t        j                  t	        |«      |¬«      }t        j                  t        j                  dt	        |d   «      dz
  |t
        j                  ¬«      «      ddd…   }t        |«      D ]Þ  \  }}	t        j                  t	        |«      ft        |	«      t         j                  ¬«      }
 | ||
|«      \  }}|d   |	   }|d|z
  j                  «       |z  z
  |j                  «       z  }|t	        |«      dz
  k(  rdnt        ||dz      «      }|dk  r|n5|d   |   j                  «       |z  d|d   |   z
  j                  «       |z  z   }Œà |j                  dd«      S )zIEta=0 DDIM path; different initial seeds produce diagnostic alternatives.)Ú	generatorr   r°   r	   r   Néÿÿÿÿ)r   Ú	GeneratorÚmanual_seedÚrandnr*   r!   Úuniquer‘   rÎ   Ú	enumeraterm   rX   ÚlongÚsqrtÚclamp)Úmodelr„   Úscheduler²   ÚseedrÚ   ÚxÚsequenceÚiÚcurrentr—   r¡   rL   r°   Úx0Úpreviouss                   r   Úsample_ddimrí   «   sh  € ô —‘Ó!×-Ñ-¨dÓ3€IÜ�‰”C˜	“N¨iÔ8€AÜ�y‰yœŸ™ Q¬¨H°VÑ,<Ó(=ÀÑ(AÀ5ÔPR×PXÑPXÔYÓZÑ[_Ð]_Ð[_Ñ`€HÜ Ö)‰
ˆˆ7Ü�J‰Jœ˜A›�y¤# g£,´e·j±jÔAˆÙ˜1˜a Ó+‰
ˆ�Ø˜Ñ Ñ(ˆØ�1�t‘8—/‘/Ó# gÑ-Ñ-°·±³Ñ<ˆØœc (›m¨aÑ/Ò/‘2´S¸À!ÀaÁ%¹Ó5IˆØ˜Q’,‰B H¨VÑ$4°XÑ$>×$CÑ$CÓ$EÈÑ$JÈaÐRZÐ[aÑRbÐckÑRlÑNl×MrÑMrÓMtÐw~ÑM~Ñ$~‰ð *ð �7‰7�2�q‹>Ðr   c                ó4  — t        j                  d¬«      \  }}|j                  d«       dddddd	d
d| › d�fddg}|D ]W  \  }}}}}|j                  t        j                  ||f||ddd¬«      «       |j                  ||dz  z   ||dz  z   |ddd¬«       ŒY dD ]  \  }	}
|j                  d|
|	ddddœ¬«       Œ  |j                  ddd ddd!¬"«       |j                  dd#d$dd%d&¬"«       |j                  t        d'z  d(d)¬*«       t        j                  |«       y )+N)é   gÍÌÌÌÌÌ@)ÚfigsizeÚoff)r­   g=
×£p=â?ç
×£p=
Ç?çHáz®GÑ?zCAD nodes
position + normal)r­   ç333333Ã?rò   ró   zXLS process_x
values + masks)ç      Ð?rô   çš™™™™™É?ró   z,Local provisional
heater values + valid maskrÄ   g
×£p=
×?rò   çìQ¸…ëÑ?zcondition MLP
z	 features)ç\�Âõ(\ç?g�Âõ(\�â?çáz®GáÊ?ç¸…ëQ¸Î?u   DDPM ÎµÎ¸
noisy signed d, t)rø   g{®GázÄ?rù   rú   z!Risk head
weak defect probabilityz#e8f0fez#2855a6ç      ø?)Ú	facecolorÚ	edgecolorÚ	linewidthr?   Úcenteré
   )ÚhaÚvaÚfontsize)))rö   çffffffæ?)rÄ   çš™™™™™á?))rö   r÷   )rÄ   g®GázÞ?))çÍÌÌÌÌÌÜ?r÷   )rÄ   r  ))çÃõ(\�Âå?r  )rø   r  ))r  r  )rø   r÷   Ú z->z#415a77gš™™™™™ù?)Ú
arrowstyleÚcolorÚlw)ÚxyÚxytextÚ
arrowpropsg¸…ëQ¸ê?g…ëQ¸í?u   sample d â†’ CAD + normal Ã— dz#172033)r  r  r
  r­   z_Diagnostic only: local heater mask is false because heater_projection_valid=false in both runs.é	   z#8a4b00úarchitecture.pngéª   Útight)ÚdpiÚbbox_inches)
ÚpltÚsubplotsre   Ú	add_patchÚ	RectangleÚtextÚannotateÚsavefigÚOUTÚclose)r‰   ÚfigÚaxÚboxesrç   rÀ   ÚwÚhÚlabelÚstartÚends              r   Ú_architecture_figurer&  »   sH  € Ü�l‰l 9Ô-�G€CˆØ‡G�GˆE„Nà=Ø=ØMØ	ˆc�3˜˜¨}¨o¸YÐGÐHØ<ØBð€Eó #Ñˆˆ1ˆa��EØ
�‰”S—]‘] A q 6¨1¨a¸9ÐPYÐehÔiÔjØ
�‰��A˜‘E‘	˜1˜q 1™u™9 e°¸XÐPRˆÕSð #ó J‰
ˆˆsØ
�‰�B˜3 uÀtÐU^ÐehÑ9iˆÕjð Jà‡G�GˆD�#Ð7¸HÈrÐYb€GÔcØ‡G�GˆB�Ðvð  |Dð  OPð  Xa€Gô  bØ‡K�K”Ð(Ñ(¨c¸w€KÔGÌÏÉÐSVÍr   c                ó  — | d   }| d   }t        j                  dddd¬«      \  }}dD ]>  \  }	}
|d	   j                  |D �cg c]  }|d
   ‘Œ	 c}|D �cg c]  }||	   ‘Œ	 c}|
¬«       Œ@ |d	   j                  d«       |d	   j	                  d
«       |d	   j                  d«       |d	   j                  «        |d	   j                  d¬«       |d   j                  |D �cg c]  }|d
   ‘Œ	 c}|D �cg c]  }|d   ‘Œ	 c}d¬«       |d   j	                  d
«       |d   j                  d«       |d   j                  dd«       |d   j                  d¬«       |j                  d«       |j                  t        dz  d¬«       t        j                  |«       t        j                  t        |«      dddt        |«      z  fd¬«      \  }}t        |«      dk(  r|d    }t        |«      D �]Å  \  }\  }}|d   |d   }}|||||z  |dz   |z  …d f   t        z  z  z   }|||d	||z  |dz   |z  …d f   t        z  z  z   }|t!        j"                  |«      dd d	df|t!        j$                  |||z  |dz   |z   «      t        z  d!d"d	t        f|t!        j$                  |d	||z  |dz   |z  …f   «      t        z  d#d"d	t        f||||z  |dz   |z   d$d%d	dfg}t'        ||   |«      D ]Ì  \  }\  }}}}}}|j)                  |d d …d	f   |d d …df   |d&|||d¬'«      }d(|v r'|d)k\  }|j)                  ||d	f   ||df   d*d+d,d-d.¬/«       |j+                  |d0   j-                  «       › d1|› �«       |j/                  d2«       |j	                  d3«       |j                  d4«       |j1                  ||d5¬6«       ŒÎ �ŒÈ |j                  d7«       |j                  t        d8z  d9¬«       t        j                  |«       y c c}w c c}w c c}w c c}w ):NrO   rP   r	   r?   )é   gÍÌÌÌÌÌ@T)rð   Úconstrained_layout))Útotalr*  )Údenoisezdenoise MSE)r‡   zrisk BCEr   Úepoch)r#  r“   zdiagnostic lossrõ   )r¯   Úrisk_APz#8b1e3f)r
  ztraining weak-label APg{®Gáz”¿gR¸…ëQð?z/Conditional-diffusion diagnostic training traceútraining.pngé    )r  é   é   gffffff@rA   rB   zCAD baselineÚGreyszweak residual targetÚviridiszgenerated sample 0zgenerated + risk highlightÚmagmarû   )ÚcÚsÚcmapÚvminÚvmaxÚ
rasterizedr‡   rÄ   é   Únonez#00d4ffg333333ã?u   risk â‰¥ 0.5)r6  Ú
facecolorsÚ
edgecolorsÚ
linewidthsr#  Úrun_idz: Úequalz
CAD X (mm)z
CAD Z (mm)gR¸…ëQè?)r  ÚshrinkzMCAD-correspondent deformed point clouds; weak/unvalidated training diagnosticúpointcloud_comparison.pngr  )r  r  ÚplotÚ
set_yscaleÚ
set_xlabelÚ
set_ylabelÚlegendÚgridÚset_ylimÚsuptitler  r  r  r*   rà   ÚDEFORMATION_SCALE_MMr!   r)   ÚabsÚzipÚscatterÚ	set_titler/   Ú
set_aspectÚcolorbar)ÚdataÚsamplesr‡   Útarget_signedÚhistoryrO   Únr  Úaxesr:   r#  Úrowr,   rL   r/   rp   rq   Ú
target_ptsÚ	generatedÚfieldsr  Úcloudr   Útitler7  ÚloÚhiÚdrawÚhots                                r   Ú_plotsrc  Ð   s“  € Ø�9‰o€GØˆ_Ñ€AÜ—‘˜Q ¨9ÈÔN�I€CˆÛ\‰
ˆˆUØˆQ‰�‰©gÓ6©g s�c˜'“l¨gÑ6ÉWÓ8UÉWÀc¸¸S»ÈWÑ8UÐ]bˆÕcð ]àˆ�G×Ñ�uÔ˜t A™w×1Ñ1°'Ô:¸DÀ¹G×<NÑ<NÐO`Ô<aÐcgÐhiÑcj×cqÑcqÔcsÐuyÐz{Ñu|÷  vBñ  vBð  ILð  vBô  vMØˆ�G‡L�L©'Ó2©' 3�#�g“,¨'Ñ2ÉwÓ4WÉwÈ°S¸³^ÈwÑ4WÐ_h€LÔiØˆ�G×Ñ�wÔ  a¡×!3Ñ!3Ð4LÔ!MÈtÐTUÉw×O_ÑO_Ð`dÐfjÔOkÐmqÐrsÑmt×myÑmyð  ADÐmyô  nEØ‡L�LÐBÔCØ‡K�K”�nÑ$¨#€KÔ.´·	±	¸#´ä—‘œS ›\¨1°r¸3ÄÀWÃÑ;MÐ6NÐcgÔh�I€CˆÜ
ˆ7ƒ|�qÒ  d¡˜$Ü% g×.Ñˆ‰y��4Ø˜<Ñ(¨$¨|Ñ*<ˆVˆØ˜6 ]°5¸1±9¸eÀa¹iÈ1¹_Ð3LÈdÐ3RÑ%SÔVjÑ%jÑkÑkˆ
Ø˜& G¨A¨u°q©y¸%À!¹)Àq¹Ð/HÈ$Ð,NÑ$OÔRfÑ$fÑgÑgˆ	à”"—(‘(˜1“+˜~¨w¸¸1Ð=ØœŸ™ ¨e°A©g°u¸Q±wÀ±kÐ BÓCÔFZÑZÐ\rÐt}ð  @Aô  CWð  XØœŸ™˜w q¨¨q©°%¸±'¸1±Ð)<Ð'<Ñ=Ó>ÔAUÑUÐWkÐmvÐxyô  |Pð  QØ˜˜U 1™W e¨A¡g¨q¡[Ð1Ð3OÐQXÐZ[Ð]^Ð_ð	
ˆô 8;¸4À¹;ÈÖ7OÑ3ˆBÑ3�˜˜u d¨B°Ø—:‘:˜e¢A q D™k¨5²°A°©;¸%À3ÈTÐXZÐacÐpt�:ÓuˆDØ˜‰Ø˜r‘k�Ø—
‘
˜5  a ™=¨%°°Q°©-¸1ÈÐ\eÐrtð  }K�
ô  LØ�L‰L˜D ™N×/Ñ/Ó1Ð2°"°U°GÐ<Ô=¸r¿}¹}ÈWÔ?UÐWY×WdÑWdÐeqÔWrÐtv÷  uBñ  uBð  COô  uPØ�L‰L˜ "¨SˆLÕ1ò 8Pð /ð" ‡L�LÐ`ÔaØ‡K�K”Ð1Ñ1°s€KÔ;¼S¿Y¹YÀs½^ùò7 7ùÒ8Uùâ2ùÒ4Ws   ÁO4
ÁO9Ã O>Ã2P
c                óê  — t        «        t        «       }|d   }|d   }g g g g f\  }}	}
}g }|D ]¤  \  }}t        |«      \  }}|j                  |«       |	j                  t	        j
                  |d   t         t        «      t        z  «       |
j                  |d   d d …df   «       |j                  |d   d d …df   «       |j                  |«       Œ¦ t        t	        j                  |«      «      }t        t	        j                  |	«      «      }t        t	        j                  |
«      «      }t	        j                  |«      j                  t        «      }t        |j                  d   «      }t        |«      }t        j                  j!                  |j#                  «       |d¬«      }|j%                  «       j'                  d«      }t)        |«      |z
  |z  j+                  d	¬
«      }g }t-        d«      }d }d}t/        | «      D �]  }|j1                  «        |j3                  d¬«       t        j4                  d|t)        |«      ft        j6                  ¬«      }t        j8                  |«      }|d   |   } | j;                  «       |z  d| z
  j;                  «       |z  z   }! ||!||«      \  }"}#t=        j>                  |"|«      }$t=        j@                  |#||¬«      }%|$d|%z  z   }&|&jC                  «        |jE                  «        t        jF                  |#«      jI                  «       jK                  «       }'t-        |dz   «      t-        |&jI                  «       «      t-        |$jI                  «       «      t-        |%jI                  «       «      t-        tM        |'|«      xs d«      dœ}(|j                  |(«       |(d   |k  s�Œ½|(d   }|dz   }|jO                  «       jQ                  «       D �)�*ci c]$  \  })}*|)|*jI                  «       jS                  «       “Œ& }})}*�Œ |€tU        d«      ‚|jW                  |«       |jY                  «        t        jZ                  t/        |«      D �+cg c]  }+t]        ||||d|+z   ¬«      ‘Œ c}+«      jK                  «       },t        j^                  «       5   |t        j`                  |«      t        jb                  t)        |«      t        j6                  ¬«      |«      \  }}#d d d «       t        jF                  #«      jK                  «       }-|jK                  «       }.g }/g }0te        |«      D �]³  \  }+\  }}tg        |+|z  |+dz   |z  «      }1|d   |d   }3}2|,d d …|1f   t        z  }4|.|1   t        z  }5|4ji                  d«      }6|4jk                  d«      }7|2|3|6d d …d f   z  z   }8|2|3|5d d …d f   z  z   }9|d   }:|/j                  tm        |d   jo                  «       «      t-        t	        jp                  |6|5z
  «      ji                  «       «      t-        t	        j:                  t	        jh                  |6|5z
  dz  «      «      «      ts        |8|9«      ts        |8|:«      t-        |7ji                  «       «      t-        |7ju                  «       «      tw        |-|1   ||1   «      t        |d   jo                  «       «      dœ	«       |0j                  |2d    |3d    |4d d …d d …d f   z  z   «       �Œ¶ ty        |j                  d   «       t{        ||,|-|.|«       t|        j                  dd¬ «       t	        j€                  t|        d!z  t	        j‚                  |D ��cg c]!  \  }}tm        |d   jo                  «       «      ‘Œ# c}}«      |d   d   d   |d   d   d   |,j…                  |t)        |«      |«      t        z  t	        jZ                  |0d¬"«      |-j…                  t)        |«      |«      t	        j‚                  d#d#g«      t	        j‚                  d$«      t	        j‚                  |D ��cg c]!  \  }}t        |d   jo                  «       «      ‘Œ# c}}«      ¬%«
       t|        d&z  };t        j†                  |jO                  «       |j                  d   |t        d'd(d)œ|;«       d*d'd'd+|D ��cg c]!  \  }}tm        |d   jo                  «       «      ‘Œ# c}}dd,|d-d.gd/œd0d1d2d3œd#d$d4d5œ| |||||d   d   |||d6œ	|/d7d8d9d:œg d;¢g d<¢d=œ}<t|        d>z  j‰                  t‹        jŒ                  |<d'd¬?«      d@¬A«       t�        |<«       |<S c c}*})w c c}+w # 1 sw Y   �ŒaxY wc c}}w c c}}w c c}}w )BNrO   rP   rC   rE   r	   rF   gñhãˆµøä>)ÚlrÚweight_decayéÈ   )rÈ   Úinfr   T)Úset_to_noner   r°   )Ú
pos_weightgffffffÖ?g        )r,  r*  r+  r‡   r-  r*  z%No diffusion training epoch completedi3(5)ræ   rA   rB   Úscan_pos_cad_mmr@  r?   rH   )	ÚrunÚsigned_normal_MAE_mmÚsigned_normal_RMSE_mmÚ,node_correspondent_reconstruction_Chamfer_mmÚraw_registered_scan_Chamfer_mmÚ)mean_stochastic_signed_deformation_std_mmÚ(max_stochastic_signed_deformation_std_mmr‡   rH   )ÚparentsÚexist_okúgenerated_pointclouds.npzrd   u   ì°�íž˜Ú,constant_diagnostic_unlearnable_single_class)	r@  rA   rB   Úgenerated_signed_normal_mmÚgenerated_pointcloud_mmÚrisk_probabilityÚdefect_typeÚdefect_type_statusrH   ú#conditional_diffusion_diagnostic.ptFz>two weak/unvalidated NG runs; not a validated predictive model)Ú
state_dictr‰   Údiffusion_stepsÚdeformation_scale_mmÚproduction_validÚwarningÚ5conditional_diffusion_weak_label_diagnostic_completedz†conditional DDPM epsilon predictor over CAD-node signed normal deformation; point = CAD position + CAD normal * generated displacementz8normalized XLS process_x with observed and imputed maskszposition_mm / 1000rq   )Úglobal_process_xÚlocal_heaterÚCAD_geometryu1   cad_to_scan_normal_residual_mm clipped to Â±30 mmz"10 mm weak defect probability/masku   both runs are ì°�íž˜)Úsigned_normal_deformationr‡   Útypez?two supplied runs have one observed defect class and no OK data)r   ÚstatusÚreason)	ÚepochsÚlearning_rater~  Úsample_stepsÚstochastic_samplesÚloss_initialÚ	loss_bestÚselected_epochrV  zHCAD-node signed-normal displacement against the weak registered residualz2generated vs CAD-node weak residual reconstructionzigenerated CAD-node cloud vs subsampled registered fused scan; includes sampling and registration mismatch)ÚMAE_RMSEro  rp  )zDregistration_independently_validated=false for both paired artifactszTdefect_extent_observed=false; risk target is a weak geodesic dilation around a pointzpheater_projection_valid=false; local provisional heater values are zero-imputed and their false mask is suppliedz=two NG runs and one CAD prevent a run/CAD held-out evaluationu4   defect type is constant ì°�íž˜ and cannot be learned)r  r.  rC  ru  r|  )rˆ  r€  Úgeneralization_measuredrä   ÚrunsÚindependent_samplesÚconditioningÚtargetsrz  ÚtrainingÚmetricsÚmetric_interpretationÚlimitationsÚoutputszreport.json©Úensure_asciiÚindentúutf-8©Úencoding)Hr   r_   rz   rW   r!   ÚcliprL  r   r.   r&   r%   r|   rJ   r³   r   ÚoptimÚAdamWÚ
parametersr·   Ú	clamp_minr*   rã   rn   r+   ÚtrainÚ	zero_gradÚrandintrá   Ú
randn_likerâ   ÚFÚmse_lossÚ binary_cross_entropy_with_logitsÚbackwardÚstepÚsigmoidÚdetachÚnumpyrÂ   r}  ÚitemsÚclonerS   Úload_state_dictÚevalrl   rí   Úno_gradÚ
zeros_liker)   rà   ÚslicerÕ   Ústdr'   r/   rM  rØ   rÈ   rË   r&  rc  r  ÚmkdirÚsavez_compressedr"   ÚreshapeÚsaveÚ
write_textÚjsonÚdumpsÚ_write_html)=rŠ  r‹  r~  rT  rŒ  rS  rO   rW  Úcondition_partsÚtarget_partsÚ
risk_partsÚbinary_partsÚmetadatarL   r/   r„   Úcondition_metar½   Úrisk_targetÚbinary_targeträ   rå   Ú	optimizerÚpositiverj  rV  Ú	best_lossÚ
best_stateÚ
best_epochr,  rŸ   Únoiser°   ÚnoisyÚpredicted_noiseÚ
risk_logitr+  Ú	risk_lossÚlossÚprobabilityrY  r:   r   r,   r[  ry  Ú	target_npÚper_runÚcad_point_samplesÚslrp   rq   Úgenerated_mmÚ	target_mmrÕ   ÚuncertaintyÚpredicted_cloudÚtarget_cloudÚ
scan_cloudÚ
checkpointÚreports=                                                                r   rl  rl  ó   s˜	  € ÜÔÜ‹;€D $ y¡/˜°t¸OÑ7L°1Ø>@À"ÀbÈ"¸nÑ;€O�\ :¨|Ø€HÛ‰ˆˆ4Ü$/°Ó$5Ñ!ˆ	�>Ø×Ñ˜yÔ)Ø×ÑœBŸG™G DÐ)IÑ$JÔMaÐLaÔcwÓxô  |Pñ  Pô  	QØ×Ñ˜$Ð8Ñ9º!¸Q¸$Ñ?Ô@Ø×Ñ˜DÐ!3Ñ4²Q¸°TÑ:Ô;Ø�‰˜Õ'ð ô œŸ™ Ó7Ó8€IÄ7Ì2Ï>É>ÐZfÓKgÓCh¸&Ôxô  AC÷  AOñ  AOð  PZó  A[ó  y\Ðjuô  np÷  n|ñ  n|ð  }Ió  nJ÷  nQñ  nQô  RVó  nWð  ^kÜ'¨	¯©¸Ñ(:Ó;€EÜ˜Ó)€HÜ—‘×!Ñ! %×"2Ñ"2Ó"4¸ÐUYÐ!ÓZ€IØ�‰Ó ×*Ñ*¨1Ó-€HÜ�{Ó# hÑ.°(Ñ:×AÑAÀcÐAÓJ€JØ&(€G´e¸E³l¨)ÐkoÀJÐ~Ðq{Ü�v—ˆØ�‰Œ�y×*Ñ*°tÐ*Ô<Ü—=‘=  O´c¸&³k°^Ì5Ï:É:ÔVˆÜ× Ñ  Ó(ˆ°¸&Ñ1AÀ(Ñ1K¨$Ø—	‘	“˜fÑ$¨¨D©§¡Ó'8¸5Ñ'@Ñ@ˆÙ&+¨E°8¸YÓ&GÑ#ˆ˜Ü—*‘*˜_¨eÓ4ˆÜ×6Ñ6°zÀ;Ð[eÔfˆ	Ø˜˜y™Ñ(ˆØ�‰Œ˜Ÿ™Ô)Ü—m‘m JÓ/×6Ñ6Ó8×>Ñ>Ó@ˆÜ˜e a™iÓ(´5¸¿¹»Ó3GÔTYÐZa×ZhÑZhÓZjÓTkÔuzð  |E÷  |Lñ  |Ló  |Nó  vOô  \aô  beð  fqð  s@ó  bAò  bHð  EHó  \Iñ  JˆØ�‰�sÔØˆw‰<˜)Ô#Ø˜G™ˆI°5¸1±9 jØHM×HXÑHXÓHZ×H`ÑH`ÔHbÔcÑHb¹*¸#¸u˜#˜uŸ|™|›~×3Ñ3Ó5Ñ5ÐHbˆJÓcð ð  ÐÜÐBÓCÐCØ	×Ñ˜*Ô% u§z¡z¤|Ü—‘Ôw|ð  ~Eô  xFó  Gñ  xFÐnsœ[¨°	¸8À\ÐX`ÐchÑXhÖið  xFñ  Gó  H÷  Nñ  Nó  P€IÜ	�‰�Ùœe×.Ñ.¨vÓ6¼¿¹ÄCÈÃKÔW\×WaÑWaÔ8bÐdmÓn‰ˆˆ:÷ 
ä—}‘} ZÓ0×6Ñ6Ó8ÐØ—‘“€IØ$&€GØÐÜ% g×.Ñˆ‰y��4Ü�5˜1‘9˜u q™y¨A™oÓ.ˆ¸dÀ<Ñ>PÐRVÐWcÑRd°V°Ø ¢ B Ñ'Ô*>Ñ>ˆØ˜b‘MÔ$8Ñ8ˆ	Ø× Ñ  Ó#ˆ°<×3CÑ3CÀAÓ3F [Ø ¨ªa°¨g©Ñ 6Ñ6ˆØ˜V i²°4°Ñ&8Ñ8Ñ8ˆØÐ+Ñ,ˆ
Ø�‰Ü�t˜H‘~×*Ñ*Ó,Ó-Ü$)¬"¯&©&°¸	Ñ1AÓ*B×*GÑ*GÓ*IÓ$JÜ%*¬2¯7©7´2·7±7¸DÀ9Ñ<LÐQRÑ;RÓ3SÓ+TÓ%UÜ<DÀ_ÐVbÓ<cÜ.6°È
Ó.SÜ9>¸{×?OÑ?OÓ?QÓ9RÜ8=¸k¿o¹oÓ>OÓ8PÜ!Ð"2°2Ñ"6¸ÀbÑ8IÓJÜ'+¨DÐ1JÑ,K×,PÑ,PÓ,RÓ'Sñ

ô 
	ð 	× Ñ   T¡¨V°D©\¸LÊÊAÈtÈÑ<TÑ-TÑ!TÖUð' /ô( ˜Ÿ™¨Ñ+Ô,¬f°T¸9ÐFVÐXaÐcjÔ.kÜ‡I�I�d T€IÔ*Ü×ÑœÐ9Ñ9Ü!Ÿz™zÑU\Ô*]ÑU\É'È!ÈT¬3¨t°H©~×/BÑ/BÓ/DÕ+EÐU\Ò*]Ó^Ø#*¨1¡:¨a¡=°Ñ#>È7ÐSTÉ:ÐVWÉ=ÐYeÑKfØ3<×3DÑ3DÀWÌcÐRYËlÐ\]Ó3^ÔauÑ3uÜ02·±Ð9JÐQRÔ0SØ)9×)AÑ)AÄ#ÀgÃ,ÐPQÓ)RÜ$&§J¡J°¸(Ð/CÓ$DÔY[×YcÑYcð  eSó  ZTÜ02·
±
Ñxô  <AÑxÑmtÐmnÐpt¼DÀÐF_ÑA`×AeÑAeÓAgÕ<hÐxò  <Aó  1BõCô Ð<Ñ<€JÜ	‡J�J˜e×.Ñ.Ó0À9Ç?Á?ÐSTÑCUÐjyÜ(<ÐRWØ[ñ]à^hôjð JÐ_dð  BGð ZÙ;BÔC¹7±°°4”�T˜(‘^×(Ñ(Ó*Õ+¸7ÒCÐ\]Ø-gð  zBØ*>ÀÐ)IñKà1dð  oSð  ]sñ  tØ!)Ð5cð  pqñ  rØ%¸ÐZið  |HØ+2ÀGÈAÁJÈwÑDWÐfoð  DNð  [bñcàØ.xð  k_ð  Cnñ  "oò eò Yñ€Fô 	ˆ=Ñ×$Ñ$¤T§Z¡Z°ÀUÐSTÔ%UÐ`gÐ$ÔhÜ�ÔØ€Mùó} dùò Gß	‰üó: +^ùó <Aùó Ds+   Ï.)eÑ'eÒ*AeÝ!&e#à2&e) â3&e/åe c                óv   — dj                  d„ | d   D «       «      }t        dz  j                  d|› d�d¬«       y )	Nr  c              3  ó²   K  — | ]O  }d t        j                  |d   «      › d|d   d›d|d   d›d|d   d›d|d   d›d|d   d	   �|d   d	   nd› d�–— ŒQ y
­w)z<tr><td>rl  z	</td><td>rm  z.3frn  ro  rp  r‡   rÅ   Nzn/az
</td></tr>)ÚhtmlÚescape)rK   rY  s     r   rN   z_write_html.<locals>.<genexpr>W  s*  è ø€ ð  sñ  arð  Z]�XœdŸk™k¨#¨e©*Ó5Ð6°iÀÐDZÑ@[Ð\_Ð?`Ð`iÐjmð  oFñ  kGð  HKð  jLð  LUð  VYð  ZHñ  VIð  JMð  UNð  NWð  X[ð  \|ñ  X}ð  ~Að  WBð  BKð  adð  ekñ  alð  mqñ  arð  a~ð  LOð  PVñ  LWð  X\ò  L]ð  DIð  KJð  JTô  Uñ  arùs   ‚AAr˜  z
index.htmluÀ  <!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Conditional CAD diffusion diagnostic</title>
<style>body{font:16px/1.5 system-ui,sans-serif;max-width:1280px;margin:2rem auto;padding:0 1rem;color:#172033;background:#f6f8fb}.warning{background:#fff2cc;border-left:5px solid #d99b00;padding:1rem}img{max-width:100%;background:white;border:1px solid #ccd3df;border-radius:8px}table{border-collapse:collapse;background:white}th,td{padding:.5rem .65rem;border:1px solid #ccd3df;text-align:right}th:first-child,td:first-child{text-align:left}</style>
<h1>CAD + process â†’ conditional deformed point-cloud diffusion</h1><p class="warning"><strong>Weak-label diagnostic only.</strong> Two NG runs, unvalidated registration, provisional heater projection, and a single observed defect class (<code>ì°�íž˜</code>) mean this is neither a validated predictor nor a generalization result.</p>
<p>The DDPM generates signed normal CAD-node displacement, then reconstructs each point as <code>CAD position + CAD normal Ã— displacement</code>. Risk is shown at CAD nodes; defect type remains the constant diagnostic value <code>ì°�íž˜</code> because it is unlearnable from one class.</p>
<h2>Architecture</h2><img src="architecture.png" alt="Conditional diffusion architecture"><h2>Training</h2><img src="training.png" alt="Denoising loss curve"><h2>Generated point clouds and risk highlight</h2><img src="pointcloud_comparison.png" alt="CAD target and generated point clouds">
<h2>Weak-target fit metrics (mm)</h2><table><thead><tr><th>Run</th><th>MAE</th><th>RMSE</th><th>Correspondent Chamfer</th><th>Raw scan Chamfer</th><th>Weak risk AP</th></tr></thead><tbody>uÐ   </tbody></table><p><a href="report.json">full report</a> Â· <a href="generated_pointclouds.npz">generated point clouds</a> Â· <a href="conditional_diffusion_diagnostic.pt">diagnostic checkpoint</a></p></html>rŸ  r   )Újoinr  r¿  )râ  Úrowss     r   rÂ  rÂ  V  ss   € Ø�7‰7ñ  sð  agð  hqò  aró  só  s€DÜˆ<Ñ×#Ñ#ð )}ð
 ~Bð  }Cð  CYð%\ð
 gnð $õ or   c            	     óŠ  — t        j                  t        ¬«      } | j                  d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        |j                  |j                  |j                  |j                  |j                  «      }t        t!        j"                  |d   |d   d   |d   |d   dœdd¬«      «       y )N)Údescriptionz--allow-diagnostic-weak-labelsÚ
store_truez:required because current labels are explicitly unvalidated)ÚactionÚhelpz--epochséP   )r‡  Údefaultz--learning-rategü©ñÒMb`?z--diffusion-stepsé2   z	--samplesé   z--sample-stepsé   z`Refusing unvalidated targets. Pass --allow-diagnostic-weak-labels to run the two-run diagnostic.rˆ  r—  r�  r˜  rz  )rˆ  r�  r˜  rz  Fr?   rœ  )ÚargparseÚArgumentParserr©   Úadd_argumentrX   rn   Ú
parse_argsÚallow_diagnostic_weak_labelsÚ
SystemExitrl  rŠ  r‹  r~  rT  rŒ  ÚprintrÀ  rÁ  )ÚparserÚargsrâ  s      r   Úmainrü  `  sG  € Ü×$Ñ$´Ô9€FØ
×ÑÐ8Àð  UQÐô  RØ
×Ñ˜
¬°bÐÔ9Ø
×ÑÐ)´¸tÐÔDØ
×ÑÐ+´#¸rÐÔBØ
×Ñ˜¬#°qÐÔ9Ø
×ÑÐ(¬s¸BÐÔ?Ø×ÑÓ€DØ×,Ò,ÜÐ{Ó|Ð|Ü�—‘˜d×0Ñ0°$×2FÑ2FÈÏÉÐVZ×VgÑVgÓh€FÜ	Œ$�*‰*  xÑ 0¸vÀjÑ?QÐR]Ñ?^ÐkqÐr{Ñk|ð  NTð  Ubñ  Ncñ  dð  sxð  ABô  Cõ  Dr   Ú__main__)r   rÒ   r   ztorch.dtyper¤   r   )r/   údict[str, np.ndarray]r¤   rÒ   )r¤   údict[str, Any])r/   rþ  r¤   z!tuple[np.ndarray, dict[str, Any]])r²   rX   r¤   údict[str, Tensor])r¼   rÒ   r½   rÒ   r¤   zfloat | None)r¼   rÒ   r½   rÒ   r¤   zdict[str, float | None])i   )rÉ   rÒ   r½   rÒ   rÐ   rX   r¤   rn   )rä   r|   r„   r   rå   r   r²   rX   ræ   rX   r¤   r   )r‰   rX   r¤   r¥   )rS  rÿ  rT  rÒ   r‡   rÒ   rU  rÒ   rV  zlist[dict[str, float]]r¤   r¥   )rŠ  rX   r‹  rn   r~  rX   rT  rX   rŒ  rX   r¤   rÿ  )râ  rÿ  r¤   r¥   )r¤   r¥   )3r©   Ú
__future__r   ró  rå  rÀ  r’   Úpathlibr   Útypingr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotr  r²  r!   r   r   r   Útorch.nn.functionalÚ
functionalr«  rS  r
   r   r   r—  r   r  rL  r#   r   r=   r_   rz   ÚModuler|   r³   rÂ   rË   rØ   r·  rí   r&  rc  rl  rÂ  rü  r¦   © r   r   Ú<module>r     sô   ðñõ #ã Û Û Û Ý Ý ã Ø €
‡�ˆuÔ Ý Û Û ß ß Ð ç FÑ FÝ %ð Ð'Ñ'€ØÐ ð 5:·M±Mô /ótó.8ó.ô.6 "§)¡)ô 6ó.8ó4ó`ô]ð €‡�ƒòó ðóXó* LóF`óFoóDð ˆzÒÙ…Fð r   