o
    U=ºi–c  ã                   @   s,  d 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mZmZmZmZmZmZmZmZmZmZ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" ej#Z$ddg d¢dd	d
dddœZ%i di dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d“d!d“d"d“d#d““dd$“dd%“dd&“dg “dd“d'd“d(d“dd)“dg “dd“d*d“dg “dd“d+d“d,d“dd-“ddd.d/d0d1dddd2d3d4d5e	d6ee	ƒdid7œ¥d8ed9id:ed;igd<ed=id>gd?eeeeƒeeƒƒd@œedAidBdCdDedEidFedGigd<ed=idHdIgdJedKœdLdMdNdOed9idPedQigdRd<ed=idHd>dSgedTœdUdVe	d6igdWedXœedJdYœgZ&eeeƒdZieeeƒdZiedUieeeƒd[e	d6igieeeƒd[e	d6igiedVee	eƒd6ee	eƒd\igieeeƒd]ieeeƒd]idd^œ	eeeƒd_eeeeƒƒd`e
daed_ieeeƒdbeeeeƒƒdce
dbedbieeeƒdSeeeeƒƒdde
ddedSieee
eƒdSiedeiedfiedgidhœeeƒdiieeee!djƒƒdiedkiedlieeeeeƒeƒƒdmieeeeeƒeeƒƒƒdnieeeeeƒƒdoieeeeeeƒƒƒdpiged<d>gied=igedqœedriedsigedtieduiedSigeeeƒddvœedwidxedyigdSdIed=idHgeeeƒdzœed{ied|ied}iged~ieduigeeeƒddvœdd€e
dd�œed‚iedƒeeƒd„id…gee
eeeeƒƒdd†œedkid‡edˆid‰edŠigd‹edSigee
eƒdzœd]edŒœg
Z'i Z(d�dŽ„ Z)d�d�„ Z*d‘S )’aK  

Build call-back mechanism for f2py2e.

Copyright 2000 Pearu Peterson all rights reserved,
Pearu Peterson <pearu@ioc.ee>
Permission to use, modify, and distribute this software is given under the
terms of the NumPy License.

NO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.
$Date: 2005/07/20 11:27:58 $
Pearu Peterson

é   )Ú__version__)Ú
applyrulesÚ	debugcapiÚ
dictappendÚerrmessÚgetargsÚhasnoteÚisarrayÚ	iscomplexÚiscomplexarrayÚiscomplexfunctionÚ
isfunctionÚ
isintent_cÚisintent_hideÚisintent_inÚisintent_inoutÚisintent_nothideÚisintent_outÚ
isoptionalÚ
isrequiredÚisscalarÚisstringÚisstringfunctionÚissubroutineÚl_andÚl_notÚl_orÚoutmessÚreplaceÚ
stripcommaÚthrow_error)ÚcfuncszPtypedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);a^  
#begintitle#
typedef struct {
    PyObject *capi;
    PyTupleObject *args_capi;
    int nofargs;
    jmp_buf jmpbuf;
} #name#_t;

#if defined(F2PY_THREAD_LOCAL_DECL) && !defined(F2PY_USE_PYTHON_TLS)

static F2PY_THREAD_LOCAL_DECL #name#_t *_active_#name# = NULL;

static #name#_t *swap_active_#name#(#name#_t *ptr) {
    #name#_t *prev = _active_#name#;
    _active_#name# = ptr;
    return prev;
}

static #name#_t *get_active_#name#(void) {
    return _active_#name#;
}

#else

static #name#_t *swap_active_#name#(#name#_t *ptr) {
    char *key = "__f2py_cb_#name#";
    return (#name#_t *)F2PySwapThreadLocalCallbackPtr(key, ptr);
}

static #name#_t *get_active_#name#(void) {
    char *key = "__f2py_cb_#name#";
    return (#name#_t *)F2PyGetThreadLocalCallbackPtr(key);
}

#endif

/*typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);*/
#static# #rctype# #callbackname# (#optargs##args##strarglens##noargs#) {
    #name#_t cb_local = { NULL, NULL, 0 };
    #name#_t *cb = NULL;
    PyTupleObject *capi_arglist = NULL;
    PyObject *capi_return = NULL;
    PyObject *capi_tmp = NULL;
    PyObject *capi_arglist_list = NULL;
    int capi_j,capi_i = 0;
    int capi_longjmp_ok = 1;
#decl#
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_start_clock();
#endif
    cb = get_active_#name#();
    if (cb == NULL) {
        capi_longjmp_ok = 0;
        cb = &cb_local;
    }
    capi_arglist = cb->args_capi;
    CFUNCSMESS("cb:Call-back function #name# (maxnofargs=#maxnofargs#(-#nofoptargs#))\n");
    CFUNCSMESSPY("cb:#name#_capi=",cb->capi);
    if (cb->capi==NULL) {
        capi_longjmp_ok = 0;
        cb->capi = PyObject_GetAttrString(#modulename#_module,"#argname#");
        CFUNCSMESSPY("cb:#name#_capi=",cb->capi);
    }
    if (cb->capi==NULL) {
        PyErr_SetString(#modulename#_error,"cb: Callback #argname# not defined (as an argument or module #modulename# attribute).\n");
        goto capi_fail;
    }
    if (F2PyCapsule_Check(cb->capi)) {
    #name#_typedef #name#_cptr;
    #name#_cptr = F2PyCapsule_AsVoidPtr(cb->capi);
    #returncptr#(*#name#_cptr)(#optargs_nm##args_nm##strarglens_nm#);
    #return#
    }
    if (capi_arglist==NULL) {
        capi_longjmp_ok = 0;
        capi_tmp = PyObject_GetAttrString(#modulename#_module,"#argname#_extra_args");
        if (capi_tmp) {
            capi_arglist = (PyTupleObject *)PySequence_Tuple(capi_tmp);
            Py_DECREF(capi_tmp);
            if (capi_arglist==NULL) {
                PyErr_SetString(#modulename#_error,"Failed to convert #modulename#.#argname#_extra_args to tuple.\n");
                goto capi_fail;
            }
        } else {
            PyErr_Clear();
            capi_arglist = (PyTupleObject *)Py_BuildValue("()");
        }
    }
    if (capi_arglist == NULL) {
        PyErr_SetString(#modulename#_error,"Callback #argname# argument list is not set.\n");
        goto capi_fail;
    }
#setdims#
#ifdef PYPY_VERSION
#define CAPI_ARGLIST_SETITEM(idx, value) PyList_SetItem((PyObject *)capi_arglist_list, idx, value)
    capi_arglist_list = PySequence_List(capi_arglist);
    if (capi_arglist_list == NULL) goto capi_fail;
#else
#define CAPI_ARGLIST_SETITEM(idx, value) PyTuple_SetItem((PyObject *)capi_arglist, idx, value)
#endif
#pyobjfrom#
#undef CAPI_ARGLIST_SETITEM
#ifdef PYPY_VERSION
    CFUNCSMESSPY("cb:capi_arglist=",capi_arglist_list);
#else
    CFUNCSMESSPY("cb:capi_arglist=",capi_arglist);
#endif
    CFUNCSMESS("cb:Call-back calling Python function #argname#.\n");
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_start_call_clock();
#endif
#ifdef PYPY_VERSION
    capi_return = PyObject_CallObject(cb->capi,(PyObject *)capi_arglist_list);
    Py_DECREF(capi_arglist_list);
    capi_arglist_list = NULL;
#else
    capi_return = PyObject_CallObject(cb->capi,(PyObject *)capi_arglist);
#endif
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_stop_call_clock();
#endif
    CFUNCSMESSPY("cb:capi_return=",capi_return);
    if (capi_return == NULL) {
        fprintf(stderr,"capi_return is NULL\n");
        goto capi_fail;
    }
    if (capi_return == Py_None) {
        Py_DECREF(capi_return);
        capi_return = Py_BuildValue("()");
    }
    else if (!PyTuple_Check(capi_return)) {
        capi_return = Py_BuildValue("(N)",capi_return);
    }
    capi_j = PyTuple_Size(capi_return);
    capi_i = 0;
#frompyobj#
    CFUNCSMESS("cb:#name#:successful\n");
    Py_DECREF(capi_return);
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_stop_clock();
#endif
    goto capi_return_pt;
capi_fail:
    fprintf(stderr,"Call-back #name# failed.\n");
    Py_XDECREF(capi_return);
    Py_XDECREF(capi_arglist_list);
    if (capi_longjmp_ok) {
        longjmp(cb->jmpbuf,-1);
    }
capi_return_pt:
    ;
#return#
}
#endtitle#
)zsetjmp.hÚ
CFUNCSMESSZF2PY_THREAD_LOCAL_DECLz#maxnofargs#z#nofoptargs#zF    def #argname#(#docsignature#): return #docreturn#\n\
#docstrsigns#zc
{{}\verb@def #argname#(#latexdocsignature#): return #docreturn#@{}}
#routnote#

#latexdocstrsigns#z1def #argname#(#docsignature#): return #docreturn#)Ú
cbtypedefsÚbodyÚneedÚ
maxnofargsÚ
nofoptargsÚdocstrÚlatexdocstrÚdocstrshortZseparatorsforÚdeclÚ
Úargsú,ÚoptargsÚ Ú	pyobjfromZfreememÚargs_tdÚ
optargs_tdÚargs_nmÚ
optargs_nmÚ	frompyobjÚsetdimsÚdocstrsignsz\n"
"ÚlatexdocstrsignsÚlatexdocstrreqÚlatexdocstroptÚlatexdocstroutÚlatexdocstrcbsz/*decl*/z/*pyobjfrom*/z/*frompyobj*/ÚreturnÚ
strarglensz/*freemem*/Ústrarglens_tdÚstrarglens_nmÚnoargsz/*setdims*/z    Required arguments:z    Optional arguments:z    Return objects:z    Call-back functions:z\noindent Required arguments:z\noindent Optional arguments:z\noindent Return objects:z\noindent Call-back functions:z
--- #note#)r8   r9   Ú	docstrreqÚ	docstroptÚ	docstroutÚ	docstrcbsÚ	docreturnÚdocsignÚ
docsignoptr:   r;   r<   r=   Zroutnotez    #ctype# return_value = 0;z,    CFUNCSMESS("cb:Getting return_value->");a‡      if (capi_j>capi_i) {
        GETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,
          "#ctype#_from_pyobj failed in converting return_value of"
          " call-back function #name# to C #ctype#\n");
    } else {
        fprintf(stderr,"Warning: call-back function #name# did not provide"
                       " return value (index=%d, type=#ctype#)\n",capi_i);
    }z8    fprintf(stderr,"#showvalueformat#.\n",return_value);z#ctype#_from_pyobjr"   ZGETSCALARFROMPYTUPLEz    return return_value;)r+   r6   r%   r>   Ú_checkzB    fprintf(stderr,"debug-capi:cb:#name#:%d:\n",return_value_len);z)#ctype# return_value,int return_value_lenzreturn_value,&return_value_lenz#ctype# ,intz.    CFUNCSMESS("cb:Getting return_value->\"");a      if (capi_j>capi_i) {
        GETSTRFROMPYTUPLE(capi_return,capi_i++,return_value,return_value_len);
    } else {
        fprintf(stderr,"Warning: call-back function #name# did not provide"
                       " return value (index=%d, type=#ctype#)\n",capi_i);
    }z:    fprintf(stderr,"#showvalueformat#\".\n",return_value);zstring.hZGETSTRFROMPYTUPLEzreturn;)r1   r-   r4   r2   r6   r%   r>   rJ   z<
#ifndef F2PY_CB_RETURNCOMPLEX
#ctype# *return_value
#endif
z3
#ifndef F2PY_CB_RETURNCOMPLEX
return_value
#endif
z0
#ifndef F2PY_CB_RETURNCOMPLEX
#ctype# *
#endif
zH
#ifdef F2PY_CB_RETURNCOMPLEX
    #ctype# return_value = {0, 0};
#endif
a      if (capi_j>capi_i) {
#ifdef F2PY_CB_RETURNCOMPLEX
        GETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,
          "#ctype#_from_pyobj failed in converting return_value of call-back"
          " function #name# to C #ctype#\n");
#else
        GETSCALARFROMPYTUPLE(capi_return,capi_i++,return_value,#ctype#,
          "#ctype#_from_pyobj failed in converting return_value of call-back"
          " function #name# to C #ctype#\n");
#endif
    } else {
        fprintf(stderr,
                "Warning: call-back function #name# did not provide"
                " return value (index=%d, type=#ctype#)\n",capi_i);
    }zÈ#ifdef F2PY_CB_RETURNCOMPLEX
    fprintf(stderr,"#showvalueformat#.\n",(return_value).r,(return_value).i);
#else
    fprintf(stderr,"#showvalueformat#.\n",(*return_value).r,(*return_value).i);
#endif
zP
#ifdef F2PY_CB_RETURNCOMPLEX
    return return_value;
#else
    return;
#endif
z#ctype#)r/   r5   r3   r+   r6   r>   r%   rJ   z        #pydocsignout#z"\item[]{{}\verb@#pydocsignout#@{}}z#rname#,)rE   r<   rG   rJ   )rJ   r>   z        #pydocsign#z\item[]{{}\verb@#pydocsign#@{}}z--- See above.z
#varname#,)	rD   rC   rE   r;   r:   r<   rH   rI   Zdependz#ctype# #varname_i#z#ctype# *#varname_i#_cb_capiz#ctype# *#varname_i#z#varname_i#z#varname_i#_cb_capiz	#ctype# *z,int #varname_i#_cb_lenz,intz,#varname_i#_cb_len)r-   r4   r2   r%   r?   r@   rA   z/    #ctype# #varname_i#=(*#varname_i#_cb_capi);z8intent(c,out) is forbidden for callback scalar argumentsz)    CFUNCSMESS("cb:Getting #varname#->");zÏ    if (capi_j>capi_i)
        GETSCALARFROMPYTUPLE(capi_return,capi_i++,#varname_i#_cb_capi,#ctype#,"#ctype#_from_pyobj failed in converting argument #varname# of call-back function #name# to C #ctype#\n");z7    fprintf(stderr,"#showvalueformat#.\n",#varname_i#);z@    fprintf(stderr,"#showvalueformat#.\n",*#varname_i#_cb_capi);zK    fprintf(stderr,"#showvalueformat#.\n",(#varname_i#).r,(#varname_i#).i);z]    fprintf(stderr,"#showvalueformat#.\n",(*#varname_i#_cb_capi).r,(*#varname_i#_cb_capi).i);)r+   Úerrorr6   r%   rJ   z„    if (cb->nofargs>capi_i)
        if (CAPI_ARGLIST_SETITEM(capi_i++,pyobj_from_#ctype#1(#varname_i#)))
            goto capi_fail;zŽ    if (cb->nofargs>capi_i)
        if (CAPI_ARGLIST_SETITEM(capi_i++,pyarr_from_p_#ctype#1(#varname_i#_cb_capi)))
            goto capi_fail;zpyobj_from_#ctype#1zpyarr_from_p_#ctype#1)r1   r%   rJ   Ú	_optionalz+    CFUNCSMESS("cb:Getting #varname#->\"");zf    if (capi_j>capi_i)
        GETSTRFROMPYTUPLE(capi_return,capi_i++,#varname_i#,#varname_i#_cb_len);zP    fprintf(stderr,"#showvalueformat#\":%d:.\n",#varname_i#,#varname_i#_cb_len);)r6   r%   rJ   zi    fprintf(stderr,"debug-capi:cb:#varname#=\"#showvalueformat#\":%d:\n",#varname_i#,#varname_i#_cb_len);z›    if (cb->nofargs>capi_i)
        if (CAPI_ARGLIST_SETITEM(capi_i++,pyobj_from_#ctype#1size(#varname_i#,#varname_i#_cb_len)))
            goto capi_fail;zÜ    if (cb->nofargs>capi_i) {
        int #varname_i#_cb_dims[] = {#varname_i#_cb_len};
        if (CAPI_ARGLIST_SETITEM(capi_i++,pyarr_from_p_#ctype#1(#varname_i#,#varname_i#_cb_dims)))
            goto capi_fail;
    }zpyobj_from_#ctype#1sizez6    npy_intp #varname_i#_Dims[#rank#] = {#rank*[-1]#};z    #cbsetdims#;)r+   r7   rJ   Ú_dependz0    fprintf(stderr,"debug-capi:cb:#varname#\n");a2      if (cb->nofargs>capi_i) {
        int itemsize_ = #atype# == NPY_STRING ? 1 : 0;
        /*XXX: Hmm, what will destroy this array??? */
        PyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,#rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,itemsize_,NPY_ARRAY_CARRAY,NULL);
a2      if (cb->nofargs>capi_i) {
        int itemsize_ = #atype# == NPY_STRING ? 1 : 0;
        /*XXX: Hmm, what will destroy this array??? */
        PyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,#rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,itemsize_,NPY_ARRAY_FARRAY,NULL);
z•
        if (tmp_arr==NULL)
            goto capi_fail;
        if (CAPI_ARGLIST_SETITEM(capi_i++,(PyObject *)tmp_arr))
            goto capi_fail;
})r1   rJ   rL   zì    if (capi_j>capi_i) {
        PyArrayObject *rv_cb_arr = NULL;
        if ((capi_tmp = PyTuple_GetItem(capi_return,capi_i++))==NULL) goto capi_fail;
        rv_cb_arr =  array_from_pyobj(#atype#,#varname_i#_Dims,#rank#,F2PY_INTENT_INz|F2PY_INTENT_Ca8  ,capi_tmp);
        if (rv_cb_arr == NULL) {
            fprintf(stderr,"rv_cb_arr is NULL\n");
            goto capi_fail;
        }
        MEMCOPY(#varname_i#,PyArray_DATA(rv_cb_arr),PyArray_NBYTES(rv_cb_arr));
        if (capi_tmp != (PyObject *)rv_cb_arr) {
            Py_DECREF(rv_cb_arr);
        }
    }z    fprintf(stderr,"<-.\n");ZMEMCOPY)rG   rJ   c                 C   s\   g t | d < | d D ]!}|d dkr+|d D ]}|r"t|| d ƒ qtd| d  ƒ qq
d S )NÚnamer$   ÚblockZ	interfacezwarning: empty body for %s
)Úcb_mapÚbuildcallbackr   )ÚmZbiÚb© rT   úYC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\numpy/f2py/cb_rules.pyÚbuildcallbacksø  s   €úrV   c                 C   s4  ddl m} td| d |f ƒ t| ƒ\}}||_| d }| | |¡}ti |ƒ}t|  | d |d g¡ t	D ]}d|v rC|d | ƒsGd|vrRt
||| ƒ}	t||	ƒ}q7i }
t|ƒD ]J\}}|j||| |d�}||
|< tD ]5}d|v rtqmd	|v rt|| ƒrqmd|v r‹|d || ƒs�d|vr¢t
|||| ƒ}	t||	ƒ}d
|v r¢ qYqmqY|D ]B}|
| }tD ]9}d|v rµq®d	|vsÃd	|v rÄt|| ƒrÄq®d|v rÐ|d || ƒsÔd|vrçt
|||| ƒ}	t||	ƒ}d
|v rç q¦q®q¦|D ]<}|
| }tD ]3}d|vrúqód	|v rÿqód|v �r|d || ƒ�sd|v�r&t
|||| ƒ}	t||	ƒ}d
|v �r& qëqóqëd|v �rUd|v �rUt|d tƒ�rU|d dg |d< |d dg |d< |d dg |d< t|d tƒ�rjttdd|d iƒƒ|d< ttdd|d iƒƒ}|dk�rˆttdd|d iƒƒ|d< ntd|d |dœƒ|d< |d  dd¡|d< |d  dd¡|d< g |d< g |d < d!D ]G}||v �rËt|| tƒ�rË|d ||  |d< d"| }||v �røt|| tƒ�rø|d  || d#d…  d$g || dd …  d%g |d < �q²d|v�rd|d< d|d&< d|d'< | d¡�s!| d¡�s!| d(¡�s!d)|d*< t
t|ƒ}	|	d+ tj|d < t|	d, tƒ�r>|	d, g|	d,< d,|v �rZtj ¡ D ]}||d, v �rX|	d,  |¡ �qH|	d- tj|d d. < |	d,  |d d. ¡ |	d, tj|d < |	d/ |	d0 |	d1 |	d2 |d3 d4œ|j|d < td5|	d6  ƒ d S )7Nr   )Ú	capi_mapsz2    Constructing call-back function "cb_%s_in_%s"
rN   ÚvarsrJ   )ÚindexrM   rL   Ú_breakr-   r/   z(
#ifndef F2PY_CB_RETURNCOMPLEX
,
#endif
r5   r3   rG   z#docreturn#z#docsignopt#rI   r0   z	#docsign#rH   Zdocsignaturez#docsign#[#docsignopt#])rH   rI   Ú_z\_Zlatexdocsignaturer.   z, r8   r9   )rC   rD   rE   rF   Zlatexé    z\begin{description}z\end{description}r2   r4   r?   ZvoidrB   r$   r%   r#   Z_typedefr&   r'   r(   r)   Úargname)r&   r'   r(   r)   r]   z	      %s
r*   )r0   rW   r   r   ÚdepargsZcb_routsign2mapr   rP   ÚappendÚcb_rout_rulesr   Ú	enumerateZcb_sign2mapÚcb_arg_rulesr   r   Ú
isinstanceÚlistr   r   ÚgetÚcb_routine_rulesr!   Ú	callbacksÚstrZtypedefsÚkeysZtypedefs_generatedZneedsZlcb2_map)ZroutZumrW   r-   r^   ÚvarZvrdÚrdÚrÚarZsavevrdÚiÚar/   ÚkÚtrT   rT   rU   rQ     sö   
ÿ

€ 
€÷
 
€÷
&

€÷
ÿ
ÿ

ÿÿÿÿÿþ€
$

€ürQ   N)+Ú__doc__r0   r   Zauxfuncsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   ÚversionZf2py_versionrf   r`   rb   rP   rV   rQ   rT   rT   rT   rU   Ú<module>   s*  €  �Ö -
ÿÿÿÿþþýýüüûúùùøøÿõõõôôôôôóóóòòòñðå	ÿõîÿ÷ÿìîÿÈ:ÿü �ù 
ÿ
ÿ

ÿÿó
ü
ü
üè
ÿþÿÿÿÿÿ÷
ÿíüþóÿýÿ÷ûÿñüúòê
ð
ìþ �å "