
    Ph)                         d dl mZ d dlmZmZmZmZ d dlmZm	Z	m
Z
 d dlmZmZmZmZmZmZmZ dZdedefdZ ed	
       G d d             Zy)    )	dataclass)CallableListSequenceTuple)BindingCType
NamedCType)ArgumentBaseTyBaseTypeListTypeNativeFunctionOptionalTypeTypez
	freturnc                 J    | j                   j                  j                         S )N)funcnameunambiguous_name)r   s    kC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torchgen/executorch/api/unboxing.pyr   r      s    66;;''))    T)frozenc                      e Zd ZU dZedef   ed<   dee   de	e
e   e
e   f   fdZddd	ed
edede	eee
e   e
e   f   fdZd
ededede	e
e   e
e   f   fdZd
eded	edede	e
e   e
e   f   f
dZd
eded	edede	e
e   e
e   f   f
dZy)Unboxinga  
    Takes a sequence of Bindings and unbox EValues to these Bindings. Return generated code that performs correct unboxing.
    A sample generated code:
    // aten::mul.out(Tensor self, Tensor other, *, Tensor(a!) out) -> Tensor(a!)
    void mul_out(EValue** stack) {
        EValue& self = *stack[0];
        EValue& other = *stack[1];
        EValue& out = *stack[2];
        const torch::executor::Tensor & self_base = self.to<torch::executor::Tensor>();
        const torch::executor::Tensor & other_base = other.to<torch::executor::Tensor>();
        torch::executor::Tensor & out_base = out.to<torch::executor::Tensor>();

        EXECUTORCH_SCOPE_PROF("native_call_mul.out");
        torch::executor::mul_outf(self_base, other_base, out_base);


    }
    .argument_type_genargsr   c                    t        t        |            D cg c]  }d||   j                   d| d }}g }|D ]  }t        |j                  t
              st        d|       |j                  }| j                  |j                  |j                  |j                        \  }}}	}
|j                  |
       |j                  |	       |j                  |j                  |              ||fS c c}w )NzEValue& z
 = *stack[z];z7Unexpected argument type, expecting `Argument` but got mutable)rangelenr   
isinstanceargumentr   	Exceptionargumenttype_evalue_converttypeis_writeextendappend	with_name)selfr   i	code_listbinding_listargr%   unboxed_name_codedecls              r   convert_argumentszUnboxing.convert_arguments4   s     HMSQUYGWXGW!xQ~Zs"=GW	XCcllH5McUS  "%H*.*J*Jx}}h6G6G +K +'L!T4 T"T"l ;<  Y&& Ys   C0Fr    targ_namer!   c                ~   | j                  |||      j                  }t        |t              r| d}| j	                  |||      \  }}nmt        |t
              r| d}| j                  ||||      \  }}n?t        |t              r| d}| j                  ||||      \  }}nt        d| d|       ||||fS )	a  
        Takes in the type, name and mutability corresponding to an argument, and generates a tuple of:
        (1) the C++ code necessary to unbox the argument
        (2) A Binding corresponding to the newly created unboxed variable, including variable name and its CType
        :param t: a `Type` of an argument
        :param arg_name: argument name
        :param mutable: boolean for whether this argument type is mutable
        :return: unboxed result
        )r!   binds_base)r8   out_namectype_opt_out)r8   r<   r7   r=   	_list_outzCannot handle type z. arg_name: )
r   r(   r$   r   _gen_code_base_typer   _gen_code_optional_typer   _gen_code_list_typer&   )r-   r7   r8   r!   r=   r<   r4   r5   s           r   r'   z$Unboxing.argumenttype_evalue_convertH   s     &&q'&JOOa""5)H11!HE 2 JD$ <("8,H55!H 6 JD$ 8$"9-H11!H 2 JD$ 1!L
KLLd**r   r<   r=   c           	      `    |j                          d| d| d|j                  d       dgg fS )N  = z.to<T	strip_refz>();)cpp_type)r-   r8   r<   r=   s       r   r@   zUnboxing._gen_code_base_typei   sH     ~~ (3xjU^^VZ^=[<\\`a
 	r   c           
          | d}| j                  |j                  |      \  }}}}	d|j                  d       d| d| d|j                  d       d	j                  d	      |	fS )
N_opt_in
    TrF   rD   rE   z.toOptional<z>();
            
)r'   elemrH   split)
r-   r8   r<   r7   r=   in_nameres_name	base_typeres_coder5   s
             r   rA   z Unboxing._gen_code_optional_typep   s     Jg&.2.N.NFFG/
+)Xt
^^d^#$AhZs8*LI[I[fjI[IkHl m 
 	
r   c                    | d}| d}g }| j                  |j                  |      \  }}	}
}t        |j                  t              re|j                  j                  t
        j                  k(  r>|j                  d|j                  d       d| d| dj                  d	             ||fS t        |j                  t              r|j                  j                  t
        j                  k(  s'|j                  j                  t
        j                  k(  r>|j                  d|j                  d       d| d| d
j                  d	             ||fS t        |j                  t              re|j                  j                  t
        j                  k(  r>|j                  d|j                  d       d| d| dj                  d	             ||fS t        |j                  t              re|j                  j                  t
        j                  k(  r>|j                  d|j                  d       d| d| dj                  d	             ||fS t        |j                  t              rt        |j                  j                  t              rq|j                  j                  j                  t
        j                  k(  r@|j                  d| d| d| d| d| d| d| d| d| dj                  d	             ||fS |dz   }|j                  d|	j                  d       d| d       |j                  d| d| dt         j#                  |
       d| d| d|j                  d       d| d| dj                  d	             ||fS )N_list_in_elemrK   TrF   rD   rE   z!.toTensorList();
                rL   z.toIntList();
                z!.toDoubleList();
                z.toBoolList();
                z=
#ifdef USE_ATEN_LIB
at::ArrayRef<c10::optional<at::Tensor>> z>.toListOptionalTensor();
c10::List<c10::optional<at::Tensor>> z;
for (auto z: z) {
    z.push_back(zY);
}
#else
torch::executor::ArrayRef<torch::executor::optional<torch::executor::Tensor>> z0.toListOptionalTensor();
#endif
                _veczstd::vector<z> ;z
    for (EValue z) {
        z	
        z);
    }
    (z);
                )r'   rM   r$   r   r   r   Tensorr*   rH   rN   intSymIntfloatboolr   r+   	connectorjoin)r-   r8   r<   r7   r=   rO   	elem_namer4   rP   	res_ctyperR   r5   vec_names                r   rB   zUnboxing._gen_code_list_type   s    Jh'j&	.2.N.NFFI/
+)Xt affh'AFFKK6==,HKK
^^d^#$AhZs8* =ET TzG )FFKK6::%)EKK
^^d^#$AhZs8* =E@ Tzs )affkkV\\.IKK
^^d^#$AhZs8* =Ep Tzc )affkkV[[.HKK
^^d^#$AhZs8* =E^ TzK qvv|,166;;1  FMM1KK))0	XJ ?&&.Z 0+Ry !Jk) %O PXjX[\d[e f
 EB Tz!  &(HKKy11D1AB"XJaP KK2gY '			!" #		
+hZ (
^^d^#$AhZq
 ; E
 Tzr   N)__name__
__module____qualname____doc__r   r
   __annotations__r   r   r   r   strr6   r   r]   r	   r'   r@   r   rA   r   rB    r   r   r   r      sI   *  	 'W%'	tG}d3i'	('* :?++!$+26+	sE49d3i/	0+B'*38	tCy$s)#	$

'*
/;
DI
	tCy$s)#	$
 UU'*U/7U@EU	tCy$s)#	$Ur   r   N)dataclassesr   typingr   r   r   r   torchgen.api.typesr   r	   r
   torchgen.modelr   r   r   r   r   r   r   r^   rh   r   r   ri   r   r   <module>rn      s^    ! 2 2 9 9   	*N *s * $} } }r   