Ë
    øÿæi#  ã                  óH  — d dl mZ d dlmZmZ d dlmZ d dlZd dl	m
Z
mZmZ d dlmZmZmZmZmZmZ erd dlmZ dd„Z	 	 	 	 	 	 dd„Zdd	„Zdd
„Zdd„Zd d„Z	 	 	 	 d!d„Zd"d„Z	 	 	 	 d#d„Z	 	 	 	 d#d„Z d"d„Z!d$d„Z"d%d„Z#d&d„Z$d'd„Z%d d„Z&d(d„Z'd)d„Z(	 	 	 	 	 	 d*d„Z)d+d„Z*y),é    )Úannotations)ÚchainÚpairwise)ÚTYPE_CHECKINGN)Úcheck_code_arrayÚcheck_offset_arrayÚcheck_point_array)Ú	CLOSEPOLYÚLINETOÚMOVETOÚ
code_dtypeÚoffset_dtypeÚpoint_dtypec                óœ   — t        | «       | d   }t        j                  |t        t        ¬«      }t
        || dd <   t        || dd dz
  <   |S )zSDetermine codes from offsets, assuming they all correspond to closed polygons.
    éÿÿÿÿ©ÚdtypeNé   )r   ÚnpÚfullr   r   r   r
   )ÚoffsetsÚnÚcodess      úd/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/contourpy/array.pyÚcodes_from_offsetsr      sP   € ô �wÔà�‰€AÜ�G‰G�A”v¤ZÔ0€EÜ €Eˆ'�#�2ˆ,ÑÜ&€Eˆ'�!�"ˆ+˜‰/ÑØ€Ló    c                ó
  — t        | «       t        |«       t        j                  t	        |«      t
        t        ¬«      }t        || dd <   | dd dz
  }t        j                  || dd    ||   k(  d¬«      }t        |||   <   |S )z–Determine codes from offsets and points, using the equality of the start and end points of
    each line to determine if lines are closed or not.
    r   Nr   r   ©Úaxis)
r   r	   r   r   Úlenr   r   r   Úallr
   )r   Úpointsr   Úend_offsetsÚcloseds        r   Úcodes_from_offsets_and_pointsr%      s‚   € ô �wÔÜ�fÔä�G‰G”C˜“K¤¬zÔ:€EÜ €Eˆ'�#�2ˆ,Ñà˜!˜"�+ ‘/€KÜ�V‰V�F˜7 3 B˜<Ñ(¨F°;Ñ,?Ñ?ÀaÔH€FÜ!*€Eˆ+�fÑ
Ñà€Lr   c                óÒ   — t        | «       t        | «      }t        j                  |t        t
        ¬«      }t        |d<   t        j                  | d   | d   k(  «      r	t        |d<   |S )z…Determine codes for a single line, using the equality of the start and end points to
    determine if the line is closed or not.
    r   r   r   )	r	   r    r   r   r   r   r   r!   r
   )r"   r   r   s      r   Úcodes_from_pointsr'   /   sW   € ô �fÔäˆF‹€AÜ�G‰G�A”v¤ZÔ0€EÜ€Eˆ!�HÜ	‡v�vˆf�Q‰i˜6 "™:Ñ%Ô&Üˆˆb‰	Ø€Lr   c                óR   — | st        d«      ‚t        j                  | t        ¬«      S )zAConcatenate a list of codes arrays into a single code array.
    z!Empty list passed to concat_codesr   )Ú
ValueErrorr   Úconcatenater   )Úlist_of_codess    r   Úconcat_codesr,   =   s$   € ñ ÜÐ<Ó=Ð=ä�>‰>˜-¬zÔ:Ð:r   c                óL   — | D �cg c]  }|€Œ|‘Œ	 }}|rt        |«      S yc c}w )zQConcatenate a list of codes arrays or None into a single code array or None.
    N)r,   )Úlist_of_codes_or_noner   r+   s      r   Úconcat_codes_or_noner/   F   s6   € ñ )>ÓSÑ(=˜uÀÑAR’UÐ(=€MÐSÙÜ˜MÓ*Ð*àùò	 Tó   …!�!c                ó  ‡ ‡— ‰ st        d«      ‚t        ‰ «      }t        j                  ‰ D �cg c]  }|d   ‘Œ	 c}t        ¬«      Št        j
                  ‰ d   gˆˆ fd„t        |dz
  «      D «       ¢­t        ¬«      }|S c c}w )zEConcatenate a list of offsets arrays into a single offset array.
    z#Empty list passed to concat_offsetsr   r   r   c              3  ó@   •K  — | ]  }‰|d z      d d ‰|   z   –— Œ y­w)r   N© )Ú.0ÚiÚ
cumulativeÚlist_of_offsetss     €€r   Ú	<genexpr>z!concat_offsets.<locals>.<genexpr>Y   s-   øè ø€ Ð\ÑQ[ÈA˜¨q°©sÑ3°A°BÐ7¸*ÀQ¹-ÕGÑQ[ùs   ƒr   )r)   r    r   Úcumsumr   r*   Úrange)r7   r   r   Úretr6   s   `   @r   Úconcat_offsetsr<   P   s‚   ù€ ñ ÜÐ>Ó?Ð?äˆOÓ€AÜ—‘±ÓG±¨G˜G B›K°ÑGÌ|Ô\€JÜŸ>™>Ø	˜Ñ	Ð]Ô\ÔQVÐWXÐYZÑWZÔQ[Ó\Ñ]Üô€Cð €Jùò Hs   ®Bc                óL   — | D �cg c]  }|€Œ|‘Œ	 }}|rt        |«      S yc c}w )zUConcatenate a list of offsets arrays or None into a single offset array or None.
    N)r<   )Úlist_of_offsets_or_noner   r7   s      r   Úconcat_offsets_or_noner?   _   s7   € ñ
 /FÓ]Ñ.E 7ÈÑI\’wÐ.E€OÐ]ÙÜ˜oÓ.Ð.àùò	 ^r0   c                óR   — | st        d«      ‚t        j                  | t        ¬«      S )zBConcatenate a list of point arrays into a single point array.
    z"Empty list passed to concat_pointsr   )r)   r   r*   r   )Úlist_of_pointss    r   Úconcat_pointsrB   k   s$   € ñ ÜÐ=Ó>Ð>ä�>‰>˜.´Ô<Ð<r   c                óL   — | D �cg c]  }|€Œ|‘Œ	 }}|rt        |«      S yc c}w )zRConcatenate a list of point arrays or None into a single point array or None.
    N)rB   ©Úlist_of_points_or_noner"   rA   s      r   Úconcat_points_or_nonerF   t   s7   € ñ
 ,BÓXÑ+A ÀVÑEW’fÐ+A€NÐXÙÜ˜^Ó,Ð,àùò	 Yr0   c                óL   — | D �cg c]  }|€Œ|‘Œ	 }}|rt        |«      S yc c}w )zvConcatenate a list of points or None into a single point array or None, with NaNs used to
    separate each line.
    N)Úconcat_points_with_nanrD   s      r   Úconcat_points_or_none_with_nanrI   €   s7   € ñ ,BÓXÑ+A ÀVÑEW’fÐ+A€NÐXÙÜ% nÓ5Ð5àùò	 Yr0   c           	     óô   ‡— | st        d«      ‚t        | «      dk(  r| d   S t        j                  dt        j                  t
        ¬«      Š| d   gt        t        ˆfd„| dd D «       Ž «      ¢} t        | «      S )zaConcatenate a list of points into a single point array with NaNs used to separate each line.
    z+Empty list passed to concat_points_with_nanr   r   )r   é   r   c              3  ó&   •K  — | ]  }‰|f–— Œ
 y ­w)Nr3   )r4   ÚxÚ
nan_spacers     €r   r8   z)concat_points_with_nan.<locals>.<genexpr>˜   s   øè ø€ Ð'TÑAS¸A¨°Q¬ÑASùs   ƒN)	r)   r    r   r   Únanr   Úlistr   rB   )rA   rN   s    @r   rH   rH   �   s   ø€ ñ ÜÐFÓGÐGä
ˆ>Ó˜aÒØ˜aÑ Ð ä—W‘W˜V¤R§V¡V´;Ô?ˆ
Ø(¨Ñ+ð XÜ¤Ó'TÀÐPQÐPRÑASÓ'TÐ UÓVðXˆä˜^Ó,Ð,r   c                ó2  — t        | «       t        |«       t        |«      dk  r| S t        j                  t        j
                  t        j
                  gt        ¬«      }t        j                  | |dd j                  t        j                  «      |d¬«      S )zNInsert NaNs into a point array at locations specified by an offset array.
    rK   r   r   r   r   r   )
r	   r   r    r   ÚarrayrO   r   ÚinsertÚastypeÚint64)r"   r   rN   s      r   Úinsert_nan_at_offsetsrV   œ   sm   € ô �fÔÜ�wÔä
ˆ7ƒ|�qÒØˆä—X‘XœrŸv™v¤r§v¡vÐ.´kÔBˆ
ä�y‰y˜ ¨¨2 ×!5Ñ!5´b·h±hÓ!?ÀÐRSÔTÐTr   c                ó¶   — t        | «       t        j                  t        j                  | t        k(  «      d   t        | «      «      j                  t        «      S )zBDetermine offsets from codes using locations of MOVETO codes.
    r   )r   r   ÚappendÚnonzeror   r    rT   r   )r   s    r   Úoffsets_from_codesrZ   ª   s>   € ô �UÔä�9‰9”R—Z‘Z ¬¡Ó0°Ñ3´S¸³ZÓ@×GÑGÌÓUÐUr   c           	     ó’   — | st        d«      ‚t        j                  dg| D �cg c]  }t        |«      ‘Œ c}z   t        ¬«      S c c}w )z4Determine offsets from lengths of point arrays.
    z)Empty list passed to offsets_from_lengthsr   r   ©r)   r   r9   r    r   )rA   Úlines     r   Úoffsets_from_lengthsr^   ²   sA   € ñ ÜÐDÓEÐEä�9‰9�a�S±.ÓA±.¨$œC �I°.ÑAÑAÌÔVÐVùÒAs   £A
c           
     ó´   — | st        d«      ‚t        j                  dg| D �cg c]  }t        j                  |t        k(  «      ‘Œ  c}z   t
        ¬«      S c c}w )zHDetermine outer offsets from codes using locations of MOVETO codes.
    z5Empty list passed to outer_offsets_from_list_of_codesr   r   )r)   r   r9   Úcount_nonzeror   r   )r+   r   s     r   Ú outer_offsets_from_list_of_codesra   »   sQ   € ñ ÜÐPÓQÐQä�9‰9�a�SÉ=ÓYÉ=À%œB×,Ñ,¨U´f©_Õ=È=ÑYÑYÜ'ô)ð )ùÒYs   £#A
c           	     ó˜   — | st        d«      ‚t        j                  dg| D �cg c]  }t        |«      dz
  ‘Œ c}z   t        ¬«      S c c}w )z4Determine outer offsets from a list of offsets.
    z7Empty list passed to outer_offsets_from_list_of_offsetsr   r   r   r\   )r7   r   s     r   Ú"outer_offsets_from_list_of_offsetsrc   Å   sF   € ñ ÜÐRÓSÐSä�9‰9�a�S¹/ÓJ¹/¨wœC ›L¨›N¸/ÑJÑJÔR^Ô_Ð_ùÒJs   £A
c                óà  — t        | «       t        j                  t        j                  | dd…df   «      «      d   }t	        |«      dk(  r(| t        j
                  dt	        | «      gt        ¬«      fS t        j                  | |d¬«      } |t        j                  t	        |«      «      z  }t        j                  t	        |«      dz   t        ¬«      }d|d<   ||dd t	        | «      |d<   | |fS )z^Remove NaN from a points array, also return the offsets corresponding to the NaN removed.
    Nr   r   r   rK   r   r   )
r	   r   rY   Úisnanr    rR   r   ÚdeleteÚarangeÚempty)r"   Únan_offsetsr   s      r   Ú
remove_nanrj   Î   sË   € ô �fÔä—*‘*œRŸX™X fªQ°¨T¡lÓ3Ó4°QÑ7€KÜ
ˆ;Ó˜1ÒØ”r—x‘x ¤C¨£KÐ 0¼ÔEÐEÐEä—‘˜6 ;°QÔ7ˆØ”r—y‘y¤ [Ó!1Ó2Ñ2ˆÜ#%§8¡8¬C°Ó,<¸QÑ,>ÄlÔ#SˆØˆ�‰
Ø#ˆ��"ˆÜ˜&“kˆ�‰Ø�wˆÐr   c                ó‚   — t        | «       t        |«       t        |«      dkD  rt        j                  | |dd «      S | gS )z]Split a code array at locations specified by an offset array into a list of code arrays.
    rK   r   r   )r   r   r    r   Úsplit)r   r   s     r   Úsplit_codes_by_offsetsrm   à   s>   € ô �UÔÜ�wÔä
ˆ7ƒ|�aÒÜ�x‰x˜˜w q¨˜}Ó-Ð-àˆwˆr   c                ó‚   — t        | «       t        |«       t        |«      dkD  rt        j                  | |dd «      S | gS )z_Split a point array at locations specified by an offset array into a list of point arrays.
    rK   r   r   )r	   r   r    r   rl   )r"   r   s     r   Úsplit_points_by_offsetsro   ì   s>   € ô �fÔÜ�wÔä
ˆ7ƒ|�aÒÜ�x‰x˜ ¨¨" Ó.Ð.àˆxˆr   c                ó8  — t        | «       t        j                  t        j                  | dd…df   «      «      d   }t	        |«      dk(  r| gS t        j
                  dg|t	        | «      gf«      }t        |«      D ��cg c]  \  }}| |dz   | ‘Œ c}}S c c}}w )z>Split a points array at NaNs into a list of point arrays.
    Nr   r   r   )r	   r   rY   re   r    r*   r   )r"   ri   ÚsÚes       r   Úsplit_points_at_nanrs   û   sŽ   € ô �fÔä—*‘*œRŸX™X fªQ°¨T¡lÓ3Ó4°QÑ7€KÜ
ˆ;Ó˜1ÒØˆxˆä—n‘n r d¨K¼#¸f»+¸Ð%GÓHˆÜ*2°;Ô*?Ô@Ñ*?¡$ ! Q��q˜‘s˜1’Ð*?Ò@Ð@ùÓ@s   Â B)r   úcpy.OffsetArrayÚreturnúcpy.CodeArray)r   rt   r"   úcpy.PointArrayru   rv   )r"   rw   ru   rv   )r+   úlist[cpy.CodeArray]ru   rv   )r.   zlist[cpy.CodeArray | None]ru   zcpy.CodeArray | None)r7   zlist[cpy.OffsetArray]ru   rt   )r>   zlist[cpy.OffsetArray | None]ru   zcpy.OffsetArray | None)rA   úlist[cpy.PointArray]ru   rw   )rE   zlist[cpy.PointArray | None]ru   zcpy.PointArray | None)r"   rw   r   rt   ru   rw   )r   rv   ru   rt   )rA   ry   ru   rt   )r+   rx   ru   rt   )r"   rw   ru   z&tuple[cpy.PointArray, cpy.OffsetArray])r   rv   r   rt   ru   rx   )r"   rw   r   rt   ru   ry   )r"   rw   ru   ry   )+Ú
__future__r   Ú	itertoolsr   r   Útypingr   Únumpyr   Úcontourpy.typecheckr   r   r	   Úcontourpy.typesr
   r   r   r   r   r   Úcontourpy._contourpyÚ
_contourpyÚcpyr   r%   r'   r,   r/   r<   r?   rB   rF   rI   rH   rV   rZ   r^   ra   rc   rj   rm   ro   rs   r3   r   r   Ú<module>rƒ      sð   ðÝ "ç %Ý  ã ç WÑ Wß \× \áÝ&ó	ðØðàðð óó(ó;óóð	Ø9ð	àó	ó=ð	Ø7ð	àó	ð
Ø7ð
àó
ó-óUóVóWó)ó`óó$	ðØðàðð óô
Ar   