§
    Ì²Åj®  ã                  óÀ   — d dl mZ d dlmZ d dlmZmZ d dlmZm	Z	m
Z
mZmZmZmZ erd dlmZ d dlmZmZmZ dZdd„Z ed¬¦  «         G d„ d¦  «        ¦   «         ZdS )é    )Úannotations)Ú	dataclass)ÚCallableÚTYPE_CHECKING)ÚArgumentÚBaseTyÚBaseTypeÚListTypeÚNativeFunctionÚOptionalTypeÚType)ÚSequence)ÚBindingÚCTypeÚ
NamedCTypez
	Úfr   ÚreturnÚstrc                ó>   — | j         j                             ¦   «         S )N)ÚfuncÚnameÚunambiguous_name)r   s    úQC:\Projects\Historical\venv\Lib\site-packages\torchgen/executorch/api/unboxing.pyr   r      s   € ØŒ6Œ;×'Ò'Ñ)Ô)Ð)ó    T)Úfrozenc                  óL   — e Zd ZU dZded<   dd„Zd	d
œdd„Zdd„Zd d„Zd!d„Z	dS )"Ú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);


    }
    zCallable[..., NamedCType]Úargument_type_genÚargsúSequence[Binding]r   útuple[list[Binding], list[str]]c                óÌ  ‡— ˆfd„t          t          ‰¦  «        ¦  «        D ¦   «         }g }‰D ]³}t          |j        t          ¦  «        st          d|› �¦  «        ‚|j        }|                      |j        |j        |j	        ¬¦  «        \  }}}}	| 
                    |	¦  «         | 
                    |¦  «         |                     |                     |¦  «        ¦  «         Œ´||fS )Nc                ó8   •— g | ]}d ‰|         j         › d|› d�‘ŒS )zEValue& z
 = *stack[z];)r   )Ú.0Úir   s     €r   ú
<listcomp>z.Unboxing.convert_arguments.<locals>.<listcomp>?   s3   ø€ ÐXÐXÐXÀ!Ð=  Q¤¤Ð=Ð=¸Ð=Ð=Ð=ÐXÐXÐXr   z7Unexpected argument type, expecting `Argument` but got ©Úmutable)ÚrangeÚlenÚ
isinstanceÚargumentr   Ú	ExceptionÚargumenttype_evalue_convertÚtyper   Úis_writeÚextendÚappendÚ	with_name)
Úselfr   Ú	code_listÚbinding_listÚargr,   Úunboxed_nameÚ_ÚcodeÚdecls
    `        r   Úconvert_argumentszUnboxing.convert_arguments<   s  ø€ ð YÐXÐXÐXÅuÍSÐQUÉYÌYÑGWÔGWÐXÑXÔXˆ	ØˆØð 	=ð 	=ˆCå˜cœl­HÑ5Ô5ð ÝØSÈcÐSÐSñô ð ð "%¤ˆHØ*.×*JÒ*JØ”˜xœ}°hÔ6Gð +Kñ +ô +Ñ'ˆL˜!˜T 4ð ×Ò˜TÑ"Ô"Ð"Ø×Ò˜TÑ"Ô"Ð"Ø×Ò §¢¨lÑ ;Ô ;Ñ<Ô<Ð<Ð<Ø˜YÐ&Ð&r   Fr'   Útr   Úarg_namer   r(   Úboolú'tuple[str, CType, list[str], list[str]]c               óº  — |                       |||¬¦  «        j        }t          |t          ¦  «        r!|› d�}|                      |||¬¦  «        \  }}nƒt          |t
          ¦  «        r"|› d�}|                      ||||¬¦  «        \  }}nLt          |t          ¦  «        r"|› d�}|                      ||||¬¦  «        \  }}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)r>   Úout_nameÚctypeÚ_opt_out)r>   rD   r=   rE   Ú	_list_outzCannot handle type z. arg_name: )
r   r/   r+   r	   Ú_gen_code_base_typer   Ú_gen_code_optional_typer
   Ú_gen_code_list_typer-   )r4   r=   r>   r(   rE   rD   r:   r;   s           r   r.   z$Unboxing.argumenttype_evalue_convertP   s6  € ð ×&Ò& q°'ÀÐ&ÑJÔJÔOˆå�a�Ñ"Ô"ð 	Ø"Ð)Ð)Ð)ˆHØ×1Ò1Ø!¨H¸Eð 2ñ ô ‰JˆD�$�$õ ˜�<Ñ(Ô(ð 	Ø"Ð,Ð,Ð,ˆHØ×5Ò5Ø!¨H¸Àð 6ñ ô ‰JˆD�$�$õ ˜�8Ñ$Ô$ð 	Ø"Ð-Ð-Ð-ˆHØ×1Ò1Ø!¨H¸Àð 2ñ ô ‰JˆD�$�$õ Ø? aÐ?Ð?°XÐ?Ð?ñô ð ð ˜  dÐ*Ð*r   rD   rE   r   útuple[list[str], list[str]]c           	     óp   — |                      ¦   «         › d|› d|› d|                      d¬¦  «        › d�gg fS )Nú ú = z.to<T©Ú	strip_refz>();)Úcpp_type)r4   r>   rD   rE   s       r   rH   zUnboxing._gen_code_base_types   sS   € ð �~Š~ÑÔÐaÐa (ÐaÐa¨xÐaÐa¸U¿^º^ÐVZ¸^Ñ=[Ô=[ÐaÐaÐað
àðð 	r   r   c                ó¶   — |› d�}|                       |j        |¦  «        \  }}}}	d|› d|› d|                     d¬¦  «        › d�                     d¦  «        |	fS )	NÚ_opt_inú

    auto rN   z.toOptional<TrO   z>();
            ú
)r.   ÚelemrQ   Úsplit)
r4   r>   rD   r=   rE   Úin_nameÚres_nameÚ	base_typeÚres_coder;   s
             r   rI   z Unboxing._gen_code_optional_typez   s‘   € ð Ð&Ð&Ð&ˆØ.2×.NÒ.NØŒF�Gñ/
ô /
Ñ+ˆ�)˜X tðØ
ðð Øðð Ø-6×-?Ò-?È$Ð-?Ñ-OÔ-Oðð ð ç’�d‘”Øð	
ð 	
r   r
   c                óv  — |› d�}|› d�}g }|                       |j        |¦  «        \  }}	}
}t          |j        t          ¦  «        rK|j        j        t
          j        k    r1|                     d|› d|› d�                     d¦  «        ¦  «         �n¥t          |j        t          ¦  «        re|j        j        t
          j	        k    s|j        j        t
          j
        k    r1|                     d|› d|› d�                     d¦  «        ¦  «         �n&t          |j        t          ¦  «        rK|j        j        t
          j        k    r1|                     d|› d|› d�                     d¦  «        ¦  «         �nÁt          |j        t          ¦  «        rh|j        j        t
          j        k    rN|                     d	|j        › d
|› d|› d|› d|› d|› d|› d|› d|› d|› d�                     d¦  «        ¦  «         �n?t          |j        t          ¦  «        rƒt          |j        j        t          ¦  «        rd|j        j        j        t
          j        k    rE|                     d|› d|› d|› d|› d|› d|› d|› d|› d|› d�                     d¦  «        ¦  «         n¢|dz   }|                     d|	                     d¬¦  «        › d
|› d�¦  «         |                     d|› d|› dt"                               |
¦  «        › d|› d|› d |                     d¬¦  «        › d!|› d"|› d#�                     d¦  «        ¦  «         ||fS )$NÚ_list_inÚ_elemrT   rN   z!.toTensorList();
                rU   z.toIntList();
                z!.toDoubleList();
                z&
#ifdef USE_ATEN_LIB
std::array<bool, z> z;
auto z(.toBoolList();
size_t _i = 0;
for (auto z: z) {
    z	[_i++] = z;
}
#else
auto z&.toBoolList();
#endif
                z
#ifdef USE_ATEN_LIB
auto z@.toListOptionalTensor();
c10::List<::std::optional<at::Tensor>> z;
for (auto z.push_back(z);
}
#else
auto z0.toListOptionalTensor();
#endif
                Ú_veczstd::vector<TrO   ú;z
    for (EValue z) {
        z	
        z);
    }
    rM   ú(z);
                )r.   rV   r+   r	   r   r   ÚTensorr1   rW   ÚintÚSymIntÚfloatr?   Úsizer   r2   rQ   Ú	connectorÚjoin)r4   r>   rD   r=   rE   rX   Ú	elem_namer:   rY   Ú	res_ctyper[   r;   Úvec_names                r   rJ   zUnboxing._gen_code_list_typeˆ   s   € ð Ð'Ð'Ð'ˆØÐ&Ð&Ð&ˆ	ØˆØ.2×.NÒ.NØŒF�Iñ/
ô /
Ñ+ˆ�)˜X tõ �a”f�hÑ'Ô'ð G	¨A¬F¬K½6¼=Ò,HÐ,HØ�KŠKðØ
ðð Øðð ð ç’E˜$‘K”Kñô ð ñ õ
 ˜œ¥Ñ)Ô)ð A	ØŒFŒK�6œ:Ò%Ð%¨¬¬½¼Ò)EÐ)Eà�KŠKðØ
ðð Øðð ð ç’E˜$‘K”Kñô ð ñ õ
 ˜œ¥Ñ)Ô)ð 9	¨a¬f¬k½V¼\Ò.IÐ.IØ�KŠKðØ
ðð Øðð ð ç’E˜$‘K”Kñô ð ñ õ
 ˜œ¥Ñ)Ô)ð 3	¨a¬f¬k½V¼[Ò.HÐ.Hà�KŠKðà”&ðð à$ðð ð ðð ð ðð ð
 ðð ð
  ðð ð ðð ð "ðð ð ðð ð ðð ð ÷ ’E˜$‘K”Kñô ð ñ õ" �q”v�|Ñ,Ô,ð!	å˜1œ6œ;­Ñ1Ô1ð!	ð ””Ô ¥F¤MÒ1Ð1à�KŠKð
àð
ð 
àð
ð 
ð )1ð
ð 
ð ð	
ð 
ð  ð	
ð 
ð
 ð
ð 
ð
 $ð
ð 
ð ð
ð 
ð ð
ð 
ð 
÷ ’E˜$‘K”Kñô ð ð ð   &Ñ(ˆHà�KŠKØP˜y×1Ò1¸DÐ1ÑAÔAÐPÐPÀXÐPÐPÐPñô ð ð �KŠKðØðð Ø%ðð å	�Š˜Ñ	!Ô	!ðð ð 
ðð ð 'ðð ð
 ‡^‚^˜d€^Ñ#Ô#ðð ð
 '/ðð ð
 2:ðð ð ÷ ’E˜$‘K”Kñô ð ð �TˆzÐr   N)r   r    r   r!   )r=   r   r>   r   r(   r?   r   r@   )r>   r   rD   r   rE   r   r   rK   )
r>   r   rD   r   r=   r   rE   r   r   rK   )
r>   r   rD   r   r=   r
   rE   r   r   rK   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r<   r.   rH   rI   rJ   © r   r   r   r      s®   € € € € € € ðð ð*ð ð ñ ð'ð 'ð 'ð 'ð* :?ð!+ð !+ð !+ð !+ð !+ð !+ðFð ð ð ð
ð 
ð 
ð 
ðRð Rð Rð Rð Rð Rr   r   N)r   r   r   r   )Ú
__future__r   Údataclassesr   Útypingr   r   Útorchgen.modelr   r   r	   r
   r   r   r   Úcollections.abcr   Útorchgen.api.typesr   r   r   rg   r   r   rq   r   r   ú<module>rx      sF  ðØ "Ð "Ð "Ð "Ð "Ð "à !Ð !Ð !Ð !Ð !Ð !Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð >Ø(Ð(Ð(Ð(Ð(Ð(à=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ð €	ð*ð *ð *ð *ð €�$ÐÑÔðzð zð zð zð zñ zô zñ Ôðzð zð zr   