§
     �âj�  ã                   ó(  — d 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ddl	Z	ej
                             d e ee¦  «        j        ¦  «        ¦  «         ddlmZmZmZmZmZ ddlZddlmZ ddlmZ ddlmZmZ ddlmZ  e ed	¦  «        d
          ed	¦  «        d         z
  ¦  «        Zddej         fdœZ!e! "                    d„ dD ¦   «         ¦  «         g d¢Z#dZ$edz  Z%g d¢Z&ej'        Z(i Z)d„ Z*d„ Z+d„ Z,d„ Z-d„ Z.d„ Z/e0dk    r e/¦   «          dS dS )aÀ  The fewest parts for a tolerance: each track partitioned by dynamic programming into the fewest pieces (at least FIT_MIN
layers; a track shorter than 2 FIT_MIN stays whole, as in split_by_fit) whose full fit (the piece's own height basis) misses
no ring by more than the tolerance; among those, the least total squared miss (which puts the cuts on the events). The miss
is "shape" (RMS distance, each ring's samples to the other's polyline, both ways; the tolerance in layer heights) or "coef"
(split_by_fit's own measure: RMS in coefficients, Parseval, start points by continuity; the tolerance FIT_TOL). Against the
package's greedy split ("greedy"). Swapped in for split_by_fit (no package change). Meshes only, default N, M, KAPPA.
Writes ../report/dp_split.csv and renders ../report/img/dp_<object>_<config>_a<atoms>.png.

    env -u PYTHONPATH PYTHONWARNINGS=ignore .venv/bin/python ~/code/data/meshes/fcp_2810_partition/scripts/dp_split.py [objects...]
é    N)ÚPath)ÚDEVICEÚOBJÚREPORTÚUPÚRef)Ú_parts)Úcentres)ÚIMGÚrender)Úringsé€   é   Úcoef)Úgreedyzdp-coefc                 ó0   — i | ]}d |d›�d|t           z  f“ŒS )z	dp-shape-ÚgÚshape)ÚLH)Ú.0Úts     úB/home/joao/code/data/meshes/fcp_2810_partition/scripts/dp_split.pyú
<dictcomp>r      s/   € ÐTÐTÐT¸Ð!˜AÐ!Ð!Ð! G¨Qµ©VÐ#4ÐTÐTÐTó    )gš™™™™™¹?g333333Ã?gš™™™™™É?g333333Ó?)é   é   é   )r   r   zdp_split.csv)ÚobjectÚconfigÚatomsÚpartsÚworst_lhÚover_025ÚchamferÚp95Ún_meanÚn_over30Úsecondsc                 ó°   — d„ }t          j        t          j        t          j         || |¦  «         ||| ¦  «        gd¦  «        dz  d¬¦  «        ¦  «        S )z¸Per ring: RMS distance between rings A and B (R, T, 2), each one's samples to the other's polyline, both ways;
    brute force over the samples, then the nearest vertex's two segments.c           	      óJ  — | dz                        d¦  «        d d …d d …d f         |dz                        d¦  «        d d …d d d …f         z   dt          j        d| |¦  «        z  z
  }t          j        |d¬¦  «        }|j        d         }t          j        t          | ¦  «        ¦  «        d d …d f         }t          j        |j        t          j        ¦  «        }dD ]È}||||z   |z  f         ||||z   dz   |z  f         }	}|	|z
  }
t          j	        | |z
  |
z                        d¦  «        t          j
        |
|
z                        d¦  «        d¦  «        z  dd¦  «        }t          j        |t          j                             | |z
  |d	         |
z  z
  d¬¦  «        ¦  «        }ŒÉ|S )
Né   éÿÿÿÿzrtc,rsc->rts©Úaxisr   )r,   r   g ÂëþKH´9r   ).N)ÚsumÚnpÚeinsumÚargminr   ÚarangeÚlenÚfullÚinfÚclipÚmaximumÚminimumÚlinalgÚnorm)ÚPÚQÚd2ÚjÚTÚrÚbestÚsÚaÚbÚabÚus               r   Úone_wayzmiss_batch.<locals>.one_way*   s–  € Ø�1‰f�\Š\˜"ÑÔ˜a˜a˜a    D˜jÔ)¨Q°!©V¯LªL¸Ñ,<Ô,<¸Q¸Q¸QÀÀaÀaÀa¸ZÔ,HÑHÈ1ÍrÌyÐYgÐijÐlmÑOnÔOnÑKnÑnˆÝŒI�b˜qÐ!Ñ!Ô!ˆØŒG�AŒJˆÝŒI•c˜!‘f”fÑÔ˜a˜a˜a ˜gÔ&ˆÝŒw�q”w¥¤Ñ'Ô'ˆØð 	Xð 	XˆAØ�Q˜˜Q™ !™�^Ô$ a¨¨A°©E°A©I¸©?Ð(:Ô&;ˆqˆAØ�Q‘ˆBÝ”˜!˜a™% 2™×*Ò*¨2Ñ.Ô.µ´¸RÀ"¹W¿MºMÈ"Ñ<MÔ<MÈuÑ1UÔ1UÑUÐWXÐZ[Ñ\Ô\ˆAÝ”:˜d¥B¤I§N¢N°1°q±5¸1¸Y¼<È"Ñ;LÑ3LÐSU NÑ$VÔ$VÑWÔWˆDˆDØˆr   r   r+   r-   )r0   ÚsqrtÚmeanÚconcatenate)ÚAÚBrH   s      r   Ú
miss_batchrN   '   s^   € ðð ð õ Œ7•2”7�2œ>¨7¨7°1°a©=¬=¸'¸'À!ÀQ¹-¼-Ð*HÈ!ÑLÔLÐPQÑQÐXYÐZÑZÔZÑ[Ô[Ð[r   c                 ó°  — t          j        t          j        | ¦  «                             ¦   «         ¦  «                             ¦   «         ||f}|t          v rt          |         S t          | ¦  «        | j        d         }}t          j	        |d¦  «        }d|d<   t          j        | |¦  «        }|dk    r't          t          j        | t          ¦  «        ¦  «        nd}	i }
|dt          j        z  k     r|gnt!          t          j        |dz   ¦  «        }|D �]5}t          j        ||¦  «        \  }}t!          d||z
  dz   ¦  «        D �]}||z   }|dt          j        z  k    r,|r|t          j        k     s||k     r||z
  t          j        k     rŒG|||…                              |d¦  «        }||j        |z  z  }|d	k    rKt          j        ||z
                       |d|¦  «        dz  |z                       d
¦  «        ¦  «        |
||f<   ŒÃt-          |	||…         t          |                     |d|¦  «        ¦  «        ¦  «        |
||f<   �Œ�Œ7|
t          |<   |
S )zdmiss[(i, j)]: per ring of the piece i..j-1, the full fit's miss (canonical units). Cached per track.r+   g      à?g      ð?r   r   Nr   r,   r   )r   r+   )ÚhashlibÚsha1r0   ÚascontiguousarrayÚtobytesÚ	hexdigestÚ_cacher4   r   r5   r	   Úcontinuous_startr   ÚasarrayÚfloatÚFIT_MINÚrangeÚ
orth_basisÚreshaper@   rI   r/   rN   )ÚCrL   ÚMÚkindÚkeyÚnÚKÚwÚCnÚslicedÚoutÚlengthsÚLr=   Ú_Úir?   ÚXÚXfs                      r   Úpiece_missesrm   9   sC  € åŒ<�Ô,¨QÑ/Ô/×7Ò7Ñ9Ô9Ñ:Ô:×DÒDÑFÔFÈÈ4Ð
P€CØ
�f€}€}Ý�cŒ{ÐÝˆq‰6Œ6�1”7˜1”:€q€AÝ
Œ��3‰Œ€AØ€A€a�DÝ	Ô	   AÑ	&Ô	&€BØ,0°GªO¨O�U•2”:˜a¥Ñ'Ô'Ñ(Ô(Ð(À€FØ
€CØ˜�Vœ^Ñ+Ò+Ð+ˆqˆcˆcµµv´~ÀqÈ1ÁuÑ1MÔ1M€GØð Pñ PˆÝÔ   AÑ&Ô&‰ˆˆ1Ý�q˜!˜a™% !™)Ñ$Ô$ð 		Pñ 		PˆAØ�A‘ˆAØ�A�œÑ&Ò&Ð&¨AÐ&°!µf´nÒ2DÐ2DÈÈAÊÈÐRSÐVWÑRWÕZ`ÔZhÒRhÐRhØØ�1�Q�3”—’  2Ñ&Ô&ˆAØ�a”c˜A‘g‘ˆBØ�vŠ~ˆ~ÝœG q¨2¡v×&6Ò&6°q¸!¸QÑ&?Ô&?À1Ñ&DÈÑ%I×$NÒ$NÈvÑ$VÔ$VÑWÔW��A�q�D‘	�	å& v¨a°¨c¤{µE¸"¿*º*ÀQÈÈ1Ñ:MÔ:MÑ4NÔ4NÑOÔO��A�q�D‘	‘	ñ		Pð …Fˆ3�KØ€Jr   c                 óú  — ddi}t          d| dz   ¦  «        D �]}g }|D ]‹}|                     ||f¦  «        }|�p|                     ¦   «         |k    rX|                     ||         d         dz   ||         d         t	          |dz                       ¦   «         ¦  «        z   |f¦  «         ŒŒ|sv|D ]s}|                     ||f¦  «        }|�X|                     ||         d         dz   ||         d         dt	          |                     ¦   «         ¦  «        z  z   |f¦  «         Œt|rt          |¦  «        ||<   �Œ!g | }}|r'||         d         }|                     |¦  «         |}|°'t          |¦  «        dd…         S )zVThe fewest pieces whose misses are all within tol; ties: the least total squared miss.r   )r   g        Nr   Nr+   g    €„.A)rZ   ÚgetÚmaxÚappendrX   r/   ÚminÚsorted)	ra   ÚmissÚtolrB   r?   Úcandrj   ÚmÚcutss	            r   Údp_cutsry   U   s•  € àˆ~Ð€DÝ�1�a˜!‘e‰_Œ_ð  ñ  ˆØˆØð 	Uð 	UˆAØ—’˜!˜Q˜Ñ Ô ˆAØˆ} §¢¡¤¨C¢ Ø—’˜T !œW QœZ¨!™^¨T°!¬W°Q¬Z½%ÀÀaÁÇÂÁÄÑ:OÔ:OÑ-OÐQRÐSÑTÔTÐTøØð 	XØð Xð X�Ø—H’H˜a ˜VÑ$Ô$�Ø�=Ø—K’K  a¤¨¤¨a¡°°a´¸´¸cÅEÈ!Ï%Ê%É'Ì'ÁNÄNÑ>RÑ1RÐTUÐ VÑWÔWÐWøØð 	 Ý˜$‘i”iˆD�‰GùØ�!ˆ!€DØ
ð Ø�ŒG�AŒJˆØ�Š�A‰ŒˆØˆð ð õ �$‰<Œ<˜˜˜ÔÐr   c                 ó   ‡ ‡— dˆ ˆfd„	}|S )Nc           
      ó‚  •— g g g }}}t          | ||¦  «        D �]!\  }	}
}t          j        |
t          ¦  «        }
t	          t          |
¦  «        t          |
||‰¦  «        ‰¦  «        }dg|¢t          |
¦  «        ‘}t          |d d…         |dd …         ¦  «        D ]�\  }}|                     |	d         |	d         |z   |	d         |z   dz
  dœ¦  «         |                     t          j        |
||…         t          j	        ¦  «        ¦  «         |                     t          |||…         ¦  «        ¦  «         Œž�Œ#|||fS )Nr   r,   r   ÚsignÚh0)r|   r}   Úh1)Úzipr0   rW   rX   ry   r4   rm   rq   r	   ÚFÚlist)r!   ÚcoeffsÚareasr^   Útol_ÚfollowsÚout_pÚout_cÚout_aÚpr]   rL   rx   ÚedgesrD   rE   r_   ru   s                   €€r   Úsplitzmake_split.<locals>.splitn   sA  ø€ Ø  " b�eˆuˆÝ˜5 &¨%Ñ0Ô0ð 	+ñ 	+‰GˆAˆq�!Ý”
˜1�eÑ$Ô$ˆAÝ�3˜q™6œ6¥<°°1°a¸Ñ#>Ô#>ÀÑDÔDˆDØÐ&˜Ð&�s 1™vœvÐ&ˆEÝ˜E # 2 #œJ¨¨a¨b¨b¬	Ñ2Ô2ð +ð +‘��1Ø—’ a¨¤i°q¸´wÀ±{È!ÈDÌ'ÐTUÉ+ÐXYÉ/ÐZÐZÑ[Ô[Ð[Ø—’�RœZ¨¨!¨A¨#¬µ´Ñ9Ô9Ñ:Ô:Ð:Ø—’�T ! A a C¤&™\œ\Ñ*Ô*Ð*Ð*ñ+ð �e˜UÐ"Ð"r   )NN© )r_   ru   r‹   s   `` r   Ú
make_splitr�   m   s.   øø€ ð
#ð 
#ð 
#ð 
#ð 
#ð 
#ð 
#ð €Lr   c                 ó–  ‡‡— i t           j        cŠŠˆˆfd„}||ct           _        t           _        	 t          j        | dt
          t          ¬¦  «         ‰t          ct           _        t           _        n## ‰t          ct           _        t           _        w xY w‰d         \  }}}}|j        }d|z  }g }	t          |¦  «        D ]ö\  }
}|d         |d         z
  dz   }||
|z  |
dz   |z  …d|…f         j
                             t          ¦  «        }t          j        ||j        ¦  «        \  }}|	                     t!          t#          |                     |d|¦  «        ¦  «        t#          ||j
        |z  z                       |d|¦  «        ¦  «        ¦  «                             ¦   «         t(          z  ¦  «         Œ÷t+          j        |	¦  «        S )	zfPer part of d: its full fit's worst shape miss (layer heights), from the sliced rings the encoder saw.c                  ó*   •—  ‰| i |¤Ž‰d<   ‰d         S )Nrf   rŒ   )rD   ÚkÚcapÚsysfs     €€r   Úcapturezworst_miss.<locals>.capture€   s"   ø€ Ø�T˜1�] �]�]ˆˆE‰
Ø�5ŒzÐr   r   ©r    ÚupÚdevicerf   r+   r~   r}   N)r	   Úparts_systemÚsplit_by_fitÚfcpÚencoder   r   Ú_splitrb   Ú	enumerater@   ÚastyperX   r[   r^   rq   rN   r   r\   rp   r   r0   Úarray)r   Údr‹   r“   r<   ÚYri   rb   rM   rf   rj   r‰   ra   ÚYsr=   r‘   r’   s                  @@r   Ú
worst_missr¢   |   s¹  øø€ à•FÔ'€I€Cˆðð ð ð ð ð ð 07¸Ð,…FÔ�Ô,ð@ÝŒ
�1˜A¥"­VÐ4Ñ4Ô4Ð4à37½Ð0�Ô�VÔ0Ð0ø°4½Ð0�Ô�VÔ0Ð?Ð?Ð?Ð?Ø�U”�J€A€qˆ!ˆQØ	Œ€AØ	ˆA‰€AØ
€CÝ˜!‘”ð pð p‰ˆˆ1ØˆdŒG�a˜”gÑ Ñ!ˆØˆq�1‰u�a˜!‘e˜q‘[Ð  " 1 "Ð$Ô%Ô'×.Ò.­uÑ5Ô5ˆÝÔ   A¤CÑ(Ô(‰ˆˆ1Ø�
Š
•:�e B§J¢J¨q°!°QÑ$7Ô$7Ñ8Ô8½%ÀÀaÄcÈBÁhÁ×@XÒ@XÐYZÐ\]Ð_`Ñ@aÔ@aÑ:bÔ:bÑcÔc×gÒgÑiÔiÕlnÑnÑoÔoÐoÐoÝŒ8�C‰=Œ=Ðs   ²"A3 Á3 Bc                  óž  ‡— t           j        dd …         pt          t          ¦  «        Št	          j        dd¬¦  «         t                               ¦   «         r5d„ t          j	        t           
                    ¦   «         ¦  «        D ¦   «         ng } ˆfd„| D ¦   «         }t           
                    dd¬¦  «        5 }t          j        |t          ¦  «        }|                     ¦   «          |                     |¦  «         ‰D �]²}t          j        t          |         d	¬
¦  «        }t#          |¦  «        }t$                               ¦   «         D �]d\  }}|€t(          nt+          |Ž }	|	t,          _        t1          j        ¦   «         }
	 t5          j        |dt8          t:          ¬¦  «        }t(          t,          _        n# t(          t,          _        w xY wt1          j        ¦   «         |
z
  }t=          |||	¦  «        }t>          D �]U}|                      |¦  «        }t5          j!        |t:          ¬¦  «        }| "                    tG          d'|||tI          |j%        ¦  «        tM          tO          | (                    ¦   «         ¦  «        d¦  «        tS          |dk     *                    ¦   «         ¦  «        tM          |d¦  «        dœtG          tW          g d¢d„ | ,                    |¦  «        D ¦   «         ¦  «        ¦  «        ¤Ž¦  «         |tZ          v rH|dk    rBt]          ||t          d|› d|› d|› d�z  |› d|› d|› dtI          |j%        ¦  «        › d�¦  «         �ŒW| /                    ¦   «          ta          |d›d|d›dtI          |j%        ¦  «        d ›d!| (                    ¦   «         d"›d#|d$›d%�
d¬&¦  «         �Œf�Œ´	 d d d ¦  «         d S # 1 swxY w Y   d S )(Nr   T)ÚparentsÚexist_okc                 ó   — g | ]}|‘ŒS rŒ   rŒ   )r   rA   s     r   ú
<listcomp>zmain.<locals>.<listcomp>˜   s   € Ð
1Ð
1Ð
1�ˆ1Ð
1Ð
1Ð
1r   c                 ó(   •— g | ]}|d          ‰v¯|‘ŒS )r   rŒ   )r   rA   Únamess     €r   r§   zmain.<locals>.<listcomp>™   s'   ø€ Ð7Ð7Ð7�!˜a œk°Ð6Ð6ˆAÐ6Ð6Ð6r   rc   Ú )ÚnewlineÚmesh)Úforcer   r”   )r–   é   g      Ð?r+   )r   r   r    r!   r"   r#   r(   )r$   r%   r&   r'   c                 óH   — g | ]}t          t          |¦  «        d ¦  «        ‘Œ S )é   )ÚroundrX   )r   Úvs     r   r§   zmain.<locals>.<listcomp>°   sG   € ð  ZFð  ZFð  ZFÐqrÕZ_Õ`eÐfgÑ`hÔ`hÐjkÑZlÔZlð  ZFð  ZFð  ZFr   r   Údp_ri   Ú_az.pngz: z, z atoms, z partsÚ16sú z parts=Ú3dz worst=z.2fz lh  z.1fz s)ÚflushrŒ   )1ÚsysÚargvr�   r   r   ÚmkdirÚOUTÚexistsÚcsvÚ
DictReaderÚopenÚ
DictWriterÚFIELDSÚwriteheaderÚ	writerowsÚtrimeshÚloadr   ÚCONFIGSÚitemsr›   r�   r	   r˜   ÚtimeÚperf_counterr™   rš   r   r   r¢   ÚBUDGETSÚprefixÚdecodeÚwriterowÚdictr4   r!   r±   rX   rp   Úintr/   r   ÚmeasureÚ	RENDER_ATr   r¸   Úprint)ÚoldÚkeepÚfrc   Únamer   ÚrefÚcfgÚspecr‹   r   rŸ   ÚsecÚwmr@   Údtrw   r©   s                    @r   ÚmainrÞ   •   s?  ø€ ÝŒH�Q�R�RŒLÐ%�D¥™IœI€EÝ„I�d TÐ*Ñ*Ô*Ð*Ý58·Z²Z±\´\Ð
IÐ
1Ð
1•c”n¥S§X¢X¡Z¤ZÑ0Ô0Ð
1Ñ
1Ô
1Ð
1Àr€CØ7Ð7Ð7Ð7�sÐ7Ñ7Ô7€DÝ	�Š�#˜rˆÑ	"Ô	"ð x aÝŒN˜1�fÑ%Ô%ˆØ	�Š‰ŒˆØ	�Š�DÑÔÐØð 	xñ 	xˆDÝ”�S œY¨fÐ5Ñ5Ô5ˆAÝ�a‘&”&ˆCÝ$Ÿ]š]™_œ_ð xñ x‘	��TØ"& ,�˜µJÀÐ4E�Ø&+•Ô#ÝÔ%Ñ'Ô'�ð1Ýœ
 1¨DµRÅÐGÑGÔG�Aå*0•FÔ'Ð'ø­&•FÔ'Ð0Ð0Ð0Ð0ÝÔ'Ñ)Ô)¨AÑ-�Ý  1 eÑ,Ô,�Ý ð |ñ |�AØŸš !™œ�BÝœ
 2­fÐ5Ñ5Ô5�AØ—J’J�tð  I¨4¸À1ÍCÐPQÔPWÉLÌLÕchÕinÐoq×ouÒouÑowÔowÑixÔixÐz{Ñc|Ôc|Ý-0°"°t²)·²Ñ1BÔ1BÑ-CÔ-CÍUÐSVÐXYÉ]Ì]ð Ið  Iå&*­3Ð/WÐ/WÐ/Wð  ZFð  ZFÐvy÷  wBò  wBð  CDñ  wEô  wEð  ZFñ  ZFô  ZFñ  ,Gô  ,Gñ  'Hô  'Hð Ið  Iñ Jô Jð Jð �I�~�~¨#°ª/¨/Ý˜r 1¥cÐ,G°$Ð,GÐ,G¸Ð,GÐ,GÀÐ,GÐ,GÐ,GÑ&GÈDÐIzÐIzÐTWÐIzÐIzÐ[\ÐIzÐIzÕfiÐjkÔjqÑfrÔfrÐIzÐIzÐIzÑ{Ô{Ð{ùØ—’‘	”	�	Ý˜ÐjÐjÐj CÐjÐjÐjµC¸¼±L´LÐjÐjÐjÈBÏFÊFÉHÌHÐjÐjÐjÐ_bÐjÐjÐjÐjÐrvÐwÑwÔwÐwÑwñ'xð	xð	xð xð xñ xô xð xð xð xð xð xð xð xøøøð xð xð xð xð xð xs,   Â:C	OÆ"F8Æ&OÆ8G	ÇG)OÏOÏ	OÚ__main__)1Ú__doc__r¾   rP   r¹   rÉ   Úpathlibr   Únumpyr0   rÅ   ÚpathÚinsertÚstrÚ__file__ÚparentÚdegree_sweepr   r   r   r   r   r™   r	   Ú
fcp._slicer
   Úrendersr   r   Ú
shape_testr   rX   r   ÚFIT_TOLrÇ   ÚupdaterË   rÒ   r¼   rÂ   r˜   r›   rU   rN   rm   ry   r�   r¢   rÞ   Ú__name__rŒ   r   r   ú<module>rï      s!  ðð	ð 	ð €
€
€
Ø €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø €€€à „‡‚��3�3�t�t˜H‘~”~Ô,Ñ-Ô-Ñ .Ô .Ð .Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à
€Uˆ7ˆ7�3‰<Œ<˜Œ?˜W˜W S™\œ\¨!œ_Ñ,Ñ-Ô-€Ø v¨v¬~Ð&>Ð
?Ð
?€Ø ‡‚ÐTÐTÐ>SÐTÑTÔTÑ UÔ UÐ UØ
Ð
Ð
€Ø€	Øˆ~Ñ€Ø	zÐ	zÐ	z€Ø	Ô	€Ø	€ð\ð \ð \ð$ð ð ð8ð ð ð0ð ð ðð ð ð2xð xð xðD ˆzÒÐØ€D�F„F€F€F€Fð Ðr   