ó
    Ñ]j°   ã                  ó¤  • % S r SSKJr  SSKrSSKJr  SSKrSSKrSSK	J
r
  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  \(       a  SSKr\" \R.                  5      \" S5      :¬  r\(       a  SSKJr  SqS\S'   / qS\S'   \qSqS\S'   Sq S\S'   1 Sk1 SkS.r!Sr"S6S7S jjr#S8S9S jjr$S r%S:S jr&S r'0 \RP                  S_\RR                  S_\RT                  S_\RV                  S_\RX                  S_\RZ                  S_\R\                  S _\R^                  S _\R`                  S_\Rb                  S_\Rd                  S_\Rf                  S_\Rh                  S!_\Rj                  S!_\Rl                  S"_\R,                  S#_\Rn                  S$_\Rp                  S%\Rr                  S&\Rt                  S'\Rv                  S(\Rx                  S(\Rz                  S)\R|                  S)\R~                  S*\R€                  S*\AS\R„                  S0ErCS+ rDS, rE\#" \
" S-5      5        S. rFS)S(S*S/.rGS:S0 jrHS6S;S1 jjrIS6S;S2 jjrJS6S7S3 jjrKS<S4 jrLS=S5 jrMg)>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                ó®   • [         (       a  [        (       a  [        (       d  SqOU q[        (       a  [        O[
        q[        (       a  [        q	g [        q	g )NF)
r	   r   Ú	ne_gt_211ÚUSE_NUMEXPRÚ_evaluate_numexprÚ_evaluate_standardr   Ú_where_numexprÚ_where_standardr   ©Úvs    Ú`/home/mande/repo/quber/.venv/lib/python3.13/site-packages/pandas/core/computation/expressions.pyÚset_use_numexprr"   2   s<   € ÷ ÒßÒ§I¢Ið  ‰KàˆK÷
 &1¢[Õ!Ô6H€Iß*š{Œ^�F´�Fó    c                ó�   • [         (       a;  [        (       a/  U c  [        R                  " 5       n [        R                  " U 5        g g g ©N)r	   r   ÚneÚdetect_number_of_coresÚset_num_threads)Úns    r!   Úset_numexpr_threadsr*   D   s7   € ÷ ÒŸ[š[Ø‰9Ü×)Ò)Ó+ˆAÜ
×Ò˜1Õð )Ðr#   c                ó>   • [         (       a  [        S5        U " X#5      $ )z
Standard evaluation.
F)r   Ú_store_test_result)ÚopÚop_strÚleft_opÚright_ops       r!   r   r   M   s   € ÷ ‚zÜ˜5Ô!ÙˆgÓ Ð r#   c                óî   • Ubr  UR                   [        :”  a^  [        5       nX#4 H/  n[        US5      (       d  M  XVR                  R
                  1-  nM1     [        U5      (       a  [        U   U:¼  a  gg)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   sd   € àÑà�<‰<œ-Ó'ä"›uˆFØÓ(�ä˜1˜g×&Ó&ØŸw™wŸ|™|˜nÑ,’Fñ )ô �v—;‘;¤/°+Ñ">À&Ó"HØàr#   c                ó�  • S n[        XX#S5      (       a]  U R                  R                  S5      R                  S5      nU(       a  X2p2UnUn [        R
                  " SU S3XgS.SS9nU(       a  X2p2[        (       a  [        US L5        Uc  [        XX#5      nU$ ! [         a     N>[         a    [        XU5      (       a   NZe f = f)	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ä˜ G°z×BÑBØ—k‘k×'Ñ'¨Ó,×7Ñ7¸Ó<ˆÞà (�Xàˆ
Øˆð	Ü—[’[Ø˜f˜X \Ð2Ø*4ÑQØñˆFö à (�Xç‚zÜ˜6¨Ð-Ô.à�~Ü# B°ÓBˆà€Møô) ó 	ñ Ü"ó 	Ü# F°X×>Ñ>Ùàð		ús   ÁB Â
CÂ'CÃCÚ+Ú*Ú-Ú/z**z==z!=z<=Ú<z>=Ú>Ú&Ú|Ú^c                ó0   • [         R                  " XU5      $ r%   )Únpr   )Úcondr/   r0   s      r!   r   r   ¶   s   € ä�8Š8�D 8Ó,Ð,r#   c                ó€   • S n[        S SXS5      (       a  [        R                  " SXUS.SS9nUc  [        XU5      nU$ )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   »   sL   € à€Fä˜˜g w¸'×BÑBÜ—’Ø1Ø&*È8ÑTØñ
ˆð �~Ü  °Ó9ˆà€Mr#   zcompute.use_numexprc                óŠ   •  U R                   [        :H  $ ! [         a#    [        U [        [        R
                  45      s $ f = fr%   )r2   r   ÚAttributeErrorÚ
isinstancerY   Úbool_)Úxs    r!   Ú_has_bool_dtyperd   Ð   s:   € ð/Ø�w‰wœ$‰ÐøÜó /Ü˜!œd¤B§H¡HÐ-Ó.Ò.ð/ús   ‚ •*AÁA)rO   rP   rQ   c                ó´   • [        U5      (       aH  [        U5      (       a8  U [        ;   a.  [        R                  " SU < S[        U    < S3[	        5       S9  gg)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   Ú   s^   € ô �w×Ñ¤O°H×$=Ñ$=ØÔ)Ó)Ü�MŠMØ9¸&¹ð Dä+¨FÑ3Ñ6°iðAô ,Ó-ò	ð Ør#   c                óX   • [         U    nUb  U(       a  [        XX5      $ [        XX5      $ )zê
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   ì   s1   € ô ˜RÑ €FØÑÞä˜R¨Ó;Ð;Ü˜b¨'Ó<Ð<r#   c                óR   • [         c   eU(       a  [        XU5      $ [        XU5      $ )zó
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      s-   € ô ÑÐÐÞÜ�d XÓ.Ð.ä˜t¨hÓ7Ð7r#   c                ó   • U q / qg)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                ó>   • U (       a  [         R                  U 5        g g r%   )r   Úappend)Úused_numexprs    r!   r,   r,     s   € ÞÜ×Ñ˜LÕ)ð r#   c                 ó   • [         n / q U $ )z)
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å !Ý ;Ý 'æÛá˜Ÿ™Ó'©7°8Ó+<Ñ<€IæÝ'à€
ˆKÓ Ø€ˆjÓ Ø€Ø!€	ˆ?Ó !Ø€ˆÓ ò AÚ)ñ€ð €ö@ö$ò!ôò&&ðR!Ø‡L�L�#ð!à‡N�N�Cð!ð ‡L�L�#ð!ð ‡N�N�Cð	!ð
 ‡L�L�#ð!ð ‡N�N�Cð!ð ×Ñ�cð!ð ×Ñ˜ð!ð ×Ñ�tð!ð ×Ñ˜ð!ð ‡L�L�$ð!ð  ‡N�N�Dð!!ð" ‡L�L�$ð#!ð$ ‡N�N�Dð%!ð& ‡K�K�ð'!ð( ‡K�K�ð)!ð* ‡K�K�ð+!ð, ‡K�K�Ø‡K�K�Ø‡K�K�Ø‡M�M�3Ø‡O�O�SØ‡L�L�#Ø‡N�N�CØ‡L�L�#Ø‡N�N�CØ
ˆDØ×Ñ�tñA!€òH-ò
ñ$ ‘
Ð0Ó1Ô 2ò/ð ! s°Ñ5Ð ôö$=ö(8ö&	ô*õ
r#   