
    Ti\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 n## e$ rZdd	lmZ  ee          ZY dZ[ndZ[ww xY w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dS )#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       P/DATA/AppData/hermes/venv/lib/python3.11/site-packages/trimesh/voxel/encoding.py_empty_strippedr      sa    5zzHRXD8O4HHHIIHhh]#666GGAAAqDM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%j&        d             Z%dS )!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                 \    || _         t          j        | j         j                  | _        d S )N)id_function)_datar   Cache__hash___cache)selfdatas     r   __init__zEncoding.__init__&   s&    
m
0CDDDr   c                     d S N r#   s    r   r   zEncoding.dtype*   	     	r   c                     d S r'   r(   r)   s    r   r   zEncoding.shape/   r*   r   c                     d S r'   r(   r)   s    r   sumzEncoding.sum4   r*   r   c                     d S r'   r(   r)   s    r   sizezEncoding.size9   r*   r   c                     d S r'   r(   r)   s    r   sparse_indiceszEncoding.sparse_indices>   r*   r   c                     d S r'   r(   r)   s    r   sparse_valueszEncoding.sparse_valuesC   r*   r   c                     d S r'   r(   r)   s    r   densezEncoding.denseH   r*   r   c                     d S r'   r(   r#   indicess     r   	gather_ndzEncoding.gather_ndM       r   c                     d S r'   r(   r#   masks     r   r=   zEncoding.maskQ   r:   r   c                     d S r'   r(   r#   indexs     r   	get_valuezEncoding.get_valueU   r:   r   c                     d S r'   r(   r)   s    r   copyzEncoding.copyY   r:   r   c                 @    | j         | j        dk             j        dk    S Nr   )r1   r3   r/   r)   s    r   is_emptyzEncoding.is_empty]   s     "4#5#:;@AEEr   c                    | j         rt          | j                  S | j        }|j        }t	          |          }g }g }t          |          D ]\  }}t          t          |                    t          t          |dz   |                    z   }t          j	        ||          }	t          j
        |	          \  }
|
                                }|
                                dz   }|                    |||z
  g           |                    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   s2    = 	/"4:...
E

"5)) 	/ 	/ICs$$uU37E-B-B'C'CCDVE---FF++JWKKMMEKKMMA%ENNE4%<0111MM%u--....U5==122BHWc4J4JJJr   c                 "    t          | |          S r'   )FlippedEncodingr#   axess     r   _flipzEncoding._flip~   s    tT***r   c                 4    | 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""$$$r   c                 *    t          | j                  S r'   )r   r   r)   s    r   rT   zEncoding.ndims   s    4:r   c                 V    t          |          dk    r| j        nt          | |          S Nr   )r   flatShapedEncodingr#   r   s     r   reshapezEncoding.reshape   s&    JJ!OOtyye1L1LLr   c                      t          |           S r'   )FlattenedEncodingr)   s    r   rg   zEncoding.flat   s     &&&r   r   c                 "    t          | |          S r'   )_flipped)r#   rI   s     r   flipzEncoding.flip   s    d###r   c                     | j         | j        fS r'   r1   r3   r)   s    r   sparse_componentszEncoding.sparse_components       "D$666r   c                     | j         S r'   r   r)   s    r   r$   zEncoding.data   
    zr   c                 l    | j         dk    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   s4    :??NOOO%dj>>>>r   c                 l    | j         dk    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   s4    :??NOOO&tz????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!!r   c                     || j         _        d S 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      sK        E E E    X    X    X    X    X    X    X 	   	   	   	   F F XF K K K8+ + +	% 	% 	%   XM M M ' ' X'$ $ $ $ 7 7 X7   X %'H ? ? ? ?
 ,.8 @ @ @ @
' ' '. . . " " X" ^# # ^# # #r   r   c                   V    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                                          |           d S )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55 	/dBJ// M !KLLL(..Dd#####r   c                     | j         j        S r'   r   r   r)   s    r   r   zDenseEncoding.dtype       zr   c                     | j         j        S r'   r   r   r)   s    r   r   zDenseEncoding.shape   r   r   c                 4    | j                                         S r'   r   r-   r)   s    r   r-   zDenseEncoding.sum   s    z~~r   c                 6    t          j        | j                   S r'   r   rM   r   r)   s    r   rF   zDenseEncoding.is_empty   s    6$*%%%%r   c                     | j         j        S r'   r   r/   r)   s    r   r/   zDenseEncoding.size       zr   c                 B    | j         }|                     |          }||fS r'   )r1   gather)r#   r8   valuess      r   rr   zDenseEncoding.sparse_components   s%    %W%%r   c                 X    t          j        t          j        | j                            S r'   )r   column_stackwherer   r)   s    r   r1   zDenseEncoding.sparse_indices   s    rx
33444r   c                     | j         d         S rf   rr   r)   s    r   r3   zDenseEncoding.sparse_values       %a((r   c                 b    | j         }|D ]}t          j        ||          }t          |          S r'   )r5   r   ro   r   )r#   r^   r5   as       r   r_   zDenseEncoding._flip   s9    
 	& 	&AGE1%%EE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'""r   c                 @    | j         t          |j                           S r'   )r   rK   Tr7   s     r   r9   zDenseEncoding.gather_nd   s    z%	**++r   c                 ^    | j         t          |t          j                  r|n|j                 S r'   )r   r   r   r   r5   r<   s     r   r=   zDenseEncoding.mask   s&    z*T2:">">N$$DJOOr   c                 6    | j         t          |                   S r'   )r   rK   r?   s     r   rA   zDenseEncoding.get_value   s    z%,,''r   c                 P    t          | j                            |                    S r'   r   r   rj   ri   s     r   rj   zDenseEncoding.reshape   s     TZ//66777r   c                 P    t          | j                            |                    S r'   )r   r   r   r   s     r   r   zDenseEncoding._transpose   s     TZ11$77888r   c                 P    t          | j                            d                    S N)r   r)   s    r   rg   zDenseEncoding.flat  s     TZ//66777r   c                 N    t          | j                                                  S r'   )r   r   rC   r)   s    r   rC   zDenseEncoding.copy  s    TZ__..///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D$ $ $ $ $     X      X        & & &   X   X
 5 5 5 ) ) )$ $ $   X# # #, , ,P P P( ( (8 8 89 9 9 8 8 X80 0 0 0 0 0 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.
    Nc                    t          j                    }t                                          |           ||d<   ||d<   |d         }t	          |j                  dk    rt          d|j                  |d         j        |j        d         fk    r/t          d                    |d         |d                             |2t          |d         	                    d          d	z             | _
        n@t          |          | _
        t          j        || j
        k               st          d
          t          j        |dk              st          d          dS )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}""Pw}PPQQQ>GM!$4#666CJJNDO   
 =Y 3 3 3 ; ;a ?@@DKK,,DK6'DK/00 H !FGGGvgl## 	A?@@@	A 	A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  sK    *--N+H^"---vZ=M
 
 
 	
r   c                     t          | j                                        | j                                        | j                  S )N)r8   r   r   )r   r1   rC   r3   r   r)   s    r   rC   zSparseEncoding.copy;  sB    ',,..%**,,*
 
 
 	
r   c                     | j         d         S )Nr8   ru   r)   s    r   r1   zSparseEncoding.sparse_indicesB  s    z)$$r   c                     | j         d         S )Nr   ru   r)   s    r   r3   zSparseEncoding.sparse_valuesF  s    z(##r   c                     | j         j        S r'   )r3   r   r)   s    r   r   zSparseEncoding.dtypeJ  s    !''r   c                 4    | j                                         S r'   )r3   r-   r)   s    r   r-   zSparseEncoding.sumN  s    !%%'''r   c                 &    | 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                 4    t          j        | j                  S r'   )r   prodr   r)   s    r   r/   zSparseEncoding.sizeZ  s    wtz"""r   c                     | j         | j        fS r'   rq   r)   s    r   rr   z SparseEncoding.sparse_components^  rs   r   c                     | j         }t          j        |j        |j                  }|                    |           t          j        || j                  S )Nr   )out)_cscr   r   r   r   todenserj   )r#   r   r5   s      r   r5   zSparseEncoding.denseb  sI    v|6<@@@5!!!z%,,,r   c                     | 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  sR    #$$T%899S\\"}fgv6ty!nMM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  sE    }Q1$$W]););q)@)@)@@#GItz:::r   c                 Z    t          j        t          j        || j                            S r'   r   r   unravel_indexr   )r#   flat_indicess     r   _shaped_indiceszSparseEncoding._shaped_indicesu  !    r/djIIJJJr   c                     | j         |                     |                                                   }t          j        |                              d          S Nr   rH   )r   r   r   r   asarraysqueeze)r#   r8   mats      r   r9   zSparseEncoding.gather_ndx  sI    i**7334<<>> z#&&B&///r   c                     t          j        | j        |                    d                             \  }}|                     |          S r   )r   r   r   rj   r   )r#   r=   i_s       r   r=   zSparseEncoding.mask~  s<    x	$,,u"5"56771##A&&&r   c                 `    |                      t          j        |d                    d         S )Nr   rH   )
_gather_ndr   expand_dimsr?   s     r   rA   zSparseEncoding.get_value  s(    r~e!<<<==a@@r   c                    | 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'***F7+++	R	TZ	/8Y"788g0$2DEEw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 A A A A A> 
 
 \

 
 
 % % X% $ $ X$ ( ( X( ( ( ( - - X-   X # # X# 7 7 X7 - - - N N N; ; ;K K K0 0 0' ' 'A A A O O O O O O Or   r   c                 n    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    s0     '27'-2B1DD#Q#Q#QSXYYYr   c                       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.
    Nc                     t                                          t          j        |                     || j        j        }t          | j        j                  dk    rt          d          || _	        dS )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__  sl     	g3D99:::=J$Etz  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".CCaC$*QTT:JKKLLLLr   c                     dS rf   r(   r)   s    r   rT   zRunLengthEncoding.ndims  s    qr   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                 4    | j                                         S ra   rb   r)   s    r   r!   zRunLengthEncoding.__hash__  rc   r   c                 L    t          t          j        | |          |          S Nry   )r  r   r{   )r   r   encoding_dtypes      r   r   zRunLengthEncoding.from_dense  s.     ":^DDDE
 
 
 	
r   c                 b    || j         k    rt          j        | |          } t          |           S r  )r   r   
rle_to_rler  rle_datar   s     r   from_rlezRunLengthEncoding.from_rle  s2    HN"" +HEBBBH ***r   c                 H    t          t          j        | |                    S r  )r  r   brle_to_rle	brle_datar   s     r   	from_brlezRunLengthEncoding.from_brle  s      !6y!N!N!NO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  sw    = 	/"4:...!+DJ77gfHH(T[AAAH.q111  r   c                 h    | j         d d d         | j         dd d         z                                  S r
  r   r)   s    r   r-   zRunLengthEncoding.sum  s2    
33Q3$*QTT"2277999r   c                 4    t          j        | j                  S r'   )r   
rle_lengthr   r)   s    r   r/   zRunLengthEncoding.size  s    #DJ///r   c                 ~    |dk    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   s=    4<<MTMMNNN !6tz!B!BCCCr   c                 4    t          j        | j                  S r'   )r   rle_to_sparser   r)   s    r   rr   z#RunLengthEncoding.sparse_components      &tz2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                 B    t          j        | j        | j                  S r  )r   rle_to_denser   r  r)   s    r   r5   zRunLengthEncoding.dense  s    %djDDDDr   c                 D    t          j        | j        || j                  S r  )r   rle_gather_1dr   r  r7   s     r   r   zRunLengthEncoding.gather  s    &tz7$+NNNNr   c                 X    t          j        |d          }|                     |          S r   r   r   r   r7   s     r   r9   zRunLengthEncoding.gather_nd  s(    *W2...{{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  s:    x)0_MMN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"  s0    xi0TBBCC4;WWWWr   c                 p    |                      |f          D ]}t          j        || j                  c S d S r  )r7  r   
asanyarrayr  )r#   r@   r   s      r   rA   zRunLengthEncoding.get_value%  sH    ''11 	; 	;E=dk::::::	; 	;r   c                 \    t          | j                                        | j                  S r  )r  r   rC   r   r)   s    r   rC   zRunLengthEncoding.copy)  s#     !2!2$*EEEEr   c                 8    t          j        | j        |          S r  )r   r  r   r|   s     r   r}   z!RunLengthEncoding.run_length_data,  s    #DJe<<<<r   c                 8    t          j        | j        |          S r  )r   rle_to_brler   r|   s     r   r   z(RunLengthEncoding.binary_run_length_data/      $TZu====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 M   X   X   X	% 	% 	% %'Xbh 
 
 
 \

 + + + \+
 P P P \P 	! 	! 	! : : : 0 0 0D D D
 3 3 3 ) ) ) ) ) ) E E EO O O$ $ $
 
 
X X X; ; ;F F F %'H = = = = ,.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                 X    t                                          |t                     dS )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                 H    t          j        | j        dd d                    S Nr   r   r   r)   s    r   rF   z BinaryRunLengthEncoding.is_emptyA  s"    6$*QTT*++++r   c                 H    t          t          j        | |                    S r  )rB  r   r   )r   r  s     r   r   z"BinaryRunLengthEncoding.from_denseE  s'    &#JnEEE
 
 	
r   Nc                 H    t          t          j        | |                    S r  )rB  r   r?  r  s     r   r  z BinaryRunLengthEncoding.from_rleK  s     &y'<XU'S'S'STTTr   c                 b    || j         k    rt          j        | |          } t          |           S r  )r   r   brle_to_brlerB  r  s     r   r  z!BinaryRunLengthEncoding.from_brleO  s2    IO##!.yFFFI&y1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  sp    = 	/"4:...!+DJ77gfHH.t44H.q111  r   c                 F    | j         dd d                                         S rE  r   r)   s    r   r-   zBinaryRunLengthEncoding.suma  s!    z!$Q$##%%%r   c                 4    t          j        | j                  S r'   )r   brle_lengthr   r)   s    r   r/   zBinaryRunLengthEncoding.sizee  s    $TZ000r   c                 ~    |dk    rt          d|          t          t          j        | j                            S r'  )rz   rB  r   brle_reverser   r]   s     r   r_   zBinaryRunLengthEncoding._flipi  s=    4<<MTMMNNN&y'=dj'I'IJJJr   c                     | j         | j        fS r'   rq   r)   s    r   rr   z)BinaryRunLengthEncoding.sparse_componentsn  rs   r   c                 D    t          j        | j        ft                    S )Nr   )r   r  r-   r   r)   s    r   r3   z%BinaryRunLengthEncoding.sparse_valuesr  s    wdh[5555r   c                 4    t          j        | j                  S r'   )r   brle_to_sparser   r)   s    r   r1   z&BinaryRunLengthEncoding.sparse_indicesv  s    '
333r   c                 4    t          j        | j                  S r'   )r   brle_to_denser   r)   s    r   r5   zBinaryRunLengthEncoding.densez  r+  r   c                 6    t          j        | j        |          S r'   )r   brle_gather_1dr   r7   s     r   r   zBinaryRunLengthEncoding.gather~  s    '
G<<<r   c                 T    t          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  s1    -dj/JJ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  s1    !$*d33xc

$////r   c                 N    t          | j                                                  S r'   )rB  r   rC   r)   s    r   rC   zBinaryRunLengthEncoding.copy  s    &tz'8'8999r   c                 8    t          j        | j        |          S r  )r   r  r   r|   s     r   r}   z'BinaryRunLengthEncoding.run_length_data  r@  r   c                 8    t          j        | j        |          S r  )r   rI  r   r|   s     r   r   z.BinaryRunLengthEncoding.binary_run_length_data  s    %dj>>>>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  s2        
0 0 0 0 0 , , , .0h 
 
 
 \

 U U U \U 2 2 2 \2
 	! 	! 	! & & & 1 1 1K K K
 7 7 X7 6 6 6 4 4 4 3 3 3= = =$ $ $0 0 00 0 0: : : %'H > > > > ,.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dS )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                     d S r'   r(   r7   s     r   _to_base_indiceszLazyIndexMap._to_base_indices  r:   r   c                     d S 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""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~r   c                     | j         j        S r'   r   r)   s    r   r/   zLazyIndexMap.size  r   r   c                 @    |                      | j        j                  S r'   )rh  r   r1   r)   s    r   r1   zLazyIndexMap.sparse_indices  s    &&tz'@AAAr   c                     | j         j        S r'   )r   r3   r)   s    r   r3   zLazyIndexMap.sparse_values  s    z''r   c                 \    | j                             |                     |                    S r'   )r   r9   rd  r7   s     r   r9   zLazyIndexMap.gather_nd  s&    z##D$9$9'$B$BCCCr   c                 \    | j         t          |                     |                             S r'   )r   rK   rd  r?   s     r   rA   zLazyIndexMap.get_value  s%    z% 5 5e < <==>>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"         	   	   # # X#     X    X   X B B XB ( ( X(D D D? ? ? ? ?r   rb  c                   l    e Zd ZdZd Zd Zed             Zed             Zd Z	ed             Z
d Zd	S )
rl   zr
    Lazily flattened encoding.

    Dense equivalent is np.reshape(data, (-1,)) (np.flatten creates a copy).
    c                 d    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JJKKKr   c                 r    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  s4    ~ 1ABB
 
 
 	
r   c                     | j         fS r'   r  r)   s    r   r   zFlattenedEncoding.shape  r  r   c                 @    | j         j                            d          S r   )r   r5   rj   r)   s    r   r5   zFlattenedEncoding.dense  s    z''...r   c                 p    | j                             |                    | j         j                            S r'   )r   r=   rj   r   r<   s     r   r=   zFlattenedEncoding.mask  s'    zt||DJ,<==>>>r   c                     | S r'   r(   r)   s    r   rg   zFlattenedEncoding.flat  s    r   c                 N    t          | j                                                  S r'   )rl   r   rC   r)   s    r   rC   zFlattenedEncoding.copy  s     !2!2333r   N)r   r   r   r   rd  rh  r   r   r5   r=   rg   rC   r(   r   r   rl   rl     s         L L L
 
 

   X / / X/? ? ?   X4 4 4 4 4r   rl   c                   |     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                 <   t          |t                    r|j        dk    r|j        }nt	          d          t                                          |           t          |          | _        | j        	                    d          }t          j        | j                  }|dk    rt          j        |          }| j        j        |z  dk    r-t	          d| j        j        t          | j                            | j        j        |z  t          fd| j        D                       | _        d S |dk    rt	          d	          t          j        | j                  | j        j        k    r-t	          d| j        j        t          | j                            d S )
Nr   zencoding must be an Encodingr   r   r   z0cannot reshape encoding of size %d into shape %sc              3   ,   K   | ]}|d k    rn|V  dS )r   Nr(   ).0srems     r   	<genexpr>z*ShapedEncoding.__init__.<locals>.<genexpr>	  s/      KK!qBwwAKKKKKKr   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__  sy   h)) 	=~""#=;<<<h'''Ell[r""wt{##776$<<Dz%** FJO$$   */T)CKKKKt{KKKKKDKKK!VVGHHHWT[!!TZ_44B
DK     54r   c                 Z    t          j        t          j        || j                            S r'   r   rf  s     r   rh  z!ShapedEncoding._from_base_indices  r   r   c                 h    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279djIIPRSS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''
333r   c                 @    | j                             |j                  S r'   )r   r=   rg   r<   s     r   r=   zShapedEncoding.mask%  s    zty)))r   c                 \    t          | j                                        | j                  S )N)r   r   )rh   r   rC   r   r)   s    r   rC   zShapedEncoding.copy(  s#    tz'8'8
KKKKr   )r   r   r   r   r%   rh  rd  r   rg   r   r5   r=   rC   r   r   s   @r   rh   rh     s             <K K KT T T   X   X 4 4 X4* * *L L L L L L 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                 f   t          |t                    st          d|          t          |j                  t                    k    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                  |<   | _        || _        d S )Nz'base_encoding must be an Encoding, got z:base_encoding has %d ndims - cannot transpose with perm %sry   c              3       K   | ]}|v V  	d S r'   r(   )r|  r   r   s     r   r  z.TransposedEncoding.__init__.<locals>.<genexpr>?  s'      AA19AAAAAAr   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2 	ZX}XXYYY}"##s4yy00L#D		   	'''xBH---AAAAeM,?&@&@AAAAA 	JHTHHHIII=&&=#677
!r   c                 F     t           j         fd|D                       S )Nc                 *    g | ]}j         |         S r(   r  )r|  pr#   s     r   
<listcomp>z0TransposedEncoding.transpose.<locals>.<listcomp>G  s    'D'D'D!
1'D'D'Dr   )r   r   r   s   ` r   r   zTransposedEncoding.transposeF  s*    4:'D'D'D'Dt'D'D'DEEEr   c                      t          d          NzShould not be hereRuntimeErrorr   s     r   r   zTransposedEncoding._transposeI      /000r   c                     | j         S r'   r  r)   s    r   r   zTransposedEncoding.permL  rv   r   c                 \    | j         j        t          fd| j        D                       S )Nc              3   (   K   | ]}|         V  d S r'   r(   )r|  r  r   s     r   r  z+TransposedEncoding.shape.<locals>.<genexpr>S  s'      22!U1X222222r   )r   r   rK   r  ri   s    @r   r   zTransposedEncoding.shapeP  s2    
 2222tz222222r   c                 :    t          j        || j        d          S r   )r   taker  r7   s     r   rd  z#TransposedEncoding._to_base_indicesU  s    ww
4444r   c                    	 t          j        || j        d          S # t          $ rY t          j        |                    t           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  s    	7<bAAAA 	 	 	7##BH--t~/D/DRX/N/NUW     	s    A B Bc                 J    | j         j                            | j                  S r'   )r   r5   r   r  r)   s    r   r5   zTransposedEncoding.densea  s    z))$*555r   c                 \    | j                             |                     |                    S r'   )r   r   _base_indicesr7   s     r   r   zTransposedEncoding.gathere  s&    z  !3!3G!<!<===r   c                     | j                             |                    | j                                                | j                  S r'   )r   r=   r   r  r  r<   s     r   r=   zTransposedEncoding.maskh  s4    zt~~dn==>>HHTTTr   c                 \    | j         t          |                     |                             S r'   )r   rK   r  r?   s     r   rA   zTransposedEncoding.get_valuek  s%    z% 2 25 9 9::;;r   c                     | j         S r'   ru   r)   s    r   r$   zTransposedEncoding.datan  rv   r   c                 \    t          | j                                        | j                  S )N)r  r   )r   r   rC   r  r)   s    r   rC   zTransposedEncoding.copyr  s#    !
0A0A
SS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   ,  s3        " " " " "&F F F1 1 1   X 3 3 X35 5 5   6 6 X6> > >U U U< < <   XT T T T T T Tr   r   c                   t     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         t          |t          j                  r!|j        dk    r|                                f}nt          |t                    r|f}t          fd|D                       }t          t          |                     _	        t          t           j	                            t           j	                  k    rt          d j	                  t                                          |           t           fd|D                       s(t          dt!          |           j        j                   d S )Nr   c              3   2   K   | ]}|d k     r|z   n|V  dS r   Nr(   r|  r   rT   s     r   r  z+FlippedEncoding.__init__.<locals>.<genexpr>  s3      ==1!a%%QYYQ======r   z$Axes cannot contain duplicates, got c              3   L   K   | ]}d |cxk    oj         j        k     nc V  dS r  )r   rT   )r|  r   r#   s     r   r  z+FlippedEncoding.__init__.<locals>.<genexpr>  sD      ;;1,,,,DJ,,,,,;;;;;;r   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__}  s2   dBJ'' 	DINNIIKK>DDc"" 	7D=========6$<<((
s4:3tz??22RDJRRSSS""";;;;d;;;;; 	3SYY
@P  	 	r   c                     |                                 }| 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  sj    ,,..
 	# 	#AAAAqDMMMRMMMAAAqDMMMU"MMMMr   c                 ,    |                      |          S r'   )rd  rf  s     r   rh  z"FlippedEncoding._from_base_indices  s    $$\2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  s5    
  	& 	&AGE1%%EEr   c                     t          |t                    st          |          }|                    | j                  }| j                            |                              | j                  S r'   )r   r   r   ro   r  r   r=   r<   s     r   r=   zFlippedEncoding.mask  sX    $)) 	' &&Dyy$$zt$$))$*555r   c                 Z    t          | j                                        | j                  S r'   )r\   r   rC   r  r)   s    r   rC   zFlippedEncoding.copy  s     tz00$*===r   r   c                    t          |t          j                  r1|j        dk    r|                                f}n8t          |          }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  s|    dBJ'' 	yA~~		~T{{c"" 	7DD;;Ddj4/0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  s                3 3 3     X    X6 6 6> > >
1 
1 
1 
11 1 1 1 1 1 1r   r\   c                 z   t          |d          s|f}t                      }| j        t          fd|D                       }|D ]1}||v r|                    |           |                    |           2t          |          dk    r| S |                     t          t          |                              S )N__iter__c              3   2   K   | ]}|d k     r|z   n|V  dS r  r(   r  s     r   r  z_flipped.<locals>.<genexpr>  3      99qa!eeU999999r   r   )	hasattrr  rT   rK   removeaddr   r_   r  )r   r^   	unique_axr   rT   s       @r   rn   rn     s    4$$ wINE9999D99999D  	>>QMM!
9~~~~eF9$5$566777r   c                     | j         t          fd|D                       }t          j        t          j                  |k              r| S |                     |          S )Nc              3   2   K   | ]}|d k     r|z   n|V  dS 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     sf    NE9999D99999D	vbi$&'' )""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	   = = 



                      """""""   ------		!		BBBBBB  ]# ]# ]# ]# ]#s ]# ]# ]#@M0 M0 M0 M0 M0H M0 M0 M0`MO MO MO MO MOX MO MO MO`Z Z Z Z"D> D> D> D> D> D> D> D>Na? a? a? a? a?/ a? a? a?H2? 2? 2? 2? 2?8 2? 2? 2?j4 4 4 4 4 4 4 4D;L ;L ;L ;L ;L\ ;L ;L ;L|GT GT GT GT GT GT GT GTTC1 C1 C1 C1 C1l C1 C1 C1L8 8 8") ) ) ) )s   % AA  A