
    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 dd	Ze G d
 d             ZddZddZddZddZddZddZddZddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZy)    )annotations)	dataclassfield)AnyOptionalTYPE_CHECKINGUnionN   )_match_levelsDimEntry)
TensorInfoDimc                    t        |       D ]7  \  }}t        |t              rt        |t              r
||k(  s,|c S ||u s5|c S  y)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/var/www/html/engine/venv/lib/python3.12/site-packages/functorch/dim/_getsetitem.py_safe_indexr      sM     "# 9dH%*Y*ID $H     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<   y)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   listr!   r#   r$    r   r   r   r   #   sK    #t##t#*.K'."48K8$)$$?M>?Jr   r   c                \    ddl m}m}  |j                  |       xs |j                  |       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)objr   r,   s      r   has_dimsr0   -   s(     3??3:6#5#5c#::r   c           	        ddl m} d}t        |      D ]  \  }}|j                  st	        |dz   t        |            D ]4  }	||	   j                  s |d|d||	         |||	   j                  z  }6 | |z  dk7  r t        d |D              }
 |d|  d|
       | |z  }||_        | } n||j                  z  } || k7  rt        |      }
 |d	|  d
| d|
       dgt        |      z  }|}t        t	        t        |                  D ]  }|||<   |||   j                  z  } t	        t        |            D ]4  }|j                  ||   j                         |j                  ||          6 y)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  P   K   | ]  }|j                   r|j                  nd    yw)?N)is_boundsize).0dims     r   	<genexpr>z%_bind_dims_to_size.<locals>.<genexpr>L   s     N#CHH#=Ns   $&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-   r3   r   r7   rangelenr8   tuplereversedappend)szsddimsnsznsdr3   rhs_prodr   r:   jtupinferred_sizenew_stridescurrent_strides                 r   _bind_dims_to_sizerL   9   s    %HD/ !3||1q5#d), )Aw'',KC7RWX\]^X_Wbc  DGLL() H}!NNN(TUWTXX\]`\ab  (NM$CHH H-!2 2~Dk /t4zA`ad`ef
 	
 #D	/KNeCI&' ''A$q',,&'
 3t9 #

47<< 

;q>"#r   c                    t        |       S N)r>   )r!   s    r   slice_to_tuplerO   m   s    r   c                \   t        | t              r|j                  |        yt        | t        j                        r|j                  |        yt        | d      rt        | t        t        f      r|j                  |        yt        | t              rt        |       dk\  r|j                  |        y| D ]R  }t        |t        j                  t        f      st        |d      s|du s|t        |      sA|j                  |         y |j                  |        y|j                  |        y)NTF__iter__    .)r   r>   extendtorchr,   r@   hasattrstrbytesr)   r=   slicer0   )indexindicesr   s      r   extractIndicesr[   q   s    %u	E5<<	(uUJ':U|, 	u %u:NN5!  		D4%,,!674,3;<D>u%		 	u NN5r   c                    |d   }|d   }t        ||t        |            }|j                  r t        j                  j                  ||      S t        |      S Nr   r
   )
getsetitemr0   r   rT   r,   __getitem__invoke_getitem)clsfunctypesargskwargsselfrY   iinfos           r   getitemrh      sQ    7DGEtUHTN3E||''e44%  r   c           	        ddl m}m} t        | |t	        |       xs t	        |            }|j
                  r,t        j                  j                  j                  | ||       y |j                  |dd      }|r3|j                  D ]  }|j                         rd}|j                  D ]7  }	|	j                         r|	j                         |j                         u s5d} n |r_g }
|j                  D ]Q  }|j                         r |
j                  |j!                                3|
j                  |j                                S  |d|j                         dt#        |
      d       |j$                  J d	       t'        |j$                  |j                  |j                        }n|}|j(                  rbt+        |j,                        }|j.                  t1        d
      t        j                  j                  j                  |j.                  ||       y|j.                  t1        d      |j.                  j3                  |       y)z2Set values in tensor using first-class dimensions.r
   )r3   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-   r3   r   r^   r0   r   rT   _C
TensorBase__setitem__createlevelsis_positionalr#   r:   r@   positionr>   tensorr   r   rO   r!   r   RuntimeErrorcopy_)rf   rY   rhsr3   r   rg   rhs_infolfoundresult_levelresult_dimsrlmatched_rhsrH   s                 r   setitemr}      s   0tUHTN$ChsmDE''eS9 !z  eU3H 	A??$$)$7$7 L(668(,,.!%%'9 $ 9;K#11 9++-'..r{{}='..rvvx8	9 -<QUUWK H!+.14 +	6 *P,PP*#OOX__e.A.A
  U../$>??''(9(93L $;<<,r   c                   | j                   r4| j                  }t        | j                        }|t	        d      ||   }n| j                  }|t	        d      ddlm} |j                  || j                  | j                        S )NzCannot getitem on None tensorr
   )r,   )
r   r   rO   r!   rs   r-   r,   from_positionalr#   r$   )rg   r   rH   rtensorr,   s        r   r`   r`      s    ''U../>??c"##?>?? !!'5+>+>@P@PQQr   c                   ddl m} | }g }t        |      r|j                  |       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        ||      rCd	}|j                  s |
|       |}n|t        |j                        z  }|	j                  |       u|d}z ||      r
d	}d}|dz  }|dz  } |rt        d      S t        j                  | d	d      }t        |j                        }||kD  rt        d| d| d      ||z
  }dk7  r4||j                  |       n t!        d       g|z  }|d  |z   |dz   d  z   }t#        t        |	      dz
  dd      D ]8  }|	|   }|dk7  r
|kD  r||z  }||   }|d | |j                  z   ||dz   d  z   }: t%        ||g g |      S )Nr
   )DimListT)r   r   c                <    dk7  rddl m}  |d d|        | y )Nr   r
   r2   z\at most one ... or unbound dimension list can exist in indexing list but found 2 at offsets r4   )r-   r3   )r   r3   expanding_objects     r   check_expandingz#getsetitem.<locals>.check_expanding  s7    r!,$n#$E!.  r   c                    ddl m t        | t        t        f      xr$ t        |       dkD  xr t        fd| D              S )Nr
   r   r   c              3  B   K   | ]  } j                   |        y wrN   r.   )r9   r   r   s     r   r;   z1getsetitem.<locals>.is_dimpack.<locals>.<genexpr>  s     8dOCOOD)8   )r-   r   r   r>   r)   r=   all)sr   s    @r   
is_dimpackz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   r0   r@   r[   r   r   r   r7   r=   _dimsr   rn   ro   
ValueErrorbind_lenrX   r<   getsetitem_flat)rf   rY   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^      s   $5 5J% $UJ7$[$77 LH	
 !*% 1A;(-%AL#XA7#(-%::"#$ 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"- Iqk $ B&&&>!C_  %0:cAgi3HH
!I$ 9j"b:NOOr   c                X   !"#$ 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	                         "| j                  j                         d"fd|d d  dfd}d"f
d	}t        | j                        D ]  \  }}t        ||      }	|	 ||||	          !|j                         r7 |        s t        d               |       Td
   }
dd   |||
       h |j                                 |j                                 |         |        rOrM| j                  t        d      | j                  j                  | j                  j                               }n| j                  }g g }d$d}d$fd}t              D ]8  \  }}#|   4d} |        #|   j                  D ]  }||vs|j                  |        @ j                  |      r|}t         |      }|J d| d       !|   dk(  r)t        d       |<   j                  t!        |             d}d |<   t#        |j%                         t!        |      gdd       #|<   t!        |      |vr|j                  t!        |              |        |t        d       k7  rd}t'        |t(              rj                  t!        d             ; $dk7  r"t+        |      D ]  }j-                  $|        |rt/        t1                    D ]i  }#|   	#|   j                  }|J d       #|   j2                  s|j5                  j6                        }t9        |#|   j                  |      |<   k d
}t+        t/        t1                          D ]*  }|   j                         s|dz  }t!        |       |<   , t;        d||| j2                        S )Nr
   r   c                    t        |       }||xx   dz  cc<   y j                  |        j                  d       y )Nr
   )r   r@   )r:   r   	seen_dimsseen_dims_nusess     r   add_dimz getsetitem_flat.<locals>.add_dimw  s@    )S)?C A% S!""1%r   c                J    j                  |        j                  d        y rN   r@   )handler!   tensor_inputss    r   append_flat_handlez+getsetitem_flat.<locals>.append_flat_handle  s    6"T"r   c                    j                  d        j                  |        | j                  r| j                  y y y rN   )r@   r$   rr   )tidevice_holding_tensorr!   r   s    r   append_tensor_inputz,getsetitem_flat.<locals>.append_tensor_input  s=    4 R ==2:$&II! ;=r   z%Cannot get size/stride on None tensorc                \    r)j                  |           j                  |           y y rN   r   )r   r   rE   rD   rB   rA   s    r   append_sizez$getsetitem_flat.<locals>.append_size  s+    JJr!uJJr!u  r   c                     rHd   B  t        d              j                  d       j                  d       dd  rd   @y y y y r]   )rX   r@   )r   input_itrE   rD   s   r   parse_nonesz$getsetitem_flat.<locals>.parse_nones  sQ    8A;.uT{+JJqMJJqM|H	 8A;.h.hr   c                >  
  j                   |      r4|}|j                  dk(  r
|    |_         |        	|         |       y t        j                  |dd      }|rI 	|         
|       |j
                  D ])  }|j                         r |j                                + y rbt        |t        t        f      rLt        fd|D              r8t        |      }|D ]  } |        |        t        |    |    |       y  	|         |       y )Nr   Fc              3  B   K   | ]  } j                   |        y wrN   r   )r9   dr   s     r   r;   z7getsetitem_flat.<locals>.append_item.<locals>.<genexpr>  s     5VQocooa6H5Vr   )r.   _sizer8   r   rn   ro   rp   r:   r   r>   r)   r   rL   )r   argr   infoleveldim_packr   r   r   r   r   r   rE   rD   rB   rA   s         r   append_itemz$getsetitem_flat.<locals>.append_item  s   3??3Aww"}AAJNs#  eU3N% )**,EIIK() #t}-#5VRU5V2V9! *AAJ&q)* #2a5"Q%3DA3r   r   zCannot restride None tensorr   Fc                 J    dk(  rt               y t               k7  rdy y )Nr   r   )r=   )r#   tensor_insert_points   r   mark_tensor_indexz*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   rr   rs   r8   strider   ro   r   rp   rX   r:   
as_stridedstorage_offsetr@   r.   r   r   
_get_ranger   r   r?   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   rE   rD   r#   rB   r   r   rA   r   r   s%       `               @@@@@@@@@@@@@@@@@r   r   r   j  s\     I!#O& K!M #. C
CBCC						 B				 	 	"B 
 !}H$ $   B i../ 5$&?6#;'""$&uT{3N"1+C'|H3'		$"599;/A%( M #<==&&11i&&557
  &&  "ML$ K( 33' $&q)00 /, ''./ S__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3> b l+ 	=E  !4e<	= s;'( 		YAQ+!!$++}P&PP}%a(33-9299:A!.q-2B2I2I<!XA		Y eC./0 ;))+!')9(9:M!;
 +#'' r   )r   r)   r   r   r   zOptional[int])r/   r   r   r   )rA   r   rB   r   rC   r)   rD   r)   rE   r)   r   r   )r!   r)   r   r>   )rY   r   rZ   r)   r   r   )ra   r   rb   r   rc   r   rd   r   re   r   r   r   )rf   r   rY   r   ru   r   r   r   )rg   r   r   r   )rf   r   rY   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	   rT   
_dim_entryr   r   _tensor_infor   r-   r   r   r   r0   rL   rO   r[   rh   r}   r`   r^   r   r*   r   r   <module>r      s    " ( 6 6  / $ &   	;1#h%P	!=-@R&oPdGGG G 	G
 G Gr   