U
    dT=                     @   sB  d dl m  mZ d dlmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlZd dlmZmZmZmZmZ eeeeef  edddZed	Zeed
ddZeee
ef eeeef  dddZedZ eedddZ!edZ"edZ#ee$dddZ%eee
ef e$eedddZ&ee$edddZ'ee$edddZ(ej)d ej$d!ej*d"ejd#ej+d!ej,d!ejd$iZ-eeeeee f  d
d%d&Z.eed
d'd(Z/eeed)d*d+Z0eeed)d,d-Z1eeed)d.d/Z2eeed)d0d1Z3ed2Z4e	ed3d4d5Z5eed
d6d7Z6G d8d9 d9Z7G d:d; d;Z8dS )<    N)native_function_manager)
ArgumentBackendIndexBaseTyFunctionSchemaOptionalTypeSelfArgumentBaseTypeNativeFunctionsGroupTensorOptionsArgumentsType)config)ListOptionalSequenceTupleUnion)	argumentsreturnc                 C   s6   | D ],}t |dd }|sqt |dd}|r dS qdS )N
annotation	alias_set TF)getattr)r   argr   r   r   r   E/tmp/pip-unpacked-wheel-ua33x9lu/torchgen/static_runtime/generator.py	has_alias   s    r   )Zsparse_sampled_addmmZhspmmZsspaddmmZfloor_dividegerZconj_physicalZbinary_cross_entropyZarccoshZcholeskyZlu_solveZlinalg_choleskyZlinalg_householder_productZ_compute_linear_combinationgr   c                 C   s   | j jjjj}|tkrdS t| r(dS | jsbt| dr^t	| j j
dr^t	| j jj
dsbdS t| j jjjrvdS t| j jjj dkrdS dt| j jj krdS | j j D ]}t|j}|s dS qdS )NFoutzTensor(a!) out) -> Tensor(a!)z.out   zat::Tensor &T)r   funcnamebaseBLOCKED_OPSr   Zis_hand_written
structuredhasattrstrendswithr   r   non_outlencppZreturns_typereturnsZcpp_typeschema_order_argumentsivalue_type_conversion_methodtype)r   Zbase_op_namer   maybe_methodr   r   r   is_supported:   s0    

r1   )arg_typer   c                 C   s   t jdt jdt jdt jdt jdt jdi}d}t| tr>| j	}n(t| t
rbt| jtsXdS | jj	}ndS ||krrdS || }t| tr|d S |d	 S )
aD  
    Return the method call expression of `c10::ivalue' to convert its contained value to
    the expected value of `arg_type` type. For example, for `arg_type` == BaseTy.Tensor,
    this function returns ".toTensor()", so that it can be appended to the ivalue's
    variable name to get the value of the expected type.
    ))Tz
toTensor())FztoOptional<at::Tensor>()))FztoInt())FztoOptional<int64_t>()))FztoBool())FztoOptional<bool>()))Fz
toScalar())FztoOptional<at::Scalar>()))FztoScalarType())FztoOptional<at::ScalarType>()))FztoStringView())FztoOptional<c10::string_view>()Nr   r    )r   TensorintboolScalar
ScalarTyper'   
isinstancer	   r"   r   elem)r2   Ztype_conversion_methodsbase_ty_objectmethodsr   r   r   r.   [   s6    
      



r.   )
Zbitwise_notZbitwise_andZ
bitwise_orZbitwise_xorgcdZlcmZscatterZgather _convert_indices_from_coo_to_csr _convert_indices_from_csr_to_coo)op_namer   c                 C   s   | t kS N)should_use_int_tensor_ops_r?   r   r   r   should_use_int_tensor   s    rC   )	Zaddmv	index_addr=   r>   Znll_loss_backwarddotvdotouterr   )Zaddmmmmnuclear_normZdiagZ_addmm_activationc                 C   s   | t krdS | tkrdS dS )Nr          )test_tensor_dim_ops_1_test_tensor_dim_ops_2_rB   r   r   r   test_tensor_dim   s
    rN   )r2   indexr?   r   c                 C   s   |dkrdnd}t |}t|t| }||d 7 }dd| g|  }t|rbd| d}nd	| d
}tj|tjdtj	dtj
dtjdtjdi}d }	t| tr| j}	n"t| trt| jtst| jj}	|	|kstd||	 }
|
S )Nr      @   rJ   z{%s},zat::randint(1, 100, z, at::kInt)z	at::rand()1false2zat::ScalarType::Floatz"floor"znot expected type)rN   mathceilfloatjoinrC   r   r3   r4   r5   r6   r7   r'   r8   r	   r"   r   r9   AssertionError)r2   rO   r?   Znum_tensorsZnum_dimZsize_per_dimZtensor_size_exZtensor_expressionZvalue_expressionsr:   Zvalue_expressionr   r   r   test_value_expression   s@          	
 r\   )r   rO   r   c           
      C   s   | j j}| rt|jjj}i }| D ]}t|j||}|||j< q*t	
||| g }| D ]"\}}	|d| | d|	  qbd|d S )Nzauto z = ;
    ;)
functionalr!   	is_out_fnr[   r"   r#   r-   r\   r/   r   Zoverride_test_valuesitemsappendrZ   )
r   rO   schemaZschema_nameZarg_mapr   Ztest_value_exparg_populationsarg_name	arg_valuer   r   r   generate_test_value_definitions   s    
rg   c                    s0   | j j}| rtd fdd| D S )NrR   c                 3   s   | ]}|j    V  qd S r@   r"   .0r   rO   r   r   	<genexpr>   s     z,generate_test_value_names.<locals>.<genexpr>)r_   r!   r`   r[   rZ   r-   )r   rO   rc   r   rk   r   generate_test_value_names   s    rm   r3   r4   rY   r'   r5   c                    sF   t tttt f ddd | jj}| r0t fdd| D S )N)r   r   c                 S   sd   | j }d}t|tr|j}d}t|ts,td }|jtkrDt|j }|rV|rV| d}d| j |fS )NFT?%)r/   r8   r   r9   r	   r[   r"   /generate_test_ir_arguments_base_ty_to_type_str_)r   tZadd_optionalZtype_strr   r   r   ir_argument   s    



z/generate_test_ir_arguments.<locals>.ir_argumentc                    s   g | ]} |qS r   r   ri   rr   r   r   
<listcomp>
  s     z.generate_test_ir_arguments.<locals>.<listcomp>)	r   r   r'   r   r_   r!   r`   r[   r-   )r   rc   r   rs   r   generate_test_ir_arguments   s    ru   c           	      C   s   | j j}| rtg }t| D ]R\}}t|j}|s>t|\}}|rNdnd}|d| d|j	 d| d|  q$d
|d S )	N& z
const auto z = p_node->Input(z).r]   r^   )r_   r!   r`   r[   	enumerater-   r.   r/   rb   r"   rZ   )	r   rc   rd   ir   r0   Zis_referenceZtype_conversion_method	referencer   r   r   generate_arg_extraction  s    
r|   r   backend_indexr   c                 C   s.   | | j}| js|d kr(t| jjS |jS r@   )
get_kernelr_   r%   r+   r"   r!   kernelr   r~   r   r   r   r   get_kernel_name  s    r   c                 C   s.   | | j}| js|d kr(t| jjS |jS r@   )r   r   r%   r+   r"   r!   r   r   r   r   r   get_out_kernel_name#  s    r   c                 C   s\   | j j}| rtt| |}dd | D }| jr:dnd}d| d| dd| d	S )
Nc                 s   s   | ]}|j V  qd S r@   rh   ri   r   r   r   rl   0  s     z0generate_non_out_variant_call.<locals>.<genexpr>cpunativeat::::(rR   rS   )r_   r!   r`   r[   r   r-   r%   rZ   )r   r~   rc   kernel_name	arg_namesnamespace_namer   r   r   generate_non_out_variant_call*  s    
r   c           	      C   s   | j j}| stg }t| |}| jr<dd |jj D }ng }|jjD ]8}t|t	rf|
|jj qHt|tstt|
|j qH| jst|jj dkst|
|jj d j t|}d|}| jrdnd}d| d	| d
| dS )Nc                 S   s   g | ]
}|j qS r   rh   )rj   Zout_argr   r   r   rt   >  s     z-generate_out_variant_call.<locals>.<listcomp>r    r   rR   r   r   r   r   r   rS   )r   r!   r`   r[   r   r%   r   r)   r8   r   rb   argumentr"   r   r*   r+   rZ   )	r   r~   rc   r   r   r   Zcpp_func_nameZcpp_arg_namesr   r   r   r   generate_out_variant_call5  s&    



r   )zisin.Scalar_TensorrD   rE   rF   rI   ZhistcZl1_lossZmulti_margin_lossZmultilabel_margin_lossZnll_lossZ
nll_loss2d)rc   r   c                 C   s"   t | }|d |d }|tkS )Nr   )r'   findno_memory_resize_ops)rc   Z
schema_strtype_variant_op_namer   r   r   should_check_resizea  s    r   c                 C   s   | j jjjjS r@   )r_   r!   r"   r#   )r   r   r   r   op_name_from_groupg  s    r   c                   @   s4   e Zd Zee eedddZeeedddZdS )GenOutVariantDispatcher)groupsr~   r   c           	   
   C   s   |sdS g }|D ]H}t |6 t|s*tt|ts8t| ||}|| W 5 Q R X qt|d }d|}d| d| d| d}|S )Nrw   r   
z&
REGISTER_OPERATOR_FUNCTOR(
    aten::z,
    aten_z(,
    [](Node* n) -> SROperator {
      z:
      LogAndDumpSchema(n);
      return nullptr;
    });
)	r   r1   r[   r8   r
   op_generatorrb   r   rZ   )	selfr   r~   generated_type_variantsr   generated_type_variantr?   body	generatedr   r   r   __call__l  s&    


z GenOutVariantDispatcher.__call__r}   c                 C   s   |j }t|j}t|}t|}t||}t|jjjjdksBt	t|jjjjd j
}t||}	d| d| d| d| d| d|	 d	}
|
S )
Nr    r   z+
      if (n->matches(torch::schema("aten::z<"))) {
        return [](ProcessedNode* p_node) {
          zM
          if (p_node->Output(0).isNone()) {
            p_node->Output(0) = z2;
            return;
          }
          auto& z< = p_node->Output(0).toTensor();
          fastResizeToZero(z);
          z;
        };
      })r_   r'   r!   r   r|   r   r*   r   r   r[   r"   r   )r   r   r~   r_   rc   r?   Zpopulated_argumentZfunctional_variant_callZout_variable_nameZout_variant_callr   r   r   r   r     s,    



z$GenOutVariantDispatcher.op_generatorN)	__name__
__module____qualname__r   r
   r   r'   r   r   r   r   r   r   r   k  s
    r   c                   @   s0   e Zd Zee edddZeedddZdS )GenOutVariantDispatcherTestCase)r   r   c              
   C   sb   |sdS g }|D ]F}t |4 t|s*tt|ts8t| |}|| W 5 Q R X qd|S )Nrw   r   )r   r1   r[   r8   r
   test_case_generatorrb   rZ   )r   r   r   r   r   r   r   r   r     s    

z(GenOutVariantDispatcherTestCase.__call__r   c                 C   s@  |j }t|j}|ddks"t|d |d dd}t|}||sRtt|}d	dd |D }d	dd |D }t
|jjd	krt|jjd jtr|jjd jjtjkstt|d}	t|d}
t|d	}t|d	}t|jrd
nd}d| d| d| d| d|	 d|
 d| d| d| d| d}|S )Nr   r   ._z, c                 s   s,   | ]$\}}|d kr|n| d| V  qd S )Nz: r   )rj   re   r2   r   r   r   rl     s   zFGenOutVariantDispatcherTestCase.test_case_generator.<locals>.<genexpr>c                 s   s   | ]\}}|V  qd S r@   r   )rj   re   r   r   r   r   rl     s     r    truerU   z
TEST(StaticRuntime, autogen_z1) {
  const std::string script = R"IR(
    graph(z?):
        %bias: None = prim::Constant()
        %ret = aten::zQ)
        %cloned = aten::clone(%ret, %bias)
        return (%cloned)
  )IR";

  z
  std::vector<IValue> args{zj};
  testStaticRuntime(script, args, {}, /*use_allclose=*/false, /*use_equalnan=*/false, /*check_resize=*/z);

  z
  std::vector<IValue> args2{zm};
  testStaticRuntime(script, args, args2, /*use_allclose=*/false, /*use_equalnan=*/false, /*check_resize=*/z);

}
)r_   r'   r!   r   r[   replacer   
startswithru   rZ   r*   r,   r8   r/   r	   r"   r   r3   rg   rm   r   )r   r   r_   rc   r   r?   Z	arg_typesZarg_declarationsr   Ztest_value_definitionsZtest_value_namesZtest_value_definitions2Ztest_value_names2Zcheck_resizer   r   r   r   r     s\    





z3GenOutVariantDispatcherTestCase.test_case_generatorN)r   r   r   r   r
   r'   r   r   r   r   r   r   r     s   r   )9Ztorchgen.api.cppapir+   Ztorchgen.contextr   Ztorchgen.modelr   r   r   r   r   r   r	   r
   r   r   Ztorchgen.static_runtimer   rW   typingr   r   r   r   r   r5   r   	frozensetr$   r1   r'   r.   rA   rC   rL   rM   r4   rN   r\   rg   rm   r3   rY   r6   r7   rp   ru   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   0"+	  #         4