
    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       C/DATA/.local/lib/python3.12/site-packages/trimesh/voxel/encoding.py_empty_strippedr      sP    5zHRXXD8O4HIHhhh]#6GGAqDM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#    
mm

0C0C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)ICs$uU37E-B'CCDVVE-FF+JWKKMEKKMA%ENNE4%<01MM%u-. * U5=12BHHWc4JJJr   c                     t        | |      S r'   )FlippedEncodingr#   axess     r   _flipzEncoding._flip~   s    tT**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__        zz""$$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!OtyyLe1L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       zz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%%djj>>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&&tzz??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    zz!!!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   %'HH ?
 ,.88 @
'. " " ^^# #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dBJJ/ !KLL((.Dd#r   c                 .    | j                   j                  S r'   r   r   r)   s    r   r   zDenseEncoding.dtype       zz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    zz~~r   c                 B    t        j                  | j                         S r'   r   rM   r   r)   s    r   rF   zDenseEncoding.is_empty   s    66$**%%%r   c                 .    | j                   j                  S r'   r   r/   r)   s    r   r/   zDenseEncoding.size       zz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    rxx

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GGE1%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    zz'""r   c                 F    | j                   t        |j                           S r'   )r   rK   Tr7   s     r   r9   zDenseEncoding.gather_nd   s    zz%		*++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*    zz*T2::">$OODJJOOr   c                 2    | j                   t        |         S r'   )r   rK   r?   s     r   rA   zDenseEncoding.get_value   s    zz%,''r   c                 J    t        | j                  j                  |            S r'   r   r   rj   ri   s     r   rj   zDenseEncoding.reshape   s    TZZ//677r   c                 J    t        | j                  j                  |            S r'   )r   r   r   r   s     r   r   zDenseEncoding._transpose   s    TZZ11$788r   c                 J    t        | j                  j                  d            S N)r   r)   s    r   rg   zDenseEncoding.flat  s    TZZ//677r   c                 H    t        | j                  j                               S r'   )r   r   rC   r)   s    r   rC   zDenseEncoding.copy  s    TZZ__.//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>GMM!$4#66CJJNDO 
 =Y 3 3 3 ;a ?@DK,DK66'DKK/0 !FGGvvg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+HH^"-vZ=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    zz)$$r   c                      | j                   d   S )Nr   ru   r)   s    r   r3   zSparseEncoding.sparse_valuesF  s    zz(##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    wwtzz""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!zz%,,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\"}}fgv6tyy!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)@@@##GIItzz::r   c                 h    t        j                  t        j                  || j                              S r'   r   r   unravel_indexr   )r#   flat_indicess     r   _shaped_indiceszSparseEncoding._shaped_indicesu  "    r//djj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    ii**734<<> zz#&&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    xx		$,,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::..%%66'*FF7+	R	TZZ	//8Y"78g0$2D2D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> 
 

 % % $ $ ( ( ( ( - -   # # 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+     '277'--2B1DD#QSX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3D9:=JJ$$Etzz 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:    66"..CaC$**QT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!     "":^DE
 	
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+    HNN" ++HEBH **r   c                 B    t        t        j                  | |            S r  )r  r   brle_to_rle	brle_datar   s     r   	from_brlezRunLengthEncoding.from_brle  s     !6!6y!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::..!++DJJ7gfH(T[[AH..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    

3Q3$**QTT"227799r   c                 @    t        j                  | j                        S r'   )r   
rle_lengthr   r)   s    r   r/   zRunLengthEncoding.size  s    ##DJJ//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<DTHMNN !6!6tzz!BCCr   c                 @    t        j                  | j                        S r'   )r   rle_to_sparser   r)   s    r   rr   z#RunLengthEncoding.sparse_components      &&tzz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    %%djjDDr   c                 Z    t        j                  | j                  || j                        S r  )r   rle_gather_1dr   r  r7   s     r   r   zRunLengthEncoding.gather  s    &&tzz7$++NNr   c                 R    t        j                  |d      }| j                  |      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  s3    xx)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-    xxi00TBC4;;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.    ''1E==dkk:: 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    ##DJJe<<r   c                 D    t        j                  | j                  |      S r  )r   rle_to_brler   r|   s     r   r   z(RunLengthEncoding.binary_run_length_data/      $$TZZu==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      	% %'XXbhh 
 

 + +
 P P 	! 	! : : 0 0D
 3 3 ) ) ) ) E EO$
X;F %'HH = ,.88 >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#    66$**QTT*+++r   c                 B    t        t        j                  | |            S r  )rB  r   r   )r   r  s     r   r   z"BinaryRunLengthEncoding.from_denseE  s    &##JnE
 	
r   c                 B    t        t        j                  | |            S r  )rB  r   r?  r  s     r   r  z BinaryRunLengthEncoding.from_rleK  s    &y'<'<XU'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+    IOO#!..yFI&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::..!++DJJ7gfH.t4H..q1  r   c                 B    | j                   dd d   j                         S rE  r   r)   s    r   r-   zBinaryRunLengthEncoding.suma  s     zz!$Q$##%%r   c                 @    t        j                  | j                        S r'   )r   brle_lengthr   r)   s    r   r/   zBinaryRunLengthEncoding.sizee  s    $$TZZ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<DTHMNN&y'='=djj'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    wwdhh[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-    --djj/Jxx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xxc
$//r   c                 H    t        | j                  j                               S r'   )rB  r   rC   r)   s    r   rC   zBinaryRunLengthEncoding.copy  s    &tzz'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    %%djj>>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 , , .0hh 
 

 U U 2 2
 	! 	! & & 1 1K
 7 7 6 6 4 4 3 3=$00: %'HH > ,.88 ?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    zz"""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    zz~~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    &&tzz'@'@AAr   c                 .    | j                   j                  S r'   )r   r3   r)   s    r   r3   zLazyIndexMap.sparse_values  s    zz'''r   c                 V    | j                   j                  | j                  |            S r'   )r   r9   rd  r7   s     r   r9   zLazyIndexMap.gather_nd  s"    zz##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!    zz% 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     	  	  # #         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//9I9I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    ~~  1A1A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    zz''..r   c                 ~    | j                   j                  |j                  | j                   j                              S r'   )r   r=   rj   r   r<   s     r   r=   zFlattenedEncoding.mask  s(    zzt||DJJ,<,<=>>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(  rt        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{!qBw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'El[[r"wwt{{#766$<Dzz%* FJJOO$  **//T)CKt{{KKDK!VGHHWWT[[!TZZ__4B

DKK   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2799djjIPR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!    zz''

33r   c                 L    | j                   j                  |j                        S r'   )r   r=   rg   r<   s     r   r=   zShapedEncoding.mask%  s    zztyy))r   c                 `    t        | j                  j                         | j                        S )N)r   r   )rh   r   rC   r   r)   s    r   rC   zShapedEncoding.copy(  s    tzz'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}""#s4y0L##D	  	'xxBHH-AeM,?,?&@AAuTH,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'Dt!

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     2z!U1Xzs   )r   r   rK   r  ri   s    @r   r   zTransposedEncoding.shapeP  s'    

  2tzz222r   c                 F    t        j                  || j                  d      S r   )r   taker  r7   s     r   rd  z#TransposedEncoding._to_base_indicesU  s    www

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    	77<bAA 	77##BHH-t~~/D/DRXX/NUW 	s   !$ A%BBc                 `    | j                   j                  j                  | j                        S r'   )r   r5   r   r  r)   s    r   r5   zTransposedEncoding.densea  s!    zz))$**55r   c                 V    | j                   j                  | j                  |            S r'   )r   r   _base_indicesr7   s     r   r   zTransposedEncoding.gathere  s"    zz  !3!3G!<==r   c                     | j                   j                  |j                  | j                              j                  | j                        S r'   )r   r=   r   r  r  r<   s     r   r=   zTransposedEncoding.maskh  s1    zzt~~dnn=>HHTTr   c                 P    | j                   t        | j                  |               S r'   )r   rK   r  r?   s     r   rA   zTransposedEncoding.get_valuek  s!    zz% 2 25 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YQ.   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,DJJ,,,,ds   .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    dBJJ'DIINIIK>Dc"7D===6$<(
s4::3tzz?2CDJJ>RSS";d;;3S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AqDMRMAqDMU"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GGE1%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yy$zzt$))$**55r   c                 ^    t        | j                  j                         | j                        S r'   )r\   r   rC   r  r)   s    r   rC   zFlippedEncoding.copy  s    tzz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    dBJJ'yyA~		~T{c"7D;Ddjj4/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>  !     9Dqa!eU*Dr  r   )	hasattrr  rT   rK   removeaddr   r_   r  )r   r^   	unique_axr   rT   s       @r   rn   rn     s    4$wINNE9D99D	>QMM!	 
 9~~~eF9$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    NNE9D99D	vvbii$&'""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0H M0`MOX MO`Z"D> D>Na?/ a?H2?8 2?j4 4D;L\ ;L|GT GTTC1l C1L8")A  -	!	Bs   B   B=%B88B=