o
    f#                     @   s   d dl mZmZmZmZ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 d dlmZmZmZ g dZdd	 eD Zee g d
 Zdd ZG dd deZdd ZG dd deZG dd deZdd Zdd Zdd ZdS )   )Nodes	ExprNodes	FusedNodeTreeFragmentPipelineParseTreeTransformsNaming	UtilNodes)error)
PyrexTypes)CythonUtilityCode)TempitaUtilityCodeUtilityCode)	PrintTreeTreeVisitorVisitorTransform)	NPY_BYTENPY_INT8	NPY_SHORT	NPY_INT16NPY_INT	NPY_INT32NPY_LONGNPY_LONGLONG	NPY_INT64c                 C   s   g | ]}| d dqS )NPY_NPY_U)replace).0tp r    R/var/www/html/mig_web/myenv/lib/python3.10/site-packages/Cython/Compiler/UFuncs.py
<listcomp>   s    r"   )	NPY_FLOATNPY_FLOAT32
NPY_DOUBLENPY_FLOAT64NPY_LONGDOUBLEc                 C   s~   |j r|tjkr
dS |tjkrdS |tjkrdS n|jr1|  dd}d| }|t	v r0|S n|j
r6dS t| d|  d S )	N
NPY_CFLOATNPY_CDOUBLENPY_CLONGDOUBLE  zNPY_%s
NPY_OBJECTz,Type '%s' cannot be used as a ufunc argument)
is_complexr   c_float_complex_typec_double_complex_typec_longdouble_complex_type
is_numericempty_declaration_codeupperr   numpy_numeric_typesis_pyobjectr
   )postype_postfixtypenamer    r    r!   _get_type_constant+   s"   


r;   c                   @   s,   e Zd ZdZdZdd Zdd Zdd ZdS )	_FindCFuncDefNodezf
    Finds the CFuncDefNode in the tree

    The assumption is that there's only one CFuncDefNode
    Nc                 C   s   | j rd S | | d S N)
found_nodevisitchildrenselfnoder    r    r!   
visit_NodeI   s   z_FindCFuncDefNode.visit_Nodec                 C   s
   || _ d S r=   )r>   r@   r    r    r!   visit_CFuncDefNodeO      
z$_FindCFuncDefNode.visit_CFuncDefNodec                 C   s   |  | | jS r=   )visitr>   )rA   treer    r    r!   __call__R   s   
z_FindCFuncDefNode.__call__)__name__
__module____qualname____doc__r>   rC   rD   rH   r    r    r    r!   r<   @   s    r<   c                 C   s
   t  | S r=   )r<   )rG   r    r    r!   get_cfunc_from_treeW   rE   rM   c                   @   s   e Zd ZdZdd ZdS )_ArgumentInfoz
    Everything related to defining an input/output argument for a ufunc

    type  - PyrexType
    type_constant  - str such as "NPY_INT8" representing numpy dtype constants
    c                 C   s   || _ || _d S r=   )typetype_constant)rA   rO   rP   r    r    r!   __init__c   s   
z_ArgumentInfo.__init__N)rI   rJ   rK   rL   rQ   r    r    r    r!   rN   [   s    rN   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )UFuncConversionc                 C   s*   || _ |j | _|  | _|  | _d S r=   )rB   local_scopeglobal_scopeget_in_type_infoin_definitionsget_out_type_infoout_definitionsr@   r    r    r!   rQ   i   s   
zUFuncConversion.__init__c                 C   s@   g }t | jjD ]\}}t| jj|j}|t|j| q|S r=   )	enumeraterB   argsr;   r7   rO   appendrN   )rA   definitionsnarg
type_constr    r    r!   rU   p   s
   z UFuncConversion.get_in_type_infoc                 C   sT   | j jjr| j jj}n| j jg}g }t|D ]\}}|t|t| j j| q|S r=   )	rB   return_type	is_ctuple
componentsrY   r[   rN   r;   r7   )rA   rb   r\   r]   rO   r    r    r!   rW   w   s   

z!UFuncConversion.get_out_type_infoc           	   	   C   s   dd | j D }dd | jD }| jjjj| jjjdd}d| jj_| j	| jjj
d }tdd |D p>td	d |D  }t|||| jjj|| jjjj|d
}tjdd|| jd}|jdd}|S )Nc                 S      g | ]}|j qS r    rO   r   ar    r    r!   r"          z<UFuncConversion.generate_cy_utility_code.<locals>.<listcomp>c                 S   rc   r    rd   re   r    r    r!   r"      rg   T)pyrex
_ufunc_defc                 s       | ]}|j V  qd S r=   r6   r   tr    r    r!   	<genexpr>       z;UFuncConversion.generate_cy_utility_code.<locals>.<genexpr>c                 s   rj   r=   rk   rl   r    r    r!   rn      ro   )
func_cnamein_types	out_typesinline_func_callinline_func_declarationnogilwill_be_called_without_gilUFuncDefinitionz
UFuncs.pyx)contextouter_module_scope)entries_only)rV   rX   rB   entryrO   declaration_codecnameusedrT   next_idnameanydictru   r   loadget_tree)	rA   	arg_typesrr   inline_func_declufunc_cnamerv   rx   coderG   r    r    r!   generate_cy_utility_code   s6   




z(UFuncConversion.generate_cy_utility_codec                 C   s,   | j tdd | j tdd d S )N
UFuncsInit
UFuncs_C.cNumpyImportUFunczNumpyImportArray.c)rT   use_utility_coder   load_cached)rA   r    r    r!   use_generic_utility_code   s   

z(UFuncConversion.use_generic_utility_codeN)rI   rJ   rK   rQ   rU   rW   r   r   r    r    r    r!   rR   h   s    !rR   c                 C   s   t | tjr| jjjrt| jd | S t| g}| }n/t | t	j
rBt | jtjrB| jjjjr6t| jd | S dd | jD }| j}nt| jd | S |sNd S |d jj|jj= |d   | gt|| S )Nz0Methods cannot currently be converted to a ufuncc                 S   s   g | ]}t |qS r    )rR   )r   r]   r    r    r!   r"          z$convert_to_ufunc.<locals>.<listcomp>z,Only C functions can be converted to a ufunc    )
isinstancer   CFuncDefNoderS   parent_scopeis_c_class_scoper
   r7   rR   r   FusedCFuncDefNoderB   nodesrT   entriesr{   r   r   _generate_stats_from_converters)rB   
convertersoriginal_noder    r    r!   convert_to_ufunc   s*   

r   c                 C   s  | d j }|tjd }|tjd }|tjd }g }d }d }	| D ]>}
dd |
jD }|d ur<|t|ks;J nt|}|| dd |
jD }|	d urZ|	t|ksYJ nt|}	|| q%dd |D }t|||||d	}|	t
jd
d|d |j}|jj}|j}d|||t|||	||r| ndf }tj|dttjtdtjd gtj|tj|dgd}||tj|}tj|tj||tj|d|d}|S )Nr   funcstypesdatac                 S   rc   r    rP   r   dr    r    r!   r"      rg   z1generate_ufunc_initialization.<locals>.<listcomp>c                 S   rc   r    r   r   r    r    r!   r"      rg   c                 S   s   g | ]}|j jqS r    )r{   r}   )r   cfnoder    r    r!   r"      r   )ufunc_funcs_namefunc_cnamesufunc_types_nametype_constantsufunc_data_nameUFuncConstsr   )rx   z5%s(), %s, %s(), %s, %s, %s, PyUFunc_None, "%s", %s, 0NULLPyUFunc_FromFuncAndDatadummy)rO   value)function_name	func_typerZ   )r   rO   r{   )lhsrhs)rT   r   r   pyrex_prefixrV   lenextendrX   r   r   r   r   r7   r{   r   docas_c_string_literalr   PythonCapiCallNoder   	CFuncTypepy_object_typeCFuncTypeArgc_void_ptr_type	ConstNodedeclare_varr   SingleAssignmentNodeNameNode)r   cfunc_nodesr   rT   r   r   r   r   narg_innarg_outcin_const	out_constr   rx   r7   	func_namedocstrargs_to_func	call_node	lhs_entry
assgn_noder    r    r!   generate_ufunc_initialization   s~   


r   c                 C   sP   g }| D ]}|  }t|}|jj|jj || q|t| || |S r=   )r   rM   rT   utility_code_listr   scoper[   r   )r   rB   stats	converterrG   
ufunc_noder    r    r!   r     s   r   N) r,   r   r   r   r   r   r   r   r	   Errorsr
   r   r   r   Coder   Visitorr   r   r   numpy_int_typesnumpy_uint_typesr5   r;   r<   rM   objectrN   rR   r   r   r   r    r    r    r!   <module>   s,   ( 
FJ