
    PhH                     j   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mZmZmZmZmZ d dlmZ d dlZd dl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jT                         Z+da,d! Z-d" Z.d# Z/d$ Z0d% Z1d& Z2d' Z3d( Z4ed)        Z5ed*        Z6d+ Z7d, Z8y)-    N)Tensor)AnyCallableOptionalTupleUnionList)tree_flattentree_unflatten	tree_map__broadcast_to_and_flattenTreeSpec)partial)_add_batch_dim_remove_batch_dim_vmap_decrement_nesting_vmap_increment_nestingis_batchedtensor.c                 J     dt        j                          fd       }|S )Nzdtorch.func transforms 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     `C:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/_functorch/vmap.pyfnz.doesnt_support_saved_tensors_hooks.<locals>.fn)   s5    ^^!!==gFd%f% GFFs	   =A)	functoolswraps)r   r!   r   s   ` @r    "doesnt_support_saved_tensors_hooksr$   #   s1    	3 
 __Q& & I    flat_in_dims	flat_argsreturnc                     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>8   s     Jkd4;q>1ks   zTvmap: Expected all tensors to have the same size in the mapped dimension, got sizes z for the mapped dimension)zipr-   len
ValueErrorany)r&   r'   in_dimargr.   s       @r    _validate_and_get_batch_sizer6   1   s     8;<7S *7S( 88F#7S *K
;1JKKsJkJJ$$/=0IKL 	L q>*s   A5batched_outputsc                 :    t        | t              rt        |       S y)N   )
isinstancetupler1   )r7   s    r    _num_outputsr<   ?   s    /5)?##r%   valuenum_elementserror_message_lambdac                 n    t        | t              s| f|z  S t        |       |k7  rt         |             | S r   )r:   r;   r1   r2   )r=   r>   r?   s      r    	_as_tuplerA   H   s9    eU#x,&&
5z\!-/00Lr%   in_dimsr   funcc                    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 r9   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;   r2   	_get_nametyper1   r
   r   	enumerater0   r   dimr6   )	rB   r   rC   r'   	args_specr&   ir5   r4   s	            r    _process_batched_inputsrN   P   sZ    gs#Jw,FIdO$Jwi 866:7m_AGH 	H 4yA~IdO$ %) *+ 	+
 (-Iy,Wi@LIdO$Jwi 8%%1'%:1%=$> ?&Kq*+ 	+ &c)\&BC=C&#&6+=	$(
7) <$X &012 2 fc":c6+B	$(
7) <$X%L9+ ;<= =
 6SWWYJ#6&CGGI:M	$(
7) <$X &%%(WWYK 0GGI;mCGGI;a9: :
 &1*$swwy0LO' D* (i@,PY[dddr%   
vmap_levelc           	          t        | |      D cg c]  \  }}||nt        |||       }}}t        ||      S c c}}w r   )r0   r   r   )r&   r'   rO   rL   r4   r5   batched_inputss          r    _create_batched_inputsrR      s[    
 *-\9)EG)E+&# $^c$S&*=>)E  G .)44G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 )NrE   z	, ...): `z5` can not return a BatchedTensor when out_dim is Nonez%` must only return Tensors, got type z2. Did you mean to set out_dim= to None for output?)r:   r   r   r   r2   rI   r   )namebatched_outputrO   
batch_sizeout_dims        r    _maybe_remove_batch_dimrX      s    nell38H8XvYtf -5 6   nell35iv 6..2>.B-C DLL M 	M ^ZWMMr%   out_dimsrV   c                    t        |       \  }fd}t        | t        j                        rCt        t              rg}nDt        t
              rt              dk(  r}n#g}n |        nt              }| |        t        |      D 	cg c]  \  }}	t        t              ||||	       }
}}	t        |
      S c c}	}w )Nc                  ^    t        dt                d dt              d    d d	      )NrE   , ..., out_dims=z`)(<inputs>): out_dims is not compatible with the structure of `outputs`. out_dims has structure r9   z but outputs has structure rF   )r2   rH   r
   )rC   rY   output_specs   r    incompatible_errorz+_unwrap_batched.<locals>.incompatible_error   sJ    IdO$$4XJ ?&&28&<Q&?%@ A(M,- 	-r%   r9   )r
   r:   r   r   rG   r;   r1   r   r0   rX   rH   r   )r7   rY   rO   rV   rC   flat_batched_outputsr^   flat_out_dimsrU   rW   flat_outputsr]   s    `  `      @r    _unwrap_batchedrb      s     )5_(E%+- /5<<0 h$%JM%(S]a-?$M%JM 1(KH   (++?'O'O#NG 	 	$ZY`a'O   ,44	s   "Cc                 `    t        | t              ry | y t        dt        |       d| d      )NrE   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:   rG   r2   rH   )xrC   rY   s      r    _check_int_or_nonere      sA    !Sy

	$  0
 ;+ 	,- -r%   c                 ^    t        | t              ry t        t        t        ||       |        y )N)rC   rY   )r:   rG   r   r   re   )rY   rC   s     r    $_check_out_dims_is_int_or_int_pytreerg      s#    (C g(thGRr%   c                 H    t        | d      r| j                  S t        |       S )N__name__)hasattrri   repr)rC   s    r    rH   rH      s"    tZ }}
 :r%   Fc                  f   t         ry t        5  t         r
	 d d d        y t        j                  j	                  dd      dk(  rnda 	 d d d        y t
        j                  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        y # 1 sw Y   y xY w)
NPYTORCH_JIT1TatenIMPLFuncTorchBatchedr   )decomposition_tablec                 \    | v rt         j                  | |           y t        d|        )Nz!could not find decomposition for )VMAP_DECOMPOSITIONS_LIBimplRuntimeError)decomprr   s    r    #_register_python_decomposition_vmapzElazy_load_decompositions.<locals>._register_python_decomposition_vmap   s5    ,,',,V5H5PQ"%Fvh#OPPr%   )DECOMPOSITIONS_LOADEDDECOMPOSITIONS_LOCKosenvirongetr   libraryLibraryrt   torch._decomprr   opsro   mse_loss_backwarddefaultsmooth_l1_loss_backwardhuber_loss_backwardnll_loss_forwardnll_loss2d_forwardnll_loss_backwardnll_loss2d_backwardaddr)rx   rr   s    @r    lazy_load_decompositionsr      s`   	  
	 

}c2c9i$(! 
	 #(--"7"7HZ"[5	Q 	,EIINN,L,L,T,TU+EIINN,R,R,Z,Z[+EIINN,N,N,V,VW+EIINN,K,K,S,ST+EIINN,M,M,U,UV+EIINN,L,L,T,TU+EIINN,N,N,V,VW+EIINN,?,?,G,GH $A 
		s   H''H'GH''H0c           	          t                t        ||        t        |||       \  }}}	}
|t        |	|||      }t	        | |||
||fi |S t        | |||	|
||fi |S r   )r   rg   rN   _get_chunked_inputs_chunked_vmap
_flat_vmap)rC   rB   rY   
randomness
chunk_sizer   r   rV   r&   r'   rL   chunks_flat_argss               r    	vmap_implr     s    (485LWVZ\`5a2Ji.y,
T^_T<1A&*H@FH 	H j,	9h
V\ r%   c                 V    | |z  x}}|g|z  }| |z  }|dk7  r|j                  |       |S )Nr   )append)total_elemsr   n_chunkschunk_sizes	remainders        r    get_chunk_sizesr     sB    %33Hx,)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)rK   )tensor_splitr1   )r,   tr4   
split_idxss      r    r/   z&_get_chunked_inputs.<locals>.<genexpr>)  sB      5IAv 392Dzv.1%RUV`RaJaa5s   14)r   r;   	itertools
accumulater0   )r'   r&   rV   r   r   flat_args_chunksr   r   s          @r    r   r   #  sd    J%j*=9//<=
 Y5  ,-r%   c                     g }d }| D ]&  }t        |      \  }}|j                  |       |%|}( t        t        |       }||fS r   )r
   r   listr0   )chunks_output_flat_chunks_outputarg_specoutputflat_output	arg_specsflat_output_chunkss          r    _flatten_chunks_outputr   4  s_     H !-f!5Y!!+. H	 ! c#567x''r%   c                     t        | |      }t        |      t        |      k(  sJ g }t        |      D ]3  \  }}|j                  t	        j
                  ||   |             d ||<   5 |S r   )r   r1   rJ   r   r   cat)rY   r   r   r`   r   idxrW   s          r    _concat_chunked_outputsr   E  sq    -hAM}%7!8888K!-0W599%7%<'JK"&3 1
 r%   c                 .   g }|dk(  rt        j                         nd }|D ]L  }	t        ||	      }
|
dk(  r|t        j                  |       |j	                  t        | |
||	|||fi |       N t        |      \  }}~t        |||      }t        ||      S )Nsamer   )	r   get_rng_stater6   set_rng_stater   r   r   r   r   )rC   r&   r   rL   rY   r   r   chunks_outputrsr'   rV   r   r   r   s                 r    r   r   S  s    M","6			DB%	1,	J
 ?>#j,	9hPZ^d	
% &0 $:-#H  	 *(H>PQK +x00r%   c                 (    | dvrt        d|        y )N)error	differentr   zLOnly allowed values for randomness are 'error', 'different', or 'same'. Got )rv   )r   s    r    _check_randomness_argr   }  s%    77ijtiuvww 8r%   c                     t        ||      }	 t        ||||      }	 | |	i |}
t        |
||||       t                S # t                w xY wr   )r   rR   rb   r   )rC   rV   r&   r'   rL   rY   r   r   rO   rQ   r7   s              r    r   r     sR    (Z@J"/iU^_9&9*jRVW!!s	   $= A	c                       fd}|S )Nc                      t              }	 t        | |      } |i |}t        ||      t                S # t                w xY wr   )r   wrap_batchedunwrap_batchedr   )	r   r   rO   rQ   r7   rV   rC   rB   r   s	        r    innerzrestore_vmap.<locals>.inner  sI    ,ZD
	&)$DN"N=f=O!/:>#%#%s	    : Ar+   )rC   rB   rV   r   r   s   ```` r    restore_vmapr     s    & Lr%   c                 ^    t        |       \  }}t        ||      }|J t        ||||      }|S r   )r
   r   rR   )r   bdimslevelr'   spec
flat_bdimsresults          r    r   r     s=    "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   r+   )
r
   r1   r:   r   r   _C
_functorchrb   r0   r   )r   r   r'   r   r5   r   r   r   s           r    r   r     s    "4(OIt
9~Rx*35*33 BLCQVQ]Q]A^ehh!!11#u=;*3  5LMFE&$'t)DDD5s   AB)9r   r"   	threadingr   typingr   r   r   r   r   r	   torch.utils._pytreer
   r   r   r   r   r   r{   r   torch._C._functorchr   r   r   r   r   rG   	in_dims_t
out_dims_tr$   r6   r<   strrA   rN   rR   rX   rb   re   rg   rH   ry   Lockrz   rt   r   r   r   r   r   r   r   r   r   r   r   r   r+   r%   r    <module>r      sM       > >   	   #u*	3c3h'(

8C=)%fck0B(B"C  S  8BPSGCT Y^ ,e,e#,e+3,e
3S	49h./,ed53i5,0I5CF5V[5N(!5vuVS['99:!5!5 !5 &)!5 19!5 >C!5H-S: SX SRV SH   $inn&  %%N"("
&1Tx
 $" $"< $	 $	Er%   