§
    ¬ºâj=  ã                   ó‚   — d Z ddlZddlZddlmZ dZdZej        Zi Z	d„ Z
d„ Z G d„ d	¦  «        Zd
„ Zd„ ZdZd„ Zd„ ZdS )a‹  The rate-distortion partition: each track cut where the descriptor's own objective says so, with no tolerances.

With orthonormal atoms, keeping those whose score (|value| sqrt(w)) is above a level lam is the best descriptor of its size,
and its error plus lam^2 per atom kept is sum over atoms of min(score^2, lam^2). The partition is chosen by the same rule: a
piece of a track (layers i..j-1) costs sum over its atoms of min(score^2, lam^2) (its rings projected on its own height basis,
`_parts.orth_basis`, start points by continuity, Parseval weights), plus the energy its basis cannot hold, plus lam^2 x HEADER
(a part's header in atoms: 3 bytes against 6); each track is cut into the pieces of least total cost (dynamic programming over
cut positions, pieces of at least 2 layers). lam comes from the data, not the budget, so prefixes stay exact: the noise of the
rings' coefficients, read from their second differences along the height (median |d2| / 0.6745 / sqrt(6), in score units,
over every track), times 2 ("rd2", as atoms="auto") or the universal threshold sqrt(2 ln N) ("rdU", N the coefficients);
or "rdT<T0>": the level of the T0-th atom (iterated with the partition), the partition best at that reference budget.
Swapped in for split_by_fit (no package change); the track filter of v6 (clouds) is left as it is.

    from rd_split import install; install("rd2")     # then fcp.encode(...) cuts by it
é    N)Ú_partsç      à?é   c                 óF  — | j         d         }t          j        |d¦  «        }d|d<   t          j        t          j        | t          ¦  «        t          j        |t          ¦  «        ¦  «        t          j        |¦  «        z                       t          | ¦  «        d¦  «        S )Nr   r   g      ð?r   éÿÿÿÿ)
ÚshapeÚnpÚfullr   Úcontinuous_startÚasarrayÚfloatÚsqrtÚreshapeÚlen)ÚCÚAÚKÚws       ú;/home/joao/code/data/meshes/fcp_2910_v6/scripts/rd_split.pyÚ	_weightedr      s}   € Ø	Œ�Œ
€AÝ
Œ��3‰Œ€AØ€A€a�DÝÔ#¥B¤J¨qµ%Ñ$8Ô$8½"¼*ÀQÍÑ:NÔ:NÑOÔOÕRTÔRYÐZ[ÑR\ÔR\Ñ\×eÒeÕfiÐjkÑflÔflÐnpÑqÔqÐqó    c           	      óÜ   — d„ | D ¦   «         }|sdS t          t          j        t          j        t          j        |¦  «        ¦  «        ¦  «        dz  t          j        d¦  «        z  ¦  «        S )zsThe coefficients' noise in score units from their second differences along the height (every track of >= 5 layers).c                 ó†   — g | ]>}t          |¦  «        d k    ¯t          j        |dd¬¦  «                             ¦   «         ‘Œ?S )é   r   r   ©Úaxis)r   r	   ÚdiffÚravel©Ú.0ÚXs     r   ú
<listcomp>znoise_sigma.<locals>.<listcomp>$   s@   € Ð	CÐ	CÐ	C¨Aµs¸1±v´vÀ²{°{�"Œ'�!�Q˜QÐ
Ñ
Ô
×
%Ò
%Ñ
'Ô
'°{°{°{r   ç        g/Ý$�•å?g      @)r   r	   ÚmedianÚabsÚconcatenater   )ÚXsÚd2s     r   Únoise_sigmar)   "   s`   € à	CÐ	C°Ð	CÑ	CÔ	C€BØð ØˆsÝ•”�2œ6¥"¤.°Ñ"4Ô"4Ñ5Ô5Ñ6Ô6¸Ñ?Å"Ä'È#Á,Ä,ÑNÑOÔOÐOr   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTrackzËA track's candidate pieces, projected once: per piece length L, the squared scores of every window's atoms (float32)
    and the energy its basis cannot hold; `costs(lam2)` then only sums min(s^2, lam2).c                 óT  — t          |¦  «        x| _        }t          j        |t          j        ¦  «        }t          j        dt          j        |                     t          ¦  «        dz   	                    d¦  «        ¦  «        f         }g | _
        |dt          z  k    rt          t          |dz   ¦  «        n|gD ]í}t          j        t          j        ||¦  «        d         t          j        ¦  «        }t          j        j                             ||d¬¦  «        |z  }||z                       t          |¦  «        d¦  «        }t          j        ||d …         |d | …         z
  | 	                    dt          ¬¦  «        z
  d¦  «        }	| j
                             |||	f¦  «         Œîd S )Nr   r   é   r   r   ©Údtype)r   Únr	   r   Úfloat32Úr_ÚcumsumÚastyper   ÚsumÚby_lenÚMIN_LENÚranger   Ú
orth_basisÚlibÚstride_tricksÚsliding_window_viewr   ÚmaximumÚappend)
Úselfr!   ÚMr0   ÚceÚLÚQÚVÚs2Úresids
             r   Ú__init__zTrack.__init__.   sd  € Ý˜‘V”VÐˆŒ�ÝŒJ�q�"œ*Ñ%Ô%ˆÝŒU�1•b”i §¢­%¡¤°AÑ!5× :Ò :¸1Ñ =Ô =Ñ>Ô>Ð>Ô?ˆØˆŒØ*+¨qµ7©{Ò*:Ð*:••w  A¡Ñ&Ô&Ð&ÀÀð 	/ð 	/ˆAÝ”
�6Ô,¨Q°Ñ2Ô2°1Ô5µr´zÑBÔBˆAÝ”Ô$×8Ò8¸¸AÀAÐ8ÑFÔFÈÑJˆAØ�a‘%—’¥ Q¡¤¨Ñ,Ô,ˆBÝ”J  1 2 2¤¨¨C¨a¨R¨C¬Ñ 0°B·F²F¸1ÅE°FÑ4JÔ4JÑJÈAÑNÔNˆEØŒK×Ò  2 u˜~Ñ.Ô.Ð.Ð.ð	/ð 	/r   c                 óx  — t          j        | j        dz   | j        dz   ft           j        ¦  «        }t          j        |¦  «        }| j        D ]l\  }}}t          j        t          |¦  «        ¦  «        }t          j        ||¦  «         	                    dt          ¬¦  «        |z   |t          z  z   ||||z   f<   Œm|S )Nr-   r.   )r	   r
   r0   Úinfr1   r6   Úaranger   Úminimumr5   r   ÚHEADER)r?   Úlam2ÚcostÚl2rB   rE   rF   Úis           r   ÚcostszTrack.costs:   s©   € ÝŒw˜œ ™
 D¤F¨Q¡JÐ/µ´Ñ8Ô8ˆÝŒZ˜ÑÔˆØ œKð 	\ð 	\‰LˆAˆr�5Ý”	�#˜b™'œ'Ñ"Ô"ˆAÝœZ¨¨BÑ/Ô/×3Ò3°A½UÐ3ÑCÔCÀeÑKÈdÕU[ÉmÑ[ˆD��A˜‘E�‰NˆNØˆr   c           	      óº   ‡— dg|¢| j         ‘}d„ | j        D ¦   «         Št          j        ˆfd„t	          |dd…         |dd…         ¦  «        D ¦   «         ¦  «        S )z;The squared scores of the atoms of the pieces between cuts.r   c                 ó   — i | ]	\  }}}||“Œ
S © rT   )r    rB   rE   Ú_s       r   ú
<dictcomp>z Track.scores.<locals>.<dictcomp>E   s    € Ð2Ð2Ð2™(˜!˜R ��2Ð2Ð2Ð2r   c                 ó8   •— g | ]\  }}‰||z
           |         ‘ŒS rT   rT   )r    ÚaÚbÚlooks      €r   r"   z Track.scores.<locals>.<listcomp>F   s)   ø€ ÐUÐUÐU±$°!°Q˜t A¨¡Eœ{¨1œ~ÐUÐUÐUr   Nr   r-   )r0   r6   r	   r&   Úzip)r?   ÚcutsÚedgesrZ   s      @r   ÚscoreszTrack.scoresB   sn   ø€ àÐ"�TÐ"˜4œ6Ð"ˆØ2Ð2 d¤kÐ2Ñ2Ô2ˆÝŒ~ÐUÐUÐUÐU½#¸eÀCÀRÀC¼jÈ%ÐPQÐPRÐPRÌ)Ñ:TÔ:TÐUÑUÔUÑVÔVÐVr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rG   rQ   r^   rT   r   r   r+   r+   *   sR   € € € € € ðZð Zð
/ð 
/ð 
/ðð ð ðWð Wð Wð Wð Wr   r+   c                 óâ  — t          j        |dz   t           j        ¦  «        }d|d<   t          j        |dz   t          ¦  «        }t          d|dz   ¦  «        D ]N}|d |…         | d |…|f         z   }t	          t          j        |¦  «        ¦  «        ||<   |||                  ||<   ŒOg |}}|dk    r)|                     ||         ¦  «         ||         }|dk    °)t          |¦  «        dd …         S )Nr-   r#   r   )	r	   r
   rI   ÚzerosÚintr8   Úargminr>   Úsorted)rN   r0   ÚbestÚargÚjÚcr\   s          r   Ú	best_cutsrl   I   sï   € ÝŒ7�1�q‘5�"œ&Ñ!Ô!€DØ€Dˆ�GÝ
Œ(�1�q‘5�#Ñ
Ô
€CÝ�1�a˜!‘e‰_Œ_ð ð ˆØ��!�ŒH�t˜B˜Q˜B ˜E”{Ñ"ˆÝ•R”Y˜q‘\”\Ñ"Ô"ˆˆA‰Ø�C˜”F”)ˆˆQ‰ˆØ�!ˆ!€DØ
ˆaŠ%ˆ%Ø�Š�C˜”FÑÔÐØ�ŒFˆð ˆaŠ%ˆ%õ �$‰<Œ<˜˜˜ÔÐr   c                 óâ   — g }| D ]i}|j         dt          z  k    r(t          |                     |¦  «        |j         ¦  «        ng }|                     ||                     |¦  «        f¦  «         Œj|S )zMPer track: (cuts, the squared scores of its pieces' atoms) at the level lam2.r   )r0   r7   rl   rQ   r>   r^   )ÚtracksrM   ÚoutÚTr\   s        r   Ú
_partitionrq   X   so   € à
€CØð +ð +ˆØ01´°q½7±{Ò0BÐ0B�y˜Ÿš ™œ¨¬Ñ,Ô,Ð,ÈˆØ�
Š
�D˜!Ÿ(š( 4™.œ.Ð)Ñ*Ô*Ð*Ð*Ø€Jr   é   c                 ó   ‡ — dˆ fd„	}|S )Nc           
      óþ  •‡— d„ t          ||¦  «        D ¦   «         }t          |¦  «        }t          d„ |D ¦   «         ¦  «        }ˆfd„|D ¦   «         }	‰                     d¦  «        �rxt	          ‰dd …         ¦  «        }
t          j        t          j        d„ |	D ¦   «         ¦  «        ¦  «        d d d…         }t          |¦  «        r3t          |t          |
t          |¦  «        ¦  «        dz
           ¦  «        nd	|z  |z  }t          t          ¦  «        D ]È}t          |	t          |d
¦  «        ¦  «        }t          j        t          j        d„ |D ¦   «         ¦  «        ¦  «        d d d…         }t          |¦  «        r3t          |t          |
t          |¦  «        ¦  «        dz
           ¦  «        n|}t          ||z
  ¦  «        dt          |d
¦  «        z  k    r n|}ŒÉnG|‰dk    rdn6t          j        dt          j        t          |d¦  «        ¦  «        z  ¦  «        z  }||z  }t          |d
¦  «        }t$                               |t          t          j        |¦  «        ¦  «        ¬¦  «         t          |	|¦  «        }g g g }}}t          || ||¦  «        D ]Þ\  \  }}}}}t          |¦  «        }dg|¢|‘}t          |d d…         |dd …         ¦  «        D ]�\  }}|                     |d         |d         |z   |d         |z   dz
  dœ¦  «         |                     t          j        |||…         t,          j        ¦  «        ¦  «         |                     t1          |||…         ¦  «        ¦  «         ŒžŒß|||fS )Nc                 ó4   — g | ]\  }}t          ||¦  «        ‘ŒS rT   )r   )r    r   r   s      r   r"   z'make.<locals>.split.<locals>.<listcomp>f   s$   € Ð=Ð=Ð=¡$ ! Q�i˜˜1‰oŒoÐ=Ð=Ð=r   c              3   ó$   K  — | ]}|j         V — Œd S )N)Úsizer   s     r   ú	<genexpr>z&make.<locals>.split.<locals>.<genexpr>h   s$   è è € Ð#Ð#˜1�”Ð#Ð#Ð#Ð#Ð#Ð#r   c                 ó0   •— g | ]}t          |‰¦  «        ‘ŒS rT   )r+   )r    r!   r@   s     €r   r"   z'make.<locals>.split.<locals>.<listcomp>i   s!   ø€ Ð*Ð*Ð* !•%˜˜1‘+”+Ð*Ð*Ð*r   ÚrdTé   c                 ó8   — g | ]}|                      g ¦  «        ‘ŒS rT   )r^   )r    rp   s     r   r"   z'make.<locals>.split.<locals>.<listcomp>l   s"   € Ð(FÐ(FÐ(F¸!¨¯ª°"©¬Ð(FÐ(FÐ(Fr   r   r-   rr   g ÂëþKH´9c                 ó   — g | ]\  }}|‘ŒS rT   rT   )r    rU   Úscs      r   r"   z'make.<locals>.split.<locals>.<listcomp>p   s   € Ð,AÐ,AÐ,A±E°A°r¨RÐ,AÐ,AÐ,Ar   g�íµ ÷Æ°>Úrd2g       @r   )ÚsigmaÚlamr   ÚsignÚh0)r‚   rƒ   Úh1)r[   r)   r5   Ú
startswithre   r	   Úsortr&   r   r   Úminr8   ÚITERrq   Úmaxr%   r   ÚlogÚLOGÚupdater>   r   r   ÚFÚlist)ÚpartsÚcoeffsÚareasr@   ÚtolÚfollowsr'   r€   ÚNrn   ÚT0rE   rM   rU   ÚresÚnewr�   Úout_pÚout_cÚout_ar\   Úpr   r   r0   r]   rX   rY   Úmodes      `                        €r   Úsplitzmake.<locals>.splite   sY  øø€ Ø=Ð=­#¨f°eÑ*<Ô*<Ð=Ñ=Ô=ˆÝ˜B‘”ˆÝÐ#Ð# Ð#Ñ#Ô#Ñ#Ô#ˆØ*Ð*Ð*Ð* rÐ*Ñ*Ô*ˆØ�?Š?˜5Ñ!Ô!ñ 	Ý�T˜!˜"˜"”X‘”ˆBÝ”�œÐ(FÐ(F¸vÐ(FÑ(FÔ(FÑGÔGÑHÔHÈÈÈ2ÈÔNˆBÝ69¸"±g´gÐT•5˜�C ¥C¨¡G¤GÑ,Ô,¨qÑ0Ô1Ñ2Ô2Ð2À1ÀuÁ9ÈuÑCTˆDÝ�4‘[”[ð ð �Ý  ­¨T°5Ñ)9Ô)9Ñ:Ô:�Ý”W�Rœ^Ð,AÐ,A¸SÐ,AÑ,AÔ,AÑBÔBÑCÔCÀDÀDÀbÀDÔI�Ý9<¸R¹¼ÐJ•e˜B�s 2¥s¨2¡w¤wÑ/Ô/°!Ñ3Ô4Ñ5Ô5Ð5Àd�Ý�s˜T‘z‘?”? d­S°°e©_¬_Ñ&<Ò<Ð<Ø�EØ��øà $¨%¢- -˜3˜3µR´W¸QÅÄÍÈAÈqÉ	Ì	ÑARÔARÑ=RÑ5SÔ5SÑTˆCØ˜‘9ˆDÝ�4˜ÑÔˆÝ�
Š
˜¥E­"¬'°$©-¬-Ñ$8Ô$8ˆ
Ñ9Ô9Ð9Ý˜ Ñ&Ô&ˆØ  " b�eˆuˆÝ"% c¨5°&¸%Ñ"@Ô"@ð 	+ð 	+Ñ‰IˆT�1�q˜!˜QÝ�A‘”ˆAØ�M˜�M˜q�Mˆ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   )NNrT   )rœ   r�   s   ` r   Úmakerž   d   s(   ø€ ð#ð #ð #ð #ð #ð #ð> €Lr   c                 óR   — | dk    rt           nt          | ¦  «        t          _        dS )zcSwap the package's cut rule for the rate-distortion partition ("rd2" / "rdU"), or back ("package").ÚpackageN)Ú_splitrž   r   Úsplit_by_fit)rœ   s    r   Úinstallr£   ‡   s$   € à$(¨IÒ$5Ð$5�&˜&½4À¹:¼:…FÔÐÐr   )rb   Únumpyr	   Úfcpr   rL   r7   r¢   r¡   r‹   r   r)   r+   rl   rq   rˆ   rž   r£   rT   r   r   ú<module>r¦      sö   ððð ð Ð Ð Ð à 
€
€
€
Ø Ð Ð Ð Ð Ð à	€Ø
€Ø	Ô	€Ø€ðrð rð rðPð Pð PðWð Wð Wð Wð Wñ Wô Wð Wð>ð ð ðð ð ð 	€ð ð  ð  ðFFð Fð Fð Fð Fr   