
    Mi\l                        S r SSKrSSKrSSKJr  SSKJr  SSKJr   SSK	J
r  S
 r " S S\5      r " S S\5      r " S S\5      rS"S jr " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rS  rS! rg! \ a  rSS	KJr  \" \5      r SrCNSrCff = f)#z7OO interfaces to encodings for ND arrays which caching.    N   )caching)ABC   )	runlength)sparse)ExceptionWrapperc                     [        U 5      n[        [        R                  " SU-  [        S95      n[        R                  " US4[
        S9nXS S 2S4'   X#4$ )Nr   shapedtyper   r   )lenDenseEncodingnpzerosboolint)r   num_dimsencodingpaddings       p/var/www/eduai.edurigo.com/storigo/production/storigo_env/lib/python3.13/site-packages/trimesh/voxel/encoding.py_empty_strippedr      sL    5zHRXXD8O4HIHhhh]#6GAqDM    c                       \ rS rSrSrS r\\R                  S 5       5       r	\\R                  S 5       5       r
\\R                  S 5       5       r\\R                  S 5       5       r\\R                  S 5       5       r\\R                  S	 5       5       r\\R                  S
 5       5       r\R                  S 5       r\R                  S 5       r\R                  S 5       r\R                  S 5       r\S 5       r\R,                  S 5       rS rS r\S 5       rS r\S 5       rS!S jr\S 5       r\S 5       r\ RB                  4S jr"\ RB                  4S jr#S r$S r%\S 5       r&\&RN                  S 5       r&Sr(g )"Encoding   aN  
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                 j    Xl         [        R                  " U R                   R                  S9U l        g )N)id_function)_datar   Cache__hash___cache)selfdatas     r   __init__Encoding.__init__&   s!    
mm

0C0CDr   c                     g N r$   s    r   r   Encoding.dtype*        	r   c                     g r)   r*   r+   s    r   r   Encoding.shape/   r-   r   c                     g r)   r*   r+   s    r   sumEncoding.sum4   r-   r   c                     g r)   r*   r+   s    r   sizeEncoding.size9   r-   r   c                     g r)   r*   r+   s    r   sparse_indicesEncoding.sparse_indices>   r-   r   c                     g r)   r*   r+   s    r   sparse_valuesEncoding.sparse_valuesC   r-   r   c                     g r)   r*   r+   s    r   denseEncoding.denseH   r-   r   c                     g r)   r*   r$   indicess     r   	gather_ndEncoding.gather_ndM       r   c                     g r)   r*   r$   masks     r   rG   Encoding.maskQ   rD   r   c                     g r)   r*   r$   indexs     r   	get_valueEncoding.get_valueU   rD   r   c                     g r)   r*   r+   s    r   copyEncoding.copyY   rD   r   c                 T    U R                   U R                  S:g     R                  S:H  $ Nr   )r7   r:   r4   r+   s    r   is_emptyEncoding.is_empty]   s)    ""4#5#5#:;@@AEEr   c                 ~   U R                   (       a  [        U R                  5      $ U R                  nUR                  n[	        U5      n/ n/ n[        U5       H  u  pg[        [        U5      5      [        [        US-   U5      5      -   n[        R                  " XS9n	[        R                  " U	5      u  n
U
R                  5       nU
R                  5       S-   nUR                  XU-
  /5        UR                  [        X5      5        M     [        U[        U5         5      [        R                   " U["        5      4$ )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)rS   r   r   r=   r   	enumeratetupleranger   anynonzerominmaxappendslicer   arrayr   )r$   r=   r   ndimsr   slicesdimr4   rW   filledrA   loweruppers                r   strippedEncoding.strippeda   s     =="4::..

E
"5)ICs$uU37E-B'CCDVVE-FF+JWKKMEKKMA%ENNE%<01MM%-. * U5=12BHHWc4JJJr   c                     [        X5      $ r)   )FlippedEncodingr$   axess     r   _flipEncoding._flip~   s    t**r   c                 6    U R                   R                  5       $ zu
Get the hash of the current transformation matrix.

Returns
------------
hash : str
  Hash of transformation matrix
r    r"   r+   s    r   r"   Encoding.__hash__        zz""$$r   c                 ,    [        U R                  5      $ r)   )r   r   r+   s    r   rb   Encoding.ndims   s    4::r   c                 N    [        U5      S:X  a  U R                  $ [        X5      $ Nr   )r   flatShapedEncodingr$   r   s     r   reshapeEncoding.reshape   s     J!OtyyL1LLr   c                     [        U 5      $ r)   )FlattenedEncodingr+   s    r   ry   Encoding.flat   s     &&r   c                     [        X5      $ r)   )_flipped)r$   rW   s     r   flipEncoding.flip   s    ##r   c                 2    U R                   U R                  4$ r)   r7   r:   r+   s    r   sparse_componentsEncoding.sparse_components       ""D$6$666r   c                     U R                   $ r)   r    r+   s    r   r%   Encoding.data       zzr   c                 v    U R                   S:w  a  [        S5      e[        R                  " U R                  US9$ Nr   z/`run_length_data` only valid for flat encodingsr   )rb   
ValueErrorr   dense_to_rler=   r$   r   s     r   run_length_dataEncoding.run_length_data   s0    ::?NOO%%djj>>r   c                 v    U R                   S:w  a  [        S5      e[        R                  " U R                  US9$ r   )rb   r   r   dense_to_brler=   r   s     r   binary_run_length_dataEncoding.binary_run_length_data   s0    ::?NOO&&tzz??r   c                     [        X5      $ r)   )_transposedr$   perms     r   	transposeEncoding.transpose   s    4&&r   c                     [        X5      $ r)   )TransposedEncodingr   s     r   
_transposeEncoding._transpose   s    !$--r   c                 .    U R                   R                  $ r)   r    mutabler+   s    r   r   Encoding.mutable   s    zz!!!r   c                 $    XR                   l        g r)   r   )r$   values     r   r   r      s    "

r   )r#   r    Nr   ))__name__
__module____qualname____firstlineno____doc__r&   propertyabcabstractmethodr   r   r1   r4   r7   r:   r=   rB   rG   rL   rO   rS   r   cache_decoratorrh   rn   r"   rb   r|   ry   r   r   r%   r   int64r   r   r   r   r   setter__static_attributes__r*   r   r   r   r      sM   E                      	  	  	  	  F F K K8+	%  M ' '$ 7 7   %'HH ?
 ,.88 @
'. " " ^^# #r   r   c                   L  ^  \ rS rSrSrU 4S jr\S 5       r\S 5       r\	R                  S 5       r\	R                  S 5       r\S 5       r\S	 5       r\	R                  S
 5       r\	R                  S 5       rS r\S 5       rS rS rS rS rS rS r\S 5       rS rSrU =r$ )r      z:Simple `Encoding` implementation based on a numpy ndarray.c                    > [        U[        R                  5      (       d@  [        U[        R                  5      (       d  [        S5      e[        R                  " U5      n[        TU ]!  US9  g )Nz(DenseEncoding data must be a numpy arrayr%   )	
isinstancer   TrackedArrayr   ndarrayr   tracked_arraysuperr&   r$   r%   	__class__s     r   r&   DenseEncoding.__init__   sS    $ 4 455dBJJ// !KLL((.Dd#r   c                 .    U R                   R                  $ r)   r    r   r+   s    r   r   DenseEncoding.dtype       zzr   c                 .    U R                   R                  $ r)   r    r   r+   s    r   r   DenseEncoding.shape   r   r   c                 6    U R                   R                  5       $ r)   r    r1   r+   s    r   r1   DenseEncoding.sum   s    zz~~r   c                 L    [         R                  " U R                  5      (       + $ r)   r   r[   r    r+   s    r   rS   DenseEncoding.is_empty   s    66$**%%%r   c                 .    U R                   R                  $ r)   r    r4   r+   s    r   r4   DenseEncoding.size       zzr   c                 B    U R                   nU R                  U5      nX4$ r)   )r7   gather)r$   rA   valuess      r   r   DenseEncoding.sparse_components   s#    %%W%r   c                 j    [         R                  " [         R                  " U R                  5      5      $ r)   )r   column_stackwherer    r+   s    r   r7   DenseEncoding.sparse_indices   s    rxx

344r   c                      U R                   S   $ rx   r   r+   s    r   r:   DenseEncoding.sparse_values       %%a((r   c                 n    U R                   nU H  n[        R                  " X#5      nM     [        U5      $ r)   )r=   r   r   r   )r$   rm   r=   as       r   rn   DenseEncoding._flip   s.    

AGGE%E U##r   c                     U R                   $ r)   r   r+   s    r   r=   DenseEncoding.dense   r   r   c                      U R                   U   $ r)   r   r@   s     r   r   DenseEncoding.gather   s    zz'""r   c                 F    U R                   [        UR                  5         $ r)   )r    rY   Tr@   s     r   rB   DenseEncoding.gather_nd   s    zz%		*++r   c                 z    U R                   [        U[        R                  5      (       a  U   $ UR                     $ r)   )r    r   r   r   r=   rF   s     r   rG   DenseEncoding.mask   s-    zz*T2::">">$OODJJOOr   c                 2    U R                   [        U5         $ r)   )r    rY   rJ   s     r   rL   DenseEncoding.get_value   s    zz%,''r   c                 J    [        U R                  R                  U5      5      $ r)   r   r    r|   r{   s     r   r|   DenseEncoding.reshape   s    TZZ//677r   c                 J    [        U R                  R                  U5      5      $ r)   )r   r    r   r   s     r   r   DenseEncoding._transpose   s    TZZ11$788r   c                 J    [        U R                  R                  S5      5      $ N)r   r+   s    r   ry   DenseEncoding.flat  s    TZZ//677r   c                 H    [        U R                  R                  5       5      $ r)   )r   r    rO   r+   s    r   rO   DenseEncoding.copy  s    TZZ__.//r   r*   )r   r   r   r   r   r&   r   r   r   r   r   r1   rS   r4   r   r7   r:   rn   r=   r   rB   rG   rL   r|   r   ry   rO   r   __classcell__r   s   @r   r   r      s   D$             & &    
 5 5 ) )$  #,P(89 8 80 0r   r   c                   d  ^  \ rS rSrSrSU 4S jjr\S 5       rS r\	S 5       r
\	S 5       r\	S 5       r\R                  S	 5       r\	S
 5       r\	S 5       r\	S 5       r\	S 5       r\R                  S 5       r\R                  S 5       rS rS rS rS rS r\R                  S 5       rSrU =r$ )SparseEncodingi  z
`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  > [         R                  " 5       n[        TU ]  U5        XS'   X$S'   US   n[	        UR
                  5      S:w  a  [        SUR
                  < 35      eUS   R
                  UR
                  S   4:w  a!  [        SR                  US   US   5      5      eUc$  [        US   R                  SS9S	-   5      U l
        OB[        U5      U l
        [        R                  " XR                  :  5      (       d  [        S
5      e[        R                  " US:  5      (       d  [        S5      eg)z
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.
rA   r   r   zindices must be 2D, got shaped r   z1values and indices shapes inconsistent: {} and {}NrV   r   z#all indices must be less than shapez all indices must be non-negative)r   	DataStorer   r&   r   r   r   formatrY   r^   _shaper   all)r$   rA   r   r   r%   r   s        r   r&   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'KK/00 !FGGvvgl##?@@ $r   c                     [         R                  " U 5      nX   n[        [         R                  " USS9X R                  S9$ )Nr   rV   r   )r   r   r   stackr   )
dense_datar7   r   s      r   
from_denseSparseEncoding.from_dense3  s;    *-+HH^"-v=M=M
 	
r   c                     [        U R                  R                  5       U R                  R                  5       U R                  S9$ )N)rA   r   r   )r   r7   rO   r:   r   r+   s    r   rO   SparseEncoding.copy;  s:    '',,.%%**,**
 	
r   c                      U R                   S   $ )NrA   r   r+   s    r   r7   SparseEncoding.sparse_indicesB  s    zz)$$r   c                      U R                   S   $ )Nr   r   r+   s    r   r:   SparseEncoding.sparse_valuesF  s    zz(##r   c                 .    U R                   R                  $ r)   )r:   r   r+   s    r   r   SparseEncoding.dtypeJ  s    !!'''r   c                 6    U R                   R                  5       $ r)   )r:   r1   r+   s    r   r1   SparseEncoding.sumN  s    !!%%''r   c                 4    U R                   R                  S   $ Nr   )r7   r   r+   s    r   rb   SparseEncoding.ndimsR  s    ""((,,r   c                     U R                   $ r)   r   r+   s    r   r   SparseEncoding.shapeV      {{r   c                 B    [         R                  " U R                  5      $ r)   )r   prodr   r+   s    r   r4   SparseEncoding.sizeZ  s    wwtzz""r   c                 2    U R                   U R                  4$ r)   r   r+   s    r   r    SparseEncoding.sparse_components^  r   r   c                     U R                   n[        R                  " UR                  UR                  S9nUR                  US9  [        R                  " X R                  5      $ )Nr   )out)_cscr   r   r   r   todenser|   )r$   r   r=   s      r   r=   SparseEncoding.denseb  sD    v||6<<@5!zz%,,r   c                     U R                   nU R                  U R                  5      nS[        U5      /n[        R
                  " XU4U R                  S4S9$ )Nr   r   r  )r:   _flat_indicesr7   r   sp
csc_matrixr4   )r$   r   rA   indptrs       r   r   SparseEncoding._cscj  sO    ##$$T%8%89S\"}}fv6tyy!nMMr   c                     UR                   S   S:X  a  [        UR                   5      S:X  d   e[        R                  " UR                  U R                   5      $ )Nr      r   )r   r   r   ravel_multi_indexr   r@   s     r   r$  SparseEncoding._flat_indicesq  sD    }}Q1$W]]);q)@@@##GIItzz::r   c                 j    [         R                  " [         R                  " XR                  5      5      $ r)   r   r   unravel_indexr   )r$   flat_indicess     r   _shaped_indicesSparseEncoding._shaped_indicesu       r//jjIJJr   c                     U R                   U R                  U5         R                  5       n[        R                  " U5      R                  SS9$ Nr   rV   )r   r$  r!  r   asarraysqueeze)r$   rA   mats      r   rB   SparseEncoding.gather_ndx  sB    ii**734<<> zz#&&B&//r   c                     [         R                  " U R                  UR                  S5         5      u  p#U R	                  U5      $ r   )r   r   r   r|   r1  )r$   rG   i_s       r   rG   SparseEncoding.mask~  s5    xx		$,,u"567##A&&r   c                 P    U R                  [        R                  " USS95      S   $ )Nr   rV   )
_gather_ndr   expand_dimsrJ   s     r   rL   SparseEncoding.get_value  s!    r~~e!<=a@@r   c                 B   U R                   (       a  [        U R                  5      $ U R                  n[        R
                  " USS9n[        R                  " USS9nUS-  nX0R                  -  n[        R                  " X#45      n[        X-
  U R                  5      U4$ )a  
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   rV   r   )
rS   r   r   r7   r   r]   r^   r   r   r:   )r$   rA   pad_left	pad_rightr   s        r   rh   SparseEncoding.stripped  s     =="4::..%%66'*FF7+	R	ZZ	//8"78g0$2D2DEwNNr   r  r)   )r   r   r   r   r   r&   staticmethodr  rO   r   r7   r:   r   r   r   r1   rb   r   r4   r   r=   r   r$  r1  rB   rG   rL   rh   r   r   r   s   @r   r   r     s:   A> 
 

 % % $ $ ( ( ( ( - -   # # 7 7 - - N N;K0'A O Or   r   c                 f    [        U [        R                  " U R                  S   4[        S9U5      $ )aQ  
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   )rA   r   s     r   SparseBinaryEncodingrI    s+     '277'--2B1DD#QSXYYr   c                   X  ^  \ rS rSrSrSU 4S jjr\R                  S 5       r\	S 5       r
\	S 5       r\	S 5       rS r\\R                   \R                   4S	 j5       r\SS
 j5       r\SS j5       r\R                  S 5       r\R                  S 5       r\R                  S 5       rS r\R                  S 5       r\R                  S 5       r\R                  S 5       r\R                  S 5       rS rS rS rS rS r S r!\R                   4S jr"\R                   4S jr#Sr$U =r%$ )RunLengthEncodingi  za1D run length encoding.

See `trimesh.voxel.runlength` documentation for implementation details.
c                    > [         TU ]  [        R                  " U5      S9  Uc  U R                  R
                  n[        U R                  R                  5      S:w  a  [        S5      eX l	        g)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   r   _dtype)r$   r%   r   r   s      r   r&   RunLengthEncoding.__init__  s\     	g33D9:=JJ$$Etzz A%:;;r   c           	          [         R                  " [         R                  " U R                  S S S2   U R                  SS S2   5      5      (       + $ Nr   r   )r   r[   logical_andr    r+   s    r   rS   RunLengthEncoding.is_empty  s:    66"..CaC$**QTT:JKLLLr   c                     grx   r*   r+   s    r   rb   RunLengthEncoding.ndims  s    r   c                     U R                   4$ r)   r4   r+   s    r   r   RunLengthEncoding.shape      		|r   c                     U R                   $ r)   rM  r+   s    r   r   RunLengthEncoding.dtype  r  r   c                 6    U R                   R                  5       $ rq   rr   r+   s    r   r"   RunLengthEncoding.__hash__  rt   r   c                 :    [        [        R                  " XS9US9$ Nr   )rK  r   r   )r  r   encoding_dtypes      r   r  RunLengthEncoding.from_dense  s     "":DE
 	
r   c                 ^    XR                   :w  a  [        R                  " XS9n [        U 5      $ r_  )r   r   
rle_to_rlerK  rle_datar   s     r   from_rleRunLengthEncoding.from_rle  s'    NN" ++HBH **r   c                 <    [        [        R                  " XS95      $ r_  )rK  r   brle_to_rle	brle_datar   s     r   	from_brleRunLengthEncoding.from_brle  s     !6!6y!NOOr   c                     U R                   (       a  [        U R                  5      $ [        R                  " U R
                  5      u  pUS:X  a  U nO[        XR                  S9n[        R                  " USS9nX24$ )Nr   r   r   r   rV   )
rS   r   r   r   	rle_stripr    rK  rM  r   r@  r$   r%   r   r   s       r   rh   RunLengthEncoding.stripped  sb    =="4::..!++DJJ7fH([[AH..q1  r   c                 h    U R                   S S S2   U R                   SS S2   -  R                  5       $ rP  r   r+   s    r   r1   RunLengthEncoding.sum  s1    

3Q3$**QTT"227799r   c                 B    [         R                  " U R                  5      $ r)   )r   
rle_lengthr    r+   s    r   r4   RunLengthEncoding.size  s    ##DJJ//r   c                 ~    US:w  a  [        SU< 35      e[        [        R                  " U R                  5      5      $ Nr   z%encoding is 1D - cannot flip on axis )r   rK  r   rle_reverser    rl   s     r   rn   RunLengthEncoding._flip   s6    4<DTHMNN !6!6tzz!BCCr   c                 B    [         R                  " U R                  5      $ r)   )r   rle_to_sparser    r+   s    r   r   #RunLengthEncoding.sparse_components      &&tzz22r   c                      U R                   S   $ rR   r   r+   s    r   r7    RunLengthEncoding.sparse_indices	  r   r   c                      U R                   S   $ rx   r   r+   s    r   r:   RunLengthEncoding.sparse_values  r   r   c                 T    [         R                  " U R                  U R                  S9$ r_  )r   rle_to_denser    rM  r+   s    r   r=   RunLengthEncoding.dense  s    %%djjDDr   c                 T    [         R                  " U R                  XR                  S9$ r_  )r   rle_gather_1dr    rM  r@   s     r   r   RunLengthEncoding.gather  s    &&tzz7++NNr   c                 N    [         R                  " USS9nU R                  U5      $ r5  r   r7  r   r@   s     r   rB   RunLengthEncoding.gather_nd  s!    **W2.{{7##r   c                     [         R                  " [        [        R                  " U R
                  U5      5      U R                  S9$ r_  )r   ra   rY   r   sorted_rle_gather_1dr    rM  )r$   ordered_indicess     r   sorted_gatherRunLengthEncoding.sorted_gather  s3    xx)00_MN++
 	
r   c                     [         R                  " [        [        R                  " U R
                  U5      5      U R                  S9$ r_  )r   ra   rY   r   rle_maskr    rM  rF   s     r   rG   RunLengthEncoding.mask"  s-    xxi00TBC4;;WWr   c                 r    U R                  U45       H!  n[        R                  " X R                  S9s  $    g r_  )r  r   
asanyarrayrM  )r$   rK   r   s      r   rL   RunLengthEncoding.get_value%  s,    ''1E==kk:: 2r   c                 Z    [        U R                  R                  5       U R                  S9$ r_  )rK  r    rO   r   r+   s    r   rO   RunLengthEncoding.copy)  s     !2$**EEr   c                 @    [         R                  " U R                  US9$ r_  )r   rc  r    r   s     r   r   !RunLengthEncoding.run_length_data,  s    ##DJJe<<r   c                 @    [         R                  " U R                  US9$ r_  )r   rle_to_brler    r   s     r   r   (RunLengthEncoding.binary_run_length_data/      $$TZZu==r   rZ  r)   )&r   r   r   r   r   r&   r   r   rS   r   rb   r   r   r"   rF  r   r   r  rf  rl  rh   r1   r4   rn   r   r7   r:   r=   r   rB   r  rG   rL   rO   r   r   r   r   r   s   @r   rK  rK    s   
 M M      	% %'XXbhh 
 

 + +
 P P 	! 	! : : 0 0D
 3 3 ) ) ) ) E EO$
X;F %'HH = ,.88 > >r   rK  c                     ^  \ rS rSrSrU 4S jr\R                  S 5       r\	\
R                  4S j5       r\	SS j5       r\	SS j5       r\R                  S 5       r\R                  S	 5       r\R                  S
 5       rS r\S 5       r\R                  S 5       r\R                  S 5       r\R                  S 5       rS rS rS rS rS r\
R                  4S jr\
R                  4S jrSrU =r $ )BinaryRunLengthEncodingi3  zh1D binary run length encoding.

See `trimesh.voxel.runlength` documentation for implementation details.
c                 *   > [         TU ]  U[        S9  g)z?
Parameters
------------
data: binary run length encoded data.
)r%   r   N)r   r&   r   r   s     r   r&    BinaryRunLengthEncoding.__init__9  s     	d$/r   c                 X    [         R                  " U R                  SS S2   5      (       + $ Nr   r   r   r+   s    r   rS    BinaryRunLengthEncoding.is_emptyA  s#    66$**QTT*+++r   c                 <    [        [        R                  " XS95      $ r_  )r  r   r   )r  r`  s     r   r  "BinaryRunLengthEncoding.from_denseE  s    &##JE
 	
r   c                 <    [        [        R                  " XS95      $ r_  )r  r   r  rd  s     r   rf   BinaryRunLengthEncoding.from_rleK  s    &y'<'<X'STTr   c                 ^    XR                   :w  a  [        R                  " XS9n [        U 5      $ r_  )r   r   brle_to_brler  rj  s     r   rl  !BinaryRunLengthEncoding.from_brleO  s'    OO#!..yFI&y11r   c                     U R                   (       a  [        U R                  5      $ [        R                  " U R
                  5      u  pUS:X  a  U nO[        U5      n[        R                  " USS9nX24$ )Nro  r   rV   )	rS   r   r   r   rp  r    r  r   r@  rq  s       r   rh    BinaryRunLengthEncoding.strippedU  s^    =="4::..!++DJJ7fH.t4H..q1  r   c                 B    U R                   SS S2   R                  5       $ r  r   r+   s    r   r1   BinaryRunLengthEncoding.suma  s     zz!$Q$##%%r   c                 B    [         R                  " U R                  5      $ r)   )r   brle_lengthr    r+   s    r   r4   BinaryRunLengthEncoding.sizee  s    $$TZZ00r   c                 ~    US:w  a  [        SU< 35      e[        [        R                  " U R                  5      5      $ ry  )r   r  r   brle_reverser    rl   s     r   rn   BinaryRunLengthEncoding._flipi  s6    4<DTHMNN&y'='=djj'IJJr   c                 2    U R                   U R                  4$ r)   r   r+   s    r   r   )BinaryRunLengthEncoding.sparse_componentsn  r   r   c                 J    [         R                  " U R                  4[        S9$ )Nr   )r   rH  r1   r   r+   s    r   r:   %BinaryRunLengthEncoding.sparse_valuesr  s    wwdhh[55r   c                 B    [         R                  " U R                  5      $ r)   )r   brle_to_sparser    r+   s    r   r7   &BinaryRunLengthEncoding.sparse_indicesv  s    ''

33r   c                 B    [         R                  " U R                  5      $ r)   )r   brle_to_denser    r+   s    r   r=   BinaryRunLengthEncoding.densez  r  r   c                 D    [         R                  " U R                  U5      $ r)   )r   brle_gather_1dr    r@   s     r   r   BinaryRunLengthEncoding.gather~  s    ''

G<<r   c                 P    [         R                  " U5      nU R                  U5      $ r)   r  r@   s     r   rB   !BinaryRunLengthEncoding.gather_nd  s    **W%{{7##r   c                     [         R                  " U R                  U5      n[        R                  " [        U5      [        S9$ r_  )r   sorted_brle_gather_1dr    r   ra   rY   r   )r$   r  gens      r   r  %BinaryRunLengthEncoding.sorted_gather  s-    --djj/Jxxc
$//r   c                     [         R                  " U R                  U5      n[        R                  " [        U5      [        S9$ r_  )r   	brle_maskr    r   ra   rY   r   )r$   rG   r  s      r   rG   BinaryRunLengthEncoding.mask  s-    !!$**d3xxc
$//r   c                 H    [        U R                  R                  5       5      $ r)   )r  r    rO   r+   s    r   rO   BinaryRunLengthEncoding.copy  s    &tzz'899r   c                 @    [         R                  " U R                  US9$ r_  )r   ri  r    r   s     r   r   'BinaryRunLengthEncoding.run_length_data  r  r   c                 @    [         R                  " U R                  US9$ r_  )r   r  r    r   s     r   r   .BinaryRunLengthEncoding.binary_run_length_data  s    %%djj>>r   r*   r)   )!r   r   r   r   r   r&   r   r   rS   rF  r   r   r  rf  rl  rh   r1   r4   rn   r   r   r:   r7   r=   r   rB   r  rG   rO   r   r   r   r   r   s   @r   r  r  3  s\   
0 , , .0hh 
 

 U U 2 2
 	! 	! & & 1 1K
 7 7 6 6 4 4 3 3=$00: %'HH > ,.88 ? ?r   r  c                       \ rS rSrSr\R                  S 5       r\R                  S 5       r\	S 5       r
\	S 5       r\	S 5       r\	S 5       r\	S	 5       r\	S
 5       rS rS rSrg)LazyIndexMapi  a  
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                     g r)   r*   r@   s     r   _to_base_indicesLazyIndexMap._to_base_indices  rD   r   c                     g r)   r*   r$   base_indicess     r   _from_base_indicesLazyIndexMap._from_base_indices  rD   r   c                 .    U R                   R                  $ r)   )r    rS   r+   s    r   rS   LazyIndexMap.is_empty  s    zz"""r   c                 .    U R                   R                  $ r)   r   r+   s    r   r   LazyIndexMap.dtype  r   r   c                 .    U R                   R                  $ r)   r   r+   s    r   r1   LazyIndexMap.sum  s    zz~~r   c                 .    U R                   R                  $ r)   r   r+   s    r   r4   LazyIndexMap.size  r   r   c                 L    U R                  U R                  R                  5      $ r)   )r  r    r7   r+   s    r   r7   LazyIndexMap.sparse_indices  s    &&tzz'@'@AAr   c                 .    U R                   R                  $ r)   )r    r:   r+   s    r   r:   LazyIndexMap.sparse_values  s    zz'''r   c                 V    U R                   R                  U R                  U5      5      $ r)   )r    rB   r  r@   s     r   rB   LazyIndexMap.gather_nd  s"    zz##D$9$9'$BCCr   c                 P    U R                   [        U R                  U5      5         $ r)   )r    rY   r  rJ   s     r   rL   LazyIndexMap.get_value  s!    zz% 5 5e <=>>r   r*   N)r   r   r   r   r   r   r   r  r  r   rS   r   r1   r4   r7   r:   rB   rL   r   r*   r   r   r  r    s     	  	  # #         B B ( (D?r   r  c                   `    \ rS rSrSrS rS r\S 5       r\S 5       r	S r
\S 5       rS	 rS
rg)r   i  zf
Lazily flattened encoding.

Dense equivalent is np.reshape(data, (-1,)) (np.flatten creates a copy).
c                 ~    [         R                  " [         R                  " XR                  R                  5      5      $ r)   )r   r   r/  r    r   r@   s     r   r  "FlattenedEncoding._to_base_indices  s&    r//9I9IJKKr   c                     [         R                  " [         R                  " UR                  U R                  R
                  5      SS9$ r5  )r   r@  r+  r   r    r   r  s     r   r  $FlattenedEncoding._from_base_indices  s3    ~~  1A1AB
 	
r   c                     U R                   4$ r)   rV  r+   s    r   r   FlattenedEncoding.shape  rX  r   c                 L    U R                   R                  R                  S5      $ r   )r    r=   r|   r+   s    r   r=   FlattenedEncoding.dense  s    zz''..r   c                 ~    U R                   R                  UR                  U R                   R                  5      5      $ r)   )r    rG   r|   r   rF   s     r   rG   FlattenedEncoding.mask  s(    zzt||DJJ,<,<=>>r   c                     U $ r)   r*   r+   s    r   ry   FlattenedEncoding.flat  s    r   c                 H    [        U R                  R                  5       5      $ r)   )r   r    rO   r+   s    r   rO   FlattenedEncoding.copy  s     !233r   r*   N)r   r   r   r   r   r  r  r   r   r=   rG   ry   rO   r   r*   r   r   r   r     sX    L

   / /?  4r   r   c                   t   ^  \ rS rSrSrU 4S jrS rS r\S 5       r	\S 5       r
\S 5       rS	 rS
 rSrU =r$ )rz   i  z=
Lazily reshaped encoding.

Numpy equivalent is `np.reshape`
c                   >^ [        U[        5      (       a  UR                  S:w  a  UR                  nO[	        S5      e[
        TU ]  US9  [        U5      U l        U R                  R                  S5      n[        R                  " U R                  5      nUS:X  a  [        R                  " U5      nU R                  R                  U-  S:w  a4  [	        SU R                  R                  [        U R                  5      5      eU R                  R                  U-  m[        U4S jU R                   5       5      U l        g US:  a  [	        S	5      e[        R                  " U R                  5      U R                  R                  :w  a4  [	        SU R                  R                  [        U R                  5      5      eg )
Nr   zencoding must be an Encodingr   r   r   z0cannot reshape encoding of size %d into shape %sc              3   6   >#    U  H  oS :X  a  TOUv   M     g7f)r   Nr*   ).0srems     r   	<genexpr>*ShapedEncoding.__init__.<locals>.<genexpr>	  s     K{!BwA 5{s   r   z(shape cannot have more than one -1 value)r   r   rb   ry   r   r   r&   rY   r   countr   r  absr    r4   str)r$   r   r   nnr4   r  r   s        @r   r&   ShapedEncoding.__init__  sI   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                 j    [         R                  " [         R                  " XR                  5      5      $ r)   r.  r  s     r   r  !ShapedEncoding._from_base_indices  r3  r   c                 ~    [         R                  " [         R                  " UR                  U R                  5      SS9$ r5  )r   r@  r+  r   r   r@   s     r   r  ShapedEncoding._to_base_indices  s)    ~~b22799djjIPRSSr   c                     U R                   $ r)   r   r+   s    r   ry   ShapedEncoding.flat  r   r   c                     U R                   $ r)   r  r+   s    r   r   ShapedEncoding.shape  r  r   c                 `    U R                   R                  R                  U R                  5      $ r)   )r    r=   r|   r   r+   s    r   r=   ShapedEncoding.dense!  s!    zz''

33r   c                 L    U R                   R                  UR                  5      $ r)   )r    rG   ry   rF   s     r   rG   ShapedEncoding.mask%  s    zztyy))r   c                 Z    [        U R                  R                  5       U R                  S9$ )N)r   r   )rz   r    rO   r   r+   s    r   rO   ShapedEncoding.copy(  s    tzz'8

KKr   r  )r   r   r   r   r   r&   r  r  r   ry   r   r=   rG   rO   r   r   r   s   @r   rz   rz     sf    <KT     4 4*L Lr   rz   c                      ^  \ rS rSrSrU 4S jrS rS r\S 5       r	\S 5       r
S rS	 r\S
 5       rS rS rS r\S 5       rS rSrU =r$ )r   i,  z@
Lazily transposed encoding

Dense equivalent is `np.transpose`
c                 >  >^ [        U[        5      (       d  [        SU< 35      e[        UR                  5      [        T5      :w  a   [        SUR
                  [        T5      5      e[        TU ]!  U5        [        R                  " T[        R                  S9m[        U4S j[        UR
                  5       5       5      (       d  [        ST< S35      e[        R                  " T5      n[        R                  " UR
                  5      UT'   TU l        X0l        g )Nz'base_encoding must be an Encoding, got z:base_encoding has %d ndims - cannot transpose with perm %sr   c              3   ,   >#    U  H	  oT;   v   M     g 7fr)   r*   )r   r;  r   s     r   r  .TransposedEncoding.__init__.<locals>.<genexpr>?  s     A&@9&@s   zperm z is not a valid permutation)r   r   r   r   r   rb   r  r   r&   r   ra   r   r   rZ   
zeros_likearange_perm	_inv_perm)r$   base_encodingr   inv_permr   s     ` r   r&   TransposedEncoding.__init__3  s    -22F}FWXYY}""#s4y0L##D	  	'xxBHH-AeM,?,?&@AAAuTH,GHII==&=#6#67
!r   c                 r    [        U R                  U Vs/ s H  o R                  U   PM     sn5      $ s  snf r)   )r   r    r  )r$   r   ps      r   r   TransposedEncoding.transposeF  s+    4::t'Dt!

1t'DEE'Ds   4
c                     [        S5      eNzShould not be hereRuntimeErrorr   s     r   r   TransposedEncoding._transposeI      /00r   c                     U R                   $ r)   )r  r+   s    r   r   TransposedEncoding.permL  r   r   c                 n   ^ U R                   R                  m[        U4S jU R                   5       5      $ )Nc              3   .   >#    U  H
  nTU   v   M     g 7fr)   r*   )r   r$  r   s     r   r  +TransposedEncoding.shape.<locals>.<genexpr>S  s     2z!U1Xzs   )r    r   rY   r  r{   s    @r   r   TransposedEncoding.shapeP  s'    

  2tzz222r   c                 @    [         R                  " XR                  SS9$ r5  )r   taker  r@   s     r   r  #TransposedEncoding._to_base_indicesU  s    www

44r   c                     [         R                  " XR                  SS9$ ! [         a]    [         R                  " UR	                  [         R
                  5      U R                  R	                  [         R
                  5      SS9s $ f = fr5  )r   r3  r  	TypeErrorastyper   r  s     r   r  %TransposedEncoding._from_base_indicesX  sf    	77<bAA 	77##BHH-t~~/D/DRXX/NUW 	s   ! A$BBc                 `    U R                   R                  R                  U R                  5      $ r)   )r    r=   r   r  r+   s    r   r=   TransposedEncoding.densea  s!    zz))$**55r   c                 V    U R                   R                  U R                  U5      5      $ r)   )r    r   _base_indicesr@   s     r   r   TransposedEncoding.gathere  s"    zz  !3!3G!<==r   c                     U R                   R                  UR                  U R                  5      5      R                  U R                  5      $ r)   )r    rG   r   r  r  rF   s     r   rG   TransposedEncoding.maskh  s1    zzt~~dnn=>HHTTr   c                 P    U R                   [        U R                  U5      5         $ r)   )r    rY   r<  rJ   s     r   rL   TransposedEncoding.get_valuek  s!    zz% 2 25 9:;;r   c                     U R                   $ r)   r   r+   s    r   r%   TransposedEncoding.datan  r   r   c                 Z    [        U R                  R                  5       U R                  S9$ )N)r   r   )r   r    rO   r  r+   s    r   rO   TransposedEncoding.copyr  s    !

0A

SSr   )r  r  )r   r   r   r   r   r&   r   r   r   r   r   r  r  r=   r   rG   rL   r%   rO   r   r   r   s   @r   r   r   ,  s    "&F1   3 35 6 6>U<  T Tr   r   c                   t   ^  \ rS rSrSrU 4S jrS rS r\S 5       r	\S 5       r
S rS	 rSS
 jrS rSrU =r$ )rk   iv  zV
Encoding with entries flipped along one or more axes.

Dense equivalent is `np.flip`
c                 r  >^ ^ UR                   m[        U[        R                  5      (       a"  UR                  S:X  a  UR                  5       4nO[        U[        5      (       a  U4n[        U4S jU 5       5      n[        [        U5      5      T l	        [        [        T R                  5      5      [        T R                  5      :w  a  [        ST R                  < 35      e[        TT ]9  U5        [        U 4S jU 5       5      (       d*  [        S[!        U5      T R"                  R                   5      eg )Nr   c              3   <   >#    U  H  oS :  a  UT-   OUv   M     g7fr   Nr*   r   r   rb   s     r   r  +FlippedEncoding.__init__.<locals>.<genexpr>  s     =1a%QYQ.   z$Axes cannot contain duplicates, got c              3   v   >#    U  H.  nS Us=:*  =(       a    TR                   R                  :  Os  v   M0     g7frI  )r    rb   )r   r   r$   s     r   r  rK    s+     ;d1,,DJJ,,,,ds   69z!Invalid axes %s for %d-d encoding)rb   r   r   r   r4   itemr   rY   sorted_axesr   setr   r   r&   r   r  r    )r$   r   rm   rb   r   s   `  @r   r&   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                     UR                  5       nU R                  nU R                   H%  nUS S 2U4==   S-  ss'   US S 2U4==   U-  ss'   M'     U$ r  )rO   r   rP  )r$   rA   r   r   s       r   r   FlippedEncoding._to_base_indices  sO    ,,.

AAqDMRMAqDMU"M  r   c                 $    U R                  U5      $ r)   )r  r  s     r   r  "FlippedEncoding._from_base_indices  s    $$\22r   c                 .    U R                   R                  $ r)   r   r+   s    r   r   FlippedEncoding.shape  r   r   c                     U R                   R                  nU R                   H  n[        R                  " X5      nM     U$ r)   )r    r=   rP  r   r   )r$   r=   r   s      r   r=   FlippedEncoding.dense  s2    

  AGGE%E r   c                     [        U[        5      (       d  [        U5      nUR                  U R                  5      nU R
                  R                  U5      R                  U R                  5      $ r)   )r   r   r   r   rP  r    rG   rF   s     r   rG   FlippedEncoding.mask  sM    $)) &Dyy$zzt$))$**55r   c                 ^    [        U R                  R                  5       U R                  5      $ r)   )rk   r    rO   rP  r+   s    r   rO   FlippedEncoding.copy  s    tzz0$**==r   c                    [        U[        R                  5      (       a.  UR                  S:X  a  UR	                  5       4nO0[        U5      nO$[        U[        5      (       a  U4nO[        U5      n[        X R                  W-   5      $ rx   )	r   r   r   r4   rN  rY   r   r   rP  )r$   rW   rm   s      r   r   FlippedEncoding.flip  se    dBJJ''yyA~		~T{c""7D;Djj4/00r   c                     [        S5      er'  r(  rl   s     r   rn   FlippedEncoding._flip  r+  r   )rP  r   )r   r   r   r   r   r&   r  r  r   r   r=   rG   rO   r   rn   r   r   r   s   @r   rk   rk   v  sX     3      6>
11 1r   rk   c                 N  ^ [        US5      (       d  U4n[        5       nU R                  m[        U4S jU 5       5      nU H,  nX2;   a  UR	                  U5        M  UR                  U5        M.     [        U5      S:X  a  U $ U R                  [        [        U5      5      5      $ )N__iter__c              3   <   >#    U  H  oS :  a  UT-   OUv   M     g7frI  r*   rJ  s     r   r  _flipped.<locals>.<genexpr>       9Dq!eU*DrL  r   )	hasattrrQ  rb   rY   removeaddr   rn   rO  )r   rm   	unique_axr   rb   s       @r   r   r     s    4$$wINNE9D99D>QMM!	 
 9~~~eF9$5677r   c                    ^ U R                   m[        U4S jU 5       5      n[        R                  " [        R                  " T5      U:H  5      (       a  U $ U R                  U5      $ )Nc              3   <   >#    U  H  oS :  a  UT-   OUv   M     g7frI  r*   )r   r$  rb   s     r   r  _transposed.<locals>.<genexpr>  rg  rL  )rb   rY   r   r   r  r   )r   r   rb   s     @r   r   r     sO    NNE9D99D	vvbii$&''""4((r   r)   )r   r   numpyr    r   utilr   r   scipyr   r%  BaseExceptionE
exceptionsr	   r   r   r   r   rI  rK  r  r  r   rz   r   rk   r   r   r*   r   r   <module>rv     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?'B::B?