
    ڏDj+                         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y)   )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y)_FindCFuncDefNodezf
    Finds the CFuncDefNode in the tree

    The assumption is that there's only one CFuncDefNode
    Nc                 @    | j                   ry | j                  |       y N)
found_nodevisitchildrenselfnodes     ZC:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\site-packages\Cython/Compiler/UFuncs.py
visit_Nodez_FindCFuncDefNode.visit_Node   s    ??t$    c                     || _         y r   )r   r   s     r   visit_CFuncDefNodez$_FindCFuncDefNode.visit_CFuncDefNode   s	    r   c                 <    | j                  |       | 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      s     J%r   r   c                 "     t               |       S r   )r   )r   s    r   get_cfunc_from_treer&   &   s    t$$r   c                       e Zd ZdZd Zy)_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                 .    || _         || _        || _        y 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    3r   r(   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	UFuncConversionc                    || _         |j                  j                         | _        d| _        | j                   j                  j
                  j                  | j                        rO| xj                  dz  c_        | j                   j                  j
                  j                  | j                        rOg | _        | j                         | _	        | j                         | _        y )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iioo##..t/E/EF""c)" iioo##..t/E/EF "335#557r   c                 
   |j                         }|j                         j                  dd      j                  dd      }t        |||      }| j                  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    ++- JJL00d;CCCM#4!

 	**##	 &&7%899r   c                    |}|j                   r|j                  }t        j                  |      }|t        j                  u rt        |d|z         y |j                  r| j                  |d      S |j                  rWd}|j                  t        j                  k(  rd}n|j                  t        j                  k(  rd}| j                  |d| d      S |j                  r| j                  |d      S |j                  ry	t        |d|z         y )
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   	!33I,,Y7	
...#EMN5502 2 \\F||z000!4!4455 13 3 ^^55*, ,  	cAEIJr   c                 \   g }t        | j                  j                        D ]  \  }}| j                   d| }| j                  j                  |       | j                  | j                  j                  |j                        }|j                  t        |j                  ||              |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FAs#'#9#9":$qc B&&'8900IJ}SXXzCTUV		W
 r   c                    | j                   j                  j                  r!| j                   j                  j                  }n| j                   j                  g}g }t	        |      D ]s  \  }}| j
                   d| }| j                  j                  |       | j                  | j                   j                  |      }|j                  t        |||             u |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    99  **..99J))//0J , 	GAt#'#9#9":%s C&&'8900EJdJ0AB		 r   c           
      R   | j                   D cg c]  }|j                  |j                  f }}| j                  D cg c]  }|j                  |j                  f }}t	        ||z         }d| j
                  j                  _        | j                  j                  | j
                  j                  j                  dz         }t        d |D              xs 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
                  j$                  d       t'        j(                  d	d
||      }	|	j+                  d      }
|
S c c}w c c}w )NT
_ufunc_defc              3   :   K   | ]  \  }}|j                     y wr   re   .0r2   ts      r   	<genexpr>z;UFuncConversion.generate_cy_utility_code.<locals>.<genexpr>   s     -R1amm-R   c              3   :   K   | ]  \  }}|j                     y wr   rz   r{   s      r   r~   z;UFuncConversion.generate_cy_utility_code.<locals>.<genexpr>   s     4$!Q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,   r*   r<   rK   r   r5   usedr4   next_idr   anyr6   r   r   ModuleScoperF   declare_cfunctionrf   r	   rM   get_tree)r   a	arg_typesr   context_typesufunc_cnamer   rF   ufunc_global_scopecoder   s              r   generate_cy_utility_codez(UFuncConversion.generate_cy_utility_code   s   <@<O<OPqa))1662P	P<@<P<PQqa))1662Q	QY23#		''//		0D0D|0ST*--R	-R*R +54)44&6"  
"!YY__22))//&&,,'A
 
 $//D$"3"3";";
 	,,&&))//''%%		 	- 	
 !%%+	
 }}$}/Q QQs
   HH$c                    | j                   j                  t        j                  dd             | j                   j                  t        j                  dd             | j                   j                  t        j                  dd             y )N
UFuncsInitrD   UFuncTypeHandlingNumpyImportUFunczNumpyImportArray.c)r4   rL   r   load_cached)r   s    r   use_generic_utility_codez(UFuncConversion.use_generic_utility_code   su    **##L,?	
 	**##$7F	
 	**##$68LM	
r   N)
r    r!   r"   r-   rQ   rh   r9   r;   r   r   r$   r   r   r/   r/   :   s(    	8: K@)V

r   r/   c                    t        | t        j                        rG| j                  j                  j
                  rt        | j                  d       | S t        |       g}| }nt        | t        j                        rt        | j                  t        j                        rq| j                  j                  j                  j
                  rt        | j                  d       | S | j                  D cg c]  }t        |       }}| j                  }nt        | j                  d       | S |sy |d   j                  j                  |j                  j                   = |d   j#                          | gt%        ||      z   S c c}w )Nz0Methods cannot currently be converted to a ufuncz,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_nodero   s       r   convert_to_ufuncr      s/   $**+((99$((NOK%d+,
	D)55	6:		5%%< 99  -->>$((NOK26**=Qoa(=
=		dhhFG1""**=+>+>+C+CDqM**,63JNNN >s   0E=c                    | d   j                   }|j                  t        j                  dz         }|j                  t        j                  dz         }|j                  t        j                  dz         }g }d }d }	| D ]  }
|
j                  D cg c]  }|j
                   }}||t        |      k(  sJ t        |      }|j                  |       |
j                  D cg c]  }|j
                   }}|	|	t        |      k(  sJ t        |      }	|j                  |        |D cg c]  }|j                  j                   }}t        |||||      }|j                  t        j                  dd|             |j                  }|j                  j                   }|j"                  }|d	|d
|d	t        |      d
|d
|	d|d|r|j%                         ndd}t'        j(                  |dt+        j,                  t*        j.                  t+        j0                  dt*        j2                  d       g      t'        j4                  |t*        j2                  |      g      }|j7                  |t*        j.                  |      }t9        j:                  |t'        j<                  ||t*        j.                  |      |      }|S c c}w c c}w c c}w )Nr   funcstypesdata)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:   r+   lenextendr<   r5   r6   rK   rL   r
   rM   rf   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din_const	out_constcfnoder   rF   rf   	func_namedocstrargs_to_func	call_node	lhs_entry
assgn_nodes                           r   generate_ufunc_initializationr      s   a=--L#++F,?,?',IJ#++F,?,?',IJ"**6+>+>+GHONGH )-.-=-=>AOO>>c(m++(mGh'./.?.?@Q__@	@s9~--9~Hi() 5@@&6<<%%@K@))%'G !!|WM 

C##((IF 	K(.""$F:	L ,,/&&%%$$Wj.H.H$OP

 *44L
I ((J4M4MsSI++ij&?&?y
 J  ? A As   K K)Kc                    g }| D ]g  }|j                         }t        |      }|j                  j                  j	                  |j
                  j                         |j                  |       i |j                  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(.
0077

8T8TUZ ! 
LL.z5$G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    .%3 3 I
 I
XO8HV
r   