
    g=                     &   d dl Z d dlmZ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mZ d dlmZmZmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZ d dlmZ d dlmZm Z m!Z!m"Z" d dl#m$Z$m%Z% d dl&m'Z'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z< d dl=m>Z> d dl?m@Z@mAZA d dlBmCZC  ed      ZD ed      ZE ed      ZFd ZGd ZHd ZId ZJd ZKd ZLd ZMd-d ZNd! ZOd" ZPd# ZQd$ ZRd% ZSd& ZTd' ZUd( ZVd) ZWd* ZXe;d+        ZYeCd,        ZZy).    N)piRational)Pow)S)Symbol)Abs)explog)cossinsinc)MatrixSymbol)assumingQ)import_module)ccode)MatrixSolve)log2exp2expm1log1p)	logaddexp
logaddexp2)cosm1powm1)optimize	cosm1_optlog2_optexp2_opt	expm1_opt	log1p_opt	powm1_opt
optims_c99create_expand_pow_optimization
matinv_optlogaddexp_optlogaddexp2_optoptims_numpyoptims_scipy	sinc_optsFuncMinusOneOptim)XFAILskip)lambdify)compile_link_import_stringshas_c)	may_xfailcythonnumpyscipyc                  B   t        d      } dt        d| z  dz         z  t        d      z  }t        |t        g      }|dt	        d| z  dz         z  k(  sJ |j                  t              |k(  sJ dt        d| z  dz         z  dt        d      z  z  }t        |t        g      }|dt	        d| z  dz         z  dz  k(  sJ |j                  t              |k(  sJ t        |       t        d      z  }t        |t        g      }|t	        |       k(  sJ |j                  t              |k(  sJ t        |       t        d      z  t        | dz         z   }t        |t        g      }|t	        |       t        d      t	        | dz         z  z   k(  sJ |j                  t              |k(  sJ t        d      }	t        |	t        g      }
|
|	k(  sJ t        | dz         t        d      z  }t        |t        g      }t        |      d	k(  sJ |j                  t              |k(  sJ y )
Nx                     zlog2(x + 3))r   r
   r   r   r   rewritestr)r6   expr1opt1expr2opt2expr3opt3expr4opt4expr5opt5expr6opt6s                W/var/www/openai/venv/lib/python3.12/site-packages/sympy/codegen/tests/test_rewriting.pytest_log2_optrM       s   sAc!A#'lNCF#EEH:&D1T!A#']?"""<<%%%c!A#'lNBs1vI&EEH:&D1T!A#']?2%%%%<<%%%F3q6MEEH:&D47??<<%%%F3q6MC!H$EEH:&D47SVD1I-----<<%%%GEEH:&D5==AJs1vEEH:&Dt9%%%<<%%%    c                      t        d      } dd| z  z   }t        |t        g      }|dt        |       z   k(  sJ |j	                  t
              |k(  sJ dd| z  z   }|t        |t        g      k(  sJ y )Nr6   r<   r:   r8   )r   r   r   r   r>   r   )r6   r@   rA   rB   s       rL   test_exp2_optrP   @   sw    sA1HEEH:&D1tAw;<<%%%1HEHUXJ////rN   c                     t        d      t              dz
  } t        | t        g      }t	              |z
  dk(  sJ |j                  t              | k(  sJ dt              z  dz
  }t        |t        g      }dt	              z  |k(  sJ |j                  t              |k(  sJ dt              z  dz
  }t        |t        g      }dt	              z  dz
  |k(  sJ |j                  t              |k(  sJ t        t        t        d      }|t        ||g      k(  sJ |t        | |g      k(  sJ |t        ||g      k(  sJ dt              z  t              z   dz
  }t        |t        g      }dt	              z  t              z   |k(  sJ |j                  t              |k(  sJ dt        dz        z  dz
  }	t        |	t        g      }
dt	        dz        z  |
k(  sJ |
j                  t              |	k(  sJ dt              z  dz   t              dz   z  dz   }t        |t        g      }|j                         |j                         k  sJ fd	}t         ||       ||      z
        d
k  sJ t        d      }dt              z  dz
  dt        |      z
  z  ddt        |      z
  z  z
  }t        |t        g      }dt	              z  t	        |      z  |k(  sJ |j                  t              |z
  j                         dk(  sJ dt              z   dz  dz
  }t        |t        g      }t              dz   t	              z  }dt	              z  t	        dz        z   }||z
  j                  t              j                         dk(  sJ |||fv sJ |j                  t              |z
  j                         dk(  sJ t        |      }t        |t        g      }t        |      }t        |      }|||fv sJ |j                  t              |j                  t              z
  j                         j                  sJ y )Nr6   r<   r   r8   r9   r:   Fopportunisticc                 D    | j                  d      j                         S )Nr8   )subsevalf)er6   s    rL   evztest_expm1_opt.<locals>.evo   s    vva|!!##rN   gV瞯<y   )r   r	   r   r    r   r>   r+   r
   	count_opsabsfactorr   is_zero)r@   rA   rB   rC   rD   rE   expm1_opt_non_opportunisticrF   rG   rH   rI   rJ   rK   rX   rY   expr7opt7expr8opt8tgt8atgt8bexpr9opt9tgt9atgt9br6   s                            @rL   test_expm1_optrk   K   s   sAFQJEEI;'D8d?a<<%%%c!fHqLEEI;'DU1X:<<%%%c!fHqLEEI;'DU1X:>T!!!<<%%%"3Ce"THU%@$ABBBB8E$?#@AAAA8E$?#@AAAAc!fHs1v!EEI;'DU1X:A$&&&<<%%%c!A#hJNEEI;'DU1Q3Z<4<<%%%s1vX\CFQJ'!+EEI;'D>>u0000$r%y2d8#$u,,,sAs1vX\AAJ'!Qs1vX,6EEI;'DeAh;uQx4'''LL%--/1444s1vXMAEEI;'DVaZq!EeAhJqs#E
 EM""3'..0A555E5>!!!LL%--/1444JEEI;'DJEJEE5>!!!LLc 22::<DDDDrN   c                      t        t        dj                               \  } }t        |       t        |      z   dz
  }t	        |t
        g      }|t        |       t        |      z   k(  sJ y Nx yr:   )mapr   splitr	   r   r    r   r6   rY   r@   rA   s       rL   test_expm1_two_exp_termsrr      W    vu{{}%DAqFSVOaEEI;'D58eAh&&&&rN   c                     t        d      } t        |       dz
  }t        |t        g      }t	        |       |z
  dk(  sJ |j                  t              |k(  sJ dt        |       z  dz
  }t        |t        g      }dt	        |       z  |k(  sJ |j                  t              |k(  sJ dt        |       z  dz
  }t        |t        g      }dt	        |       z  dz
  |k(  sJ |j                  t              |k(  sJ t        t        t        d      }|t        ||g      k(  sJ |t        ||g      k(  sJ |t        ||g      k(  sJ dt        |       z  t        |       z   dz
  }t        |t        g      }	dt	        |       z  t        |       z   |	k(  sJ |	j                  t              |k(  sJ dt        d| z        z  dz
  }
t        |
t        g      }dt	        d| z        z  |k(  sJ |j                  t              |
k(  sJ ddt        |       z  z
  }t        |t        g      }d	t	        |       z  |k(  sJ |j                  t              |k(  sJ y )
Nr6   r<   r   r8   r9   r:   FrR   rZ   )r   r   r   r   r   r>   r+   r
   )r6   r@   rA   rB   rC   rD   rE   cosm1_opt_non_opportunisticrF   rG   rH   rI   rJ   rK   s                 rL   test_cosm1_optrv      sH   sAFQJEEI;'D8d?a<<%%%c!fHqLEEI;'DU1X:<<%%%c!fHqLEEI;'DU1X:>T!!!<<%%%"3Ce"THU%@$ABBBB8E$?#@AAAA8E$?#@AAAAc!fHs1v!EEI;'DU1X:A$&&&<<%%%c!A#hJNEEI;'DU1Q3Z<4<<%%%#a&LEEI;'DeAh;$<<%%%rN   c                      t        t        dj                               \  } }t        |       t        |      z   dz
  }t	        |t
        g      }|t        |       t        |      z   k(  sJ y rm   )ro   r   rp   r   r   r   r   rq   s       rL   test_cosm1_two_cos_termsrx      rs   rN   c                      t        d      } t        |       t        |       z   dz
  }t        |t        t
        g      }|t        |       t        |       z   k(  sJ y )Nr6   r:   )r   r	   r   r   r    r   r   r   )r6   r@   rA   s      rL   test_expm1_cosm1_mixedrz      sM    sAFSVOaEEIy12D58eAh&&&&rN   c                 L   | j                  |      j                         }t        j                  t        j                        j
                  }t        ||z
        ||z  k  sJ t        t        |j                               |fi |xs i }t        t        t        |j                                     }	t         ||	 |z
        }
|
t        ||z        k  sJ t        t        |j                               | fi |xs i }t         ||	 |z
        }|t        ||z  |z        kD  sJ y)zU poorness=1e10 signifies that `expr` loses precision of at least ten decimal digits. N)rU   rV   r3   finfofloat64epsr]   r.   listkeystuplero   floatvalues)exproptval_subs
approx_reflambdify_kwpoornessnum_refr~   f1
args_floatnum_err1f2num_err2s                rL   _check_num_lambdifyr      s    ii!'')G
++emm
$
(
(Cw#$z#~555	$x}}'	D1B	DBs5(//"345J2z?Z/0Hc'#+&&&&	$x}}'	E+2C	EB2z?Z/0Hc'#+h.////rN   c            	         t        d      } dt        |       z  dz
  }t        |t        g      }|t	        |        t        |       z  k(  sJ t
        r t        ||| t        d      dz  idddi       d	t        |       z  d	z
  }t        |t              }|d
t	        |       z  t        |       z  k(  sJ t
        r t        ||| t        d      dz  idddi       t        t        d| z        z  t        z
  }t        |t        g      }|t         t	        d| z        z  t        d| z        z  k(  sJ t
        r4t        ||| t        d      dz  dz  it        dt        z        ddi       y y )Nr6   r<   
   ig&i3modulesr4   )r   r:   rZ   g&y3r8   )r   r   r   r   r   r4   r   r   r)   r   r   )r6   r@   rA   rB   rC   rD   rE   s          rL   test_cosm1_apartr      sR   sAc!fHqLEEI;'DE!H9SV####E4!QrUCZ%iY`Mabc!fHqLEE<(D2eAh;s1v%%%%E4!QrUCZ%iY`Mabs1Q3xK"EEI;'DB3uQqSz>#ac(****E4!QrUCZ\):E%(OZcelYmn rN   c                  B   t        t        d      x} \  }}||z  dz
  }t        |t        g      }|t	        ||      k(  sJ | D ]'  }|j                  |      |j                  |      k(  r'J  t        rt        t        t        t        j                  j                  j                  d      d d             dk\  rg|t        dj                          |t        i}d}t        ||||dd	id
       |t        |t        dj                          i}d}	t        ||||	dd	id       y y y )Nxyr<   .r8   )r<   r   r   g    ?g<V=r   r4   l    h] )r   r   g|=ghRw=i ʚ;)ro   r   r   r"   r   diffr4   r   intversionrp   r   as_integer_ratior   r   )
argsr6   rY   r@   rA   argsubs1_a
ref1_f64_asubs1_b
ref1_f64_bs
             rL   
test_powm1r      s   fd##D41aqD1HEEI;'D5A;zz#$))C.000 s3 5 5 ; ;C @! DEF*Th < < >?BG*
E4*9V]J^iopb!X'?'?'ABC+
E4*9V]J^ino UurN   c                     t        d      } t        | dz         }t        |t        g      }t	        |       |z
  dk(  sJ |j                  t              |k(  sJ t        d| z  dz         }t        |t        g      }t	        |       t        d      z   |k(  sJ |j                  t              |z
  j                         dk(  sJ t        d| z  dz         }t        |t        g      }t	        d| z        |z
  dk(  sJ |j                  t              |k(  sJ t        | dz         }t        |t        g      }t        |      dk(  sJ y )Nr6   r<   r   r8   r:   z
log(x + 3))r   r
   r   r!   r   r>   simplifyr?   )	r6   r@   rA   rB   rC   rD   rE   rF   rG   s	            rL   test_log1p_optr      s0   sAAJEEI;'D8d?a<<%%%!aLEEI;'D8c!f$$$LL%//1Q666!aLEEI;'D1:!!!<<%%%!HEEI;'Dt9$$$rN   c                     t        d      } d| z  t        |       t        d      z  z   t        | dz         z   t        |       z   dz
  }t        |t              j                         }|t        |       t        |       z   t        |       z   t        |       z   k(  sJ |j                  t              j                  t              j                  t              |k(  sJ t        |       t        d      z  t        | dz         z   }t        |t              }|t        |       t        |       z   k(  sJ |j                  t              |k(  sJ t        |       t        d      z  t        d| z  dz         z   }t        |t              }|t        |       t        d      z   t        |       z   z
  }|dk(  sJ |j                  t              |z
  j                         dk(  sJ d| z  dt        d| z  dz         z  d	t        d      z  z  z   d
t        |       z  z   d
z
  t        d| z  dz         z   }t        |t              j                         }	|	t        |       dt        d| z  dz         z  d	z  z   d
t        |       z  z   t        d      z   t        |       z   z
  }
|
dk(  sJ |	j                  t              j                  t              j                  t              |z
  j                         dk(  sJ dt        d| z        z  dz
  }t        |t              }|dt        d| z        z  z
  }|dk(  sJ |j                  t              |k(  sJ t        d| z        dz
  }t        |t              }|t        d| z        dz
  |fv sJ t        d| z  dz         }t        |t              }|t        d      t        |       z   z
  }|dk(  sJ |j                  t              |z
  j                         dk(  sJ t        d| z  dz         }t        |t              }||k(  sJ y )Nr6   r:   r<   r=   r   r8   r9   r7   r;      )r   r
   r	   r   r#   r   r   r   r   r   r>   r   )r6   r@   rA   rB   rC   rD   rE   delta3rF   rG   delta4rH   rI   delta5rJ   rK   ra   rb   delta7rc   rd   s                        rL   test_optims_c99r     s   sAqD3q6#a&= 3q1u:-A6:EE:&//1D47T!W$uQx/%(::::<<$$S)11#6%???F3q6MCAJ&EE:&D47U1X%%%%<<%%%F3q6MC1r	N*EE:&DT!Ws2w&q12FQ;;LL%//1Q666qD1S1q\>2c!f9--3q6	9B>RTBYOEE:&//1DT!WqacAgr11BuQxK?#b'IERSHTUFQ;;LL%%c*2237%?IIKqPPPc!A#hJNEE:&DAeAaCjL FQ;;<<%%%!HqLEE:&DE!A#JNE****!aLEE:&DSVeAh&'FQ;;LL%//1Q666!aLEE:&D5==rN   c                  @   d } t        d      } | |dz        dk(  sJ  | |dz  |dz  z         dk(  sJ  | |dz  |dz  z         dk(  sJ  | t        |      dz        d	k(  sJ  | |d
z        dk(  sJ  | |dz        dk(  sJ  | |dz         dk(  sJ  | |dz  |dz  z
        dk(  sJ t        dd      } | ||z  |dz  z
        dk(  sJ t        dd      } | t        t        |dz                    dk(  sJ d } ||dz  t        |      dz  z         dk(  sJ y )Nc                 @    t        t        | t        d      g            S )Nr[   r   r   r$   r6   s    rL   <lambda>z5test_create_expand_pow_optimization.<locals>.<lambda>C  s    53A678:rN   r6   r[   zx*x*x*xr:   zx*x + x*x*x*xr9   zpow(x, 5) + x*x*x*xzpow(sin(x), 4)z1.0/(x*x*x*x)z
pow(x, -5)z
-(x*x*x*x)z-(x*x) + x*x*x*xiTintegerzpow(x, i) - (x*x)rY   )realzexp(y*y*y*y)c           	      F    t        t        | t        dd       g            S )Nr[   c                     | j                   S N)is_Function)bs    rL   r   zGtest_create_expand_pow_optimization.<locals>.<lambda>.<locals>.<lambda>V  s    ammrN   )base_reqr   r   s    rL   r   z5test_create_expand_pow_optimization.<locals>.<lambda>U  s%    E(1'E	+(- '. / 0rN   r8   z pow(x, 3) + sin(x)*sin(x)*sin(x))r   r   r   r	   )ccr6   r   rY   cc2s        rL   #test_create_expand_pow_optimizationr   B  se   
:BsAad8y   adQTk?o---adQTk?3333c!fai=,,,,a"g;/)))a"g;,&&&q!te9$$$adQTk?0000sD!AadQTk?1111sAc#ad)n///0Cq!tc!fai $FFFFrN   c                  ^   t        dd      } t        d| |       }t        d| d      }t        t        j                  |            5  t        |dz  |z  t        g      t        ||      k(  sJ t        |dz  |z  |z   t        g      t        ||      |z   k(  sJ 	 d d d        y # 1 sw Y   y xY w)NnTr   Ar6   r<   )r   r   r   r   fullrankr   r%   r   )r   r   r6   s      rL   test_matsolver   Z  s    sD!AS!QAS!QA	!**Q-	 B!j\2k!Q6GGGGB!a*6+a:Ka:OOOO 
!	 	 s   AB##B,c                  ,   t        t        dj                               \  } }t        t	        |       t	        |      z         }t        |t        g      }t        | |      |z
  dk(  sJ t        ||       |z
  dk(  sJ |j                  t              |k(  sJ y )Nrn   r   )	ro   r   rp   r
   r	   r   r&   r   r>   rq   s       rL   test_logaddexp_optr   d  s    vu{{}%DAqAQ EEM?+DQ?T!Q&&&Q?T!Q&&&<<%%%rN   c                  ,   t        t        dj                               \  } }t        d| z  d|z  z         t        d      z  }t	        |t
        g      }t        | |      |z
  dk(  sJ t        ||       |z
  dk(  sJ |j                  t              |k(  sJ y )Nrn   r:   r   )ro   r   rp   r
   r   r'   r   r>   rq   s       rL   test_logaddexp2_optr   m  s    vu{{}%DAq1q!tSV#EEN+,Dad"a'''ad"a'''<<%%%rN   c                     d } t        d      } | t        |      |z  t        |      t        d|z        d|z  z  t        d|z        t        d|z        |z  dt        d|z        z  |t        |      z  |t        |      z  i       t        d      } | t        ||z        ||z  z  t        ||z        |t        ||z        z  |z  t        ||z        t        t        |            t        |      z  t        t        |            t        dt        |      z        t        |      z  dt        dt        |      z        z  t        |      |z  t        |      |z  i       y )Nc                 ^    | j                         D ]  \  }}t        |t              |k(  rJ  y r   )itemsr   r*   dkvs      rL   checkztest_sinc_opts.<locals>.checkw  s+    GGIDAqAy)Q... rN   r6   r:   r8   rY   )r   r   r   r   r6   rY   s      rL   test_sinc_optsr   v  s/   / 	sA	AqaAaC!A#acAaC
4!9	#a&3q6	  	sA	AaC!A#tAaCy	#ac(
1tAaCyCFCFtCF|Ac!fHc!fqaAh/Aqs1vax rN   c            
      @   d } t        d      } | t        d|z        d|z  z  t        d|z        z   dz
  t        d|z        t	        d|z        z   t        |dz         t        d      z  t        |dz  dz         z   t        |dz        t        |dz         z   i       y )Nc                 ^    | j                         D ]  \  }}t        |t              |k(  rJ  y r   r   r   r(   r   s      rL   r   z test_optims_numpy.<locals>.check  +    GGIDAqA|,111 rN   r6   r:   r<   r8   )r   r   r	   r   r   r
   r   r   )r   r6   s     rL   test_optims_numpyr     s    2 	sA	AaC!A#QqS!A%tAaCy51:'=AaCQ#adQh-'q!ttAaCy)@ rN   c                     d } t        t        dj                               \  }} | t        ||z        t	        ||z        z  t        ||z  dz         z  t        d      |z  |z  z  t        ||z        t        ||z        z  t        ||z        z  t        |t	        |      z  |z        dz
  t        |t        |      z        i       y )Nc                 ^    | j                         D ]  \  }}t        |t              |k(  rJ  y r   r   r   s      rL   r   z%test_optims_numpy_TODO.<locals>.check  r   rN   rn   r<   r:   )
ro   r   rp   r
   r   r   r   r   r	   r   r   s      rL   test_optims_numpy_TODOr     s    2 vu{{}%DAq	AaCQqS#ac!e*$c!fQhqj14!9T!A#Y3FuQqSz3QAc!fHQJ!U1T!W9- rN   c                     t         st        d       t               st        d       t        d      } ddt	        d      z  z  ddt	        d      z  z  z  d	d
t	        d      z  z  z  ddt	        d      z  z  z  t	        d      z  t
        z  }dt        |       z  |z
  }t	        d      dz  }|j                  | |      j                  d      }t        dt        |       z  |z
  t        g      }d}dt        |j                  |            t        |j                  |            dz  }d}t        j                         5 }	t        d|fd|fg|	ddi      \  }
}t        |
j!                  d      |z
        }t        |
j#                  d      |z
        }d|cxk  rdk  sJ  J d|cxk  rdk  sJ  J 	 d d d        y # 1 sw Y   y xY w) Nzcython not installed.zNo C compiler found.r6   r:   :   u   r8   a   r9   r[   '   r7   \      r   i      z
#include <math.h>

double func_unchanged(double x) {
    return %(unchanged)s;
}
double func_rewritten(double x) {
    return %(rewritten)s;
}
)	unchanged	rewrittenz
#cython: language_level=3
cdef extern double func_unchanged(double)
cdef extern double func_rewritten(double)
def py_unchanged(x):
    return func_unchanged(x)
def py_rewritten(x):
    return func_rewritten(x)
zfunc.cz	_func.pyxstdc99)	build_dircompile_kwargsgdy=g<6S:g}:gҶOɃ;gؗҜ<)r2   r-   r0   r   r   r   r	   rU   r   r   r    r   tempfileTemporaryDirectoryr/   r]   py_rewrittenpy_unchanged)r6   	about_twor   xvalrefr   NUMBER_OF_DIGITSfunc_cfunc_pyxfoldermodinfoerr_rewrittenerr_unchangeds                 rL   "test_compiled_ccode_with_rewritingr     s   $%7#$sABqvIq2af9~-a!AbE'l:1r!C&y>I!B%OPRRI#a&9$IR5#:D
..D
!
#
#B
'C3q6I-	{;I 	 )++&678ikk*:;<>
>FH 
	$	$	&&/+x!89eU^
	T C,,U3c9:C,,U3c9:},u,,,,,},u,,,,, 
'	&	&s   <A4F::G)Ng    _B)[r   sympy.core.numbersr   r   sympy.core.powerr   sympy.core.singletonr   sympy.core.symbolr   $sympy.functions.elementary.complexesr   &sympy.functions.elementary.exponentialr	   r
   (sympy.functions.elementary.trigonometricr   r   r   "sympy.matrices.expressions.matexprr   sympy.assumptionsr   r   sympy.externalr   sympy.printing.codeprinterr   sympy.codegen.matrix_nodesr   sympy.codegen.cfunctionsr   r   r   r   sympy.codegen.numpy_nodesr   r   sympy.codegen.scipy_nodesr   r   sympy.codegen.rewritingr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   sympy.testing.pytestr,   r-   sympy.utilitiesr.   sympy.utilities._compilationr/   r0   !sympy.utilities._compilation.utilr1   r2   r3   r4   rM   rP   rk   rr   rv   rx   rz   r   r   r   r   r   r   r   r   r   r   r   r   r    rN   rL   <module>r     s    +   " $ 4 = E E ; ) ( , 2 = = ; 2    
 - $ K 7	x	 gg&@0?ED'#&L''0o,p$%,+\G0P&&.	 	 	 2- 2-rN   