
    \hA-              	          S 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
Jr  SSKJrJr  SSKJrJrJr  SS	KJrJr  SS
KJrJrJrJr  SSKJr  SSKJr  SSKJ r   SSK!J"r"J#r#  SSK$J%r%J&r&  SSK'J(r(  SSK)J*r*  SSK+J,r,   " S S5      r- " S S\-5      r.S r/\." S S 5      r0\" SS /S9r1\" SS /S9r2\" S5      r3\" S 5      r4\" S!S" /S9r5\." \" \45      \4-  \" \45      5      r6\." \" \5\4-  5      \4-  \5\" \5\4-  5      -  5      r7\6\74r8\." \3\" \45      -  \" S#5      -  \3\" \45      -  S$ S%9r9\." \" S#5      \" \45      -  \" \45      5      r:\." S& S' 5      r; " S( S)\.5      r<\<" \
\5      r=\<" \\%5      r>\<" \ \&5      r?\." S* S+ 5      r@S, S-.S. jrAS/ rBS0 rC\." \B\C5      rD\." \" \
" \35      \
" \45      -   5      \"" \3\45      5      rE\." \" \ " S#\35      \ " S#\45      -   5      \#" \3\45      \" S#5      -  5      rF\=\@\0\9\:4rG\G\E\F4-   \8-   rH\>\?4rIg1)2a  
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                   (    \ rS rSrSrSS jrS rSrg)Optimization4   zAbstract base class for rewriting optimization.

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

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

Nc                     Xl         X l        g Ncost_functionpriority)selfr$   r%   s      O/var/www/auris/envauris/lib/python3.13/site-packages/sympy/codegen/rewriting.py__init__Optimization.__init__@   s    *    c                 (    [        XR                  S9$ )N)key)minr$   )r&   argss     r'   cheapestOptimization.cheapestD   s    4//00r*   r#   )N   )__name__
__module____qualname____firstlineno____doc__r(   r/   __static_attributes__ r*   r'   r   r   4   s    
1r*   r   c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )ReplaceOptimH   a|  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                 >   > [         TU ]  " S0 UD6  Xl        X l        g )Nr8   )superr(   queryvalue)r&   r>   r?   kwargs	__class__s       r'   r(   ReplaceOptim.__init__h   s    "6"

r*   c                 N    UR                  U R                  U R                  5      $ r"   )replacer>   r?   )r&   exprs     r'   __call__ReplaceOptim.__call__m   s    ||DJJ

33r*   )r>   r?   )	r2   r3   r4   r5   r6   r(   rF   r7   __classcell__rA   s   @r'   r:   r:   H   s    >
4 4r*   r:   c                     [        US SS9 H-  nU" U 5      nUR                  c  Un M  UR                  X5      n M/     U $ )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                     U R                   $ r"   )r%   )opts    r'   <lambda>optimize.<locals>.<lambda>   s    s||r*   T)r,   reverse)sortedr$   r/   )rE   optimizationsoptimnew_exprs       r'   optimizerT   q   sH    * +CTR;&D>>$1D S Kr*   c                 F    U R                   =(       a    U R                  S:H  $ )N   )is_Powbaseps    r'   rM   rM      s    ahh&166Q;&r*   c                 ,    [        U R                  5      $ r"   )r   r   rY   s    r'   rM   rM      s    d155kr*   dc                     U R                   $ r"   )is_Dummyxs    r'   rM   rM      s    QZZr*   )
propertiesuc                 T    U R                   (       + =(       a    U R                  (       + $ r"   )	is_numberis_Addr_   s    r'   rM   rM      s    _%EQXX%Er*   vwnc                     U R                   $ r"   rd   r_   s    r'   rM   rM      s    Q[[r*   rV   c                 &    U R                  S 5      $ )Nc                     U R                   =(       a    U R                  R                  =(       d;    [        U [        [
        45      =(       a    U R                  S   R                  (       + $ Nr   )rW   r   is_negative
isinstancer   r   r.   rd   es    r'   rM   <lambda>.<locals>.<lambda>   sH    	&QUU&& 	Dq3+&Bqvvay/B/B+B	Dr*   )count)rE   s    r'   rM   rM      s    SWS]S]ETr*   r$   c                    [        U [        5      =(       au    U R                  S   R                  =(       aU    [	        U R                  S   R                  5      S:H  =(       a)    [        S U R                  S   R                   5       5      $ )Nr   rV   c              3   B   #    U  H  n[        U[        5      v   M     g 7fr"   )ro   r   ).0ts     r'   	<genexpr><lambda>.<locals>.<genexpr>   s     B>az!S))>s   )ro   r   r.   re   lenallls    r'   rM   rM      si    z!S! C66!9##Cqvvay~~&!+C B166!9>>BBCr*   c                 ,   [        U R                  S   R                   Vs/ s H  oR                  S   PM     sn6 [        [        [	        U R                  S   R                   Vs/ s H  oR                  S   PM     sn6 5      5      -   $ s  snf s  snf rm   )r	   r.   r   r   r
   )r~   rq   s     r'   rM   rM      si    0AffQi01c#166!9>>:>aq	>:;<=	>0:s   B&Bc                   H   ^  \ rS rSrSrSU 4S jjrS rS rU 4S jrSr	U =r
$ )	FuncMinusOneOptim   a}  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                 r   >^^ Sm[         TU ]  S U R                  UU4S jS9  Xl        TU l        X0l        g )N
   c                     U R                   $ r"   )re   rp   s    r'   rM   ,FuncMinusOneOptim.__init__.<locals>.<lambda>   s    188r*   c                 N   > U R                  5       TU R                  T5      -  -
  $ r"   )	count_opsrs   )rE   func_m_1weights    r'   rM   r      s     DNN4DvdjjYaNbGb4br*   rt   )r=   r(   replace_in_Addfuncr   opportunistic)r&   r   r   r   r   rA   s     ` @r'   r(   FuncMinusOneOptim.__init__   s;    +T-@-@'b 	 	d	 *r*   c                 t   ^  [        UR                  S SS9u  p#[        U5      n[        UU 4S jSS9u  pVXEU4$ )Nc                     U R                   $ r"   rj   args    r'   rM   4FuncMinusOneOptim._group_Add_terms.<locals>.<lambda>   s    cmmr*   Tbinaryc                 :   > U R                  TR                  5      $ r"   )hasr   r   r&   s    r'   rM   r      s    377499;Mr*   )r   r.   sum)r&   addnumbersnon_numnumsumterms_with_funcothers   `      r'   _group_Add_terms"FuncMinusOneOptim._group_Add_terms   s@    *CDQW!%g/MVZ![--r*   c                   ^  T R                  U5      u  p#nUS:X  a  U$ / / peU GH2  nUR                  (       aF  [        UR                  U 4S jSS9u  p[	        U5      S:X  a  [	        U	5      S:X  a
  US   U	S   pO1Sn	O.UR
                  T R
                  :X  a  U[        R                  pOSn	U	b  U	R                  (       a  [        U	5      [        U5      * :X  ak  T R                  (       a  [        X-   5      [        U5      :  n
OX-   S:H  n
U
(       a2  X)-  nUR                  U	T R                  " WR                  6 -  5        GM!  UR                  U5        GM5     UR
                  " U/UQUQUQ76 $ )z0passed as second argument to Basic.replace(...) r   c                 6   > U R                   TR                   :H  $ r"   )r   r   s    r'   rM   2FuncMinusOneOptim.replace_in_Add.<locals>.<lambda>   s    sxx499?Tr*   Tr   r1   N)r   is_Mulr   r.   r{   r   r   Onerd   r   r   absappendr   )r&   rq   r   r   other_non_num_termssubstituted	untouched	with_funcr   coeffdo_substitutes   `          r'   r    FuncMinusOneOptim.replace_in_Add   sA   7;7L7LQ7O4!4Q;H!#RY(I"9>>3T]abt9>c%jAo"&q'58% E499,'e U__ef9U%%$'$5F$CM$)LA$5M OF&&uT]]DII-F'FGY'- )0 vvfM{MYM9LMMr*   c                 ~   > [         TU ]  U5      n[         TU ]  UR                  5       5      nU R                  X#5      $ r"   )r=   rF   factorr/   )r&   rE   alt1alt2rA   s       r'   rF   FuncMinusOneOptim.__call__  s6    w%w.}}T((r*   )r   r   r   )T)r2   r3   r4   r5   r6   r(   r   r   rF   r7   rH   rI   s   @r'   r   r      s$    $L+.N@) )r*   r   c                 "    [        U [        5      $ r"   )ro   r   rp   s    r'   rM   rM     s    jC r*   c                     [        U R                  [        S 5      5      R                  [        [        S-   5      [	        [        5      5      $ )Nc                 4    [        U R                  5       5      $ r"   )r   r   r   s    r'   rM   rr     s    SZZ\*r*   r1   )r   rD   r   _ur   r}   s    r'   rM   rM     s7    j* ws2a4y%)$%r*   c                     U R                   $ r"   )	is_symbol)bs    r'   rM   rM     s    r*   )base_reqc                *   ^ ^ [        UU 4S jS 5      $ )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                    > U R                   =(       aN    T" U R                  5      =(       a5    U R                  R                  =(       a    [	        U R                  5      T:*  $ r"   )rW   rX   r   
is_Integerr   )rq   r   limits    r'   rM   0create_expand_pow_optimization.<locals>.<lambda>B  s<    !((\x/\AEE4D4D\QUUW\I\\r*   c                     U R                   S:  a-  [        [        U R                  /U R                   7-  SS065      $ S[        [        U R                  /U R                   * -  SS065      -  $ )Nr   evaluateFr1   )r   r   r   rX   rY   s    r'   rM   r   C  sb    HIPQ	OC166(AEE6/CUCD GocQVVHaeeVOEuEFFGr*   )r:   )r   r   s   ``r'   create_expand_pow_optimizationr     s    F \	
 r*   c                 b   U R                   (       a  [        U R                  5      S:X  a  U R                  u  pUR                  (       af  UR                  S   S:X  aS  UR
                  n[        U[        5      (       a2  [        [        [        R                  " UR
                  5      5      5      $ g)NrV   r1   F)	is_MatMulr{   r.   
is_Inverseshaper   ro   r   boolr   r   fullrankrE   leftrightinv_args       r'   _matinv_predicater   I  so    ~~#dii.A-ii??u{{1~2hhG'<00C

488 4566r*   c                 L    U R                   u  pUR                  n[        X25      $ r"   )r.   r   r   r   s       r'   _matinv_transformr   T  s!    ))KDhhGw&&r*   N)Jr6   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   r:   rT   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_scipyr8   r*   r'   <module>r      s_  @ + " " 5 = ? E E $ = = 2 +   ; 2  ; *1 1(&4< &4R< & 
#/01	#EFG	#Y	#Y	#012GBJR	 2JrM2d2b5k>	 	"	3r7
3q6)2d2h; G  SVDH_c"g6#D	 X) X)v c5)	c5)	c5)	 %	 7L (V	' +->?
 SRR19R3DEc#a*SBZ"78*R:LSQRV:ST HhF
]N<<yH9%r*   