
    /jK                       d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZ d dlmZmZ d dlZd dlmZ d dlmZ d d	lmZmZmZmZmZ d d
lmZmZmZmZmZ erd dlm Z m!Z!  ed          Z" ed          Z#e$e%e	df         z  Z&e$e%e$df         z  dz  Z'dcdZ(dddZ)dedZ*dfd"Z+dgd*Z,dhd.Z-did7Z.djd:Z/dkd=Z0dld>Z1dmd?Z2dndFZ3dodIZ4dpdKZ5dqdNZ6drdSZ7dsdUZ8dtdVZ9ej:        dudX            Z;dvdZZ<dwd]Z=dxd`Z>dydbZ?dS )z    )annotationsN)Callable)partial)AnycastNoReturnTYPE_CHECKING)	ParamSpecTypeVar)Tensor)is_batchedtensor)_add_batch_dim_remove_batch_dim_vmap_decrement_nesting_vmap_increment_nestinglazy_load_decompositions)_broadcast_to_and_flattentree_flatten	tree_map_tree_unflattenTreeSpec)	GeneratorIterable_P_R.fCallable[_P, _R]returnc                P     dt          j                   d	 fd            }|S )
Nzvtorch.func.{grad, vjp, jacrev, hessian} don't yet support saved tensor hooks. Please open an issue with your use case.args_P.argskwargs	_P.kwargsr   r   c                     t           j        j                                      5   | i |cd d d            S # 1 swxY w Y   d S N)torchautogradgraphdisable_saved_tensors_hooks)r    r"   r   messages     Z/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/_functorch/vmap.pyfnz.doesnt_support_saved_tensors_hooks.<locals>.fn5   s    ^!==gFF 	& 	&1d%f%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   ;??)r    r!   r"   r#   r   r   )	functoolswraps)r   r,   r*   s   ` @r+   "doesnt_support_saved_tensors_hooksr/   /   sO    	3 
 _Q& & & & & & & I    flat_in_dimslist[int | None]	flat_args	list[Any]intc                    d t          | |          D             t                    dk    rt          d          r.t          fdD                       rt          d d          d         S )Nc                B    g | ]\  }}||                     |          S r%   )size).0in_dimargs      r+   
<listcomp>z0_validate_and_get_batch_size.<locals>.<listcomp>A   s8       FC 	r0   r   z/vmap: Expected at least one Tensor to vmap overc              3  0   K   | ]}|d          k    V  dS )r   N )r9   r8   batch_sizess     r+   	<genexpr>z/_validate_and_get_batch_size.<locals>.<genexpr>H   s,      JJd4;q>1JJJJJJr0   zTvmap: Expected all tensors to have the same size in the mapped dimension, got sizes z for the mapped dimension)ziplen
ValueErrorany)r1   r3   r?   s     @r+   _validate_and_get_batch_sizerE   >   s     |Y77  K
 ;1JKKK 
sJJJJkJJJJJ 
K$/K K K
 
 	
 q>r0   batched_outputsTensor | tuple[Tensor, ...]c                N    t          | t                    rt          |           S dS )N   )
isinstancetuplerB   )rF   s    r+   _num_outputsrL   P   s'    /5)) $?###1r0   valuetuple[_R, ...] | _Rnum_elementserror_message_lambdaCallable[[], str]tuple[_R, ...]c                    t          | t                    s| f|z  S t          |           |k    rt           |                      | S r%   )rJ   rK   rB   rC   )rM   rO   rP   s      r+   	_as_tuplerT   Z   sQ    
 eU## 'x,&&
5zz\!!--//000Lr0   in_dims	in_dims_tr    tuple[Any, ...]funcCallable[..., Any]1tuple[int, list[int | None], list[Any], TreeSpec]c                   t          | t                    sHt          | t                    s3t          dt	          |           d|  dt          |            d          t          |          dk    r t          dt	          |           d          t          |          \  }}t          | |          }|<t          dt	          |           d|  dt          |           d          d	| d	          t          t          ||                    D ]`\  }\  }}t          |t                    s(|&t          dt	          |           d|  d
| d          t          |t                    rKt          |t                    s6t          dt	          |           d|  d
| dt          |           d	          |||                                 k     s||                                k    ret          dt	          |           d|  d
| d|                                 d|                                 d|                                 d          | |dk     r||                                z  ||<   bt          ||          |||fS )Nvmap(z
, in_dims=zv, ...)(<inputs>): expected `in_dims` to be int or a (potentially nested) tuple matching the structure of inputs, got: .r   z)(<inputs>): got no inputs. Maybe you forgot to add inputs, or you are trying to vmap over a function with no inputs. The latter is unsupported.zb, ...)(<inputs>): in_dims is not compatible with the structure of `inputs`. in_dims has structure rI   z but inputs has structure z, ...)(<inputs>): Got in_dim=zE for an input but in_dim must be either an integer dimension or None.z' for an input but the input is of type zT. We cannot vmap over non-Tensor arguments, please use None as the respective in_dimz> for some input, but that input is a Tensor of dimensionality z  so expected in_dim to satisfy -z <= in_dim < )rJ   r5   rK   rC   	_get_nametyperB   r   r   	enumeraterA   r   dimrE   )	rU   r    rX   r3   	args_specr1   ir;   r:   s	            r+   _process_batched_inputsrd   f   sQ    gs## 
Jw,F,F 
GIdOO G Gw G G6:7mmG G G
 
 	

 4yyA~~*IdOO * * *
 
 	
 (--Iy,Wi@@L*IdOO * *w * *%1'%:%:1%=* * '* * *
 
 	
 &c)\&B&BCC 1 1=C&#&& 	6+=1	$ 1 17 1 1$1 1 1  
 fc"" 	:c6+B+B 	<	$ < <7 < <$< <99< < <   6SWWYYJ#6#6&CGGII:M:M9	$ 9 97 9 9$9 9%(WWYY9 9 GGII9 9 -0GGII9 9 9   &1**$swwyy0LO 	%\9==	 r0   
vmap_levelrb   r   c                \    fdt          | |          D             }t          ||          S )Nc                @    g | ]\  }}||nt          ||          S r%   )r   )r9   r:   r;   re   s      r+   r<   z*_create_batched_inputs.<locals>.<listcomp>   sA       FC ~>#vz#J#J  r0   )rA   r   )r1   r3   re   rb   batched_inputss     `  r+   _create_batched_inputsri      sG       |Y77  N .)444r0   namestrbatched_outputr   
batch_sizeout_dim
int | Nonetorch.Tensorc           
     ,   |At          |t          j                  r%t          |          rt	          d|  d|  d          |S t          |t          j                  s&t	          d|  d|  dt          |           d          t          ||||          S )Nr\   z	, ...): `z5` can not return a BatchedTensor when out_dim is Nonez%` must only return Tensors, got type z3. Did you mean to set out_dims= to None for output?)rJ   r&   r   r   rC   r_   r   )rj   rl   re   rm   rn   s        r+   _maybe_remove_batch_dimrr      s     nel33 	8H9
 9
 	 6 6 6t 6 6 6    nel33 
@D @ @4 @ @!%n!5!5@ @ @
 
 	
 ^ZWMMMr0   out_dims
out_dims_tc                  
 t          |           \  }
d
fd}g }t          | t          j                  rbt          t                    rg}nht          t
                    r#t                    dk    rt                    }n0g}n* |             nt          
          }| |             n|}fdt          ||          D             }	t          |	
          S )Nr   r   c                 |    t          dt                      d dt                    d          d d	          )Nr\   , ..., out_dims=z`)(<inputs>): out_dims is not compatible with the structure of `outputs`. out_dims has structure rI   z but outputs has structure r]   )rC   r^   r   )rX   rs   output_specs   r+   incompatible_errorz+_unwrap_batched.<locals>.incompatible_error   sf    ,IdOO , ,X , ,&28&<&<Q&?, , ), , ,
 
 	
r0   rI   c           	     V    g | ]%\  }}t          t                    ||          &S r>   )rr   r^   )r9   rl   rn   rm   rX   re   s      r+   r<   z#_unwrap_batched.<locals>.<listcomp>   sJ        $NG 	 dOO^ZW	
 	
  r0   )r   r   )r   rJ   r&   r   r5   rK   rB   listr   rA   r   )rF   rs   re   rm   rX   flat_batched_outputsry   flat_out_dimsbroadcast_resultflat_outputsrx   s    ````     @r+   _unwrap_batchedr      sJ    )5_(E(E%+
 
 
 
 
 
 
 
 ')M/5<00 - h$$ 	!%JMM%(( 	!S]]a-?-? NNMM%JMM    4X{KK#    ,M      (++?'O'O	  L ,444r0   xNonec                ~    t          | t                    rd S | d S t          dt          |           d| d          )Nr\   rw   z): `out_dims` must be an int, None or a python collection of ints representing where in the outputs the vmapped dimension should appear.)rJ   r5   rC   r^   )r   rX   rs   s      r+   _check_int_or_noner      s]    !S y
	,	$ 	, 	, 	, 	, 	,  r0   c                ~    t          | t                    rd S t          t          t          ||           |            d S )N)rX   rs   )rJ   r5   r   r   r   )rs   rX   s     r+   $_check_out_dims_is_int_or_int_pytreer   	  sA     (C   g(thGGGRRRRRr0   c                    t          | d          r| j        S t          | t          j                  rdt          | j                   dS t          |           S )N__name__zfunctools.partial(z, ...))hasattrr   rJ   r-   r   r^   rX   repr)rX   s    r+   r^   r^     s[    tZ   }$	)** A@Idi$8$8@@@@
 ::r0   )Callable[_P, Tensor | tuple[Tensor, ...]]
randomness
chunk_sizer!   r"   r#   c           	         t                       t          ||            t          |||           \  }}}	}
|$t          |	|||          }t	          | |||
||fi |S t          | |||	|
||fi |S r%   )r   r   rd   _get_chunked_inputs_chunked_vmap
_flat_vmap)rX   rU   rs   r   r   r    r"   rm   r1   r3   rb   chunks_flat_argss               r+   	vmap_implr     s     (48885Lt6 62Ji .|Z
 
 
 
 
 
 	
 	 	 	 	 	r0   total_elems	list[int]c                \    | |z  }|g|z  }| |z  }|dk    r|                     |           |S )Nr   )append)r   r   n_chunkschunk_sizes	remainders        r+   get_chunk_sizesr   H  sE    j(H,)Kj(IA~~9%%%r0   Iterable[tuple[Any, ...]]c                    |f|1t          ||          }t          t          j        |                    t          fdt	          | |          D                       }t	          | }|S )Nc              3  v   K   | ]3\  }}||                     |          n|gt                    z  V  4d S )Nra   )tensor_splitrB   )r9   tr:   
split_idxss      r+   r@   z&_get_chunked_inputs.<locals>.<genexpr>]  sr       
 
 Av ! NN:6N222  *oo	
 
 
 
 
 
r0   )r   rK   	itertools
accumulaterA   )r3   r1   rm   r   r   flat_args_chunksr   r   s          @r+   r   r   R  s     J%j*==9/<<==
 
 
 
 
 Y55
 
 
 
 
 ,-r0   chunks_output_&tuple[list[tuple[Any, ...]], TreeSpec]c                    g }d }| D ]-}t          |          \  }}|                    |           ||}.t          t          |           }|t	          d          ||fS )Nzarg_spec must not be None)r   r   r{   rA   AssertionError)r   flat_chunks_outputarg_specoutputflat_output	arg_specsflat_output_chunkss          r+   _flatten_chunks_outputr   o  s    
 +- $H  ! !!-f!5!5Y!!+... H c#56778999x''r0   r   r   list[tuple[Any, ...] | None]list[Tensor]c                   t          | |          }|t          d          t          |          t          |          k    r/t          dt          |           dt          |                     g }t          |          D ]P\  }}||         }|t          d| d          |                    t          j        ||                     d ||<   Q|S )Nzflat_out_dims must not be Nonezlen(flat_out_dims)=z != len(flat_output_chunks)=zchunk at index z must not be Noner   )r   r   rB   r`   r   r&   cat)rs   r   r   r}   r   idxrn   chunks           r+   _concat_chunked_outputsr     s     .hAAM=>>>
=S!34444k#m"4"4kkRUVhRiRikk
 
 	
 !#K!-00 ' 'W"3'= !I3!I!I!IJJJ59U888999"&3r0   r   c                   g }|dk    rt          j                    nd }|D ]d}	t          |	          }
t          ||
          }|dk    r(|t          j        |           |                    t          | |||
|||fi |           et          |          \  }}~t          ||t          t          t          t          df         d z           |                    }t          ||          S )Nsamer   .)r&   get_rng_stater{   rE   set_rng_stater   r   r   r   r   rK   r   r   )rX   r1   r   rb   rs   r   r"   chunks_outputrsflat_args_tupler3   rm   r   r   r   s                  r+   r   r     s$     "M","6"6				DB+ 
 
))	1,	JJ
 ??>###	 	 	 		
 	
 	
 	
 $:-#H#H  	
 *(DeCHo&<!=?QRR K
 +x000r0   c                2    | dvrt          d|            d S )N)error	differentr   zLOnly allowed values for randomness are 'error', 'different', or 'same'. Got )RuntimeError)r   s    r+   _check_randomness_argr     s4    777g[egg
 
 	
 87r0   Generator[int, None, None]c              #  v   K   	 t          | |          }|V  t                       d S # t                       w xY wr%   )r   r   )rm   r   re   s      r+   vmap_increment_nestingr     sK      ",ZDD
!!!!!!!!!s   ( 8*Callable[..., Tensor | tuple[Tensor, ...]]c                    t          ||          5 }t          ||||          }	 | |	i |}
t          |
||||           cd d d            S # 1 swxY w Y   d S r%   )r   ri   r   )rX   rm   r1   r3   rb   rs   r   r"   re   rh   rF   s              r+   r   r     s     
 
J	7	7 X:/)Z
 
 $9&99*jRVWWX X X X X X X X X X X X X X X X X Xs   -AAACallable[..., _R]Callable[..., tuple[Any, Any]]c                      d fd}|S )Nr    r   r"   r   tuple[Any, Any]c                     t                    5 }t          | |          } |i |}t          ||          cd d d            S # 1 swxY w Y   d S r%   )r   wrap_batchedunwrap_batched)	r    r"   re   rh   rF   rm   rX   rU   r   s	        r+   innerzrestore_vmap.<locals>.inner  s    #J
;; 	?z)$DDN"dN=f==O!/:>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?s   )AAA)r    r   r"   r   r   r   r>   )rX   rU   rm   r   r   s   ```` r+   restore_vmapr     s:    ? ? ? ? ? ? ? ? ? Lr0   bdimslevelc                    t          |           \  }}t          ||          }|t          d          t          ||||          }|S )Nzflat_bdims must not be None)r   r   r   ri   )r    r   r   r3   spec
flat_bdimsresults          r+   r   r     sQ     #4((OIt*5$77J:;;;#J	5$GGFMr0   r   c                    t          |           \  }}t          |          dk    r| dfS fd|D             }t          | \  }}t          ||          t          ||          fS )Nr   r>   c                    g | ]E}t          |t          j                  r%t          j        j                            |          n|d fFS r%   )rJ   r&   r   _C
_functorchr   )r9   r;   r   s     r+   r<   z"unwrap_batched.<locals>.<listcomp>.  s]         #u|,,EH//U;;;t	  r0   )r   rB   rA   r   )r    r   r3   r   r   r   r   s    `     r+   r   r   *  s    "4((OIt
9~~Rx      F LMFE&$''t)D)DDDr0   )r   r   r   r   )r1   r2   r3   r4   r   r5   )rF   rG   r   r5   )rM   rN   rO   r5   rP   rQ   r   rR   )rU   rV   r    rW   rX   rY   r   rZ   )
r1   r2   r3   r4   re   r5   rb   r   r   rW   )rj   rk   rl   r   re   r5   rm   r5   rn   ro   r   rp   )rF   rG   rs   rt   re   r5   rm   r5   rX   rY   r   rW   )r   r   rX   rY   rs   rt   r   r   )rs   rt   rX   rY   r   r   )rX   rY   r   rk   )rX   r   rU   rV   rs   rt   r   rk   r   ro   r    r!   r"   r#   r   r   )r   r5   r   r5   r   r   )
r3   r4   r1   r2   rm   r5   r   ro   r   r   )r   r4   r   r   )rs   rt   r   r   r   r   r   r   )rX   r   r1   r2   r   r   rb   r   rs   rt   r   rk   r"   r   r   r   )r   rk   r   r   )rm   r5   r   rk   r   r   )rX   r   rm   r5   r1   r2   r3   r4   rb   r   rs   rt   r   rk   r"   r   r   r   )
rX   r   rU   rV   rm   r5   r   rk   r   r   )r    rW   r   rV   r   r5   r   rW   )r    r   r   r5   r   r   )@
__future__r   
contextlibr-   r   collections.abcr   r   typingr   r   r   r	   typing_extensionsr
   r   r&   r   torch._C._functorchr   torch._functorch.predispatchr   r   r   r   r   torch.utils._pytreer   r   r   r   r   r   r   r   r   r5   rK   rV   rt   r/   rE   rL   rT   rd   ri   rr   r   r   r   r^   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r   r>   r0   r+   <module>r      s   # " " " " "             $ $ $ $ $ $       5 5 5 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0        0 0 0 0 0 0                            433333333 Yt__WT]]%S/!	5c?"T)
      $   	 	 	 	7 7 7 7~5 5 5 5N N N N:*5 *5 *5 *5Z	 	 	 	S S S S
 
 
 
' ' ' 'T      :( ( ( (*   491 91 91 91z
 
 
 
 " " " "X X X XL	 	 	 	   E E E E E Er0   