
    Vpf#                    X   d Z ddlmZ ddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZ ddlZe	j        ej         G d
 d                                  Z	 	 dddZeZeeef         Zeeef         ZddZddZe	j        ej         G d d                                  ZdS ) z?Contains shared logic and abstractions for Pallas indexing ops.    )annotationsN)AnyUnion)core)	tree_util)Array)merge_lists)partition_listc                      e Zd ZU dZded<   ded<   dZded<   d Zed	             Zed
             Z	d Z
edd            Zedd            ZdS )SlicezA slice with a start index and a size.

  Both start index and size can either be static, i.e. known at tracing
  and compilation time, or dynamic.
  zint | Arraystartsize   intstridec                :    | j         dk     rt          d          d S )Nr   z`stride` must be >= 1.)r   
ValueErrorselfs    W/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/_src/state/indexing.py__post_init__zSlice.__post_init__+   s#    {Q/000     c                8    t          | j        t                     S N)
isinstancer   r   r   s    r   is_dynamic_startzSlice.is_dynamic_start/   s    $*c****r   c                8    t          | j        t                     S r   )r   r   r   r   s    r   is_dynamic_sizezSlice.is_dynamic_size3   s    $)S))))r   c                    d}d}|| j         r| j        fndz  }|| j         rdn| j        fz  }|| j        r| j        fndz  }|| j        rdn| j        fz  }|| j        fz  }||fS )N r   )r   r   r   r   r   )r   xsdatas      r   tree_flattenzSlice.tree_flatten7   s    	BD40
=4:--g=Bt,?GG4:-?D$.
;49,,G;Bt+=GG$)=DT[NDt8Or   returnc                r    d t          ||d d                   D             \  }} | |||d                   S )Nc              3  (   K   | ]\  }}||n|V  d S r   r    ).0abs      r   	<genexpr>z'Slice.tree_unflatten.<locals>.<genexpr>D   s?        &*aQ]     r      )zip)clsaux_datachildrenr   r   s        r   tree_unflattenzSlice.tree_unflattenB   sP     .1(HRaRL.I.I  KE4 3udHQK(((r   slcslicec                    |                     |          \  }}}|dk     rt          d| d           | |t          ||z
  |z   dz
  |z  d          |          S )Nr   z$slice must have a step >= 1 (found: )r   )indicesr   max)r-   r1   r   r   stopsteps         r   
from_slicezSlice.from_sliceI   sn    D))E4axxEdEEEFFF3uc4%<$.2t;Q??FFFr   N)r$   r   )r1   r2   r   r   r$   r   )__name__
__module____qualname____doc____annotations__r   r   propertyr   r   r#   classmethodr0   r9   r    r   r   r   r      s           &////1 1 1 + + 8+ * * 8*	 	 	 ) ) ) ;) G G G ;G G Gr   r   r   int | Array | Noner   r   
int | Noner$   slice | Slicec                   | t          d          S |d}t          |t                    st          d          |5t          | t                    st          d          t	          d| |          S t	          | ||          S )a  Constructs a ``Slice`` from a start index and a size.

  The semantics of ``dslice`` mirror those of the builtin ``slice`` type:

  * ``dslice(None)`` is ``:``
  * ``dslice(j)`` is ``:j``
  * ``dslice(i, j)`` is ``i:i+j``
  * ``dslice(i, j, stride)`` is ``i:i+j:stride``
  Nr   zNon-static stride in `dslice`zNon-static `dslice`r   )r2   r   r   r   r   )r   r   r   s      r   dslicerE   Q   s     ];;^F	FC	 	  6
4
5
55	\eS!! .,---E6"""	udF	#	##r   indexer	NDIndexerBtuple[tuple[bool, ...], tuple[Slice, ...], tuple[IntIndexer, ...]]c                    d | j         D             }t          || j                   \  }}t          |          t          |          t          |          fS )Nc                :    g | ]}t          |t                     S r    r   r   r'   is     r   
<listcomp>z$unpack_ndindexer.<locals>.<listcomp>u   s%    GGG!Au---GGGr   )r5   r
   tuple)rF   is_int_indexingslice_indexersint_indexerss       r   unpack_ndindexerrS   r   sZ     HGwGGG/!/w"( "(.,			~!6!6l8K8K	KKr   xr   c                    t          | t          j                  r-t          | j        t          j                  r| j        j        S d S | S r   )r   r   TraceravalConcreteArrayval)rT   s    r   _maybe_concretizerZ   z   sC     4; !&$,-- VZT	
(r   c                      e Zd ZU ded<   ded<   ded<   dZded<   d	 Zed
             Zd Ze	d             Z
e	dd            ZddZdS )rG   ztuple[DimIndexer, ...]r5   ztuple[int, ...]shapeint_indexer_shapeFboolvalidatec                   | j         sd S t          | j                  t          | j                  k    rt	          d|  d          t          | j        | j                  D ]\  }}t          |t                    r|j        }t          |          x}rg||k    rt	          d| d| d          t          |j
                  x}r5||dz
  |j        z  z   |k    r!t	          d| d| d|j         d| d	          t          j        |          s.t          |          x}r||k    rt	          d| d| d          t          j        |          t          | j                  k    r/t	          d	t          j        |           d
|d| j                  	 t          j        t          j        |          | j                   e# t          $ r }t	          d|d| j                  |d }~ww xY wd S )Nz3`indices` must be the same length as `Ref` shape.: .zOut of bound slice: start=z, dim=r   z, size=z	, stride=zOut of bound indexer: idx=zIndexer must have rank z: idx=z vs. self.int_indexer_shape=z)Could not broadcast integer indexer: idx=)r_   lenr5   r\   r   r,   r   r   r   rZ   r   r   npndimr]   broadcast_shapes)r   idxsr   valuer   es          r   r   zNDIndexer.__post_init__   s   = f
4<C
OO++
G
G
G
G   dlDJ// " "Q	C		 	%e,,,5 	aZZK%KKqKKKLLL&sx000T qCJ..!334u 4 4T 4 4 Z4 4/04 4 4   	 Xc]] &s+++E 	K!IIIQIIIJJ
J 
T344	4	4*bgcll * *c * *&* *
 
 	


BHSMM4+ABBBB   *C * *&* *
 
 	=" "s   ,G
G0G++G0c                >    t          d | j        D                       S )Nc              3  N   K   | ] }t          |t                    o|j        V  !d S r   )r   r   r   rL   s     r   r*   z,NDIndexer.is_dynamic_size.<locals>.<genexpr>   s4      PPaz!U##9(9PPPPPPr   )anyr5   r   s    r   r   zNDIndexer.is_dynamic_size   s!    PP4<PPPPPPr   c                \    t          j        | j                  \  }}||| j        | j        ffS r   )r   r#   r5   r\   r]   )r   flat_idxidx_trees      r   r#   zNDIndexer.tree_flatten   s0    "/==Hhh
D,BCCCr   c                l    |\  }}}t          j        ||          } | t          |          ||          S r   )r   r0   rO   )r-   r"   rn   ro   r\   r]   r5   s          r   r0   zNDIndexer.tree_unflatten   s<    )-&He&&x::G3uW~~u&7888r   r$   c                r  
 t          |t                    s|f}t          |          }t          d |D                       x}re|dk    rt	          d          |                    d          }t          d           gt          |          t          |          z
  dz   z  |||dz   <   t          |          t          |          k    r$t          |          }t	          d|d|          t          |          t          |          k     rC|                    t          d           gt          |          t          |          z
  z             t          d t          ||          D                       }d |D             }t          |          rt          ||          \  }}t          d	 |D                       }	 t          j        | 
n%# t          $ r}	t	          d
|           |	d }	~	ww xY wddlm 
fd|D             }t          t!          |||                    }nd
 | ||
d          S )Nc              3     K   | ]}|d u V  	dS ).Nr    )r'   rf   s     r   r*   z/NDIndexer.from_indices_shape.<locals>.<genexpr>   s&      99#3#:999999r   r   zOnly one ellipsis is supported..z3`indices` must not be longer than `shape`: indices=z, shape=c              3     K   | ]9\  }}t          |t                    rt                              ||          n|V  :d S r   )r   r2   r   r9   )r'   rM   rg   s      r   r*   z/NDIndexer.from_indices_shape.<locals>.<genexpr>   s^       ) )Aq #-Q"6"6=AA) ) ) ) ) )r   c                :    g | ]}t          |t                     S r    rK   rL   s     r   rN   z0NDIndexer.from_indices_shape.<locals>.<listcomp>   s%    AAAA:a///AAAr   c              3  H   K   | ]}t          j        |          j        V  d S r   )r   get_avalr\   rL   s     r   r*   z/NDIndexer.from_indices_shape.<locals>.<genexpr>   s/      JJT]1--3JJJJJJr   z&Cannot broadcast shapes for indexing: r   )
primitivesc                <    g | ]}                     |          S r    )broadcast_to)r'   rM   r]   sps     r   rN   z0NDIndexer.from_indices_shape.<locals>.<listcomp>   s5       45"//!.
/
/  r   r    T)r_   )r   rO   listsumr   indexr2   rb   extendr,   rl   r
   rc   re   jax._src.staterw   r	   )r-   r5   r\   num_ellipsisiprP   other_indexersrR   indexer_shapesri   r]   rz   s             @@r   from_indices_shapezNDIndexer.from_indices_shape   s   gu%% 
g7mmG99999999| I			:;;;==b++#e**s7||*Ca*GHgbAg
7||c%jj  gg /!/ /&+/ / 0 0 0	WE

	"	"nneDkk]c%jj3w<<&?@AAA  ) )'') ) ) ) )G BAAAAO
? %3OW%M%M"nlJJ\JJJJJnN/@ N N NE^EEG GLM	NN 211111    9E  l k/><PPQQgg3w04@@@@s    G 
G1G,,G1tuple[int | Array, ...]c                X    t          |           \  }}}d |D             }g | j        |R S )Nc                    g | ]	}|j         
S r    )r   )r'   rg   s     r   rN   z/NDIndexer.get_indexer_shape.<locals>.<listcomp>   s    222a16222r   )rS   r]   )r   _rQ   slice_shapes       r   get_indexer_shapezNDIndexer.get_indexer_shape   sA    +D11A~q22>222K 3T#2k222r   N)r$   rG   )r$   r   )r:   r;   r<   r>   r_   r   r?   r   r#   r@   r0   r   r   r    r   r   rG   rG      s          "!!!$$$$(* * *X Q Q 8QD D D 9 9 ;9
 2A 2A 2A ;2Ah3 3 3 3 3 3r   )NN)r   rA   r   rA   r   rB   r$   rC   )rF   rG   r$   rH   )rT   r   )r=   
__future__r   dataclassestypingr   r   jax._srcr   r   jax._src.typingr   jax._src.utilr	   r
   numpyrc   register_pytree_node_class	dataclassr   rE   dsr   
IntIndexer
DimIndexerrS   rZ   rG   r    r   r   <module>r      s   F E " " " " " "                         ! ! ! ! ! ! % % % % % % ( ( ( ( ( (     %.G .G .G .G .G .G .G  &%.Gf  $$ $ $ $ $6  3:
:u$%
L L L L	 	 	 	 %{3 {3 {3 {3 {3 {3 {3  &%{3 {3 {3r   