§
    5¶äjC  ã                   óè  — d 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         Z	ej        d         dge_        ej
                             d e ee¦  «        j        ¦  «        ¦  «         ddlmZ  ee¦  «                             ¦   «         j        j        Zedz  edz  ed	z  cZZZ ej        ¦   «         d
z  ZddlZ eej                             dd¦  «        ¦  «        Z eej                             dd¦  «        ¦  «        ZddgZeefdk    rdnedk    rde› �nde› de› �Zg d¢Z d"d„Z!d„ Z"d„ Z#d„ Z$g d¢Z%d„ Z&d„ Z'd„ Z(e)dk    r& e#e$e&e(d œ                     e	d!„ ¦  «        ¦   «          dS dS )#a§  Volume: exact (the mesh), FCP from the mesh, FCP from a 20k point cloud, screened Poisson from the same cloud (true
normals, and normals estimated from the points). 128 layers, 2048 atoms. For the report section "volume".

    cd ~/code/data/meshes/fcp_3010_hull
    F=~/code/fcp_devel/.venv/bin/python; O=~/code/data/meshes/fcp_2910_collision/.venv/bin/python
    env -u PYTHONPATH $F scripts/volume_pc.py points      # out/pc/<obj>.npz: 20k area-uniform points, seed 3, true normals
    env -u PYTHONPATH $F scripts/volume_study.py fcp      # out/vs_fcp.csv, out/vs_render/<obj>_fcp_*.npz
    env -u PYTHONPATH OMP_NUM_THREADS=1 $O scripts/volume_study.py poisson   # out/vs_poisson.csv, out/vs_render/<obj>_poisson_*.npz
    env -u PYTHONPATH $O scripts/volume_study.py render   # sections/hull/volume_fig_renders.png (Open3D decimates for drawing)
    env -u PYTHONPATH $F scripts/volume_study.py section  # sections/hull/{volume_data.csv, volume_objects.csv, volume_section.html}

Times: median of 5 (encode, Poisson) or of 2000 (volumes) after a warm-up. FCP's CPU encode uses numba's threads (12);
Poisson runs on one thread (Open3D's threaded Poisson was 1.5-4x slower on this CPU).
é    N)ÚPathé   Úx)ÚOBJECTSÚoutzout/pczout/vs_renderz)code/data/meshes/fcp_report/sections/hullÚ
FCP_LAYERSé€   Ú	FCP_ATOMSé   )Ú_6144Úfcp6144z128 layers, 6144 atoms)Ú
_L256_6144ÚfcpL256z256 layers, 6144 atoms)r	   r   Ú Ú_Ú_L)ÚmugÚbowl_dogÚshoeÚdinoÚhorseÚknoté   c                 ó  —  | ¦   «          g }t          |¦  «        D ]H}t          j        ¦   «         } | ¦   «          |                     t          j        ¦   «         |z
  ¦  «         ŒIdt	          t          j        |¦  «        ¦  «        z  S )Nç     @�@)ÚrangeÚtimeÚperf_counterÚappendÚfloatÚnpÚmedian)ÚfÚnÚtr   Út0s        úA/home/joao/code/data/meshes/fcp_3010_hull/scripts/volume_study.pyÚmedr(   '   s~   € Ø€A�C„C€CØ
€AÝ�1‰XŒXð +ð +ˆÝÔÑ Ô ˆØ	ˆ‰ŒˆØ	�Š•Ô"Ñ$Ô$ rÑ)Ñ*Ô*Ð*Ð*Ø••r”y ‘|”|Ñ$Ô$Ñ$Ð$ó    c           
      óà   — | |d d …df                  | |d d …df                  | |d d …df                  }}}t          t          j        d|t          j        ||¦  «        ¦  «        dz  ¦  «        S )Nr   r   é   zij,ij->é   )r    r!   ÚeinsumÚcross)ÚVÚFÚaÚbÚcs        r'   Úmesh_volumer4   1   sj   € Ø��!�!�!�Q�$”Œj˜!˜A˜a˜a˜a ˜dœGœ* a¨¨!¨!¨!¨Q¨$¬¤jˆ!€q€AÝ•”˜9 a­¬°!°Q©¬Ñ8Ô8¸1Ñ<Ñ=Ô=Ð=r)   c                  ó<  ‡‡‡‡‡‡‡— dd l } dd l}dd lŠddlmŠ ddlmŠ t                               dd¬¦  «         g }t          j
        ¦   «         D �]Ž\  }}|                     |d¬¦  «        }t          j        |j        t          j        ¦  «        t          j        |j        t          j        ¦  «        cŠŠ ‰‰‰¦  «        }t          j        t          j        t&          |› d�z  ¦  «        d	         t          j        ¦  «        }t+          |t-          ‰¦  «        |d
t/          ˆˆˆfd„d¦  «        z  ¬¦  «        }d|fd|ffD �]&\  }	Š‰                     ‰t2          t4          d¬¦  «        Š ‰‰¦  «        |d|	› d�<   d
t/          ˆˆfd„d¦  «        z  |d|	› d�<   t/          ˆˆfd„¦  «        |d|	› d�<   t/          ˆˆfd„¦  «        |d|	› d�<   ‰j        |d|	› d�<   ‰                     ‰t2          t4          d¬¦  «        }
 ‰|
¦  «        |d|	› d�<   |t8          v rMt:          sF‰                     ‰d¬¦  «        }t          j        t          |› d|	› d�z  |j        |j        ¬¦  «         �Œ(|t8          v r)t:          s"t          j        t          |› d�z  ‰‰¬¦  «         |                      |¦  «         tC          d „ | 
                    ¦   «         D ¦   «         d¬!¦  «         �Œ�|  "                    |¦  «         #                    tH          d"t:          › d#�z  d$¬%¦  «         d S )&Nr   )Úvolume_atoms_fast)Úvol_nbT©ÚparentsÚexist_okÚmesh)Úforceú.npzÚPr   c                  ó   •—  ‰‰‰ ¦  «        S ©N© )ÚF0ÚV0r7   s   €€€r'   ú<lambda>zfcp_step.<locals>.<lambda>E   s   ø€ ÐRXÐRXÐY[Ð]_ÑR`ÔR`€ r)   iÐ  )ÚobjÚfacesÚexactÚexact_usÚpointsÚcpu©ÚatomsÚlayersÚdeviceÚfcp_Ú_volc                  ó   •—  ‰‰ ¦  «        S r@   rA   )Údr6   s   €€r'   rD   zfcp_step.<locals>.<lambda>I   s   ø€ Ð7HÐ7HÈÑ7KÔ7K€ r)   Ú_vol_usc                  óJ   •— ‰                       ‰t          t          d¬¦  «        S )NrJ   rK   ©ÚencodeÚATOMSÚLAYERS©ÚfcpÚgeos   €€r'   rD   zfcp_step.<locals>.<lambda>J   s   ø€ °S·Z²ZÀÍ5ÕY_Ðhm°ZÑ5nÔ5n€ r)   Ú_enc_cpu_msc                  óJ   •— ‰                       ‰t          t          d¬¦  «        S )NÚcudarK   rU   rY   s   €€r'   rD   zfcp_step.<locals>.<lambda>K   s   ø€ °c·j²jÀÍEÕZ`Ðio°jÑ6pÔ6p€ r)   Ú_enc_cuda_msÚ_bytesr^   Ú	_vol_cuda)rN   Ú_fcp_©r/   r0   ú	_mesh.npzc                 ód   — i | ]-\  }}|t          |t          ¦  «        rt          |d ¦  «        n|“Œ.S )é   )Ú
isinstancer    Úround)Ú.0ÚkÚvs      r'   ú
<dictcomp>zfcp_step.<locals>.<dictcomp>U   s9   € ÐUÐUÐUÁ4À1Àaˆq¥*¨QµÑ"6Ô"6Ð=•5˜˜A‘;”;�;¸AÐUÐUÐUr)   ©ÚflushÚvs_fcpú.csvF©Úindex)%ÚpandasÚtrimeshrZ   Úvolume_atomsr6   Úvolume_sotar7   ÚRDÚmkdirr   ÚitemsÚloadr!   ÚascontiguousarrayÚverticesÚfloat64rF   Úint64ÚasarrayÚPCÚfloat32ÚdictÚlenr(   rV   rW   rX   ÚnbytesÚRENDERÚTAGÚdecodeÚsavezr   ÚprintÚ	DataFrameÚto_csvÚOUT)Úpdrt   ÚrowsÚnameÚpathÚmrG   r>   ÚrÚsrcÚdcÚdmrB   rC   rR   rZ   r[   r7   r6   s               @@@@@@@r'   Úfcp_stepr–   6   st  øøøøøøø€ ØÐÐÐØ€N€N€Nà€J€J€JØ.Ð.Ð.Ð.Ð.Ð.Ø"Ð"Ð"Ð"Ð"Ð"å‡H‚H�T D€HÑ)Ô)Ð)Ø€DÝ”m‘o”oð cñ c‰
ˆˆdØ�LŠL˜ VˆLÑ,Ô,ˆÝÔ% a¤jµ"´*Ñ=Ô=½rÔ?SÐTUÔT[Õ]_Ô]eÑ?fÔ?fˆˆˆBØ��r˜2‘”ˆÝŒJ•r”w�r t M M MÑ1Ñ2Ô2°3Ô7½¼ÑDÔDˆÝ�T¥ R¡¤°ÀÅcÐJ`ÐJ`ÐJ`ÐJ`ÐJ`ÐJ`ÐbfÑFgÔFgÑ@gÐhÑhÔhˆØ  !˜ x° mÐ4ð 	Rñ 	R‰HˆC�Ø—
’
˜3¥eµFÀ5�
ÑIÔIˆAØ"3Ð"3°AÑ"6Ô"6ˆAÐ�SÐÐÐÑØ%(­3Ð/KÐ/KÐ/KÐ/KÐ/KÈTÑ+RÔ+RÑ%RˆAÐ!�SÐ!Ð!Ð!Ñ"Ý),Ð-nÐ-nÐ-nÐ-nÐ-nÑ)oÔ)oˆAÐ%�SÐ%Ð%Ð%Ñ&Ý*-Ð.pÐ.pÐ.pÐ.pÐ.pÑ*qÔ*qˆAÐ&�SÐ&Ð&Ð&Ñ'Ø$%¤HˆAÐ �SÐ Ð Ð Ñ!Ø—’˜C¥uµVÀF�ÑKÔKˆBØ'8Ð'8¸Ñ'<Ô'<ˆAÐ#�SÐ#Ð#Ð#Ñ$Ø•vˆ~ˆ~¥cˆ~Ø—Z’Z ¨%�ZÑ0Ô0�Ý”� Ð5Ð5¨CÐ5Ð5Ð5Ñ5¸¼ÈÌÐQÑQÔQÐQùØ•6ˆ>ˆ>¥#ˆ>ÝŒH•R˜TÐ,Ð,Ð,Ñ,°°bÐ9Ñ9Ô9Ð9Ø�Š�A‰ŒˆÝÐUÐUÈ1Ï7Ê7É9Ì9ÐUÑUÔUÐ]aÐbÑbÔbÐbÑbØ‡L‚L�ÑÔ×Ò�cÐ$6­SÐ$6Ð$6Ð$6Ñ6¸eÐÑDÔDÐDÐDÐDr)   c            	      ó˜  ‡‡‡‡	‡
‡‡— dd l Š
dd l} g }t          D �]}}t          j        t
          |› d�z  ¦  «        Št          |¬¦  «        }dD �]!Š	ˆ	ˆ
ˆfd„Š ‰¦   «         Š‰
j        j         	                    ‰dd¬¦  «        \  }}t          j
        |j        ¦  «        t          j
        |j        ¦  «        cŠŠt          t          ‰‰¦  «        ¦  «        |d	‰	› d
�<   t          |                     ¦   «         ¦  «        |d	‰	› d�<   t#          ˆˆ	ˆ
ˆfd„d¦  «        |d	‰	› d�<   dt#          ˆˆfd„d¦  «        z  |d	‰	› d�<   |t$          v r%t          j        t(          |› d‰	› d�z  ‰‰¬¦  «         �Œ#|                     |¦  «         t-          |d¬¦  «         �Œ|                      |¦  «                             t2          dz  d¬¦  «         d S )Nr   r=   )rE   )ÚtrueÚestc                  óT  •— ‰j                              ‰j                             ‰d         ¦  «        ¦  «        } ‰dk    r&‰j                             ‰d         ¦  «        | _        nB|                      ‰j                              d¦  «        ¦  «         |                      d¦  «         | S )Nr>   r˜   ÚNé   )ÚgeometryÚ
PointCloudÚutilityÚVector3dVectorÚnormalsÚestimate_normalsÚKDTreeSearchParamKNNÚ'orient_normals_consistent_tangent_plane)ÚpcÚkindÚo3dÚzs    €€€r'   Úbuildzpoisson_step.<locals>.buildb   s�   ø€ Ø”\×,Ò,¨S¬[×-GÒ-GÈÈ#ÌÑ-OÔ-OÑPÔP�Ø˜6’>�>Ø!$¤×!;Ò!;¸A¸c¼FÑ!CÔ!C�B”J�Jà×'Ò'¨¬×(IÒ(IÈ"Ñ(MÔ(MÑNÔNÐNØ×>Ò>¸rÑBÔBÐBØ�	r)   é   r   ©ÚdepthÚ	n_threadsÚpoisson_rP   Ú_watertightc                  óh   •— ‰j         j                             ‰dk    r
 ‰ ¦   «         n‰dd¬¦  «        S )Nr™   rª   r   r«   )r�   ÚTriangleMeshÚcreate_from_point_cloud_poisson)r©   r¦   r§   r¥   s   €€€€r'   rD   zpoisson_step.<locals>.<lambda>p   s=   ø€ °#´,Ô2K×2kÒ2kØ 5š=˜=��‘”�¨b¸ÀQð 3lñ 3Hô 3H€ r)   é   Ú_msr   c                  ó$   •— t          ‰‰ ¦  «        S r@   )r4   )r0   r/   s   €€r'   rD   zpoisson_step.<locals>.<lambda>r   s   ø€ ½KÈÈ1Ñ<MÔ<M€ r)   éÈ   rS   Ú	_poisson_rc   Trm   úvs_poisson.csvFrq   )Úopen3drs   r   r!   rz   r€   r‚   r�   r±   r²   r   r|   Ú	trianglesÚabsr4   ÚboolÚis_watertightr(   r…   rˆ   rw   r   r‰   rŠ   r‹   rŒ   )r�   rŽ   r�   r’   r‘   r   r0   r/   r©   r¦   r§   r¥   r¨   s         @@@@@@@r'   Úpoisson_stepr¾   Y   sC  øøøøøøø€ ØÐÐÐØÐÐÐà€DÝð ñ ˆÝŒG•B˜D˜˜˜Ñ&Ñ'Ô'ˆÝ�TˆN‰NŒNˆØ#ð 	Fñ 	FˆDðð ð ð ð ð ð ð �‘”ˆBØ”<Ô,×LÒLÈRÐWXÐdeÐLÑfÔf‰DˆAˆqÝ”:˜aœjÑ)Ô)­2¬:°a´kÑ+BÔ+BˆDˆAˆqÝ'*­;°q¸!Ñ+<Ô+<Ñ'=Ô'=ˆAÐ#˜Ð#Ð#Ð#Ñ$Ý.2°1·?²?Ñ3DÔ3DÑ.EÔ.EˆAÐ*˜Ð*Ð*Ð*Ñ+Ý&)ð +Hð +Hð +Hð +Hð +Hð +Hð +HØIJñ'Lô 'LˆAÐ"˜Ð"Ð"Ð"Ñ#à*-µÐ4MÐ4MÐ4MÐ4MÐ4MÈsÑ0SÔ0SÑ*SˆAÐ&˜Ð&Ð&Ð&Ñ'Ø•vˆ~ˆ~Ý”� Ð:Ð:°Ð:Ð:Ð:Ñ:¸aÀ1ÐEÑEÔEÐEùØ�Š�A‰ŒˆÝˆa�tÐÑÔÐÑØ‡L‚L�ÑÔ×Ò�cÐ$4Ñ4¸EÐÑBÔBÐBÐBÐBr)   ))r;   zoriginal mesh)Úfcp_meshzFCP from the mesh)Ú
fcp_pointszFCP from 20k points)Úpoisson_truezPoisson, true normals)Úpoisson_estzPoisson, estimated normalsc                  óÐ	  — dd l } |                      d¦  «         dd lm} dd l}dd l}ddlm} t          ¦   «         }t          j
        g d¢¦  «        t          j                             g d¢¦  «        z  }ddddd	d
œ}|                     dt          t          ¦  «        z  dt          t           ¦  «        z  f¬¦  «        }t#          t           ¦  «        D �]»\  }	}
t          j        t&          |
› d�z  ¦  «        }|d                              d¦  «        |d                              d¦  «        }}||z   dz  ||z
                       ¦   «         dz  }}||j        |
k             j        d         }t#          t          ¦  «        D �]\  }\  }}t          j        t&          |
› d|› d�z  ¦  «        }|j                             |j                             |d         ¦  «        |j                             |d         ¦  «        ¦  «        }t          |d         ¦  «        dk    r|                     d¦  «        }|                     ¦   «          t          j        |j         ¦  «        t          j        |j!        ¦  «        t          j        |j"        ¦  «        }}}ddt          j#        ||z  ¦  «        z  z   }| $                    t          t           ¦  «        t          t          ¦  «        |	t          t          ¦  «        z  |z   dz   d¬¦  «        }| %                     |||         t          j&        |d d …d f         t          j
        ||         ¦  «        z           d¬¦  «        ¦  «         | '                    |d         |z
  |d         |z   ¦  «         | (                    |d         |z
  |d         |z   ¦  «         | )                    |d         |z
  |d         |z   ¦  «         | *                    d¦  «         | +                    dd¦  «         | ,                    ¦   «          |dk    rd n||d!z            d"›d#�}|	dk    r| -                    |d$¬%¦  «         | .                    d&d'|dk    r|
 /                    dd(¦  «        › d)|› �n||j0        d*d+¬,¦  «         �Œ�Œ½| 1                    ddd-ddd¬.¦  «         td           3                    d/d/¬0¦  «         | 4                    td          d1z  d2d3¬4¦  «         d S )5Nr   ÚAgg)ÚPoly3DCollection)g333333Ó?g      à¿gš™™™™™é?)ç…ëQ¸…ë?rÆ   g)\�Âõ(ì?)gš™™™™™á?ç      è?çffffffî?)çÍÌÌÌÌÌÜ?gÍÌÌÌÌÌä?rÈ   )rÈ   rÇ   ç      à?)rÈ   ç333333ã?rÉ   )r;   r¿   rÀ   rÁ   rÂ   gÍÌÌÌÌÌ@g      @)Úfigsizerd   r/   r+   r   r=   r0   i¨a  gffffffÖ?rË   r   Ú3d)Ú
projectionÚnone)Ú
facecolorsÚ
edgecolors)r   r   r   é   iÄÿÿÿr;   rG   Ú_errz+.2fú %é   )ÚfontsizerÊ   g{®Gáz”?ú z: Úcenteré   )Ú	transformÚharÖ   g
×£p=
ï?)ÚleftÚrightÚtopÚbottomÚwspaceÚhspaceTr8   zvolume_fig_renders.pngéZ   Úwhite)ÚdpiÚ	facecolor)5Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotr¹   rs   Úmpl_toolkits.mplot3d.art3drÅ   Útabler!   ÚarrayÚlinalgÚnormÚfigurerƒ   ÚCOLSr…   Ú	enumeraterz   rw   ÚminÚmaxrE   Úilocr�   r±   rŸ   r    ÚVector3iVectorÚsimplify_quadric_decimationÚcompute_triangle_normalsr   r|   rº   Útriangle_normalsr»   Úadd_subplotÚadd_collection3dÚc_Úset_xlimÚset_ylimÚset_zlimÚset_box_aspectÚ	view_initÚset_axis_offÚ	set_titleÚtext2DÚreplaceÚ	transAxesÚsubplots_adjustÚSECTIONrx   Úsavefig)ræ   Úpltr§   r�   rÅ   r%   ÚlightÚtintÚfigÚir�   Úz0ÚloÚhir3   r’   ÚrowÚjÚkeyÚlabelr¨   Úor/   r0   r›   ÚshÚaxÚtxts                               r'   Úrender_stepr  ~   s»  € ØÐÐÐà‡N‚N�5ÑÔÐØ#Ð#Ð#Ð#Ð#Ð#ØÐÐÐØÐÐÐØ;Ð;Ð;Ð;Ð;Ð;å‰Œ€AÝŒHÐ%Ð%Ð%Ñ&Ô&­¬¯ªÐ8HÐ8HÐ8HÑ)IÔ)IÑI€EØ&Ð4FÐVhØ-Ð>OðQð Q€Dà
�*Š*˜c¥C­¡I¤I™o¨sµS½±[´[Ñ/@ÐAˆ*Ñ
BÔ
B€CÝ�VÑ$Ô$ð 0ñ 0‰ˆˆ4ÝŒW•R˜TÐ,Ð,Ð,Ñ,Ñ-Ô-ˆØ�C”—’˜Q‘”  C¤§¢¨Q¡¤ˆBˆØ�R‘˜1‰}˜r B™wŸmšm™oœo°Ñ1ˆ1ˆØ�”˜’ÔÔ# AÔ&ˆÝ(­™œð 	0ñ 	0‰OˆA‰|��UÝ”� Ð0Ð0 sÐ0Ð0Ð0Ñ0Ñ1Ô1ˆAØ”×)Ò)¨#¬+×*DÒ*DÀQÀsÄVÑ*LÔ*LÈcÌk×NhÒNhÐijÐknÔioÑNpÔNpÑqÔqˆAÝ�1�S”6‰{Œ{˜UÒ"Ð"Ø×1Ò1°%Ñ8Ô8�Ø×&Ò&Ñ(Ô(Ð(Ý”j ¤Ñ,Ô,­b¬j¸¼Ñ.EÔ.EÅrÄzÐRSÔRdÑGeÔGe�!ˆqˆAØ˜�bœf Q¨¡YÑ/Ô/Ñ/Ñ/ˆBØ—’¥¥V¡¤­cµ$©i¬i¸½SÅ¹Y¼Y¹ÈÑ9JÈQÑ9NÐ[_�Ñ`Ô`ˆBØ×ÒÐ 0Ð 0°°1´Å"Ä%ÈÈ1È1È1ÈdÈ7ÌÕVXÔV^Ð_cÐdgÔ_hÑViÔViÑHiÔBjÐw}Ð ~Ñ ~Ô ~ÑÔÐØ�KŠK˜˜!œ˜q™ ! A¤$¨¡(Ñ+Ô+Ð+Ø�KŠK˜˜!œ˜q™ ! A¤$¨¡(Ñ+Ô+Ð+Ø�KŠK˜˜!œ˜q™ ! A¤$¨¡(Ñ+Ô+Ð+Ø×Ò˜iÑ(Ô(Ð(Ø�LŠL˜˜SÑ!Ô!Ð!Ø�OŠOÑÔÐØ  Fš]˜]�'�'°3°s¸V±|Ô3DÐ0MÐ0MÐ0MÐ0MˆCØ�AŠvˆvØ—’˜U¨R�Ñ0Ô0Ð0Ø�IŠI�c˜4ÀqÈAÂvÀv D§L¢L°°cÑ$:Ô$:Ð!CÐ!C¸cÐ!CÐ!CÐ!CÐSVÐbdÔbnØ!¨Bð ñ 0ô 0ð 0ñ 0ñ'	0ð* ×Ò˜Q a¨T¸!ÀAÈaÐÑPÔPÐPÝ‡M‚M˜$¨€MÑ.Ô.Ð.Ø‡K‚K•Ð2Ñ2¸Àg€KÑNÔNÐNÐNÐNr)   c                  ó8  — dd l } |                      t          dz  ¦  «                             |                      t          dz  ¦  «        d¬¦  «        }g d¢}t          D ]˜\  }}}t          d|› d�z                       ¦   «         rr|                      t          d|› d�z  ¦  «        }|dgd	„ |D ¦   «         z                                 |fd
„¬¦  «        }|                     |d¬¦  «        }||dz   |dz   gz  }Œ™|D ]!}d||dz            |j        z  dz
  z  ||dz   <   Œ"|S )Nr   z
vs_fcp.csvr¸   rE   )Úon)r¿   rÀ   rÁ   rÂ   ro   rp   c                 ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS )rO   )Ú
startswith)ri   r3   s     r'   ú
<listcomp>ztable.<locals>.<listcomp>³   s)   € ÐBÐBÐB 1¨Q¯\ª\¸&Ñ-AÔ-AÐB˜QÐBÐBÐBr)   c                 ó6   — |                       d|dz   d¦  «        S )NrO   r   r   ©r  )r3   Úpres     r'   rD   ztable.<locals>.<lambda>³   s6   € Ðfg×foÒfoÐpvÐx{ð  Bñ  yBð  DEñ  gFô  gF€ r)   )ÚcolumnsÚ_meshÚ_pointséd   rP   r   rÓ   )rs   Úread_csvrŒ   ÚmergeÚVARIANTSÚexistsÚrenamerG   )r�   r%   ÚkeysÚtagr!  r   r2   rj   s           r'   rë   rë   «   sg  € ØÐÐÐà
�Š•C˜,Ñ&Ñ'Ô'×-Ò-¨b¯kªk½#Ð@PÑ:PÑ.QÔ.QÐV[Ð-Ñ\Ô\€AØDÐDÐD€DÝð 5ð 5‰ˆˆS�!ÝÐ$˜3Ð$Ð$Ð$Ñ$×,Ò,Ñ.Ô.ð 	5Ø—’�CÐ"4¨3Ð"4Ð"4Ð"4Ñ4Ñ5Ô5ˆAØ�5�'ÐBÐB¨ÐBÑBÔBÑBÔC×JÒJÐadð  TFð  TFð  TFÐJñ  Gô  GˆAØ—’˜˜e�Ñ$Ô$ˆAØ�S˜7‘] C¨)¡OÐ4Ñ4ˆDøØð <ð <ˆØ˜q  V¡œ}¨q¬wÑ6¸Ñ:Ñ;ˆˆ!ˆf‰*‰ˆØ€Hr)   c                  ó  ‡‡— t          ¦   «         Š‰                     t          dz  d¬¦  «         dAd„Šˆfd„} dd d d‰j                             ¦   «         fd	d
‰j                             ¦   «          ‰‰j                             ¦   «         d¦  «        › d�‰j                             ¦   «         fdd‰j                             ¦   «          ‰‰j	                             ¦   «         d¦  «        › d�‰j
                             ¦   «         fdd‰j                             ¦   «         dd‰j                             ¦   «         z  dz  fdd‰j                             ¦   «         d‰j                             ¦   «         fg}g g }}|D �]\  }}}}}|r | |¦  «        nd}	|r@t          ‰|dz                                 ¦   «         dk                         ¦   «         ¦  «        nt%          ‰¦  «        }
|                     d|› d|sdn ‰|	d         ¦  «        › d|sdn ‰|	d         ¦  «        › d|
› dt%          ‰¦  «        › d|€dn ‰|d¦  «        › |sdnd|› d�› d ‰|d¦  «        › d �¦  «         |                     t)          |pd|	d         |	d         |
||¬!¦  «        ¦  «         �Œ!dd l}|                     |¦  «                             t          d"z  d¬¦  «         d                     ˆfd#„‰                     ¦   «         D ¦   «         ¦  «        } | d
¦  «         | d¦  «         | d¦  «         | d¦  «        f\  }}}}‰‰j                             ¦   «         d$k                                  d%d¬&¦  «        }d'                     d(„ t7          |j        |j        ¦  «        D ¦   «         ¦  «        }d                     g d)‘d                     |¦  «        › ‘d*‘ ‰|d         ¦  «        › ‘d+‘ ‰|d         ¦  «        › ‘d,‘ ‰|d         ¦  «        › ‘d-‘ ‰|d         ¦  «        › ‘d.‘ ‰|d         ¦  «        › ‘d/‘ ‰|d         ¦  «        › ‘d0‘t%          |¦  «        › ‘d1‘t%          ‰¦  «        › ‘d2‘|› ‘d3‘ ‰‰j
                             ¦   «         d¦  «        › ‘d‘ ‰‰j
                             ¦   «         d¦  «        › ‘d4‘ ‰‰j                             ¦   «         d¦  «        › ‘d‘ ‰‰j                             ¦   «         d¦  «        › ‘d5‘t          ‰j
        ‰j        k                          ¦   «         ¦  «        › ‘d1‘t%          ‰¦  «        › ‘d6‘ ‰‰j                             ¦   «         ‰‰j        ‰j                             ¦   «         k             j
        j        d         z  d¦  «        › ‘d7‘ ‰‰j                             ¦   «         dz  d¦  «        › ‘d‘ ‰‰j                             ¦   «         dz  d¦  «        › ‘d8‘ ‰‰j                             ¦   «         dz  d¦  «        › ‘d9‘ ‰‰j	                             ¦   «         dz  d¦  «        › ‘d:‘ ‰‰j                             ¦   «         dz  d¦  «        › ‘d;‘|› ‘d<‘¦  «        }t          d=z                        |¦  «         d>}t          d?z   !                    ¦   «         }| "                    ¦   «         |vr8t          d?z                        | #                    d@¦  «        d@z   |z   ¦  «         d S d S )BNzvolume_objects.csvFrq   r+   c                 ó"   — | | k    rdn| d|› d�›S )Nú&ndash;ú.r#   rA   )rk   r$   s     r'   rD   zsection_step.<locals>.<lambda>¾   s   €  A¨¢F F�y�y°1°°q°°°°€ r)   c                 óÀ   •— ‰| dz                                  ¦   «                              ¦   «         ‰| dz                                  ¦   «                              ¦   «         fS )NrÓ   )r»   r"   ró   )rj   r%   s    €r'   rD   zsection_step.<locals>.<lambda>¿   sL   ø€ �A�a˜&‘j”M×%Ò%Ñ'Ô'×.Ò.Ñ0Ô0°!°A¸±J´-×2CÒ2CÑ2EÔ2E×2IÒ2IÑ2KÔ2KÐL€ r)   z+exact: tetrahedron sum over the source meshr   z1FCP from the mesh (encode 2048 atoms, 128 layers)r¿   r   z ms on CUDAz-FCP from 20k points (same encode, no normals)rÀ   z8screened Poisson (depth 8) from 20k points, true normalsrÁ   z1 threadr   z^screened Poisson from 20k points, normals estimated (30 neighbours, tangent-plane orientation)rÂ   z1 thread, normals included)ç        r2  rÓ   r   ú <tr><td style='text-align:left'>ú	</td><td>rG   z / r/  z (ú)ú
</td></tr>)ÚmethodÚerr_med_pctÚerr_max_pctÚwithin_1pctÚbuild_ms_medianÚvolume_us_medianzvolume_data.csvc              3   óê  •K  — | ]í}d |j                              dd¦  «        › d|j        › d ‰|j        ¦  «        › d ‰|j        ¦  «        › d ‰|j        ¦  «        › d ‰|j        ¦  «        › d ‰|j        d¦  «        › d ‰|j        d¦  «        › d ‰|j	        d¦  «        › d ‰|j
        d¦  «        › d ‰|j        d¦  «        › d ‰|j        d¦  «        › d ‰|j        d¦  «        › d�V — ŒîdS )r3  r   r×   r4  r   r6  N)rE   r  rF   Úfcp_mesh_errÚfcp_points_errÚpoisson_true_errÚpoisson_est_errrH   Úfcp_points_vol_usÚfcp_mesh_enc_cpu_msÚfcp_points_enc_cpu_msÚfcp_points_enc_cuda_msÚpoisson_true_msÚpoisson_est_ms)ri   r’   r#   s     €r'   ú	<genexpr>zsection_step.<locals>.<genexpr>×   sÐ  øè è € ð !ð !ð
 ð		}¨1¬5¯=ª=¸¸cÑ+BÔ+Bð 	}ð 	}ÈQÌWð 	}ð 	}Øˆq�”Ñ Ô ð	}ð 	}Ø+,¨1¨QÔ-=Ñ+>Ô+>ð	}ð 	}ØIJÈÈ1ÔK]ÑI^ÔI^ð	}ð 	}ØijÐijÐklÔk|Ñi}Ôi}ð	}ð 	}àˆq�”˜QÑÔð	}ð 	}à*+¨!¨AÔ,?ÀÑ*CÔ*Cð	}ð 	}àNOÈaÐPQÔPeÐghÑNiÔNið	}ð 	}àtuÐtuÐvwô  wNð  PQñ  uRô  uRð	}ð 	}ð ˆq�Ô)¨1Ñ-Ô-ð	}ð 	}ð 9:¸¸!Ô:KÈQÑ8OÔ8Oð	}ð 	}ð [\ÐZ[Ð\]Ô\lÐnoÑZpÔZpð	}ð 	}ð 	}ð!ð !ð !ð !ð !ð !r)   r   rA  )Ú	ascendingz, c              3   óV   K  — | ]$\  }}|                      d d¦  «        › d|d›d�V — Œ%dS )r   r×   z+.0frÔ   Nr   )ri   r  Úes      r'   rH  zsection_step.<locals>.<genexpr>ß   sH   è è € ÐiÐi¹t¸qÀ!˜!Ÿ)š) C¨Ñ-Ô-Ð:Ð:°Ð:Ð:Ð:Ð:ÐiÐiÐiÐiÐiÐir)   aR  <h2>Volume straight from the descriptor</h2>
<p>Package v5.31 (commit db3e6ceb; the working tree only raises <code>MAX_ATOMS</code>), defaults
(<code>parts="tracked-fit"</code>, <code>interp="poly"</code>, the gwn point slicer), 128 layers, 2048 atoms; the 12 objects
of the collision section. The exact volume is the source mesh's (tetrahedra over its faces). From each mesh, 20k
area-uniform surface points (seed 3) with the true normals; every point method gets the same points.
<b>FCP's volume is one contraction of the stored atoms</b>: a ring's area is &pi;&nbsp;&Sigma;<sub>k</sub>&nbsp;k&nbsp;(a<sub>x,k</sub>b<sub>y,k</sub>&nbsp;&minus;&nbsp;b<sub>x,k</sub>a<sub>y,k</sub>)
in its Fourier coefficients, and the height atoms are orthonormal on a part's layer centres, so the sum of the ring areas
over the layers is the same expression in the atom vectors: V&nbsp;=&nbsp;dz&nbsp;&middot;&nbsp;&prod;scale&nbsp;&middot;&nbsp;&pi;&nbsp;&Sigma;<sub>parts</sub>&nbsp;sign&nbsp;&middot;&nbsp;|&Sigma;<sub>k</sub>&nbsp;k&nbsp;(&lang;a<sub>x,k</sub>,&nbsp;b<sub>y,k</sub>&rang;&nbsp;&minus;&nbsp;&lang;b<sub>x,k</sub>,&nbsp;a<sub>y,k</sub>&rang;)|
(the midpoint rule over the layers; no ring is evaluated, no grid, no mesh; one numba loop). Standard route from points:
screened Poisson reconstruction (Open3D 0.20, depth 8), then its mesh's volume, with the true normals (the best case) and
with normals estimated from the points (what a scan gives). CPU: Intel i5-10400F; FCP's encode on numba's 12 threads and on a
GTX 1650; Poisson on one thread (its threaded run was slower here). Times are medians over the objects.</p>
<div class="tablewrap"><table>
<thead><tr><th style='text-align:left'>method</th><th>volume error, median |%|</th><th>max |%|</th><th>objects within 1 %</th>
<th>building the representation, ms</th><th>the volume, &micro;s</th></tr></thead>
<tbody>z9</tbody></table></div>
<p><b>Accuracy:</b> FCP is within z- % of the exact volume from the mesh (median z %) and within z % from the
points (median zH %), without normals; Poisson with the true normals is as close (median z %, max z? %). With
estimated normals Poisson is off by more than 5 % on z of z
 objects (z ): on the thin-walled ones the
orientation flips across a wall and the surface closes over the opening (renders). <b>Time:</b> once encoded, FCP's volume takes zN &micro;s,
about the cost of the tetrahedron sum over the source mesh itself (z &micro;s, numba):
faster on z= objects, the gain growing with the mesh (spring, 77k faces: z-&times;);
the volume of a Poisson mesh takes z1 ms (NumPy). The cost from points is the encode:
z s on the CPU and z s on CUDA (median), against aA   s for Poisson
on one thread; the descriptor, once made, also answers the other queries of this report. Caveats: clean, complete,
uniformly sampled points; Poisson's meshes are not watertight by Open3D's strict test (the volume is taken as is, its sign
ignored); learned reconstruction is not compared.</p>
<div class="tablewrap"><table>
<thead><tr><th style='text-align:left'>object</th><th>mesh faces</th><th>FCP from mesh, error %</th><th>FCP from points, error %</th>
<th>Poisson, true normals, error %</th><th>Poisson, estimated normals, error %</th><th>exact volume, &micro;s</th>
<th>FCP volume, &micro;s</th><th>FCP encode from mesh, ms (CPU)</th><th>FCP encode from points, ms (CPU)</th>
<th>FCP encode from points, ms (CUDA)</th><th>Poisson, true normals, ms</th><th>Poisson, estimated normals, ms</th></tr></thead>
<tbody>aD  </tbody></table></div>
<figure><img src="sections/hull/volume_fig_renders.png" alt="Six objects: the original mesh, FCP decoded from the mesh and from 20k points, Poisson with true and with estimated normals, each with its volume error">
<figcaption>The surfaces behind the volumes: the original mesh, the FCP descriptor decoded (from the mesh and from 20k points;
the volume itself is computed from the atoms, not from this mesh), and Poisson's reconstruction with the true and with
estimated normals; under each, the volume error against the exact volume.</figcaption></figure>
zvolume_section.htmlzÉ
volume_*: ~/code/data/meshes/fcp_3010_hull/scripts/volume_study.py (steps in its docstring); volume_data.csv: the first table; volume_objects.csv: per object (errors in %, times in ms / us as named).
z
README.txtú
)r+   )$rë   r‹   r  rH   r"   rC  Úfcp_mesh_enc_cuda_msÚfcp_mesh_vol_usrD  rE  rB  rF  Úpoisson_true_vol_usrG  Úpoisson_est_vol_usÚintr»   Úsumrƒ   r   r‚   rs   rŠ   ÚjoinÚ
itertuplesrA  Úsort_valuesÚziprE   rò   ró   rô   Ú
write_textÚ	read_textÚstripÚrstrip)ÚamÚmethodsrŽ   Údatar  rj   r©   ÚnoteÚvusrK  Úwithinr�   ÚorowsÚfmÚfpÚptÚpeÚbadÚbadtxtÚhtmlÚreadmer#   r%   s                        @@r'   Úsection_steprj  »   sš
  øø€ Ý‰Œ€AØ‡H‚H�WÐ+Ñ+°5€HÑ9Ô9Ð9Ø<Ð<Ð<€AØ	LÐ	LÐ	LÐ	L€Bà	6¸¸dÀBÈÌ
×HYÒHYÑH[ÔH[Ð\Ø	<¸jØ	
Ô	×	%Ò	%Ñ	'Ô	'¨A¨A¨aÔ.D×.KÒ.KÑ.MÔ.MÈqÑ,QÔ,QÐ)^Ð)^Ð)^Ð`aÔ`q×`xÒ`xÑ`zÔ`zð	|à	8¸,Ø	
Ô	 ×	'Ò	'Ñ	)Ô	)¨a¨a°Ô0H×0OÒ0OÑ0QÔ0QÐSTÑ.UÔ.UÐ+bÐ+bÐ+bÐdeÔdw×d~Òd~ñ  eAô  eAð	Bà	CÀ^ÐUVÔUf×UmÒUmÑUoÔUoÐq{Ø	ˆqÔ$×+Ò+Ñ-Ô-Ñ	-°Ñ	3ð	5à	iÐkxØ	
Ô	×	 Ò	 Ñ	"Ô	"Ð$@À!ÔBV×B]ÒB]ÑB_ÔB_ð	að
€Gð �Rˆ$€DØ&-ð 0ñ 0Ñ"ˆˆq�%˜˜sØÐ&ˆBˆBˆq‰EŒEˆE˜JˆØ:;ÐG•�a˜˜F™
”m×'Ò'Ñ)Ô)¨QÒ.×3Ò3Ñ5Ô5Ñ6Ô6Ð6ÅÀQÁÄˆØ�Šð 1°uð 1ð 1ÐVWÐGdÀwÀwÐ]^Ð]^Ð_`ÐabÔ_cÑ]dÔ]dð 1ð 1Ð~ð  pMÐovÐovð  FGð  FGð  HIð  JKô  HLñ  FMô  FMð 1ð 1Ø!ð1ð 1Ý&)¨!¡f¤fð1ð 1ØDIÀM°y°yÐWXÐWXÐY^Ð`aÑWbÔWbð1Ønrð  eEÐdfÐdfð  yEð  ~Bð  yEð  yEð  yEð1ð 1à˜1˜S !™9œ9ð1ð 1ð 1ñ 	2ô 	2ð 	2ð 	�Š•D   W¸!¸A¼$ÈAÈaÌDÐ^dÐv{Ø*-ð/ñ /ô /ñ 	0ô 	0ð 	0ñ 	0àÐÐÐà‡L‚L�ÑÔ×Ò�gÐ(9Ñ9ÀÐÑGÔGÐGØ�GŠGð !ð !ð !ð !ð
 —’‘”ð!ñ !ô !ñ !ô !€Eð �R˜
‘^”^ R R¨Ñ%5Ô%5°r°r¸.Ñ7IÔ7IÈ2È2ÈmÑK\ÔK\Ð\�N€BˆˆB�Ø
ˆAÔ×!Ò!Ñ#Ô# aÒ'Ô
(×
4Ò
4Ð5FÐRWÐ
4Ñ
XÔ
X€CØ�YŠYÐiÐiÅsÈ3Ì7ÐTWÔTgÑGhÔGhÐiÑiÔiÑiÔi€Fð%÷ %ò %ð %ð %ð %ð 	�Š�‰Œð%ð %ð %ð %ð  $% 1 R¨¤U¡8¤8ð!%ð %ð %ð %ð  [\ÐZ[Ð\^Ð_`Ô\aÑZbÔZbð!%ð %ð %ð %ð  tuÐstÐuwÐxyÔuzÑs{Ôs{ð!%ð %ð %ð %ð" ��"�Q”%‘”ð#%ð %ð %ð %ð" cdÐbcÐdfÐghÔdiÑbjÔbjð#%ð %ð %ð %ð" uvÐtuÐvxÐyzÔv{Ñt|Ôt|ð#%ð %ð %ð %õ$ 7:¸#±h´hð%%ð %ð %ð %õ$ EHÈÁFÄFð%%ð %ð %ð %ð$ W]ð%%ð %ð %ð %ð& CDð  CDð  EFô  EX÷  E\ò  E\ñ  E^ô  E^ð  `añ  Cbô  Cbð'%ð %ð %ð %ð& klð  klð  mnô  m@÷  mDò  mDñ  mFô  mFð  HIñ  kJô  kJð'%ð %ð %ð %ð( EFÀAÀaÄjÇnÂnÑFVÔFVÐXYÑDZÔDZð)%ð %ð %ð %ð( deÐcdÐefÔeo×esÒesÑeuÔeuÐwxÑcyÔcyð)%ð %ð %ð %õ* �Ô# a¤jÒ0×5Ò5Ñ7Ô7Ñ8Ô8ð+%ð %ð %ð %õ* ?BÀ!¹f¼fð+%ð %ð %ð %ð* DEð  DEð  FGô  FP÷  FTò  FTñ  FVô  FVð  YZð  [\ô  [eð  ijô  is÷  iwò  iwñ  iyô  iyò  [yô  Yzô  YLô  YQð  RSô  YTñ  FTð  VWñ  DXô  DXð+%ð %ð %ð %ð, %& A aÔ&;×&?Ò&?Ñ&AÔ&AÀCÑ&GÈÑ$KÔ$Kð-%ð %ð %ð %ð, UVÐTUÐVWÔVk×VoÒVoÑVqÔVqÐtwÑVwÐyzÑT{ÔT{ð-%ð %ð %ð %ð. €€1Ô×!Ò!Ñ#Ô# cÑ)¨1Ñ-Ô-ð/%ð %ð %ð %ð. BCÀÀ1ÔC[×CbÒCbÑCdÔCdÐgjÑCjÐlmÑAnÔAnð/%ð %ð %ð %ð. NOð  NOð  PQô  Pa÷  Phò  Phñ  Pjô  Pjð  mpñ  Ppð  rsñ  Ntô  Ntð/%ð %ð %ð %ð@ 	ðA%ð %ð %ð %ñ %ô %€DõL Ð$Ñ$×0Ò0°Ñ6Ô6Ð6ð@€Då˜Ñ$×/Ò/Ñ1Ô1€FØ‡z‚z�|„|˜6Ð!Ð!Ý	�<Ñ	×+Ò+¨F¯MªM¸$Ñ,?Ô,?À$Ñ,FÈÑ,MÑNÔNÐNÐNÐNð "Ð!r)   Ú__main__)rZ   ÚpoissonÚrenderÚsectionc                  ó   — d S r@   rA   rA   r)   r'   rD   rD     s   € Ðqu€ r)   )r   )*Ú__doc__ÚjsonÚsysr   Úpathlibr   Únumpyr!   ÚargvÚSTEPr�   ÚinsertÚstrÚ__file__ÚparentÚhullr   ÚresolveÚROOTrŒ   r€   rw   Úhomer  ÚosrQ  ÚenvironÚgetrX   rW   r(  r†   r…   r(   r4   r–   r¾   rð   r  rë   rj  Ú__name__rA   r)   r'   ú<module>rƒ     sk  ððð ð €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð à
„x�„{€ØŒH�QŒK˜Ð€„Ø „‡‚��3�3�t�t˜H‘~”~Ô,Ñ-Ô-Ñ .Ô .Ð .Ø Ð Ð Ð Ð Ð à€tˆH�~„~×ÒÑÔÔ&Ô-€Ø�U‰l˜D 8™O¨T°OÑ-C€€€RˆØ
ˆ$Œ)‰+Œ+ÐCÑ
C€Ø 	€	€	€	Ø	ˆˆRŒZ�^Š^˜L¨#Ñ.Ô.Ñ	/Ô	/€ØˆˆBŒJ�NŠN˜;¨Ñ-Ô-Ñ.Ô.€à:Ð<oÐp€Ø�UˆO˜{Ò*Ð*€b€bÀÈ#ÂÀ°°U°°°ÐShÐX^ÐShÐShÐafÐShÐSh€Ø	=Ð	=Ð	=€ð%ð %ð %ð %ð>ð >ð >ð
 Eð  Eð  EðFCð Cð CðBbð bð b€ð*Oð *Oð *OðZð ð ð POð POð POðf ˆzÒÐØvˆH ¸ÐQ]Ð^Ð^×bÒbÐcgÐiuÐiuÑvÔvÑxÔxÐxÐxÐxð Ðr)   