
    @ܶi"J                        d dl mZ d dlmZmZ d dlmZmZmZm	Z	 d dl
Z
ddlmZmZ ddlmZ erddlmZ d8dZe G d d                      Zd9dZd:dZd;dZd<d"Zd=d(Zd>d+Zd?d-Zd@d/ZdAd7ZdS )B    )annotations)	dataclassfield)AnyOptionalTYPE_CHECKINGUnionN   )_match_levelsDimEntry)
TensorInfoDimlstlistitemr   returnOptional[int]c                    t          |           D ]B\  }}t          |t                    r t          |t                    r||k    r|c S :||u r|c S CdS )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   )r   r   i	list_items       ^/root/projects/openclaw-proxy/venv/lib64/python3.11/site-packages/functorch/dim/_getsetitem.py_safe_indexr      sw     "#  9dH%% 	*Y*I*I 	D   !$HHH 4    c                      e Zd ZU dZded<   dZded<   dZded<    ee          Z	d	ed
<    ee          Z
ded<   dZded<   dS )IndexingInfoF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__r    __annotations__r!   r"   r   r   r$   r&   r'    r   r   r   r   #   s         ##########*.K...."U4888K8888$)E$$?$?$?M????Jr   r   objr   c                \    ddl m}m}  |j        |           p|                    |           S )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)r-   r   r/   s      r   has_dimsr2   -   sA     3?3:6#5#5c#:#::r   szintsddimsnsznsdNonec           	     H   ddl m} d}t          |          D ]\  }}|j        st	          |dz   t          |                    D ]6}	||	         j        s |d|d||	                   |||	         j        z  }7| |z  dk    r*t          d |D                       }
 |d|  d|
           | |z  }||_        | } n||j        z  }|| k    r#t          |          }
 |d	|  d
| d|
           dgt          |          z  }|}t          t	          t          |                              D ]}|||<   |||         j        z  }t	          t          |                    D ]=}|	                    ||         j                   |	                    ||                    >dS )zM
    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  6   K   | ]}|j         r|j        nd V  dS )?N)is_boundsize).0dims     r   	<genexpr>z%_bind_dims_to_size.<locals>.<genexpr>L   s/      NN#=CHH#NNNNNNr   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   r<   r   r@   rangelenrA   tuplereversedappend)r3   r5   r6   r7   r8   r<   rhs_prodr   rC   jtupinferred_sizenew_stridescurrent_strides                 r   _bind_dims_to_sizerP   9   s-    %$$$$$HD// ! !3| 	!1q5#d)),, ) )Aw' ,,cCccX\]^X_cc   DGL( H}!!NNNNNNN((bUWbb]`bb   (NM$CHHE HH 2~~Dkk  fffffadff
 
 	
 #D		/KNeCII&&'' ' ''A$q',& 3t99 # #

47<   

;q>""""# #r   r$   rG   c                     t          |           S N)rG   )r$   s    r   slice_to_tuplerS   m   s    r   indexindicesc                   t          | t                    r|                    |            dS t          | t          j                  r|                    |            dS t          | d          rt          | t          t          f          r|                    |            dS t          | t                    rt          |           dk    r|                    |            dS | D ]`}t          |t          j        t          f          s%t          |d          s|du s|t          |          r|                    |             dS a|                    |            dS |                    |            dS )NTF__iter__    .)r   rG   extendtorchr/   rI   hasattrstrbytesr   rF   slicer2   )rT   rU   r   s      r   extractIndicesr_   q   s   % 
ut	E5<	(	( uuUJ'' :U|, ,  	uu % u::NN5!!!4  		 		D4%,!6774,, 3;;<D>>   u%%%tt	   	uu NN55r   clsfunctypesargskwargsc                    |d         }|d         }t          ||t          |                    }|j        r t          j                            ||          S t          |          S Nr   r
   )
getsetitemr2   r    rZ   r/   __getitem__invoke_getitem)r`   ra   rb   rc   rd   selfrT   iinfos           r   getitemrl      s\    7DGEtUHTNN33E 5|''e444%   r   rj   rhsc           	        ddl m}m} t          | |t	          |           pt	          |                    }|j        r(t          j        j        	                    | ||           dS  |j
        |dd          }|r@|j        D ]}|                                sd}|j        D ]B}	|	                                s,|	                                |                                u rd} nC|sg }
|j        D ]e}|                                r(|
                    |                                           >|
                    |                                           f |d|                                dt#          |
          d          |j        
J d	            t'          |j        |j        |j                  }n|}|j        rWt+          |j                  }|j        t1          d
          t          j        j        	                    |j        ||           dS |j        t1          d          |j                            |           dS )z2Set values in tensor using first-class dimensions.r
   )r<   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   r<   r   rg   r2   r    rZ   _C
TensorBase__setitem__createlevelsis_positionalr&   rC   rI   positionrG   tensorr   r!   rS   r$   r"   RuntimeErrorcopy_)rj   rT   rm   r<   r   rk   rhs_infolfoundresult_levelresult_dimsrlmatched_rhsrL   s                 r   setitemr      s   00000000tUHTNN$ChsmmDDE ''eS999 !z eU33H " 	 	A??$$ $)$7  L(6688(,,..!%%''99 $ 9;K#1 9 9++-- 9'..r{{}}===='..rvvxx8888,,4QUUWW 4 4!+..4 4 4   **,P***#OX_e.A
 
   
-U.//$>???''(93LLLLL $;<<<,,,,,r   rk   c                    | j         r5| j        }t          | j                  }|t	          d          ||         }n| j        }|t	          d          ddlm} |                    || j        | j	                  S )NzCannot getitem on None tensorr
   )r/   )
r!   r"   rS   r$   rx   r0   r/   from_positionalr&   r'   )rk   r"   rL   rtensorr/   s        r   ri   ri      s     	@'U.//>???c"#?>??? !!'5+>@PQQQr   tensors_have_dimsc                x   ddl m} | }g }t          |          r|                    |           n$t	          ||          }|r|st          d          S d}dd }g }	dfd}
dd}d}t          |          D ]\  }}t          |          rd}|dz  }|du r |
|           ,t          ||          rDd}|j        s |
|           |}n|t          |j
                  z  }|	                    |           |d} ||          r
d}d}|dz  }|dz  }|rt          d          S t          j        | dd          }t          |j                  }||k    rt          d| d| d          ||z
  }dk    rF||                    |           n.t!          d           g|z  }|d          |z   |dz   d          z   }t#          t          |	          dz
  dd          D ]E}|	|         }|dk    r|k    r||z  }||         }|d |         |j
        z   ||dz   d          z   }Ft%          ||g g |          S )Nr
   )DimListT)r    r   r   r4   r   r9   c                F    dk    rddl m}  |d d|            | d S )Nr   r
   r;   z\at most one ... or unbound dimension list can exist in indexing list but found 2 at offsets r=   )r0   r<   )r   r<   expanding_objects     r   check_expandingz#getsetitem.<locals>.check_expanding  sb    r!!,,,,,,$$.#. .*+. .   r   sr   r   c                    ddl m t          | t          t          f          o-t          |           dk    ot          fd| D                       S )Nr
   r   r   c              3  8   K   | ]} j         |          V  d S rR   r1   )rB   r   r   s     r   rD   z1getsetitem.<locals>.is_dimpack.<locals>.<genexpr>  s/      88dOCOD))888888r   )r0   r   r   rG   r   rF   all)r   r   s    @r   
is_dimpackzgetsetitem.<locals>.is_dimpack  sd     q5$-(( 9A
98888a88888	
r   F.z	at least z/ indices were supplied but the tensor only has z dimensionsr   r4   r   r9   )r   r   r   r   )r0   r   r2   rI   r_   r   r   r   r@   rF   _dimsr   rs   rt   
ValueErrorbind_lenr^   rE   getsetitem_flat)rj   rT   r   r   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   rg   rg      s[   $5 5J 8%    $UJ77$ 	8[ 	8$7777 LH	 	 	 	 	 	
 
 
 
 !*%%  1A;; 	(-%ALL#XXOA7## 	(-%: -"""#$  AG,OOAY#'  Z]] 	(-%#' ALLALL ! 4d3333!$t44IY%&&Jj  lllU_lll
 
 	

  ,.N2'%%n5555 t6I,,,--13345  3x==1$b"-- I Iqk $ B&&&&&>!C_  %0:cAgii3HH

9j"b:NOOOr   r   r   r   keysr%   valuesr   c                	   !"#$ ddl m g  g !d !fdg g #d d#fd	d #fdg g | j        t          d          | j                                        "| j                                        d!"fd|d d          d"fd}d#"f
d}t          | j                  D ]\  }}t          ||          }	|	 ||||	                    *|	                                rO |             s$ t          d                       |           nd         }
dd           |||
            |                                            |                                            |            |             rLrJ| j        t          d          | j                            | j                                                  }n| j        }g g }d$d}d"$fd}t                    D ]~\  }}#|         6d} |             #|         j        D ]}||vr|                    |           D j        |          r|}t           |          }|J d| d            !|         dk    r5t          d           |<                       t!          |                     d}d |<   t#          |                                t!          |          gdd           #|<   t!          |          |vr"|                    t!          |                      |             2|t          d           k    rd}t'          |t(                    s"                    t!          d                     $dk    r(t+          |          D ]}                    $|           |rt/          t1                              D ]k}#|         a#|         j        }|
J d            #|         j        s|                    j                  }t9          |#|         j        |          |<   ld}t+          t/          t1                                        D ]4}|         	                                r|dz  }t!          |           |<   5t;          d||| j                  S )$Nr
   r   rC   r   r   r9   c                    t          |           }||xx         dz  cc<   d S                     |                                d           d S )Nr
   )r   rI   )rC   r   	seen_dimsseen_dims_nusess     r   add_dimz getsetitem_flat.<locals>.add_dimw  sg    )S))?C   A%     S!!!""1%%%%%r   handlec                \                         |                                 d            d S rR   rI   )r   r$   tensor_inputss    r   append_flat_handlez+getsetitem_flat.<locals>.append_flat_handle  s1    6"""T"""""r   tir   c                                         d                                 |            | j        r| j        d S d S d S rR   )rI   r'   rw   )r   device_holding_tensorr$   r   s    r   append_tensor_inputz,getsetitem_flat.<locals>.append_tensor_input  sY    4   R   = 	.2:$&I!!!	. 	.::r   z%Cannot get size/stride on None tensorr   r4   c                |    r8                     |                                          |                     d S d S rR   r   )r   r   r8   r7   r5   r3   s    r   append_sizez$getsetitem_flat.<locals>.append_size  sG     	JJr!uJJr!u	 	r   c                     r`d         \  t          d                                          d                               d           dd          rd         Vd S d S d S d S rf   )r^   rI   )r   input_itr8   r7   s   r   parse_nonesz$getsetitem_flat.<locals>.parse_nones  s     	$8A;.uT{{+++JJqMMMJJqMMM|H	  	$8A;... 	$ 	$ 	$ 	$..r   argc                  
  j         |          r=|}|j        dk    r|          |_         |            	|             |           d S t          j        |dd          }|rS 	|             
|           |j        D ]3}|                                s |                                           4d S rt          |t          t          f          rft          fd|D                       rKt          |          }|D ]} |            |           t          |          |          |           d S  	|             |           d S )Nr   Fc              3  8   K   | ]} j         |          V  d S rR   r   )rB   dr   s     r   rD   z7getsetitem_flat.<locals>.append_item.<locals>.<genexpr>  s/      5V5VQocoa6H6H5V5V5V5V5V5Vr   )r1   _sizerA   r   rs   rt   ru   rC   r   rG   r   r   rP   )r   r   r   infoleveldim_packr   r   r   r   r   r   r8   r7   r5   r3   s         r   append_itemz$getsetitem_flat.<locals>.append_item  s   3?3 	Aw"}}AGAJJJKNNNs###F eU33 	KNNN%%% ) )**,, )GEIIKK(((F 	#t}-- #5V5V5V5VRU5V5V5V2V2V 99! * *AGAJJJ&&q))))"2a5"Q%3DDDA3r   r   zCannot restride None tensorr   Fc                 d    dk    rt                     d S t                     k    rdd S d S )Nr   r   )rF   )r&   tensor_insert_points   r   mark_tensor_indexz*getsetitem_flat.<locals>.mark_tensor_index  sI    "$$"%m"4"4 C$6$666"# 76r   TzDim z not found in seen_dimsz(TensorInfo should have valid tensor data)r    r!   r"   r$   r&   r'   )rC   r   r   r9   )r   r   r   r9   )r   r   r   r9   r   )r   r9   )r   r4   r   r   r   r9   )r0   r   rw   rx   rA   strider   rt   r   ru   r^   rC   
as_stridedstorage_offsetrI   r1   r   r   
_get_ranger   r4   rH   insertrE   rF   r'   todevicer   r   )%r   r   r   r   r   r   r   r   r   r   r   r"   index_levelsrequires_getindexr   inpr   dim_idxtseen_positionalsr   r   r   r   r   r   r$   r   r8   r7   r&   r5   r   r   r3   r   r   s%       `               @@@@@@@@@@@@@@@@@r   r   r   j  s     I!#O& & & & & & & K!M # # # # # # #. . . . . . . . C
CBCCC					 	 B			 	 	"	"B         
 !!!}H$ $ $ $ $ $ $ $ $                             B i.//  5$&&?K6#;''''""$$  (&&uT{{333KNNNN"1+C'|HK3''''		$$$""599;;///AKMMM  ' '#<===&11i&5577
 
  &  "ML$ $ $ $ $ $ $ K(( 3 33' $&q)0 / /,, ''.../ S_S!! 	3A!)Q//G&&(Iq(I(I(I&&&w'1,,!&tA$$Xa[[1111$(!!%A#-LLNNXa[[M5$$ $a  A;;l22 ''444!!####eDkk!!$(!c3'' 3$$Xb\\222 b  l++ 	= 	=E  !4e<<<<  
Ys;''(( 		Y 		YAQ+!!$+}}&P}}}%a(3;-929::A!.q-2B2I<!X!XA eC..//00 ; ;))++ 	;!')9(9::M!+#'   r   )r   r   r   r   r   r   )r-   r   r   r   )r3   r4   r5   r4   r6   r   r7   r   r8   r   r   r9   )r$   r   r   rG   )rT   r   rU   r   r   r   )r`   r   ra   r   rb   r   rc   r   rd   r   r   r   )rj   r   rT   r   rm   r   r   r9   )rk   r   r   r   )rj   r   rT   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	   rZ   
_dim_entryr   r   _tensor_infor   r0   r   r   r   r2   rP   rS   r_   rl   r   ri   rg   r   r,   r   r   <module>r      s   " " " " " " ( ( ( ( ( ( ( ( 6 6 6 6 6 6 6 6 6 6 6 6  / / / / / / / / $ $ $ $ $ $     &        	; 	; 	; 	;1# 1# 1# 1#h   % % % %P	! 	! 	! 	!=- =- =- =-@R R R R&oP oP oP oPdG G G G G Gr   