U
    ZÊ¹jEy  ã                   @   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„ Z€dd„ Z�dd„ Z‚dd„ Zƒdd„ Z„dd„ Z…dd„ Z†d d!„ Z‡d"d#„ Zˆd$d%„ Z‰d&d'„ ZŠd(d)„ Z‹d*d+„ ZŒd,d-„ Z�d.d/„ ZŽd0d1„ Z�d2d3„ Z�d4d5„ Z‘d6d7„ Z’d8d9„ Z“d:d;„ Z”d<d=„ Z•d>d?„ Z–d@dA„ Z—dBdC„ Z˜dDdE„ Z™dFdG„ ZšdHdI„ Z›dJdK„ ZœdLdM„ Z�dNdO„ ZždPdQ„ ZŸdRdS„ Z dTdU„ Z¡dVdW„ Z¢dXdY„ Z£dZd[„ Z¤d\d]„ Z¥d^d_„ Z¦d`da„ Z§dbdc„ Z¨eEddde„ ƒZ©dfdg„ Zªdhdi„ Z«djdk„ Z¬dldm„ Z­dndo„ Z®dpdq„ Z¯drds„ Z°dtdu„ Z±dvdw„ Z²dxdy„ Z³dzS ){é    )Ú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$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© rt   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/printing/tests/test_c.pyÚ_ccode#   s    z%test_printmethod.<locals>.fabs._ccodeN)Ú__name__Ú
__module__Ú__qualname__rv   rt   rt   rt   ru   Úfabs"   s   rz   úfabs(x))r   rp   ÚxÚAssertionError)rz   rt   rt   ru   Ú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)ç      à?)rp   r3   r|   r}   rt   rt   rt   ru   Ú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sˆt‚t ttddƒ ƒdks¢t‚t ttddƒ ttid�dksÄt‚dd„ dfdd„ dfg}t td d|id�dksøt‚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�s’t‚t t	d tt
t	ttd!d"�d#d!d"�d!d"�ƒd$k�sÄt‚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(   rt   rt   ru   Ú<lambda>8   ó    z test_ccode_Pow.<locals>.<lambda>Zdpowic                 S   s   |j  S rˆ   r‰   r‹   rt   rt   ru   r�   9   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ƒ   rt   r‹   rt   rt   ru   r�   =   rŽ   c                 S   s   d| S )Nzexp2(%s)rt   r‹   rt   rt   ru   r�   =   rŽ   c                 S   s   | dkS r“   rt   r‹   rt   rt   ru   r�   >   rŽ   úexp2(x)z	pow(x, 2)éþÿÿÿF©Úevaluateéÿÿÿÿz
-2*x/(y*y))rp   r|   r}   Úyri   r   r   rU   rX   r   r   )r‚   Z_cond_cfuncZ_cond_cfunc2rt   rt   ru   Ú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)))rp   r-   r|   r}   rt   rt   rt   ru   Útest_ccode_MaxG   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   rp   Úcountr}   )Zbig_minZcurr_standardÚoutputrt   rt   ru   Útest_ccode_Min_performanceL   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sŒt‚d S )Nr„   ÚM_EZM_PIrœ   rž   ZHUGE_VALz	-HUGE_VALÚINFINITYr�   z	-INFINITYr†   ZM_PIl)rp   r(   r}   r   r   rU   rX   rt   rt   rt   ru   Útest_ccode_constants_mathhT   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)rp   r   Úevalfr}   r   r   rt   rt   rt   ru   Ú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s”t‚t tdd	ƒttid�dks²t‚t ttddƒ ƒdksÌt‚t ttddƒ ttid�dksît‚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é   é	   Ú2éùÿÿÿz-3.0/7.0z
-3.0L/7.0Léýÿÿÿzx + 3.0/7.0zx + 3.0L/7.0Lz(3.0/7.0)*xz(3.0L/7.0L)*x)rp   r   r}   rU   rX   r|   rt   rt   rt   ru   Útest_ccode_Rationale   s    "r±   c                   C   s,   t tdƒƒdkst‚t tdƒƒdks(t‚d S )NéC   Z67r˜   z-1)rp   r   r}   rt   rt   rt   ru   Útest_ccode_Integers   s    r³   c                   C   s    t ttƒttƒ ƒdkst‚d S )Nzpow(sin(x), cos(x)))rp   r1   r|   r$   r}   rt   rt   rt   ru   Útest_ccode_functionsx   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sÀt‚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   r©   rj   rk   )r|   r‚   rµ   r¶   rt   rt   ru   Útest_ccode_inline_function|   s    ÿÿ ÿr¼   c                	   C   sx   t ttƒdd�dkst‚ttƒ� t ttƒdd� W 5 Q R X ttƒ� t ttƒddd� W 5 Q R X t ttƒddd� d S )NÚC99rž   ú	tgamma(x)ÚC89F)rŸ   Zallow_unknown_functionsT)rp   r*   r|   r}   r?   rA   rt   rt   rt   ru   Ú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s€t‚td	ddd
�\}}t t||ƒƒdks¨t‚t t||d ƒƒdksÂt‚t tdddd�ƒdksÜt‚t tdddd� ƒdksøt‚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�s„t‚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¹   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) % 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   r   r6   r7   )ÚrÚsÚp1Zp2r·   rt   rt   ru   Ú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|› �ƒ|ƒ}q˜t|ddid�}d|ksÖt‚| 	d¡dksèt‚d S )Nr|   Fr¸   r·   TÚceilc                 S   s   | j  S rˆ   r‰   ©r|   rt   rt   ru   r�   ²   rŽ   z+test_ccode_user_functions.<locals>.<lambda>rz   c                 S   s   | j S rˆ   r‰   rÊ   rt   rt   ru   r�   ²   rŽ   Úabs)r#   r   r�   rÁ   r{   úabs(n)ÚaÚmuladdr   éd   r„   rƒ   Za99)
r   rp   r#   r}   r   r   r
   Úranger   r¢   )r|   r·   Zcustom_functionsÚexprrÎ   r¶   Úoutrt   rt   ru   Ú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s–t‚t ttB tB ƒd	ks®t‚t tt@ tB ƒd
ksÆt‚t ttB t@ ƒdksÞt‚t ttA ƒdksòt‚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)))
rp   r}   r   rÔ   rÕ   r|   r™   Úzr:   r;   rt   rt   rt   ru   Ú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s„t‚d S )Nzx == yzx != yzx <= yzx < yzx > yzx >= y)
rp   r   r|   r™   r}   r   r   r   r   r   rt   rt   rt   ru   Ú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sŠt‚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   rt   ©rÑ   rt   ru   r�     rŽ   z&test_ccode_Piecewise.<locals>.<lambda>)r/   r|   rp   r}   r1   r?   Ú
ValueErrorrt   rt   rÚ   ru   Ú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Ý   r|   rp   r}   )rÝ   rÑ   rt   rt   ru   Ú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s†t‚t |d	d
�dksšt‚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Ö   r$   )ÚprÑ   rt   rt   ru   Ú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   r|   r™   rÖ   rp   r}   rÚ   rt   rt   ru   Ú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|   rt   rt   rt   ru   r�   =  rŽ   z%test_ccode_settings.<locals>.<lambda>)r?   Ú	TypeErrorrt   rt   rt   ru   Ú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sšt‚|
 |	¡d|| | ||  |  ksÄt‚tddd�||f }|
 |¡dd| |  ksöt‚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�sˆt‚t|dd|f ƒdk�s¤t‚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   Z_print_Indexedr}   rp   )rÆ   r·   ÚmÚor¶   ræ   rç   r|   rµ   rè   rß   ZAbasert   rt   ru   Ú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 )Nr|   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])rp   rF   r}   rt   rt   rt   ru   Ú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s t‚d S )Nr’   r™   ré   r|   ÚDyr„   r¶   F)r»   Zcontractz&Dy[i] = (y[%s] - y[i])/(x[%s] - x[i]);)rj   rk   r   rp   ÚrhsÚlhsr}   )Zlen_yr™   r|   rö   r¶   ÚeZcode0rt   rt   ru   Ú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sxt‚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æ   rÆ   rt   rt   ru   Ú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\t‚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];
})ZicountZmcountrº   )r   r   rj   rk   ÚlabelZdummy_indexrp   r}   )r¶   rð   r|   r™   Úexpectedrt   rt   ru   Ú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s�t‚d S )Nrû   Tr¸   rµ   r|   r™   rÖ   r¶   ræ   z‡for (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Æ   rt   rt   ru   Ú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sÎt‚d S )Nún m o pTr¸   rÍ   Úbr™   r¶   ræ   rç   ÚlzÅfor (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Æ   rt   rt   ru   Ú&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  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++){
      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Æ   rt   rt   ru   Ú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�s¨t‚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s3rt   rt   ru   Ú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)))r|   r™   r1   rÖ   rp   r}   rÚ   rt   rt   ru   Ú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s�t‚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ô   z�M[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}   r$   r3   )Zmatrµ   rÑ   r  r  rð   rt   rt   ru   Útest_Matrix_printing  s$    ,ÿ
6ÿ$þÿr  c                	   C   sR   t tƒ� ttdddggƒƒ W 5 Q R X dtddiƒ tdddggƒ¡ksNt‚d S )Nr„   rƒ   r�   zNot supported in CÚstrictF)r?   rA   rp   rn   rB   Údoprintr}   rt   rt   rt   ru   Útest_sparse_matrix;  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Û   rp   r}   )r|   r™   rt   rt   ru   Ú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sZt‚t| dƒd| kspt‚t|ƒ|ks€t‚t|ƒ|ks�t‚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   r}   )Zexpr1Zref1Zexpr2Zref2Zexpr3Zref3rt   rt   ru   Útest_ccode_signM  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;)rp   r>   r|   r™   rÖ   r}   r=   rt   rt   rt   ru   Útest_ccode_AssignmentV  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<   r|   r8   r=   r™   rp   r}   )Úfrt   rt   ru   Útest_ccode_For[  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))))rp   r-   r|   r}   r.   r3   rt   rt   rt   ru   Útest_ccode_Max_Mina  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   )rp   r_   r|   r}   r   Úfloatrt   rt   rt   ru   Útest_ccode_standardh  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)rB   Úlanguager}   rŸ   Úreserved_words)Z
c89printerrt   rt   ru   Útest_C89CodePrintern  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s–t‚t ƒ  ttƒ¡dks®t‚t ƒ  ttt	ƒ¡dksÈt‚t ƒ  ttƒ¡d	ksàt‚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½   rh   Úusing)rC   r  r_   r|   r}   r`   ra   rb   rc   r™   rÖ   rd   re   rf   r,   r-   r.   r'  rŸ   r(  )Z
c99printerrt   rt   ru   Útest_C99CodePrinterv  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))rC   rU   rX   r  r1   r|   r	   r}   )Úf80_printerrt   rt   ru   Ú"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sœt	‚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ƒ q²d 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Úupperr}   )rÑ   Úref©rs   Úsuffixrt   ru   Ú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   r  r1   r|   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ß   Zf32_printerZf64_printerr,  r4  rt   r2  ru   Ú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)rD   r(   r}   rg   )Úmacrosrt   rt   ru   Ú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s¦t‚| |¡dks¸t‚d|jksÆt‚t ddd�}	tj|	tthd�}
t|
ƒ}t|ƒdksüt‚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   rK   rG   Z	from_exprrI   rp   r}   r|   rV   rL   Zas_Declarationr   r™   rB   Úheadersr  rJ   ZdeducedrM   rh   Úsymbolr;  r<  )r¶   Zvar1Zdcl1Zvar2Zdcl2aZdcl2bZvar3Zdcl3rs   r?  Zptr4Zdcl4Úvar5Údcl5aÚvar5bÚdcl5brt   rt   ru   Ú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s‚t	‚|j
rŒt	‚|jr–t	‚|jd	hks¦t	‚| td
dƒ¡dks¾t	‚| ttƒ¡dksÔt	‚| tddd�¡dksît	‚| 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�sžt	‚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_macrosr|   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)rH   rY   ÚnbitsZnmantZnexprC   rU   r  r|   r}   rA  Ú	librariesr8  r   r1   r$   rK   rL   rI   rp   r   r   r©   Zdecimal_dig)rI  Zp128rC  rD  rE  rF  Zdcl5crt   rt   ru   Ú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])rm   rp   r}   Úsubs)rµ   rè   r$  rë   rt   rt   ru   Ú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s€t‚t tt ƒdks”t‚t ttd  ƒd	ks¬t‚t ttd
  ƒdksÄt‚t tdt  ƒdksÜt‚t tdt  ƒdksôt‚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�s‚t‚t tdtdƒ  ƒdk�s t‚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)	rp   rÖ   r(   r}   rb   r+   r   r3   rg   rt   rt   rt   ru   Ú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)rp   rG   r}   rZ   rt   rt   rt   ru   Útest_ccode_Type9  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s‚t‚t ttd| gtttd
 ƒgƒƒdksªt‚tttttgdƒttdƒtgdtd�tdtgƒttƒƒ}t |ƒd dddddg¡k�st‚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 %dZ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[   r}   rN   rË   r|   r=   rO   rE   rI   rK   rU   rQ   rR   r>   r\   rP   r™   r^   r]   rS   rT   Újoin)Zinp_xÚblockrt   rt   ru   Útest_ccode_codegen_ast>  s4    ÿÿÿ
û
ûrY  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s¢t‚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(   )rZ  rß   r  rÅ   Zq_rrÑ   rt   rt   ru   Útest_ccode_UnevaluatedExpre  s    $r[  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ô   )rp   r}   rt   rt   rt   ru   Ú test_ccode_array_like_containersq  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.codeprinterrA   Zsympy.printing.crB   rC   rD   Z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^   Zsympy.codegen.cfunctionsr_   r`   ra   rb   rc   rd   re   rf   rg   Zsympy.codegen.cnodesrh   Zsympy.utilities.lambdifyri   Zsympy.tensorrj   rk   Z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  r  r  r  r  r  r  r   r#  r)  r+  r-  r7  r9  rG  rN  rP  rQ  rS  rY  r[  r\  rt   rt   rt   ru   Ú<module>   sŠ   T |p,
	*/(			
< )'