o
    ohEy                     @   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lFmGZG d d	lHmIZImJZJmKZK d d
lLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZf d dlgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZp d dlqmrZr d dlsmtZt d dlumvZvmwZw d dlxmyZymzZzm{Z{ d dlFm|Z| ed\Z}Z~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*d+ Zd,d- Zd.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_ Zd`da Zdbdc ZeEddde Zdfdg Zdhdi Zdjdk Zdldm Zdndo Zdpdq Zdrds Zdtdu Zdvdw Zdxdy ZdzS ){    )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)PrintMethodNotImplementedError)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stderrQuotedString)	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   )_printargs)selfprinter ru   o/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/printing/tests/test_c.py_ccode#   s   z%test_printmethod.<locals>.fabs._ccodeN)__name__
__module____qualname__rw   ru   ru   ru   rv   fabs"   s    r{   fabs(x))r   rp   x)r{   ru   ru   rv   test_printmethod!   s   r~   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)      ?)rp   r3   r}   ru   ru   ru   rv   test_ccode_sqrt)   s   r   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(   ru   ru   rv   <lambda>8       z test_ccode_Pow.<locals>.<lambda>dpowic                 S   s   |j  S r   r   r   ru   ru   rv   r   9       powr   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   ru   r   ru   ru   rv   r   =   r   c                 S   s   d| S )Nzexp2(%s)ru   r   ru   ru   rv   r   =   r   c                 S   s   | dkS r   ru   r   ru   ru   rv   r   >   r   exp2(x)z	pow(x, 2)Fevaluatez
-2*x/(y*y))
rp   r}   yri   r   r   rU   rX   r   r   )r   _cond_cfunc_cond_cfunc2ru   ru   rv   test_ccode_Pow/   s2   *"

"
r   c                   C   s(   t tttt dddddksJ d S )Nmy_maxmy_pow)r-   r   r   zmy_max(x, my_pow(x, 2)))rp   r-   r}   ru   ru   ru   rv   test_ccode_MaxG   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c99c11standard())r.   r   rp   count)big_mincurr_standardoutputru   ru   rv   test_ccode_Min_performanceL   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 )Nr   M_EM_PIr   r   HUGE_VALz	-HUGE_VALINFINITYr   z	-INFINITYr   M_PIl)rp   r(   r   r   rU   rX   ru   ru   ru   rv   test_ccode_constants_mathhT   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 )Nr   z,const double GoldenRatio = %s;
2*GoldenRatio   z$const double Catalan = %s;
2*Catalanz*const double EulerGamma = %s;
2*EulerGamma)rp   r   evalfr   r   ru   ru   ru   rv   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 )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)rp   r   rU   rX   r}   ru   ru   ru   rv   test_ccode_Rationale   s   "&r   c                   C   s,   t tddks
J t tddksJ d S )NC   67r   z-1)rp   r   ru   ru   ru   rv   test_ccode_Integers   s   r   c                   C   s    t tttt dksJ d S )Nzpow(sin(x), cos(x)))rp   r1   r}   r$   ru   ru   ru   rv   test_ccode_functionsx   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 )Nr}   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   ri   r   rp   r   r   rj   rk   )r}   r   r   r   ru   ru   rv   test_ccode_inline_function|   s    r   c                   C   s   t ttdddksJ tt t ttdd W d    n1 s#w   Y  tt t ttddd W d    n1 s@w   Y  t ttddd d S )NC99r   	tgamma(x)C89F)r   allow_unknown_functionsT)rp   r*   r}   r?   rA   ru   ru   ru   rv   test_ccode_exceptions   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ddd\} }t tt| t|dks5J t t| |dks@J td	ddd
\}}t t||dksTJ t t||d dksaJ t tdddddksnJ t tdddd dks|J t | t|| dksJ t t||| dksJ tdddd}t t| |dksJ t t|dksJ t t|dksJ d S )Nceil(x)r|   r   zr,sTrU   z)((ceil(r) % ceil(s)) + ceil(s)) % ceil(s)z
fmod(r, s)zp1 p2r   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) % p2zK((1.0/5.0)*pow(2, -n)*sqrt(5)*(-pow(1 - sqrt(5), n) + pow(1 + sqrt(5), n)))z8(pow(2, -n)*(pow(1 - sqrt(5), n) + pow(1 + sqrt(5), n))))	rp   r#   r}   r   r*   r   r   r6   r7   )rsp1p2r   ru   ru   rv   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s'J tt| |ddks3J tt||ddks?J td}td}tddD ]}|tddtd| |}qLt|ddid}d|v skJ |ddkstJ d S )Nr}   Fr   r   Tceilc                 S   s   | j  S r   r   r}   ru   ru   rv   r      r   z+test_ccode_user_functions.<locals>.<lambda>r{   c                 S   s   | j S r   r   r   ru   ru   rv   r      r   abs)r#   r   r   r   r|   abs(n)amuladdr   d   r   r   a99)	r   rp   r#   r   r   r
   ranger   r   )r}   r   custom_functionsexprr   r   outru   ru   rv   test_ccode_user_functions   s   r   c                   C   sF  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 t ttA dksyJ t ttA tA dksJ t tttdksJ t ttttA tttdksJ 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)))	rp   r   r   r   r}   r   zr:   r;   ru   ru   ru   rv   test_ccode_boolean   s   &r   c                   C   s   t tttdksJ t tttdksJ t tttdks!J t tttdks,J t tttdks7J t tttdksBJ d S )Nzx == yzx != yzx <= yzx < yzx > yzx >= y)	rp   r   r}   r   r   r   r   r   r   ru   ru   ru   rv   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 )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   ro   ru   r   ru   rv   r     r   z&test_ccode_Piecewise.<locals>.<lambda>)r/   r}   rp   r1   r?   
ValueErrorru   ru   r   rv   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
))))(sympy.functions.elementary.trigonometricr   r}   rp   )r   r   ru   ru   rv   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 )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;)rp   r/   r}   r   r   r$   )pr   ru   ru   rv   test_ccode_Piecewise_deep  s   0:

r   c                  C   s$   t tdk tt} t| dksJ d S )Nr   z((x < 1) ? (
   y
)
: (
   z
)))r9   r}   r   r   rp   r   ru   ru   rv   test_ccode_ITE1  s   r   c                   C   s   t tdd  d S )Nc                   S   s   t ttddS )Ngarbage)method)rp   r1   r}   ru   ru   ru   rv   r   =  s    z%test_ccode_settings.<locals>.<lambda>)r?   	TypeErrorru   ru   ru   rv   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>J |
|d|| |  ksMJ |
|	d|| | ||  |  ksbJ tddd||f }|
|dd| |  ks{J tdddd||f }t|d|d|   ksJ tddd| f|d||f }t|dksJ td| ||f|d}t||||f dksJ t|dd|f dksJ d S )Nzs n m oTr   r   jkr}   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   rk   rj   rC   _print_Indexedrp   )r   r   mor   r   r   r}   r   r   r   Abaseru   ru   rv   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 )Nr}   ijzx[i][j]klr  r  zx[i*k + j*l + o])r   zx[3])r      r   z
x[3][4][5])rp   rF   ru   ru   ru   rv   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   r}   Dyr   r   F)r   contractz&Dy[i] = (y[%s] - y[i])/(x[%s] - x[i]);)rj   rk   r   rp   rhslhs)len_yr   r}   r  r   ecode0ru   ru   rv   2test_ccode_Indexed_without_looking_for_contractionc  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   r}   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   rj   rk   rp   )r   r  r   r}   r   r   r   r   ru   ru   rv   test_ccode_loops_matrix_vectorn  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   clsr}   r   zlfor (int i_%(icount)i=0; i_%(icount)i<m_%(mcount)i; i_%(icount)i++){
   y[i_%(icount)i] = x[i_%(icount)i];
})icountmcountr   )r   r   rj   rk   labeldummy_indexrp   )r   r  r}   r   expectedru   ru   rv   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sHJ d S )Nr  Tr   r   r}   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}   r   r   r   r   r   ru   ru   rv   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sgJ 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   ru   ru   rv   &test_ccode_loops_multiple_contractions  s   



>6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sJ 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   ru   ru   rv   test_ccode_loops_addfactor  s    



dF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sJ d S d S d S d S d S 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s2s3ru   ru   rv   test_ccode_loops_multiple_terms  sR   





R r+  c                  C   s.   t t tt t } t| tgddksJ d S )Ndereferencezx + y + (*z) + sin((*z)))r}   r   r1   r   rp   r   ru   ru   rv   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 )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;)
rl   r}   r   r/   r1   r   rm   rp   r$   r3   )matr   r   r0  r1  r  ru   ru   rv   test_Matrix_printing  s$   ,6
$r3  c                   C   sb   t t ttg dg W d    n1 sw   Y  dtdditg dgv s/J d S )N)r   r   r   zNot supported in CstrictF)r?   rA   rp   rn   rB   doprintru   ru   ru   rv   test_sparse_matrix;  s   
(r6  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, ifr   Tr   )error_on_reservedr   zpow(if_, 2)r,  zpow((*if_), 2)*x_unreserved)reserved_word_suffixzpow(if_unreserved, 2))r   r?   r   rp   )r}   r   ru   ru   rv   test_ccode_reserved_wordsD  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))r   zApow(x, 2) + x*(((pow(x, 2) + 2*x) > 0) - ((pow(x, 2) + 2*x) < 0))r   zz = %s;)r0   r}   r   r$   rp   )expr1ref1expr2ref2expr3ref3ru   ru   rv   test_ccode_signM  s   &rA  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;)rp   r>   r}   r   r   r=   ru   ru   ru   rv   test_ccode_AssignmentV  s    rC  c                  C   s2   t ttdddttdtg} t| dksJ d S )Nr   
   r   *z*for (x = 0; x < 10; x += 2) {
   y *= x;
})r<   r}   r8   r=   r   rp   )fru   ru   rv   test_ccode_For[  s   rG  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))))rp   r-   r}   r.   r3   ru   ru   ru   rv   test_ccode_Max_Mina  s
   rH  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)NANr   )rp   r_   r}   r   floatru   ru   ru   rv   test_ccode_standardh  s   rL  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   voidtemplate)rB   languager   reserved_words)
c89printerru   ru   rv   test_C89CodePrintern  s
   rS  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 )NrI  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)rM  r   rh   using)rC   r5  r_   r}   r`   ra   rb   rc   r   r   rd   re   rf   r,   r-   r.   rP  r   rQ  )
c99printerru   ru   rv   test_C99CodePrinterv  s     rV  c                  C   s2   t dttii} | tttd dksJ d S )Nr   z2.1zsinl(x + 2.1L))rC   rU   rX   r5  r1   r}   r	   )f80_printerru   ru   rv   "test_C99CodePrinter__precision_f80  s   "rX  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s2J |ttd d	ks?J |ttt	d
 dksNJ 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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 d0 |tdt d d1 |tdt d d2 |tdt d d3 |tdt dt d4 |tdt d d5 |tdt d. d6 |t dt d d7 |t!dt d d8 |t"dt d d9 |t#dt d d: |t$d;t d< |t%d;t d= |t&td> |t'td? |t(td d@ |t)td dA |t*ttt+ dB |t,tdtd dC |t-tddD qXd S )ENr   Tr   r   r   r   g @zsinf(x + 2.1F)zsin(x + 2.1000000000000001)z2.0zsinl(x + 2.0L))rF   r#  c                    s$     | |j dksJ d S )N)r   r   )r5  formatupper)r   refrt   suffixru   rv   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) + 2zfloor{s}(x) + 2z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   rC   rU   rV   rW   rX   r5  r1   r}   r	   zipr   r$   r(   ra   r_   r   r+   rd   rb   r`   r3   re   rf   r   r4   r   r   r    r"   r2   r%   r5   r   r   r!   r&   r'   r*   r,   r#   r)   rc   r   r-   r.   )r   r   f32_printerf64_printerrW  r_  ru   r]  rv   test_C99CodePrinter__precision  sl   $rd  c                  C   s6   t  } | td dksJ | dtd  dksJ d S )Nr   r   r   	M_SQRT1_2)rD   r(   rg   )macrosru   ru   rv   test_get_math_macros  s   rg  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)ri  attrszconst float x)valuezconst float x = M_PIboolz	stdbool.hzbool yur   rj  zdouble * const restrict u
__float128zconst __float128 xzconst __float128 x = M_PI)r   rK   rG   	from_exprrI   rp   r}   rV   rL   as_Declarationr   r   rB   headersr5  rJ   deducedrM   rh   symbolri  rj  )r   var1dcl1var2dcl2adcl2bvar3dcl3rt   rm  ptr4dcl4var5dcl5avar5bdcl5bru   ru   rv   test_ccode_Declaration  s2   r  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s)J |j	r.J |j
r3J |jr8J |ddksAJ |j	rFJ |j
rKJ |jd	hksSJ |td
ddks_J |ttdksjJ |tddddkswJ |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 )N	_Float128Qf128)!__STDC_WANT_IEC_60559_TYPES_EXT__)r   type_literal_suffixestype_func_suffixestype_math_macro_suffixestype_macrosr}   r`  z2.0Qr  r   r   z	1.0Q/2.0Qz
sinf128(x)Fr   zcosf128(2.0Q)r   z1.0Q/xrn  zconst _Float128 xzconst _Float128 x = M_PIf128&   )rk  rj  zconst _Float128 x = %sQ)rH   rY   nbitsnmantnexprC   rU   r5  r}   rr  	librariesrf  r   r1   r$   rK   rL   rI   rp   r   r   r   decimal_dig)r  p128r~  r  r  r  dcl5cru   ru   rv   test_C99CodePrinter_custom_type  s@   




"r  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   r   r   r   rM  r/  zA[0]z3*A[0]z
(A - B)[0])rm   rp   subs)r   r   rM  r   ru   ru   rv   test_MatrixElement_printing  s   r  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 )Nr   zz + M_Ezz + M_LOG2Er   z	z + M_LN2rD  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)rp   r   r(   rb   r+   r   r3   rg   ru   ru   ru   rv   test_ccode_math_macros&  s     r  c                   C   s(   t tddks
J t tdksJ d S )NrK  int)rp   rG   rZ   ru   ru   ru   rv   test_ccode_Type9     r  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tdtgdtdtdtgtt}t |dg dks~J d S )Nzthis is a commentz/* this is a comment */r   -z"while (fabs(x) > 1) {
   x -= 1;
}z{
   x += 1;
}rh  pwerzdouble pwer(double x)r   z*double pwer(double x){
   x = pow(x, 2);
}z%d %dhelloz%s %d)file
)zx;zprintf("%d %d", x, y);z%fprintf(stderr, "%s %d", "hello", y);zpwer(x);z	return x;)rp   r[   rN   r   r}   r=   rO   rE   rI   rK   rU   rQ   rR   r>   r\   rP   r   r^   r]   rS   rT   join)inp_xblockru   ru   rv   test_ccode_codegen_ast>  s(   
r  c                  C   s   t ttt t dksJ t ttt t dksJ td} t ttt tt|   dks2J tddd\}}}t|| }tt|| }t |dksQJ d S )	Nzz + x*yzz + (x + y)wz(w + z) + (x + y)zp q rTr   zexp(p + (q + r)))rp   r   r   r}   r   r   r   r(   )r  r   r0  r   q_rr   ru   ru   rv   test_ccode_UnevaluatedExpre  s   $r  c                   C   s(   t g ddks
J t ddksJ d S )N)r   r   r  z	{2, 3, 4}ro   ru   ru   ru   rv    test_ccode_array_like_containersq  r  r  N)
sympy.corer   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   sympy.core.relationalr   r   r   r   r   r   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   
sympy.setsr8   sympy.logicr9   r:   r;   sympy.codegenr<   r=   r>   sympy.testing.pytestr?   r@   sympy.printing.codeprinterrA   sympy.printing.crB   rC   rD   sympy.codegen.astrE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   sympy.codegen.cfunctionsr_   r`   ra   rb   rc   rd   re   rf   rg   sympy.codegen.cnodesrh   sympy.utilities.lambdifyri   sympy.tensorrj   rk   sympy.matricesrl   rm   rn   rp   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  r6  r:  rA  rC  rG  rH  rL  rS  rV  rX  rd  rg  r  r  r  r  r  r  r  r  ru   ru   ru   rv   <module>   s   T  |p,
	*/(			
< )'