Ë
    PJºjs  ã                  óT  — 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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m Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d
dl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d
dl2m3Z3 d
dl4m5Z5 e(dz  Z6ejn                  jq                  dd«      Z9ddœd!d„Z:ejv                  fd"d„Z<d#d„Z=	 d$	 	 	 	 	 d%d„Z>d&d„Z?	 	 	 	 	 	 d'd„Z@	 	 	 	 	 	 	 	 d(d„ZAd)d„ZBd*d„ZCd+d„ZDd,d-d„ZEd.d„ZFd/d„ZGeHd k(  r eG«        yy)0a%  Train weak-label diagnostics and transfer every model output to one CAD graph.

The experiment uses run 18h01 because its diagnostic registration has determinant
+1. Labels and registration are still unvalidated; all metrics are training-set
representation checks, never held-out performance.
é    )ÚannotationsN)ÚPath)ÚCallableÚAgg)ÚcKDTree)Úaverage_precision_score)ÚTensorÚnné   )
Ú	CNN2DUNetÚDGCNNSegÚFNO2dÚMeshGraphProcessorÚPhysicsConstrainedRiskGNNÚPointNetSegÚSparseUNetOptionalÚTabularSurrogateÚUNet3DÚUVNetFaceModel)
ÚROOTÚ
brep_inputÚgraph_inputsÚimage_inputÚpoint_inputsÚprocess_conditionsÚsparse_batch_collateÚsparse_voxel_inputÚtabular_inputÚvoxel_input)Úload_training_data)Úseed_everythingzresults/models/cad_predictionsÚ
MOLTEX_RUNÚ18h01©Úscopec          	     ó  — |j                  «       j                  dd«      j                  dd«      }t        dz  t        › d|› d�z  }|j                  j                  dd¬«       t        j                  | j                  «       j                  «       D ��ci c]2  \  }}||j                  «       j                  «       j                  «       “Œ4 c}}ddt        |xs	 t        › d	�d
dœ|«       t        |j                  t        «      «      S c c}}w )zBPersist the exact selected state used for the displayed CAD field.Ú/Ú-Ú Úcheckpointsz.ptT©ÚparentsÚexist_okFú weak-label diagnostic fitz@Weak-label training-set diagnostic only; not a production model.)Ú
state_dictÚproduction_validÚgeneralization_measuredÚrunÚcheckpoint_scopeÚwarning)ÚlowerÚreplaceÚOUTÚRUNÚparentÚmkdirÚtorchÚsaver/   ÚitemsÚdetachÚcpuÚcloneÚstrÚrelative_tor   )ÚmodelÚnamer%   ÚslugÚpathÚkeyÚvalues          ú!models/compare_cad_predictions.pyÚweak_fit_checkpointrJ   (   sñ   € à�:‰:‹<×Ñ  SÓ)×1Ñ1°#°sÓ;€DÜ�Ñ¤C 5¨¨$¨¨sÐ!3Ñ3€DØ‡K�K×Ñ˜d¨TÐÔ2Ü	‡J�JØKP×K[ÑK[ÓK]×KcÑKcÔKeÔfÑKe¹Z¸SÀ%�s˜EŸL™L›N×.Ñ.Ó0×6Ñ6Ó8Ñ8ÐKeÒfØ!Ø#(ÜØ!ÒG¬ uÐ,FÐ%GØUñð ôô ˆt×Ñ¤Ó%Ó&Ð&ùó gs   Â7D
c                ó0   — t        j                  | |¬«      S )N©Údtype)r;   Ú	as_tensor)rH   rM   s     rI   ÚtensorrO   8   s   € Ü�?‰?˜5¨Ô.Ð.ó    c                ó‚  — | |   ||   }}|dk\  j                  «       j                  d«      }t        |«      |z
  |z  j                  d¬«      }t	        j
                  |||¬«      }t        j                  |«      }dd||z  j                  «       z  dz   |j                  «       |j                  «       z   dz   z  z
  }	||	z   S )Nç      à?r   éÈ   )Úmax)Ú
pos_weighté   )ÚsumÚ	clamp_minÚlenÚclampÚFÚ binary_cross_entropy_with_logitsr;   Úsigmoid)
ÚlogitÚtargetÚvalidÚselected_logitÚselected_targetÚpositiveÚweightÚbceÚprobabilityÚdices
             rI   Ú	risk_lossrh   <   sÃ   € Ø&+¨E¡l°F¸5±M�O€NØ 2Ñ%×*Ñ*Ó,×6Ñ6°qÓ9€HÜ�?Ó# hÑ.°(Ñ:×AÑAÀcÐAÓJ€FÜ
×
,Ñ
,¨^¸_ÐY_Ô
`€CÜ—-‘- Ó/€KØ��[ ?Ñ2×7Ñ7Ó9Ñ9¸AÑ=À+Ç/Á/ÓBSÐVe×ViÑViÓVkÑBkÐnoÑBoÑpÑp€DØ�‰:ÐrP   c                óê  — t         j                  j                  | j                  «       |d¬«      }g }t	        d«      }d}	d }
t        j                  «       }t        |«      D ]Ü  }| j                  «        |j                  d¬«        |«       }t        |||«      }|j                  «        |j                  «        t	        |j                  «       «      }|j                  |«       ||k  sŒ‰||dz   }	}| j                  «       j!                  «       D ��ci c]$  \  }}||j                  «       j#                  «       “Œ& }
}}ŒÞ |
€t%        d«      ‚| j'                  |
«       | j)                  «        t        j*                  «       5  t        j,                   |«       «      j/                  «       j1                  «       }d d d «       |d   ||	|t        j                  «       |z
  d	œfS c c}}w # 1 sw Y   Œ1xY w)
Ngñhãˆµøä>)ÚlrÚweight_decayÚinfr   T)Úset_to_noner   zNo training epoch completed)Úloss_initialÚ
loss_finalÚselected_epochÚepochsÚtraining_seconds)r;   ÚoptimÚAdamWÚ
parametersÚfloatÚtimeÚperf_counterÚrangeÚtrainÚ	zero_gradrh   ÚbackwardÚstepr>   Úappendr/   r=   r@   ÚRuntimeErrorÚload_state_dictÚevalÚno_gradr]   r?   Únumpy)rC   Úforwardr_   r`   rq   rj   Ú	optimizerÚhistoryÚ	best_lossÚ
best_epochÚ
best_stateÚstartÚepochr^   ÚlossrH   rG   rf   s                     rI   Úfitr�   F   sž  € ä—‘×!Ñ! %×"2Ñ"2Ó"4¸È$Ð!ÓO€IØ€GÜ�e“€I¨1˜j¸4¨jÜ×ÑÓ€EÜ�v–ˆØ�‰Œ�y×*Ñ*°tÐ*Ô<Ù“	ˆ¤)¨E°6¸5Ó"A˜4Ø�‰Œ˜Ÿ™Ô)Ü�d—k‘k“mÓ$ˆ g§n¡n°UÔ&;Ø�9ÓØ$)¨5°1©9�zˆIØHM×HXÑHXÓHZ×H`ÑH`ÔHbÔcÑHb¹*¸#¸u˜#˜uŸ|™|›~×3Ñ3Ó5Ñ5ÐHbˆJÒcð ð ÐÜÐ8Ó9Ð9Ø	×Ñ˜*Ô% u§z¡z¤|Ü	�‰�¬¯©±g³iÓ(@×(DÑ(DÓ(F×(LÑ(LÓ(N˜+�Ø¨°©À9Ø+5ÀÜ-1×->Ñ->Ó-@À5Ñ-HñJð Jð Jùó d÷ 
ˆús   Ä)G#Æ7G)Ç)G2c                óF   — |t        |«      j                  | d¬«      d      S )Néÿÿÿÿ©Úworkersr   )r   Úquery)r’   Úcad_posr_   s      rI   Únearest_targetr”   ]   s'   € Ø”'˜'Ó"×(Ñ(¨¸Ð(Ó;¸AÑ>Ñ?Ð?rP   c                ó<   — t        j                  d| ||      |«      S )Nzni,ni->n)ÚnpÚeinsum)r_   Úsource_triangleÚbarycentricÚfacess       rI   Úbarycentric_targetr›   a   s   € ä�9‰9�Z ¨¨oÑ(>Ñ!?ÀÓMÐMrP   c                ó2  — ||   }t        j                  | t         j                  «      d d …d f   |z  }t        j                  t	        |«      t         j                  «      }t        j                  t	        |«      t         j                  «      }t         j
                  j                  ||j                  «       |j                  «       «       t         j
                  j                  ||j                  «       |j                  «       «       |dkD  }	t        j                  t	        |«      t         j                  «      }
||	   ||	   z  |
|	<   t        j                  t	        |«      t         j                  «      }|	j                  «       s8t        ||	   «      j                  ||	    d¬«      \  }}|
|	   |   |
|	 <   |||	 <   |
j                  t         j                  «      |j                  t         j                  «      |j                  t         j                  «      fS )Ng»½×Ùß|Û=r�   r�   )r–   ÚasarrayÚfloat64ÚzerosrY   ÚaddÚatÚravelÚallr   r’   ÚastypeÚfloat32)Úvaluesr˜   r™   rš   r“   ÚverticesÚweightedÚtotalrd   ÚdirectÚfieldÚdistanceÚfill_distanceÚ
fill_indexs                 rI   Úbarycentric_to_cadr¯   f   s…  € ð �_Ñ%€HÜ�z‰z˜&¤"§*¡*Ó-ªa°¨gÑ6¸ÑD€HÜ�H‰H”S˜“\¤2§:¡:Ó.€E¼¿¹Ä#ÀgÃ,ÔPR×PZÑPZÓ9[°Ü‡F�F‡I�Iˆe�X—^‘^Ó% x§~¡~Ó'7Ô8¼"¿&¹&¿)¹)ÀFÈHÏNÉNÓL\Ð^i×^oÑ^oÓ^qÔ:rØ�e‰^€F¤R§X¡X¬c°'«l¼B¿J¹JÓ%G˜UÐY^Ð_eÑYfÐioÐpvÑiwÑYwÈÈvÉÜ�x‰xœ˜G›¤b§j¡jÓ1€HØ�:‰:Œ<Ü$+¨G°F©OÓ$<×$BÑ$BÀ7ÈFÈ7ÑCSÐ]_Ð$BÓ$`Ñ!ˆ�zØ˜v™ zÑ2ˆˆvˆg‰È°H¸f¸WÑ4EØ�<‰<œŸ
™
Ó# V§]¡]´2·:±:Ó%>ÀÇÁÔPR×PZÑPZÓ@[Ð[Ð[rP   c                ól  — t        j                  | j                  j                  «       j	                  «       t         j
                  «      }t        j                  |t         j
                  «      }|j                  |j                  k7  r%t        d|j                  › d|j                  › �«      ‚t        t        j                  |d¬«      «      t        |«      k7  rt        d«      ‚t        |j                  «       «      D ��ci c]  \  }}t        |«      |“Œ }}}	 |j                  «       D �cg c]  }|t        |«         ‘Œ }}t        |«      t        |«      k7  rt        d«      ‚| j                  j                  d	k7  s| j                  j                  d
   d
k7  r+t        dt        | j                  j                  «      › �«      ‚| j                  t!        j"                  |t         j$                  | j                  j&                  ¬«      df   S c c}}w c c}w # t        $ r}t        d«      |‚d}~ww xY w)ac  Return sparse logits in the exact prepared ``[batch, x, y, z]`` order.

    MinkowskiEngine is allowed to choose its own internal coordinate ordering.
    The weak target and the saved ``surface_sample_voxel_index`` instead use the
    explicit sparse NPZ row order, so coordinate equality is checked before
    gathering logits back into that order.
    z+Sparse U-Net coordinate shape changed: got z, expected r   )Úaxisz2Sparse U-Net returned duplicate output coordinateszHSparse U-Net output coordinates do not match the prepared coordinate setNzCSparse U-Net output coordinate set has unexpected extra coordinatesrV   r   z:Sparse U-Net diagnostic requires one logit per voxel, got )rM   Údevice)r–   r�   ÚCr>   r?   Úint32Úshaper   rY   ÚuniqueÚ	enumerateÚtolistÚtupleÚKeyErrorr[   Úndimr;   rN   Úlongr²   )	ÚoutputÚprepared_coordsÚoutput_coordsÚexpectedÚindexÚrowÚrow_for_coordinateÚorderÚexcs	            rI   Ú sparse_logits_on_prepared_coordsrÆ   u   sÊ  € ô —J‘J˜vŸx™xŸ™Ó0×4Ñ4Ó6¼¿¹ÓA€MÜ�z‰z˜/¬2¯8©8Ó4€HØ×Ñ˜hŸn™nÒ,ÜØ9¸-×:MÑ:MÐ9NÈkÐZb×ZhÑZhÐYiÐjólð 	lä
Œ2�9‰9�]¨Ô+Ó,´°MÓ0BÒBÜÐOÓPÐPÜ>GÈ×H\ÑH\ÓH^Ô>_Ô`Ñ>_±
°°sœ% ›* eÑ+Ð>_ÐÑ`ðpØ;C¿?¹?Ô;LÓMÑ;L°CÐ#¤E¨#£JÓ/Ð;LˆÐMô ˆ5ƒz”S˜Ó'Ò'ÜÐ`ÓaÐaØ‡x�x‡}�}˜Ò˜VŸX™XŸ^™^¨AÑ.°!Ò3ÜÐWÔX]Ð^d×^fÑ^f×^lÑ^lÓXmÐWnÐoÓpÐpØ�8‰8”E—O‘O E´·±ÀFÇHÁHÇOÁOÔTÐVWÐWÑXÐXùó aùâMøÜò pÜÐeÓfÐloÐoûðpús0   Ä HÄH Ä,HÅH ÈH È	H3È"H.È.H3c           
     óœ  — t        j                  t        j                  | t        «      dd«      } t        j                  |t        «      }| dk\  }t        ||z  j                  «       «      }t        ||z  j                  «       «      }t        |j                  «       «      }t        d|«      }t        j                  | | «      | d  }t        t        || «      «      |t        d|«      z  d|z  t        dt        |j                  «       «      |z   «      z  t        ||   j                  «       |z  «      t        |j                  «       «      |dœS )Nr   r   rR   rV   )Úaverage_precisionÚthreshold_iouÚthreshold_diceÚtop_k_recallÚpredicted_positive_nodesÚtarget_positive_nodes)
r–   Úclipr�   rv   ÚboolÚintrW   rT   Úargpartitionr   )	r«   ÚbinaryÚtruthÚpredÚintersectionÚunionÚ	positivesÚkÚtops	            rI   ÚmetricsrÚ   �   s  € Ü�G‰G”B—J‘J˜u¤eÓ,¨a°Ó3€EÜ�J‰J�vœtÓ$€EØ�B‰;€DÜ˜˜u™×)Ñ)Ó+Ó,€L´c¸4À%¹<×:LÑ:LÓ:NÓ6O¨eÜ�E—I‘I“KÓ €I¤c¨!¨YÓ&7 !Ü
�/‰/˜% ! Ó
$ a R SÐ
)€Cä"Ô#:¸5À%Ó#HÓIØ%¬¨A¨u«Ñ5Ø˜lÑ*¬S°´C¸¿¹»
³OÀiÑ4OÓ-PÑPÜ˜e C™jŸn™nÓ.°Ñ2Ó3Ü$'¨¯©«
£OØ!*ñð rP   c                 óÒ)  ‡Z‡[‡\‡]‡^‡_‡`‡a‡b‡c‡d‡e‡f‡g‡h‡i‡j‡k‡l‡m‡n‡o— t        j                  t        dt        dt        j                  «       «      «      «       t        «        t        dt        › d�z  } t        j                  | d¬«      5 }t        j                  |d   t        j                  «      }t        j                  |d   d d …df   t        j                  «      }t        j                  |d	   d d …df   t        «      }d d d «       t        «       \  }}}}|j                  t        «      }	t        t        j                   ||j#                  t        j                  «      gd«      |	|	dz    «      Šii }
i }i }d
ddddœ}t        j                  t        dz  d¬«      }t        j                  |d   t        j$                  «      j&                  }t        j                  t        dz  d¬«      }t)        «       }t        t        j                   |d   |d   j#                  t        j                  «      gd«      «      Šet        j                  |d   t        «      }t        j                  |d   t        j                  «      }t        j*                  |j,                  t        j                  «      }t        j                  |d   t        j$                  «      }t        j                  |d   t        j                  «      }t/        ||   ||   |«      ||<   t        |t         j                  «      }t        |«      }‰ij1                  t3        ‰e«      d«      Šddt5        ‰ej,                  d   ‰ij,                  d   ¬«      dfdt7        ‰ej,                  d   ‰ij,                  d   ¬«      dffD ]Ÿ  \  }}}t9        ||fˆdˆefd„	|||«      \  }}t;        ||«      }t=        ||   ||   ||   |«      \  |
|<   }} | dk  ||<   ||t        › d�dd d!t?        |d"kD  jA                  «       «      t?        t        jB                  | d#«      «      d$œz  ||<   Œ¡ tE        «       }!t        t        j                   |!d   |!d   j#                  t        j                  «      gd"«      d    «      Šot        j                  t        d%z  d¬«      }"t        j                  |"d&   tF        «      }#t        j                  |"d'   t>        «      }$t?        |"d(   «      }%t        j*                  tI        t        j                  |"d)   tF        «      «      t        j                  «      }&t        jJ                  |&t        «      }'t        j                  |"d*   t        j$                  «      }(t        j                  |"d+   t        j                  «      })t        j                  |"d,   t        j$                  «      }*t/        ||(|)|«      }+t        j*                  t3        |#«      t        j                  «      },t        jL                  jO                  |,|*|+«       |,|&tI        |#j&                  «      <   d |'tI        |#j&                  «      <   tQ        ‰oj,                  d   ‰ij,                  d   ¬«      Šft9        ‰fˆfˆiˆofd-„t        |&d    «      t        |'d    t         j                  «      d.«      \  }}t;        ‰fd/«      }|d"   tI        |#j&                  «         }-|-|*   }.t=        |.|(|)|«      \  |
d/<   }} | dk  |d/<   ||t        › d�d0d d1t?        |d"kD  jA                  «       «      t?        t        jB                  | d#«      «      d$œz  |d/<   	 d"d l)ŠZtU        «       }/tW        |/d2   |/d3   «      \  Šk}0t        jX                  ‰kd d …dd …f   |#«      st[        d4«      ‚t        ‰kt         j\                  «      Šjt        |0«      Šlt_        ‰lj,                  d   «      Šmd„ˆZˆjˆkˆlˆmfd5„}1t9        ‰m|1t        |,«      t        j`                  t3        |,«      t         j                  ¬6«      d.«      \  }}t;        ‰md7«      }||*   }2t=        |2|(|)||«      \  |
d7<   }} | dk  |d7<   ||t        › d�d8dd9d t?        |d"kD  jA                  «       «      t?        t        jB                  | d#«      «      dd:œ	z  |d7<   d;ddd||d<   |d=   |d>   |d?   |d@   tG        t3        |,«      «      d dAœ}te        «       d"   }4t        j                  t        dDz  d¬«      }5t        j                  |5dE   t        j                  «      }6t        t        j                   |4d   |4d   j#                  t        j                  «      gd«      d    «      Šht        j                  |5d   t        j$                  «      }7t        j                  |5d   t        j                  «      }8t/        ||7|8|«      }9tg        ‰hj,                  dF   «      Šgt9        ‰gˆgˆhfdG„t        |9«      t        j`                  t3        |9«      t         j                  ¬6«      dH«      \  }}t;        ‰gdI«      }t=        ||7|8||«      \  |
dI<   }} | dk  |dI<   ||t        › d�dJddKt?        |d"kD  jA                  «       «      t?        t        jB                  | d#«      «      d$œz  |dI<   t        dLt3        |6«      «      }:‰hd d …d |:…f   Š]|6d |: };|9d |: }<ti        ‰]j,                  dF   dM¬N«      Š\t9        ‰\ˆ\ˆ]fdO„t        |<«      t        j`                  |:t         j                  ¬6«      d.«      \  }}t;        ‰\dP«      }t=        ||7d |: |8d |: ||«      \  |
dP<   }} | dk  |dP<   ||t        › d�dQddRt?        |d"kD  jA                  «       «      t?        t        jB                  | d#«      «      d$œz  |dP<   t        tk        «       dS„ ¬T«      }=t        t        j                   |=d   |=d   j#                  t        j                  «      gd«      «      Šbt        |=dU   t         jl                  «      Š`t        j                  |=dV   t        j                  «      jo                  «       }>|>d d …d"fxx   dWz  cc<   t        |>«      Š^t        j*                  t3        ‰b«      t         jl                  ¬6«      Š_tq        ‰bj,                  d   ‰^j,                  d   ‰ij,                  d   dXdY¬Z«      Šat9        ‰aˆ^ˆ_ˆ`ˆaˆbˆifd[„t        |«      t        j`                  t3        |«      t         j                  ¬6«      d.«      \  }}t;        ‰ad\«      }||
d\<   t        j`                  t3        |«      t        «      |d\<   ||t        › d�t3        |«      d]›d^�d d_œz  |d\<   ts        «       }?tu        |?d`   j,                  d   |?dV   j,                  d   |?da   j,                  d   t        dt3        |?db   «      «      «      }@t        j                  t        dcz  ddd¬e«      }|@jw                  |df   «       |@jy                  «        t;        |@dgt3        |?dh   «      › dit        › dj�¬k«      }At        jz                  «       5   @t        |?d`   «      t        |?dl   t         jl                  «      t        |?dV   «      t        |?da   «      t        |?dm   t         jl                  «      «      }Bd d d «       |?dn   }C|?dh   j                  t        «      }Dt        j|                  Bdo   «      |D|Cz  |Ddz   |Cz   j                  «       |
dg<   t        j`                  t3        |«      t        «      |dg<   t�        j‚                  t        dpz  j…                  «       «      }EAt3        |?dh   «      › dit        › dj�|Ed<   |Ed=   |Ed>   |Ed?   d t3        |«      d]›dqt3        |?dh   «      › dr�d dsœ	|dg<   t‡        «       }Ft        j                  t        dtz  d¬«      }Gt        j                  |GdE   t        j                  «      }Ht        j                  |Gdu   t        «      }I|H|I   }Jt‰        |J||«      }Kt        jŠ                  t        jŒ                  t3        |H«      «      d d …d d f   |Ij,                  «      |I   }Lt        j*                  t3        |H«      t        j                  «      }Mt        j*                  t3        |H«      t        «      }Nt        jL                  jO                  |M|L|K«       d |Nt        jŽ                  |L«      <   t        |Fdv   «      Šct        |Fdw   t         jl                  «      Š[t‘        ‰cj,                  d   «      Šnt9        ‰nˆ[ˆcˆnfdx„t        |M«      t        |Nt         j                  «      d.«      \  }}t;        ‰ndy«      }t“        |J«      j•                  |dF¬z«      \  }O}P||L|P      |
dy<   |Odk  |dy<   ||t        › d�d{dd|t?        |Odk  jA                  «       «      t?        t        jB                  |Od#«      «      t?        |Oj                  «       «      d}œz  |dy<   t—        «       }Qt        t        j                   |Qd   |Qd   j#                  t        j                  «      gd«      |	|	dz    «      }Rt        j                  jA                  «       gt        j                  «      }St™        |Rj,                  d   «      }Tt         jš                  j�                  |TjŸ                  «       d~¬«      }Ug }Vt¡        dH«      D ]›  }Uj£                  «        t        j|                   TR«      d d …d"f   «      }Wt¥        j¦                  |Wt        S«      «      }X|Xj©                  «        |Uj«                  «        Vj­                  t?        |Xj¯                  «       «      «       Œ� t        jz                  «       5  t?        t        j|                   TR«      «      d€   «      }Yd d d «       t;        Td�«      }t        j°                  t3        |«      Yt        j                  «      |
d�<   t        j`                  t3        |«      t        «      |d�<   |t        › d�Vd"   t        |V«      tG        t        j²                  |V«      dz   «      t3        |V«      d d‚d d dƒœ
|d�<   |||
|||fS # 1 sw Y   �Œ¨xY w# tb        $ r}3dB|3› �|dC<   Y d }3~3�Œãd }3~3ww xY w# 1 sw Y   �ŒxY w# 1 sw Y   ŒøxY w)…Nr   é   zdata_processed/paired/z_cad_ply_targets.npzF)Úallow_pickleÚ
cad_pos_mmÚweak_defect_probabilityÚweak_defect_maskÚunavailable_optional_backendÚMinkowskiEnginezMinkowskiEngine not installed)ÚstatusÚbackendÚreasonr0   z%data_processed/graphs/graph_12000.npzÚfacez+data_processed/images/cad_multiview_128.npzÚxÚmaskÚ
visibilityÚxyz_mmr˜   r™   ú2D CNN/U-Net)Ú
global_diméP   r   é<   c                ó$   •—  | ‰‰«      d d …df   S ©Nr   © )ÚmÚimage_processÚimage_xs    €€rI   Ú<lambda>ztrain_all.<locals>.<lambda>Á   s   ø€ ¹¸7ÀMÓ9RÒSTÐVWÐSWÒ9XrP   é
   r.   zsix visible CAD image planesTzIstored source triangles and barycentric scatter; nearest direct-node fillr   gffffffî?)Ú
checkpointr3   Únative_domainÚprocess_conditionedÚmapping_methodÚdirect_node_coverageÚfill_distance_p95_mmz/data_processed/voxels/cad_surface_sparse_32.npzÚvoxel_coordsÚgrid_origin_mmÚvoxel_pitch_mmÚ	grid_dimsÚsurface_sample_source_triangleÚsurface_sample_barycentricÚsurface_sample_voxel_indexc                 ó$   •—  ‰ ‰‰«      d d …df   S rð   rñ   )Úmodel3dÚprocessÚvoxel_xs   €€€rI   rõ   ztrain_all.<locals>.<lambda>×   s   ø€ ©w°wÀÓ/HÊÈAÈÒ/NrP   éd   úDense 3D U-Netu,   403 occupied cells in a dense 32Ã—4Ã—16 griduI   surface voxel â†’ stored surface samples â†’ triangle/barycentric scatterÚcoordsÚfeatureszGSparse input coordinates differ from cad_surface_sparse_32 voxel_coordsc                 óR   •— ‰j                  ‰‰¬«      }  ‰| «      }t        |‰«      S )N)r  Úcoordinates)ÚSparseTensorrÆ   )Úsparse_tensorr½   ÚMEÚsparse_coordsÚsparse_coords_npÚsparse_featuresÚsparse_models     €€€€€rI   Úsparse_forwardz!train_all.<locals>.sparse_forwardó   s.   ø€ ØŸO™O°_ÐR_˜OÓ`ˆMÙ! -Ó0ˆFÜ3°FÐ<LÓMÐMrP   rL   úSparse 3D U-Netz,403 canonical occupied sparse-surface voxelsu\   coordinate-matched sparse output â†’ stored surface samples â†’ triangle/barycentric scatter)	r÷   r3   rø   rù   rú   Ú$output_coordinate_alignment_verifiedrû   rü   r0   Ú#diagnostic_weak_label_fit_completedrn   ro   rp   rq   rr   )rã   rä   r0   r1   r÷   rn   ro   rp   rq   rr   Únative_voxelsr  zbackend import unavailable: rå   z,data_processed/points/cad_surface_points.npzÚpos_mmr�   c                 ó$   •—  ‰ ‰«      dd d …df   S rð   rñ   )Úpoint_modelÚpoint_xs   €€rI   rõ   ztrain_all.<locals>.<lambda>  s   ø€ ±;¸wÓ3GÈÊ1ÈaÈÒ3PrP   éx   ÚPointNetz8,192 CAD surface pointszCstored point triangle/barycentric scatter; nearest direct-node filli   é   )rØ   c                 ó$   •—  ‰ ‰«      dd d …df   S rð   rñ   )Údg_modelÚdg_xs   €€rI   rõ   ztrain_all.<locals>.<lambda>%  s   ø€ ±¸³¸qÂ!ÀQ¸wÒ0GrP   ÚDGCNNz512-point CPU subsetzBstored point triangle/barycentric scatter; large nearest-node fillc                ó   — | d   S )NÚnodesrñ   )Úitems    rI   rõ   ztrain_all.<locals>.<lambda>/  s   € °°g²rP   )rG   Ú
edge_indexÚ	edge_attriè  é0   é   )ÚwidthÚstepsc                 ó*   •—  ‰‰‰‰ ‰‰«      d d …df   S rð   rñ   )Ú
graph_attrÚgraph_batchÚ
graph_edgeÚgraph_modelÚgraph_xr  s   €€€€€€rI   rõ   ztrain_all.<locals>.<lambda>4  s!   ø€ ±;¸wÈ
ÐT^Ð`gÐitÓ3uÒvwÐyzÐvzÒ3{rP   úMesh GNNÚ,z CAD graph nodes)r÷   r3   rø   rù   Únoder  Úclass_namesz.results/models/weak_gnn/diagnostic_weak_gnn.ptr?   )Úmap_locationÚweights_onlyr/   úRisk GNNÚrunsz*-run weak-label diagnostic fit; displayed z
 conditionr$   ÚedgeÚbatchÚnodes_per_runÚ
risk_logitz#results/models/weak_gnn/report.jsonz CAD graph nodes; z run(s))	r÷   r3   rn   ro   rp   rq   rr   rø   rù   z data_processed/brep/faces_uv.npzÚ
trim_validÚgridsÚ	adjacencyc                 ó$   •—  ‰‰‰ «      d d …df   S rð   rñ   )rB  rA  Úuv_models   €€€rI   rõ   ztrain_all.<locals>.<lambda>V  s   ø€ ±¸À	Ó0JÊ1ÈaÈ4Ò0PrP   úUV-Netr�   z6,564 B-Rep facesz8nearest valid B-Rep UV sample; nodes beyond 10 mm grayed)r÷   r3   rø   rù   rú   rû   rü   Úfill_distance_max_mmçú~j¼t“h?)rj   )r   r   úTabular MLPzone scalar repeated over CAD)
r÷   r3   rn   ro   rp   rq   rr   rø   rù   Úuniform_field)Úreturnr	   )Zr;   Úset_num_threadsrT   ÚminÚget_num_threadsr!   r   r8   r–   Úloadr�   r¥   rÏ   r   rÁ   rO   Úconcatenater¤   Úint64ÚTr   rŸ   rµ   r›   ÚrepeatrY   r   r   r�   rJ   r¯   rv   ÚmeanÚquantiler   rÐ   r¹   Ú
zeros_likeÚmaximumr¡   r   râ   r   r   Úarray_equalr   r´   r   ÚonesÚImportErrorr   r   r   r   r¼   Úcopyr   r    r   r€   r�   r‚   r]   rƒ   ÚjsonÚloadsÚ	read_textr   r”   Úbroadcast_toÚaranger¶   r   r   r’   r   r   rs   rt   ru   ry   r{   r[   Úmse_lossr|   r}   r~   r>   ÚfullÚargmin)pÚpaired_pathÚpairedr“   Útarget_softÚtarget_binaryÚ	process_xÚprocess_maskÚrun_idsÚ_Ú	run_indexÚfieldsÚreportsÚdisplay_validÚsparse_statusÚ	canonicalrš   Ú	raw_imageÚimageÚvisibleÚxyzÚimage_targetÚimage_sourceÚ
image_baryÚimage_validÚimage_target_trD   rC   rq   rf   Úreportr÷   Úcoverager¬   ÚdenseÚsparseÚcoordÚoriginÚpitchÚvoxel_targetÚvoxel_validÚ
sample_triÚsample_baryÚsample_voxelÚsample_targetÚvoxel_valuesÚoccupied_probabilityÚsample_probabilityÚsparse_inputÚsparse_features_npr  Úsparse_sample_probabilityrÅ   Ú
point_dataÚ	raw_pointÚ	point_posÚpoint_sourceÚ
point_baryÚpoint_targetÚdcountÚdg_posÚ	dg_targetÚgraphÚgraph_attr_npÚ	weak_dataÚ
weak_modelÚrisk_checkpointÚoutÚcountrÁ   Úweak_reportÚbrepÚraw_brepÚface_posÚface_valid_gridÚ	valid_posÚvalid_targetÚ
face_indexÚface_targetÚ
face_validÚuv_distanceÚnearest_gridÚtabÚtab_xÚ
prevalenceÚ	tab_modelr…   r†   rÔ   rŒ   Úscalarr  rB  r"  r#  r/  r0  r1  r2  r3  rA  ró   rô   r  r  r  r  r  r  r  r  rD  r  sp                                                                                             @@@@@@@@@@@@@@@@@@@@@@rI   Ú	train_allr®  ¡   s=  ÿÿý€ Ü	×Ñœ#˜a¤ Q¬×(=Ñ(=Ó(?Ó!@ÓAÔBÜÔÜÐ1´#°Ð6JÐKÑK€KÜ	�‰�¨5Õ	1°VÜ—*‘*˜V LÑ1´2·:±:Ó>ˆÜ—j‘j Ð(AÑ!BÂ1ÀaÀ4Ñ!HÌ"Ï*É*ÓUˆÜŸ
™
 6Ð*<Ñ#=ºaÀ¸dÑ#CÄTÓJˆ÷ 
2ô +=Ó*>Ñ'€Iˆ|˜W aØ—‘œcÓ"€IÜ”R—^‘^ Y°×0CÑ0CÄBÇJÁJÓ0OÐ$PÐRSÓTÐU^Ð_hÐijÑ_jÐkÓl€GØ$&€FØ!€GØ+-€MØ%CÐPaØ%DÐZ_ña€Mä—‘œÐFÑFÐUZÔ[€IÜ�J‰J�y Ñ(¬"¯(©(Ó3×5Ñ5€Eô —‘œÐLÑLÐ[`Ôa€IÜ‹M€E¤V¬B¯N©N¸EÀ#¹JÈÈfÉ×H\ÑH\Ô]_×]gÑ]gÓHhÐ;iÐklÓ,mÓ%n˜7Ü�j‰j˜ <Ñ0´$Ó7€G¼r¿z¹zÈ)ÐT\ÑJ]Ô_a×_iÑ_iÓ?j¸Ü—8‘8˜GŸM™M¬2¯:©:Ó6€LÜ—:‘:˜iÐ(9Ñ:¼B¿H¹HÓE€LÔTV×T^ÑT^Ð_hÐivÑ_wÔy{÷  zDñ  zDó  UEÀzÜ.¨{¸LÈÑ<QÐS]Ð^eÑSfÐhmÓn€L�ÑÜ˜¤%§*¡*Ó-€KÄÀ|Ó@T¨~Ø—N‘N¤3 w£<°Ó3€Mà	œ 7§=¡=°Ñ#3ÀÇÁÈaÑ@PÔQÐSUÐVØ	”%˜Ÿ™ aÑ(°W·]±]À1Ñ5EÔFÈÐKó Ñˆˆe�Vô " %°%Õ)XÐZhÐjuÐw}Ó~Ñˆ�VÜ(¨°Ó5ˆ
Ü+=¸kÈ'Ñ>RÐT`ÐahÑTiÐkuÐv}Ñk~ð  AFð  HOó  ,PÑ(ˆˆt‰�h Ø&¨"™nˆ�dÑØ°
ÔSVÐRWÐWqÐPrØ3QÐjnØ4Ü:?ÀÈAÁ×@SÑ@SÓ@UÓ:VÔpuÔvx÷  wBñ  wBð  CKð  MPó  wQó  qRñ"Sñ Sˆ�Šð ô ‹M€E¤V¬B¯N©N¸EÀ#¹JÈÈfÉ×H\ÑH\Ô]_×]gÑ]gÓHhÐ;iÐklÓ,mÐnrÑ,sÓ%t˜7Ü�W‰W”TÐMÑMÐ\aÔb€FÜ�J‰J�v˜nÑ-¬sÓ3€E¼b¿j¹jÈÐP`ÑIaÔchÓ>i°VÔsxÐyð  AQñ  zRó  tSÐkpÜ—8‘8œE¤"§*¡*¨V°KÑ-@Ä#Ó"FÓGÌÏÉÓT€LÜ—-‘- ¬dÓ3€KÜ—‘˜FÐ#CÑDÄbÇhÁhÓO€JÜ—*‘*˜VÐ$@ÑAÄ2Ç:Á:ÓN€KÜ—:‘:˜fÐ%AÑBÄBÇHÁHÓM€LÜ& {°JÀÈUÓS€MÜ—8‘8œC ›J¬¯
©
Ó3€L´R·Z±Z·]±]À<ÐQ]Ð_lÔ5mØ#/€L”�u—w‘w“Ñ Èt°¼UÀ5Ç7Á7»^Ñ1LÜ�W—]‘] 1Ñ%°'·-±-ÀÑ2BÔC€GÜ˜gÕ'NÔPVÐWcÐdhÑWiÓPjÔlrÐs~ð  @Dñ  tEô  GL÷  GQñ  GQó  mRð  TWó  XÑ€K�Ü$ WÐ.>Ó?€JØ& q™>¬%°·±«.Ñ9ÐØ-¨lÑ;ÐÜ3EÐFXÐZdÐfqÐsxð  {Bó  4CÑ0€FÐÑ˜h¨Ø&.°"¡n€MÐ"Ñ#Ø &¸
Ô[^ÐZ_Ð_yÐXzØGuð  OSð ITÜNSÐU]Ð`aÑUa×TgÑTgÓTiÓNjô  EJô  KM÷  KVñ  KVð  W_ð  adó  Keó  Efñ*gñ !g€GÐÑð,
Û$ô *Ó+ˆÜ/CØ˜Ñ" L°Ñ$<ó0>Ñ,ÐÐ,ä�~‰~Ð.ªq°!±"¨uÑ5°uÔ=ÜÐhÓiÐiÜÐ/´·±Ó=ˆÜ Ð!3Ó4ˆÜ)¨/×*?Ñ*?ÀÑ*BÓCˆ÷	Nñ 	Nô
 "Ø˜.¬&°Ó*>Ü�J‰J”s˜<Ó(´·
±
Ô;¸SóBÑˆ�Vô )¨Ð7HÓIˆ
Ø$/°Ñ$=Ð!Ü8JØ% z°;ÀÀwó9PÑ5ˆÐ Ñ! 8¨Xà+3°r©>ˆÐ'Ñ(Ø%+¸ZÔ`cÐ_dÐd~Ð]ØKØ#(Ø|Ø48Ü$)¨8°a©<×*=Ñ*=Ó*?Ó$@Ü$)¬"¯+©+°hÀÓ*DÓ$EØ %ñ/
ñ &
ˆÐ!Ñ"ð <ÐHYØ %À%Ø$°f¸^Ñ6LØ  Ñ.À&ÐIYÑBZØ˜XÑ&¸FÐCUÑ<VÜ ¤ \Ó!2Ó3Ø48ñ
ˆô “ Ñ"€J´·±¼Ð?mÑ8mð  }Bô  1C IÜ—
‘
˜9 XÑ.´·
±
Ó;€IÜ”R—^‘^ Z°¡_°jÀÑ6H×6OÑ6OÔPR×PZÑPZÓ6[Ð$\Ð^_Ó`ÐaeÑfÓg€GÜ—:‘:˜iÐ(9Ñ:¼B¿H¹HÓE€LÔTV×T^ÑT^Ð_hÐivÑ_wÔy{÷  zDñ  zDó  UEÀzÜ% k°<ÀÈUÓS€LÜ˜gŸm™m¨BÑ/Ó0€KÜ˜kÔ+PÔRXÐYeÓRfÔhm×hrÑhrÔsvð  xDó  tEô  MR÷  MWñ  MWô  iXð  Z]ó  ^Ñ€K�Ü$ [°*Ó=€JÜ-?ÀÈ\Ð[eÐglÐnuÓ-vÑ*€Fˆ:Ñ˜ (Ø (¨B¡€M�*ÑØ °*ÔUXÐTYÐYsÐRtØ=WÐpuð ?DÜDIÈ8ÐVWÉ<×J]ÑJ]ÓJ_ÓD`Ôzô  AC÷  ALñ  ALð  MUð  WZó  A[ó  {\ñ$]ñ ]€GˆJÑô
 �”c˜)“nÓ%€F¨g²a¸¸&¸°jÑ.A tÈIÐV]ÐW]ÐL^À6Ðlxð  zAð  {Að  mBÐ`iÜ˜Ÿ
™
 2™¨"Ô-€HÜ˜hÔ(GÌÐPYÓIZÔ\a×\fÑ\fÐgmÔuz×uÑuô  ]Að  CFó  GÑ€K�Ü$ X¨wÓ7€JÜ*<¸[È,ÐW^ÐX^ÐJ_ÐakÐlsÐmsÐatÐv{ð  ~Eó  +FÑ'€Fˆ7�O�X˜xØ%¨™^€M�'ÑØ¨zÔRUÐQVÐVpÐOqØ7MÐfkØ8|Ü>CÀXÐPQÁ\×DWÑDWÓDYÓ>ZÔtyÔz|÷  {Fñ  {Fð  GOð  QTó  {Uó  uVñ!Wñ W€GˆGÑô ”“Ñ$>Ô?€EÜ”R—^‘^ U¨3¡Z°°v±×1EÑ1EÄbÇjÁjÓ1QÐ$RÐTUÓVÓW€GÜ˜˜lÑ+¬U¯Z©ZÓ8€JÌ"Ï*É*ÐUZÐ[fÑUgÔik×isÑisÓJt×JyÑJyÓJ{¸-ð  ~Kò  LMð  OPð  LPó  ~Qð  UYñ  ~Yó  ~QÜ˜Ó&€J´e·k±kÄ#ÀgÃ,ÔV[×V`ÑV`Ô6a¨Ü$ W§]¡]°1Ñ%5°z×7GÑ7GÈÑ7JÈGÏMÉMÐZ[ÑL\ÐdfÐnoÔp€KÜ˜k×+{Ð+{ô  ~Dð  EPó  ~Qô  SX÷  S]ñ  S]ô  ^að  bmó  ^nô  v{÷  v@ñ  v@ô  SAð  CFó  GÑ€K�Ü$ [°*Ó=€JØ$€Fˆ:ÑÜ "§¡¬¨G«´dÓ ;€M�*ÑØ °*ÔUXÐTYÐYsÐRtÜ:=¸g»,ÀqÐ9IÐIYÐ7ZÐswñ$yñ y€GˆJÑô #Ó$€IÔ3LØ�&Ñ×Ñ Ñ" I¨kÑ$:×$@Ñ$@ÀÑ$CÀYÈyÑEY×E_ÑE_Ð`aÑEbÔdgÐhiÔknÐoxð  zGñ  pHó  lIó  eJó4K jä—‘œDÐ#SÑSÐbgÐv{Ô|€JØ×Ñ˜z¨,Ñ7Ô8¸*¿/¹/Ô:KÜ)¨*°jÌ3ÈyÐY_ÑO`ÓKaÐJbð  cMô  NQð  MRð  R\ð  I]ô  ^€OÜ	�‰�Ùœ 	¨&Ñ 1Ó2´F¸9ÀVÑ;LÌeÏjÉjÓ4YÔ[aÐbkÐlwÑbxÓ[yÜ 	¨)Ñ 4Ó5´v¸iÈÑ>PÔRW×R\ÑR\Ó7]ó_ˆ÷ 
ð �oÑ&€E°	¸&Ñ0A×0GÑ0GÌÓ0L¨ÜŸ™ s¨<Ñ'8Ó9¸%À¹+ÀuÈQÁwÐPUÁoÐV×\Ñ\Ó^€Fˆ:ÑÜ "§¡¬¨G«´dÓ ;€M�*ÑÜ—*‘*œdÐ%JÑJ×UÑUÓWÓX€KØ)8ÔQTÐU^Ð_eÑUfÓQgÐPhð  iSô  TWð  SXð  Xbð  OcØ+6°~Ñ+FÐVaÐbnÑVoØ-8Ð9IÑ-JÐVaÐbjÑVkØ/3ÌÈWËÐVWÐHXÐXjÔknÐoxÐyñ  pAó  lBð  kCð  CJð  GKØ26ñ	8€GˆJÑô ‹<€D¤B§G¡G¬DÐ3UÑ,UÐdiÔ$j˜Ü�z‰z˜( 8Ñ,¬b¯j©jÓ9€HÌRÏZÉZÐX`ÐamÑXnÔptÓMu¸?Ø˜Ñ)€I¼.ÈÐT[Ð]hÓ:i¨<Ü—‘¤§¡¬3¨x«=Ó!9º!¸TÀ4¸-Ñ!HÈ/×J_ÑJ_Ó`ÐapÑq€JÜ—(‘(œ3˜x›=¬"¯*©*Ó5€KÄBÇHÁHÌSÐQYË]Ô\`ÓDa°zÜ‡J�J‡M�M�+˜z¨<Ô8Ð^b¸*ÄRÇYÁYÈzÓEZÑ:[Ü�4˜‘=Ó!€E¬v°d¸;Ñ6GÌÏÉÓ/T 9ÔaoÐpu×p{Ñp{Ð|}Ñp~ÓaÐV^Ü˜hÕ(PÔRXÐYdÓReÔgmÐnxÔz÷  {Eñ  {Eó  hFð  HKó  LÑ€K�Ü$ X¨xÓ8€JÜ '¨	Ó 2× 8Ñ 8¸È"Ð 8Ó MÑ€K�Ø" :¨lÑ#;Ñ<€Fˆ8ÑØ)¨RÑ/€M�(ÑØ°
ÔSVÐRWÐWqÐPrØ9LÐejØ:tÜ@EÀ{ÐVXÑGX×F^ÑF^ÓF`Ó@aô  |Aô  BD÷  BMñ  BMð  NYð  [^ó  B_ó  |`Ü@EÀkÇoÁoÓFWÓ@Xñ	"Zñ Z€GˆHÑô ‹/€C¤6¬"¯.©.¸#¸c¹(ÀCÈÁK×DVÑDVÔWY×WaÑWaÓDbÐ9cÐefÓ*gÐhqÐr{Ð|}Ñr}Ð*~Ó#˜5Ü—‘˜]×/Ñ/Ó1Ð2´B·J±JÓ?€JÔM]Ð^c×^iÑ^iÐjkÑ^lÓMmÀÜ—‘×!Ñ! )×"6Ñ"6Ó"8¸TÐ!ÓB€IÈbÀGÜ�3ŽZˆØ×ÑÔ¤e§m¡m±I¸eÓ4DÂQÈÀTÑ4JÓ&K˜tÔTU×T^ÑT^Ð_cÔekÐlvÓewÓTxÈTÐz~÷  {Hñ  {Hô  {Jð  LU÷  LZñ  LZô  L\ð  ^e÷  ^lñ  ^lô  mrð  sw÷  s~ñ  s~ó  s@ó  mAõ  ^Bð ä	�‰�¤5¬¯©±yÀÓ7GÓ)HÈÑ)NÓ#O˜&�Ü$ Y°Ó>€JÜŸG™G¤C¨£L°&¼"¿*¹*ÓE€Fˆ=ÑÜ#%§7¡7¬3¨w«<¼Ó#>€M�-Ñ Ø,6ÌsÈeÐSmÐLnØ/6°q©zÌÈWËÔilÔmo×mvÑmvÐw~Ómð  ABñ  nBó  jCÜ),¨W«È4ð  cAØ6:ÈTñS€GˆMÑð �M 6¨7°MÀ=ÐPÐP÷U 
2Ñ	1ûôD ò GØ$@ÀÀÐ"Fˆ�h×ûðGú÷t 
‰ú÷L 
ˆúsO   ÂA:AR$ÝAR1 ù&A'ASÁN>(ASÁR$AR.ÁR1	ASÁR:ASÁSASÁSASÁSAS&c           
     ó&  — t        j                  dd¬«      \  }}|€#t        j                  t	        |«      t
        «      }|j                  || df   || df   ddd¬«       |j                  ||df   ||df   ||   d	d
ddd¬«      }|j                  d«       |j                  d«       |j                  d«       |j                  ||rd|› �ndz   «       |j                  ||d¬«       |j                  | d¬«       t        j                  |«       y )N)rö   é   T©ÚfigsizeÚconstrained_layoutr   rV   ú#cfd4dcrÜ   ©ÚcÚsÚ
rasterizedr°  Úmagmar   ©r¶  r·  ÚcmapÚvminÚvmaxr¸  Úequalz
CAD X (mm)z
CAD Z (mm)Ú
Ú úmapped risk probability)ÚaxÚlabelé–   ©Údpi)ÚpltÚsubplotsr–   rX  rY   rÏ   ÚscatterÚ
set_aspectÚ
set_xlabelÚ
set_ylabelÚ	set_titleÚcolorbarÚsavefigÚclose)	rF   r“   r«   ÚtitleÚsubtitler`   ÚfigrÂ  Údraws	            rI   Ú
plot_fieldrÕ  r  s  € Ü�l‰l 7¸tÔD�G€CˆØ€}œbŸg™g¤c¨'£l´DÓ9�eØ‡J�Jˆw˜�v˜q�yÑ! 7¨E¨6°1¨9Ñ#5¸ÀaÐTX€JÔYØ�:‰:�g˜e Q˜hÑ'¨°¸°Ñ):¸eÀE¹lÈaÐV]ÐdeÐlmÐz~ˆ:Ó€DØ‡M�M�'Ô˜BŸM™M¨,Ô7¸¿¹À|Ô9TÐVX×VbÑVbÐchñ  @HÐnpÐqyÐpzÑl{ð  NPñ  dQô  WRØ‡L�L�˜"Ð$=€LÔ>Ø‡K�K�˜#€KÔ¤§	¡	¨#¥rP   c                ó@  ‡— t         j                  dd¬«       i Š|j                  t        j                  «      }t        t         dz  | |t        › d�t        |j                  «       «      › d�«       g d¢}d|v r|j                  d«       |g d¢z  }|D ]Ù  }t        j                  ||   d	d
«      j                  t        j                  «      }	t        |	|«      }
|j                  «       j                  dd«      j                  dd«      }t        t         |› d�z  | |	t        › d|› d�d|
d   d›d|
d   d›d�||   «       ||   |
z  |› d�t        ||   j                  «       «      dœz  ‰|<   ŒÛ t        j                   t         dz  f| |dœ|D �ci c]6  }|j                  «       j                  dd«      j                  dd«      ||   “Œ8 c}¤|D �ci c]9  }|j                  «       j                  dd«      j                  dd«      dz   ||   “Œ; c}¤Ž d|fg|D �cg c]	  }|||   f‘Œ c}z   }d|vr|j                  d«       d}t#        j$                  t'        |«      |z  «      }t)        j*                  ||dd |z  fd¬!«      \  }}t        j,                  |«      j/                  «       }t1        ||«      D �]7  \  }\  }}	|	€4|j3                  d"d"d#d$d$|j4                  d%¬&«       |j7                  d'«       Œ@||vr#t        j8                  t'        | «      t:        «      n||   }|j=                  | | d	f   | | d(f   d)d(d¬*«       |j=                  | |d	f   | |d(f   t        j,                  |	«      |   d+d,d	d
d¬-«      }|j?                  d.«       |jA                  d/«       |jC                  d0«       |‰v r)|jE                  |› d1‰|   d   d›d2‰|   d   d›�«       �Œ'|jE                  |«       �Œ: |t'        |«      d  D ]  }|j7                  d'«       Œ |jG                  |jI                  «       d3d4d5¬6«       |jK                  t        › d7�«       |jM                  t         d8z  d9¬:«       t)        jN                  |«       d;t        d<d<t        t'        | «      «      d=d>‰|d?œ	}t         d@z  jQ                  tS        jT                  |d<d(¬A«      dB¬C«       dDjW                  ˆfdE„|D «       «      }d|v rdDndF|dG   › dH�}dDjW                  ˆfdI„|D «       «      }t         jX                  dJz  j[                  «       rdKndL}t         jX                  dJz  j[                  «       rdMndN}t         dOz  jQ                  dP|› dQ|› dRt        › dS|› |› dT|› dU�dB¬C«       y c c}w c c}w c c}w )VNTr+   z
target.pngz: weak 10 mm CAD targetz+ positive nodes; unvalidated training label)rë   r   r	  r  )r  r$  r4  r:  rE  rH  r   r   r'   r(   r)   z.pngz: z mapped to CADztraining AP rÈ   ú.3fu    Â· IoU@0.5 rÉ   u"    Â· gray = mapping distance >10 mm)rr  Údisplay_coveragezcad_risk_fields.npz)rÞ   Úweak_targetrj  Ú__display_validzWeak target)zSparse U-Net unavailableNrÜ   é   g      @r±  rR   zMinkowskiEngine
unavailableÚcenteré   )ÚhaÚvaÚ	transformÚfontsizeÚoffrV   r´  rµ  g      @r¹  rº  r¾  zX (mm)zZ (mm)z
AP u    Â· IoU rÁ  gü©ñÒMb�?g{®Gáz„?)rÂ  rÃ  ÚfractionÚpaduW    training-set CAD risk comparison â€” common nodes/view/scale; weak unvalidated targetszcomparison.pngé    rÅ  Ú$weak_training_cad_mapping_comparisonFz610 mm weak geodesic mask from supplied CSV annotationsz|Every metric is evaluated on the training run. Native grids and transfer resolution differ. Do not rank production accuracy.)	rã   r2   r0   r1   Úcommon_cad_nodesr_   Úcomparison_warningÚmodelsÚsparse_3d_unetzreport.json)Úensure_asciiÚindentzutf-8)ÚencodingrÀ  c              3  óâ   •K  — | ]f  }d |› d‰|   d   d›d‰|   d   d›d‰|   d   d›d‰|   d	   d›d‰|   d
   d›d‰|   d   d›d‰|   d   d›d‰|   d   rdnd› d‰|   d   › d�–— Œh y­w)z<tr><th>z	</th><td>rn   z.4gu    â†’ ro   z	</td><td>rÈ   r×  rÉ   rÊ   rË   rØ  z.1%rù   ÚyesÚnoz</td><td><a href="rr  z">CAD field</a></td></tr>Nrñ   ©Ú.0rD   Úresultss     €rI   Ú	<genexpr>z write_results.<locals>.<genexpr>ª  s  øè ø€ ð ñ
 ˆDð	 �4�&˜	 '¨$¡-°Ñ"?ÀÐ!DÀEÈ'ÐRVÉ-ÐXdÑJeÐfiÐIjð kØ�t‰}Ð0Ñ1°#Ð6°iÀÈÁÈoÑ@^Ð_bÐ?cð dØ�t‰}Ð-Ñ.¨sÐ3°9¸WÀT¹]È>Ñ=ZÐ[^Ð<_Ð_hÐipÐquÑivð  xJñ  jKð  LOð  iPð PØ ™Ð&;Ò<‰uÀ$ÐGÐGZÐ[bÐcgÑ[hÐipÑ[qÐZrð  sMô	Nñ ùs   ƒA,A/z9<tr><th>Sparse 3D U-Net</th><td colspan="8">Unavailable: rå   z
</td></tr>c              3  óB   •K  — | ]  }d |› d‰|   d   › d|› d�–— Œ y­w)z<article><h2>z</h2><img src="rr  z" alt="z' risk field mapped onto CAD"></article>Nrñ   rñ  s     €rI   rô  z write_results.<locals>.<genexpr>²  sN   øè ø€ ð  Yñ  SXð  KO�m D 6¨¸À¹ÀwÑ9OÐ8PÐPWÐX\ÐW]ð  ^Eô  Fñ  SXùs   ƒzdashboard/index.htmlz../dashboard/index.htmlz4../../../../../results/ME1a_DT_comparison/index.htmlzmodel structures and inputszME1a + AC28 resultsú
index.htmla`  <!doctype html><html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>All-model CAD prediction comparison</title>
<style>body{font:15px/1.5 system-ui,sans-serif;max-width:1300px;margin:2rem auto;padding:0 1rem;background:#f4f7fb;color:#162033}.warning{padding:1rem;border-left:5px solid #b77900;background:#fff4d6}img{max-width:100%;background:white;border:1px solid #d7dee9}.table{overflow:auto}table{border-collapse:collapse;background:white;min-width:900px;width:100%}th,td{padding:.55rem;border-bottom:1px solid #d7dee9;text-align:right}th:first-child{text-align:left}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(440px,1fr));gap:1rem}article{background:white;padding:1rem;border:1px solid #d7dee9;border-radius:10px}@media(max-width:520px){.grid{grid-template-columns:1fr}}</style>
<p><a href="u   ">â†� uÛ   </a> Â· <a href="report.json">JSON report</a> Â· <a href="cad_risk_fields.npz">mapped fields NPZ</a></p><h1>All models mapped onto the same CAD</h1>
<p class="warning"><strong>Training-set diagnostic only.</strong> Run a&  , CSV-seeded weak target and unvalidated registration. AP/IoU/Dice below measure fit to this same run, not generalization. Native resolution and transfer back to CAD differ by model. Gray CAD nodes are more than 10 mm from direct mapped support.</p>
<img src="comparison.png" alt="All model risk fields on a common CAD projection"><div class="table"><table><thead><tr><th>Model</th><th>Native loss</th><th>Training AP</th><th>IoU@0.5</th><th>Dice@0.5</th><th>Top-K recall</th><th>Display coverage</th><th>Process</th><th>View</th></tr></thead><tbody>z(</tbody></table></div><div class="grid">z</div></html>).r7   r:   r¤   r–   r¥   rÕ  r8   rÐ   rW   r~   rÎ   rÚ   r5   r6   rv   rS  Úsavez_compressedÚmathÚceilrY   rÇ  rÈ  r�   r¢   ÚzipÚtextÚ	transAxesr±   rX  rÏ   rÉ  rÊ  rË  rÌ  rÍ  rÎ  r¸   ÚsuptitlerÏ  rÐ  Ú
write_textr[  ÚdumpsÚjoinr9   Úexists)r“   rf  rl  rm  rn  ro  Útarget_floatrÄ   rD   rH   ÚscorerE   ÚpanelsÚcolsÚrowsrÓ  ÚaxesrÂ  r`   rÔ  rz  Ú	rows_htmlÚsparse_htmlÚcardsÚnav_hrefÚ	nav_labelró  s                             @rI   Úwrite_resultsr  |  sg  ø€ Ü‡I�I�d T€IÔ*Ø€GØ ×'Ñ'¬¯
©
Ó3€LÜŒs�\Ñ! 7¨L¼S¸EÐAXÐ:YÔ^aÐbo×bsÑbsÓbuÓ^vÐ]wð  xcð  \dô  eÚ7€EØ˜FÑ"Ø�‰Ð&Ô'Ø	ÒSÑS€EÛˆÜ—‘˜˜t™ a¨Ó+×2Ñ2´2·:±:Ó>ˆÜ˜˜}Ó-ˆØ�z‰z‹|×#Ñ# C¨Ó-×5Ñ5°c¸3Ó?ˆÜ”3˜D˜6 ˜Ñ&¨°¼3¸%¸rÀ$ÀÀ~Ð8VØ! %Ð(;Ñ"<¸SÐ!AÀÈeÐTcÑNdÐehÐMið  jLð  Mð  O\ð  ]añ  Obô	cà ™¨Ñ-¸T¸FÀ$¸-Ô]bÐcpÐquÑcv×c{Ñc{Óc}Ó]~Ñ0Ñˆ�Šð ô ×ÑœÐ3Ñ3ð GÀÐUañ GÙfkÓlÑfkÐ^b˜4Ÿ:™:›<×/Ñ/°°SÓ9×AÑAÀ#ÀsÓKÈVÐTXÉ\ÑYÐfkÑlðGñ @Eó  Fñ  @EÐw{˜4Ÿ:™:›<×/Ñ/°°SÓ9×AÑAÀ#ÀsÓKÐL]Ñ]Ð_lÐmqÑ_rÑrð  @Eñ  FòGð ˜lÐ+Ð,ÑQVÓ/WÑQVÈ°°v¸d±|Ò0DÐQVÑ/WÑW€FØ Ñ&Ø�‰Ð8Ô9Ø€D”T—Y‘Yœs 6›{¨TÑ1Ó2ˆdÜ—‘˜T 4°"°c¸D±jÐ1AÐVZÔ[�I€CˆÔdf×dnÑdnÐosÓdt×dzÑdzÓd|Ð]aÜ   v×.Ñˆ‰MˆT�5Øˆ=Ø�G‰G�B˜Ð:¸xÈHÐ`b×`lÑ`lÐwyˆGÔzÐ|~÷  }Dñ  }Dð  EJô  }Kð  MUØ/3¸=Ñ/H”—‘œ˜G›¤dÔ+ÈmÐ\`ÑNaˆØ
�
‰
�7˜E˜6 1˜9Ñ% w°¨v°q¨yÑ'9¸YÈ!ÐX\ˆ
Ô]Ø�z‰z˜' %¨ (Ñ+¨W°U¸A°XÑ->Ä"Ç*Á*ÈUÓBSÐTYÑBZÐ^aÐhoÐvwÐ~ð  MQˆzó  RˆØ
�‰�gÔ §¡¨hÔ 7¸¿¹ÀxÔ9PØ�7‰?Ø�L‰L˜D˜6  w¨t¡}Ð5HÑ'IÈ#Ð&NÈhÐW^Ð_cÑWdÐetÑWuÐvyÐVzÐ{Ö|Ø�l‰l˜4Ö ð /ð ”3�v“;�<Ó ˆ "§'¡'¨%¥.Ð Ø‡L�L�˜$Ÿ+™+›-Ð/HÐSWÐ]`€LÔaØ‡L�L”C�5ÐoÐpÔqØ‡K�K”Ð&Ñ&¨C€KÔ0´#·)±)¸C´.à>ÄsÐ`eØ).ÄCÌÈGËÓDUØPð %cØ°=ñ	B€Fô
 	ˆ=Ñ×$Ñ$¤T§Z¡Z°ÀUÐSTÔ%UÐ`gÐ$ÔhØ—‘ó ñ
 óó €Ið *¨VÑ3‘"Ø
CÀMÐRZÑD[ÐC\Ð\fÐgð à�G‰Gó  Yñ  SXó  Yó  Y€EÜ-0¯Z©ZÐ:PÑ-P×,XÑ,XÔ,ZÑ(ð  aW€HÜ25·*±*Ð?UÑ2U×1]Ñ1]Ô1_Ñ-Ðez€IÜˆ<Ñ×#Ñ#ð )àˆJ�f˜Y˜Kð (GÜGJÀeð Lmð nwð  mxð  yDð  xEð  Emð  nsð  mtð  tAð	%Dð OVð	 $õ WùòQ mùò Fùâ/Ws   Æ;VÇ>VÈVc                 ój   — t        «       \  } }}}}}t        | |||||«       t        t        dz  «       y )Nrö  )r®  r  Úprintr7   )r“   r_   rl  rm  rn  ro  s         rI   Úmainr  ¼  s5   € ÜENÃ[ÑB€GˆV�V˜W m°]Ü�'˜6 6¨7°MÀ=ÔQÜ	Œ#�Ñ
ÕrP   Ú__main__)rC   ú	nn.ModulerD   rA   r%   z
str | NonerJ  rA   )rH   ú
np.ndarrayrM   ztorch.dtyperJ  r	   )r^   r	   r_   r	   r`   r	   rJ  r	   )rG  )rC   r  r„   zCallable[[], Tensor]r_   r	   r`   r	   rq   rÐ   rj   rv   rJ  ztuple[np.ndarray, dict])r’   r  r“   r  r_   r  rJ  r  )
r_   r  r˜   r  r™   r  rš   r  rJ  r  )r¦   r  r˜   r  r™   r  rš   r  r“   r  rJ  z)tuple[np.ndarray, np.ndarray, np.ndarray])r½   r	   r¾   r  rJ  r	   )r«   r  rÒ   r  rJ  Údict)rJ  zbtuple[np.ndarray, np.ndarray, dict[str, np.ndarray], dict[str, dict], dict[str, np.ndarray], dict])rÀ  N)rF   r   r“   r  r«   r  rÑ  rA   rÒ  rA   r`   znp.ndarray | NonerJ  ÚNone)r“   r  rf  r  rl  údict[str, np.ndarray]rm  zdict[str, dict]rn  r  ro  r  rJ  r  )rJ  r  )IÚ__doc__Ú
__future__r   r[  rø  Úosrw   Úpathlibr   Útypingr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotrÇ  rƒ   r–   Úscipy.spatialr   Úsklearn.metricsr   r;   r	   r
   Útorch.nn.functionalÚ
functionalr[   Úarchitecturesr   r   r   r   r   r   r   r   r   r   Údatar   r   r   r   r   r   r   r   r   r   Útrain_weak_gnnr    Útrainingr!   r7   ÚenvironÚgetr8   rJ   r¥   rO   rh   r�   r”   r›   r¯   rÆ   rÚ   r®  rÕ  r  r  Ú__name__rñ   rP   rI   Ú<module>r+     sZ  ðñõ #ã Û Û 	Û Ý Ý ã Ø €
‡�ˆuÔ Ý Û Ý !Ý 3Û ß ß Ð ÷,÷ ,÷ ,÷/÷ /÷ /õ /Ý %à
Ð-Ñ-€Ø‡j�j‡n�n�\ 7Ó+€ð MQõ 'ð  49·=±=ô /óð "&ðJØðJØðJØ*AóJó.@ðNØ$.ðNØ7AðNØFPóNð
\Ø$.ð\Ø7Að\à *ð\à/Xó\óYó6ó"NQôb/ó=Wó@ð ˆzÒ™4�6ÐrP   