
    קgI                        d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
mZmZ d dl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eef         Zeeeedf         f         Zd Zd	e	e
e                  d
e	defdZdeeeedf         f         defdZ dededeg e!f         defdZ"dedededeee	e         e	e         ef         fdZ#d	e	e         d
e	e         dedefdZ$d Z%deeeedf         f         dededededefdZ&d Z'dededdfdZ(defdZ)d a* ej+                    Z,da-d! Z.d" Z/d# Z0d$ Z1d% Z2d& Z3d' Z4d( Z5e j6        d)             Z7d* Z8d+ Z9d, Z:d- Z;dS ).    N)partial)AnyCallableListOptionalTupleUnion)Tensor)_add_batch_dim_remove_batch_dim_vmap_decrement_nesting_vmap_increment_nestingis_batchedtensor)_broadcast_to_and_flattentree_flatten	tree_map_tree_unflattenTreeSpec.c                 N     dt          j                    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                                      5   | i |cd d d            S # 1 swxY w Y   d S N)torchautogradgraphdisable_saved_tensors_hooks)argskwargsfmessages     Q/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/_functorch/vmap.pyfnz.doesnt_support_saved_tensors_hooks.<locals>.fn-   s    ^!==gFF 	& 	&1d%f%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   ;??)	functoolswraps)r   r!   r   s   ` @r    "doesnt_support_saved_tensors_hooksr$   '   sJ    	3 
 _Q& & & & & & I    flat_in_dims	flat_argsreturnc                     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>9   s8       FC 	r%   r   z/vmap: Expected at least one Tensor to vmap overc              3   0   K   | ]}|d          k    V  dS )r   N )r,   r+   batch_sizess     r    	<genexpr>z/_validate_and_get_batch_size.<locals>.<genexpr>@   s,      JJd4;q>1JJJJJJr%   zTvmap: Expected all tensors to have the same size in the mapped dimension, got sizes z for the mapped dimension)ziplen
ValueErrorany)r&   r'   r2   s     @r    _validate_and_get_batch_sizer8   6   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>r%   batched_outputsc                 N    t          | t                    rt          |           S dS )N   )
isinstancetupler5   )r9   s    r    _num_outputsr>   H   s'    /5)) $?###1r%   valuenum_elementserror_message_lambdac                     t          | t                    s| f|z  S t          |           |k    rt           |                      | S r   )r<   r=   r5   r6   )r?   r@   rA   s      r    	_as_tuplerC   R   sQ     eU## 'x,&&
5zz\!!--//000Lr%   in_dimsr   funcc                    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 r;   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 < )r<   intr=   r6   	_get_nametyper5   r   r   	enumerater4   r
   dimr8   )	rD   r   rE   r'   	args_specr&   ir.   r-   s	            r    _process_batched_inputsrP   \   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==	 r%   
vmap_levelc                 \    fdt          | |          D             }t          ||          S )Nc                 @    g | ]\  }}||nt          ||          S r   )r   )r,   r-   r.   rQ   s      r    r/   z*_create_batched_inputs.<locals>.<listcomp>   sA       FC ~>#vz#J#J  r%   )r4   r   )r&   r'   rQ   rN   batched_inputss     `  r    _create_batched_inputsrU      sG       |Y77  N .)444r%   c           
      ,   |At          |t          j                  r%t          |          rt	          d|  d|  d          |S t          |t          j                  s&t	          d|  d|  dt          |           d          t          ||||          S )NrG   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?)r<   r   r
   r   r6   rK   r   )namebatched_outputrQ   
batch_sizeout_dims        r    _maybe_remove_batch_dimr[      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Mr%   out_dimsrY   c                   	 t          |           \  }		fd}t          | t          j                  rUt          t                    rg}nXt          t
                    rt                    dk    r}n-g}n' |             nt          	          }|
 |             fdt          ||          D             }t          |	          S )Nc                  |    t          dt                      d dt                    d          d d	          )NrG   , ..., out_dims=z`)(<inputs>): out_dims is not compatible with the structure of `outputs`. out_dims has structure r;   z but outputs has structure rH   )r6   rJ   r   )rE   r\   output_specs   r    incompatible_errorz+_unwrap_batched.<locals>.incompatible_error   sf    ,IdOO , ,X , ,&28&<&<Q&?, , ), , ,
 
 	
r%   r;   c           	      V    g | ]%\  }}t          t                    ||          &S r1   )r[   rJ   )r,   rX   rZ   rY   rE   rQ   s      r    r/   z#_unwrap_batched.<locals>.<listcomp>   sJ        $NG 	 dOO^ZW	
 	
  r%   )
r   r<   r   r
   rI   r=   r5   r   r4   r   )
r9   r\   rQ   rY   rE   flat_batched_outputsra   flat_out_dimsflat_outputsr`   s
    ````    @r    _unwrap_batchedrf      s1    )5_(E(E%+
 
 
 
 
 
 
 /5<00 ! h$$ 	!%JMM%(( 	!S]]a-?-?$MM%JMM    1(KHH          (++?'O'O	  L ,444r%   c                 ~    t          | t                    rd S | d S t          dt          |           d| d          )NrG   r_   z): `out_dims` must be an int, None or a python collection of ints representing where in the outputs the vmapped dimension should appear.)r<   rI   r6   rJ   )xrE   r\   s      r    _check_int_or_noneri      s]    !S y
	,	$ 	, 	, 	, 	, 	,  r%   c                 ~    t          | t                    rd S t          t          t          ||           |            d S )N)rE   r\   )r<   rI   r   r   ri   )r\   rE   s     r    $_check_out_dims_is_int_or_int_pytreerk      s?    (C   g(thGGGRRRRRr%   c                 N    t          | d          r| j        S t          |           S )N__name__)hasattrrm   repr)rE   s    r    rJ   rJ      s*    tZ   }
 ::r%   Fc                     t           rd S t          5  t           r	 d d d            d S t          j                            dd          dk    rnda 	 d d d            d S t
          j                            ddd          addl	m
 fd	}  | t
          j        j        j        j                    | t
          j        j        j        j                    | t
          j        j        j        j                    | t
          j        j        j        j                    | t
          j        j        j        j                    | t
          j        j        j        j                    | t
          j        j        j        j                    | t
          j        j        j        j                   da d d d            d S # 1 swxY w Y   d S )
NPYTORCH_JIT1TatenIMPLFuncTorchBatchedr   )decomposition_tablec                 v    | v r#t                               | |                     d S t          d|            )Nz!could not find decomposition for )VMAP_DECOMPOSITIONS_LIBimplRuntimeError)decomprv   s    r    #_register_python_decomposition_vmapzElazy_load_decompositions.<locals>._register_python_decomposition_vmap!  sH    ,,,',,V5H5PQQQQQ"#Ov#O#OPPPr%   )DECOMPOSITIONS_LOADEDDECOMPOSITIONS_LOCKosenvirongetr   libraryLibraryrx   torch._decomprv   opsrs   mse_loss_backwarddefaultsmooth_l1_loss_backwardhuber_loss_backwardnll_loss_forwardnll_loss2d_forwardnll_loss_backwardnll_loss2d_backwardaddr)r|   rv   s    @r    lazy_load_decompositionsr   	  s<    	 $% $%  	$% $% $% $% $% $% $% $% 
}c22c999$(!$% $% $% $% $% $% $% $% #(-"7"7F.#
 #
 	655555	Q 	Q 	Q 	Q 	Q 	,+EIN,L,TUUU++IN2:	
 	
 	
 	,+EIN,N,VWWW++EIN,K,STTT++EIN,M,UVVV++EIN,L,TUUU++EIN,N,VWWW++EIN,?,GHHH $I$% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $%s   	F8(F8EF88F<?F<c           	          t                       t          ||            t          |||           \  }}}	}
|$t          |	|||          }t	          | |||
||fi |S t          | |||	|
||fi |S r   )r   rk   rP   _get_chunked_inputs_chunked_vmap
_flat_vmap)rE   rD   r\   
randomness
chunk_sizer   r   rY   r&   r'   rN   chunks_flat_argss               r    	vmap_implr   5  s    (48885Lt6 62Ji .|Z
 
 
 
 
 
 	
 	 	 	 	 	r%   c                 `    | |z  x}}|g|z  }| |z  }|dk    r|                     |           |S )Nr   )append)total_elemsr   n_chunkschunk_sizes	remainders        r    get_chunk_sizesr   W  sJ    %33Hx,)Kj(IA~~9%%%r%   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)rM   )tensor_splitr5   )r,   tr-   
split_idxss      r    r3   z&_get_chunked_inputs.<locals>.<genexpr>g  sr         Av  	
zv... 
 j//     r%   )r   r=   	itertools
accumulater4   )r'   r&   rY   r   r   flat_args_chunksr   r   s          @r    r   r   a  s    J%j*==9/<<==
     Y55     ,-r%   c                     g }d }| D ]-}t          |          \  }}|                    |           ||}.t          t          |           }||fS r   )r   r   listr4   )chunks_output_flat_chunks_outputarg_specoutputflat_output	arg_specsflat_output_chunkss          r    _flatten_chunks_outputr   w  sq     H  ! !!-f!5!5Y!!+... H c#5677x''r%   c                     t          | |          }t          |          t          |          k    sJ g }t          |          D ]9\  }}|                    t	          j        ||         |                     d ||<   :|S r   )r   r5   rL   r   r   cat)r\   r   r   rd   r   idxrZ   s          r    _concat_chunked_outputsr     s    -hAAM}%7!8!88888K!-00 ' 'W59%7%<'JJJKKK"&3r%   c                 T   g }|dk    rt          j                    nd }|D ]U}	t          ||	          }
|
dk    r|t          j        |           |                    t          | |
||	|||fi |           Vt          |          \  }}~t          |||          }t          ||          S )Nsamer   )	r   get_rng_stater8   set_rng_stater   r   r   r   r   )rE   r&   r   rN   r\   r   r   chunks_outputrsr'   rY   r   r   r   s                 r    r   r     s     M","6"6				DB% 
 
	1,	JJ
 ??>###	 	 	 		
 	
 	
 	
 $:-#H#H  	 *(H>PQQK +x000r%   c                 2    | dvrt          d|            d S )N)error	differentr   zLOnly allowed values for randomness are 'error', 'different', or 'same'. Got )rz   )r   s    r    _check_randomness_argr     s4    777g[egg
 
 	
 87r%   c              #   v   K   	 t          | |          }|V  t                       d S # t                       w xY wr   )r   r   )rY   r   rQ   s      r    vmap_increment_nestingr     sK      ",ZDD
!!!!!!!!!s   ( 8c                     t          ||          5 }t          ||||          }	 | |	i |}
t          |
||||           cd d d            S # 1 swxY w Y   d S r   )r   rU   rf   )rE   rY   r&   r'   rN   r\   r   r   rQ   rT   r9   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c                       fd}|S )Nc                      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   rQ   rT   r9   rY   rE   rD   r   s	        r    innerzrestore_vmap.<locals>.inner  s    #J
;; 	?z)$DDN"dN=f==O!/:>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?s   )AAAr1   )rE   rD   rY   r   r   s   ```` r    restore_vmapr     s5    ? ? ? ? ? ? ? ? Lr%   c                 v    t          |           \  }}t          ||          }|J t          ||||          }|S r   )r   r   rU   )r   bdimslevelr'   spec
flat_bdimsresults          r    r   r     sF    "4((OIt*5$77J!!!#J	5$GGFMr%   c                     t          |           \  }}t          |          dk    r| dfS fd|D             }t          | \  }}t          ||          t          ||          fS )Nr   r1   c                     g | ]E}t          |t          j                  r%t          j        j                            |          n|d fFS r   )r<   r   r
   _C
_functorchrf   )r,   r.   r   s     r    r/   z"unwrap_batched.<locals>.<listcomp>  s]         c5<((	++C7774[  r%   )r   r5   r4   r   )r   r   r'   r   r   r   r   s    `     r    r   r   	  s    "4((OIt
9~~Rx    	  F LMFE&$''t)D)DDDr%   )<
contextlibr"   r   r   	threadingr   typingr   r   r   r   r   r	   r   r
   torch._C._functorchr   r   r   r   r   torch.utils._pytreer   r   r   r   r   rI   	in_dims_t
out_dims_tr$   r8   r>   strrC   rP   rU   r[   rf   ri   rk   rJ   r}   Lockr~   rx   r   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r   r1   r%   r    <module>r      s`               				           > > > > > > > > > > > > > > > >                                  #u*	3c3h'(
  x}%26   $%fck0B(B"C     !9A"c'9J
   77#7+37
3S	49h./7 7 7 7|5s)5(,S	5?B5
5 5 5 5N N N.'565#556'5'5 '5 	'5
 '5 '5 '5 '5 '5T	 	 	S: SX SRV S S S SH      $in&&  
)% )% )%X  D    ,( ( ("
 
 
.1 .1 .1d
 
 
 " " "X X X>    E E E E Er%   