
    9jK                    4   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'd&dZ(	 	 	 	 	 	 d'dZ)d(dZ*	 	 	 	 	 	 	 	 d)dZ+	 	 	 	 	 	 	 	 d*dZ,	 	 	 	 	 	 	 	 	 	 d+dZ-	 	 	 	 	 	 	 	 	 	 	 	 d,dZ.	 	 	 	 	 	 	 	 	 	 	 	 d-dZ/d.dZ0	 	 	 	 	 	 d/dZ1d0dZ2	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d1dZ3d2dZ4	 	 	 	 	 	 	 	 	 	 d3dZ5	 	 	 	 d4dZ6	 	 	 	 	 	 	 	 d5dZ7	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d6dZ8d7d Z9ejt                  	 	 	 	 	 	 d8d!       Z;	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d9d"Z<	 	 	 	 	 	 	 	 	 	 d:d#Z=	 	 	 	 	 	 	 	 d;d$Z>d<d%Z?y)=    )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.c                L     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.c                     t         j                  j                  j                        5   | i |cd d d        S # 1 sw Y   y xY wN)torchautogradgraphdisable_saved_tensors_hooks)argskwargsfmessages     U/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_functorch/vmap.pyfnz.doesnt_support_saved_tensors_hooks.<locals>.fn5   s=    ^^!!==gF 	&d%f%	& 	& 	&s	   =A)r#   _P.argsr$   	_P.kwargsreturnr   )	functoolswraps)r%   r(   r&   s   ` @r'   "doesnt_support_saved_tensors_hooksr.   /   s1    	3 
 __Q& & I    c                    t        | |      D cg c]  \  }}||j                  |       c}}t              dk(  rt        d      r#t	        fdD              rt        d d      d   S c c}}w )Nr   z/vmap: Expected at least one Tensor to vmap overc              3  .   K   | ]  }|d    k7    yw)r   N ).0sizebatch_sizess     r'   	<genexpr>z/_validate_and_get_batch_size.<locals>.<genexpr>H   s     Jd4;q>1Js   zTvmap: Expected all tensors to have the same size in the mapped dimension, got sizes z for the mapped dimension)zipr4   len
ValueErrorany)flat_in_dims	flat_argsin_dimargr5   s       @r'   _validate_and_get_batch_sizer?   >   s    
 |Y7FC 	K
 ;1JKKsJkJJ$$/=0IK
 	
 q>s   A5c                :    t        | t              rt        |       S y)N   )
isinstancetupler8   )batched_outputss    r'   _num_outputsrE   P   s    /5)?##r/   c                n    t        | t              s| f|z  S t        |       |k7  rt         |             | S r   )rB   rC   r8   r9   )valuenum_elementserror_message_lambdas      r'   	_as_tuplerJ   Z   s;    
 eU#x,&&
5z\!-/00Lr/   c                   t        | t              s7t        | t              s't        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              r:t        |t              s*t        dt	        |       d|  d
| dt        |       d	      |x||j                          k  s||j                         k\  rQt        dt	        |       d|  d
| d|j                          d|j                          d|j                          d      ||dk  s	||j                         z  ||<   ! t        ||      |||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 rA   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 < )rB   intrC   r9   	_get_nametyper8   r   r   	enumerater7   r   dimr?   )	in_dimsr#   funcr<   	args_specr;   ir>   r=   s	            r'   _process_batched_inputsrW   f   sa    gs#Jw,FIdO$Jwi 866:7m_AG
 	

 4yA~IdO$ %) *
 	
 (-Iy,Wi@LIdO$Jwi 8%%1'%:1%=$> ?&Kq*
 	
 &c)\&BC 1=C&#&6+=	$(
7) <$X &01 
 fc":c6+B	$(
7) <$X%L9+ ;<  6SWWYJ#6&CGGI:M	$(
7) <$X &%%(WWYK 0GGI;mCGGI;a9  &1*$swwy0LO-12 	%\9=	 r/   c           	         t        | |      D cg c]  \  }}||nt        |||       }}}t        ||      S c c}}w r   )r7   r   r   )r;   r<   
vmap_levelrU   r=   r>   batched_inputss          r'   _create_batched_inputsr[      sR     |Y7FC ~>#vz#JJN  .)44	s   :c           
        |9t        |t        j                        rt        |      rt	        d|  d|  d      |S t        |t        j                        st	        d|  d|  dt        |       d      t        ||||      S )NrL   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?)rB   r   r   r   r9   rP   r   )namebatched_outputrY   
batch_sizeout_dims        r'   _maybe_remove_batch_dimra      s     nell38H9
 vYtf -5 6   nell3D64& )!!%n!5 6 7@@
 	
 ^ZWMMr/   c                   t        |       \  }dfd}g }t        | t        j                        rLt        t              rg}nPt        t
              rt              dk(  rt              }n&g}n  |        nt              }| |        n|}t        ||      D 	
cg c]  \  }	}
t        t              |	|||
       }}	}
t        |      S c c}
}	w )Nc                 ^    t        dt                d dt              d    d d	      )NrL   , ..., out_dims=z`)(<inputs>): out_dims is not compatible with the structure of `outputs`. out_dims has structure rA   z but outputs has structure rM   )r9   rO   r   )rT   out_dimsoutput_specs   r'   incompatible_errorz+_unwrap_batched.<locals>.incompatible_error   sJ    IdO$$4XJ ?&&28&<Q&?%@ A(M,
 	
r/   rA   )r+   r   )r   rB   r   r   rN   rC   r8   listr   r7   ra   rO   r   )rD   re   rY   r_   rT   flat_batched_outputsrg   flat_out_dimsbroadcast_resultr^   r`   flat_outputsrf   s    `  `       @r'   _unwrap_batchedrm      s     )5_(E%+
 ')M/5<<0 h$%JM%(S]a-? NM%JM 4X{K# ,M (++?'O	 $NG 	 dO^ZW	
L  ,44s   )"Cc                `    t        | t              ry | y t        dt        |       d| d      )NrL   rd   z): `out_dims` must be an int, None or a python collection of ints representing where in the outputs the vmapped dimension should appear.)rB   rN   r9   rO   )xrT   re   s      r'   _check_int_or_nonerp      sA    !Sy

	$  0
 ;+ 	, r/   c                ^    t        | t              ry t        t        t        ||       |        y )N)rT   re   )rB   rN   r   r   rp   )re   rT   s     r'   $_check_out_dims_is_int_or_int_pytreerr   	  s%     (C g(thGRr/   c                    t        | d      r| j                  S t        | t        j                        rdt        | j                         dS t        |       S )N__name__zfunctools.partial(z, ...))hasattrrt   rB   r,   r   rO   rT   repr)rT   s    r'   rO   rO     sK    tZ }}$	))*#Idii$8#9@@
 :r/   c           	         t                t        ||        t        |||       \  }}}	}
|t        |	|||      }t	        | |||
||fi |S t        | |||	|
||fi |S r   )r   rr   rW   _get_chunked_inputs_chunked_vmap
_flat_vmap)rT   rS   re   
randomness
chunk_sizer#   r$   r_   r;   r<   rU   chunks_flat_argss               r'   	vmap_implr~     s     (485Lt62Ji .|Z
 
 
 	
 	 	 	r/   c                R    | |z  }|g|z  }| |z  }|dk7  r|j                  |       |S )Nr   )append)total_elemsr|   n_chunkschunk_sizes	remainders        r'   get_chunk_sizesr   H  s=    j(H,)Kj(IA~9%r/   c                    |f|*t        ||      }t        t        j                  |            t        fdt	        | |      D              }t	        | }|S )Nc              3  l   K   | ]+  \  }}||j                  |      n|gt              z   - y w)NrR   )tensor_splitr8   )r3   tr=   
split_idxss      r'   r6   z&_get_chunked_inputs.<locals>.<genexpr>]  sQ      
 Av ! NN:6N2  *o
s   14)r   rC   	itertools
accumulater7   )r<   r;   r_   r|   r   flat_args_chunksr}   r   s          @r'   rx   rx   R  sh     J%j*=9//<=
 
 Y5
 
 ,-r/   c                    g }d }| D ]&  }t        |      \  }}|j                  |       |%|}( t        t        |       }|t	        d      ||fS )Nzarg_spec must not be None)r   r   rh   r7   AssertionError)chunks_output_flat_chunks_outputarg_specoutputflat_output	arg_specsflat_output_chunkss          r'   _flatten_chunks_outputr   o  sv    
 +- $H  !!-f!5Y!!+. H	! c#567899x''r/   c                X   t        | |      }|t        d      t        |      t        |      k7  r#t        dt        |       dt        |             g }t        |      D ]F  \  }}||   }|t        d| d      |j	                  t        j                  ||             d ||<   H |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   r8   rQ   r   r   cat)re   r   r   rj   r   idxr`   chunks           r'   _concat_chunked_outputsr     s     .hAM=>>
=S!344!#m"4!55QRUVhRiQjk
 	
 !#K!-0 'W"3'= ?3%7H!IJJ599U89"&3' r/   c                   g }|dk(  rt        j                         nd }|D ]W  }	t        |	      }
t        ||
      }|dk(  r |t        j                  |       |j                  t        | |||
|||fi |       Y t        |      \  }}~t        ||t        t        t        t        df   d z     |            }t        ||      S )Nsamer   .)r   get_rng_staterh   r?   set_rng_stater   rz   r   r   r   rC   r   r   )rT   r;   r}   rU   re   r{   r$   chunks_outputrsflat_args_tupler<   r_   r   r   r   s                  r'   ry   ry     s      "M","6			DB+ 
)	1,	J
 ?>#	 		
'
@ $:-#H  	
 *(DeCHo&<!=?QRK
 +x00r/   c                (    | dvrt        d|        y )N)error	differentr   zLOnly allowed values for randomness are 'error', 'different', or 'same'. Got )RuntimeError)r{   s    r'   _check_randomness_argr     s)    77Z[eZfg
 	
 8r/   c              #  `   K   	 t        | |      }| t                y # t                w xY wwr   )r   r   )r_   r{   rY   s      r'   vmap_increment_nestingr     s*     ",ZD
!!s   . .+.c                    t        ||      5 }t        ||||      }	 | |	i |}
t        |
||||       cd d d        S # 1 sw Y   y xY wr   )r   r[   rm   )rT   r_   r;   r<   rU   re   r{   r$   rY   rZ   rD   s              r'   rz   rz     s^     
 
J	7 X:/)Z
 9&9*jRVWX X Xs	   %<Ac                      d fd}|S )Nc                     t              5 }t        | |      } |i |}t        ||      cd d d        S # 1 sw Y   y xY wr   )r   wrap_batchedunwrap_batched)	r#   r$   rY   rZ   rD   r_   rT   rS   r{   s	        r'   innerzrestore_vmap.<locals>.inner  sK    #J
; 	?z)$DN"N=f=O!/:>	? 	? 	?s	   !9A)r#   r   r$   r   r+   tuple[Any, Any]r2   )rT   rS   r_   r{   r   s   ```` r'   restore_vmapr     s    ? ? Lr/   c                p    t        |       \  }}t        ||      }|t        d      t        ||||      }|S )Nzflat_bdims must not be None)r   r   r   r[   )r#   bdimslevelr<   spec
flat_bdimsresults          r'   r   r     sE     #4(OIt*5$7J:;;#J	5$GFMr/   c                <   t        |       \  }}t        |      dk(  r| dfS |D cg c]J  }t        |t        j                        r*t        j
                  j                  j                  ||      n|d fL }}t        | \  }}t        ||      t        ||      fS c c}w )Nr   r2   )
r   r8   rB   r   r   _C
_functorchrm   r7   r   )r#   r   r<   r   r>   r   r   r   s           r'   r   r   *  s    "4(OIt
9~Rx   #u||, HH//U;tF  LMFE&$'t)DDDs   AB)r%   Callable[_P, _R]r+   r   )r;   list[int | None]r<   	list[Any]r+   rN   )rD   Tensor | tuple[Tensor, ...]r+   rN   )rG   ztuple[_R, ...] | _RrH   rN   rI   zCallable[[], str]r+   ztuple[_R, ...])rS   	in_dims_tr#   tuple[Any, ...]rT   Callable[..., Any]r+   z1tuple[int, list[int | None], list[Any], TreeSpec])
r;   r   r<   r   rY   rN   rU   r   r+   r   )r]   strr^   r   rY   rN   r_   rN   r`   
int | Noner+   ztorch.Tensor)rD   r   re   
out_dims_trY   rN   r_   rN   rT   r   r+   r   )ro   r   rT   r   re   r   r+   None)re   r   rT   r   r+   r   )rT   r   r+   r   )rT   )Callable[_P, Tensor | tuple[Tensor, ...]]rS   r   re   r   r{   r   r|   r   r#   r)   r$   r*   r+   r   )r   rN   r|   rN   r+   z	list[int])
r<   r   r;   r   r_   rN   r|   r   r+   Iterable[tuple[Any, ...]])r   r   r+   z&tuple[list[tuple[Any, ...]], TreeSpec])re   r   r   r   r   zlist[tuple[Any, ...] | None]r+   zlist[Tensor])rT   r   r;   r   r}   r   rU   r   re   r   r{   r   r$   r   r+   r   )r{   r   r+   r   )r_   rN   r{   r   r+   zGenerator[int, None, None])rT   z*Callable[..., Tensor | tuple[Tensor, ...]]r_   rN   r;   r   r<   r   rU   r   re   r   r{   r   r$   r   r+   r   )
rT   zCallable[..., _R]rS   r   r_   rN   r{   r   r+   zCallable[..., tuple[Any, Any]])r#   r   r   r   r   rN   r+   r   )r#   r   r   rN   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   rN   rC   r   r   r.   r?   rE   rJ   rW   r[   ra   rm   rp   rr   rO   r~   r   rx   r   r   ry   r   contextmanagerr   rz   r   r   r   r2   r/   r'   <module>r      s   #    $  5 5 0   0   3 t_T]%S/!	5c?"T)
"/8$			 ,	 		77-75G767~5"55 5 	5
 5N
NN N 	N
 N N:*50*5*5 *5 	*5
 *5 *5Z	SS 2S	S
'
3'' ' 	'
 ' ' ' 	'T"  	
 :((+(* 5 	491
391"91 091 	91
 91 91 91 	91z
 ""!$"" "X
4XX #X 	X
 X X X X 	XL	
	&/	=@	NQ	#	
"+47Er/   