Ë
    :vžj\l  ã                   ó€  — d Z ddlZddlZddlmZ ddlmZ ddlmZ 	 ddl	m
Z d
„ Z G d„ de«      Z G d„ de«      Z G d„ de«      Zd"d„Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zd „ Zd!„ Zy# e$ rZdd	lmZ  ee«      ZY dZ[Œ”dZ[ww xY w)#z7OO interfaces to encodings for ND arrays which caching.é    Né   )Úcaching)ÚABCé   )Ú	runlength)Úsparse)ÚExceptionWrapperc                 óº   — t        | «      }t        t        j                  d|z  t        ¬«      «      }t        j                  |dft
        ¬«      }| |d d …df<   ||fS )N©r   ©ÚshapeÚdtyper   r   )ÚlenÚDenseEncodingÚnpÚzerosÚboolÚint)r   Únum_dimsÚencodingÚpaddings       úg/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/trimesh/voxel/encoding.pyÚ_empty_strippedr      sP   € Ü�5‹z€HÜœRŸX™X¨D°8©OÄ4ÔHÓI€HÜ�h‰h˜h¨˜]´#Ô6€GØ€GŠAˆqˆD�MØ�WÐÐó    c                   óò  — e Zd ZdZd„ Zeej                  d„ «       «       Zeej                  d„ «       «       Z	eej                  d„ «       «       Z
eej                  d„ «       «       Zeej                  d„ «       «       Zeej                  d„ «       «       Zeej                  d	„ «       «       Zej                  d
„ «       Zej                  d„ «       Zej                  d„ «       Zej                  d„ «       Zed„ «       Zej*                  d„ «       Zd„ Zd„ Zed„ «       Zd„ Zed„ «       Zdd„Zed„ «       Zed„ «       Zej@                  fd„Z!ej@                  fd„Z"d„ Z#d„ Z$ed„ «       Z%e%jL                  d„ «       Z%y) ÚEncodingaf  
    Base class for objects that implement a specific subset of of ndarray ops.

    This presents a unified interface for various different ways of encoding
    conceptually dense arrays and to interoperate between them.

    Example implementations are ND sparse arrays, run length encoded arrays
    and dense encodings (wrappers around np.ndarrays).
    c                 óp   — || _         t        j                  | j                   j                  ¬«      | _        y )N)Úid_function)Ú_datar   ÚCacheÚ__hash__Ú_cache)ÚselfÚdatas     r   Ú__init__zEncoding.__init__&   s#   € ØˆŒ
Ü—m‘m°·
±
×0CÑ0CÔDˆ�r   c                  ó   — y ©N© ©r#   s    r   r   zEncoding.dtype*   ó   € ð 	r   c                  ó   — y r'   r(   r)   s    r   r   zEncoding.shape/   r*   r   c                  ó   — y r'   r(   r)   s    r   ÚsumzEncoding.sum4   r*   r   c                  ó   — y r'   r(   r)   s    r   ÚsizezEncoding.size9   r*   r   c                  ó   — y r'   r(   r)   s    r   Úsparse_indiceszEncoding.sparse_indices>   r*   r   c                  ó   — y r'   r(   r)   s    r   Úsparse_valueszEncoding.sparse_valuesC   r*   r   c                  ó   — y r'   r(   r)   s    r   ÚdensezEncoding.denseH   r*   r   c                  ó   — y r'   r(   ©r#   Úindicess     r   Ú	gather_ndzEncoding.gather_ndM   ó   € àr   c                  ó   — y r'   r(   ©r#   Úmasks     r   r=   zEncoding.maskQ   r:   r   c                  ó   — y r'   r(   ©r#   Úindexs     r   Ú	get_valuezEncoding.get_valueU   r:   r   c                  ó   — y r'   r(   r)   s    r   ÚcopyzEncoding.copyY   r:   r   c                 óT   — | j                   | j                  dk7     j                  dk(  S ©Nr   )r1   r3   r/   r)   s    r   Úis_emptyzEncoding.is_empty]   s)   € à×"Ñ" 4×#5Ñ#5¸Ñ#:Ñ;×@Ñ@ÀAÑEÐEr   c                 óx  — | j                   rt        | j                  «      S | j                  }|j                  }t	        |«      }g }g }t        |«      D ]´  \  }}t        t        |«      «      t        t        |dz   |«      «      z   }t        j                  ||¬«      }	t        j                  |	«      \  }
|
j                  «       }|
j                  «       dz   }|j                  |||z
  g«       |j                  t        ||«      «       Œ¶ t        |t        |«         «      t        j                   |t"        «      fS )zó
        Get encoding with all zeros stripped from the start and end
        of each axis.

        Returns
        ------------
        encoding: ?
        padding : (n, 2) int
          Padding at the start and end that was stripped
        r   ©Úaxis)rF   r   r   r5   r   Ú	enumerateÚtupleÚranger   ÚanyÚnonzeroÚminÚmaxÚappendÚslicer   Úarrayr   )r#   r5   r   Úndimsr   ÚslicesÚdimr/   rI   Úfilledr8   ÚlowerÚuppers                r   ÚstrippedzEncoding.strippeda   sþ   € ð �=Š=Ü" 4§:¡:Ó.Ð.Ø—
‘
ˆØ—‘ˆÜ�E“
ˆØˆØˆÜ" 5Ö)‰IˆC�Üœ˜s›Ó$¤u¬U°3¸±7¸EÓ-BÓ'CÑCˆDÜ—V‘V˜E¨Ô-ˆFÜŸ™ FÓ+‰JˆWØ—K‘K“MˆEØ—K‘K“M AÑ%ˆEØ�N‰N˜E 4¨%¡<Ð0Ô1Ø�M‰Mœ%  uÓ-Õ.ð *ô ˜U¤5¨£=Ñ1Ó2´B·H±H¸WÄcÓ4JÐJÐJr   c                 ó   — t        | |«      S r'   )ÚFlippedEncoding©r#   Úaxess     r   Ú_flipzEncoding._flip~   s   € Ü˜t TÓ*Ð*r   c                 ó6   — | j                   j                  «       S ©z¥
        Get the hash of the current transformation matrix.

        Returns
        ------------
        hash : str
          Hash of transformation matrix
        ©r   r!   r)   s    r   r!   zEncoding.__hash__�   ó   € ð �z‰z×"Ñ"Ó$Ð$r   c                 ó,   — t        | j                  «      S r'   )r   r   r)   s    r   rT   zEncoding.ndimsŒ   s   € ä�4—:‘:‹Ðr   c                 óN   — t        |«      dk(  r| j                  S t        | |«      S ©Nr   )r   ÚflatÚShapedEncoding©r#   r   s     r   ÚreshapezEncoding.reshape�   s"   € Ü ›J¨!šOˆt�y‰yÐL´ÀÀeÓ1LÐLr   c                 ó   — t        | «      S r'   )ÚFlattenedEncodingr)   s    r   rg   zEncoding.flat“   s   € ä  Ó&Ð&r   c                 ó   — t        | |«      S r'   )Ú_flipped)r#   rI   s     r   ÚflipzEncoding.flip—   s   € Ü˜˜dÓ#Ð#r   c                 ó2   — | j                   | j                  fS r'   ©r1   r3   r)   s    r   Úsparse_componentszEncoding.sparse_componentsš   ó   € à×"Ñ" D×$6Ñ$6Ð6Ð6r   c                 ó   — | j                   S r'   ©r   r)   s    r   r$   zEncoding.dataž   ó   € à�z‰zÐr   c                 óx   — | j                   dk7  rt        d«      ‚t        j                  | j                  |¬«      S ©Nr   z/`run_length_data` only valid for flat encodings©r   )rT   Ú
ValueErrorr   Údense_to_rler5   ©r#   r   s     r   Úrun_length_datazEncoding.run_length_data¢   s0   € Ø�:‰:˜Š?ÜÐNÓOÐOÜ×%Ñ% d§j¡j¸Ô>Ð>r   c                 óx   — | j                   dk7  rt        d«      ‚t        j                  | j                  |¬«      S rx   )rT   rz   r   Údense_to_brler5   r|   s     r   Úbinary_run_length_datazEncoding.binary_run_length_data§   s0   € Ø�:‰:˜Š?ÜÐNÓOÐOÜ×&Ñ& t§z¡z¸Ô?Ð?r   c                 ó   — t        | |«      S r'   )Ú_transposed©r#   Úperms     r   Ú	transposezEncoding.transpose¬   s   € Ü˜4 Ó&Ð&r   c                 ó   — t        | |«      S r'   )ÚTransposedEncodingrƒ   s     r   Ú
_transposezEncoding._transpose¯   s   € Ü! $¨Ó-Ð-r   c                 ó.   — | j                   j                  S r'   ©r   Úmutabler)   s    r   r‹   zEncoding.mutable²   s   € à�z‰z×!Ñ!Ð!r   c                 ó&   — || j                   _        y r'   rŠ   )r#   Úvalues     r   r‹   zEncoding.mutable¶   s   € à"ˆ�
‰
Õr   Nr   )'Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   ÚpropertyÚabcÚabstractmethodr   r   r-   r/   r1   r3   r5   r9   r=   rA   rC   rF   r   Úcache_decoratorrZ   r_   r!   rT   rj   rg   ro   rr   r$   r   Úint64r}   r€   r…   rˆ   r‹   Úsetterr(   r   r   r   r      sM  „ ñòEð Ø×Ññó ó ðð Ø×Ññó ó ðð Ø×Ññó ó ðð Ø×Ññó ó ðð Ø×Ññó ó ðð Ø×Ññó ó ðð Ø×Ññó ó ðð 	×Ññó ðð 	×Ññó ðð 	×Ññó ðð 	×Ññó ðð ñFó ðFð ×ÑñKó ðKò8+ò	%ð ñó ðòMð ñ'ó ð'ó$ð ñ7ó ð7ð ñó ðð %'§H¡Hó ?ð
 ,.¯8©8ó @ò
'ò.ð ñ"ó ð"ð ‡^�^ñ#ó ñ#r   r   c                   óB  ‡ — e Zd ZdZˆ fd„Zed„ «       Zed„ «       Zej                  d„ «       Z
ej                  d„ «       Zed„ «       Zed„ «       Zej                  d	„ «       Zej                  d
„ «       Zd„ Zed„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zed„ «       Zd„ Zˆ xZS )r   z:Simple `Encoding` implementation based on a numpy ndarray.c                 óÎ   •— t        |t        j                  «      s:t        |t        j                  «      st        d«      ‚t        j                  |«      }t        ‰| �!  |¬«       y )Nz(DenseEncoding data must be a numpy array©r$   )	Ú
isinstancer   ÚTrackedArrayr   Úndarrayrz   Útracked_arrayÚsuperr%   ©r#   r$   Ú	__class__s     €r   r%   zDenseEncoding.__init__¾   sM   ø€ Ü˜$¤× 4Ñ 4Ô5Ü˜d¤B§J¡JÔ/Ü Ð!KÓLÐLÜ×(Ñ(¨Ó.ˆDÜ‰Ñ˜dÐÕ#r   c                 ó.   — | j                   j                  S r'   ©r   r   r)   s    r   r   zDenseEncoding.dtypeÅ   ó   € à�z‰z×ÑÐr   c                 ó.   — | j                   j                  S r'   ©r   r   r)   s    r   r   zDenseEncoding.shapeÉ   r¤   r   c                 ó6   — | j                   j                  «       S r'   ©r   r-   r)   s    r   r-   zDenseEncoding.sumÍ   s   € à�z‰z�~‰~ÓÐr   c                 óB   — t        j                  | j                  «       S r'   ©r   rM   r   r)   s    r   rF   zDenseEncoding.is_emptyÑ   s   € ä—6‘6˜$Ÿ*™*Ó%Ð%Ð%r   c                 ó.   — | j                   j                  S r'   ©r   r/   r)   s    r   r/   zDenseEncoding.sizeÕ   ó   € à�z‰z�‰Ðr   c                 óD   — | j                   }| j                  |«      }||fS r'   )r1   Úgather)r#   r8   Úvaluess      r   rr   zDenseEncoding.sparse_componentsÙ   s%   € à×%Ñ%ˆØ—‘˜WÓ%ˆØ˜ˆÐr   c                 óf   — t        j                  t        j                  | j                  «      «      S r'   )r   Úcolumn_stackÚwherer   r)   s    r   r1   zDenseEncoding.sparse_indicesß   s   € ä�‰œrŸx™x¨¯
©
Ó3Ó4Ð4r   c                 ó    — | j                   d   S rf   ©rr   r)   s    r   r3   zDenseEncoding.sparse_valuesã   ó   € à×%Ñ% aÑ(Ð(r   c                 ój   — | j                   }|D ]  }t        j                  ||«      }Œ t        |«      S r'   )r5   r   ro   r   )r#   r^   r5   Úas       r   r_   zDenseEncoding._flipç   s0   € Ø—
‘
ˆÛˆAÜ—G‘G˜E 1Ó%‰Eð ä˜UÓ#Ð#r   c                 ó   — | j                   S r'   ru   r)   s    r   r5   zDenseEncoding.denseí   rv   r   c                 ó    — | j                   |   S r'   ru   r7   s     r   r¯   zDenseEncoding.gatherñ   s   € Ø�z‰z˜'Ñ"Ð"r   c                 óF   — | j                   t        |j                  «         S r'   )r   rK   ÚTr7   s     r   r9   zDenseEncoding.gather_ndô   s   € Ø�z‰zœ% §	¡	Ó*Ñ+Ð+r   c                 óp   — | j                   t        |t        j                  «      r|   S |j                     S r'   )r   r›   r   r�   r5   r<   s     r   r=   zDenseEncoding.mask÷   s*   € Ø�z‰z¤*¨T´2·:±:Ô">˜$ÑOÐOÀDÇJÁJÑOÐOr   c                 ó2   — | j                   t        |«         S r'   )r   rK   r?   s     r   rA   zDenseEncoding.get_valueú   s   € Ø�z‰zœ% ›,Ñ'Ð'r   c                 óJ   — t        | j                  j                  |«      «      S r'   ©r   r   rj   ri   s     r   rj   zDenseEncoding.reshapeý   s   € Ü˜TŸZ™Z×/Ñ/°Ó6Ó7Ð7r   c                 óJ   — t        | j                  j                  |«      «      S r'   )r   r   r…   rƒ   s     r   rˆ   zDenseEncoding._transpose   s   € Ü˜TŸZ™Z×1Ñ1°$Ó7Ó8Ð8r   c                 óJ   — t        | j                  j                  d«      «      S ©N)éÿÿÿÿrÀ   r)   s    r   rg   zDenseEncoding.flat  s   € ä˜TŸZ™Z×/Ñ/°Ó6Ó7Ð7r   c                 óH   — t        | j                  j                  «       «      S r'   )r   r   rC   r)   s    r   rC   zDenseEncoding.copy  s   € Ü˜TŸZ™ZŸ_™_Ó.Ó/Ð/r   )rŽ   r�   r�   r‘   r%   r’   r   r   r   r•   r-   rF   r/   rr   r1   r3   r_   r5   r¯   r9   r=   rA   rj   rˆ   rg   rC   Ú__classcell__©r¡   s   @r   r   r   »   s  ø„ ÙDô$ð ñ ó ð ð ñ ó ð ð ×Ññ ó ð ð ×Ññ&ó ð&ð ñó ðð ñó ðð
 ×Ññ5ó ð5ð ×Ññ)ó ð)ò$ð ñó ðò#ò,òPò(ò8ò9ð ñ8ó ð8ö0r   r   c                   óX  ‡ — e Zd ZdZdˆ fd„	Zed„ «       Zd„ Zed„ «       Z	ed„ «       Z
ed„ «       Zej                  d„ «       Zed	„ «       Zed
„ «       Zed„ «       Zed„ «       Zej                  d„ «       Zej                  d„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zej                  d„ «       Zˆ xZS )ÚSparseEncodingzé
    `Encoding` implementation based on an ND sparse implementation.

    Since the scipy.sparse implementations are for 2D arrays only, this
    implementation uses a single-column CSC matrix with index
    raveling/unraveling.
    c                 ó^  •— t        j                  «       }t        ‰| �  |«       ||d<   ||d<   |d   }t	        |j
                  «      dk7  rt        d|j
                  ›�«      ‚|d   j
                  |j
                  d   fk7  r!t        dj                  |d   |d   «      «      ‚|€'t        |d   j                  d¬«      d	z   «      | _
        n=t        |«      | _
        t        j                  || j                  k  «      st        d
«      ‚t        j                  |dk\  «      st        d«      ‚y)a  
        Parameters
        ------------
        indices: (m, n)-sized int array of indices
        values: (m, n)-sized dtype array of values at the specified indices
        shape: (n,) iterable of integers. If None, the maximum value of indices
            + 1 is used.
        r8   r°   r   zindices must be 2D, got shaped r   z1values and indices shapes inconsistent: {} and {}NrH   r   z#all indices must be less than shapez all indices must be non-negative)r   Ú	DataStorerŸ   r%   r   r   rz   ÚformatrK   rP   Ú_shaper   Úall)r#   r8   r°   r   r$   r¡   s        €r   r%   zSparseEncoding.__init__  s!  ø€ ô × Ñ Ó"ˆÜ‰Ñ˜ÔØ!ˆˆY‰ØˆˆX‰Ø�y‘/ˆÜˆw�}‰}Ó Ò"ÜÐ>¸w¿}¹}Ð>OÐPÓQÐQØ�‰>×Ñ G§M¡M°!Ñ$4Ð#6Ò6ÜØC×JÑJØ˜‘N D¨¡Oóóð ð
 ˆ=Ü  Y¡× 3Ñ 3¸Ð 3Ó ;¸aÑ ?Ó@ˆD�Kä ›,ˆDŒKÜ—6‘6˜' D§K¡KÑ/Ô0Ü Ð!FÓGÐGÜ�v‰v�g ‘lÔ#ÜÐ?Ó@Ð@ð $r   c                 ó�   — t        j                  | «      }| |   }t        t        j                  |d¬«      || j                  ¬«      S )NrÄ   rH   ©r   )r   r³   rÉ   Ústackr   )Ú
dense_datar1   r°   s      r   Ú
from_densezSparseEncoding.from_dense3  s?   € äŸ™ *Ó-ˆØ˜NÑ+ˆÜÜ�H‰H�^¨"Ô-¨v¸Z×=MÑ=Mô
ð 	
r   c                 ó’   — t        | j                  j                  «       | j                  j                  «       | j                  ¬«      S )N)r8   r°   r   )rÉ   r1   rC   r3   r   r)   s    r   rC   zSparseEncoding.copy;  s:   € ÜØ×'Ñ'×,Ñ,Ó.Ø×%Ñ%×*Ñ*Ó,Ø—*‘*ô
ð 	
r   c                 ó    — | j                   d   S )Nr8   ru   r)   s    r   r1   zSparseEncoding.sparse_indicesB  s   € à�z‰z˜)Ñ$Ð$r   c                 ó    — | j                   d   S )Nr°   ru   r)   s    r   r3   zSparseEncoding.sparse_valuesF  s   € à�z‰z˜(Ñ#Ð#r   c                 ó.   — | j                   j                  S r'   )r3   r   r)   s    r   r   zSparseEncoding.dtypeJ  s   € à×!Ñ!×'Ñ'Ð'r   c                 ó6   — | j                   j                  «       S r'   )r3   r-   r)   s    r   r-   zSparseEncoding.sumN  s   € à×!Ñ!×%Ñ%Ó'Ð'r   c                 ó4   — | j                   j                  d   S ©NrÄ   )r1   r   r)   s    r   rT   zSparseEncoding.ndimsR  s   € à×"Ñ"×(Ñ(¨Ñ,Ð,r   c                 ó   — | j                   S r'   ©rÍ   r)   s    r   r   zSparseEncoding.shapeV  ó   € à�{‰{Ðr   c                 ó@   — t        j                  | j                  «      S r'   )r   Úprodr   r)   s    r   r/   zSparseEncoding.sizeZ  s   € ä�w‰w�t—z‘zÓ"Ð"r   c                 ó2   — | j                   | j                  fS r'   rq   r)   s    r   rr   z SparseEncoding.sparse_components^  rs   r   c                 óÔ   — | j                   }t        j                  |j                  |j                  ¬«      }|j                  |¬«       t        j                  || j                  «      S )Nr   )Úout)Ú_cscr   r   r   r   Útodenserj   )r#   r   r5   s      r   r5   zSparseEncoding.denseb  sF   € à—‘ˆä—‘˜vŸ|™|°6·<±<Ô@ˆØ�‰˜5ˆÔ!Ü�z‰z˜% §¡Ó,Ð,r   c                 ó¶   — | j                   }| j                  | j                  «      }dt        |«      g}t	        j
                  |||f| j                  df¬«      S )Nr   r   rÐ   )r3   Ú_flat_indicesr1   r   ÚspÚ
csc_matrixr/   )r#   r°   r8   Úindptrs       r   rã   zSparseEncoding._cscj  sQ   € à×#Ñ#ˆØ×$Ñ$ T×%8Ñ%8Ó9ˆØ”S˜“\Ð"ˆÜ�}‰}˜f g¨vÐ6¸t¿y¹yÈ!¸nÔMÐMr   c                 ó®   — |j                   d   dk(  rt        |j                   «      dk(  sJ ‚t        j                  |j                  | j                   «      S )Nr   é   r   )r   r   r   Úravel_multi_indexr¼   r7   s     r   ræ   zSparseEncoding._flat_indicesq  sD   € Ø�}‰}˜QÑ 1Ò$¬¨W¯]©]Ó);¸qÒ)@Ð@Ð@Ü×#Ñ# G§I¡I¨t¯z©zÓ:Ð:r   c                 óh   — t        j                  t        j                  || j                  «      «      S r'   ©r   r²   Úunravel_indexr   )r#   Úflat_indicess     r   Ú_shaped_indiceszSparseEncoding._shaped_indicesu  ó"   € Ü�‰œr×/Ñ/°¸d¿j¹jÓIÓJÐJr   c                 ó¤   — | j                   | j                  |«         j                  «       }t        j                  |«      j                  d¬«      S ©NrÄ   rH   )rã   ræ   rä   r   ÚasarrayÚsqueeze)r#   r8   Úmats      r   r9   zSparseEncoding.gather_ndx  sB   € Ø�i‰i˜×*Ñ*¨7Ó3Ñ4×<Ñ<Ó>ˆô �z‰z˜#‹×&Ñ&¨BÐ&Ó/Ð/r   c                 óŒ   — t        j                  | j                  |j                  d«         «      \  }}| j	                  |«      S rÃ   )r   r³   rã   rj   rñ   )r#   r=   ÚiÚ_s       r   r=   zSparseEncoding.mask~  s7   € Ü�x‰x˜Ÿ	™	 $§,¡,¨uÓ"5Ñ6Ó7‰ˆˆ1Ø×#Ñ# AÓ&Ð&r   c                 óT   — | j                  t        j                  |d¬«      «      d   S )Nr   rH   )Ú
_gather_ndr   Úexpand_dimsr?   s     r   rA   zSparseEncoding.get_value‚  s!   € Ø�‰œrŸ~™~¨e¸!Ô<Ó=¸aÑ@Ð@r   c                 óD  — | j                   rt        | j                  «      S | j                  }t	        j
                  |d¬«      }t	        j                  |d¬«      }|dz  }|| j                  z  }t	        j                  ||f«      }t        ||z
  | j                  «      |fS )aG  
        Get encoding with all zeros stripped from the start/end of each axis.

        Returns:
            encoding: SparseEncoding with same values but indices shifted down
                by padding[:, 0]
            padding: (n, 2) array of ints denoting padding at the start/end
                that was stripped
        r   rH   rÄ   )
rF   r   r   r1   r   rO   rP   r²   rÉ   r3   )r#   r8   Úpad_leftÚ	pad_rightr   s        r   rZ   zSparseEncoding.stripped…  sŒ   € ð �=Š=Ü" 4§:¡:Ó.Ð.Ø×%Ñ%ˆÜ—6‘6˜'¨Ô*ˆÜ—F‘F˜7¨Ô+ˆ	Ø�R‰ˆ	Ø�T—Z‘ZÑˆ	Ü—/‘/ 8¨YÐ"7Ó8ˆÜ˜g¨Ñ0°$×2DÑ2DÓEÀwÐNÐNr   r'   )rŽ   r�   r�   r‘   r%   ÚstaticmethodrÓ   rC   r’   r1   r3   r   r   r•   r-   rT   r   r/   rr   r5   rã   ræ   rñ   r9   r=   rA   rZ   rÆ   rÇ   s   @r   rÉ   rÉ     s:  ø„ ñõAð> ñ
ó ð
ò
ð ñ%ó ð%ð ñ$ó ð$ð ñ(ó ð(ð ×Ññ(ó ð(ð ñ-ó ð-ð ñó ðð ñ#ó ð#ð ñ7ó ð7ð ×Ññ-ó ð-ð ×ÑñNó ðNò;òKò0ò'òAð ×ÑñOó ôOr   rÉ   c                 ój   — t        | t        j                  | j                  d   ft        ¬«      |«      S )ay  
    Convenient factory constructor for SparseEncodings with values all ones.

    Parameters
    ------------
    indices: (m, n) sparse indices into conceptual rank-n array
    shape: length n iterable or None. If None, maximum of indices along first
        axis + 1 is used

    Returns
    ------------
    rank n bool `SparseEncoding` with True values at each index.
    r   r   )rÉ   r   Úonesr   r   )r8   r   s     r   ÚSparseBinaryEncodingr  ›  s+   € ô ˜'¤2§7¡7°'·-±-ÀÑ2BÐ1DÌDÔ#QÐSXÓYÐYr   c                   óB  ‡ — e Zd ZdZdˆ fd„	Zej                  d„ «       Zed„ «       Z	ed„ «       Z
ed„ «       Zd„ Zeej                  ej                  fd„«       Zedd	„«       Zedd
„«       Zej                  d„ «       Zej                  d„ «       Zej                  d„ «       Zd„ Zej                  d„ «       Zej                  d„ «       Zej                  d„ «       Zej                  d„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z ej                  fd„Z!ej                  fd„Z"ˆ xZ#S )ÚRunLengthEncodingzi1D run length encoding.

    See `trimesh.voxel.runlength` documentation for implementation details.
    c                 óä   •— t         ‰| �  t        j                  |«      ¬«       |€| j                  j
                  }t        | j                  j                  «      dk7  rt        d«      ‚|| _	        y)zÔ
        Parameters
        ------------
        data: run length encoded data.
        dtype: dtype of encoded data. Each second value of data is cast will be
            cast to this dtype if provided.
        rš   Nr   zdata must be 1D numpy array)
rŸ   r%   r   rž   r   r   r   r   rz   Ú_dtype)r#   r$   r   r¡   s      €r   r%   zRunLengthEncoding.__init__²  s^   ø€ ô 	‰Ñœg×3Ñ3°DÓ9ÐÔ:Øˆ=Ø—J‘J×$Ñ$ˆEÜˆt�z‰z×ÑÓ  AÒ%ÜÐ:Ó;Ð;Øˆ�r   c           	      ó–   — t        j                  t        j                  | j                  d d d…   | j                  dd d…   «      «       S ©Nr   r   )r   rM   Úlogical_andr   r)   s    r   rF   zRunLengthEncoding.is_emptyÁ  s:   € ä—6‘6œ"Ÿ.™.¨¯©±C°a°C©¸$¿*¹*ÀQÀTÈÀTÑ:JÓKÓLÐLÐLr   c                  ó   — yrf   r(   r)   s    r   rT   zRunLengthEncoding.ndimsÅ  s   € àr   c                 ó   — | j                   fS r'   ©r/   r)   s    r   r   zRunLengthEncoding.shapeÉ  ó   € à—	‘	ˆ|Ðr   c                 ó   — | j                   S r'   )r  r)   s    r   r   zRunLengthEncoding.dtypeÍ  rÝ   r   c                 ó6   — | j                   j                  «       S ra   rb   r)   s    r   r!   zRunLengthEncoding.__hash__Ñ  rc   r   c                 óF   — t        t        j                  | |¬«      |¬«      S ©Nry   )r  r   r{   )rÒ   r   Úencoding_dtypes      r   rÓ   zRunLengthEncoding.from_denseÜ  s!   € ä Ü×"Ñ" :°^ÔDÈEô
ð 	
r   c                 ód   — || j                   k7  rt        j                  | |¬«      } t        | «      S r  )r   r   Ú
rle_to_rler  ©Úrle_datar   s     r   Úfrom_rlezRunLengthEncoding.from_rleâ  s+   € à�H—N‘NÒ"Ü ×+Ñ+¨H¸EÔBˆHÜ  Ó*Ð*r   c                 óB   — t        t        j                  | |¬«      «      S r  )r  r   Úbrle_to_rle©Ú	brle_datar   s     r   Ú	from_brlezRunLengthEncoding.from_brleè  s   € ä ¤×!6Ñ!6°yÈÔ!NÓOÐOr   c                 óü   — | j                   rt        | j                  «      S t        j                  | j
                  «      \  }}|dk(  r| }nt        || j                  ¬«      }t        j                  |d¬«      }||fS )N©r   r   ry   r   rH   )
rF   r   r   r   Ú	rle_stripr   r  r  r   rý   ©r#   r$   r   r   s       r   rZ   zRunLengthEncoding.strippedì  sh   € à�=Š=Ü" 4§:¡:Ó.Ð.Ü!×+Ñ+¨D¯J©JÓ7‰ˆˆgØ�fÒØ‰Hä(¨°T·[±[ÔAˆHÜ—.‘. ¨qÔ1ˆØ˜Ð Ð r   c                 óh   — | j                   d d d…   | j                   dd d…   z  j                  «       S r
  r¨   r)   s    r   r-   zRunLengthEncoding.sumø  s1   € à—
‘
™3˜Q˜3‘ $§*¡*¨Q¨T°¨TÑ"2Ñ2×7Ñ7Ó9Ð9r   c                 ó@   — t        j                  | j                  «      S r'   )r   Ú
rle_lengthr   r)   s    r   r/   zRunLengthEncoding.sizeü  s   € ä×#Ñ# D§J¡JÓ/Ð/r   c                 óx   — |dk7  rt        d|›�«      ‚t        t        j                  | j                  «      «      S ©Nr   z%encoding is 1D - cannot flip on axis )rz   r  r   Úrle_reverser   r]   s     r   r_   zRunLengthEncoding._flip   s6   € Ø�4Š<ÜÐDÀTÀHÐMÓNÐNÜ ¤×!6Ñ!6°t·z±zÓ!BÓCÐCr   c                 ó@   — t        j                  | j                  «      S r'   )r   Úrle_to_sparser   r)   s    r   rr   z#RunLengthEncoding.sparse_components  ó   € ä×&Ñ& t§z¡zÓ2Ð2r   c                 ó    — | j                   d   S rE   rµ   r)   s    r   r1   z RunLengthEncoding.sparse_indices	  r¶   r   c                 ó    — | j                   d   S rf   rµ   r)   s    r   r3   zRunLengthEncoding.sparse_values  r¶   r   c                 óX   — t        j                  | j                  | j                  ¬«      S r  )r   Úrle_to_denser   r  r)   s    r   r5   zRunLengthEncoding.dense  s   € ä×%Ñ% d§j¡j¸¿¹ÔDÐDr   c                 óZ   — t        j                  | j                  || j                  ¬«      S r  )r   Úrle_gather_1dr   r  r7   s     r   r¯   zRunLengthEncoding.gather  s   € Ü×&Ñ& t§z¡z°7À$Ç+Á+ÔNÐNr   c                 óR   — t        j                  |d¬«      }| j                  |«      S rô   ©r   rö   r¯   r7   s     r   r9   zRunLengthEncoding.gather_nd  s!   € Ü—*‘*˜W¨2Ô.ˆØ�{‰{˜7Ó#Ð#r   c                 ó’   — t        j                  t        t        j                  | j
                  |«      «      | j                  ¬«      S r  )r   rS   rK   r   Úsorted_rle_gather_1dr   r  )r#   Úordered_indicess     r   Úsorted_gatherzRunLengthEncoding.sorted_gather  s3   € Ü�x‰xÜ”)×0Ñ0°·±¸_ÓMÓNØ—+‘+ô
ð 	
r   c                 ó’   — t        j                  t        t        j                  | j
                  |«      «      | j                  ¬«      S r  )r   rS   rK   r   Úrle_maskr   r  r<   s     r   r=   zRunLengthEncoding.mask"  s-   € Ü�x‰xœœi×0Ñ0°·±¸TÓBÓCÈ4Ï;É;ÔWÐWr   c                 óv   — | j                  |f«      D ]$  }t        j                  || j                  ¬«      c S  y r  )r7  r   Ú
asanyarrayr  )r#   r@   r�   s      r   rA   zRunLengthEncoding.get_value%  s.   € Ø×'Ñ'¨¨Ö1ˆEÜ—=‘= ¨d¯k©kÔ:Ò:ñ 2r   c                 ó`   — t        | j                  j                  «       | j                  ¬«      S r  )r  r   rC   r   r)   s    r   rC   zRunLengthEncoding.copy)  s   € Ü  §¡§¡Ó!2¸$¿*¹*ÔEÐEr   c                 óD   — t        j                  | j                  |¬«      S r  )r   r  r   r|   s     r   r}   z!RunLengthEncoding.run_length_data,  s   € Ü×#Ñ# D§J¡J°eÔ<Ð<r   c                 óD   — t        j                  | j                  |¬«      S r  )r   Úrle_to_brler   r|   s     r   r€   z(RunLengthEncoding.binary_run_length_data/  ó   € Ü×$Ñ$ T§Z¡Z°uÔ=Ð=r   r'   )$rŽ   r�   r�   r‘   r%   r   r•   rF   r’   rT   r   r   r!   r  r   r–   rÓ   r  r  rZ   r-   r/   r_   rr   r1   r3   r5   r¯   r9   r7  r=   rA   rC   r}   r€   rÆ   rÇ   s   @r   r  r  ¬  s°  ø„ ñõ
ð ×ÑñMó ðMð ñó ðð ñó ðð ñó ðò	%ð Ø%'§X¡X¸b¿h¹hò 
ó ð
ð
 ò+ó ð+ð
 òPó ðPð ×Ññ	!ó ð	!ð ×Ññ:ó ð:ð ×Ññ0ó ð0òDð
 ×Ññ3ó ð3ð ×Ññ)ó ð)ð ×Ññ)ó ð)ð ×ÑñEó ðEòOò$ò
òXò;òFð %'§H¡Hó =ð ,.¯8©8÷ >r   r  c                   óÚ  ‡ — e Zd ZdZˆ fd„Zej                  d„ «       Zee	j                  fd„«       Zedd„«       Zedd„«       Zej                  d„ «       Zej                  d„ «       Zej                  d	„ «       Zd
„ Zed„ «       Zej                  d„ «       Zej                  d„ «       Zej                  d„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Ze	j                  fd„Ze	j                  fd„Zˆ xZS )ÚBinaryRunLengthEncodingzp1D binary run length encoding.

    See `trimesh.voxel.runlength` documentation for implementation details.
    c                 ó0   •— t         ‰| �  |t        ¬«       y)z_
        Parameters
        ------------
        data: binary run length encoded data.
        )r$   r   N)rŸ   r%   r   r    s     €r   r%   z BinaryRunLengthEncoding.__init__9  s   ø€ ô 	‰Ñ˜d¬$ÐÕ/r   c                 óN   — t        j                  | j                  dd d…   «       S ©Nr   r   rª   r)   s    r   rF   z BinaryRunLengthEncoding.is_emptyA  s#   € ä—6‘6˜$Ÿ*™* Q T¨ TÑ*Ó+Ð+Ð+r   c                 óB   — t        t        j                  | |¬«      «      S r  )rB  r   r   )rÒ   r  s     r   rÓ   z"BinaryRunLengthEncoding.from_denseE  s   € ä&Ü×#Ñ# J°nÔEó
ð 	
r   c                 óB   — t        t        j                  | |¬«      «      S r  )rB  r   r?  r  s     r   r  z BinaryRunLengthEncoding.from_rleK  s   € ä&¤y×'<Ñ'<¸XÈUÔ'SÓTÐTr   c                 ód   — || j                   k7  rt        j                  | |¬«      } t        | «      S r  )r   r   Úbrle_to_brlerB  r  s     r   r  z!BinaryRunLengthEncoding.from_brleO  s+   € à�I—O‘OÒ#Ü!×.Ñ.¨yÀÔFˆIÜ& yÓ1Ð1r   c                 óä   — | j                   rt        | j                  «      S t        j                  | j
                  «      \  }}|dk(  r| }nt        |«      }t        j                  |d¬«      }||fS )Nr   r   rH   )	rF   r   r   r   r!  r   rB  r   rý   r"  s       r   rZ   z BinaryRunLengthEncoding.strippedU  sb   € à�=Š=Ü" 4§:¡:Ó.Ð.Ü!×+Ñ+¨D¯J©JÓ7‰ˆˆgØ�fÒØ‰Hä.¨tÓ4ˆHÜ—.‘. ¨qÔ1ˆØ˜Ð Ð r   c                 óB   — | j                   dd d…   j                  «       S rE  r¨   r)   s    r   r-   zBinaryRunLengthEncoding.suma  s    € à�z‰z˜!˜$˜Q˜$Ñ×#Ñ#Ó%Ð%r   c                 ó@   — t        j                  | j                  «      S r'   )r   Úbrle_lengthr   r)   s    r   r/   zBinaryRunLengthEncoding.sizee  s   € ä×$Ñ$ T§Z¡ZÓ0Ð0r   c                 óx   — |dk7  rt        d|›�«      ‚t        t        j                  | j                  «      «      S r'  )rz   rB  r   Úbrle_reverser   r]   s     r   r_   zBinaryRunLengthEncoding._flipi  s6   € Ø�4Š<ÜÐDÀTÀHÐMÓNÐNÜ&¤y×'=Ñ'=¸d¿j¹jÓ'IÓJÐJr   c                 ó2   — | j                   | j                  fS r'   rq   r)   s    r   rr   z)BinaryRunLengthEncoding.sparse_componentsn  rs   r   c                 óN   — t        j                  | j                  ft        ¬«      S )Nr   )r   r  r-   r   r)   s    r   r3   z%BinaryRunLengthEncoding.sparse_valuesr  s   € ä�w‰w˜dŸh™h˜[´Ô5Ð5r   c                 ó@   — t        j                  | j                  «      S r'   )r   Úbrle_to_sparser   r)   s    r   r1   z&BinaryRunLengthEncoding.sparse_indicesv  s   € ä×'Ñ'¨¯
©
Ó3Ð3r   c                 ó@   — t        j                  | j                  «      S r'   )r   Úbrle_to_denser   r)   s    r   r5   zBinaryRunLengthEncoding.densez  r+  r   c                 óB   — t        j                  | j                  |«      S r'   )r   Úbrle_gather_1dr   r7   s     r   r¯   zBinaryRunLengthEncoding.gather~  s   € Ü×'Ñ'¨¯
©
°GÓ<Ð<r   c                 óN   — t        j                  |«      }| j                  |«      S r'   r3  r7   s     r   r9   z!BinaryRunLengthEncoding.gather_nd�  s   € Ü—*‘*˜WÓ%ˆØ�{‰{˜7Ó#Ð#r   c                 óŠ   — t        j                  | j                  |«      }t        j                  t        |«      t        ¬«      S r  )r   Úsorted_brle_gather_1dr   r   rS   rK   r   )r#   r6  Úgens      r   r7  z%BinaryRunLengthEncoding.sorted_gather…  s-   € Ü×-Ñ-¨d¯j©j¸/ÓJˆÜ�x‰xœ˜c›
¬$Ô/Ð/r   c                 óŠ   — t        j                  | j                  |«      }t        j                  t        |«      t        ¬«      S r  )r   Ú	brle_maskr   r   rS   rK   r   )r#   r=   r[  s      r   r=   zBinaryRunLengthEncoding.mask‰  s-   € Ü×!Ñ! $§*¡*¨dÓ3ˆÜ�x‰xœ˜c›
¬$Ô/Ð/r   c                 óH   — t        | j                  j                  «       «      S r'   )rB  r   rC   r)   s    r   rC   zBinaryRunLengthEncoding.copy�  s   € Ü& t§z¡z§¡Ó'8Ó9Ð9r   c                 óD   — t        j                  | j                  |¬«      S r  )r   r  r   r|   s     r   r}   z'BinaryRunLengthEncoding.run_length_data�  r@  r   c                 óD   — t        j                  | j                  |¬«      S r  )r   rI  r   r|   s     r   r€   z.BinaryRunLengthEncoding.binary_run_length_data“  s   € Ü×%Ñ% d§j¡j¸Ô>Ð>r   r'   )rŽ   r�   r�   r‘   r%   r   r•   rF   r  r   r–   rÓ   r  r  rZ   r-   r/   r_   r’   rr   r3   r1   r5   r¯   r9   r7  r=   rC   r}   r€   rÆ   rÇ   s   @r   rB  rB  3  sW  ø„ ñô
0ð ×Ññ,ó ð,ð Ø.0¯h©hò 
ó ð
ð
 òUó ðUð ò2ó ð2ð
 ×Ññ	!ó ð	!ð ×Ññ&ó ð&ð ×Ññ1ó ð1òKð
 ñ7ó ð7ð ×Ññ6ó ð6ð ×Ññ4ó ð4ð ×Ññ3ó ð3ò=ò$ò0ò0ò:ð %'§H¡Hó >ð ,.¯8©8÷ ?r   rB  c                   óÄ   — e Zd ZdZej
                  d„ «       Zej
                  d„ «       Zed„ «       Z	ed„ «       Z
ed„ «       Zed„ «       Zed„ «       Zed	„ «       Zd
„ Zd„ Zy)ÚLazyIndexMapa8  
    Abstract class for implementing lazy index mapping operations.

    Implementations include transpose, flatten/reshaping and flipping

    Derived classes must implement:
        * _to_base_indices(indices)
        * _from_base_indices(base_indices)
        * shape
        * dense
        * mask(mask)
    c                  ó   — y r'   r(   r7   s     r   Ú_to_base_indiceszLazyIndexMap._to_base_indices¥  r:   r   c                  ó   — y r'   r(   ©r#   Úbase_indicess     r   Ú_from_base_indiceszLazyIndexMap._from_base_indices©  r:   r   c                 ó.   — | j                   j                  S r'   )r   rF   r)   s    r   rF   zLazyIndexMap.is_empty­  s   € à�z‰z×"Ñ"Ð"r   c                 ó.   — | j                   j                  S r'   r£   r)   s    r   r   zLazyIndexMap.dtype±  r¤   r   c                 ó.   — | j                   j                  S r'   r¨   r)   s    r   r-   zLazyIndexMap.sumµ  s   € à�z‰z�~‰~Ðr   c                 ó.   — | j                   j                  S r'   r¬   r)   s    r   r/   zLazyIndexMap.size¹  r­   r   c                 óL   — | j                  | j                  j                  «      S r'   )rh  r   r1   r)   s    r   r1   zLazyIndexMap.sparse_indices½  s   € à×&Ñ& t§z¡z×'@Ñ'@ÓAÐAr   c                 ó.   — | j                   j                  S r'   )r   r3   r)   s    r   r3   zLazyIndexMap.sparse_valuesÁ  s   € à�z‰z×'Ñ'Ð'r   c                 óV   — | j                   j                  | j                  |«      «      S r'   )r   r9   rd  r7   s     r   r9   zLazyIndexMap.gather_ndÅ  s"   € Ø�z‰z×#Ñ# D×$9Ñ$9¸'Ó$BÓCÐCr   c                 óP   — | j                   t        | j                  |«      «         S r'   )r   rK   rd  r?   s     r   rA   zLazyIndexMap.get_valueÈ  s!   € Ø�z‰zœ% × 5Ñ 5°eÓ <Ó=Ñ>Ð>r   N)rŽ   r�   r�   r‘   r“   r”   rd  rh  r’   rF   r   r-   r/   r1   r3   r9   rA   r(   r   r   rb  rb  —  sÀ   „ ñð 	×Ññó ðð 	×Ññó ðð ñ#ó ð#ð ñ ó ð ð ñó ðð ñó ðð ñBó ðBð ñ(ó ð(òDó?r   rb  c                   óX   — e Zd ZdZd„ Zd„ Zed„ «       Zed„ «       Zd„ Z	ed„ «       Z
d„ Zy	)
rl   zr
    Lazily flattened encoding.

    Dense equivalent is np.reshape(data, (-1,)) (np.flatten creates a copy).
    c                 ó|   — t        j                  t        j                  || j                  j                  «      «      S r'   )r   r²   rï   r   r   r7   s     r   rd  z"FlattenedEncoding._to_base_indicesÓ  s(   € Ü�‰œr×/Ñ/°¸¿¹×9IÑ9IÓJÓKÐKr   c                 ó”   — t        j                  t        j                  |j                  | j                  j
                  «      d¬«      S rô   )r   rý   rì   r¼   r   r   rf  s     r   rh  z$FlattenedEncoding._from_base_indicesÖ  s3   € Ü�~‰~Ü× Ñ  §¡°·±×1AÑ1AÓBÈô
ð 	
r   c                 ó   — | j                   fS r'   r  r)   s    r   r   zFlattenedEncoding.shapeÛ  r  r   c                 óL   — | j                   j                  j                  d«      S rÃ   )r   r5   rj   r)   s    r   r5   zFlattenedEncoding.denseß  s   € à�z‰z×Ñ×'Ñ'¨Ó.Ð.r   c                 ó~   — | j                   j                  |j                  | j                   j                  «      «      S r'   )r   r=   rj   r   r<   s     r   r=   zFlattenedEncoding.maskã  s(   € Ø�z‰z�‰˜tŸ|™|¨D¯J©J×,<Ñ,<Ó=Ó>Ð>r   c                 ó   — | S r'   r(   r)   s    r   rg   zFlattenedEncoding.flatæ  s   € àˆr   c                 óH   — t        | j                  j                  «       «      S r'   )rl   r   rC   r)   s    r   rC   zFlattenedEncoding.copyê  s   € Ü  §¡§¡Ó!2Ó3Ð3r   N)rŽ   r�   r�   r‘   rd  rh  r’   r   r5   r=   rg   rC   r(   r   r   rl   rl   Ì  sX   „ ñòLò
ð
 ñó ðð ñ/ó ð/ò?ð ñó ðó4r   rl   c                   ój   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zed„ «       Zed„ «       Z	ed„ «       Z
d„ Zd	„ Zˆ xZS )
rh   zI
    Lazily reshaped encoding.

    Numpy equivalent is `np.reshape`
    c                 ól  •‡— t        |t        «      r|j                  dk7  r|j                  }nt	        d«      ‚t
        ‰| �  |¬«       t        |«      | _        | j                  j                  d«      }t        j                  | j                  «      }|dk(  r¢t        j                  |«      }| j                  j                  |z  dk7  r4t	        d| j                  j                  t        | j                  «      «      ‚| j                  j                  |z  Št        ˆfd„| j                  D «       «      | _        y |dkD  rt	        d	«      ‚t        j                  | j                  «      | j                  j                  k7  r4t	        d| j                  j                  t        | j                  «      «      ‚y )
Nr   zencoding must be an Encodingrš   rÄ   r   z0cannot reshape encoding of size %d into shape %sc              3   ó0   •K  — | ]  }|d k(  r‰n|–— Œ y­w)rÄ   Nr(   )Ú.0ÚsÚrems     €r   Ú	<genexpr>z*ShapedEncoding.__init__.<locals>.<genexpr>	  s   øè ø€ ÐK¹{¸! q¨B¢w¡°AÓ 5¹{ùs   ƒr   z(shape cannot have more than one -1 value)r›   r   rT   rg   rz   rŸ   r%   rK   rÍ   Úcountr   rß   Úabsr   r/   Ústr)r#   r   r   Únnr/   r~  r¡   s        @€r   r%   zShapedEncoding.__init__õ  sE  ù€ Ü�h¤Ô)Ø�~‰~ Ò"Ø#Ÿ=™=‘äÐ;Ó<Ð<Ü‰Ñ˜hÐÔ'Ü˜E“lˆŒØ�[‰[×Ñ˜rÓ"ˆÜ�w‰w�t—{‘{Ó#ˆØ�Š7Ü—6‘6˜$“<ˆDØ�z‰z�‰ Ñ%¨Ò*Ü ØFØ—J‘J—O‘OÜ˜Ÿ™Ó$óð ð —*‘*—/‘/ TÑ)ˆCÜÓK¸t¿{º{ÓKÓKˆD�KØ�!ŠVÜÐGÓHÐHÜ�W‰W�T—[‘[Ó! T§Z¡Z§_¡_Ò4ÜØBØ—
‘
—‘Ü�D—K‘KÓ óð ð 5r   c                 óh   — t        j                  t        j                  || j                  «      «      S r'   rî   rf  s     r   rh  z!ShapedEncoding._from_base_indices  rò   r   c                 ó€   — t        j                  t        j                  |j                  | j                  «      d¬«      S rô   )r   rý   rì   r¼   r   r7   s     r   rd  zShapedEncoding._to_base_indices  s)   € Ü�~‰~œb×2Ñ2°7·9±9¸d¿j¹jÓIÐPRÔSÐSr   c                 ó   — | j                   S r'   ru   r)   s    r   rg   zShapedEncoding.flat  rv   r   c                 ó   — | j                   S r'   rÜ   r)   s    r   r   zShapedEncoding.shape  rÝ   r   c                 ó`   — | j                   j                  j                  | j                  «      S r'   )r   r5   rj   r   r)   s    r   r5   zShapedEncoding.dense!  s!   € à�z‰z×Ñ×'Ñ'¨¯
©
Ó3Ð3r   c                 óL   — | j                   j                  |j                  «      S r'   )r   r=   rg   r<   s     r   r=   zShapedEncoding.mask%  s   € Ø�z‰z�‰˜tŸy™yÓ)Ð)r   c                 ó`   — t        | j                  j                  «       | j                  ¬«      S )N)r   r   )rh   r   rC   r   r)   s    r   rC   zShapedEncoding.copy(  s   € Ü t§z¡z§¡Ó'8ÀÇ
Á
ÔKÐKr   )rŽ   r�   r�   r‘   r%   rh  rd  r’   rg   r   r5   r=   rC   rÆ   rÇ   s   @r   rh   rh   î  s`   ø„ ñôò<KòTð ñó ðð ñó ðð ñ4ó ð4ò*öLr   rh   c                   ó’   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zed„ «       Zed„ «       Z	d„ Z
d„ Zed	„ «       Zd
„ Zd„ Zd„ Zed„ «       Zd„ Zˆ xZS )r‡   zL
    Lazily transposed encoding

    Dense equivalent is `np.transpose`
    c                 ó$  •‡— t        |t        «      st        d|›�«      ‚t        |j                  «      t        ‰«      k7  r t        d|j
                  t        ‰«      «      ‚t        ‰| �!  |«       t        j                  ‰t        j                  ¬«      Št        ˆfd„t        |j
                  «      D «       «      st        d‰›d�«      ‚t        j                  ‰«      }t        j                  |j
                  «      |‰<   ‰| _        || _        y )Nz'base_encoding must be an Encoding, got z:base_encoding has %d ndims - cannot transpose with perm %sry   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr'   r(   )r|  rù   r„   s     €r   r  z.TransposedEncoding.__init__.<locals>.<genexpr>?  s   øè ø€ ÐAÑ&@ �1˜”9Ñ&@ùs   ƒzperm z is not a valid permutation)r›   r   rz   r   r   rT   r‚  rŸ   r%   r   rS   r–   rÎ   rL   Ú
zeros_likeÚarangeÚ_permÚ	_inv_perm)r#   Úbase_encodingr„   Úinv_permr¡   s     ` €r   r%   zTransposedEncoding.__init__3  sÝ   ù€ Ü˜-¬Ô2ÜÐFÀ}ÐFWÐXÓYÐYÜˆ}×"Ñ"Ó#¤s¨4£yÒ0ÜØLØ×#Ñ#Ü�D“	óð ô 	‰Ñ˜Ô'Ü�x‰x˜¤B§H¡HÔ-ˆÜÓA¤e¨M×,?Ñ,?Ô&@ÓAÔAÜ˜u T HÐ,GÐHÓIÐIÜ—=‘= Ó&ˆÜŸ™ =×#6Ñ#6Ó7ˆ�‰ØˆŒ
Ø!ˆ�r   c                 ón   — t        | j                  |D �cg c]  }| j                  |   ‘Œ c}«      S c c}w r'   )r‚   r   r�  )r#   r„   Úps      r   r…   zTransposedEncoding.transposeF  s-   € Ü˜4Ÿ:™:¹tÓ'D¹t¸!¨¯
©
°1«¸tÑ'DÓEÐEùÒ'Ds   •2
c                 ó   — t        d«      ‚©NzShould not be here©ÚRuntimeErrorrƒ   s     r   rˆ   zTransposedEncoding._transposeI  ó   € ÜÐ/Ó0Ð0r   c                 ó   — | j                   S r'   )r�  r)   s    r   r„   zTransposedEncoding.permL  rv   r   c                 ól   ‡— | j                   j                  Št        ˆfd„| j                  D «       «      S )Nc              3   ó(   •K  — | ]	  }‰|   –— Œ y ­wr'   r(   )r|  r•  r   s     €r   r  z+TransposedEncoding.shape.<locals>.<genexpr>S  s   øè ø€ Ð2¡z !�U˜1•X¡zùs   ƒ)r   r   rK   r�  ri   s    @r   r   zTransposedEncoding.shapeP  s'   ø€ à—
‘
× Ñ ˆÜÓ2 t§z¢zÓ2Ó2Ð2r   c                 óF   — t        j                  || j                  d¬«      S rô   )r   Útaker�  r7   s     r   rd  z#TransposedEncoding._to_base_indicesU  s   € Ü�w‰w�w §
¡
°Ô4Ð4r   c                 ó  — 	 t        j                  || j                  d¬«      S # t        $ r_ t        j                  |j	                  t         j
                  «      | j                  j	                  t         j
                  «      d¬«      cY S w xY wrô   )r   rŸ  r‘  Ú	TypeErrorÚastyper–   rf  s     r   rh  z%TransposedEncoding._from_base_indicesX  sh   € ð	Ü—7‘7˜<¨¯©¸bÔAÐAøÜò 	ä—7‘7Ø×#Ñ#¤B§H¡HÓ-¨t¯~©~×/DÑ/DÄRÇXÁXÓ/NÐUWôò ð	ús   ‚!$ ¤A%BÂBc                 ó`   — | j                   j                  j                  | j                  «      S r'   )r   r5   r…   r�  r)   s    r   r5   zTransposedEncoding.densea  s!   € à�z‰z×Ñ×)Ñ)¨$¯*©*Ó5Ð5r   c                 óV   — | j                   j                  | j                  |«      «      S r'   )r   r¯   Ú_base_indicesr7   s     r   r¯   zTransposedEncoding.gathere  s"   € Ø�z‰z× Ñ  ×!3Ñ!3°GÓ!<Ó=Ð=r   c                 óœ   — | j                   j                  |j                  | j                  «      «      j                  | j                  «      S r'   )r   r=   r…   r‘  r�  r<   s     r   r=   zTransposedEncoding.maskh  s1   € Ø�z‰z�‰˜tŸ~™~¨d¯n©nÓ=Ó>×HÑHÈÏÉÓTÐTr   c                 óP   — | j                   t        | j                  |«      «         S r'   )r   rK   r¥  r?   s     r   rA   zTransposedEncoding.get_valuek  s!   € Ø�z‰zœ% × 2Ñ 2°5Ó 9Ó:Ñ;Ð;r   c                 ó   — | j                   S r'   ru   r)   s    r   r$   zTransposedEncoding.datan  rv   r   c                 ó`   — t        | j                  j                  «       | j                  ¬«      S )N)r’  r„   )r‡   r   rC   r�  r)   s    r   rC   zTransposedEncoding.copyr  s   € Ü!°·
±
·±Ó0AÈÏ
É
ÔSÐSr   )rŽ   r�   r�   r‘   r%   r…   rˆ   r’   r„   r   rd  rh  r5   r¯   r=   rA   r$   rC   rÆ   rÇ   s   @r   r‡   r‡   ,  sˆ   ø„ ñô"ò&Fò1ð ñó ðð ñ3ó ð3ò5òð ñ6ó ð6ò>òUò<ð ñó ðöTr   r‡   c                   óh   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zed„ «       Zed„ «       Z	d„ Z
d„ Zdd	„Zd
„ Zˆ xZS )r\   zb
    Encoding with entries flipped along one or more axes.

    Dense equivalent is `np.flip`
    c                 óJ  •‡ ‡— |j                   Št        |t        j                  «      r!|j                  dk(  r|j                  «       f}nt        |t        «      r|f}t        ˆfd„|D «       «      }t        t        |«      «      ‰ _	        t        t        ‰ j                  «      «      t        ‰ j                  «      k7  rt        d‰ j                  ›�«      ‚t        ‰‰ �9  |«       t        ˆ fd„|D «       «      s*t        dt!        |«      ‰ j"                  j                   «      ‚y )Nr   c              3   ó6   •K  — | ]  }|d k  r|‰z   n|–— Œ y­w©r   Nr(   ©r|  r¸   rT   s     €r   r  z+FlippedEncoding.__init__.<locals>.<genexpr>ƒ  s!   øè ø€ Ð=¹°1 ! a¢%�Q˜’Y¨QÓ.¹ùó   ƒz$Axes cannot contain duplicates, got c              3   óf   •K  — | ](  }d |cxk  xr ‰j                   j                  k  nc –— Œ* y­wr­  )r   rT   )r|  r¸   r#   s     €r   r  z+FlippedEncoding.__init__.<locals>.<genexpr>ˆ  s)   øè ø€ Ð;±d°�1˜Ö,˜DŸJ™J×,Ñ,×,Ð,±dùs   ƒ.1z!Invalid axes %s for %d-d encoding)rT   r›   r   r�   r/   Úitemr   rK   ÚsortedÚ_axesr   Úsetrz   rŸ   r%   rÎ   r‚  r   )r#   r   r^   rT   r¡   s   `  @€r   r%   zFlippedEncoding.__init__}  sØ   ú€ Ø—‘ˆÜ�dœBŸJ™JÔ'¨D¯I©I¸ªNØ—I‘I“K�>‰DÜ˜œcÔ"Ø�7ˆDÜÓ=¹Ó=Ó=ˆÜœ6 $›<Ó(ˆŒ
ÜŒs�4—:‘:‹Ó¤3 t§z¡z£?Ò2ÜÐCÀDÇJÁJÀ>ÐRÓSÐSÜ‰Ñ˜Ô"ÜÓ;±dÓ;Ô;ÜØ3´S¸³YÀÇ
Á
×@PÑ@Póð ð <r   c                 ó¤   — |j                  «       }| j                  }| j                  D ]$  }|d d …|fxx   dz  cc<   |d d …|fxx   |z  cc<   Œ& |S rÚ   )rC   r   r³  )r#   r8   r   r¸   s       r   rd  z FlippedEncoding._to_base_indices�  sO   € Ø—,‘,“.ˆØ—
‘
ˆØ—”ˆAØ’A�q�D‹M˜RÑ‹MØ’A�q�D‹M˜UÑ"ŒMð ð ˆr   c                 ó$   — | j                  |«      S r'   )rd  rf  s     r   rh  z"FlippedEncoding._from_base_indices•  s   € Ø×$Ñ$ \Ó2Ð2r   c                 ó.   — | j                   j                  S r'   r¦   r)   s    r   r   zFlippedEncoding.shape˜  r¤   r   c                 ó€   — | j                   j                  }| j                  D ]  }t        j                  ||«      }Œ |S r'   )r   r5   r³  r   ro   )r#   r5   r¸   s      r   r5   zFlippedEncoding.denseœ  s4   € à—
‘
× Ñ ˆØ—”ˆAÜ—G‘G˜E 1Ó%‰Eð àˆr   c                 óÖ   — t        |t        «      st        |«      }|j                  | j                  «      }| j
                  j                  |«      j                  | j                  «      S r'   )r›   r   r   ro   r³  r   r=   r<   s     r   r=   zFlippedEncoding.mask£  sJ   € Ü˜$¤Ô)Ü  Ó&ˆDØ�y‰y˜Ÿ™Ó$ˆØ�z‰z�‰˜tÓ$×)Ñ)¨$¯*©*Ó5Ð5r   c                 ó^   — t        | j                  j                  «       | j                  «      S r'   )r\   r   rC   r³  r)   s    r   rC   zFlippedEncoding.copy©  s   € Ü˜tŸz™zŸ™Ó0°$·*±*Ó=Ð=r   c                 ó   — t        |t        j                  «      r-|j                  dk(  r|j	                  «       f}n+t        |«      }nt        |t        «      r|f}nt        |«      }t        | | j                  z   «      S rf   )	r›   r   r�   r/   r±  rK   r   rn   r³  )r#   rI   r^   s      r   ro   zFlippedEncoding.flip¬  sa   € Ü�dœBŸJ™JÔ'Ø�y‰y˜AŠ~ØŸ	™	›�~‘ä˜T“{‘Ü˜œcÔ"Ø�7‰Dä˜“;ˆDÜ˜˜dŸj™j¨4Ñ/Ó0Ð0r   c                 ó   — t        d«      ‚r—  r˜  r]   s     r   r_   zFlippedEncoding._flip¸  rš  r   r   )rŽ   r�   r�   r‘   r%   rd  rh  r’   r   r5   r=   rC   ro   r_   rÆ   rÇ   s   @r   r\   r\   v  sS   ø„ ñôò ò3ð ñ ó ð ð ñó ðò6ò>ó
1ö1r   r\   c                 ó8  ‡— t        |d«      s|f}t        «       }| j                  Št        ˆfd„|D «       «      }|D ])  }||v r|j	                  |«       Œ|j                  |«       Œ+ t        |«      dk(  r| S | j                  t        t        |«      «      «      S )NÚ__iter__c              3   ó6   •K  — | ]  }|d k  r|‰z   n|–— Œ y­wr­  r(   r®  s     €r   r  z_flipped.<locals>.<genexpr>Á  ó!   øè ø€ Ð9±D¨q˜a !še��U’¨Ó*±Dùr¯  r   )	Úhasattrr´  rT   rK   ÚremoveÚaddr   r_   r²  )r   r^   Ú	unique_axr¸   rT   s       @r   rn   rn   ¼  s‹   ø€ Ü�4˜Ô$ØˆwˆÜ“€IØ�N‰N€EÜÓ9±DÓ9Ó9€DÛˆØ�	‰>Ø×Ñ˜QÕà�M‰M˜!Õð	 ô
 ˆ9ƒ~˜ÒØˆà�~‰~œe¤F¨9Ó$5Ó6Ó7Ð7r   c                 óÀ   ‡— | j                   Št        ˆfd„|D «       «      }t        j                  t        j                  ‰«      |k(  «      r| S | j                  |«      S )Nc              3   ó6   •K  — | ]  }|d k  r|‰z   n|–— Œ y­wr­  r(   )r|  r•  rT   s     €r   r  z_transposed.<locals>.<genexpr>Ï  rÀ  r¯  )rT   rK   r   rÎ   r�  rˆ   )r   r„   rT   s     @r   r‚   r‚   Í  sL   ø€ Ø�N‰N€EÜÓ9±DÓ9Ó9€DÜ	‡v�vŒb�i‰i˜Ó $Ñ&Ô'Øˆà×"Ñ" 4Ó(Ð(r   r'   )r‘   r“   Únumpyr   Ú r   Úutilr   r   Úscipyr   rç   ÚBaseExceptionÚEÚ
exceptionsr	   r   r   r   rÉ   r  r  rB  rb  rl   rh   r‡   r\   rn   r‚   r(   r   r   Ú<module>rÎ     së   ðÙ =ã 
ã å Ý Ý ðÝ"òô]#ˆsô ]#ô@M0�Hô M0ô`MO�Xô MOó`Zô"D>˜ô D>ôNa?Ð/ô a?ôH2?�8ô 2?ôj4˜ô 4ôD;L�\ô ;Lô|GT˜ô GTôTC1�lô C1òL8ó")øðA ò Ý-á	˜!Ó	…Bûðús   žB  Â B=Â%B8Â8B=