
    -Phz*                         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 d dlmZ d dl mZ  G d d	e          Zd
 Z G d d          Z G d d          Zd Zd Zd ZdS )   )Nodes	ExprNodes	FusedNodeNaming)error)
PyrexTypes)CythonUtilityCode)TempitaUtilityCodeUtilityCode)TreeVisitor)Symtabc                   (    e Zd ZdZdZd Zd Zd ZdS )_FindCFuncDefNodezf
    Finds the CFuncDefNode in the tree

    The assumption is that there's only one CFuncDefNode
    Nc                 B    | j         rd S |                     |           d S N)
found_nodevisitchildrenselfnodes     V/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/Cython/Compiler/UFuncs.py
visit_Nodez_FindCFuncDefNode.visit_Node   s+    ? 	%Ft$$$$$    c                     || _         d S r   )r   r   s     r   visit_CFuncDefNodez$_FindCFuncDefNode.visit_CFuncDefNode   s    r   c                 :    |                      |           | j        S r   )visitr   )r   trees     r   __call__z_FindCFuncDefNode.__call__!   s    

4r   )__name__
__module____qualname____doc__r   r   r   r    r   r   r   r      sR          J% % %      r   r   c                 0     t                      |           S r   )r   )r   s    r   get_cfunc_from_treer&   &   s    t$$$r   c                       e Zd ZdZd ZdS )_ArgumentInfoa/  
    Everything related to defining an input/output argument for a ufunc

    type  - PyrexType
    type_constant  - str such as "NPY_INT8" representing numpy dtype constants
    injected_typename - str representing a name that can be used to look up the type
                        in Cython code
    c                 0    || _         || _        || _        d S r   )typetype_constantinjected_typename)r   r*   r+   r,   s       r   __init__z_ArgumentInfo.__init__4   s    	*!2r   N)r    r!   r"   r#   r-   r$   r   r   r(   r(   *   s-         3 3 3 3 3r   r(   c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	UFuncConversionc                    || _         |j                                        | _        d| _        | j         j        j                            | j                  r9| xj        dz  c_        | j         j        j                            | j                  9g | _        |                                 | _	        | 
                                | _        d S )Nufunc_typename_)r   local_scopeglobal_scoper,   entrycname
startswithinjected_typesget_in_type_infoin_definitionsget_out_type_infoout_definitionsr   s     r   r-   zUFuncConversion.__init__;   s    	 ,99;;!1io#..t/EFF 	*""c)"" io#..t/EFF 	* "3355#5577r   c                 .   |                                 }|                                                    dd                              dd          }t          |||          }| j                            t          j        dd|                     d| S )	Nr2   __ )type_substituted_cname
macro_name
type_cnameUFuncTypedef
UFuncs_C.ccontext__Pyx_typedef_ufunc_)empty_declaration_codestripreplacedictr4   use_utility_coder
   load)r   type_rA   declsubstituted_cnamerF   s         r   _handle_typedef_type_constantz-UFuncConversion._handle_typedef_type_constantF   s    ++-- JJLL00d;;CCCMM#4!
 
 

 	**#  	 	 	 :&7999r   c                    |}|j         r|j        }t          j        |          }|t          j        u rt          |d|z             d S |j        r|                     |d          S |j        rKd}|j	        t          j
        k    rd}n|j	        t          j        k    rd}|                     |d| d          S |j        r|                     |d          S |j        rd	S t          |d|z             d S )
Nz,Type '%s' cannot be used as a ufunc argument__PYX_GET_NPY_COMPLEX_TYPE SU__PYX_GET_NPY_INT_TYPE__PYX_GET_NPY_FLOAT_TYPE
NPY_OBJECT)
is_typedeftypedef_base_typer   remove_cv_refc_bint_typer   
is_complexrQ   is_intsignedSIGNEDUNSIGNEDis_floatis_pyobject)r   posrN   	base_typera   s        r   _get_type_constantz"UFuncConversion._get_type_constantV   s<   	 	4!3I,Y77	
...#EMNNNF 	 5502 2 2 \ 	 F|z000!4445511113 3 3 ^ 	 55*, , ,  	 < 	cAEIJJJJJr   c                 0   g }t          | j        j                  D ]y\  }}| j         d| }| j                            |           |                     | j        j        |j                  }|                    t          |j        ||                     z|S )N_in_)
	enumerater   argsr,   r8   appendrh   rf   r*   r(   )r   definitionsnargr,   
type_consts         r   r9   z UFuncConversion.get_in_type_infov   s    	// 	W 	WFAs#'#9 B Bq B B&&'899900IIJ}SXzCTUUVVVVr   c                 h   | j         j        j        r| j         j        j        }n| j         j        g}g }t	          |          D ]o\  }}| j         d| }| j                            |           |                     | j         j	        |          }|                    t          |||                     p|S )N_out_)r   return_type	is_ctuple
componentsrk   r,   r8   rm   rh   rf   r(   )r   rv   rn   ro   r*   r,   rq   s          r   r;   z!UFuncConversion.get_out_type_info   s    9 * 	1.9JJ)/0J ,, 	 	GAt#'#9 C C C C&&'899900EEJdJ0ABB    r   c           
         d | j         D             }d | j        D             }t          ||z             }d| j        j        _        | j                            | j        j        j        dz             }t          d |D                       pt          d |D                        }t          d|||| j        j        j
        | j        j        j        j        |d|}t          j        dd | j        j                  }|                    | j        j        j
        | j        j        j
        | j        j        j        | j        j        d	
           t%          j        dd||          }|                    d          }	|	S )Nc                 *    g | ]}|j         |j        fS r$   r,   r*   .0as     r   
<listcomp>z<UFuncConversion.generate_cy_utility_code.<locals>.<listcomp>   s"    PPPqa)162PPPr   c                 *    g | ]}|j         |j        fS r$   ry   rz   s     r   r}   z<UFuncConversion.generate_cy_utility_code.<locals>.<listcomp>   s"    QQQqa)162QQQr   T
_ufunc_defc              3   *   K   | ]\  }}|j         V  d S r   re   r{   r2   ts      r   	<genexpr>z;UFuncConversion.generate_cy_utility_code.<locals>.<genexpr>   s(      -R-R1am-R-R-R-R-R-Rr   c              3   *   K   | ]\  }}|j         V  d S r   r   r   s      r   r   z;UFuncConversion.generate_cy_utility_code.<locals>.<genexpr>   s(      44$!Q444444r   )
func_cnamein_types	out_typesinline_func_callnogilwill_be_called_without_gilufunc_moduleextern)namer6   r*   rf   
visibilityUFuncDefinitionz
UFuncs.pyx)rF   
from_scope)entries_onlyr$   )r:   r<   rK   r   r5   usedr4   next_idr   anyr6   r*   r   r   ModuleScoperF   declare_cfunctionrf   r	   rM   get_tree)
r   	arg_typesr   context_typesufunc_cnamer   rF   ufunc_global_scopecoder   s
             r   generate_cy_utility_codez(UFuncConversion.generate_cy_utility_code   s   PPD<OPPP	QQD<PQQQ	Y233#	'//	0D|0STT*--R-R	-R-R-R*R*R +544)44444&6"  
"!Y_2)/&,'A
 
 
 
 $/D$"3";
 
 	,,&)/'%	 	- 	
 	
 	
 !%+	
 
 
 }}$}//r   c                    | j                             t          j        dd                     | j                             t          j        dd                     | j                             t          j        dd                     d S )N
UFuncsInitrD   UFuncTypeHandlingNumpyImportUFunczNumpyImportArray.c)r4   rL   r   load_cached)r   s    r   use_generic_utility_codez(UFuncConversion.use_generic_utility_code   s    **#L,??	
 	
 	
 	**#$7FF	
 	
 	
 	**#$68LMM	
 	
 	
 	
 	
r   N)
r    r!   r"   r-   rQ   rh   r9   r;   r   r   r$   r   r   r/   r/   :   s        	8 	8 	8: : : K K K@    ) ) )V

 

 

 

 

r   r/   c                 v   t          | t          j                  r;| j        j        j        rt          | j        d           | S t          |           g}| }nt          | t          j
                  ret          | j        t          j                  rF| j        j        j        j        rt          | j        d           | S d | j        D             }| j        }nt          | j        d           | S |sd S |d         j        j        |j        j        = |d                                          | gt%          ||          z   S )Nz0Methods cannot currently be converted to a ufuncc                 ,    g | ]}t          |          S r$   )r/   )r{   ro   s     r   r}   z$convert_to_ufunc.<locals>.<listcomp>   s     ===Qoa((===r   z,Only C functions can be converted to a ufunc    )
isinstancer   CFuncDefNoder3   parent_scopeis_c_class_scoper   rf   r/   r   FusedCFuncDefNoder   nodesr4   entriesr5   r   r   _generate_stats_from_converters)r   
convertersoriginal_nodes      r   convert_to_ufuncr      s=   $*++ (9 	$(NOOOK%d++,
	D)5	6	6 
:	5%< < 
 9 -> 	$(NOOOK==$*===
	dhFGGG 1"*=+>+CDqM**,,,63JNNNNr   c                    | d         j         }|                    t          j        dz             }|                    t          j        dz             }|                    t          j        dz             }g }d }d }	| D ]}
d |
j        D             }||t          |          k    sJ nt          |          }|                    |           d |
j        D             }|	|	t          |          k    sJ nt          |          }	|                    |           d |D             }t          |||||          }|	                    t          j        d	d
|                     |j        }|j        j        }|j        }|d|d|dt          |          d|d|	d|d|r|                                ndd}t#          j        |dt'          j        t&          j        t'          j        dt&          j        d           g          t#          j        |t&          j        |          g          }|                    |t&          j        |          }t5          j        |t#          j        ||t&          j        |          |          }|S )Nr   funcstypesdatac                     g | ]	}|j         
S r$   r+   r{   ds     r   r}   z1generate_ufunc_initialization.<locals>.<listcomp>   s    >>>AO>>>r   c                     g | ]	}|j         
S r$   r   r   s     r   r}   z1generate_ufunc_initialization.<locals>.<listcomp>   s    @@@Q_@@@r   c                 &    g | ]}|j         j        S r$   )r5   r6   )r{   cfnodes     r   r}   z1generate_ufunc_initialization.<locals>.<listcomp>   s    @@@&6<%@@@r   )ufunc_funcs_namefunc_cnamesufunc_types_nametype_constantsufunc_data_nameUFuncConstsrD   rE   z(), z, z, PyUFunc_None, "z", NULLz, 0PyUFunc_FromFuncAndDatadummy)r*   value)function_name	func_typerl   )r   r*   r5   )lhsrhs)r4   r   r   pyrex_prefixr:   lenextendr<   rK   rL   r
   rM   rf   r5   r   docas_c_string_literalr   PythonCapiCallNoder   	CFuncTypepy_object_typeCFuncTypeArgc_void_ptr_type	ConstNodedeclare_varr   SingleAssignmentNodeNameNode)r   cfunc_nodesr   r4   r   r   r   r   narg_innarg_outcin_const	out_constr   rF   rf   	func_namedocstrargs_to_func	call_node	lhs_entry
assgn_nodes                         r   generate_ufunc_initializationr      s   a=-L#++F,?',IJJ#++F,?',IJJ"**6+>+GHHONGH ) )>>Q-=>>>c(mm+++++(mmGh'''@@a.?@@@	s9~~-----9~~Hi((((@@K@@@K))%'  G !!|WMMM   
C#(IF 	K		(.:""$$$F::	L ,/&%$Wj.H$OOP
 

 *4L  
  I ((J4MsSSI+ij&?y
 
 
   J r   c                    g }| D ]c}|                                 }t          |          }|j        j                            |j        j                   |                    |           d|                    t          | ||                     |S r   )r   r&   r4   utility_code_listr   scoperm   r   )r   r   stats	converterr   
ufunc_nodes         r   r   r   -  s    E ! !	1133(..
077
8TUUUZ    	LL.z5$GGHHHLr   N)rT   r   r   r   r   Errorsr   r   r   r	   Coder
   Visitorr   r   r   r&   r(   r/   r   r   r   r$   r   r   <module>r      s                          * * * * * * 1 1 1 1 1 1 1 1                         .% % %3 3 3 3 3 3 3 3 I
 I
 I
 I
 I
 I
 I
 I
XO O O8H H HV
 
 
 
 
r   