
    #Ki"J                       S SK Jr  S SKJrJr  S SKJrJr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OptionalTYPE_CHECKINGUnionN   )_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       [/var/www/html/dynamic-report/venv/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Optional[torch.Tensor]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_dimsr3   -   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)
r0   r6   r   r:   rangelenr;   tuplereversedappend)szsddimsnsznsdr6   rhs_prodr   r=   jtupinferred_sizenew_stridescurrent_strides                 r   _bind_dims_to_sizerP   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)rB   )r"   s    r   slice_to_tuplerS   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   rB   extendtorchr/   rD   hasattrstrbytesr,   rA   slicer3   )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
   )
getsetitemr3   r   rX   r/   __getitem__invoke_getitem)clsfunctypesargskwargsselfr]   iinfos           r   getitemrl      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aU  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R.                  c  [1        S
5      e[        R                  R                  R                  UR.                  X5        gUR.                  c  [1        S5      eUR.                  R3                  U5        g)z2Set values in tensor using first-class dimensions.r
   )r6   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)r0   r6   r   rb   r3   r   rX   _C
TensorBase__setitem__createlevelsis_positionalr$   r=   rD   positionrB   tensorr   r   rS   r"   r    RuntimeErrorcopy_)rj   r]   rhsr6   r   rk   rhs_infolfoundresult_levelresult_dimsrlmatched_rhsrL   s                 r   setitemr      s   0tHTN$ChsmDE''S9   eU3HA??$$$)$7$7L(6688(,,.!%%'9 $ %8 u9;K#11++--'..r{{}='..rvvx8	 2 -<QUUWK H!+.14 + !6 *P,PP*#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    rS   r"   rw   r0   r/   from_positionalr$   r%   )rk   r    rL   rtensorr/   s        r   rd   rd      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
   r5   z\at most one ... or unbound dimension list can exist in indexing list but found 2 at offsets r7   )r0   r6   )r   r6   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rR   r1   )r<   r   r   s     r   r>   1getsetitem.<locals>.is_dimpack.<locals>.<genexpr>  s     8adCOOD))a   ")r0   r   r   rB   r,   rA   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   )r0   r   r3   rD   r_   r   r   r   r:   rA   _dimsr   rr   rs   
ValueErrorbind_lenr\   r@   getsetitem_flat)rj   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   rb   rb      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HQ  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M7  TR                  [!        S5      5        GMT     T$S:w  a$  [+        U5       H  nTR-                  T$U5        M     U(       a  [/        [1        T5      5       Hs  nT#U   c  M  T#U   R                  nUc   S5       eT#U   R2                  (       d  Tb  UR5                  TR6                  5      n[9        UT#U   R                  U5      TU'   Mu     S
n[+        [/        [1        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 R2                  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   rD   )r=   r   	seen_dimsseen_dims_nusess     r   add_dim getsetitem_flat.<locals>.add_dimw  s@    )S)?C A% S!""1%r   c                J   > TR                  U 5        TR                  S 5        g rR   rD   )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 rR   )rD   r%   rv   )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 rR   r   )r   r   rI   rH   rF   rE   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 ra   )r\   rD   )r   input_itrI   rH   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rR   r   )r<   dr   s     r   r>   7getsetitem_flat.<locals>.append_item.<locals>.<genexpr>  s     5VRUQcooa6H6HRUr   )r1   _sizer;   r   rr   rs   rt   r=   r   rB   r,   r   rP   )r   argr   infoleveldim_packr   r   r   r   r   r   rI   rH   rF   rE   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   )rA   )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   )r0   r   rv   rw   r;   strider   rs   r   rt   r\   r=   
as_stridedstorage_offsetrD   r1   r   r   
_get_ranger   r   rC   insertr@   rA   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   rI   rH   r$   rF   r   r   rE   r   r   s%       `               @@@@@@@@@@@@@@@@@r   r   r   j  sS     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&I$qc1H(II&w'1,!&tA$$Xa[1$(!!%A#-LLNXa[M5$$a  A;l2 ''4!#eDk!$(!c3''$$Xb\29 )> b l+E  !4e< , s;'(AQ+!!$++}P&PP}%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Optional[int])r2   r   r   r   )rE   r   rF   r   rG   r,   rH   r,   rI   r,   r   r   )r"   r,   r   rB   )r]   r   r^   r,   r   r   )re   r   rf   r   rg   r   rh   r   ri   r   r   r   )rj   r   r]   r   ry   r   r   r   )rk   r   r   r   )rj   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   r   r	   rX   
_dim_entryr   r   _tensor_infor   r0   r   r   r   r3   rP   rS   r_   rl   r   rd   rb   r   r&   r   r   <module>r      s    " ( 6 6  / $ &   	;1#h%P	!=-@R&oPdGGG G 	G
 G Gr   