Ë
    å`ºjL  ã                  óô  — 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	Z	 e	j                  d«       ddlmZ ddlZddlmZ ddlZej&                  j)                  d e ee«      j/                  «       j0                  d   «      «       ddlmZ dd	lmZ dd
lmZmZ ddl m!Z!m"Z" ddl#m$Z$  ee«      j/                  «       j0                  d   Z%e%dfe%dz  dfdœZ&e%dz  Z'dZ(dd„Z)dd„Z*e+dk(  r e*«        yy)zGWeak training diagnostic at every AC28 and ME1a mesh-graph node budget.é    )ÚannotationsN)ÚPathÚAgg)ÚcKDTreeé   )Úgeodesic_distance)ÚMeshGraphProcessor)ÚfitÚmetrics)Úfixed_physical_normalizeÚsplit_embedded_units)Úseed_everythingÚ18h01zexperiments/ME1a_DTÚ14h06)ÚAC28ÚME1a_DTz$results/ME1a_DT_comparison/graph_fit)ià.  ip  iˆ  i¸  iÜ  iî  i,  éd   c           
     ó<  — t        j                  | dz  d¬«      5 }t        |d   j                  t        «      «      j                  |«      }t        |d   j                  t        «      «      \  }}t         j                  ||d   j                  t        «      f   }t         j                  |t        j                  dt        |d   «      «      f   }t        j                  |d   ||d	z    t         j                  «      }t        j                  |d
   ||d	z    t        «      }	d d d «       t        t        j                  	d«      «      }
t        j                   t        j"                  |
|	j                  t         j                  «      gd	«      «      S # 1 sw Y   ŒsxY w)Nz/data_processed/tabular/process_and_geometry.npzF©Úallow_pickleÚrun_idÚprocess_feature_namesÚgeometry_feature_namesÚ Úxr   Úfeature_validr   )ÚnpÚloadÚlistÚastypeÚstrÚindexr   Úr_ÚrepeatÚlenÚasarrayÚfloat32Úboolr   ÚwhereÚtorchÚtensorÚconcatenate)ÚrootÚrunÚdÚidxÚnamesÚunitsÚlabelsÚunit_labelsÚrawÚvalidÚ
normalizeds              õ#   ì „ì²˜ë¦¬/train_graph_resolution.pyÚprocess_vectorr9      sF  € Ü	�‰�ÐGÑGÐUZÕ	[Ð_`Ü��8‘×#Ñ#¤CÓ(Ó)×/Ñ/°Ó4ˆÜ(¨Ð+BÑ)C×)JÑ)JÌ3Ó)OÓP‰ˆˆeÜ�u‰u�U˜1Ð5Ñ6×=Ñ=¼cÓBÐBÑCˆÜ—E‘E˜%¤§	¡	¨"¬S°Ð3KÑ1LÓ-MÓ NÐNÑOˆÜ�J‰J�q˜‘v˜c # a¡%Ð(¬¯©Ó4ˆÜ�j‰j˜˜?Ñ+¨C°°A±Ð6´tÓ<ˆ÷ 
\ô (¬¯©°°s¸1Ó(=¸fÀ[ÓQ€JÜ�<‰<œŸ™¨
°5·<±<ÄÇ
Á
Ó3KÐ'LÈQÓOÓPÐP÷ 
\Ð	[ús   ›DFÆFc                 ó„  ‡0‡1‡2‡3‡4‡5— t        j                  t        ¬«      } | j                  dt        dt        t        «      ¬«       | j                  ddd¬«       | j                  «       }t        j                  d	d	¬
«       t        j                  d«       t        «        g }t        j                  «       D �]Ò  \  }\  }}|d|› d�z  }t        j                   |d¬«      5 }t        j"                  |d   t        j$                  «      }t        j"                  |d   d d …df   t&        «      }	t        j"                  |d   t        j$                  «      j)                  dd«      }
d d d «       t+        ||«      Š2|j,                  D �]  }|d|› d�z  }t        j                   |d¬«      5 }t        j"                  |d   t        j$                  «      }t        j"                  |d   t        j$                  «      }t        j"                  |d   t&        «      }t        j"                  |d   «      j/                  t0        «      }t        j"                  |d   t        j2                  «      }t        j"                  |d   t        j$                  «      j5                  «       }d d d «       d d …dfxx   dz  cc<   t7        t        j8                  d«      «      }t        j:                  t        j<                  ||j/                  t        j$                  «      gd«      «      Š5t        j:                  t        j>                  ¬ «      Š3t        j:                  |«      Š0t        j@                  tC        «      t        j>                  ¬ «      Š1tE        |«      }|jG                  
d¬!«      \  }}t        jH                  t        jJ                  |D �cg c]N  }tM        tC        |«      |t        j"                  |d d …df   dz  t        j$                  «      t	        |«      «      ‘ŒP c}«      d¬"«      }t        jN                  d#|d$z  d%z  z  «      j/                  t        j$                  «      }|d$k  }|jG                  d¬!«      d   }||   }t	        |	z  jQ                  «       «      tS        dt	        ||	z  jQ                  «       «      «      z  }tU        ‰5jV                  d   ‰0jV                  d   ‰2jV                  d   d&d¬'«      Š4tY        ‰4ˆ0ˆ1ˆ2ˆ3ˆ4ˆ5fd(„t        j:                  |«      t        jZ                  tC        |«      t        j&                  ¬ «      d)«      \  }}t]        ||«      } ||   }!t]        |!|	«      }"t        |› d*|› d+�z  }#t        j^                  ‰4ja                  «       ||tC        |«      ddd,d-œ|#«       |jc                  ||tC        |«      te        t        jf                  |«      «      te        |jS                  «       «      t	        |jQ                  «       «      ||d.   |d/   | d0   |"d0   |"d1   t1        |#ji                  tj        «      «      d2œ«       tm        ||tC        |«      d3to        |d«      d4to        |"d0   d«      d	¬5«       �Œ �ŒÕ |jb                  rŽt        d6z  jq                  «       rwts        jt                  t        d6z  jw                  «       «      d7   }$|D �%ch c]  }%|%d8   |%d9   f’Œ }&}%|$D �%cg c]  }%|%d8   |%d9   f|&vsŒ|%‘Œ c}%|z   }|jy                  d:„ ¬;«       t        d6z  j{                  ts        j|                  d<d)ddd=|d>œd%¬?«      «       t        d@z  j                  dAdB¬C«      5 }'t�        j‚                  |'|d   j…                  «       ¬D«      }(|(j‡                  «        |(j‰                  |«       d d d «       t‹        jŒ                  dddEd	¬F«      \  })}*t        D ]½  }|D �%cg c]  }%|%d8   |k(  sŒ|%‘Œ }+}%|+D �%cg c]  }%|%dG   ‘Œ	 },}%t�        |*dHdI«      D ]�  \  }-}.}/|-j‘                  |,|+D �%cg c]  }%|%|.   ‘Œ	 c}%dJ|¬K«       |-j“                  dL«       |-j•                  «        |-j—                  dM«       |-j™                  |/«       |-j›                  dN¬O«       Œƒ Œ¿ |*d   j�                  «        |)jŸ                  dP«       |)j¡                  t        dQz  dR¬S«       t‹        j¢                  |)«       y # 1 sw Y   �Œ›xY w# 1 sw Y   �ŒqxY wc c}w c c}%w c c}%w # 1 sw Y   �ŒixY wc c}%w c c}%w c c}%w )TN)Údescriptionz	--budgetsÚ+)ÚtypeÚnargsÚdefaultz--appendÚ
store_truez-merge these budgets with prior report records)ÚactionÚhelpT)ÚparentsÚexist_oké   zdata_processed/paired/z_cad_ply_targets.npzFr   Ú
cad_pos_mmÚweak_defect_maskr   Údefect_anchor_cad_mméÿÿÿÿé   zdata_processed/graphs/graph_z.npzÚpos_mmr   r   Úfeature_namesÚ
edge_indexÚ	edge_attrr   iè  )Údtype)Úworkers)Úaxisg      à¿é
   é   é0   )ÚwidthÚstepsc                 ó*   •—  ‰‰‰‰ ‰‰«      d d …df   S )Nr   © )Úattr_tÚbatchÚ	conditionÚedge_tÚmodelÚnodes   €€€€€€r8   Ú<lambda>zmain.<locals>.<lambda>T   s   ø€ ±°d¸6À&ÈÐSXÓ0YÒZ[Ð\]ÐZ]Ò0^ó    éP   Ú_z.ptzdiagnostic weak CSV seeds)Ú
state_dictÚpartÚrequested_nodesÚactual_nodesÚproduction_validÚgeneralization_measuredÚtargetÚloss_initialÚ
loss_finalÚthreshold_iouÚaverage_precision)rd   re   rf   Úanchor_nearest_node_median_mmÚanchor_nearest_node_max_mmÚnative_positive_nodesÚ'weak_label_transfer_iou_on_finest_graphÚtraining_loss_initialÚtraining_loss_finalÚnative_training_iouÚ#mapped_training_iou_on_finest_graphÚ"mapped_training_ap_on_finest_graphÚ
checkpointzlabel transfer IoUzmapped training IoU)Úflushzreport.jsonÚrecordsrd   re   c                ót   — t        t        «      j                  | d   «      t        j                  | d   «      fS )Nrd   re   )r   ÚPARTSr"   ÚBUDGETS)Úrs    r8   r_   zmain.<locals>.<lambda>m   s+   € ¤4¬£;×#4Ñ#4°Q°v±YÓ#?ÄÇÁÈaÐPaÑNbÓ@cÑ"dr`   )ÚkeyÚ#weak_training_resolution_diagnosticzÂEach graph receives a fresh 10 mm geodesic weak mask from the same CSV-derived anchors; transferred labels and predictions are compared to the finest graph. All metrics are same-run diagnostics.)ÚstatusÚepochs_per_fitrg   rh   Úlabel_policyry   )Úindentz
report.csvÚwr   )Únewline)Ú
fieldnames)é   rE   )ÚfigsizeÚconstrained_layoutrf   )rq   ru   ro   )zWeak-label transfer IoUzMapped training IoUz$Farthest CSV seed to graph node (mm)zo-)ÚlabelÚlogzActual graph nodesg      Ð?)ÚalphazDSame-run weak-label fits; changed graph budgets alter target supportzresolution_training.pngé    )Údpi)RÚargparseÚArgumentParserÚ__doc__Úadd_argumentÚintr   r|   Ú
parse_argsÚOUTÚmkdirr*   Úset_num_threadsr   r{   Úitemsr   r   r&   r'   r(   Úreshaper9   Úbudgetsr    r!   Úint64Úcopyr   r)   r+   r,   ÚlongÚzerosr%   r   ÚqueryÚminÚstackr   ÚexpÚsumÚmaxr	   Úshaper
   Úonesr   Úsaverc   ÚappendÚfloatÚmedianÚrelative_toÚPROJECTÚprintÚroundÚexistsÚjsonÚloadsÚ	read_textÚsortÚ
write_textÚdumpsÚopenÚcsvÚ
DictWriterÚkeysÚwriteheaderÚ	writerowsÚpltÚsubplotsÚzipÚplotÚ
set_xscaleÚinvert_xaxisÚ
set_xlabelÚ
set_ylabelÚgridÚlegendÚsuptitleÚsavefigÚclose)6ÚparserÚargsry   rd   r-   r.   Úpairedr/   Úfine_posÚ	fine_maskÚanchorsÚbudgetÚpathÚposr5   r6   r1   ÚedgerN   Únode_valuesÚtreeÚanchor_distÚ	seed_nodeÚiÚgeodesicÚnative_softÚnative_maskÚfine_to_coarseÚtransferÚ	label_iouÚ
predictionÚhistoryÚnative_metricsÚtransferredÚfine_metricsrw   Úpreviousr}   ÚchangedÚfhÚwriterÚfigÚaxesÚ	part_rowsr   Úaxr~   rŠ   rY   rZ   r[   r\   r]   r^   s6                                                   @@@@@@r8   Úmainrë   +   sÐ  ý€ Ü×"Ñ"¬wÔ7€FØ
×Ñ˜¬°3¼tÄG»}ÐÔMØ
×Ñ˜
¨,Ð<kÐÔlØ	×	Ñ	Ó	€DÜ‡I�I�d D€IÔ)Ü	×Ñ˜!ÔÜÔØ€GÜ Ÿ;™;Ÿ=‰ˆ‰Zˆd�3ØÐ,¨S¨EÐ1EÐFÑFˆÜ�W‰W�V¨Õ/°1Ü—Z‘Z  ,¡´·
±
Ó;ˆHÜ—j‘j Ð#5Ñ!6²q¸°sÑ!;¼DÓAˆIÜ—J‘J˜qÐ!7Ñ8¼¿¹ÓD×LÑLÈRÐPQÓRˆG÷ 0ô !  cÓ*ˆ	Ø—l•lˆFØÐ4°V°H¸DÐAÑAˆDÜ—‘˜¨5Õ1°QÜ—J‘J˜q ™{¬2¯:©:Ó6�Ü—J‘J˜q ™v¤b§j¡jÓ1�Ü—j‘j  ?Ñ!3´DÓ9�Ü—j‘j  ?Ñ!3Ó4×;Ñ;¼CÓ@�Ü—Z‘Z  ,¡´·±Ó9�ÜŸ*™* Q {¡^´B·J±JÓ?×DÑDÓF�	÷ 2ð ’a˜�c‹N˜DÑ ‹NÜ0´·±¸%ÀÀAÓ1FÀuÓMˆKÜ—‘œbŸn™n¨k¸%¿,¹,ÄrÇzÁzÓ:RÐ-SÐTUÓVÓWˆDÜ—<‘< ¬5¯:©:Ô6ˆFÜ—<‘< 	Ó*ˆFÜ—+‘+œc #›h¬U¯Z©ZÔ8ˆEÜ˜“ˆDØ"&§*¡*¨W¸R *Ó"@Ñ!ˆK˜	Ü—V‘VœBŸH™HÙLUó&WÙLUÀqô '8¼¸C»ÀÜ—
‘
˜9¢Q q S™>¨$Ñ.¬r¯z©zÓ:¼3¸q»6õ'CØLUñ&Wó XØ]^ô`ˆHäŸ™˜s H¨R¡K°!Ñ#3Ñ3Ó4×;Ñ;¼B¿J¹JÓGˆKØ  "™ˆKØŸ:™: h°r˜:Ó:¸1Ñ=ˆNØ  Ñ0ˆHÜ˜8 IÑ-×2Ñ2Ó4Ó5´c¸!¼CÀÈ)ÑAS×@XÑ@XÓ@ZÓ<[Ó6\Ñ\ˆIÜ$ T§Z¡Z°¡]°6·<±<À±?À9Ç?Á?ÐSTÑCUÐ\^ÐefÔgˆEÜ" 5×)^Ð)^Ü—‘˜[Ó)¬%¯*©*´S¸³XÄEÇJÁJÔ*OÐPRó TÑˆJ�wä" :¨kÓ:ˆNØ" >Ñ2ˆKÜ  ¨YÓ7ˆLÜ˜d˜V 1 V H¨CÐ0Ñ0ˆJÜ�J‰J U×%5Ñ%5Ó%7¸tÐV\Ü'*¨3£xÀ5Ø27ÐA\ñ^à^hôjð �N‰N 4¸&ÔPSÐTWÓPXÜ05´b·i±iÀÓ6LÓ0MÜ-2°;·?±?Ó3DÓ-EÜ(+¨K¯O©OÓ,=Ó(>Ø:CØ(/°Ñ(?ÐV]Ð^jÑVkØ&4°_Ñ&EØ6BÀ?Ñ6SØ5AÐBUÑ5VÜ  ×!7Ñ!7¼Ó!@ÓAñ	Cô 	Dô �$�vœc #›hÐ';¼EÀ)ÈAÓ<NØ'¬¨l¸?Ñ.KÈAÓ(NÐUY÷[òY #ð )ðj ‡{‚{œ˜MÑ)×1Ñ1Ô3Ü—‘œS Ñ.×9Ñ9Ó;Ó<¸YÑGˆÙ;BÓC¹7°a�!�F‘)˜AÐ/Ñ0Ò1¸7ˆÐCÙ$ÓX™H�q¨¨6©°1Ð5FÑ3GÐ(HÐPWÒ(W’˜HÑXÐY`Ñ`ˆØ�‰ÑdˆÔeÜˆÑ×"Ñ"¤4§:¡:Ð8]Ø¨uÈuð \Øñ/ð #$ô$%ô &ô ˆlÑ
×	 Ñ	  ¨RÐ	 Ô	0°BÜ�~‰~˜b¨G°A©J¯O©OÓ,=Ô>ˆ¸v×?QÑ?QÔ?SÐTZ×TdÑTdÐelÔTm÷ 
1ä�\‰\˜!˜A fÀÔE�H€CˆßˆÙ%Ó9™g˜¨¨6©°D«’1˜gˆ	Ð9Ù&/Ó
0¡i ˆ1ˆ^Ó iˆÐ
0Ü ð &Tàhöj‰LˆBˆs�5ð �G‰G�A¡yÓ1¡y !�q˜“v yÑ1°$¸TˆGÔBØ�M‰M˜%Ô  §¡Ô!2°2·=±=ÐAUÔ3VÐWY×WdÑWdÐejÔWkÐln×lsÑlsÐz}ÐlsÕl~ñ	jð ð 	ˆ�G‡N�NÔ�S—\‘\Ð"hÔiØ‡K�K”Ð-Ñ-°#€KÔ6´s·y±yÀµ~÷Q 0Ñ/ú÷ 2Ñ1üò&Wùò> DùÚX÷ 
1Ñ	0üò :ùÚ
0ùò 2sX   Ã!Bc=Æ(C3d
ÏAdÛ!dÛ8d!Ü
d!Ý5A
d&ß0d3ß>d3àd8à:d=ã=d	ä
dä&d0Ú__main__)r-   r   r.   r!   Úreturnztorch.Tensor)rí   ÚNone),r‘   Ú
__future__r   r·   r�   r°   ÚsysÚpathlibr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotr¼   Únumpyr   Úscipy.spatialr   r*   rÐ   Úinsertr!   Ú__file__ÚresolverC   Úmatch_targetsr   Úmodels.architecturesr	   Úmodels.compare_cad_predictionsr
   r   Úmodels.datar   r   Úmodels.trainingr   r¬   r{   r•   r|   r9   rë   Ú__name__rX   r`   r8   Ú<module>r     sÛ   ðá MÝ "ã 
Û Û Û 
Ý ã Ø €
‡�ˆuÔ Ý Û Ý !Û à ‡�‡��‘#‘d˜8“n×,Ñ,Ó.×6Ñ6°qÑ9Ó:Ô ;Ý +Ý 3ß 7ß FÝ +áˆX‹×ÑÓ ×(Ñ(¨Ñ+€Ø�wÐ¨7Ð3HÑ+HÈÐ*QÑR€ØÐ2Ñ2€Ø/€ó	QóSFðl ˆZÒ™�Ðr`   