U
    	-eTx                     @   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mZmZ d dl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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z: d dl;m<Z<m=Z=m>Z> d dl?m@Z@mAZAmBZB d dlCmDZDmEZE d dlFmGZGmHZHmIZI d d	lJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZb d d
lcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZl d dlmmnZn d dlompZp d dlqmrZrmsZs d dltmuZumvZvmwZw d dlxmyZy ed\ZzZ{Z|dd Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdIdJ ZdKdL ZdMdN ZdOdP ZdQdR ZdSdT ZdUdV ZdWdX ZdYdZ Zd[d\ Zd]d^ Zd_d` Zdadb ZeEdcdd Zdedf Zdgdh Zdidj Zdkdl Zdmdn Zdodp Zdqdr Zdsdt Zdudv Zdwdx ZdyS )z    )SpiooSymbolsymbolsRationalIntegerFloatFunctionModGoldenRatio
EulerGammaCatalanLambdaDummynanMulPowUnevaluatedExpr)EqGeGtLeLtNe)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	fibonaccilucas)Range)ITEImplies
Equivalent)For
aug_assign
Assignment)raisesXFAIL)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$t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 rq   \/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/sympy/printing/tests/test_c.py_ccode"   s    z%test_printmethod.<locals>.fabs._ccodeN)__name__
__module____qualname__rs   rq   rq   rq   rr   fabs!   s   rw   fabs(x))r   rm   xAssertionError)rw   rq   rq   rr   test_printmethod    s    r{   c                   C   s@   t ttdkstt td dks(tt ttdks<td S )Nzsqrt(x)      ?)rm   r3   ry   rz   rq   rq   rq   rr   test_ccode_sqrt(   s    r}   c               
   C   s  t td dkstt ttd  dks,ttdttdt } t d| td ttt    td t  dksttt td	 d
kstt ttdd dkstt ttdd ttiddkstdd dfdd dfg}t td d|iddkstt td d|iddkstt ttdd d|iddks:tdd dd fdd dfg}t dt d|iddksttt td d|iddkstt t	d tt
t	ttd!d"d#d!d"d!d"d$kst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(   rq   rq   rr   <lambda>7       z test_ccode_Pow.<locals>.<lambda>Zdpowic                 S   s   |j  S r   r   r   rq   rq   rr   r   8   r   powr   Zuser_functionszdpowi(x, 3)r|   zpow(x, 0.5)      zpow(x, 16.0/5.0)c                 S   s   | dkS Nr   rq   r   rq   rq   rr   r   <   r   c                 S   s   d| S )Nzexp2(%s)rq   r   rq   rq   rr   r   <   r   c                 S   s   | dkS r   rq   r   rq   rq   rr   r   =   r   exp2(x)z	pow(x, 2)Fevaluatez
-2*x/(y*y))rm   ry   rz   yrf   r   r   rT   rW   r   r   )r   Z_cond_cfuncZ_cond_cfunc2rq   rq   rr   test_ccode_Pow.   s2    *"

$
r   c                   C   s(   t tttt dddddks$td S )NZmy_maxZmy_pow)r-   r   r   zmy_max(x, my_pow(x, 2)))rm   r-   ry   rz   rq   rq   rq   rr   test_ccode_MaxF   s    r   c                  C   s>   t td } dD ](}t| |d}|d|dkstqd S )Nza[0:50])c89c99Zc11standard())r.   r   rm   countrz   )Zbig_minZcurr_standardoutputrq   rq   rr   test_ccode_Min_performanceK   s    r   c                   C   s   t tddkstt tdks$tt tdddks8tt t dddksNtt tdks^tt t d	dd
ksttt tttiddkstd S )Nr   M_EZM_PIr   r   ZHUGE_VALz	-HUGE_VALINFINITYr   z	-INFINITYr   ZM_PIl)rm   r(   rz   r   r   rT   rW   rq   rq   rq   rr   test_ccode_constants_mathhS   s    r   c                   C   s^   t dt dtd kstt dt dtd ks<tt dt dtd ksZtd S )Nr   z,const double GoldenRatio = %s;
2*GoldenRatio   z$const double Catalan = %s;
2*Catalanz*const double EulerGamma = %s;
2*EulerGamma)rm   r   evalfrz   r   r   rq   rq   rq   rr   test_ccode_constants_other]   s    r   c                   C   s2  t tdddkstt tddttiddks4tt tdddksJtt tdd	d
ks`tt tdd	ttiddks~tt tdd	dkstt tdd	ttiddkstt ttdd dkstt ttdd ttiddkstt tddt dks
tt tddt ttiddks.td S )Nr~      z3.0/7.0r   z	3.0L/7.0L   	   2z-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)rm   r   rz   rT   rW   ry   rq   rq   rq   rr   test_ccode_Rationald   s    "r   c                   C   s,   t tddkstt tddks(td S )NC   Z67r   z-1)rm   r   rz   rq   rq   rq   rr   test_ccode_Integerr   s    r   c                   C   s    t tttt dkstd S )Nzpow(sin(x), cos(x)))rm   r1   ry   r$   rz   rq   rq   rq   rr   test_ccode_functionsw   s    r   c                  C   s   t d} tdt| d|  }t|| dks0ttdt| d|  t }t|| dtd ksfttd}tdt d	d
d}tdt| | d|   d|   }t||| || ddkstd S )Nry   r   r   z2*xz&const double Catalan = %s;
2*x/Catalanr   AinTintegerr   	assign_toz@for (int i=0; i<n; i++){
   A[i] = (A[i] + 1)*(A[i] + 2)*A[i];
})	r   rf   r   rm   rz   r   r   rg   rh   )ry   r   r   r   rq   rq   rr   test_ccode_inline_function{   s     r   c                  C   s   t ttdddkstt ttdd} d|  ks8tt ttddd} d|  ksZtt ttddd} d|  ks|td S )	NC99r   	tgamma(x)C89znot supported in cF)r   Zallow_unknown_functionsT)rm   r*   ry   rz   lower)Z	gamma_c89rq   rq   rr   test_ccode_exceptions   s    r   c                  C   s  t ttdkstt ttdks(tt ttdks<ttddd\} }t tt| t|dksjtt t| |dksttd	ddd
\}}t t||dkstt t||d dkstt tdddddkstt tdddd dkstt | t|| dkstt t||| dks0ttdddd}t t| |dksXtt t|dksntt t	|dkstd S )Nceil(x)rx   r   zr,sTrT   z)((ceil(r) % ceil(s)) + ceil(s)) % ceil(s)z
fmod(r, s)zp1 p2r   Zpositivezp1 % p2r~   zp1 % (p2 + 3)r   r   Fr   z(-3) % (-7)r   z-(3 % 7)zr*(p1 % p2)zpow(p1 % p2, s)r   )r   negativez	(-n) % p2zI(1.0/5.0)*pow(2, -n)*sqrt(5)*(-pow(1 - sqrt(5), n) + pow(1 + sqrt(5), n))z6pow(2, -n)*(pow(1 - sqrt(5), n) + pow(1 + sqrt(5), n)))
rm   r#   ry   rz   r   r*   r   r   r6   r7   )rsp1p2r   rq   rq   rr   test_ccode_functions2   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sNttt| |ddksfttt||ddks~ttd}td}tddD ] }|tddtd| |}qt|ddid}d|kst|	ddkstd S )Nry   Fr   r   Tceilc                 S   s   | j  S r   r   ry   rq   rq   rr   r      r   z+test_ccode_user_functions.<locals>.<lambda>rw   c                 S   s   | j S r   r   r   rq   rq   rr   r      r   abs)r#   r   r   r   rx   abs(n)amuladdr   d   r   r   Za99)
r   rm   r#   rz   r   r   r
   ranger   r   )ry   r   Zcustom_functionsexprr   r   outrq   rq   rr   test_ccode_user_functions   s    r   c                   C   sL  t ddkstt tjdks"tt ddks2tt tjdksDtt tt@ dksXtt ttB dksltt t dks~tt tt@ t@ dkstt ttB tB d	kstt tt@ tB d
kstt ttB t@ dkstt ttA dkstt ttA tA dkstt tttdks$tt t	tttA tttdksHtd S )NTtrueFfalsezx && yzx || yz!xzx && y && zzx || y || zzz || x && yzz && (x || y)z(x || y) && (!x || !y)zF(x || y || z) && (x || !y || !z) && (y || !x || !z) && (z || !x || !y)zy || !xzD(x || (y || !z) && (z || !y)) && (z && !x || (y || z) && (!y || !z)))
rm   rz   r   r   r   ry   r   zr:   r;   rq   rq   rq   rr   test_ccode_boolean   s    r   c                   C   s   t tttdkstt tttdks,tt tttdksBtt tttdksXtt tttdksntt t	ttdkstd S )Nzx == yzx != yzx <= yzx < yzx > yzx >= y)
rm   r   ry   r   rz   r   r   r   r   r   rq   rq   rq   rr   test_ccode_Relational   s    r   c                      s   t ttdk ftd df t dks*tt dddks>tt ttdk ftd tdk ftd df t dksvtt ddd	kst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 )Nr   r   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 r   rl   rq   r   rq   rr   r     r   z&test_ccode_Piecewise.<locals>.<lambda>)r/   ry   rm   rz   r1   r?   
ValueErrorrq   rq   r   rr   test_ccode_Piecewise   s     
(

,r   c                  C   s(   ddl m}  | t}t|dks$td S )Nr   )sincz'((x != 0) ? (
   sin(x)/x
)
: (
   1
)))Z(sympy.functions.elementary.trigonometricr   ry   rm   rz   )r   r   rq   rq   rr   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<ttt t td  td  tdtdk fd tt d }t |dkstt |d	d
dkstd S )Nr   r   TzD2*((x < 1) ? (
   x
)
: ((x < 2) ? (
   x + 1
)
: (
   pow(x, 2)
)))r   r|   )r   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;)rm   r/   ry   rz   r   r   r$   )pr   rq   rq   rr   test_ccode_Piecewise_deep  s    0
:
r   c                  C   s$   t tdk tt} t| dks td S )Nr   z((x < 1) ? (
   y
)
: (
   z
)))r9   ry   r   r   rm   rz   r   rq   rq   rr   test_ccode_ITE/  s    r   c                   C   s   t tdd  d S )Nc                   S   s   t ttddS )Ngarbage)method)rm   r1   ry   rq   rq   rq   rr   r   ;  r   z%test_ccode_settings.<locals>.<lambda>)r?   	TypeErrorrq   rq   rq   rr   test_ccode_settings:  s    r   c                  C   s  t ddd\} }}}td|td|td|  }}}td| }td||f }td	|||f }	t }
|
|d
ks|t|
|d|| |  kst|
|	d|| | ||  |  ksttddd||f }|
|dd| |  ksttdddd||f }t|d|d|   ks*ttddd| f|d||f }t|dksXttd| ||f|d}t||||f dkstt|dd|f dkstd S )Nzs n m oTr   r   jkry   r   Bzx[j]zA[%s]zB[%s])r   r~   shaper~   F)r   stridesr   )   r   r   )r   r   offsetzA[o + s*j + i]r   r   zA[m*j + n*k + o + s*i]r   zA[3*m + n*k + o + 2*s])r   rh   rg   rB   Z_print_Indexedrz   rm   )r   r   mor   r   r   ry   r   r   r   ZAbaserq   rq   rr   test_ccode_Indexed>  s$    "*r   c                   C   sb   t tdddkstt tddddddks2tt tddd	ksHtt tdd
dks^td S )Nry   Zijzx[i][j]klr   r   zx[i*k + j*l + o])r~   zx[3])r~      r   z
x[3][4][5])rm   rE   rz   rq   rq   rq   rr   test_ElementZ  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std S )Nr   r   r   ry   Dyr   r   F)r   Zcontractz&Dy[i] = (y[%s] - y[i])/(x[%s] - x[i]);)rg   rh   r   rm   rhslhsrz   )Zlen_yr   ry   r   r   eZcode0rq   rq   rr   2test_ccode_Indexed_without_looking_for_contractiona  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sxtd S )Nn mTr   r   ry   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   rg   rh   rm   rz   )r   r   r   ry   r   r   r   r   rq   rq   rr   test_ccode_loops_matrix_vectorl  s    



r   c                  C   s`   t ddtd\} }td}td}t| |} d| jj|jd }t||  ||  d|ks\td S )	Nzi mT)r   clsry   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   rg   rh   labelZdummy_indexrm   rz   )r   r   ry   r   expectedrq   rq   rr   test_dummy_loops  s    
r  c            	      C   s   t ddd\} }td}td}td}td}td|}td	| }d
||  |  d }t|||f ||  ||  ||  || d|kstd S )Nr   Tr   r   ry   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   ry   r   r   r   r   r   rq   rq   rr   test_ccode_loops_add  s    



r  c                  C   s   t ddd\} }}}td}td}td}td|}td| }td	|}	td
|}
d||  | | || |  |	|  |
 || | |	|  |
 f d }t|||	|
f ||||	|
f  || d|kstd S )Nn m o pTr   r   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   rq   rq   rr   &test_ccode_loops_multiple_contractions  s    



>r  c                  C   s  t ddd\} }}}td}td}td}td}td|}td	| }	td
|}
td|}d||  | | |	| |  |
|  | ||  | | |	| |  |
|  | |	| | |
|  | f d }t|||	|
|f |||	|
|f  ||	|
|f  || d|kstd S )Nr  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   rq   rq   rr   test_ccode_loops_addfactor  s     



dr  c                  C   s  t ddd\} }}}td}td}td}td}td|}td	| }	t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std S )Nr  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   s0s1s2Zs3rq   rq   rr   test_ccode_loops_multiple_terms  sP    





Rr  c                  C   s.   t t tt t } t| tgddks*td S )Ndereferencezx + y + (*z) + sin((*z)))ry   r   r1   r   rm   rz   r   rq   rq   rr   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sJttd|d  tdkf|d dft|d	  |d
  }t|dkst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std S )Nr   r   Tr   r~   r   zPA[0] = x*y;
if (y > 0) {
   A[1] = x + 2;
}
else {
   A[1] = y;
}
A[2] = sin(z);)r   r   )r   r   r   r   z:((x > 0) ? (
   2*A[2]
)
: (
   A[2]
)) + sin(A[1]) + A[0]qr   M)r~   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;)ri   ry   r   r/   r1   r   rj   rm   rz   r$   r3   )matr   r   r  r  r   rq   rq   rr   test_Matrix_printing  s$    ,
6$r  c                   C   s    dt tdddggkstd S )NzNot supported in Cr   r   r~   )rm   rk   rz   rq   rq   rq   rr   test_sparse_matrix9  s    r  c               	   C   s   t d\} }tt t|d ddd W 5 Q R X t|d dksFtt| |d  |gddksdtt|d d	d
dks|td S )Nzx, ifr   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   r?   r   rm   rz   )ry   r   rq   rq   rr   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sZtt| dd| ksptt||kstt||kstd S )Nzy*(((x) > 0) - ((x) < 0))z!(((cos(x)) > 0) - ((cos(x)) < 0))r   zApow(x, 2) + x*(((pow(x, 2) + 2*x) > 0) - ((pow(x, 2) + 2*x) < 0))r   zz = %s;)r0   ry   r   r$   rm   rz   )expr1Zref1Zexpr2Zref2Zexpr3Zref3rq   rq   rr   test_ccode_signG  s    &r  c                   C   s:   t tttt dkstt ttdtt dks6td S )Nz
x = y + z;+zx += y + z;)rm   r>   ry   r   r   rz   r=   rq   rq   rq   rr   test_ccode_AssignmentP  s    r  c                  C   s2   t ttdddttdtg} t| dks.td S )Nr   
   r   *z*for (x = 0; x < 10; x += 2) {
   y *= x;
})r<   ry   r8   r=   r   rm   rz   )frq   rq   rr   test_ccode_ForU  s    r  c                   C   sX   t ttddddkstt ttddddks4tt ttdttdddksTt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))))rm   r-   ry   rz   r.   r3   rq   rq   rq   rr   test_ccode_Max_Min[  s
    r  c                   C   sH   t ttdddkstt tdddks,tt tddddksDtd S )Nr   r   expm1(x)ZNANr   )rm   r\   ry   rz   r   floatrq   rq   rq   rr   test_ccode_standardb  s    r"  c                  C   sB   t  } | jdkst| jdks"td| jks0td| jks>td S )NCr   voidtemplate)rA   languagerz   r   reserved_words)Z
c89printerrq   rq   rr   test_C89CodePrinterh  s
    r(  c                  C   sh  t  ttdkstt  ttdks0tt  ttdksHtt  ttdks`tt  ttt	t
 dks~tt  ttdkstt  ttdkstt  ttt	dkstt  ttd	kstt  ttd
td dkstt  ttd
dkstt  } | jdks4t| jdksDtd| jksTtd| jksdt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)r~   r   zfmax(3, fmax(x, pow(x, 2)))z
fmin(3, x)r#  r   re   using)rB   doprintr\   ry   rz   r]   r^   r_   r`   r   r   ra   rb   rc   r,   r-   r.   r&  r   r'  )Z
c99printerrq   rq   rr   test_C99CodePrinterp  s     "r+  c                  C   s2   t dttii} | tttd dks.td S )Nr   z2.1zsinl(x + 2.1L))rB   rT   rW   r*  r1   ry   r	   rz   )f80_printerrq   rq   rr   "test_C99CodePrinter__precision_f80  s    r-  c                     s  t ddd} t dddd}tdttii}tdttii}tdttii}|ttd dksdt	|ttd d	ks~t	|ttt
d
 dkst	t|||gdddgD ]X\  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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 d0 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t d6 |td!t d d7 |t d!t d0 d8 |t!dt d d9 |t"d!t d d: |t#d!t d d; |t$d!t d d< |t%d=t d> |t&d=t d? |t'td@ |t(tdA |t)td dB |t*td dC |t+ttt, dD |t-tdtd dE |t.tddF qd S )GNr   Tr   r   r   r   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 td S )N)r   r   )r*  formatupperrz   )r   refrp   suffixrq   rr   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)r   zp % 2r~   r   Fr   z(2*p + 3) % (3*p + 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   rB   rT   rU   rV   rW   r*  r1   ry   rz   r	   zipr   r$   r(   r^   r\   r   r+   ra   r_   r]   r3   rb   rc   r   r4   r   r   r    r"   r2   r%   r5   r   r   r!   r&   r'   r*   r,   r#   r)   r`   r   r-   r.   )r   r   Zf32_printerZf64_printerr,  r4  rq   r2  rr   test_C99CodePrinter__precision  sj     $r7  c                  C   s6   t  } | td dkst| dtd  dks2td S )Nr   r   r   Z	M_SQRT1_2)rC   r(   rz   rd   )macrosrq   rq   rr   test_get_math_macros  s    r9  c                  C   s^  t ddd} t| t| d}t|}t|dks6ttttt	hd}t|}t|dks^t|j
td}t|d	kszttttd
d}t|}t }d|jkst||dkstd|jkstt ddd}	tj|	tthd}
t|
}t|dksttttdt	hd}t|}t|dks*tt|j|jt|jd}t|}t|dksZt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   rJ   rF   Z	from_exprrH   rm   rz   ry   rU   rK   Zas_Declarationr   r   rA   headersr*  rI   ZdeducedrL   re   symbolr;  r<  )r   Zvar1Zdcl1Zvar2Zdcl2aZdcl2bZvar3Zdcl3rp   r?  Zptr4Zdcl4var5dcl5avar5bdcl5brq   rq   rr   test_ccode_Declaration  s2    rG  c                  C   s  t dtjtjtj} tt| i| di| ditd| di| did}|tdksRt	|j
r\t	|jrft	|jrpt	|ddkst	|j
rt	|jrt	|jd	hkst	|td
ddkst	|ttdkst	|tddddkst	|td dkst	tt| thd}t|}t|dks0t	tt| tthd}t|}||dks^t	tt| tdthd}t|}||dt| j kst	d S )NZ	_Float128Qf128)!__STDC_WANT_IEC_60559_TYPES_EXT__)r   Ztype_literal_suffixesZtype_func_suffixesZtype_math_macro_suffixesZtype_macrosry   r5  z2.0QrJ  r   r   z	1.0Q/2.0Qz
sinf128(x)Fr   zcosf128(2.0Q)r   z1.0Q/xr@  zconst _Float128 xzconst _Float128 x = M_PIf128&   )r=  r<  zconst _Float128 x = %sQ)rG   rX   nbitsZnmantZnexprB   rT   r*  ry   rz   rA  	librariesr8  r   r1   r$   rJ   rK   rH   rm   r   r   r   Zdecimal_dig)rI  Zp128rC  rD  rE  rF  Zdcl5crq   rq   rr   test_C99CodePrinter_custom_type  sF       




rN  c                  C   sx   t ddd} t ddd}t ddd}t| d dks8ttd| d  dksPt|d || | }t|d	ksttd S )
Nr   r   r~   r   r#  r  zA[0]z3*A[0]z
(A - B)[0])rj   rm   rz   subs)r   r   r#  r   rq   rq   rr   test_MatrixElement_printing  s    rP  c                   C   s  t ttd dkstt tttd dks4tt tdtd  dksPtt ttd dkshtt ttd dkstt tt dkstt ttd  d	kstt ttd
  dkstt tdt  dkstt tdt  dkstt tdtt  dkstt tdtt  dks0tt ttd dksJtt ttd dksdtt tdtd  dkstt tdtd  dkstd S )Nr   zz + M_Ezz + M_LOG2Er   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)	rm   r   r(   rz   r_   r+   r   r3   rd   rq   rq   rq   rr   test_ccode_math_macros   s     rQ  c                   C   s(   t tddkstt tdks$td S )Nr!  int)rm   rF   rz   rY   rq   rq   rq   rr   test_ccode_Type3  s    rS  c               	   C   s   t tddkstt tttdkttddgdks<tt tttdgdksXtt	t
ttd} t ttd| gd	kstt ttd| gtttd
 gdksttttttgdtdtgtt}t |dddddgkstd S )Nzthis is a commentz/* this is a comment */r   -z"while (fabs(x) > 1) {
   x -= 1;
}z{
   x += 1;
}r:  Zpwerzdouble pwer(double x)r   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;)rm   rZ   rz   rM   r   ry   r=   rN   rD   rH   rJ   rT   rP   rQ   r>   r[   rO   r   rR   rS   join)Zinp_xblockrq   rq   rr   test_ccode_codegen_ast8  s0    

rX  c                  C   s   t ttt t dkstt ttt t dks8ttd} t ttt tt|   dksdttddd\}}}t|| }tt|| }t |dkstd S )	Nzz + x*yzz + (x + y)wz(w + z) + (x + y)zp q rTr   zexp(p + (q + r)))	rm   r   r   ry   r   rz   r   r   r(   )rY  r   r  r   Zq_rr   rq   rq   rr   test_ccode_UnevaluatedExpr]  s    $rZ  c                   C   s*   t dddgdkstt ddks&td S )Nr   r~   r   z	{2, 3, 4})r   r~   r   )rm   rz   rq   rq   rq   rr    test_ccode_array_like_containersi  s    r[  N)Z
sympy.corer   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Zsympy.core.relationalr   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/   r0   r1   r2   r3   r4   r5   r6   r7   Z
sympy.setsr8   Zsympy.logicr9   r:   r;   Zsympy.codegenr<   r=   r>   Zsympy.testing.pytestr?   r@   Zsympy.printing.crA   rB   rC   Zsympy.codegen.astrD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   Zsympy.codegen.cfunctionsr\   r]   r^   r_   r`   ra   rb   rc   rd   Zsympy.codegen.cnodesre   Zsympy.utilities.lambdifyrf   Zsympy.tensorrg   rh   Zsympy.matricesri   rj   rk   Zsympy.printing.codeprinterrm   ry   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(  r+  r-  r7  r9  rG  rN  rP  rQ  rS  rX  rZ  r[  rq   rq   rq   rr   <module>   s   T |h,

	*/(		
< )%