
    3j_J                       S SK Jr  S SKJrJr  S SKJrJr  S SKrSSK	J
r
Jr  SSKJr  \(       a  SSKJr  SS	 jr\ " S
 S5      5       rSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jr            SS jrg)    )annotations)	dataclassfield)AnyTYPE_CHECKINGN   )_match_levelsDimEntry)
TensorInfoDimc                    [        U 5       HB  u  p#[        U[        5      (       a   [        U[        5      (       a  X1:X  a  Us  $ M:  X1L d  M@  Us  $    g)z
Helper function to find index of item in list.

For DimEntry objects, uses __eq__ comparison which properly handles
both positional and Dim entries.

Returns the index if found, None if not found.
N)	enumerate
isinstancer
   )lstitemi	list_items       S/home/wildlama/miniconda3/lib/python3.13/site-packages/functorch/dim/_getsetitem.py_safe_indexr      sM     "#dH%%*Y*I*I  !H '     c                  z    \ rS rSr% SrS\S'   SrS\S'   SrS\S'   \" \	S	9r
S
\S'   \" \	S	9rS\S'   SrS\S'   Srg)IndexingInfo#   Fboolcan_call_originaladvanced_indexingNztorch.Tensor | Noneself_tensor)default_factoryz	list[Any]flat_inputslist[DimEntry]result_levels
has_device )__name__
__module____qualname____firstlineno__r   __annotations__r   r   r   listr    r"   r#   __static_attributes__r$   r   r   r   r   #   sK    #t##t#'+K$+"48K8$)$$?M>?Jr   r   c                f    SSK JnJn  UR                  " U 5      =(       d    UR                  U 5      $ )z
Check if an object has first-class dimensions.

This function checks if the object is either a Dim or a functorch Tensor
that has first-class dimensions, using the proper check_exact methods.
r   )r   Tensor) r   r-   check_exact)objr   r-   s      r   has_dimsr1   -   s&     ??3:6#5#5c#::r   c           	        SSK Jn  Sn[        U5       H  u  pxUR                  (       d  [	        US-   [        U5      5       H9  n	X)   R                  (       d  U" SU< SX)   < 35      eXbU	   R                  -  nM;     X-  S:w  a   [        S U 5       5      n
U" SU  SU
 35      eX-  nXl        U n  OXhR                  -  nM     X`:w  a  [        U5      n
U" S	U  S
U SU
 35      eS/[        U5      -  nUn[        [	        [        U5      5      5       H  nXU'   XU   R                  -  nM     [	        [        U5      5       H3  nUR                  X'   R                  5        UR                  X   5        M5     g)zE
Bind dimensions to size and calculate proper strides for dim packs.
r   DimensionBindErrorz1cannot infer the sizes of two dimensions at once  and r   c              3  ^   #    U  H#  oR                   (       a  UR                  OS v   M%     g7f)?N)is_boundsize).0dims     r   	<genexpr>%_bind_dims_to_size.<locals>.<genexpr>L   s     N#CHH#=s   +-z>inferred dimension does not evenly fit into larger dimension: z vs z!Dimension sizes to do not match (z != z) when matching dimension pack N)
r.   r4   r   r8   rangelenr9   tuplereversedappend)szsddimsnsznsdr4   rhs_prodr   r;   jtupinferred_sizenew_stridescurrent_strides                 r   _bind_dims_to_sizerN   9   s    %HD/||1q5#d),w'',KC7RWX\X_Wbc  GLL( - }!NNN(TUWTXX\]`\ab  NM$HH H- "2 ~Dk /t4zA`ad`ef
 	
 #D	/KNeCI&''Aq',,& (
 3t9

47<< 

;>" r   c                    [        U 5      $ N)r@   )r    s    r   slice_to_tuplerQ   m   s    r   c                   [        U [        5      (       a  UR                  U 5        g[        U [        R                  5      (       a  UR                  U 5        g[        U S5      (       a  [        U [        [        45      (       a  UR                  U 5        g[        U [        5      (       a  [        U 5      S:  a  UR                  U 5        gU  Hd  n[        U[        R                  [        45      (       d+  [        US5      (       d  USL d  Ub  [        U5      (       d  MS  UR                  U 5          g   UR                  U 5        gUR                  U 5        g)NTF__iter__    .)r   r@   extendtorchr-   rB   hasattrstrbytesr*   r?   slicer1   )indexindicesr   s      r   extractIndicesr]   q   s   %u	E5<<	(	(uUJ'':U|, , 	u %u:NN5! D4%,,!6774,,3;<D>>u%  	u NN5r   c                    US   nUS   n[        XV[        U5      5      nUR                  (       a  [        R                  R                  XV5      $ [        U5      $ Nr   r   )
getsetitemr1   r   rV   r-   __getitem__invoke_getitem)clsfunctypesargskwargsselfr[   iinfos           r   getitemrj      sM    7DGEtHTN3E||''44%  r   c           	        SSK JnJn  [        X[	        U 5      =(       d    [	        U5      5      nUR
                  (       a+  [        R                  R                  R                  XU5        gUR                  " USS5      nU(       GaY  UR                   GH  nUR                  5       (       a  M  SnUR                   H?  n	U	R                  5       (       a  M  U	R                  5       UR                  5       L d  M=  Sn  O   U(       a  Mu  / n
UR                   HX  nUR                  5       (       a!  U
R                  UR!                  5       5        M9  U
R                  UR                  5       5        MZ     U" SUR                  5       < S[#        U
5      < S35      e   UR$                  c  ['        S	5      e[)        UR$                  UR                  UR                  5      nOUnUR*                  (       ab  [-        UR.                  5      nUR0                  c  [3        S
5      e[        R                  R                  R                  UR0                  X5        gUR0                  c  [3        S5      eUR0                  R5                  U5        g)z2Set values in tensor using first-class dimensions.r   )r4   r   NFTz"rhs of setitem contains dimension z, which is not in the dimension on the left ()z"Cannot match levels on None tensorzCannot setitem on None tensorzCannot copy to None tensor)r.   r4   r   r`   r1   r   rV   _C
TensorBase__setitem__createlevelsis_positionalr"   r;   rB   positionr@   tensorAssertionErrorr	   r   rQ   r    r   RuntimeErrorcopy_)rh   r[   rhsr4   r   ri   rhs_infolfoundresult_levelresult_dimsrlmatched_rhsrJ   s                 r   setitemr      s   0tHTN$ChsmDE''S9   eU3HA??$$$)$7$7L(6688(,,.!%%'9 $ %8 u35K#11++--'..r{{}='..rvvx8	 2 -<QUUWK H!+.14 + !6 ??" !EFF#OOX__e.A.A
  U../$>??''(9(93L $;<<,r   c                   U R                   (       a4  U R                  n[        U R                  5      nUc  [	        S5      eX   nOU R                  nUc  [	        S5      eSSKJn  UR                  X0R                  U R                  5      $ )NzCannot getitem on None tensorr   )r-   )
r   r   rQ   r    rv   r.   r-   from_positionalr"   r#   )ri   r   rJ   rtensorr-   s        r   rb   rb      s    ''U../>??"##?>?? !!'+>+>@P@PQQr   c                @  ^ SSK Jn  U(       + n/ n[        U5      (       a  UR                  U5        O"[	        X5      nU(       a  U(       d	  [        SS9$ SnSmS n/ n	SU4S jjn
SS jnS	n[        U5       H  u  p[        U5      (       a	  S	nUS-  nM  US
L a
  U
" U5        M-  [        X5      (       aI  S	nUR                  (       d  U
" U5        UnOU[        UR                  5      -  nU	R                  U5        M  Uc  SnM  U" U5      (       a  S	nSnUS-  nM  US-  nM     U(       a	  [        SS9$ [        R                  " U S	S5      n[        UR                  5      nUU:  a  [        SU SU S35      eUU-
  nTS:w  a5  Ub  UR                  U5        O [!        S 5      /U-  nUS T U-   UTS-   S  -   n[#        [        U	5      S-
  SS5       H;  nX   nUc  TS:w  a  UT:  a  UU-  nUU   nUS U UR                  -   UUS-   S  -   nM=     [%        X/ / U5      $ )Nr   )DimListT)r   r   c                >   > TS:w  a  SSK Jn  U" ST SU  35      eU mg )Nr   r   r3   z\at most one ... or unbound dimension list can exist in indexing list but found 2 at offsets r5   )r.   r4   )r   r4   expanding_objects     r   check_expanding#getsetitem.<locals>.check_expanding  s7    r!,$n#$E!.  r   c                   ^ SSK Jm  [        U [        [        45      =(       a*    [        U 5      S:  =(       a    [        U4S jU  5       5      $ )Nr   r   r   c              3  H   >#    U  H  nTR                   " U5      v   M     g 7frP   r/   )r:   r   r   s     r   r<   1getsetitem.<locals>.is_dimpack.<locals>.<genexpr>  s     8adCOOD))a   ")r.   r   r   r@   r*   r?   all)sr   s    @r   
is_dimpackgetsetitem.<locals>.is_dimpack  s>     q5$-( 9A
98a88	
r   F.z	at least z/ indices were supplied but the tensor only has z dimensionsr   intreturnNone)r   r   r   r   )r.   r   r1   rB   r]   r   r   r   r8   r?   _dimsr   rp   rq   
ValueErrorbind_lenrZ   r>   getsetitem_flat)rh   r[   tensors_have_dimsr   can_call_original_getitem
input_listis_sequencedims_indexedunbound_dim_listdimlistsr   r   has_dimpacks_or_noner   r   	self_info
total_dimsexpanding_dims	no_slicesidxdlr   s                        @r   r`   r`      st   $5 5J% $U7$[$77 LH	
 !*%A;;(-%AL#XA##(-%::"#$ AGG,OOAY#' ]](-%#' ALAL+ &0 !d33!!$t4IY%%&Jj ~%TU_T``kl
 	

  ,.N2'%%n5 t6I,,--1345  3x=1$b"-k $ B&&&>!C_  %0:cAgi3HH
! .$ 9"b:NOOr   c                	  ^^^^^^^^^^^^^^ ^!^"^#^$ SSK Jm  / m / m!SU U!4S jjm/ m/ m#S mSUU#4S jjmSUUU#4S jjm/ m/ mU R                  c  [        S5      eU R                  R	                  5       m"U R                  R                  5       mSUUUUU"4S jjmUS S  mSUUUU4S jjnSUUUUUUUUUU"4
S	 jjn[        U R                  5       H  u  px[        X(5      n	U	b  U" XsU	   5        M   UR                  5       (       a=  U" 5         T(       d  T" [        S 5      5        T" U5        M^  TS
   n
TSS  mU" Xz5        Mr  T" UR                  5       5        T" UR                  5       5        T" U5        M     U" 5         T(       aU  T(       aN  U R                  c  [        S5      eU R                  R                  TTU R                  R                  5       5      nOU R                  n/ m/ nSm$SnSUU$4S jjn[        T5       GHU  u  pT#U   b9  SnU" 5         T#U   R                   H  nX;  d  M
  UR                  U5        M     ME  TR                  " U5      (       a  Un[        T U5      nUc  [!        SU S35      eT!U   S:X  a*  [        S 5      TU'   TR                  [#        U5      5        M  SnS TU'   [%        UR'                  5       [#        U5      /SS 5      T#U'   [#        U5      U;  a  UR                  [#        U5      5        U" 5         GM  U[        S 5      :w  a  Sn[)        U[*        5      (       a  GM;  TR                  [#        S5      5        GMX     T$S:w  a$  [-        U5       H  nTR/                  T$U5        M     U(       a  [1        [3        T5      5       Hw  nT#U   c  M  T#U   R                  nUc  [!        S5      eT#U   R4                  (       d  Tb  UR7                  TR8                  5      n[;        UT#U   R                  U5      TU'   My     S
n[-        [1        [3        T5      5      5       H1  nTU   R                  5       (       d  M  US-  n[#        U* 5      TU'   M3     [=        SUUTTU R4                  S9$ )Nr   r   c                   > [        TU 5      nUb  TU==   S-  ss'   g TR                  U 5        TR                  S5        g )Nr   )r   rB   )r;   r   	seen_dimsseen_dims_nusess     r   add_dim getsetitem_flat.<locals>.add_dimx  s@    )S)?C A% S!""1%r   c                J   > TR                  U 5        TR                  S 5        g rP   rB   )handler    tensor_inputss    r   append_flat_handle+getsetitem_flat.<locals>.append_flat_handle  s    6"T"r   c                   > TR                  S 5        TR                  U 5        U R                  (       a  Tc  U R                  mg g g rP   )rB   r#   rt   )tidevice_holding_tensorr    r   s    r   append_tensor_input,getsetitem_flat.<locals>.append_tensor_input  s=    4 R ==2:$&II! ;=r   z%Cannot get size/stride on None tensorc                f   > T(       a)  TR                  TU    5        TR                  TU    5        g g rP   r   )r   r   rG   rF   rD   rC   s    r   append_size$getsetitem_flat.<locals>.append_size  s+    JJr!uJJr!u  r   c                    > T(       aP  TS   cI  T " [        S 5      5        TR                  S5        TR                  S5        TSS  mT(       a	  TS   c  MG  g g g g r_   )rZ   rB   )r   input_itrG   rF   s   r   parse_nones$getsetitem_flat.<locals>.parse_nones  sQ    8A;.uT{+JJqMJJqM|H	 8A;.h.hr   c                  >
 TR                   " U5      (       a5  UnUR                  S:X  a
  TU    Ul        T" U5        T	" U 5        T" U5        g [        R                  " USS5      nU(       aQ  T	" U 5        T
" U5        UR
                   H0  nUR                  5       (       a  M  T" UR                  5       5        M2     g T(       ao  [        U[        [        45      (       aT  [        U4S jU 5       5      (       a:  [        U5      nU H  nT" U5        T" U5        M     [        TU    TU    UTT5        g T	" U 5        T" U5        g )Nr   Fc              3  H   >#    U  H  nTR                   " U5      v   M     g 7frP   r   )r:   dr   s     r   r<   7getsetitem_flat.<locals>.append_item.<locals>.<genexpr>  s     5VRUQcooa6H6HRUr   )r/   _sizer9   r   rp   rq   rr   r;   r   r@   r*   r   rN   )r   argr   infoleveldim_packr   r   r   r   r   r   rG   rF   rD   rC   s         r   append_item$getsetitem_flat.<locals>.append_item  s   ??3Aww"}AAJNs#  eU3N%**,,EIIK( % #t}--#5VRU5V2V2V9!AAJ&q) " #2a5"Q%3DA3r   r   zCannot restride None tensorr   Fc                 N   > TS:X  a  [        T 5      mg T[        T 5      :w  a  Smg g )Nr   r   )r?   )r"   tensor_insert_points   r   mark_tensor_index*getsetitem_flat.<locals>.mark_tensor_index  s.    "$"%m"4 C$66"# 7r   TzDim z not found in seen_dimsz(TensorInfo should have valid tensor data)r   r   r   r    r"   r#   )r;   r   r   r   )r   r   r   r   )r   r   r   r   r   )r   r   )r   r   r   r   r   r   )r.   r   rt   rv   r9   strider   rq   r   rr   rZ   r;   
as_stridedstorage_offsetrB   r/   ru   r
   r   
_get_ranger   r   rA   insertr>   r?   r#   todevicer	   r   )%r   r   keysvaluesr   r   r   r   r   r   r   r   index_levelsrequires_getindexr   inpr   dim_idxtseen_positionalsr   r   r   r   r   r   r    r   rG   rF   r"   rD   r   r   rC   r   r   s%       `               @@@@@@@@@@@@@@@@@r   r   r   k  sT     I!#O& & K!M # #. . C
CBCC						 B				 	 	"B 
 !}H$ $     B i../$&?#;'""$$&uT{3N"1+C'|H'		$"599;/A% 0( M #<==&&11i&&557
  &&  "ML$ $ K(' $&q)00, ''. 1 __S!!A!)Q/G$tA3.E%FGGw'1,!&tA$$Xa[1$(!!%A#-LLNXa[M5$$a  A;l2 ''4!#eDk!$(!c3''$$Xb\2; )@ b l+E  !4e< , s;'(AQ+!!$++9()STT%a(33-9299:A!.q-2B2I2I<!XA ) eC./0))++!')9(9:M! 1
 +#'' r   )r   r*   r   r   r   z
int | None)r0   r   r   r   )rC   r   rD   r   rE   r*   rF   r*   rG   r*   r   r   )r    r*   r   r@   )r[   r   r\   r*   r   r   )rc   r   rd   r   re   r   rf   r   rg   r   r   r   )rh   r   r[   r   rx   r   r   r   )ri   r   r   r   )rh   r   r[   r   r   r   r   r   )r   r   r   r*   r   r!   r   r*   r   r   r   r   )
__future__r   dataclassesr   r   typingr   r   rV   
_dim_entryr	   r
   _tensor_infor   r.   r   r   r   r1   rN   rQ   r]   rj   r   rb   r`   r   r$   r   r   <module>r      s    " ( %  / $ &   	;1#h%P	!>-BR&oPdIII I 	I
 I Ir   