
    Vht_                        U d dl  d dlZd dlmZmZ d dlmZ d dlmZ d dl	m
Z
 d a e
       Zddd	Zd
 Zdej                  fdZdej                  fdZd Z G d dej                        Z G d dej(                  j*                        Z G d dej(                  j*                        Zd Z	 	 d#deej                     deej                     deeej                  f   fdZdej                  dej                  dej                  deeej                  eej                     f   fdZdaeej                     ed<   dej                  fdZ 	 d$d Z!	 d$d!Z"	 d%d"Z#y)&    )*N)DispatchKeyDispatchKeySet)is_expandable_to)NestedIntNode)WeakTensorKeyDictionary   coeffc                   ddl m} ddlm}  ||       } t	        | |      r| j                  |      S t        j                  |       }|5t        j                  t        t        |            }t        dz  a|t        | <   |S )Nr   
FakeTensor)mb_unwrap_functional_tensorr
   r	   )torch._subclasses.fake_tensorr   #torch._subclasses.functional_tensorr   
isinstanceget_nested_int_tensor_symint_registrygettorchSymIntr   _tensor_id_counter)tensorr   r   r   tensor_symints        T/home/dcms/DCMS/lib/python3.12/site-packages/torch/nested/_internal/nested_tensor.pyget_tensor_symintr      s|    8O )0F&*%$$5$11 ,//7M]3Eu%MNa*7'    c                 @    t         | |      j                               S N)intitem)funcr   s     r   _get_sdpa_extreme_seqlenr#   #   s    tF|  "##r   returnc                 .    t        j                  | d      S Nr   )r   zeros)vals    r   _store_val_in_tensorr)   '   s    ;;sAr   tc                      | j                   d   S r&   shape)r*   s    r   _load_val_from_tensorr.   ,   s    771:r   c                     t        di | S )N )NestedTensor)constructor_kwargss    r   _rebuild_njtr3   1   s    -,--r   c                       e Zd ZU ej                  ed<   ej                  ed<   eej                     ed<   eedf   ed<   eedf   ed<   eed<   e	e
ef   ed<   ed	d
d       Zd	d
 fd
Zd Zd Zd Zd Zd Zedeej                     fd       Zedeej                     fd       Zed        Zed        Zedee   fd       Zedee   fd       Zd Zd Zd Zede	fd       Zed d       Z ed d       Z! xZ"S )!r1   _values_offsets_lengths._size_strides_ragged_idx_metadata_cacheN)lengthsc                b   t        t        j                        }|j                  t        j                        }|J |j
                  dk(  sJ t        |t              rJ |j                  |j                  k(  sJ ||n|}t        |d      }|j                  dd      }|j                  d   dz
  }	||	|j                  d   k(  sJ |dz
  }
|	g|j                  d |
 ||j                  |
dz   d  }|j                         }|||
   z  g|}t        j                  j                  | ||dt        j                  |j                   t        j"                  |j                  d|j                  dd      ddd||j%                         j'                         	      }
||
_        ||
_        ||
_        |
S )
Nr	   r
   r:   r   Frequires_gradsizesT)storage_size)r   r   r1   addAutogradNestedTensorndimr   devicer   r   r-   strider   Tensor_make_wrapper_subclasscontiguous_formatdtypejaggeduntyped_storagesizer:   r8   r9   )clsvaluesoffsetsr<   kwargsksragged_sourceragged_sizer:   Brr8   rE   r9   s                 r   __new__zNestedTensor.__new__M   s    K445VVK445 """||q   fl333}}... $+?'Q?jj2MM!q a(((( !OKV\\"1%K{KV\\!a%'5JK&)+5f5LL//##LLLLMMJJ.//1668! 0 
$ $
r   c                <   t         |           || _        || _        || _        |j                  d      xs i | _        t        j                  j                  | | j                         t        j                  j                  | j                  | j                  dz
         | j                  j                  dd       }| t        j                  j                  |d       | j                  j                  dd       }|!t        j                  j                  |d       y y )Nr;   r	   
max_seqlenr   
min_seqlen)super__init__r5   r6   r7   r   r;   r   _dynamomaybe_mark_dynamicr:   mark_dynamic)selfrN   rO   r<   rP   max_seqlen_tensormin_seqlen_tensor	__class__s          r   r[   zNestedTensor.__init__   s      &zz*;<B 	((t/?/?@((t7G7G!7KL !0044\4H(MM&&'8!< 0044\4H(MM&&'8!< )r   c                 ,    t        j                  |       S r   )r   _nested_get_valuesr_   s    r   rN   zNestedTensor.values   s    ''--r   c                     | j                   S r   )r6   re   s    r   rO   zNestedTensor.offsets       }}r   c                     | j                   S r   )r7   re   s    r   r<   zNestedTensor.lengths   rg   r   c                     | j                   }|dt        t        j                  | j                  | j
                  j                         n| j                        }t        |      }|| j                  d<   t        |      S NrX   )
_max_seqlen_tensorr#   r   maxr7   r6   diffr)   r;   r.   )r_   r`   max_vals      r   _get_max_seqlenzNestedTensor._get_max_seqlen   m     33$.		(,(=""$4==G !5W =1BD  .$%677r   c                     | j                   }|dt        t        j                  | j                  | j
                  j                         n| j                        }t        |      }|| j                  d<   t        |      S NrY   )
_min_seqlen_tensorr#   r   minr7   r6   rm   r)   r;   r.   )r_   ra   min_vals      r   _get_min_seqlenzNestedTensor._get_min_seqlen   rp   r   r$   c                 :    | j                   j                  dd       S rj   r;   r   re   s    r   rk   zNestedTensor._max_seqlen_tensor       ##''d;;r   c                 :    | j                   j                  dd       S rr   rx   re   s    r   rs   zNestedTensor._min_seqlen_tensor   ry   r   c                 "    | j                         S r   )ro   re   s    r   _max_seqlenzNestedTensor._max_seqlen       ##%%r   c                 "    | j                         S r   )rv   re   s    r   _min_seqlenzNestedTensor._min_seqlen   r}   r   c                 8    | j                   }|d S t        |      S r   )rk   r.   r_   mts     r   _maybe_max_seqlenzNestedTensor._maybe_max_seqlen   "    $$zt@'<R'@@r   c                 8    | j                   }|d S t        |      S r   )rs   r.   r   s     r   _maybe_min_seqlenzNestedTensor._maybe_min_seqlen   r   r   c                     | j                   rd| j                    nd}| j                  rd| j                   }d| j                   d| j                   | d| j                  d u  dS )Nz, requires_grad= z
, grad_fn=zNestedTensor(size=z
, offsets=z, contiguous=))r>   grad_fnr8   r6   r7   )r_   grad_fn_strs     r   __repr__zNestedTensor.__repr__   su     8<7I7It1123r 	 <<&t||n5K#DJJ<z$--Ubcgcpcptxcxbyyz{{r   c                    t         j                  j                  |       }| j                          d|v rd|v sJ t	        |      }|d= |d= t
        }| j                  | j                  | j                  | j                  | j                  | j                  d}|f}t         j                  j                  |t        |       ||ffS )Nr8   r9   )rN   rO   r<   r:   r;   r>   )r   _utils_get_obj_state#_clear_non_serializable_cached_datadictr3   r5   r6   r7   r:   r;   r>   _tensor_rebuild_from_type_v2type)r_   protostater"   r2   argss         r   __reduce_ex__zNestedTensor.__reduce_ex__   s    ++D1 	002%J%$777U'N*ll}}}}++#33!//
 #$33dDJe5TUUr   c                     | j                   | j                  d}ddg}| j                  |j                  d       | j                  |j                  d       | j
                  |j                  d       ||fS )N)r>   
ragged_idxr5   r6   r7   rs   rk   )r>   r:   r7   appendrs   rk   )r_   ctxinner_tensorss      r   __tensor_flatten__zNestedTensor.__tensor_flatten__  s    !//**
 #J/==$  ,"".  !56"".  !56c!!r   r   c                 X   ddl m} t        |       dk\  rt        |       dk  sJ | d   }| d   }| j                  dd       }| j                  dd       }| j                  d	d       }	i }
|||
d
<   |	|	|
d<   |d   }||n|}t	        ||      r||   }||_        t        ||||d   ||
      S )Nr   r         r5   r6   r7   rs   rk   rY   rX   r   r>   )rO   r<   r>   r:   r;   )r   r   lenr   r   nested_int_memor1   )r   meta
outer_sizeouter_strider   rN   rO   r<   ra   r`   metadata_cacher   rR   rS   s                 r   __tensor_unflatten__z!NestedTensor.__tensor_unflatten__  s    < =!Q&3}+=+BBBy)
+##J5)--.BDI)--.BDI(+<N<((+<N<(,'
 $+?mZ0$Z0K,7M)/"*
 	
r   c                    |i n|}ddl m}  ||g|i |}| ||i |S t        j                  j                  j
                  t        j                  j                  j                  f}|D ]p  }t        j                  j                  |j                         |      s2t        j                  j                         5   |j                  |g|i |cd d d        c S  t        |      # 1 sw Y   xY w)Nr	   )lookup_jagged)opsr   r   _Cr   %CompositeImplicitAutogradNestedTensorCompositeImplicitAutograd%_dispatch_has_kernel_for_dispatch_keyname	overridesenable_reentrant_dispatch_op_dkNotImplementedError)	rM   r"   typesr   rP   r   fnall_dksdks	            r   __torch_dispatch__zNestedTensor.__torch_dispatch__9  s     ~6 	'41$1&1>t&v&& HH  FFHH  ::
  	<Bxx==diik2N__>>@ <&4;;r;D;F;< <	<
 "$''< <s   =C++C4	c                 2   |i }ddl m} ddlm}  |       5  	  ||g|i |cd d d        S # t        $ r Y nw xY wt
        j                  j                         5   ||i |cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        y # 1 sw Y   y xY w)Nr   )maybe_enable_thunkifyr	   )jagged_torch_function)"torch.fx.experimental.proxy_tensorr   r   r   r   r   r   DisableTorchFunctionSubclass)rM   r"   r   r   rP   r   r   s          r   __torch_function__zNestedTensor.__torch_function__V  s    >FL. #$ 	-,TCDCFC	- 	- ' 668 -T,V,- -	- 	-
- - -	- 	- 	-s9   B/	;B;!BA7$	B7B 	<BB)r0   N)#__name__
__module____qualname__r   rF   __annotations__Optionaltupler    DictstrAnystaticmethodrV   r[   rN   rO   r<   ro   rv   propertyrk   rs   r|   r   r   r   r   r   r   r   classmethodr   r   __classcell__)rb   s   @r   r1   r1   5   s   \\llu||$$ c?CHo#s(^# 6 6p 48 =,.
8
8 <HU\\$: < < <HU\\$: < <
 & & & &
 A8C= A A A8C= A A|V0"  
D  
  
D ( (8 - -r   r1   c                   L    e Zd Zedefd       Zedej                  fd       Zy)ViewBufferFromNestedxc                     | j                  |j                                |j                  | _        |j                  | _        |j                  S r   )save_for_backwardrO   r;   r   r:   r   r5   )r   r   s     r   forwardzViewBufferFromNested.forwardq  s9    aiik*..yyr   gOc                 d    | j                   \  }t        ||| j                  | j                        S )N)rO   r;   r:   )saved_tensorsr1   r   r   )r   r   rO   s      r   backwardzViewBufferFromNested.backwardx  s2    &&
..	
 	
r   N)	r   r   r   r   r1   r   r   rF   r   r0   r   r   r   r   p  s:       
%,, 
 
r   r   c                   |    e Zd Ze	 ddej
                  dej
                  deeee	f      fd       Z
edefd       Zy)	ViewNestedFromBufferNrN   rO   r   c                 .   |x|j                  dd       }|j                  dd       }|(t        |t        j                        st	        |      |d<   |(t        |t        j                        st	        |      |d<   t        |j                         ||      S )NrY   rX   )rO   r;   )r   r   r   rF   r)   r1   detach)r   rN   rO   r   rY   rX   s         r   r   zViewNestedFromBuffer.forward  s     %'++L$?J'++L$?J%jU\\.R/CJ/O|,%jU\\.R/CJ/O|,MMO*
 	
r   r   c                      |j                   d d fS r   )r5   )r   r   s     r   r   zViewNestedFromBuffer.backward  s    zz4%%r   r   )r   r   r   r   r   rF   r   r   r   r   r   r1   r   r0   r   r   r   r     se    
 48	

 
 !c3h0	
 
* &, & &r   r   c                 ,    t         j                  |       S r   )r   apply)rJ   s    r   buffer_from_jaggedr     s    %%f--r   tensorsrO   c                 B   t        |       dk(  rt        d      t        t        d | D                    dk(  st        d      t        t        d | D                    dk(  st        d      t        t        d | D                    dk(  st        d	      | d   j                         }|dk(  rt        d
      | D cg c]  }|j                   c}dt        |      D ],  t        fdD              }|sdz   #t        d       dt        j                  | dz
        }i }|||d<   |||d<    |j                  di |}|t        j                  t        j                  dt        j                  |j                        t        j                  D 	cg c]
  }	|	dz
      c}	|j                        j                  d      g      }t        fd| D              }
t!        fd| D              }t#        |||
|      }||fS c c}w c c}	w )zHConstructs a NestedTensor backed by jagged layout from a list of tensorsr   z:Cannot construct a nested tensor from an empty tensor listc              3   4   K   | ]  }|j                     y wr   )rI   .0r*   s     r   	<genexpr>z#jagged_from_list.<locals>.<genexpr>  s     ,q177,   r	   zOWhen constructing a nested tensor, all tensors in list must have the same dtypec              3   4   K   | ]  }|j                     y wr   rD   r   s     r   r   z#jagged_from_list.<locals>.<genexpr>  s     -188-r   zQWhen constructing a nested tensor, all tensors in list must be on the same devicec              3   <   K   | ]  }|j                           y wr   dimr   s     r   r   z#jagged_from_list.<locals>.<genexpr>  s     ,q1557,s   zMWhen constructing a nested tensor, all tensors in list must have the same dimz@Cannot construct a nested tensor from a list of zero-dim tensorsNc              3   :   K   | ]  }|   d       k7    yw)r   Nr0   )r   rL   dr?   s     r   r   z#jagged_from_list.<locals>.<genexpr>  s"     EtDGuQx{2Es   zCannot represent given tensor list as a nested tensor with the jagged layout. Note that the jagged layout only allows for a single ragged dimension. For example: (B, *, D_0, D_1, ..., D_N), with ragged * dim.r   rD   rI   rI   rD   r   c              3   B   K   | ]  }|j                   d z
       ywr	   Nr,   r   r*   r   s     r   r   z#jagged_from_list.<locals>.<genexpr>       >QWWZ!^,>   c              3   B   K   | ]  }|j                   d z
       ywr   r,   r   s     r   r   z#jagged_from_list.<locals>.<genexpr>  r   r   )rY   rX   r   r0   )r   RuntimeErrorsetr   r-   rangeanyr   cattor'   int64rD   r   cumsumrt   rl   nested_view_from_values_offsets)r   rO   rI   rD   component_dimr*   dim_is_raggedrN   	to_kwargssrY   rX   ret_ntr   r   r?   s                @@@r   jagged_from_listr    s>    7|qWXXs,G,,-2]
 	
 s-W--.!3_
 	
 s,G,,-2[
 	
 AJNN$MN
 	
 &&QWW&EJ=! EuEE!U
"R  
 YYwZ!^5FI$	("	'VYY##F  ))AU[[G0561QzA~&6v}}&Q&-	
 >g>>J>g>>J,F Gi 'J 7s   ?H$Hr   startsr<   c                    | j                   d   }t        |j                   |f      r:t        |j                   |f      r#|j                  |      }|j                  |      }nt        d      t	        | j                         dk\  sJ d       | j                   d   }|t        j                  d|t
        j                  | j                        z  }t        j                  ||z   |d   |d   z   |d   z   j                  d      g      }t	        | j                         dkD  r! | j                  dg| j                   dd  }	n| j                  d      }	d	}
| j                   d   }t        j                  |dd j                  |            rd
}
t        j                  |dd j                         j                  |            rd
}
|d   |d   z   |k7  rd
}
t        t        j                   |      j#                               }t        t        j$                  |      j#                               }|
rt'        |	|d   |d    ||d   z
  ||      }nt)        |	||||      }|||
rdfS |fS )zjConstructs a NestedTensor backed by jagged layout from a tensor, starts of sequences, and sequence lengthsr   zWhen constructing a jagged nested tensor using narrow(), your start and length must be Tensors that broadcast to input.shape[0]r   z;tensor must at least be 2D for the nested narrow op to workr	   r   NTF)rY   rX   )r-   r   expandr   r   r   aranger   rD   r   	unsqueezeviewr   nerm   r    rl   r!   rt   r   'nested_view_from_values_offsets_lengths)r   r  r<   
batch_size
start_listlength_listmax_seq_lenoffset_lengthsrO   rN   is_contiguousorig_dimactual_max_seqlenrY   r  s                  r   jagged_from_tensor_and_lengthsr    sY    aJzm49I
}: ]]:.
nnZ0U
 	
 	FLLQEDE,,q/K 5<<	:U[[$ N ii'^nR00;r?BMMaP	
G 6<<1R3&,,qr"23R M||AHyyQr"%%h/0yy2##%((23qzKN"h.EIIg.3356UYYw',,./J071:,gaj !(	
 9!(
 G]TDDDDr   _dummy_instancec                      t         Ut        t        j                  ddd      t        j                  ddt        j                              j                         a t         S )N   r   r   )rD   rI   )rN   rO   )r  r1   r   r'   r   r   r0   r   r   _nt_view_dummyr  H  sJ    &;;q!F3KK&D
 &( 	 r   c           	          d }|t        |      }d }|t        |      }t        j                  | |t               d |||      S r   r)   r   _nested_view_from_jaggedr  )rN   rO   r   rY   rX   ra   r`   s          r   r   r   R  s]     0<0<)) r   c           	          d }|t        |      }d }|t        |      }t        j                  | |t               ||||      S r   r  )rN   rO   r<   r   rY   rX   ra   r`   s           r   r  r  h  s]     0<0<)) r   c           	          d }|t        |      }d }|t        |      }t        j                  | |t               ||||      S r   )r)   r   _nested_from_padded_tensorr  )paddedrO   r   rY   rX   sum_Sra   r`   s           r   nested_from_paddedr"  ~  s]     0<0<++ r   )NN)r	   NN)r	   NNN)$typingr   torch._Cr   r   torch._prims_commonr   !torch.nested._internal.nested_intr   torch.utils.weakr   r   r   r   r#   rF   r)   r.   r3   r1   autogradFunctionr   r   r   Listr   r   r  r  r  r   r  r   r  r"  r0   r   r   <module>r+     s     0 0 ; 4  13  () ($ 
U\\ 
.r-5<< r-v	
5>>22 
(&5>>22 &8. 	S%,,Sell#S
 <%&SlCELLCE"',,CE9>CE
<x'==>CET +/%,,' .  @D. IM. LPr   