o
    8Va'q                     @   s  d dl mZmZmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z<m=Z= d dl>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZV d d	lWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z` d d
lambZb d dlcmdZd d dlemfZfmgZg d dlhmiZimjZjmkZk d dllmmZm ed\ZnZoZpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxd d! Zyd"d# Zzd$d% Z{d&d' Z|d(d) Z}d*d+ Z~d,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZdFdG ZdHdI ZdJdK ZdLdM ZdNdO ZdPdQ ZdRdS ZdTdU ZdVdW ZdXdY ZdZd[ Zd\d] Zd^d_ Ze8d`da Zdbdc Zddde Zdfdg Zdhdi Zdjdk Zdldm Zdndo Zdpdq Zdrds ZdtS )u    )SpioosymbolsRationalIntegerFloatModGoldenRatio
EulerGammaCatalanLambdaDummyEqnanMulPow)Absacosacoshasinasinhatanatanhatan2ceilingcoscosherferfcexpfloorgammalogloggammaMaxMin	Piecewisesignsinsinhsqrttantanh)Range)ITE)For
aug_assign
Assignment)raisesXFAILwarns_deprecated_sympy)C89CodePrinterC99CodePrinterget_math_macros)AddAugmentedAssignmentElementType	FloatTypeDeclarationPointerVariablevalue_constpointer_constWhileScopePrintFunctionPrototypeFunctionDefinitionFunctionCallReturnrealfloat32float64float80float128intcComment	CodeBlock)	expm1log1pexp2log2fmalog10CbrthypotSqrt)restrict)implemented_functionIndexedBaseIdx)MatrixMatrixSymbolSparseMatrixccodezx,y,zc                  C   s(   G dd dt } t| tdksJ d S )Nc                   @   s   e Zd Zdd ZdS )ztest_printmethod.<locals>.fabsc                 S   s   d| | jd  S )Nzfabs(%s)r   )Z_printargs)selfprinter rg   =/usr/lib/python3/dist-packages/sympy/printing/tests/test_c.py_ccode!   s   z%test_printmethod.<locals>.fabs._ccodeN)__name__
__module____qualname__ri   rg   rg   rg   rh   fabs    s    rm   fabs(x))r   rc   x)rm   rg   rg   rh   test_printmethod   s   rp   c                   C   s@   t ttdks
J t td dksJ t ttdksJ d S )Nzsqrt(x)      ?)rc   r+   ro   rg   rg   rg   rh   test_ccode_sqrt'   s   rr   c               
   C   s  t td dks
J t ttd  dksJ tdttdt } t d| td ttt    td t  dks:J t td	 d
ksDJ t ttdd dksQJ t ttdd ttiddksbJ dd dfdd dfg}t td d|iddks|J t td d|iddksJ t ttdd d|iddksJ dd dd fdd dfg}t dt d|iddksJ t td d|iddksJ t td tt	tttd!d"d#d!d"d!d"d$ksJ d S )%N   z	pow(x, 3)zpow(x, pow(y, 3))g      g      @z,pow(3.5*2*x, -x + pow(y, x))/(pow(x, 2) + y)      z1.0/xzpow(x, 2.0/3.0)type_aliaseszpowl(x, 2.0L/3.0L)c                 S   s   |j S N
is_integerbaser    rg   rg   rh   <lambda>6       z test_ccode_Pow.<locals>.<lambda>Zdpowic                 S   s   |j  S rz   r{   r}   rg   rg   rh   r   7       powr   Zuser_functionszdpowi(x, 3)rq   zpow(x, 0.5)      zpow(x, 16.0/5.0)c                 S   s   | dkS Nru   rg   r}   rg   rg   rh   r   ;   r   c                 S   s   d| S )Nzexp2(%s)rg   r}   rg   rg   rh   r   ;   r   c                 S   s   | dkS r   rg   r}   rg   rg   rh   r   <   r   exp2(x)z	pow(x, 2)FZevaluatez
-2*x/(y*y))
rc   ro   yr[   r   r   rI   rL   r   r   )rt   Z_cond_cfuncZ_cond_cfunc2rg   rg   rh   test_ccode_Pow-   s2   *"

"
r   c                   C   s(   t tttt dddddksJ d S )NZmy_maxZmy_pow)r%   r   r   zmy_max(x, my_pow(x, 2)))rc   r%   ro   rg   rg   rg   rh   test_ccode_MaxE   s   (r   c                  C   s>   t td } dD ]}t| |d}|d|dksJ qd S )Nza[0:50])c89c99Zc11standard())r&   r   rc   count)Zbig_minZcurr_standardoutputrg   rg   rh   test_ccode_Min_performanceJ   s
   r   c                   C   s   t tddks
J t tdksJ t tdddksJ t t dddks'J t tdks/J t t d	dd
ks:J t tttiddksFJ d S )Nrv   M_EZM_PIr   r   ZHUGE_VALz	-HUGE_VALZINFINITYr   z	-INFINITYrx   ZM_PIl)rc   r    r   r   rI   rL   rg   rg   rg   rh   test_ccode_constants_mathhR   s   r   c                   C   s^   t dt dtd ksJ t dt dtd ksJ t dt dtd ks-J d S )Nru   z,const double GoldenRatio = %s;
2*GoldenRatio   z$const double Catalan = %s;
2*Catalanz*const double EulerGamma = %s;
2*EulerGamma)rc   r
   evalfr   r   rg   rg   rg   rh   test_ccode_constants_other]   s   "r   c                   C   s.  t tdddksJ t tddttiddksJ t tdddks%J t tdd	d
ks0J t tdd	ttiddks?J t tdd	dksJJ t tdd	ttiddksYJ t ttdd dksfJ t ttdd ttiddkswJ t tddt dksJ t tddt ttiddksJ d S )Nrs      z3.0/7.0rx   z	3.0L/7.0L   	   2iz-3.0/7.0z
-3.0L/7.0Lzx + 3.0/7.0zx + 3.0L/7.0Lz(3.0/7.0)*xz(3.0L/7.0L)*x)rc   r   rI   rL   ro   rg   rg   rg   rh   test_ccode_Rationald   s   "&r   c                   C   s,   t tddks
J t tddksJ d S )NC   Z67r   z-1)rc   r   rg   rg   rg   rh   test_ccode_Integerr   s   r   c                   C   s    t tttt dksJ d S )Nzpow(sin(x), cos(x)))rc   r)   ro   r   rg   rg   rg   rh   test_ccode_functionsw   s    r   c                  C   s   t d} tdt| d|  }t|| dksJ tdt| d|  t }t|| dtd ks3J td}tdt d	d
d}tdt| | d|   d|   }t||| || ddks`J d S )Nro   rt   ru   z2*xz&const double Catalan = %s;
2*x/Catalanr   AinTintegerrv   	assign_toz@for (int i=0; i<n; i++){
   A[i] = (A[i] + 1)*(A[i] + 2)*A[i];
})r   r[   r   rc   r   r   r]   r^   )ro   rt   r   r   rg   rg   rh   test_ccode_inline_function{   s    r   c                  C   s   t ttdddksJ t ttdd} d|  v sJ t ttddd} d|  v s-J t ttddd} d|  vs>J t ttd	ksHJ t ttd
ksRJ t ttdks\J tddd\}}t tt|t|dkssJ t t||dks~J d S )NC99r   z	tgamma(x)C89znot supported in cF)r   Zallow_unknown_functionsTceil(x)rn   zr,srI   z((ceil(r)) % (ceil(s)))z
fmod(r, s))rc   r"   ro   lowerr   r   r   r	   )Z	gamma_c89rsrg   rg   rh   test_ccode_exceptions   s   r   c                  C   s   t ddd} t ddd}ddd d	fd
d dfgd}tt| |ddks'J tt| |ddks3J tt||ddks?J d S )Nro   Fr   r   TZceilc                 S   s   | j  S rz   r{   ro   rg   rg   rh   r      r   z+test_ccode_user_functions.<locals>.<lambda>rm   c                 S   s   | j S rz   r{   r   rg   rg   rh   r      r   abs)r   r   r   r   rn   abs(n))r   rc   r   r   )ro   r   Zcustom_functionsrg   rg   rh   test_ccode_user_functions   s   r   c                   C   s   t ddksJ t tjdksJ t ddksJ t tjdks"J t tt@ dks,J t ttB dks6J t t dks?J t tt@ t@ dksKJ t ttB tB d	ksWJ t tt@ tB d
kscJ t ttB t@ dksoJ d S )NTtrueFfalsezx && yzx || yz!xzx && y && zzx || y || zzz || x && yzz && (x || y))rc   r   r   r   ro   r   zrg   rg   rg   rh   test_ccode_boolean   s   r   c                  C   s   ddl m} m}m}m}m}m} t| tt	dksJ t|tt	dks&J t|tt	dks1J t|tt	dks<J t|tt	dksGJ t|tt	dksRJ d S )	Nr   r   NeLeLtGtGezx == yzx != yzx <= yzx < yzx > yzx >= y)
sympyr   r   r   r   r   r   rc   ro   r   r   rg   rg   rh   test_ccode_Relational   s    r   c                      s   t ttdk ftd df t dksJ t dddksJ t ttdk ftd tdk ftd df t dks;J t ddd	ksEJ t ttdk ftd tdkftttd
kf tt fdd d S )Nrv   ru   Tz'((x < 1) ? (
   x
)
: (
   pow(x, 2)
))cr   z3if (x < 1) {
   c = x;
}
else {
   c = pow(x, 2);
}zB((x < 1) ? (
   x
)
: ((x < 2) ? (
   x + 1
)
: (
   pow(x, 2)
)))zUif (x < 1) {
   c = x;
}
else if (x < 2) {
   c = x + 1;
}
else {
   c = pow(x, 2);
}r   c                      s   t  S rz   rb   rg   exprrg   rh   r      r   z&test_ccode_Piecewise.<locals>.<lambda>)r'   ro   rc   r)   r3   
ValueErrorrg   rg   r   rh   test_ccode_Piecewise   s    
(

,r   c                  C   s(   ddl m}  | t}t|dksJ d S )Nr   )sincz'((x != 0) ? (
   sin(x)/x
)
: (
   1
)))r   r   ro   rc   )r   r   rg   rg   rh   test_ccode_sinc   s
   r   c                  C   s   t dtttdk ftd tdk ftd df } | dksJ tt t td  td  tdtdk fd tt d }t |dksCJ t |d	d
dksMJ d S )Nru   rv   TzD2*((x < 1) ? (
   x
)
: ((x < 2) ? (
   x + 1
)
: (
   pow(x, 2)
)))r   rq   )rv   TzNpow(x, 2) + x*y*z + pow(y, 2) + ((x < 0.5) ? (
   0
)
: (
   1
)) + cos(z) - 1r   r   zSc = pow(x, 2) + x*y*z + pow(y, 2) + ((x < 0.5) ? (
   0
)
: (
   1
)) + cos(z) - 1;)rc   r'   ro   r   r   r   )pr   rg   rg   rh   test_ccode_Piecewise_deep   s   0:

r   c                  C   s$   t tdk tt} t| dksJ d S )Nrv   z((x < 1) ? (
   y
)
: (
   z
)))r/   ro   r   r   rc   r   rg   rg   rh   test_ccode_ITE  s   r   c                   C   s   t tdd  d S )Nc                   S   s   t ttddS )NZgarbage)method)rc   r)   ro   rg   rg   rg   rh   r     s    z%test_ccode_settings.<locals>.<lambda>)r3   	TypeErrorrg   rg   rg   rh   test_ccode_settings  s   r   c                  C   s  ddl m} m} ddlm} |ddd\}}}}|d||d||d	|}}}	| d
| }
| d||f }| d|||	f }t }||
dksLJ ||d|| |  ks[J ||d|| | ||  |	  kspJ | ddd||f }||dd| |  ksJ | dddd||f }t|d|d|   ksJ | ddd|f|d||f }t|dksJ | d|||f|d}t||||	f dksJ t|dd|	f dksJ d S )Nr   r\   r   zs n m oTr   r   jkro   r   Bzx[j]zA[%s]zB[%s])r   rs   shapers   F)r   stridesr   )   r   rv   )r   r   offsetzA[o + s*j + i]r   r   zA[m*j + n*k + o + s*i]ru   zA[3*m + n*k + o + 2*s])sympy.tensorr]   r^   r   r   r7   Z_print_Indexedrc   )r]   r^   r   r   r   mor   r   r   ro   r   r   r   ZAbaserg   rg   rh   test_ccode_Indexed"  s(   "*r   c                   C   sb   t tdddksJ t tddddddksJ t tddd	ks$J t tdd
dks/J d S )Nro   Zijzx[i][j]klr   r   zx[i*k + j*l + o])rs   zx[3])rs      r   z
x[3][4][5])rc   r:   rg   rg   rg   rh   test_Element@  s   r   c                  C   s   d} t d| fd}t d| fd}t d| d fd}td| d }t|| ||d  ||  ||d  ||   }t|j|jdd	}|d
|d |d f ksPJ d S )Nr   r   r   ro   Dyrv   r   F)r   Zcontractz&Dy[i] = (y[%s] - y[i])/(x[%s] - x[i]);)r]   r^   r   rc   ZrhsZlhs)Zlen_yr   ro   r   r   eZcode0rg   rg   rh   2test_ccode_Indexed_without_looking_for_contractionG  s   2 r   c                  C   s|   t ddd\} }td}td}td}td|}td| }d	||  |  d
 }t|||f ||  || d|ks<J d S )Nn mTr   r   ro   r   r   r   z}for (int i=0; i<m; i++){
   y[i] = 0;
}
for (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      y[i] = A[%s]*x[j] + y[i];
   }
}r   )r   r]   r^   rc   )r   r   r   ro   r   r   r   r   rg   rg   rh   test_ccode_loops_matrix_vectorR  s   


,
r   c                  C   s`   t ddtd\} }td}td}t| |} d| jj|jd }t||  ||  d|ks.J d S )	Nzi mT)r   clsro   r   zlfor (int i_%(icount)i=0; i_%(icount)i<m_%(mcount)i; i_%(icount)i++){
   y[i_%(icount)i] = x[i_%(icount)i];
})ZicountZmcountr   )r   r   r]   r^   ZlabelZdummy_indexrc   )r   r   ro   r   Zexpectedrg   rg   rh   test_dummy_loopsg  s   
 r   c                  C   s   ddl m} m} ddlm} |ddd\}}| d}| d}| d	}| d
}|d|}	|d|}
d|	| |
  d }t||	|
f ||
  ||	  ||	  ||	 d|ksVJ d S )Nr   r\   r   r   Tr   r   ro   r   r   r   r   zfor (int i=0; i<m; i++){
   y[i] = x[i] + z[i];
}
for (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      y[i] = A[%s]*x[j] + y[i];
r   r   r   r]   r^   r   r   rc   )r]   r^   r   r   r   r   ro   r   r   r   r   r   rg   rg   rh   test_ccode_loops_addv  s    


<
r   c                  C   s   ddl m} m} ddlm} |ddd\}}}}| d}| d}| d	}	|d
|}
|d|}|d|}|d|}d|
| | | || |  ||  | || | ||  | f d }t||||f ||
|||f  |	|
 d|ksuJ d S )Nr   r\   r   n m o pTr   abr   r   r   r   lzfor (int i=0; i<m; i++){
   y[i] = 0;
}
for (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      for (int k=0; k<o; k++){
         for (int l=0; l<p; l++){
            y[i] = a[%s]*b[%s] + y[i];
         }
      }
   }
}r   r   )r]   r^   r   r   r   r   r   r   r   r   r   r   r   r   r   rg   rg   rh   &test_ccode_loops_multiple_contractions  s"   



>6r   c                  C   s,  ddl m} m} ddlm} |ddd\}}}}| d}| d}| d	}	| d
}
|d|}|d|}|d|}|d|}d|| | | || |  ||  | || | | || |  ||  | || | ||  | f d }t|||||f |||||f  |	|||f  |
| d|ksJ d S )Nr   r\   r   r   Tr   r   r   r   r   r   r   r   r   zfor (int i=0; i<m; i++){
   y[i] = 0;
}
for (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      for (int k=0; k<o; k++){
         for (int l=0; l<p; l++){
            y[i] = (a[%s] + b[%s])*c[%s] + y[i];
r   r   r   )r]   r^   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rg   rg   rh   test_ccode_loops_addfactor  s$   



dFr   c                  C   s  ddl m} m} ddlm} |ddd\}}}}| d}| d}| d	}	| d
}
|d|}|d|}|d|}d}d|| | ||  |  d }d|| |  d }d|| |  d }t|| |||f  || |||f   || ||  |	|||f   |
| d}	|	|| | |d d  ks|	|| | |d d  ks|	|| | |d d  ks|	|| | |d d  ks|	|| | |d d  ks|	|| | |d d  ksJ d S d S d S d S d S d S )Nr   r\   r   r   Tr   r   r   r   r   r   r   r   z(for (int i=0; i<m; i++){
   y[i] = 0;
}
z|for (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      for (int k=0; k<o; k++){
         y[i] = b[j]*b[k]*c[%s] + y[i];
z      }
   }
}
zUfor (int i=0; i<m; i++){
   for (int k=0; k<o; k++){
      y[i] = a[%s]*b[k] + y[i];
z   }
}
zUfor (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      y[i] = a[%s]*b[j] + y[i];
r   r   r   )r]   r^   r   r   r   r   r   r   r   r   r   r   r   r   Zs0s1s2Zs3rg   rg   rh   test_ccode_loops_multiple_terms  sT   





Rr   c                  C   s.   t t tt t } t| tgddksJ d S )NZdereferencezx + y + (*z) + sin((*z)))ro   r   r)   r   rc   r   rg   rg   rh   test_dereference_printing  s   r   c                  C   s  t tt tdt tdkftdfttg} tddd}t| |dks%J td|d  tdkf|d dft|d	  |d
  }t|dksHJ tddd}tddd}t t|d	 dt|d g|d	 |d  |d dgd|d  |d	  t	|d
 d dgg}t||dksJ d S )Nru   r   Tr   rs   rv   zPA[0] = x*y;
if (y > 0) {
   A[1] = x + 2;
}
else {
   A[1] = y;
}
A[2] = sin(z);)ru   r   )rv   r   r   r   z:((x > 0) ? (
   2*A[2]
)
: (
   A[2]
)) + sin(A[1]) + A[0]qr   M)rs   r   )r   r   r   zM[0] = sin(q[1]);
M[1] = 0;
M[2] = cos(q[2]);
M[3] = q[1] + q[2];
M[4] = q[3];
M[5] = 5;
M[6] = 2*q[4]/q[1];
M[7] = sqrt(q[0]) + 4;
M[8] = 0;)
r_   ro   r   r'   r)   r   r`   rc   r   r+   )Zmatr   r   r   r   r   rg   rg   rh   test_Matrix_printing  s$   ,6
$r   c                   C   s   dt tg dgv sJ d S )NzNot supported in C)rv   ru   rs   )rc   ra   rg   rg   rg   rh   test_sparse_matrix'  s   r   c                  C   s   t d\} }tt t|d ddd W d    n1 sw   Y  t|d dks-J t| |d  |gddks<J t|d d	d
dksHJ d S )Nzx, ifru   Tr   )Zerror_on_reservedr   zpow(if_, 2)r   zpow((*if_), 2)*xZ_unreserved)Zreserved_word_suffixzpow(if_unreserved, 2))r   r3   r   rc   )ro   r   rg   rg   rh   test_ccode_reserved_words,  s   
r   c                  C   s   t tt d} }t ttd}}t dt td  t td  d}}t| |ks-J t| dd| ks8J t||ks@J t||ksHJ d S )Nzy*(((x) > 0) - ((x) < 0))z!(((cos(x)) > 0) - ((cos(x)) < 0))ru   zApow(x, 2) + x*(((pow(x, 2) + 2*x) > 0) - ((pow(x, 2) + 2*x) < 0))r   zz = %s;)r(   ro   r   r   rc   )Zexpr1Zref1Zexpr2Zref2Zexpr3Zref3rg   rg   rh   test_ccode_sign5  s   &r   c                   C   s:   t tttt dksJ t ttdtt dksJ d S )Nz
x = y + z;+zx += y + z;)rc   r2   ro   r   r   r1   rg   rg   rg   rh   test_ccode_Assignment>  s    r  c                  C   s2   t ttdddttdtg} t| dksJ d S )Nr   
   ru   *z*for (x = 0; x < 10; x += 2) {
   y *= x;
})r0   ro   r.   r1   r   rc   )frg   rg   rh   test_ccode_ForC  s   r  c                   C   sX   t ttddddksJ t ttddddksJ t ttdttdddks*J d S )	Nr   r   r   z((0 > x) ? 0 : x)r   z
fmax(0, x)r   zI((0 < ((x < sqrt(x)) ? x : sqrt(x))) ? 0 : ((x < sqrt(x)) ? x : sqrt(x))))rc   r%   ro   r&   r+   rg   rg   rg   rh   test_ccode_Max_MinI  s
   r  c                   C   sH   t ttdddksJ t tdddksJ t tddddks"J d S )Nr   r   expm1(x)ZNANr   )rc   rQ   ro   r   floatrg   rg   rg   rh   test_ccode_standardP  s   r
  c                  C   sB   t  } | jdks
J | jdksJ d| jv sJ d| jvsJ d S )NCr   Zvoidtemplate)r6   languager   reserved_words)Z
c89printerrg   rg   rh   test_C89CodePrinterV  s
   r  c                  C   s\  t  ttdksJ t  ttdksJ t  ttdks$J t  ttdks0J t  tttt	 dks?J t  t
tdksKJ t  ttdksWJ t  tttdksdJ t  ttd	kspJ t  ttd
td dksJ t  ttd
dksJ t  } | jdksJ | jdksJ d| jv sJ d| jvsJ d S )Nr  zlog1p(x)r   zlog2(x)zfma(x, y, -z)zlog10(x)zcbrt(x)zhypot(x, y)z	lgamma(x)rs   ru   zfmax(3, fmax(x, pow(x, 2)))z
fmin(3, x)r  r   rZ   Zusing)r7   doprintrQ   ro   rR   rS   rT   rU   r   r   rV   rW   rX   r$   r%   r&   r  r   r  )Z
c99printerrg   rg   rh   test_C99CodePrinter^  s     r  c                  C   s4   t tttid} | tttd dksJ d S )Nrx   z2.1zsinl(x + 2.1L))r7   dictrI   rL   r  r)   ro   r   )f80_printerrg   rg   rh   "test_C99CodePrinter__precision_f80q  s   "r  c                     s  t ddd} ttttid}ttttid}ttttid}|tt	d dks.J |tt	d dks;J |tt	t
d d	ksJJ t|||gg d
D ]\  fdd}|t| d |tt	d d |tt	d tt	d  d |tt	d d |tt	d |tt	d d |t| dd |td|  d d|  d d |tt	d dd |tt	dt	 d d |tt	d d |tdt	 d d |tt	d d  |tt	d! |dt	 d" |dt	 d# |t	d d$ |t	d d% |tdt	 d& |tt	d d' |tt	td( |tdt	 d d) |tdt	 d* d+ |tdt d d, |tdt	 d d- |tdt	 d d. |tdt	 d d/ |tdt	 dt d0 |tdt	 d d1 |t dt	 d* d2 |t!dt d d3 |t"dt	 d d4 |t#dt	 d d5 |t$dt	 d d6 |t%d7t	 d8 |t&d7t	 d9 |t't	d: |t(t	d; |t)t	d d< |t*t	d d= |t+t	tt, d> |t-t	dt	d d? |t.t	dd@ qTd S )ANr   Tr   rx   g @zsinf(x + 2.1F)zsin(x + 2.1000000000000001)z2.0zsinl(x + 2.0L))r   r   c                    s$     | |j dksJ d S )N)r   r   )r  formatupper)r   refrf   suffixrg   rh   check  s   $z-test_C99CodePrinter__precision.<locals>.checkr          @zfabs{s}(x + 2.0{S})g      @z.pow{s}(sin{s}(x + 4.0{S}), cos{s}(x - 2.0{S}))g       @zexp{s}(8.0{S}*x)z
exp2{s}(x)zexpm1{s}(4.0{S}*x)ru   z((n) % (2))rs   r   z((2*n + 3) % (3*n + 5))g      @z"fmod{s}(1.0{S}*x + 2.0{S}, 3.0{S})z$fmod{s}(1.0{S}*x, 2.0{S}*x + 3.0{S})zlog{s}((1.0{S}/2.0{S})*x)zlog10{s}((3.0{S}/2.0{S})*x)zlog2{s}(8.0{S}*x)zlog1p{s}(x)zpow{s}(2, x)zpow{s}(2.0{S}, x)zpow{s}(x, 3)zpow{s}(x, 4.0{S})zsqrt{s}(x + 3)zcbrt{s}(x - 2.0{S})zhypot{s}(x, y)zsin{s}(3.0{S}*x + 2.0{S})g      ?zcos{s}(3.0{S}*x - 1.0{S})ztan{s}(4.0{S}*y + 2.0{S})zasin{s}(3.0{S}*x + 2.0{S})zacos{s}(3.0{S}*x + 2.0{S})zatan{s}(3.0{S}*x + 2.0{S})zatan2{s}(3.0{S}*x, 2.0{S}*y)zsinh{s}(3.0{S}*x + 2.0{S})zcosh{s}(3.0{S}*x - 1.0{S})ztanh{s}(4.0{S}*y + 2.0{S})zasinh{s}(3.0{S}*x + 2.0{S})zacosh{s}(3.0{S}*x + 2.0{S})zatanh{s}(3.0{S}*x + 2.0{S})g      E@zerf{s}(42.0{S}*x)zerfc{s}(42.0{S}*x)ztgamma{s}(x)zlgamma{s}(x)zceil{s}(x + 2.0{S})zfloor{s}(x + 2.0{S})zfma{s}(x, y, -z)z.fmax{s}(8.0{S}, fmax{s}(x, pow{s}(x, 4.0{S})))zfmin{s}(2.0{S}, x))/r   r7   r  rI   rJ   rK   rL   r  r)   ro   r   zipr   r   r    rS   rQ   r	   r#   rV   rT   rR   r+   rW   rX   r   r,   r   r   r   r   r*   r   r-   r   r   r   r   r   r"   r$   r   r!   rU   r   r%   r&   )r   Zf32_printerZf64_printerr  r  rg   r  rh   test_C99CodePrinter__precisionw  sj    r  c                  C   s6   t  } | td dksJ | dtd  dksJ d S )Nrv   r   ru   Z	M_SQRT1_2)r8   r    rY   )macrosrg   rg   rh   test_get_math_macros  s   r   c                  C   sZ  t ddd} t| t| d}t|}t|dksJ tttthd}t|}t|dks/J |j	t
d}t|d	ks=J tttd
d}t|}t }d|jvsSJ ||dks\J d|jv scJ t ddd}	tj|	tthd}
t|
}t|dks~J tttdthd}t|}t|dksJ t|j|jt
|jd}t|}t|dksJ d S )Nr   Tr   typezint i)r"  attrszconst float x)valuezconst float x = M_PIboolz	stdbool.hzbool yur   r#  zdouble * const restrict uZ
__float128zconst __float128 xzconst __float128 x = M_PI)r   r?   r;   Z	from_exprr=   rc   ro   rJ   r@   Zas_Declarationr   r   r6   headersr  r>   ZdeducedrA   rZ   symbolr"  r#  )r   Zvar1Zdcl1Zvar2Zdcl2aZdcl2bZvar3Zdcl3rf   r&  Zptr4Zdcl4var5dcl5avar5bdcl5brg   rg   rh   test_ccode_Declaration  s2   r.  c               	   C   s  t dtjtjtj} ttt| i| di| ditd| di| did}|t	dks*J |j
r/J |jr4J |jr9J |ddksBJ |j
rGJ |jrLJ |jd	hksTJ |td
ddks`J |tt	dkskJ |tddddksxJ |t	d dksJ tt	| thd}t|}t|dksJ tt	| tthd}t|}||dksJ tt	| tdthd}t|}||dt| j ksJ d S )NZ	_Float128Qf128)!__STDC_WANT_IEC_60559_TYPES_EXT__)ry   Ztype_literal_suffixesZtype_func_suffixesZtype_math_macro_suffixesZtype_macrosro   r  z2.0Qr1  rv   ru   z	1.0Q/2.0Qz
sinf128(x)Fr   zcosf128(2.0Q)rw   z1.0Q/xr'  zconst _Float128 xzconst _Float128 x = M_PIf128&   )r$  r#  zconst _Float128 x = %sQ)r<   rM   ZnbitsZnmantZnexpr7   r  rI   r  ro   r(  Z	librariesr  r   r)   r   r?   r@   r=   rc   r   r   r   Zdecimal_dig)r0  Zp128r*  r+  r,  r-  Zdcl5crg   rg   rh   test_C99CodePrinter_custom_type  s@   




"r3  c                  C   sx   t ddd} t ddd}t ddd}t| d dksJ td| d  dks(J |d || | }t|d	ks:J d S )
Nr   rv   rs   r   r  r   zA[0]z3*A[0]z
(A - B)[0])r`   rc   Zsubs)r   r   r  r   rg   rg   rh   test_MatrixElement_printing  s   r4  c                   C   s  t ttd dksJ t tttd dksJ t tdtd  dks(J t ttd dks4J t ttd dks@J t tt dksJJ t ttd  d	ksVJ t ttd
  dksbJ t tdt  dksnJ t tdt  dkszJ t tdtt  dksJ t tdtt  dksJ t ttd dksJ t ttd dksJ t tdtd  dksJ t tdtd  dksJ d S )Nrv   zz + M_Ezz + M_LOG2Eru   z	z + M_LN2r  z
z + M_LN10zz + M_PIz
z + M_PI_2r   z
z + M_PI_4z
z + M_1_PIz
z + M_2_PIzz + M_2_SQRTPIzz + M_SQRT2zz + M_SQRT1_2)rc   r   r    rT   r#   r   r+   rY   rg   rg   rg   rh   test_ccode_math_macros  s     r5  c                   C   s(   t tddks
J t tdksJ d S )Nr	  int)rc   r;   rN   rg   rg   rg   rh   test_ccode_Type   s   r7  c               	   C   s   t tddks
J t tttdkttddgdksJ t tttdgdks,J tt	tt
d} t tt
d| gd	ksAJ t tt
d| gtttd
 gdksUJ tttttgdtdtgtt}t |dg dkstJ d S )Nzthis is a commentz// this is a commentrv   -z"while (fabs(x) > 1) {
   x -= 1;
}z{
   x += 1;
}r!  Zpwerzdouble pwer(double x)ru   z*double pwer(double x){
   x = pow(x, 2);
}z%d %d
)zx;zprintf("%d %d", x, y);zpwer(x);z	return x;)rc   rO   rB   r   ro   r1   rC   r9   r=   r?   rI   rE   rF   r2   rP   rD   r   rG   rH   join)Zinp_xblockrg   rg   rh   test_ccode_codegen_ast%  s&   
r<  c                  C   s4   t   dd l} W d    d S 1 sw   Y  d S )Nr   )r5   Zsympy.printing.ccode)r   rg   rg   rh   test_ccode_submoduleG  s   
"r=  N)Z
sympy.corer   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Zsympy.functionsr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   Z
sympy.setsr.   Zsympy.logicr/   Zsympy.codegenr0   r1   r2   Zsympy.testing.pytestr3   r4   r5   Zsympy.printing.cr6   r7   r8   Zsympy.codegen.astr9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   Zsympy.codegen.cfunctionsrQ   rR   rS   rT   rU   rV   rW   rX   rY   Zsympy.codegen.cnodesrZ   Zsympy.utilities.lambdifyr[   r   r]   r^   Zsympy.matricesr_   r`   ra   r   rc   ro   r   r   rp   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r  r  r  r   r.  r3  r4  r5  r7  r<  r=  rg   rg   rg   rh   <module>   s   L th,
*1(		
; )"