
    ]j                     t   U d Z ddlmZ ddlZddlmZ ddlZddlZddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ erddlZ eej.                         ed      k\  ZerddlmZ daded<   g aded<   eadaded<   da ded<   h dh ddZ!dZ"d6d7dZ#d8d9dZ$d Z%d:dZ&d Z'i ejP                  dejR                  dejT                  dejV                  dejX                  dejZ                  dej\                  d ej^                  d ej`                  dejb                  dejd                  dejf                  dejh                  d!ejj                  d!ejl                  d"ej,                  d#ejn                  d$ejp                  d%ejr                  d&ejt                  d'ejv                  d(ejx                  d(ejz                  d)ej|                  d)ej~                  d*ej                  d*eAdej                  diZCd+ ZDd, ZE e# e
d-             d. ZFd)d(d*d/ZGd:d0ZHd6d;d1ZId6d;d2ZJd6d7d3ZKd<d4ZLd=d5ZMy)>zL
Expressions
-----------

Offer fast expression evaluation through numexpr

    )annotationsN)TYPE_CHECKING)
get_option)np_version_gt2_3)find_stack_level)	roperator)NUMEXPR_INSTALLED)Versionz2.11.0)FuncTypezbool | None
_TEST_MODE
list[bool]_TEST_RESULTzFuncType | None	_evaluate_where>   boolint32int64float32float64>   r   r   r   )evaluatewherei@B c                |    t         rt        r	t        sdan| at        rt        nt
        at        rt        a	y t        a	y )NF)
r	   r   	ne_gt_211USE_NUMEXPR_evaluate_numexpr_evaluate_standardr   _where_numexpr_where_standardr   vs    M/root/env/lib/python3.12/site-packages/pandas/core/computation/expressions.pyset_use_numexprr"   2   s0     I  KK
 &1!6HI*^FF    c                v    t         r3t        r,| t        j                         } t        j                  |        y y y N)r	   r   nedetect_number_of_coresset_num_threads)ns    r!   set_numexpr_threadsr*   D   s2     [9))+A
1 )r#   c                6    t         rt        d        | ||      S )z
    Standard evaluation.
    F)r   _store_test_result)opop_strleft_opright_ops       r!   r   r   M   s     5!gx  r#   c                    |e|j                   t        kD  rRt               }||fD ])  }t        |d      s||j                  j
                  hz  }+ t        |      rt        |   |k\  ryy)z2return left_op boolean if we WILL be using numexprdtypeTF)size_MIN_ELEMENTSsethasattrr2   namelen_ALLOWED_DTYPES)r-   r.   r/   r0   dtype_checkdtypesos          r!   _can_use_numexprr=   V   sh    <<-'"uFx( -1g&qww||n,F- v;/+">&"Hr#   c                r   d }t        | |||d      rZ| j                  j                  d      j                  d      }|r||}}|}|}	 t	        j
                  d| d||dd      }|r||}}t        rt        |d u       |t        | |||      }|S # t        $ r Y 6t        $ r t        |||      rn Y Ow xY w)	Nr   _rzleft_value z right_value)
left_valueright_valuesafe
local_dictcasting)r=   __name__strip
startswithr&   r   	TypeErrorNotImplementedError_bool_arith_fallbackr   r,   r   )r-   r.   r/   r0   resultis_reversedrA   rB   s           r!   r   r   i   s    FFGXzBkk'',77< ('XG
	[[fX\2*4[QF  ('XG6-.~#BBM)  	 " 	#FGX> 	s   B 	B6B65B6+*-/z**z==z!=z<=<z>=>&|^c                0    t        j                  | ||      S r%   )npr   )condr/   r0   s      r!   r   r      s    88D'8,,r#   c                ~    d }t        d d||d      rt        j                  d| ||dd      }|t        | ||      }|S )Nr   z#where(cond_value, a_value, b_value))
cond_valuea_valueb_valuerC   rD   )r=   r&   r   r   )rZ   r/   r0   rM   s       r!   r   r      sO    Fgw'B1&*w8T
 ~ w9Mr#   zcompute.use_numexprc                    	 | j                   t        k(  S # t        $ r# t        | t        t        j
                  f      cY S w xY wr%   )r2   r   AttributeError
isinstancerY   bool_)xs    r!   _has_bool_dtyperd      s:    /ww$ /!dBHH-../s    )A A)rO   rP   rQ   c                    t        |      rAt        |      r6| t        v r.t        j                  d| dt        |    dt	                      yy)z
    Check if we should fallback to the python `_evaluate_standard` in case
    of an unsupported operation by numexpr, which is the case for some
    boolean ops.
    z'evaluating in Python space because the z> operator is not supported by numexpr for the bool dtype, use z	 instead.)
stacklevelTF)rd   _BOOL_OP_UNSUPPORTEDwarningswarnr   )r.   r/   r0   s      r!   rL   rL      sX     wOH$=))MM9& D+F36iA ,-	 r#   c                T    t         |    }||rt        | |||      S t        | |||      S )a  
    Evaluate and return the expression of the op on left_op and right_op.

    Parameters
    ----------
    op : the actual operand
    left_op : left operand
    right_op : right operand
    use_numexpr : bool, default True
        Whether to try to use numexpr.
    )_op_str_mappingr   r   )r-   r/   r0   use_numexprr.   s        r!   r   r      s9     R FR(;;b&'8<<r#   c                J    t         J |rt        | ||      S t        | ||      S )a  
    Evaluate the where condition cond on left_op and right_op.

    Parameters
    ----------
    cond : np.ndarray[bool]
    left_op : return if cond is True
    right_op : return if cond is False
    use_numexpr : bool, default True
        Whether to try to use numexpr.
    )r   r   )rZ   r/   r0   rl   s       r!   r   r      s1     dGX..tWh77r#   c                    | a g ay)z
    Keeps track of whether numexpr was used.

    Stores an additional ``True`` for every successful use of evaluate with
    numexpr since the last ``get_test_result``.
    N)r   r   r   s    r!   set_test_modero     s     JLr#   c                4    | rt         j                  |        y y r%   )r   append)used_numexprs    r!   r,   r,     s    L) r#   c                     t         } g a | S )z1
    Get test result and reset test_results.
    )r   )ress    r!   get_test_resultru   $  s    
 CLJr#   )T)r    r   returnNoner%   )rv   rw   )rv   r   )rl   r   )rr   r   rv   rw   )rv   r   )N__doc__
__future__r   operatortypingr   rh   numpyrY   pandas._configr   pandas.compat.numpyr   pandas.util._exceptionsr   pandas.corer   pandas.core.computation.checkr	   pandas.util.versionr
   numexprr&   __version__r   pandas._typingr   r   __annotations__r   r   r   r   r9   r4   r"   r*   r   r=   r   addraddmulrmulsubrsubtruedivrtruedivfloordiv	rfloordivmodrmodpowrpoweqleltgegtand_rand_or_ror_xorrxordivmodrdivmodrk   r   r   rd   rg   rL   r   r   ro   r,   ru    r#   r!   <module>r      s   #      % 0 4 ! ; ''78+<<I'
K j !	? !  A) @$!&&R!LL#!NNC! LL#! NNC	!
 LL#! NNC! c! ! t! ! LL$!  NND!!" LL$#!$ NND%!& KK'!( KK)!* KK+!, KKKKKKMM3OOSLL#NNCLL#NNC
DtA!H-
$ 
01 2/ !s5 $=(8&	*
r#   