
    Phd                     h   d dl Z d dlmZ d dlmZ d dlmZ d dlmc m	Z
 d dlmZmZmZ d dlmZmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZ  G d de      Z e       Zej=                  ej>                        ej=                  ej@                        d               Z!d Z"dZ#e#fdZ$ G d de      Z%d Z&d Z'ej=                  ejP                        d        Z)d Z*ej=                  ejV                        d        Z,d Z-d Z. G d d      Z/ G d de/      Z0 G d de/      Z1	 d"d Z2	 d"d!Z3y)#    N)HigherOrderOperator)TransformType)%enable_single_level_autograd_function)_wrap_for_grad_unwrap_for_gradcurrent_level)wrap_batchedunwrap_batchedrestore_vmap_add_batch_dim)vmap)_broadcast_to_and_flatten)_set_fwd_grad_enabled)Any
NamedTupleTuplec                   (     e Zd Z fdZ fdZ xZS )!CustomFunctionHigherOrderOperatorc                 $    t         |   d       y )Ncustom_function_call)super__init__)self	__class__s    mC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/_functorch/autograd_function.pyr   z*CustomFunctionHigherOrderOperator.__init__   s    /0    c                     t         j                  j                         rt        |   |g|i |S  |j
                  |i |S N)torch_C _are_functorch_transforms_activer   __call__apply)r   autograd_functionargskwargsr   s       r   r"   z*CustomFunctionHigherOrderOperator.__call__!   sI     884467#$5GGGG& &&777r   )__name__
__module____qualname__r   r"   __classcell__r   s   @r   r   r      s    18 8r   r   c                 |    t        | |      }t               5   |j                  | }d d d        |S # 1 sw Y   S xY wr   )generate_single_level_functionr   r#   )interpreterr$   operands	Generatedflat_outs        r   custom_function_call_gradr2   U   s<     /{<MNI	.	0"9??H- 
1O 
1Os   1;c           
      (     j                          fd}fd}fd}fd}j                   d}t        |t        j                  j
                  j                  ft        |      t        |      t        |      t        |      d      }|S )Nc                  n   t        j                  t        j                  fd|       }t        j                         5  t        d      5  j                         5  t        g| }d d d        d d d        d d d        fd}t        || |      S # 1 sw Y   ,xY w# 1 sw Y   0xY w# 1 sw Y   4xY w)Nc                     t        |       S r   )r   )xlevels    r   <lambda>zAgenerate_single_level_function.<locals>.forward.<locals>.<lambda>d   s    &q%0r   Tc                     t        |       S r   )r   )outputr7   s    r   wrap_fnz@generate_single_level_function.<locals>.forward.<locals>.wrap_fnm   s    !&%00r   )	pytreetree_map_onlyr   Tensorenable_gradr   lowerr   !wrap_outputs_maintaining_identity)r/   unwrapped_operandsunwrapped_outputr;   r$   r.   r7   s       r   forwardz/generate_single_level_function.<locals>.forwarda   s    #11LL0  "7"={?P?P?R34E[HZ[ @S"= 	1 1	 	 @S?R"="=  s;   B+
BB(B0B+BBB(	$B++B4c                 *    j                  | ||      S r   )setup_context)ctxinputsr:   r$   s      r   rF   z5generate_single_level_function.<locals>.setup_contextv   s     ..sFFCCr   c                 .     j                   | g| }|S r   )backward)rG   gradsresultr$   s      r   rJ   z0generate_single_level_function.<locals>.backwardz   s     +"++C8%8r   c                 .     j                   | g| }|S r   )jvp)rG   tangentsrL   r$   s      r   rN   z+generate_single_level_function.<locals>.jvp   s     &"&&s6X6r   r0   )rD   rJ   rN   rF   )r7   r'   typer   autogradfunction_SingleLevelFunctionstaticmethod)	r.   r$   rD   rF   rJ   rN   namer0   r7   s	   ``      @r   r-   r-   ^   s    E*D
  (()3D		 	 	5	57#G,$X.$)-8		
	I r   znot specifiedc           	         t        j                  | }t        j                  | }t        ||      D ci c]  \  }}t        |      | }	}}t        j                  |       \  }
}g }|t
        k7  }|r9t        ||      }|+t        d| dt        j                  |      d    d| d      t        |
      D ]  \  }}t        |t        j                        s|j                  |       2t        |      |	v r|j                  |	t        |                ]|r|j                   |||                {|j                   ||              t        j                  ||      S c c}}w )NzoThe autograd.Function's vmap staticmethod returned an incompatible (output, out_dims) tuple. Expected out_dims=zI to be compatible with the structure of `output`. out_dims has structure    z but output has structure zX. For more details, please see https://pytorch.org/docs/master/notes/extending.func.html)r<   arg_tree_leaveszipidtree_flattenNO_OUT_DIMSr   RuntimeError	enumerate
isinstancer   r>   appendtree_unflatten)outputsunwrapped_inputsorig_inputsr;   out_dimsflat_unwrapped_inputsflat_orig_inputs	unwrappedorigunwrapped_input_to_orig_inputflat_outputsspecrL   out_dims_specifiedflat_out_dimsir:   s                    r   rA   rA      s   "224DE--{;  ##8:JK%KOIt 	9tK " %
  ,,W5L$F![01(DA  %%-J /**0*=*=h*G*J)K L,,06 2LM	 	 |,	6&%,,/MM&!f:66MM76
CDMM'&-*:;<MM'&/* -   ..M%s   E c                   "    e Zd ZU eed<   eed<   y)VmapInfo
batch_size
randomnessN)r'   r(   r)   int__annotations__str r   r   rq   rq      s    OOr   rq   c                 b    | j                   t        j                  j                  j                   uS r   )r   r   rQ   Function)r$   s    r   has_overriden_vmap_rulerz      s#    !!)@)@)E)EEEr   c                     d}t        | t              st        |dt        |        dz         t	        |       dk(  st        |dt	        |        dz         y )Nz}Expected the vmap staticmethod to have two returns, an output and out_dims with pytree structure compatible with the output. zGot a z instead   zGot z returns instead)r_   tupler]   rP   len)rL   base_error_msgs     r   +validate_vmap_returns_tuple_of_two_elementsr     se    	J  fe$>fT&\N(,KKLLv;!>d3v;-?O,PPQQ r   c                   
 |j                   r1t        |      rt        d|j                   d      t	        | |g| S t        |      st        d|j                   d      | j                         
t        | j                         | j                               }t        |
      \  }}t        j                  d |      r&| j                         5  t        |g| cd d d        S | j                         5   |j                  ||g| }d d d        t               |\  }}
fd}	t!        ||||	|      S # 1 sw Y   [xY w# 1 sw Y   :xY w)NzYou tried to vmap over a  , but it has both generate_vmap_rule=True and an overriden vmap staticmethod. Please set generate_vmap_rule=False or delete the overriden vmap staticmethod to avoid ambiguity. For more details, please see https://pytorch.org/docs/master/notes/extending.func.htmlz, but it does not have vmap support. Please override and implement the vmap staticmethod or set generate_vmap_rule=True. For more details, please see https://pytorch.org/docs/master/notes/extending.func.html)rr   rs   c                 
    | d u S r   rw   )dims    r   r8   z+custom_function_call_vmap.<locals>.<lambda>1  s    3$;r   c                 &    || S t        | |      S r   )r   )r:   out_dimr   s     r   r;   z*custom_function_call_vmap.<locals>.wrap_fn;  s     v\nVWm.\\r   )re   )generate_vmap_rulerz   r]   r'   'custom_function_call_vmap_generate_ruler7   rq   rr   rs   r
   r<   tree_allr@   r   r   r   rA   )r.   r$   r/   inforB   in_dimsrL   rC   re   r;   r   s             @r   custom_function_call_vmapr     s~   ++"#45 )*;*D*D)E FL MN N 7{DUaX`aa"#45 %&7&@&@%A BH IJ 	J  %%'M))+))+D #1="I
 .8 '(9EHE !  
			'"''gK8JK 
/7!'h] -  !  
	s   D:8E:EEc                 <   t        || j                               \  }}t        ||| j                         | j	                               \  }}| j                         5  t        |g| }d d d         |       }t        || j                               S # 1 sw Y   +xY wr   )r
   r7   vmapify_autograd_functionrr   rs   r@   r   r	   )	r.   r$   r/   rB   r   vmapped_functionget_out_dimsr:   re   s	            r   r   r   F  s    "0;;L;L;N"O%>7K$:$:$<k>T>T>V&X"l 
			%&6L9KL 
 ~H+*;*;*=>>	 
	s   BBc                     t        d      )Nz0NYI: Functionalize rule for custom_function_call)r]   )r.   r$   r   r/   s       r   "custom_function_call_functionalizer   R  s    
I
JJr   c           
      J    d fd} fd} fd} fd}d j                    }t        |t        j                  j                  ft        |      t        |      t        |      t        |      dd      }	fd	}
|	|
fS )
Nznot populatedc                  D     t        j                        |  \  }|S r   )r   rD   )r/   rb   r$   rr   r   re   rs   s     r   rD   z*vmapify_autograd_function.<locals>.forwarde  s5    HL%%w
JHIQSr   c                 Z     d d  fd} t        |
f      ||       	y )Nc                     t        t                     }j                  || |       t        d | D              |j                  y )Nc              3   l   K   | ],  }t        |t        j                        r|j                  nd  . y wr   )r_   r   r>   shape).0inps     r   	<genexpr>zRvmapify_autograd_function.<locals>.setup_context.<locals>.inner.<locals>.<genexpr>|  s/      "5-3c 0:#u||/L#))RV"V-3s   24)CtxCustomSaver   rF   r}   _pt_saved_tensors_bdims)rH   rb   wrapped_ctxr$   rG   input_shapes_saved_tensors_bdims_s      r   innerz?vmapify_autograd_function.<locals>.setup_context.<locals>.innero  sL    
 (]_=K++KI " "5-3"5 5M $/#F#F r   )r   )rG   rH   rb   r   r   r   r$   rr   r   input_shapesre   rs   saved_tensors_bdimss   `   @@r   rF   z0vmapify_autograd_function.<locals>.setup_contextk  sJ    #	G&	
h		

 '	 %2r   c                      
k7  sJ 
k7  sJ  fd}t        	|      } t        ||f       j                  |      \  }}t        ||      }|S )Nc                 B    t        |       } j                  |g| S r   )CtxWithSavedTensorsrN   )saved_tensorsrO   r   r$   rG   s      r   jvp_no_contextz>vmapify_autograd_function.<locals>.jvp.<locals>.jvp_no_context  s(    -c=AK($((@x@@r   )get_tangents_in_dimsr   r   	reductify)rG   rO   r   tangent_in_dimsout_tangentsout_tangents_dimsrL   r$   rr   r   init_valre   rs   r   s   `      r   rN   z&vmapify_autograd_function.<locals>.jvp  s    8###"h...	A /wA+\,0/BJPZ+\!!8+-'' <):HjQr   c                      	k7  sJ 
	k7  sJ 	k7  sJ  fd} t        |ff       j                  |f      \  }}t        ||
      }|S )Nc                 L    | \  }}t        |      } j                  |g| S r   )r   rJ   )rH   r   grad_outputsr   r$   rG   s       r   backward_no_contextzHvmapify_autograd_function.<locals>.backward.<locals>.backward_no_context  s2    *0'M<-c=AK-$--kILIIr   )r   r   r   )rG   r   r   grad_insgrad_ins_dimsrL   r$   rr   r   r   r   re   rs   r   s   `     r   rJ   z+vmapify_autograd_function.<locals>.backward  s    8###x'''"h...	J
#],#6"A!CZQ[#]""L1#3- 8]GZVr   VmappedT)rD   rJ   rN   rF   r   c                       k7  sJ S r   rw   )r   re   s   r   r   z/vmapify_autograd_function.<locals>.get_out_dims  s    8###r   )r'   rP   r   rQ   ry   rT   )r$   r   rr   rs   rD   rF   rN   rJ   rU   r0   r   r   r   re   r   s   ````       @@@@r   r   r   W  s     HH L' !3 !3F     &//01D		 	 "#G,$X.$)-8"&	

I l""r   c                     t        j                  |       \  }}t        j                  | }t        ||      D cg c]  \  }}|d n| }}}t        j                  ||      S c c}}w r   )r<   r[   rX   rY   ra   )
input_dimsrO   flat_in_dimsrl   flat_tangentsin_dimtangentrL   s           r   r   r     sv    ,,Z8L$**H5M%(}%EG%E/&' od61%E  G  ..Gs   A#c                   8    e Zd ZU dZeedf   ed<   d Zd Zd Z	y)
WrappedCtx)_pt_reserved_attrs_pt_inner_ctx.r   c                     t        |t              s7t        |       j                  }|D ]  }t	        ||      st        d| d       || _        y )NzPyTorch reserves the zU field on ctx. Please name your fields on ctx something else to avoid name collision.)r_   r   rP   r   hasattrr]   r   )r   rG   reserved_attrsrU   s       r   r   zWrappedCtx.__init__  s[    #z*!$Z::N&sD)"+N+; <! !" " ' !r   c                 .    t        | j                  |      S r   )getattrr   )r   rU   s     r   __getattr__zWrappedCtx.__getattr__  s    t))400r   c                 ~    |t        |       j                  v r|| j                  |<   y t        | j                  ||      S r   )rP   r   __dict__setattrr   )r   rU   values      r   __setattr__zWrappedCtx.__setattr__  s:    4:000"'DMM$t))477r   N)
r'   r(   r)   r   r   rv   ru   r   r   r   rw   r   r   r   r      s$    *Qc3hQ
!18r   r   c                   N     e Zd Zdgej                  Z fdZed        Z xZS )r   _pt_new_saved_tensorsc                 2    t         |   |       || _        y r   )r   r   r   )r   rG   new_saved_tensorsr   s      r   r   zCtxWithSavedTensors.__init__  s    %6"r   c                     | j                   S r   )r   )r   s    r   r   z!CtxWithSavedTensors.saved_tensors   s    )))r   )	r'   r(   r)   r   r   r   propertyr   r*   r+   s   @r   r   r     s0    1RJ4Q4QR7 * *r   r   c                   L     e Zd Zddgej                  Z fdZd Zd Z xZS )r   r   _pt_current_levelc                 @    t         |   |       d| _        || _        y )Nrw   )r   r   r   r   )r   rG   r   r   s      r   r   zCtxCustomSave.__init__(  s     ')$!.r   c                 v    t        || j                        \  }} | j                  j                  |  || _        y r   )r
   r   r   save_for_backwardr   r   tensorsunwrapped_tensorsbdimss       r   r   zCtxCustomSave.save_for_backward-  s9    #1'4;Q;Q#R 5,,,.?@',$r   c                 v    t        || j                        \  }} | j                  j                  |  || _        y r   )r
   r   r   save_for_forwardr   r   s       r   r   zCtxCustomSave.save_for_forward2  s9    #1'4;Q;Q#R 5+++->?',$r   )	r'   r(   r)   r   r   r   r   r   r*   r+   s   @r   r   r   $  s.    35H :%88:/
-
-r   r   c           	          t        | t              s| f} t        |t              s|f}t        |t              s|f}|t        |       dz  }t        fdt        | |||      D              }|S )Nr   c              3   F   K   | ]  \  }}}}t        ||||        y wr   )reductify_leaf)r   gigi_bdimi_bdimmaybe_ishaperr   s        r   r   zreductify.<locals>.<genexpr>C  s4       	] .B 	r7FJE\s   !)r_   r}   r~   rY   )
grad_inputgrad_input_bdim
input_bdimrr   &target_shape_without_bdim_to_reduce_torL   s      `  r   r   r   8  sx    j%( ]
ou-*,j%( ]
-514Z71J.  	J5[\ F
 Mr   c                 Z   | y ||| S ||| j                  |      S |J |>| j                  |      } t        | j                        }|||<   | j	                  |      } |}|/ t        t        j                  j                  |d f|      | |      S ||k7  r| j                  ||      } | S )N)r   re   )
sum	unsqueezelistr   expandr   r   r>   sum_to_sizemovedim)r   r   r   rr   r   	new_shapes         r   r   r   K  s    :#5"z'9~~o..0 !!!))*5
))*	 *	*&&y1
$-9ctELL,,6MXbc>@ 	@ _$''D
r   r   )4r   
torch._opsr   torch._C._functorchr   torch._functorch.utilsr   torch.utils._pytreeutils_pytreer<   r   r   r   torch._functorch.vmapr	   r
   r   r   torch._functorch.apisr   r   torch.autograd.forward_adr   typingr   r   r   r   r   py_implGradJvpr2   r-   r\   rA   rq   rz   r   Vmapr   r   Functionalizer   r   r   r   r   r   r   r   rw   r   r   <module>r      sY    * - H $ $ 
  ' ; ; ) )8(; 84 9: < m001m//0 1 24~  CN+/pz 
FR m0014 24n	? m99:K ;Kh#Z/x8 82	** 	*-J -* 6:( ;?0r   