
    9j_J                        d dl mZ d dlmZmZ d dl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TYPE_CHECKINGN   )_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       Y/media/conek/DATA/Code/OCR/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torch.Tensor | None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_dimsr.   -   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+   r1   r   r5   rangelenr6   tuplereversedappend)szsddimsnsznsdr1   rhs_prodr   r8   jtupinferred_sizenew_stridescurrent_strides                 r   _bind_dims_to_sizerJ   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_tuplerM   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;   slicer.   )indexindicesr   s      r   extractIndicesrY   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   )
getsetitemr.   r   rR   r*   __getitem__invoke_getitem)clsfunctypesargskwargsselfrW   iinfos           r   getitemrf      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      }|r7|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$                  t'        d	      t)        |j$                  |j                  |j                        }n|}|j*                  rbt-        |j.                        }|j0                  t3        d
      t        j                  j                  j                  |j0                  ||       y|j0                  t3        d      |j0                  j5                  |       y)z2Set values in tensor using first-class dimensions.r   )r1   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+   r1   r   r\   r.   r   rR   _C
TensorBase__setitem__createlevelsis_positionalr!   r8   r>   positionr<   tensorAssertionErrorr	   r   rM   r   r   RuntimeErrorcopy_)rd   rW   rhsr1   r   re   rhs_infolfoundresult_levelresult_dimsrlmatched_rhsrF   s                 r   setitemr|      s   0tUHTN$ChsmDE''eS9 !z  eU3H 	A??$$)$7$7 L(668(,,.!%%'9 $ 35K#11 9++-'..r{{}='..rvvx8	9 -<QUUWK H!+.14 +	6 ??" !EFF#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   rM   r   rr   r+   r*   from_positionalr!   r"   )re   r   rF   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   r0   z\at most one ... or unbound dimension list can exist in indexing list but found 2 at offsets r2   )r+   r1   )r   r1   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rL   r,   )r7   r   r   s     r   r9   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   r.   r>   rY   r   r   r   r5   r;   _dimsr   rl   rm   
ValueErrorbind_lenrV   r:   getsetitem_flat)rd   rW   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                j   !"#$ 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 ]=  \  }}#|   4d} |        #|   j                  D ]  }||vs|j                  |        @ j                  |      r|}t         |      }|t!        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/                  $|        |rt1        t3                    D ]m  }#|   	#|   j                  }|t!        d      #|   j4                  s|j7                  j8                        }t;        |#|   j                  |      |<   o d
}t-        t1        t3                          D ]*  }|   j                         s|dz  }t#        |       |<   , t=        d||| j4                        S )Nr   r   c                    t        |       }||xx   dz  cc<   y j                  |        j                  d       y )Nr   )r   r>   )r8   r   	seen_dimsseen_dims_nusess     r   add_dimz getsetitem_flat.<locals>.add_dimx  s@    )S)?C A% S!""1%r   c                J    j                  |        j                  d        y rL   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 rL   )r>   r"   rp   )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 rL   r   )r   r   rC   rB   r@   r?   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[   )rV   r>   )r   input_itrC   rB   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rL   r   )r7   dr   s     r   r9   z7getsetitem_flat.<locals>.append_item.<locals>.<genexpr>  s     5VQocooa6H5Vr   )r,   _sizer6   r   rl   rm   rn   r8   r   r<   r'   r   rJ   )r   argr   infoleveldim_packr   r   r   r   r   r   rC   rB   r@   r?   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"   )r8   r   r   r   )r   r   r   r   )r   r   r   r   r   )r   r   )r   r   r   r   r   r   )r+   r   rp   rr   r6   strider   rm   r   rn   rV   r8   
as_stridedstorage_offsetr>   r,   rq   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   rC   rB   r!   r@   r   r   r?   r   r   s%       `               @@@@@@@@@@@@@@@@@r   r   r   k  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$tA3.E%FGGw'1,!&tA$$Xa[1$(!!%A#-LLNXa[M5$$a  A;l2 ''4!#eDk!$(!c3'$$Xb\2;3@ b l+ 	=E  !4e<	= s;'( 
	YAQ+!!$++9()STT%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
int | None)r-   r   r   r   )r?   r   r@   r   rA   r'   rB   r'   rC   r'   r   r   )r   r'   r   r<   )rW   r   rX   r'   r   r   )r_   r   r`   r   ra   r   rb   r   rc   r   r   r   )rd   r   rW   r   rt   r   r   r   )re   r   r   r   )rd   r   rW   r   r   r   r   r   )r   r   r   r'   r   r    r   r'   r   r   r   r   )
__future__r   dataclassesr   r   typingr   r   rR   
_dim_entryr	   r
   _tensor_infor   r+   r   r   r   r.   rJ   rM   rY   rf   r|   r^   r\   r   r(   r   r   <module>r      s    " ( %  / $ &   	;1#h%P	!>-BR&oPdIII I 	I
 I Ir   