
    ukii6                    p   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mZ ddlZej&                  ej(                   G d d                    Z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y)z?Contains shared logic and abstractions for Pallas indexing ops.    )annotationsN)AnyUnion)core)pretty_printer)	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y)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                8    | j                   dk  rt        d      y )Nr   z`stride` must be >= 0.)r   
ValueErrorselfs    R/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/state/indexing.py__post_init__zSlice.__post_init__,   s    {{Q/00     c                B    t        j                  | j                         S N)r   is_dimr   r   s    r   is_dynamic_startzSlice.is_dynamic_start0   s    {{4::&&&r   c                B    t        j                  | j                         S r   )r   r   r   r   s    r   is_dynamic_sizezSlice.is_dynamic_size4   s    {{499%%%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_flatten8   s    	BD4004::-g=Bt,,G4::-?D$..499,G;Bt++G$))=DT[[NDt8Or   c                N    d t        ||d d       D        \  }} | |||d         S )Nc              3  .   K   | ]  \  }}||n|  y wr   r!   ).0abs      r   	<genexpr>z'Slice.tree_unflatten.<locals>.<genexpr>E   s"      &*aQ]!s      )zip)clsaux_datachildrenr   r   s        r   tree_unflattenzSlice.tree_unflattenC   s7    .1(HRaL.IKE4 udHQK((r   c                r    t        j                  ||      \  }}}|dk  rt        d| d       | |||      S )Nr   z$slice must have a step >= 1 (found: ))r   canonicalize_slicer   )r-   slcr   r   steps        r   
from_slicezSlice.from_sliceJ   sF    //T:E4ax=dV1EFFudD!!r   N)returnr   )r4   slicer   r   r7   r   )__name__
__module____qualname____doc____annotations__r   r   propertyr   r   r$   classmethodr0   r6   r!   r   r   r   r      sx     
&#/1 ' ' & &	 ) ) " "r   r   c                   |j                   |j                  }}t        |t        j                        r[t        j
                  ||       }t        |t        j                        rt        j
                  ||       n
t        |      }| d| d| S t        |      }|dk(  rd}t        |t        j                        r't        j
                  ||       }|r
| d| d| S d| S ||z   }||k(  rdn
t        |      }| d| S )N:+r    )r   r   
isinstancer   Varpp_varstr)	contextdimr4   r   r   	start_strsize_strendend_strs	            r   	_pp_slicerN   R   s    		388%txx E7+I&0txx&@D'"c$i  [)AhZ00E
Izi$!T7+h	Ai[(448*~DLcSjc#hg{!G9%%r   c                    | t        d      S |d}t        |t              st        d      |(t        | 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   )r8   rD   r   r   r   )r   r   r   s      r   dslicerP   j   sl     ];^F	FC	 
4
55	\eS!,--E6""	udF	##r   	NDIndexerc                    | j                   D cg c]  }t        |t                }}t        || j                         \  }}t	        |      t	        |      t	        |      fS c c}w r   )indicesrD   r   r   tuple)indexeriis_int_indexingslice_indexersint_indexerss        r   unpack_ndindexerrZ      s_     8?G!Au--G/G!/w"(.,		~!6l8K	KK Hs   A"c                ,    t        j                  |       S r   )r   to_concrete_value)xs    r   _maybe_concretizer^      s     
			""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e	dd       ZddZddZd Zd ZddZy)rQ   ztuple[DimIndexer, ...]rS   tuple[int, ...]shapetuple[int | Array, ...]int_indexer_shapeFboolvalidatec                   t        | j                        t        | j                        k7  rt        d|  d      | j                  sy t        | j                  | j                        D ]p  \  }}t        |t              r|j                  }t        |      x}rh||k\  rt        d| d| d      t        |j                        x}r:||dz
  |j                  z  z   |k\  r"t        d| d| d|j                   d| d	      dd	lm} t        ||j                        r|j                  nt        j                   |      j                  }|s&t        |      x}r||k\  rt        d
| d| d      t        |      t        | j"                        k7  r't        dt        |       d|d| j"                        	 t%        j&                  || j"                         s y # t        $ r!}t        d|d| j"                        |d }~ww xY w)Nz3`indices` must be the same length as `Ref` shape.: .zOut of bound slice: start=z, dim=r   z, size=z	, stride=r   typesz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=)lenrS   ra   r   re   r,   rD   r   r   r^   r   r   jax._src.stateri   TransformedRefr   get_avalrc   npbroadcast_shapes)	r   idxsr   valuer   state_types	idx_shapees	            r   r   zNDIndexer.__post_init__   s,   
4<<C

O+?vQ
G  ==dllDJJ/ (Q	C			%e,,5,aZ9%qcKLL&sxx00T0qCJJ..!3.ugWTF C ZZLqc4  	 6 [778 ))}}S!'' 
 &s++E+!7wfQCqIJ
J 
Y3t556	6%c)n%5Wv >(&&(*
 	


It'='=>G(H  8C6 :(&&(*
 	s   9 G	H&HHc                :    t        d | j                  D              S )Nc              3  X   K   | ]"  }t        |t              xr |j                   $ y wr   )rD   r   r   r'   rV   s     r   r*   z,NDIndexer.is_dynamic_size.<locals>.<genexpr>   s%     Paz!U#9(9(99Ps   (*)anyrS   r   s    r   r   zNDIndexer.is_dynamic_size   s    P4<<PPPr   c                    t        j                  | j                        \  }}t        d | j                  D              sg || j                  || j
                  ffS ||| j
                  | j                  ffS )Nc              3  <   K   | ]  }t        |t                y wr   )rD   r   rx   s     r   r*   z)NDIndexer.tree_flatten.<locals>.<genexpr>   s     Baz!S!B   )r   r$   rS   allrc   ra   )r   flat_idxidx_trees      r   r$   zNDIndexer.tree_flatten   so    "//=HhB4+A+ABB0x0//08TZZ2HHH$**d.D.DEEEr   c                    t        |      dk(  r|\  }}}n
|\  }}|^ }}t        j                  ||      } | t        |      ||      S )N   )rj   r   r0   rT   )r-   r#   r~   r   ra   rc   rS   s          r   r0   zNDIndexer.tree_unflatten   sV    
4yA~+/(h( oh%-"x"&&x:GuW~u&788r   c                   t        |t              s|f}t        d |D              x}rd|dkD  rt        d      |j	                  d      }t        |      }t        d       gt        |      t        |      z
  dz   z  |||dz    t        |      }t        |      t        |      kD  rt        d|d|      t        |      t        |      k  r)g |t        d       gt        |      t        |      z
  z  }t        d t        ||      D              }|D cg c]  }t        |t               }}t        |      r | ||dd	
      S t        ||      \  }}d	}	ddlm}
 |D cg c]C  }t        ||
j                        s)t        t        j                   |      |
j"                        r|E c}x}rbt        |      dkD  rt%        d      t        |      t        |      k7  rt%        d      |\  }|j&                  }	 t        j(                  |       nz|D cg c]!  }t        j                   |      j&                  # }}	 t-        j.                  | }ddlm} |D cg c]  }|j3                  ||       }}t        t5        |||            } | ||||	      S c c}w c c}w # t*        $ r d}	Y "w xY wc c}w # t        $ r}t        d      |d }~ww xY wc c}w )Nc              3  $   K   | ]  }|d u  
 yw).Nr!   r'   rp   s     r   r*   z/NDIndexer.from_indices_shape.<locals>.<genexpr>   s     9#3#:9   r   zOnly one ellipsis is supported..z3`indices` must not be longer than `shape`: indices=z, shape=c              3  r   K   | ]/  \  }}t        |t              rt        j                  ||      n| 1 y wr   )rD   r8   r   r6   )r'   rV   rq   s      r   r*   z/NDIndexer.from_indices_shape.<locals>.<genexpr>  s7      )Aq #-Q"6AA=)s   57r!   T)re   r   rh   z'Multiple Ref indexers are not supportedz1Ref cannot be mixed with other non-slice indexersFz6Cannot broadcast shapes for indexing: {indexer_shapes})
primitives)rD   rT   sumr   indexlistr8   rj   r,   r   r}   r   rk   ri   rl   r   rm   AbstractRefNotImplementedErrorra   canonicalize_shape	TypeErrorrn   ro   r   broadcast_tor
   )r-   rS   ra   num_ellipsisiprV   is_slice_indexingother_indexersrX   re   rs   ref_indexersref_indexerindexer_shapeindexer_shapesru   sps                    r   from_indices_shapezNDIndexer.from_indices_shape   s   gu%
g9999|9		:;;==bWg+#e*s7|*Ca*GHgbAgg
7|c%j  #!9eX/ 0 0	WE
	"H'HU4[MSZ#g,-FGHg  )') )G 8??!Au-??
%d33%34Ew%O"NNH
 4  a334dmmA&(?(?@ 	
 |  
\	Q	!"KLL	\	c.1	1!?
 	
 #m{!''m. 9GG1a(..GnG++^< 25C01"//!]
+n  
'
H	g w}h77k @"   H  D
	sC   JAJ8J &J.;J3 KJ+*J+3	K<KKc                N    t         j                  t        d |D              |      S )Nc              3  4   K   | ]  }t        d |        yw)r   N)r8   )r'   ru   s     r   r*   z1NDIndexer.make_trivial_indexer.<locals>.<genexpr>?  s     )aeAqk)   )rQ   r   rT   )r-   ra   s     r   make_trivial_indexerzNDIndexer.make_trivial_indexer<  s&    '')5)) r   c           	     j   t        |       \  }}}t        d |D              }t        t        j                  t        j
                  t        j                  |      d         dk(              }|s| j                  |z   S t        |      }|r)|j                  d      }|d | | j                  z   ||d  z   S |S )Nc              3  4   K   | ]  }|j                     y wr   )r   )r'   rq   s     r   r*   z.NDIndexer.get_indexer_shape.<locals>.<genexpr>F  s     717r   r   r   T)
rZ   rT   rd   rn   r}   diffwhererc   ry   r   )r   rW   rX   _slice_shapeint_indexers_contiguoushas_int_indexersposs           r   get_indexer_shapezNDIndexer.get_indexer_shapeC  s    )9$)?&O^Q777K"
rwwrxx0349: ###k11?+!!$'c#!7!77+cd:KKKr   c                $    ~| j                         S r   )r   )r   ra   s     r   transform_shapezNDIndexer.transform_shapeT  s    !!##r   c                    |S r   r!   )r   dtypes     r   transform_dtypezNDIndexer.transform_dtypeX  s    Lr   c           	     p   t        d |j                  D              r|S | j                  st        d | j                  D              st	        d      t        |       \  }}}t        t        | j                  ||j                              D ]  \  }\  }}}|t        |j                        t        u rd|j                  dk(  rUt        |j                        t        u r:|j                  |k(  r+t        |j                        t        u r|j                  dk(  rt        d| j                   d| d|        |S )	Nc              3  $   K   | ]  }|d u  
 y wr   r!   )r'   ps     r   r*   z/NDIndexer.transform_sharding.<locals>.<genexpr>]  s     
,19
,r   c              3  <   K   | ]  }t        |t                y wr   )rD   r   r   s     r   r*   z/NDIndexer.transform_sharding.<locals>.<genexpr>b  s     ?3
3&?r|   zIsharded ref (array reference) can only be indexed by slices, not integersr   r   zXsharded ref (array reference) can only be sliced along unsharded axes, but ref of shape z was sliced on axis z, which is sharded like )r}   specrc   rS   r   rZ   	enumerater,   ra   typer   r   r   r   r   )r   shardingr   rX   rV   dslrq   s           r   transform_shardingzNDIndexer.transform_sharding[  s   

,hmm
,,o 	?$,,?? - . . ,D1A~q"3tzz>8==#QR O:Ar1	
H288n$Q277m$Q299o$a CCG::, O//0c1I!N O 	OO Or   c                   g }t        | j                  | j                        D ]Y  \  }}t        |t              r|j                  t        |||             3|j                  t        j                  ||d             [ t        j                  t        j                  d      t        j                  dj                  |            t        j                  d      g      S )NF)print_literal_dtype[,])r,   rS   ra   rD   r   appendrN   r   rF   ppconcattextjoin)r   rH   rS   rp   rI   s        r   pretty_printzNDIndexer.pretty_printr  s    Gdjj1 MS	C	y#s34t{{3UKL	M
 99bggclBGGCHHW,=$>MNNr   N)r7   rQ   )ra   r`   r7   rQ   )r7   rb   )ra   None | tuple[int | Array, ...]r7   r   )rH   core.JaxprPpContextr7   zpp.Doc)r9   r:   r;   r=   re   r   r>   r   r$   r?   r0   r   r   r   r   r   r   r   r!   r   r   rQ   rQ      s     "!	,,(D0d Q QF 9 9 N8 N8`  "$.Or   )rH   r   r4   r   r7   rG   )NN)r   int | Array | Noner   r   r   z
int | Noner7   zslice | Slice)rU   rQ   r7   zBtuple[tuple[bool, ...], tuple[Slice, ...], tuple[IntIndexer, ...]])r]   r   )r<   
__future__r   dataclassestypingr   r   jax._srcr   r   r   r   jax._src.typingr	   jax._src.utilr
   r   numpyrn   register_pytree_node_class	dataclassr   rN   rP   dsr   
IntIndexer
DimIndexerrZ   r^   rQ   r!   r   r   <module>r      s    F "    )  ! % (  %%." ."  &."b&4  $$$
$ $ 	$6  3:
:u$%
L# %%]O ]O  &]Or   