Ë
    ?aºj{  ã                  ó&  — d Z ddlm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mZmZmZ  ee«      j+                  «       j,                  d   Zeed	z  d
œZedz  ZdZdd„Zdd„Zdd„Zedk(  r e«        yy)zHMeasure how CAD graph node budgets alter image, point, and voxel inputs.é    )ÚannotationsN)ÚPathÚAgg)ÚcKDTree)Úmake_multiviewÚ
cad_pointsÚsurface_voxelsé   zexperiments/ME1a_DT)ÚAC28ÚME1a_DTzresults/ME1a_DT_comparison)éà.  ip  éˆ  é¸  iÜ  iî  i,  éd   c                ót  ‡
— t        j                  | d¬«      5 Š
ˆ
fd„dD «       \  }}}}}}}d d d «       t        j                  t        j                  t        j                  d d …df   dd«      «      «      }t        j
                  d   |t        «      ¬	«      t        j                  t        j
                  |d   t        |«      ¬
«      d«      z  }	||	j                  t         j                  «      d d …df   |d d …df   |d d …df   d d …df   |d d …df   z  |d d …df   z  dœS # 1 sw Y   �ŒxY w)NF)Úallow_picklec              3  ó(   •K  — | ]	  }‰|   –— Œ y ­w)N© )Ú.0ÚkÚds     €õ*   ì „ì²˜ë¦¬/compare_graph_representations.pyÚ	<genexpr>zprepared_cad.<locals>.<genexpr>   s   øè ø€ ÐoÑ'n !˜˜1�Ñ'nùs   ƒ)Úpos_mmÚnormalÚfaceÚ
edge_indexÚ	edge_attrÚxÚfeature_validé   éÿÿÿÿr
   r   )ÚweightsÚ	minlength)r$   é   é   é   )r   r   r   Únormal_turn_degÚ	k1_per_mmÚ	k2_per_mmÚgaussian_signed_per_mm2Úcurvature_valid)
ÚnpÚloadÚrad2degÚarccosÚclipÚbincountÚlenÚmaximumÚastypeÚfloat32)ÚpathÚpÚnÚfÚeÚar   ÚvÚangleÚturnr   s             @r   Úprepared_cadr@      s  ø€ Ü	�‰� 5Õ	)¨QÛoÑ'nÓo‰ˆˆ!ˆAˆa��!�A÷ 
*ä
�*‰*”R—Y‘YœrŸw™w qª¨1¨¡v¨b°Ó3Ó4Ó
5€EÜ	�‰�Q�q‘T %´#°a³&Ô	9¼"¿*¹*ÄRÇ[Á[ÐQRÐSTÑQUÔ`cÐdeÓ`fÔEgÐhiÓ:jÑ	j€DØ ¨¸T¿[¹[ÌÏÉÓ=TØš!˜B˜$™¨Aªa°¨d©GÈaÒPQÐRTÐPTÉgØ¢ " ™g aª¨"¨¡g™o¨a²°"°©gÑ5ñ7ð 7÷	 
*Ñ	)ús   ™D-Ä-D7c                óæ   — | d   | d   dz   t        | d   «      z  z   }t        j                  ||z
  |z  «      j                  t        «      }t        t        t        |j                  «       «      «      S )NÚgrid_origin_mmÚvoxel_coordsg      à?Úvoxel_pitch_mm)	Úfloatr-   Úfloorr5   ÚintÚsetÚmapÚtupleÚtolist)ÚdataÚoriginÚpitchÚcenterÚcoords        r   Úphysical_voxelsrQ   !   sf   € ØÐ Ñ! 4¨Ñ#7¸Ñ#:¼EÀ$ÐGWÑBXÓ<YÑ"YÑY€FÜ
�(‰(�F˜6‘M 5Ñ(Ó
)×
0Ñ
0´Ó
5€EÜŒs”5˜Ÿ™›Ó(Ó)Ð)ó    c                 óØ  ‡*‡+— t         j                  dd¬«       g } i }t        j                  «       D �]  \  Š+}|dz  }t	        j
                  |dz  j                  «       «      }|d   D �ci c]  }|d   |“Œ
 }}d }i |‰+<   t        D �]¿  Š*t        |d‰*› d�z  «      }t        |d	«      }	t        |d
«      d   }
t        |d«      }|€|	|
|f}|\  }}}t        j                  |d   t        «      }t        j                  |	d   t        «      }t        ||z  j!                  «       «      }t        ||z  j!                  «       «      }||z  }t        j"                  |d   |   |	d   |   z
  «      }t%        |«      j'                  |
d¬«      d   }t%        |
«      j'                  |d¬«      d   }|d   }t)        |d   «      }t+        |||«      }t+        |||«      }|‰*   }| j-                  ‰+‰*t/        |d   «      |d   d   d   d|d   z  |d   dt)        |d   j1                  «       «      z  |t3        d|«      z  t/        |«      rt)        |j1                  «       «      nd t        |j!                  «       «      t)        |j1                  «       |j1                  «       z   dz  «      t)        t        j4                  |d«      t        j4                  |d«      z   dz  «      t/        ||z  «      t3        dt/        ||z  «      «      z  t/        |«      dœ«       ‰*dv s�ŒŽ|	d   d   j7                  «       |	d   d   j7                  «       f|‰+   ‰*<   �ŒÂ �Œ t         d z  j9                  t	        j:                  d!d"d#d$| d%œd¬&«      «       t         d'z  j=                  d(d)¬*«      5 }t?        j@                  || d   jC                  «       ¬+«      }|jE                  «        |jG                  | «       d d d «       tI        jJ                  dd,d-d¬.«      \  }}tM        |j                  «       «      D ]°  \  } \  Š+}!tM        d«      D ]š  \  }"Š*|!‰*   \  }}#|| |"f   jO                  t        jP                  jS                  |# |«      d/d0¬1«       tU        ˆ*ˆ+fd2„| D «       «      }$|| |"f   jW                  ‰+› d3‰*d4›d5|$d6   d4›d7|$d8   d9›�«       || |"f   jY                  d:«       Œœ Œ² |j[                  d;«       |j]                  t         d<z  d=¬>«       tI        j^                  |«       tI        jJ                  dd?d@d¬.«      \  }}t        D ]½  Š+| D �cg c]  }|dA   ‰+k(  sŒ|‘Œ }%}|%D �cg c]  }|d6   ‘Œ	 }&}ta        |dBdC«      D ]�  \  }'}(})|'jc                  |&|%D �cg c]  }||(   ‘Œ	 c}dD‰+¬E«       |'je                  dF«       |'jg                  «        |'ji                  dG«       |'jk                  |)«       |'jm                  dH¬I«       Œƒ Œ¿ |d   jo                  «        |j]                  t         dJz  d=¬>«       tI        j^                  |«       tq        t         d z  «       y c c}w # 1 sw Y   �ŒnxY wc c}w c c}w c c}w )KNT)ÚparentsÚexist_okzdata_processed/graphsz
index.jsonÚresolutionsÚrequested_node_budgetÚgraph_z.npzé€   i   r   é    Ú
silhouetteÚdepth_mmr"   )Úworkersr   rB   rD   Úsurface_distance_mmÚsource_to_simplifiedÚp95_mmr   Úarea_change_fractionÚ
componentsr,   r
   é   gffffffî?)ÚpartÚrequested_nodesÚactual_nodesÚsource_to_graph_p95_mmÚarea_change_pctrb   Úanalytic_curvature_valid_pctÚimage_silhouette_iou_128Ú image_depth_mae_mm_common_pixelsÚimage_common_visible_pixelsÚpoint_symmetric_chamfer_mean_mmÚpoint_symmetric_p95_mmÚsurface_voxel_jaccard_32Úsurface_voxels_32)r   r   r   r   zrepresentation_sensitivity.jsonzDEach part's own 12,000-node request; actual node counts are reporteduX   six 128Ã—128 orthographic views; silhouette IoU and depth error on common visible pixelszX4,096 deterministic area-uniform triangle samples; symmetric nearest-neighbour distanceszs32 cells along the longest axis; occupied surface-cell centers rebinned into each part's finest graph physical grid)Ú	referenceÚimageÚpointsÚvoxelsÚrecords)Úindentzrepresentation_sensitivity.csvÚwÚ )Únewline)Ú
fieldnamesr!   )é   é   )ÚfigsizeÚconstrained_layoutÚviridisÚlower)ÚcmaprM   c              3  óF   •K  — | ]  }|d    ‰k(  sŒ|d   ‰k(  sŒ|–— Œ y­w)rd   re   Nr   )r   r   ÚbudgetÚnames     €€r   r   zmain.<locals>.<genexpr>]   s*   øè ø€ Ð]¡˜A¨A¨f©I°t«OÀÐBSÑ@TÐV\Ó@\”a¡ùs   ƒ!‘!š!z	 request Ú,z	, actual rf   z
silhouette IoU rj   z.3fÚoffu;   Same +Y CAD view and 128Â² pixels for each graph resolutionzresolution_views.pngé    )Údpié   )r&   r!   rd   )rg   rj   ro   )u   Sourceâ†’graph P95 (mm)zSix-view silhouette IoUzSurface voxel Jaccardzo-)ÚlabelÚlogzActual graph nodesg      Ð?)Úalphazsensitivity_curves.png)9ÚOUTÚmkdirÚPARTSÚitemsÚjsonÚloadsÚ	read_textÚBUDGETSr@   r   r   r	   r-   ÚasarrayÚboolrG   ÚsumÚabsr   ÚqueryrE   rQ   Úappendr3   ÚmeanÚmaxÚquantileÚcopyÚ
write_textÚdumpsÚopenÚcsvÚ
DictWriterÚkeysÚwriteheaderÚ	writerowsÚpltÚsubplotsÚ	enumerateÚimshowÚmaÚmasked_whereÚnextÚ	set_titleÚaxisÚsuptitleÚsavefigÚcloseÚzipÚplotÚ
set_xscaleÚinvert_xaxisÚ
set_xlabelÚ
set_ylabelÚgridÚlegendÚprint),ru   ÚpanelsÚrootÚ	graph_dirÚindexÚrÚ	by_budgetÚ	canonicalÚcadrr   rs   ÚvoxelÚ
base_imageÚbase_pointsÚ
base_voxelr<   ÚbÚintersectionÚunionÚoverlapÚdepthÚd1Úd2Úcommon_originÚcommon_pitchÚvaÚvbÚgraphÚfhÚwriterÚfigÚaxesÚrowÚbudgetsÚcolÚvalidÚitemrd   r   ÚaxÚkeyrŠ   rƒ   r„   s,                                             @@r   Úmainrß   '   sH  ù€ Ü‡I�I�d D€IÔ)Ø€G�r�Ü—[‘[—]‰	ˆˆTØÐ.Ñ.ˆ	Ü�j‰j˜) LÑ0×;Ñ;Ó=Ó>ˆØ9>¸}Ò9MÓNÑ9M°A�1Ð,Ñ-¨aÑ/Ð9Mˆ	ÐNØˆ	Øˆˆt‰ß�gˆFÜ˜Y¨°¨x°tÐ'<Ñ<Ó=ˆCÜ   SÓ)ˆEÜ˜c $Ó'¨Ñ1ˆFÜ   RÓ(ˆEØÐ Ø  ¨Ð.�	Ø.7Ñ-ˆJ�{ :Ü�j‰j˜ LÑ1´$Ó7ˆA¼2¿:¹:ÀeÈLÑFYÔZ^Ó;_¸Ü˜a ™cŸY™Y›[Ó)ˆL´°a¸±c·Y±Y³[Ó1A¨5Ø�a‘CˆGÜ—&‘&˜ JÑ/°Ñ8¸¸zÑ9JÈ7Ñ9SÑSÓTˆEÜ�{Ó#×)Ñ)¨&¸Ð)Ó<¸QÑ?ˆBÜ�v‹×$Ñ$ [¸Ð$Ó<¸QÑ?ˆBØ$Ð%5Ñ6ˆMÜ˜zÐ*:Ñ;Ó<ˆLÜ˜z¨-¸ÓEˆBÜ˜u ]°<Ó@ˆBØ˜FÑ#ˆEØ�N‰N 4¸&ÔPSÐTWÐX`ÑTaÓPbØ).Ð/DÑ)EÐF\Ñ)]Ð^fÑ)gØ"% eÐ,BÑ&CÑ"CÐQVÐWcÑQdØ/2´5¸Ð=NÑ9O×9TÑ9TÓ9VÓ3WÑ/WØ+7¼¸A¸e»Ñ+DÜJMÈeÌ*´5¸¿¹»Ô3FÐZ^Ü.1°'·+±+³-Ó.@Ü27¸¿¹»À2Ç7Á7Ã9Ñ9LÈaÑ8OÓ2PÜ).´·±¸B¸sÓ0CÄBÇKÁKÐPRÐSVÓDWÑ0WÐYZÑ/ZÓ)[Ü+.¨r°"©u«:´c¸!¼CÀÀ2Á»JÓ6GÑ+GÜ$'¨£Gñ
-ô 
.ð Ð.Ó.ÀEÈ*ÑDUÐVWÑDX×D]ÑD]ÓD_Ð`eÐfrÑ`sÐtuÑ`v×`{Ñ`{Ó`}ÐD}¨v°d©|¸FÓ/Cò= ð #ôL 	Ð	*Ñ*×6Ñ6´t·z±zØZØjØkð GØñCð
 #$ô8%ô &ô Ð.Ñ
.×	4Ñ	4°SÀÐ	4Ô	DÈÜ�~‰~˜b¨G°A©J¯O©OÓ,=Ô>ˆ¸v×?QÑ?QÔ?SÐTZ×TdÑTdÐelÔTm÷ 
Eä�\‰\˜!˜A fÀÔE�H€CˆÜ'¨¯©«Ö7Ñˆ‰NˆT�'Ü#Ð$9Ö:‰JˆC�Ø ™‰KˆE�%Ø��S�‰M× Ñ ¤§¡×!3Ñ!3°U°F¸5Ó!AÀyÐX_Ð Ô`ÜÔ]¡Ó]Ó]ˆDØ��S�‰M×#Ñ# t f¨I°f¸Q°Z¸yÈÈnÑI]Ð^_ÐH`ð a6Ø6:Ð;UÑ6VÐWZÐ5[ð%]ô ^à��S�‰M×Ñ˜uÕ%ñ ;ð 8ð ‡L�LÐNÔOØ‡K�K”Ð*Ñ*¨s€KÔ3´C·I±I¸c´NÜ�\‰\˜!˜A fÀÔE�H€CˆßˆÙ Ó4™�A A f¡I¨t£OŠa˜ˆÐ4Ù&*Ó
+¡d ˆ1ˆ^Ó dˆÐ
+Ü Ð%uØ möo‰LˆBˆs�5à�G‰G�A¡tÓ,¡t !�q˜“v tÑ,¨T¸ˆGÔ=Ø�M‰M˜%Ô  §¡Ô!2°2·=±=ÐAUÔ3VÐWY×WdÑWdÐejÔWkÐln×lsÑlsÐz}ÐlsÕl~ñoð ð 	ˆ�G‡N�NÔ�S—[‘[¤Ð%=Ñ!=À#�[ÔFÄsÇyÁyÐQTÄ~Ü	Œ#Ð/Ñ
/Õ0ùò O÷R 
EÑ	Düò 5ùÚ
+ùò -s+   Á+YÎA
YÔ=YÕYÕY"ÖY'ÙYÚ__main__)r7   r   Úreturnúdict[str, np.ndarray])rL   râ   rM   z
np.ndarrayrN   rE   rá   zset[tuple[int, int, int]])rá   ÚNone)Ú__doc__Ú
__future__r   r¢   r‘   Úpathlibr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotr§   Únumpyr-   Úscipy.spatialr   Úrepresentationsr   r   r	   Ú__file__ÚresolverT   ÚPROJECTr�   r�   r”   r@   rQ   rß   Ú__name__r   rR   r   Ú<module>rò      s“   ðá NÝ "ã 
Û Ý ã Ø €
‡�ˆuÔ Ý Û Ý !ç FÑ Fá
ˆx‹.×
 Ñ
 Ó
"×
*Ñ
*¨1Ñ
-€Ø WÐ-BÑ%BÑC€ØÐ*Ñ*€Ø
1€ó7ó*óE1ðP ˆZÒ™�ÐrR   