
    ZЄi<                    d   d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	 erd dl
mZmZ d dlZd dlmZmZmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZ dZdZd adWdZdXdZ dYdZdZ!	 d[	 	 	 	 	 d\dZ" G d d      Z#	 dY	 	 	 	 	 d]dZ$	 d[	 	 	 	 	 d^dZ% G d de&      Z' G d de&      Z(ddl)m*Z* d_dZ+ G d d      Z,e,ejZ                  fZ. G d de,      Z/ G d de,      Z-d`dad Z0dYdbd!Z1dcd"Z2 G d# d$      Z3ddd%Z4ded&Z5dfd'Z6d d(l7m8Z8 d d)l9m:Z:  e:e,ejZ                  e,jv                         e,`<dgd*Z=dhd+Z> e>d,        e>d-        e>d.        e>d/        e>d0        e>d1        e>d2        e>d3        e>d4        e>d5        e>d6        e>d7        e>d8d9:        e>d;d9:        e>d<d=        e>d>d=        e>d?d=        e>d@d=        e>dAd=        e>dBd=        e>dCd=        e>dDd=        e>dEdFG        e>dHdFG        e>dId=        e>dJddFK        e>dLddFM        e>dNddFM        e>dOddFM        e>dPddFM        e>dQddFM        e>dRddFM        e>dSddFM        e>dTdddFU        e>dVddFM        e8ej~                  j                  j                  ddFM      ZAy)i    )annotationsN)AnyOptionalTYPE_CHECKINGUnion)CallableSequence)tree_flattentree_maptree_unflatten   )_match_levelsDimEntryndim_of_levels)EnableAllLayers)_PyInstDecoder)
TensorInfoTc                >    t        | xr | j                  d            S )z4Check if opcode is relevant for variable assignment.STORE_)bool
startswith)opcodes    `/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/functorch/dim/__init__.py_relevant_opr      s    66,,X677    c                    | S )z8Handle tensor conversion for torch function integration. )tensors    r   handle_from_tensorr   !   s    Mr   Dimc                *    t        | ||      S d      S )zCreate a new Dim object.)r    )namesizes     r   _create_dimr%   &   s    tT-T66266r   c                L  	
 d}d
t              }| | }t        j                         }|t        d      |j                  }	 |t        d      |j
                  }|j                  }t        ||      	t        j                  dk\  r#	j                         dk(  r	j                          	j                          t        	j                               rd
n3	j                         dk(  r 	j                         
	j                          |dk(  r
dk(  rt        d	      
}
|k7  rd
d	
fd
}(t              |k7  rt        d| dt                     |dk(  r	 |d      ~S g }t!        |      D ]  }|j#                   ||              t%        |      ~S # ~w xY w)a  
    Create and return one or more Dim objects.

    Uses bytecode inspection to determine variable names when possible.

    Args:
        n (int, optional): The number of dimensions to create. Can be omitted if sizes is specified.
        sizes (List[Optional[int]], optional): A list the same size as the number of dimensions to be
          created, specifying each dimensions size, or None to leave the size unset.

    Returns:
        Union[Dim, Tuple[Dim, ...]]: Single Dim if n=1, tuple of Dims otherwise.

    Examples:
        >>> batch, channel, width, height = dims(4)
        >>> batch, channel, width, height = dims(sizes=[None, 3, 224, 224])
        >>> single_dim = dims(1)
    r"   r   Unable to get current frameUnable to get caller frame      PRECALLr   UNPACK_SEQUENCEzTdims() must be assigned to a sequence of variable names or have argument n specifiedc                    d }| k  rj                         }|sd|  }dnj                          |    nd }t        ||      S Ndr   )r#   nextr%   )ir#   r$   decoderfound_ndimssizess      r   	genobjectzdims.<locals>.genobjectn   sS    D;||~1#w$058dDtT**r   	expected  sizes but found )r2   intreturnr    )leninspectcurrentframeRuntimeErrorf_backf_codef_lastir   sysversion_infor   r1   r   opargSyntaxError
ValueErrorrangeappendtuple)nr5   specified_ndimsframecodelastir6   resultr2   r3   r4   s    `       @@r   dimsrP   +   s   * OK e*}   "E}899LLE==;<<|| u-w&~~9, 	 ()K^^!22!--/KLLNb a!j  *O/)K	+  U!>y(99J3u:,WXXaQ<  ' 	(AMM)A,'	( V} Es   D"F  +3F   F#c                      e Zd ZU dZded<   ded<   ded<   	 	 d	 	 	 dd	Zdd
ZddZddZddZ	ddZ
ddZedd       ZddZddZddZddZe	 	 d 	 	 	 	 	 	 	 	 	 d!d       Zy)"DimLista(  
    A list of first-class dimensions that can be bound to tensor dimensions.

    A DimList can be in one of two states:
    1. Unbound: Created with just a name, no specific dimensions yet
    2. Bound: Either created with specific dimensions/sizes, or bound later via bind() or bind_len()
    Optional[str]_namez	list[Dim]_dimsr   _boundNc                   || _         g | _        d| _        t        |t              r| j                  |       y|g }t        |      D ]l  \  }}t        |t              r=| j                   r| j                    | nd| }|j                  t        ||             S|j                  t        |             n | j                  |       yy)z
        Initialize a new DimList object.

        Args:
            len_or_dims: Optional length (int) or sequence of dimensions/sizes
            name: Optional name for the dimension list
        FNdim)
rT   rU   rV   
isinstancer9   bind_len	enumeraterH   r    	_set_dims)selflen_or_dimsr#   rP   r2   itemdim_names          r   __init__zDimList.__init__   s     

k3'MM+&$D$[1 +4dC(59ZZ$**aS1s1#YHKKHd 34KKD	*+ NN4  %r   c                     d| _         || _        y)z%Set the dimensions and mark as bound.TN)rV   rU   )r]   rP   s     r   r\   zDimList._set_dims   s    
r   c                \   | j                   r=t        | j                        |k7  r$t        dt        | j                         d|       yd| _         g | _        t	        |      D ]G  }| j
                  r| j
                   | nd| }| j                  j                  t        |             I y)z
        Bind this DimList to a specific length.

        Args:
            size: Number of dimensions to bind to

        Raises:
            DimensionBindError: If already bound to a different size
        zDimlist has size z but it is being bound to size TrX   N)rV   r;   rU   DimensionBindErrorrG   rT   rH   r    )r]   r$   r2   r`   s       r   rZ   zDimList.bind_len   s     ;;4::$&('DJJ'88WX\W]^  '
 DKDJ4[ 115djj\!-3qc

!!#h-01r   c                    t        |d      rt        |d      st        d      t        |      }| j                  |       t	        |      D ]"  \  }}t        |      | j                  |   _        $ y)z
        Bind this DimList to specific sizes.

        Args:
            sizes: Sequence of sizes for each dimension

        Raises:
            ValueError: If sizes is not a sequence
        __len____getitem__zexpected a sequenceN)hasattrrF   r;   rZ   r[   r9   rU   r$   )r]   r5   r$   r2   dim_sizes        r   bindzDimList.bind   sd     ui(}0M2335zd$U+ 	/KAx!$XDJJqM	/r   c                Z    | j                   st        d      t        | j                        S )NDimList not bound)rV   rd   r;   rU   r]   s    r   _sizezDimList._size   s#    {{$%8994::r   c                "    | j                         S )z7Return the size (number of dimensions) of this DimList.rn   rm   s    r   r$   zDimList.size   s    zz|r   c                    || _         y)z(Set the bound status (for internal use).NrV   )r]   bs     r   
_set_boundzDimList._set_bound   s	    r   c                    | j                   S )z&Property to check if DimList is bound.rr   rm   s    r   is_boundzDimList.is_bound   s     {{r   c                "    | j                         S )z!Return the length of the DimList.)r$   rm   s    r   rf   zDimList.__len__   s    yy{r   c                   | j                   st        d      t        |t              r7|dk  s|t	        | j
                        k\  rt        d      | j
                  |   S t        |t              re|j                  t	        | j
                              \  }}}g }t        |||      D ]   }|j                  | j
                  |          " t        |      S t        d      )Nrl   r   zindex out of boundszexpected an int or a slice)rV   rd   rY   r9   r;   rU   
IndexErrorsliceindicesrG   rH   rI   rF   )r]   keystartstopsteprO   r2   s          r   rg   zDimList.__getitem__   s    {{$%899c3Qw#TZZ0 !677::c?"U# #C

O <E4F5$- -djjm,-= 9::r   c                    | j                   r&ddj                  d | j                  D               dS | j                  d| j                   S y),Return string representation of the DimList.(z, c              3  2   K   | ]  }t        |        y wN)repr).0rX   s     r   	<genexpr>z#DimList.__repr__.<locals>.<genexpr>  s      Asc As   )*z<unbound_dimlist>)rV   joinrU   rT   rm   s    r   __repr__zDimList.__repr__  sL    ;;tyy Adjj AAB!DDZZ#tzzl## 'r   c                "    | j                         S )r   )r   rm   s    r   __str__zDimList.__str__  s    }}r   c                2    t         j                  ||||      S r   )_Tensor__torch_function__)clsfunctypesargskwargss        r   r   zDimList.__torch_function__  s     ))$tVDDr   NN)r^   zOptional[Union[int, Sequence]]r#   rS   )rP   listr:   None)r$   r9   r:   r   )r5   zSequence[int]r:   r   r:   r9   )rs   r   r:   r   r:   r   )r|   zUnion[int, slice]r:   Union[Dim, tuple[Dim, ...]]r:   strr   N
r   r   r   rI   r   rI   r   zOptional[dict]r:   r   )__name__
__module____qualname____doc____annotations__ra   r\   rZ   rj   rn   r$   rt   propertyrv   rf   rg   r   r   classmethodr   r   r   r   rR   rR      s     L 7;"!3! !:
1,/&
  ;"
' 
 !%EE E 	E
 E 
E Er   rR   c                    t        |       }|gt        |t              r|j                  |       |S |j                  t	        |             t        |      D ]  \  }}|	||j                  |   _         |S )z>Create a DimList object with the given name and optional size.)r#   )rR   rY   r9   rZ   r;   r[   rU   r$   )r#   r$   dimlistr2   ss        r   _create_dimlistr   (  s{     4 GdC T" N	 SY'!$ .1=,-GMM!$). Nr   c                   d}d|t        |      }| | }t        j                         }|t        d      |j                  }	 |t        d      |j
                  }|j                  }t        ||      t        j                  dk\  r#j                         dk(  rj                          j                          t        j                               rdn3j                         d	k(  r j                         j                          |dk(  rdk(  rt        d
      }|k7  rddfd}|(t        |      |k7  rt        d| dt        |             |dk(  r! |d      }t!        ||
|d         ~S d      ~S g }t#        |      D ].  }	 ||	      }|||	   nd}
|j%                  t!        ||
             0 t'        |      ~S # ~w xY w)zt
    Create and return one or more DimList objects.

    Similar to dims() but creates DimList objects instead.
    r"   r   Nr'   r(   r)   r,   r   r-   zXdimlists() must be assigned to a sequence of variable names or have argument n specifiedc                l    d }| k  rj                         }|s	d|  }d|S j                          |S r/   )r#   r1   )r2   r#   r3   r4   s     r   r6   zdimlists.<locals>.genobjecto  sD    D;||~1#w K Kr   r7   r8   )r2   r9   r:   r   )r;   r<   r=   r>   r?   r@   rA   r   rB   rC   r   r1   r   rD   rE   rF   r   rG   rH   rI   )rJ   r5   rK   rL   rM   rN   r6   r#   rO   r2   r$   r3   r4   s              @@r   dimlistsr   9  s    OK e*}  "E}899LLEA=;<<|| u-w&~~9, 	 ()K^^!22!--/KLLNb a!n  *O/)K	 U!>y(99J3u:,WXX aQ<D"4U5FqQ  MQQ  ' 	7AQ<D$058dDMM/$56	7
 V} Es   D2G :G AG Gc                      e Zd Zy)DimensionMismatchErrorNr   r   r   r   r   r   r   r         r   r   c                      e Zd Zy)rd   Nr   r   r   r   rd   rd     r   r   rd   )op_propertiesc                    ddl }g }| D ]g  }t        |d      r?dt        t        |            v r)|j	                  dt        |      j
                   d       N|j	                  t        |             i t        |i |d|j                  i y)z;Safe print that avoids recursive torch function dispatches.r   N	__class__torch<>file)rB   rh   r   typerH   r   printstderr)r   r   rB   	safe_argsargs        r   _safe_printr     s     I '3$CS	N)Bqc!3!3 4A67SX&	' 
900SZZ0r   c                      e Zd ZddZddZedd       Zedd       ZddZe		 	 d	 	 	 	 	 	 	 	 	 dd       Z
e	 	 	 	 	 	 	 	 	 	 dd       Zdd	Zdd
Z	 	 	 	 	 	 ddZddZy)r   c                    t        d      )Nz+_get_levels must be implemented by subclassNotImplementedErrorrm   s    r   _get_levelsz_Tensor._get_levels      !"OPPr   c                    t        d      )Nz+_get_tensor must be implemented by subclassr   rm   s    r   _get_tensorz_Tensor._get_tensor  r   r   c                    t        d      )Nz$ndim must be implemented by subclassr   rm   s    r   ndimz_Tensor.ndim  s    !"HIIr   c                B    t        d | j                         D              S )Nc              3  ^   K   | ]%  }|j                         r|j                          ' y wr   )is_positionalrX   r   ls     r   r   z_Tensor.dims.<locals>.<genexpr>  s     R@QQUUWRs   --)rI   r   rm   s    r   rP   z_Tensor.dims  s    Rd&6&6&8RRRr   c                    | j                   S r   )r   rm   s    r   rX   z_Tensor.dim  s    yyr   Nc                   |i }t         r|t        j                  j                  u rt	        |      dk(  r|st        |d   t        t        j                  f      rht        |d   t        t        j                  f      rDt        j                  |d   dd      }t        j                  |d   dd      }|r|r|j                  |j                  |j                  j                         dk(  r|j                  j                         dk(  r|j                  j                         r|j                  j                         r|j                  xs |j                  }g }|j                  D ]  }	|	|vs|j                  |	        |j                  D ]  }	|	|vs|j                  |	        t        j                  ||||      S |t        j                  j                   u rddlm}
  |
| ||||      S |t        j                  j&                  u r?ddlm} t	        |      dk(  r ||d   |d   |d          y t+        d	t	        |             |t        j                  j,                  u r|d   j/                  d      S |t        j0                  u rt1        |i |S |t        j2                  u rt3        |i |S |t        j                  j4                  u sJ|t        j6                  j4                  u s.|t        j6                  j8                  u s|t        j4                  u rt5        |i |S t        j;                  ||||      S )
N   r   r   Fensure_batchedensure_present)getitemsetitemr*   z%Expected 3 args for __setitem__, got )DOT_OPTIMIZEDr   Tensor__mul__r;   rY   r   r   creater   rX   is_floating_point
has_devicelevelsrH   create_delayedrg   functorch.dim._getsetitemr   __setitem__r   rF   rf   r$   softmaxstacksplit_VFsplit_with_sizes_torch_function_fallback)r   r   r   r   r   lhs_inforhs_infor   r   levelr   r   s               r   r   z_Tensor.__torch_function__  s    >FTU\\%9%99 D	QtAw%,,(?@tAw%,,(?@ &,,GE% &,,GE%
   3 3 ++-2 ++-2 !99;$OO==? &.%8%8%OH<O<O
!#%-__ 5E$F2 &e 45 &.__ 5E$F2 &e 45  &44T4TT5<<+++93eT6::5<<+++9 4yA~Qa$q'2 #HT!TUU 5<<'''7<<?" 5== D+F++ 5;;$)&)) ELL&&&uyy&uyy111u{{"$)&))//eT6JJr   c                   t         xr | t        j                  v }t        ||f      \  }}dg }g |D ]  }t	        j
                  || d      }	|j                  |	       |	s/|s|	j                  J |	j                  r|	j                  |	j                  D ]*  }
t        |
t              sJ |
vsj                  |
       ,  |rt        |      D ]o  \  }}	|	s	|	j                  |	j                  }'|	j                  s|j                  j                        }t!        ||	j                        }t#        |      ||<   q t%        ||      \  }} | |i |}dfd}t        |t&        j(                        r ||      S t+        ||      S t-              5 t        |      D ]t  \  }}	|	s	|	j                  |	j                  }'|	j                  s|j                  j                        }j/                  ||	j                         t#        |      ||<   v t%        ||      \  }} | |i |}dfd}t        |t&        j(                        r ||      cddd       S t+        ||      cddd       S # 1 sw Y   yxY w)zGFallback torch function implementation for non-special-cased functions.NFc                n    t        | t        j                        rt        j                  | d u      S | S r   )rY   r   r   from_positional)objdevice_holding_tensorresult_levelss    r   wrap_tensorz5_Tensor._torch_function_fallback.<locals>.wrap_tensorC  s8    c5<<0!11],A,M  
r   c                d    t        | t        j                        rj                  | d u      S | S r   )rY   r   r   from_batched)r   r   guards    r   unwrap_tensorz7_Tensor._torch_function_fallback.<locals>.unwrap_tensor_  s0    c5<<0 --c3HPT3TUU
r   )r   r   r:   r   )POINTWISE_OPTIMIZEr   	pointwiser
   r   r   rH   batchedtensorr   r   r   rY   r   r[   todevicer   r   r   r   r   r   r   inplace_update_layers)r   r   r   r   is_pointwise	flat_argsspecinfosfinfor   r2   r   mlunflat_argsunflat_kwargsrO   r   batchedr   r   r   r   s                       @@@r   r   z _Tensor._torch_function_fallback  s   
 *Mdm6M6M.M&f~6	4 $"$(* 	4A$$QL(8%@DLL#t'9'9'EEE(0T__,0KK)![[ 4E%eX666M1%,,U34	4 $U+ :4DKK3![[F,8!'+@+G+G!H&vt{{MJB#5b#9IaL: *8	4)H&K;8-8F &%,,/"6**V44 ]+ 	7u$U+ ?4D..:"00G,8")**-B-I-I"J//E#5g#>IaL? *8	4)H&K;8-8F
 &%,,/$V,)	7 	7,  v6-	7 	7 	7s    J5JB J,JJ
c                "    ddl m}  || ||      S )z2Set values in tensor using first-class dimensions.r   r   )r   r   )r]   indexvaluer   s       r   r   z_Tensor.__setitem__i  s    5tUE**r   c                f   t        j                  | dd      }|D ]  }t        |t              rt        | t        j
                        r2t        | t              s"t	        j
                  j                  | g| c S | j                  t        j
                  j                  t        |       f| f|z         c S  |s9| j                  t        j
                  j                  t        |       f| f|z         S |j                  }|9| j                  t        j
                  j                  t        |       f| f|z         S |j                  }g }g }g }|D ]  }	|D ]4  }
|
j                         r|
j                         |	u s't        d|	 d       |D ]4  }|j                         r|j                         |	u s't        d|	 d       |j                  t!        |	             |j                  |	j"                         |j                  d        |j%                  |       t'        |j#                               }t'        |j)                               }|j%                  |       |j%                  |       |j+                  |||j-                               }t
        j/                  |||j0                        }|S )aq  
        Expand tensor by adding new dimensions or expanding existing dimensions.

        If all arguments are Dim objects, adds new named dimensions.
        Otherwise, falls back to regular tensor expansion behavior.

        Args:
            args: Either Dim objects for new dimensions or sizes for regular expansion

        Returns:
            New tensor with expanded dimensions

        Example:
            >>> i, j = dims()
            >>> t = torch.randn(3, 4)
            >>> expanded = t[i].expand(j, k)  # Add j, k dimensions
            >>> expanded2 = t[i].expand(2, 4)  # Regular expand with sizes
        Fr   zexpanding dimension z# already exists in tensor with dimsr   )r   r   rY   r    r   r   r   expandr   r   r   r   r   rX   rd   rH   r   r$   extendr   stride
as_stridedstorage_offsetr   r   )r]   r   r  r   datar   
new_levels	new_sizesnew_stridesr0   r   	new_level
orig_sizesorig_stridesexpanded_datarO   s                   r   r
  z_Tensor.expandr  st   &   eER 	Cc3'dELL1*T7:S <<..t;d;;22++d4j]TGdN 	 **##d4j]TGdN 
 {{<**##d4j]TGdN  %'
	 	"A **,1A,.qc1TU 
 ( 	 ..0Y]]_5I,.qc1TU  hqk*QVV$q!	"$ 	&! $))+&
DKKM*$<( 	;@S@S@UV ''z4??Sr   c                   % ddl m} ddlm}m} ddlm% ddd}d% fd}d fd}g }	g }
t        |t        t        f      }t        |t        t        f      }|rd|rb|}|}t        |      t        |      k7  r$t        d	t        |       d
t        |       d      |	j                  |       |
j                  |       n"|	j                  |       |
j                  |       t        j                   dd      }g }g }g }t!        t        |	            D ]  } ||	|   d      \  }}|rgt        |      dk(  r|j                  t#                      ? ||d         }|j                  |       t        |      dk(  rjt        |      dk(  r|j                  |j$                         g }t!        dt        |            D ]`  } |||         }d}t!        t        |            D ]  }||   |k(  s|j'                  |       d} n |s ||       |j                  |       b d}t!        t        |            D ]  }||   |k(  s|} n |
 ||       @t)        |      D ]  \  }}|j+                  |dz   |z   |        |j                  |       ~|j                   ||	|                 t        |      dkD  r|j,                  J d        ||j,                  |j$                  |      }|j/                         }g } g }!t!        t        |            D ]e  }||   |v r4t        |       dk(  r| j                  ||          -| dxx   ||   z  cc<   >| j                  ||          |!j                  ||          g |j1                  |       |_        |!|_        d}"|
D ]  }#t        |#t        t        f      sd}" n  ||g ||
|"      }$ ||$      S )z<
        Index tensor using first-class dimensions.
        r   )r   )getsetitem_flatinvoke_getitem	_wrap_dimFc                J    t        | t        t        f      rt        |       dfS y)NT)NF)rY   rI   r   )r   check_firsts     r   maybe_dimpackz$_Tensor.index.<locals>.maybe_dimpack  s!    #t}-Cy$&r   c                ~     | j                   d      }|j                         rt        dt        |              |S )NFz)expected a dimension specifyer but found )r   is_none	TypeErrorr   )r   r0   r  r]   s     r   parse_dim_entryz&_Tensor.index.<locals>.parse_dim_entry  s;    !TYY.Ayy{"KDQRG9 UVVHr   c                    | j                         r7t        d| j                         j                  z    dj                   d      t        dt	        | j                                d      )N
dimension z not in tensor of z dimensionsz not in tensor)r   r!  positionr   r   rX   )r0   r]   s    r   dim_not_presentz&_Tensor.index.<locals>.dim_not_present  sb      		!9 ::LTYYKWbc   *T!%%']O> JKKr   zdims (z) and indices (z) must have the same length)r  r   TNz2Cannot perform dimension flattening on None tensorr"   )F)r   r   r  r   r:   ztuple[Any, bool])r   r   r:   r   )r0   r   r:   r   )
_dim_entryr   _getsetitemr  r  _wrapr  rY   rI   r   r;   r!  r  rH   r   r   rG   r   r   popr[   insertr   r$   reshape)&r]   rP   r{   r   r  r  r  r"  r&  	dims_listindices_listlhs_listrhs_listdims_seqindices_seq	self_infor  
to_flattendims_list_flatr2   m
is_dimpackfirstrestjr0   removedk	first_idxr
rearrangedr5   r  reshape_levelshas_dimpacksidxr  r  s&   `                                    @r   r  z_Tensor.index  s    	.@$	
		L ,.	>@dUDM2gt}5H!K8}K 00S]O?3{;K:LLgh  X&,T"( %%dE59	 "
 "
 s9~& ,	EA))A,EJMAzq6Q;"))(*5'!-%%e,q6Q; z?a'%%i&6&67q#a&) 
#A'!-A#G"3z?3 "%a=A-&NN1-&*G!	"
 #'*KKN
# !	s:/ A!!}-$%	 $#E*%dO <DAq%%i!ma&7;<!!$'%%oil&CDY,	E^ z?Q##/ D/ 'y'7'79I9I:VJOO%E#%IN3z?+ 9a=J.9~*!((q2!"q1$$U1X."))*Q-89  *11)<I-I  	C#t}-#	 
 d##r   c                   | j                         | j                         | j                  }}}g }|D ]  }t        |d      r3|j	                         r#|j                  |j                         |z          Bt        |d      r |j                  |j                                nt        |d      r|j                  |j                         |j                  |        | dt        |       dt        |j                                S )Nr   rX   r  z
with dims=z sizes=)r   r   r   rh   r   rH   r%  rX   r  rI   r$   )r]   r   r   r   	dims_reprr   s         r   r   z_Tensor.__repr__a  s    #//143C3C3Etyy	 		$Aq/*q/@  !45E"  )F#  (  #		$ eI&6%7wuV[[]?S>TUUr   r:   	list[Any]r:   Optional[torch.Tensor]r   )r:   ztuple[Any, ...]r   r   )
r   r   r   rI   r   rI   r   dictr:   r   )r  r   r  r   r:   r   )r   r    r:   r   )rP   zCUnion[int, Dim, tuple[Union[int, Dim], ...], list[Union[int, Dim]]]r{   zsUnion[int, slice, torch.Tensor, tuple[Union[int, slice, torch.Tensor], ...], list[Union[int, slice, torch.Tensor]]]r:   r   r   )r   r   r   r   r   r   r   rP   rX   r   r   staticmethodr   r   r
  r  r   r   r   r   r   r     s   QQ J J S S 
 !%ZKZK ZK 	ZK
 ZK 
ZK ZKx K7K7$K7,1K7;?K7	K7 K7Z+SjX$QX$
X$ 
X$tVr   r   c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ddd	Zedd
       Zedd       Zedd       Z	e	j                  dd       Z	edd       ZddZddZddZej                   Zy)r    r9   _levelr   rT   rn   rH  _range_batchtensorc                d    || _         || _        t        | _        t        dz  ad | _        d | _        y Nr   )rT   rn   _n_dims_createdrL  rM  rN  )r]   r#   r   s      r   ra   zDim.__init__{  s0    

%1 r   c                     yrP  r   rm   s    r   r   zDim.ndim  s    r   c                    t        |      | u S r   r   )r   r   s     r   check_exactzDim.check_exact  s    CyCr   c                j    | j                   dk(  rt        d| j                   d      | j                   S )Nr"   r$  z is unbound)rn   rF   rT   rm   s    r   r$   zDim.size  s0    ::z$**[ABBzzr   c                    | j                   dk(  r|| _         y | j                   |k7  r't        dt        |        d| j                    d|       y )Nr"   zDim 'z*' previously bound to a dimension of size z$ cannot bind to a dimension of size )rn   rd   r   )r]   vs     r   r$   zDim.size  sX    ::DJZZ1_$T
|#Mdjj\ Z667S:  r   c                     | j                   dk7  S )z1Return True if this dimension is bound to a size.r"   rp   rm   s    r   rv   zDim.is_bound  s     zzRr   c                z    | j                   $t        j                  | j                        | _         | j                   S )z
        Get a tensor representing the range [0, size) for this dimension.

        Returns:
            A 1D tensor with values [0, 1, 2, ..., size-1]
        )rM  r   aranger$   rm   s    r   
_get_rangezDim._get_range  s,     ;;,,tyy1DK{{r   c                    | j                   Ht        j                  j                  j	                  | j                         d| j                        | _         | j                   S )z
        Get a batched tensor representation of this dimension.

        Returns:
            A batched tensor created from the range tensor
        r   )rN  r   _C
_functorch_add_batch_dimr\  rL  rm   s    r   _get_batchtensorzDim._get_batchtensor  sM     $ % 3 3 B B!1dkk!D    r   c                    | j                   S )z&String representation of a Dim object.)rT   rm   s    r   r   zDim.__repr__  s    zzr   N)r"   )r#   r   r   r9   r:   r   r   )r   r   r:   r   )rX  r9   r:   r   r   r:   torch.Tensorr   )r   r   r   r   ra   r   r   r   rU  r$   setterrv   r\  ra  r   object
__format__r   r   r   r    r    t  s    KJJ""((!        
 
[[     	! ""Jr   c                      e Zd ZU ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   edd       Zedd       Ze	 	 	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 	 	 	 	 dd       Z	ddZ
ddZddZddZ	 	 	 	 	 	 d dZd!dZy)"r   rH  _tensorrN  list[DimEntry]_levelsr   _has_devicez$Optional[Callable[[], torch.Tensor]]_delayedzOptional[Callable]_delayed_origzOptional[tuple]_delayed_argsc                :    t        d | j                  D              S )Nc              3  D   K   | ]  }|j                         rd nd  yw)r   r   N)r   r   s     r   r   zTensor.ndim.<locals>.<genexpr>  s     GQ)1q0Gs    )sumrk  rm   s    r   r   zTensor.ndim  s    G$,,GGGr   c                    t        |      | u S r   rT  )r   others     r   rU  zTensor.check_exact  s    E{c!!r   c                   d}d}t        |      D ]a  \  }}|j                         rG|dk(  s1|dz   |j                         k(  sJ d| d|j                                 |j                         }]|dz  }c |dk(  s|dk(  s
J d|        |s|S  |        }||_        ||_        ||_        d|_        d|_        d|_        d|_	        |j                         t        |      k(  s%J d|j                          d	t        |       d
       |S )a0  
        Create a functorch Tensor from a regular PyTorch tensor with specified dimension levels.

        This is the primary way to create Tensor objects with first-class dimensions.

        Args:
            tensor: The underlying PyTorch tensor
            levels: List of DimEntry objects specifying the dimension structure
            has_device: Whether the tensor is on a device (not CPU)

        Returns:
            A new Tensor instance with the specified dimensions, or a regular torch.Tensor
            if there are no named dimensions
        r   r   z/Positional dimensions must be consecutive, got z then r"   z0Final positional dimension must be 0 or -1, got NzTensor has z dimensions but z levels provided)r[   r   r%  ri  rk  rl  rN  rm  rn  ro  rX   r;   )	r   r   r   r   	seen_dimslastr2   r   rO   s	            r   r   zTensor.from_positional  s<   $ 	f% 		DAq qyD1H

$< EdV6RSR\R\R^Q_`< zz| Q			 qyDBJ 	
>tfE	
& M '"## zz|s6{* 	
&**,'7F}DTU	
* r   c                     |        }d|_         ||_        ||_        d|_        |_        |_        dfd}||_        |S )zP
        Create a delayed tensor that defers the operation until later.
        Nc                     g } D ]?  }t        |d      r | j                  |j                                /| j                  |       A  |  S )Nr   )rh   rH   r   )unwrapped_argsr   r   origs     r   evaluate_delayedz/Tensor.create_delayed.<locals>.evaluate_delayed  sQ    N /3."))#//*;<"))#.	/
 ((r   rc  )ri  rk  rl  rN  rn  ro  rm  )r   r{  r   r   r   rO   r|  s    ``    r   r   zTensor.create_delayed  sM     '"##	) +r   c                    t        | d      rB| j                  6| j                  *| j                         | _        d| _        d| _        d| _        | j                  S )zAGet the underlying tensor, handling delayed operations if needed.rm  N)rh   rm  ri  rn  ro  rm   s    r   r   zTensor._get_tensor,  sR     D*%)$  ==?DL DM!%D!%D||r   c                    | j                   S )zGet the dimension levels.)rk  rm   s    r   r   zTensor._get_levels;  s    ||r   c                    | j                   S )z/Get whether this tensor has device information.)rl  rm   s    r   _get_has_devicezTensor._get_has_device?  s    r   c                    | j                   3| j                  | j                         | j                               | _         | j                   S )zDGet the batched tensor representation, creating it lazily if needed.)rN  _add_batch_dimsr   r   rm   s    r   ra  zTensor._get_batchtensorC  sF    $ $ 4 4  "D$4$4$6!D    r   c                   t        |      }	 d}d}t        d      }d}d}t        |      D ]f  \  }}	|	j                         r|	j	                         s;|	j                         j                  |k  r|	j                         j                  }|}|}|dz  }h |dk(  r|S |J t        j                  j                  j                  ||t        |            }t               ||<   )Nr"   infr   r   )r   floatr[   r   r   rX   rL  r   r^  r_  r`  r9   r   )
r]   tlevels_r   min_real_index	min_index	min_valuer2   r>  r   s
             r   r  zTensor._add_batch_dimsK  s     gNIeIAA!&) 1yy{??,)1K$%EEGNN	$%	)*FA B= =##221iYPA%-ZF>"+ r   c                $    ddl m}  || g| }|S )z&Reorder the dimensions of this tensor.r   )order)_orderr  )r]   rP   r  rO   s       r   r  zTensor.orderh  s    !t#d#r   Nr   )rt  r   r:   r   )r   rd  r   rj  r   r   r:   Union[_Tensor, torch.Tensor])
r{  r   r   rI   r   rj  r   r   r:   r   rG  rE  r   )r  rH  r  rF  r:   rH  )rP   r   r:   r   )r   r   r   r   r   r   r   rU  r   r   r   r   r  ra  r  r  r   r   r   r   r     s    ##((22%%""H H " " 6!6+96GK6	%6 6p #(2@NR	 8 !'2;	:r   r   c                l   | st        d      t        |t              st        j                  | |      }|S g }g }| D ]R  }t        j                  |dd      }|j                  |       |j                  D ]  }||vs|j                  |        T t        |       |_
        g }	|D ]G  }|j                  J d       t        |j                  |j                  |      }
|	j                  |
       I t        |      }d}|9t        |t              r|dk(  s$dd	lm}  |||d      }	 |j#                  |      }|}t        j                  |	|      }|j'                  |t)        |             t*        j-                  |||r|d   j.                        }|S d      }|S # t         $ r t%        d
| d      dw xY w)a$  
    Stack tensors along a new dimension.

    Args:
        tensors: Sequence of tensors to stack
        new_dim: The new Dim to create for stacking
        dim: The dimension position to insert the new dimension (default: 0)

    Returns:
        Stacked tensor with the new dimension
    z-stack expects a non-empty sequence of tensors)rX   Fr   Nz*Cannot stack tensors with None tensor datar   r   r  z
Dimension z does not exist in inputsT)rF   rY   r    r   r   r   r   rH   r   r;   r$   r   r   r   r9   r)  r  r  r!  r+  r   r   r   r   )tensorsnew_dimrX   rO   r   r   r  r  r   inputsmatched_tensorr   rawdimr  r0   rB  tensor_results                    r   r   r   p  s    HII gs#W#. ME ,  5OT[[ 	,EM)$$U+	,, w<GL F &{{&T(TT&&t{{DKKOn%& -(DF

3 4$c4'	S%%a(C  [[(F '!23 **euQx22M  BFM   	Sj-FGHdR	Ss   %F F3c           	        ddl m} t        |t              }t        |t              rK|rt        d      t        j                  t        j                  j                  t        |       f| |fd|i      S g }d}d}|D ](  }|j                  |       t        |t              rd}'d}* |rK|rt        d      t        j                  t        j                  j                  t        |       f| |fd|i      S |st        d      t        j                  | dd      }	|	j                         }
|s|
d	k(  rt        d
      |
 |||
d      nt!        |
       }d}t#        |	j$                        D ]  \  }}||k(  s|} n ||d	}t        d|       g }d	}g }t#        |      D ]W  \  }}|j&                  r$|j                  |j(                         ||d   z  }6|j                  d	       |j                  |       Y |	j*                  J d       |	j*                  j)                  |      }|ra||kD  rt        d| d| d      ||z
  }|t-        |      z   dz
  t-        |      z  }|D ]"  }t/        ||      }|||   _        |||<   ||z  }$ n||k7  rt        d| d| d      |	j*                  j1                  ||      }g }t3        |	j$                        }t#        t5        ||            D ]O  \  }\  }}t!        |      ||<   |j                  t        j7                  |t3        |      |	j8                               Q t;        |      S )z
    Split tensor along a dimension.

    Can handle both regular integer sizes and Dim objects for split sizes.
    When Dim objects are used, they get bound to the resulting tensor dimensions.
    r   r  zKwhen dim is specified as a Dim object, split sizes must also be dimensions.rX   TFz-split list must be ints or dims but got a mixr   r   z+split expects at least a 1-dimension tensorNz"tensor does not contain dimension r"   z%Cannot get tensor size on None tensorz+sizes of target dimensions add up to more (z) than source dim (r   z#sum of sizes of target dimensions (z) do not match the source dim ()r)  r  rY   r    r9   r!  r   r   r   r   r   r   rH   r   r   r   r   r[   r   rv   r$   r   r;   minr   r   zipr   r   rI   )r   split_size_or_sectionsrX   r  dim_is_objectr5   all_dimsall_intsr_   r3  r   dim_lrB  r2   r   r{   
total_sizeunboundsize_dimtensor_sizeremaining_size
chunk_sizeuszresult_tensorsrO   r  result_tensors                               r   r   r     s    ! sC(M (#.]  //LL&\O+,CL	
 	
 EHH& TdC HH ]  //LL&\O+,CL	
 	
 GHH !!&uUI>>DTQYEFF ,/?Ic4'$E Ci../ 5E>C
 {;C<SEBCC GJG ' 8NN8==)'"+%JNN1NN1 'P)PP'""'',K #=j\I\]h\iijk  %z1$s7|3a7CLH
 	!AZ0BE!HMGAJb N		!
 

	"1*=\]h\iijk
 	

 %%66wDN Fi&&'J(1#ne2L(M 
$$M8"8,
3""tJ/1E1E	

 =r   c                V    t        d      }t        | ||      j                  ||g|      S rP  )rP   r   r  )r  rX   r  rJ   s       r   catr  4  s+    QA!S!''C'::r   c                       e Zd ZdZddZddZy)DotPartzA
    Helper class for organizing dimensions in dot products.
    c                     g | _         d| _        y rP  )rP   r  rm   s    r   ra   zDotPart.__init__>  s    $&	r   c                    | j                   j                  |       |j                         s.| xj                  |j	                         j
                  z  c_        yy)z#Add a dimension entry to this part.N)rP   rH   r   r  rX   r$   )r]   	dim_entrys     r   rH   zDotPart.appendB  s?    		#&&(OOy}}333O )r   N)r:   r   )r  r   r:   r   )r   r   r   r   ra   rH   r   r   r   r  r  9  s    4r   r  c                X   g }d}| D ]7  }t        |j                        dk7  rd}|j                  |j                         9 |j                  t	        d      t        |j                  |j                  |      }|s|S | D cg c]  }|j                   }}|j                  |      S c c}w )zJ
    Prepare tensor for dot product by matching levels and reshaping.
    Fr   Tz)Cannot perform dot product on None tensor)	r;   rP   r  r   r>   r   r   r  r,  )partstensor_infor  needs_reshapepartrO   views          r   dot_preparer  I  s     JM %tyy>Q M$))$%
 !FGG;--{/A/A:NF )..DOO.D.>>$ /s   B'c                >   g }d}| D ]7  }t        |j                        dk7  rd}|j                  |j                         9 |rCg }|D ]+  }|j                  |j	                         j
                         - |j                  |      }t        j                  ||d      }|S )zE
    Finish dot product by reshaping result and creating Tensor.
    Fr   T)	r;   rP   r  rH   rX   r$   r,  r   r   )r  r  r   r  r  new_sizer   r  s           r   
dot_finishr  a  s     MM (tyy>Q MTYY'(
 " 	.EOOEIIK,,-	.%--h7**=-NMr   c                   t        j                  | dd      }t        j                  |dd      }|r|st        j                  | |      S |j                  |j                  J d       |j                  j                         |j                  j                         t               t               t               t               d	fd}dgt        |j                        z  }t        |j                        D ]<  \  }}d}	t        |j                        D ]  \  }
}||k(  s|
}	d||
<    n  ||||	       > t        |j                        D ]  \  }}||   r ||d|        t        j                        t              k7  r2D ]-  }||j                  vs||j                  vs!t        d|        t        j                        dk7  rCt        g|      }t        g|      }t        j                  ||      }t        g|      S t        g|      }t        g|      }t        j                  ||      }t        g|      S )
z
    Perform dot product between two tensors along specified dimensions.

    Args:
        lhs: Left-hand side tensor
        rhs: Right-hand side tensor
        sum_dims: Dimensions to sum over (contract)

    Returns:
        Result of dot product
    Fr   Nz*Cannot perform dot product on None tensorsc                    | v }||   nd}|
|   nd}|rj                  |        y|dk(  |dk(  k(  r	j                  |        y|dk7  rj                  |        yj                  |        y)z?Insert dimension into appropriate part based on stride pattern.Nr   )rH   )r0   lhs_idxrhs_idxreduced
lhs_stride
rhs_stridelhs_strideslo_dimslr_dimslro_dimsrhs_stridesro_dimssum_dimss         r   
insert_dimzdot.<locals>.insert_dim  sx    x--4-@[)a
-4-@[)a
NN1aZ1_5"qq!q!r   Tz$summing over non-existent dimension r   )r0   r   r  r   r  r   r:   r   )r   r   r   matmulr   r  r  r;   r   r[   rP   rF   r  bmmr  mm)lhsrhsr  r   r   r  rhs_seenr2   	lhs_levelr  r:  	rhs_levelr0   
lhs_tensor
rhs_tensorrO   r  r  r  r  r  r  s     `             @@@@@@r   dotr  w  sW      U5QH  U5QH||C%%??&8??+F 4F //((*K//((*K yHiGiGiG" "" wX__--H "(//2 *9%hoo6 	LAyI%"		 	9a)* "(//2 +9{y$*+
 7<<CM) 	MA'AX__,D #Gs!KLL	M
 8==Q (GW!=xH
 (GW!=xH
:z28Wg6?? !'7!3X>
 '7!3X>
*j17G,f55r   )r)  )	wrap_typec                >   t        | t              rt        j                  | ||      S t        j                  | dd      }|j
                  J d       t        j                  |j
                  |j                  |j                        }t        j                  |||      S )a  
    Index a regular tensor by binding specified positions to dims.

    This converts a regular tensor to a first-class tensor by binding
    the specified positional dimensions to Dim objects.

    Args:
        positions: Tuple of dimension positions to bind
        dims: Dim objects or tuple of Dim objects to bind to

    Returns:
        First-class tensor with specified dimensions bound
    Fr   zCannot index None tensor)
rY   r   r  r   r   r   r   r   r   r   )r]   	positionsrP   r  rO   s        r   r  r    s     $ }}T9d33 T%ND ;;">$>>"##DKKdooNF ==D11r   c           	     t    t        t        j                  |       }t        t        | t        |g|i |       y r   )getattrr   r   setattrr   r)  )r#   r   r   r{  s       r   _defr    s-    5<<&DGT57778r   meanrr  allamaxaminaminmaxanycount_nonzero	logsumexpnanmeannansumprodstdr   )keepdim_offsetvarmax)
single_dimr  argmaxargminkthvaluemedian	nanmedianmodesortF)reduceargsortunbindchunk)
dim_offsetr  cummax)r  r  cummincumprodcumprod_cumsumcumsum_logcumsumexprenorm)r  r  r  r   )r   rS   r:   r   )r   rd  r:   rd  r   )r#   r   r$   Optional[int]r:   r    r   )rJ   r  r5   Optional[list[Optional[int]]]r:   r   )r#   r   r$   z)Optional[Union[int, list[Optional[int]]]]r:   rR   )rJ   r  r5   r  r:   z#Union[DimList, tuple[DimList, ...]])r   r   r   r   r:   r   )r   )r  r   r  r   rX   r9   r:   r   )r   r   r  r   rX   r   r:   rI   )r  r   rX   r   r  r   r:   r   )r  list[DotPart]r  r   r:   rd  )r  r   r  rd  r:   r   )r  r   r  r   r  r   r:   r  )r]   r   r  r   rP   r   r:   r   )r#   r   r   r   r   r   r:   r   )B
__future__r   disr<   rB   typingr   r   r   r   collections.abcr   r	   r   torch.utils._pytreer
   r   r   r'  r   r   r   _enable_all_layersr   _py_inst_decoderr   _tensor_infor   r   r   rQ  r   r   r%   rP   rR   r   r   	Exceptionr   rd    r   r   r   r   
TensorLiker    r   r   r  r  r  r  r  functorch.dim._wrapr)  functorch.dim.wrap_typer  r   r   r  r  nn
functionalr   r   r   r   <module>r     s   " 
  
 6 6 2  F F ? ? / , $   8

7 EI``$A` `FWE WEv BF
>$ EIVV$AV(Vr	Y 		 	 1BV BVJ u||$
K#' K#bhW hVAH}@;
4 4  0,V6r & - 
'5<<!;!; <L2<9
 V U U V V Y U _  [  Y X V U1  U1  Ut  Ut  X$  X$  ZD ! X$  [T " V  VE  Yu  X$  W5 ) X$u - X$u - Y4 . ZD / X$u - Y4 . ^U 3 X!U ; Y4 .
##++U
Kr   