+
    ‹°³jA-  ã            	       óš  € R t ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RI	H
t
Ht ^ RIHtHt ^ RIHtHtHt ^ RIHtHt ^ R	IHtHtHtHt ^ R
IHt ^ RIHt ^ RIH t  ^ RI!H"t"H#t# ^ RI$H%t%H&t& ^ RI'H(t( ^ RI)H*t* ^ RI+H,t,  ! R R4      t- ! R R]-4      t.R t/].! R R 4      t0]! RR .R7      t1]! RR .R7      t2]! R4      t3]! R4      t4]! R R! .R7      t5].! ]! ]44      ]4,          ]! ]44      4      t6].! ]! ]5]4,          4      ]4,          ]5]! ]5]4,          4      ,          4      t7]6]73t8].! ]3]! ]44      ,          ]! ^4      ,          ]3]! ]44      ,          R" R#7      t9].! ]! ^4      ]! ]44      ,          ]! ]44      4      t:].! R$ R% 4      t; ! R& R'].4      t<]<! ]
]4      t=]<! ]]%4      t>]<! ] ]&4      t?].! R( R) 4      t@R*R+ /R, ltAR- tBR. tC].! ]B]C4      tD].! ]! ]
! ]34      ]
! ]44      ,           4      ]"! ]3]44      4      tE].! ]! ] ! ^]34      ] ! ^]44      ,           4      ]#! ]3]44      ]! ^4      ,          4      tF]=]@]0]9]:3tG]G]E]F3,           ]8,           tH]>]?3tIR/# )0aø  
Classes and functions useful for rewriting expressions for optimized code
generation. Some languages (or standards thereof), e.g. C99, offer specialized
math functions for better performance and/or precision.

Using the ``optimize`` function in this module, together with a collection of
rules (represented as instances of ``Optimization``), one can rewrite the
expressions for this purpose::

    >>> from sympy import Symbol, exp, log
    >>> from sympy.codegen.rewriting import optimize, optims_c99
    >>> x = Symbol('x')
    >>> optimize(3*exp(2*x) - 3, optims_c99)
    3*expm1(2*x)
    >>> optimize(exp(2*x) - 1 - exp(-33), optims_c99)
    expm1(2*x) - exp(-33)
    >>> optimize(log(3*x + 3), optims_c99)
    log1p(x) + log(3)
    >>> optimize(log(2*x + 3), optims_c99)
    log(2*x + 3)

The ``optims_c99`` imported above is tuple containing the following instances
(which may be imported from ``sympy.codegen.rewriting``):

- ``expm1_opt``
- ``log1p_opt``
- ``exp2_opt``
- ``log2_opt``
- ``log2const_opt``


)Ú
expand_log)ÚS)ÚWild)Úsign)ÚexpÚlog)ÚMaxÚMin)ÚcosÚsinÚsinc)ÚQÚask)Úlog1pÚlog2Úexp2Úexpm1)ÚMatrixSolve)ÚUnevaluatedExpr)ÚPow)Ú	logaddexpÚ
logaddexp2)Úcosm1Úpowm1)ÚMul)ÚMatrixSymbol)Úsiftc                   ó4   a € ] tR t^4t o RtRR ltR tRtV tR# )ÚOptimizationzÐAbstract base class for rewriting optimization.

Subclasses should implement ``__call__`` taking an expression
as argument.

Parameters
==========
cost_function : callable returning number
priority : number

Nc                ó   € Wn         W n        R # ©N©Úcost_functionÚpriority)Úselfr"   r#   s   &&&ÚX/home/luca/screen-checking/.venv/lib/python3.14/site-packages/sympy/codegen/rewriting.pyÚ__init__ÚOptimization.__init__@   s   € Ø*ÔØŽó    c                ó.   € \        WP                  R 7      # ))Úkey)Úminr"   )r$   Úargss   &*r%   ÚcheapestÚOptimization.cheapestD   s   € Ü�4×/Ñ/Ô0Ð0r(   r!   )Né   )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r&   r-   Ú__static_attributes__Ú__classdictcell__)Ú__classdict__s   @r%   r   r   4   s   ø‡ € ñ
ô÷1ð 1r(   r   c                   ó<   a a€ ] tR t^Ht oRtV 3R ltR tRtVtV ;t	# )ÚReplaceOptima|  Rewriting optimization calling replace on expressions.

Explanation
===========

The instance can be used as a function on expressions for which
it will apply the ``replace`` method (see
:meth:`sympy.core.basic.Basic.replace`).

Parameters
==========

query :
    First argument passed to replace.
value :
    Second argument passed to replace.

Examples
========

>>> from sympy import Symbol
>>> from sympy.codegen.rewriting import ReplaceOptim
>>> from sympy.codegen.cfunctions import exp2
>>> x = Symbol('x')
>>> exp2_opt = ReplaceOptim(lambda p: p.is_Pow and p.base == 2,
...     lambda p: exp2(p.exp))
>>> exp2_opt(2**x)
exp2(x)

c                ó@   <€ \         SV `  ! R/ VB  Wn        W n        R # )N© )Úsuperr&   ÚqueryÚvalue)r$   r=   r>   ÚkwargsÚ	__class__s   &&&,€r%   r&   ÚReplaceOptim.__init__h   s   ø€ Ü‰ÒÑ"˜6Ò"ØŒ
ØŽ
r(   c                óN   € VP                  V P                  V P                  4      # r    )Úreplacer=   r>   )r$   Úexprs   &&r%   Ú__call__ÚReplaceOptim.__call__m   s   € Ø�|‰|˜DŸJ™J¨¯
©
Ó3Ð3r(   )r=   r>   )
r0   r1   r2   r3   r4   r&   rE   r5   r6   Ú__classcell__©r@   r7   s   @@r%   r9   r9   H   s   ù‡ € ñõ>÷
4ò 4r(   r9   c                óˆ   € \        VR RR7       F.  pV! V 4      pVP                  f   Tp K  VP                  W4      p K0  	  V # )a¶  Apply optimizations to an expression.

Parameters
==========

expr : expression
optimizations : iterable of ``Optimization`` instances
    The optimizations will be sorted with respect to ``priority`` (highest first).

Examples
========

>>> from sympy import log, Symbol
>>> from sympy.codegen.rewriting import optims_c99, optimize
>>> x = Symbol('x')
>>> optimize(log(x+3)/log(2) + log(x**2 + 1), optims_c99)
log1p(x**2) + log2(x + 3)

c                 ó   € V P                   # r    )r#   )Úopts   &r%   Ú<lambda>Úoptimize.<locals>.<lambda>†   s   € °s·|²|r(   T)r*   Úreverse)Úsortedr"   r-   )rD   ÚoptimizationsÚoptimÚnew_exprs   &&  r%   ÚoptimizerS   q   sH   € ô* ˜Ñ+CÈT×RˆÙ˜“;ˆØ×ÑÒ&ØŠDà—>‘> $Ó1ŠDñ Sð €Kr(   c                 óH   € V P                   ;'       d    V P                  ^8H  # )é   )Úis_PowÚbase©Úps   &r%   rL   rL   �   s   € ˆa�h‰h×&Ð&˜1Ÿ6™6 Q™;Ð&r(   c                 ó,   € \        V P                  4      # r    )r   r   rX   s   &r%   rL   rL   ‘   s   € Œd�1—5‘5Œkr(   Údc                 ó   € V P                   # r    )Úis_Dummy©Úxs   &r%   rL   rL   •   s   €  Q§Z¢Zr(   )Ú
propertiesÚuc                 óV   € V P                   '       * ;'       d    V P                  '       * # r    )Ú	is_numberÚis_Addr^   s   &r%   rL   rL   –   s   € ¨¯©¤_×%EÐ%E¸Q¿X¹X¼Ð%Er(   ÚvÚwÚnc                 ó   € V P                   # r    ©rc   r^   s   &r%   rL   rL   ™   s   €  Q§[¢[r(   c                 ó&   € V P                  R  4      # )c                 óæ   € V P                   ;'       d    V P                  P                  ;'       gA    \        V \        \
        34      ;'       d#    V P                  ^ ,          P                  '       * # ©é    )rV   r   Úis_negativeÚ
isinstancer   r   r,   rc   ©Úes   &r%   rL   Ú<lambda>.<locals>.<lambda>¤   sT   € Ø	�‰×&Ð&�Q—U‘U×&Ñ&÷ 	Dð 	DÜ�qœ3¤˜+Ó&×BÐB¨q¯v©v°a­y×/BÑ/BÔ+Bð	Dr(   )Úcount)rD   s   &r%   rL   rL   £   s   € ÐSW×S]ÑS]ñEôTr(   ©r"   c                 ó²  € \        V \        4      ;'       dÁ    V P                  ^ ,          P                  ;'       dœ    \	        V P                  ^ ,          P                  4      ^8H  ;'       dk    \
        ;QJ d7    R V P                  ^ ,          P                   4       F  '       d   K   R# 	  R# ! R V P                  ^ ,          P                   4       4      # )rm   c              3   óB   "  € T F  p\        V\        4      x € K  	  R # 5ir    )ro   r   )Ú.0Úts   & r%   Ú	<genexpr>Ú<lambda>.<locals>.<genexpr>°   s   é € ÐB±>¨a”z !¤S×)Ð)³>ùs   ‚FT)ro   r   r,   rd   ÚlenÚall©Úls   &r%   rL   rL   ­   s«   € Œz˜!œSÓ!÷ Cð CØ—6‘6˜!•9×#Ñ#÷Cð Cä�q—v‘v˜a•y—~‘~Ó&¨!Ñ+÷Cð C÷ “3ÑB°1·6±6¸!µ9·>²>ÓB—3”3ðCò ðCð ÑB°1·6±6¸!µ9·>²>ÓBÓBðCr(   c                 óT  € \        V P                  ^ ,          P                   Uu. uF  qP                  ^ ,          NK  	  up!  \        \        \	        V P                  ^ ,          P                   Uu. uF  qP                  ^ ,          NK  	  up!  4      4      ,           # u upi u upi rl   )r   r,   r   r   r	   )r~   rq   s   & r%   rL   rL   ±   sm   € Ü §¡¨¥§¢Ó0¡˜A�f‰f�Q�iˆi¡Ñ0Ñ1ÜŒc”#¨1¯6©6°!­9¯>ª>Ó:©> aŸ™˜qŸ	˜	©>Ñ:Ñ;Ó<Ó=ö	>ùÒ0ùÚ:s   ¥B Á2B%c                   óR   a a€ ] tR t^¸t oRtRV 3R lltR tR tV 3R ltRt	Vt
V ;t# )ÚFuncMinusOneOptima}  Specialization of ReplaceOptim for functions evaluating "f(x) - 1".

Explanation
===========

Numerical functions which go toward one as x go toward zero is often best
implemented by a dedicated function in order to avoid catastrophic
cancellation. One such example is ``expm1(x)`` in the C standard library
which evaluates ``exp(x) - 1``. Such functions preserves many more
significant digits when its argument is much smaller than one, compared
to subtracting one afterwards.

Parameters
==========

func :
    The function which is subtracted by one.
func_m_1 :
    The specialized function evaluating ``func(x) - 1``.
opportunistic : bool
    When ``True``, apply the transformation as long as the magnitude of the
    remaining number terms decreases. When ``False``, only apply the
    transformation if it completely eliminates the number term.

Examples
========

>>> from sympy import symbols, exp
>>> from sympy.codegen.rewriting import FuncMinusOneOptim
>>> from sympy.codegen.cfunctions import expm1
>>> x, y = symbols('x y')
>>> expm1_opt = FuncMinusOneOptim(exp, expm1)
>>> expm1_opt(exp(x) + 2*exp(5*y) - 3)
expm1(x) + 2*expm1(5*y)


c                óz   <aa€ ^
o\         SV `  R V P                  VV3R lR7       Wn        SV n        W0n        R# )é
   c                 ó   € V P                   # r    )rd   rp   s   &r%   rL   Ú,FuncMinusOneOptim.__init__.<locals>.<lambda>á   s   €  1§8¢8r(   c                 ó^   <€ V P                  4       SV P                  S4      ,          ,
          # r    )Ú	count_opsrs   )rD   Úfunc_m_1Úweights   &€€r%   rL   r…   â   s    ø€ °D·N±NÓ4DÀvÈdÏjÉjÐYaÓNbÕGbÖ4br(   rt   N)r<   r&   Úreplace_in_AddÚfuncrˆ   Úopportunistic)r$   r‹   rˆ   rŒ   r‰   r@   s   &&f&@€r%   r&   ÚFuncMinusOneOptim.__init__ß   s;   ú€ ØˆÜ‰ÑÑ+¨T×-@Ñ-@Ý'bð 	ô 	dàŒ	Ø ˆŒØ*Ör(   c                ó€   a € \        VP                  R  RR7      w  r#\        V4      p\        VV 3R lRR7      w  rVWEV3# )c                 ó   € V P                   # r    ri   ©Úargs   &r%   rL   Ú4FuncMinusOneOptim._group_Add_terms.<locals>.<lambda>è   s   € °c·m²mr(   T©Úbinaryc                 ó:   <€ V P                  SP                  4      # r    )Úhasr‹   ©r‘   r$   s   &€r%   rL   r’   ê   s   ø€ ¸3¿7¹7À4Ç9Á9Ô;Mr(   )r   r,   Úsum)r$   ÚaddÚnumbersÚnon_numÚnumsumÚterms_with_funcÚothers   f&     r%   Ú_group_Add_termsÚ"FuncMinusOneOptim._group_Add_termsç   s@   ø€ Ü §¡Ñ*CÈDÔQÑˆÜ�W“ˆÜ!% gÔ/MÐVZÔ![ÑˆØ¨Ð-Ð-r(   c                ó0  a € S P                  V4      w  r#pV^ 8X  d   V# . . reV EFW  pVP                  '       dT   \        VP                  V 3R lRR7      w  r‰\	        V4      ^8X  d#   \	        V	4      ^8X  d   V^ ,          V	^ ,          r˜M2Rp	M/VP
                  S P
                  8X  d   T\        P                  r˜MRp	V	e«   V	P                  '       d™   \        V	4      \        V4      ) 8X  d   S P                  '       d   \        W’,           4      \        V4      8  p
MW’,           ^ 8H  p
V
'       d<   W),          pVP                  V	S P                  ! XP                  !  ,          4       EKF  VP                  V4       EKZ  	  VP
                  ! V.VOVOVO5!  # )z0passed as second argument to Basic.replace(...) c                 ó6   <€ V P                   SP                   8H  # r    )r‹   r—   s   &€r%   rL   Ú2FuncMinusOneOptim.replace_in_Add.<locals>.<lambda>õ   s   ø€ ¸s¿x¹xÈ4Ï9É9Ò?Tr(   Tr“   N)rŸ   Úis_Mulr   r,   r{   r‹   r   ÚOnerc   r   rŒ   ÚabsÚappendrˆ   )r$   rq   rœ   r�   Úother_non_num_termsÚsubstitutedÚ	untouchedÚ	with_funcr‹   ÚcoeffÚdo_substitutes   f&         r%   rŠ   Ú FuncMinusOneOptim.replace_in_Addí   sI  ø€ à7;×7LÑ7LÈQÓ7OÑ4ˆÐ!4Ø�QŒ;ØˆHØ!# R�YÜ(ˆIØ××ÐÜ" 9§>¡>Ô3TÐ]aÔb‘�Ü�t“9 ”>¤c¨%£j°A¤oØ"& q¥'¨5°­8™%à ‘EØ—‘ 4§9¡9Ô,Ø'¬¯©‘eà�àÒ  U§_§_ _¼¸e»ÌÈfËÈÔ9UØ×%×%Ð%Ü$'¨­Ó$5¼¸F»Ñ$C‘Mà$)¥L°AÑ$5�Mç Ø•O�FØ×&Ñ& u¨T¯]ª]¸D¿I¹IÑ-FÕ'FÔGÚØ×Ñ˜Y×'ñ- )ð0 �vŠv�fÐM˜{ÐM¨YÐMÐ9LÓMÐMr(   c                ó~   <€ \         SV `  V4      p\         SV `  VP                  4       4      pV P                  W#4      # r    )r<   rE   Úfactorr-   )r$   rD   Úalt1Úalt2r@   s   &&  €r%   rE   ÚFuncMinusOneOptim.__call__  s6   ø€ Ü‰wÑ Ó%ˆÜ‰wÑ §¡£Ó.ˆØ�}‰}˜TÓ(Ð(r(   )r‹   rˆ   rŒ   )T)r0   r1   r2   r3   r4   r&   rŸ   rŠ   rE   r5   r6   rG   rH   s   @@r%   r�   r�   ¸   s&   ù‡ € ñ$÷L+ò.òN÷@)õ )r(   r�   c                 ó"   € \        V \        4      # r    )ro   r   rp   s   &r%   rL   rL     s   € Œj˜œCÔ r(   c                 ó¤   € \        V P                  \        R  4      4      P                  \        \        ^,           4      \	        \        4      4      # )c                 ó4   € \        V P                  4       4      # r    )r   r°   r�   s   &r%   rL   rr     s   € œ˜SŸZ™Z›\Ô*r(   )r   rC   r   Ú_ur   r}   s   &r%   rL   rL     s7   € Œj˜Ÿ™ÜÑ*óó ç�wŒs”2�a•4‹yœ%¤›)Ó$ð%r(   Úbase_reqc                 ó   € V P                   # r    )Ú	is_symbol)Úbs   &r%   rL   rL     s   € ÀÇÂr(   c               ó*   a a€ \        VV 3R lR 4      # )a®  Creates an instance of :class:`ReplaceOptim` for expanding ``Pow``.

Explanation
===========

The requirements for expansions are that the base needs to be a symbol
and the exponent needs to be an Integer (and be less than or equal to
``limit``).

Parameters
==========

limit : int
     The highest power which is expanded into multiplication.
base_req : function returning bool
     Requirement on base for expansion to happen, default is to return
     the ``is_symbol`` attribute of the base.

Examples
========

>>> from sympy import Symbol, sin
>>> from sympy.codegen.rewriting import create_expand_pow_optimization
>>> x = Symbol('x')
>>> expand_opt = create_expand_pow_optimization(3)
>>> expand_opt(x**5 + x**3)
x**5 + x*x*x
>>> expand_opt(x**5 + x**3 + sin(x)**3)
x**5 + sin(x)**3 + x*x*x
>>> opt2 = create_expand_pow_optimization(3, base_req=lambda b: not b.is_Function)
>>> opt2((x+1)**2 + sin(x)**2)
sin(x)**2 + (x + 1)*(x + 1)

c                 óÌ   <€ V P                   ;'       dQ    S! V P                  4      ;'       d7    V P                  P                  ;'       d    \	        V P                  4      S8*  # r    )rV   rW   r   Ú
is_Integerr¦   )rq   r¸   Úlimits   &€€r%   rL   Ú0create_expand_pow_optimization.<locals>.<lambda>B  sE   ø€ �!—(‘(×\Ð\™x¨¯©Ó/×\Ð\°A·E±E×4DÑ4D×\Ð\ÌÈQÏUÉUËÐW\ÑI\Ð\r(   c                 óö   € V P                   ^ 8”  d2   \        \        V P                  .V P                   5,          RR/ 4      # ^\        \        V P                  .V P                   ) ,          RR/ 4      ,          # )rm   ÚevaluateF)r   r   r   rW   rX   s   &r%   rL   rÀ   C  sb   € ØHIÏÉÐPQÌ	ŒOœC 1§6¡6 (¨A¯E©E¨6¥/ÐC¸UÑCÓDð GØŒoœc Q§V¡V H¨a¯e©e¨V¥OÐE¸uÑEÓFÕFðGr(   )r9   )r¿   r¸   s   fdr%   Úcreate_expand_pow_optimizationrÃ     s   ù€ ôF Ý\ñ	
óð r(   c                 óv  € V P                   '       d§   \        V P                  4      ^8X  d�   V P                  w  rVP                  '       dm   VP                  ^,          ^8X  dU   VP
                  p\        V\        4      '       d3   \        \        \        P                  ! VP
                  4      4      4      # R# )rU   F)Ú	is_MatMulr{   r,   Ú
is_InverseÚshaper‘   ro   r   Úboolr   r   Úfullrank©rD   ÚleftÚrightÚinv_args   &   r%   Ú_matinv_predicaterÎ   I  ss   € à‡~‡~€~œ#˜dŸi™i›.¨AÔ-Ø—i‘i‰ˆØ�?�?ˆ?˜uŸ{™{¨1�~°Ô2Ø—h‘hˆGÜ˜'¤<×0Ò0ÜœC¤§
¢
¨4¯8©8Ó 4Ó5Ó6Ð6ár(   c                 óL   € V P                   w  rVP                  p\        W24      # r    )r,   r‘   r   rÊ   s   &   r%   Ú_matinv_transformrÐ   T  s!   € Ø—)‘)�K€DØ�h‰h€GÜ�wÓ&Ð&r(   N)Jr4   Úsympy.core.functionr   Úsympy.core.singletonr   Úsympy.core.symbolr   Ú$sympy.functions.elementary.complexesr   Ú&sympy.functions.elementary.exponentialr   r   Ú(sympy.functions.elementary.miscellaneousr   r	   Ú(sympy.functions.elementary.trigonometricr
   r   r   Úsympy.assumptionsr   r   Úsympy.codegen.cfunctionsr   r   r   r   Úsympy.codegen.matrix_nodesr   Úsympy.core.exprr   Úsympy.core.powerr   Úsympy.codegen.numpy_nodesr   r   Úsympy.codegen.scipy_nodesr   r   Úsympy.core.mulr   Ú"sympy.matrices.expressions.matexprr   Úsympy.utilities.iterablesr   r   r9   rS   Úexp2_optÚ_dr·   Ú_vÚ_wÚ_nÚ	sinc_opt1Ú	sinc_opt2Ú	sinc_optsÚlog2_optÚlog2const_optÚlogsumexp_2terms_optr�   Ú	expm1_optÚ	cosm1_optÚ	powm1_optÚ	log1p_optrÃ   rÎ   rÐ   Ú
matinv_optÚlogaddexp_optÚlogaddexp2_optÚ
optims_c99Úoptims_numpyÚoptims_scipyr;   r(   r%   Ú<module>r÷      sa  ðñõ@ +Ý "Ý "Ý 5ß =ß ?ß EÑ Eß $ß =Ó =Ý 2Ý +Ý  ß ;ß 2Ý Ý ;Ý *÷1ñ 1ô(&4�<ô &4òRñ< Ù&Ùó€ñ 
ˆ#Ñ/Ð0Ô1€Ù	ˆ#ÑEÐFÔG€Ù	ˆ#ƒY€Ù	ˆ#ƒY€Ù	ˆ#Ñ0Ð1Ô2€áÙˆƒGˆB…J‘�R“ó€	ñ Ùˆˆ2�ƒJˆr…M�2‘d˜2˜b�5“k•>ó€	ð ˜	Ð"€	á˜™3˜r›7�
¡3 q£6Õ)¨2©d°2«h­;ñ Gô €ñ ™S ›V¡D¨£H�_©c°"«gÓ6€á#ñDñó	Ð ôX)˜ô X)ñv ˜c 5Ó)€	Ù˜c 5Ó)€	Ù˜c 5Ó)€	áÙ ñ%ó€	ð(Ñ6Kô (òV	ò'ñ Ð+Ð->Ó?€
ñ ™S¡ R£©¨R«¥Ó1±9¸RÀÓ3DÓE€Ù™c¡# a¨£*©S°°B«ZÕ"7Ó8¹*ÀRÈÓ:LÉSÐQRËVÕ:SÓT€ð ˜ H¨h¸ÐF€
à˜]¨NÐ<Õ<¸yÕH€à˜9Ð%‚r(   