o
    8Va7                     @   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 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 d dlmZ d dlmZ d dl m!Z!m"Z"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) d d	l*m+Z+m,Z, d d
l-m.Z.m/Z/ d dl0m1Z1 ed\Z2Z3Z4dd Z5dd Z6dd Z7dd Z8dd Z9dd Z:dd Z;dd Z<dd Z=dd  Z>d!d" Z?d#d$ Z@d%d& ZAd'd( ZBd)d* ZCd+d, ZDd-d. ZEd/d0 ZFd1d2 ZGd3d4 ZHd5d6 ZId7d8 ZJd9d: ZKd;d< ZLd=d> ZMd?d@ ZNdAdB ZOdCdD ZPdEdF ZQdGdH ZRdIdJ ZSdKdL ZTdMdN ZUdOS )P    )SpiooSymbolsymbolsRationalIntegerGoldenRatio
EulerGammaCatalanLambdaDummyEq)	PiecewisesincosAbsexpceilingsqrtgammasignMaxMin	factorialbeta)Range)ITE)For
aug_assign
Assignment)raises)RCodePrinter)implemented_functionIndexedBaseIdx)MatrixMatrixSymbol)rcodez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abs(%s)r   )Z_printargs)selfZprinter r,   A/usr/lib/python3/dist-packages/sympy/printing/tests/test_rcode.py_rcode   s   z%test_printmethod.<locals>.fabs._rcodeN)__name__
__module____qualname__r.   r,   r,   r,   r-   fabs   s    r2   abs(x))r   r)   x)r2   r,   r,   r-   test_printmethod   s   r5   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)      ?)r)   r   r4   r,   r,   r,   r-   test_rcode_sqrt      r7   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 dd dfdd dfg}t td d|iddkskJ t td d|iddksyJ d S )N   zx^3zx^(y^3)g      g      @z(3.5*2*x)^(-x + y^x)/(x^2 + y)g      z1.0/xzx^(2.0/3.0)c                 S   s   |j S N
is_integerbaser   r,   r,   r-   <lambda>)       z test_rcode_Pow.<locals>.<lambda>Zdpowic                 S   s   |j  S r=   r>   r@   r,   r,   r-   rB   *       powPowZuser_functionszdpowi(x, 3)g	@zpow(x, 3.2))r)   r4   yr#   r   r   )r:   Z_cond_cfuncr,   r,   r-   test_rcode_Pow!   s   *

 rI   c                   C   s(   t tttt dddddksJ d S )NZmy_maxZmy_pow)r   rF   rG   zmy_max(x, my_pow(x, 2)))r)   r   r4   r,   r,   r,   r-   test_rcode_Max0   s   (rJ   c                   C   sJ   t tddks
J t tdksJ t tdksJ t t dks#J d S )Nr<   zexp(1)r   ZInfz-Inf)r)   r   r   r   r,   r,   r,   r-   test_rcode_constants_mathh4   s   rK   c                   C   s@   t dt dks
J t dt dksJ t dt dksJ d S )Nr;   z-GoldenRatio = 1.61803398874989;
2*GoldenRatioz&Catalan = 0.915965594177219;
2*Catalanz,EulerGamma = 0.577215664901533;
2*EulerGamma)r)   r	   r   r
   r,   r,   r,   r-   test_rcode_constants_other;   s   rL   c                   C   s   t tdddksJ t tdddksJ t tdddks!J t td	ddks,J t ttdd d
ks9J t tddt dksFJ d S )Nr9      z3.0/7.0   	   2iz-3.0/7.0zx + 3.0/7.0z(3.0/7.0)*x)r)   r   r4   r,   r,   r,   r-   test_rcode_RationalB   s   rR   c                   C   s,   t tddks
J t tddksJ d S )NC   Z67z-1)r)   r   r,   r,   r,   r-   test_rcode_IntegerK   s   rU   c                   C   s^   t tttt dksJ t tttt dksJ t ttttt	ttdks-J d S )Nzsin(x)^cos(x)zfactorial(x) + gamma(y)zbeta(min(x, y), max(x, y)))
r)   r   r4   r   r   r   rH   r   r   r   r,   r,   r,   r-   test_rcode_functionsP   s   &rV   c                  C   s   t d} tdt| d|  }t|| dksJ tdt| d|  t }t|| dt  ks2J td}tdt dd	d
}tdt| | d|   d|   }t||| || d}d}||kscJ d S )Nr4   r:   r;   z2*xzCatalan = %s;
2*x/CatalanAinTintegerr<   	assign_toz7for (i in 1:n){
   A[i] = (A[i] + 1)*(A[i] + 2)*A[i];
})r   r#   r   r)   r   rY   r%   r&   )r4   r:   rW   rX   resrefr,   r,   r-   test_rcode_inline_functionV   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 d S )Nz
ceiling(x)r3   zgamma(x))r)   r   r4   r   r   r,   r,   r,   r-   test_rcode_exceptionsi   r8   ra   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 )Nr4   FrZ   rY   TZmyceilc                 S   s   | j  S r=   r>   r4   r,   r,   r-   rB   t   rD   z+test_rcode_user_functions.<locals>.<lambda>r2   c                 S   s   | j S r=   r>   rb   r,   r,   r-   rB   t   rC   abs)r   r   rG   z	myceil(x)zfabs(x)zabs(n))r   r)   r   r   )r4   rY   Zcustom_functionsr,   r,   r-   test_rcode_user_functionso   s   rd   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))r)   r   trueZfalser4   rH   zr,   r,   r,   r-   test_rcode_boolean{   s   ri   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   rk   rl   rm   rn   ro   r)   r4   rH   rj   r,   r,   r-   test_rcode_Relational   s    rq   c                  C   s   t ttdk ftd df} t| }d}||ksJ td}t| |}d}||ks*J dt ttdk ftd tdk ftd df } t| dksHJ t| d	d
}|dksTJ dt ttdk ftd tdk f } t| dksmJ d S )Nr<   r;   Tzifelse(x < 1,x,x^2)tauztau = ifelse(x < 1,x,x^2);r9   z'2*ifelse(x < 1,x,ifelse(x < 2,x^2,x^3))cr\   z,c = 2*ifelse(x < 1,x,ifelse(x < 2,x^2,x^3));z&2*ifelse(x < 1,x,ifelse(x < 2,x^2,NA)))r   r4   r)   r   )exprr^   r_   rr   r,   r,   r-   test_rcode_Piecewise   s   
,"ru   c                  C   s0   ddl m}  | t}t|}d}||ksJ d S )Nr   )sinczifelse(x != 0,sin(x)/x,1))rp   rv   r4   r)   )rv   rt   r^   r_   r,   r,   r-   test_rcode_sinc   s
   rw   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sGJ d	}t |d
d} | |ksUJ d S )Nr;   r<   Tz)2*ifelse(x < 1,x,ifelse(x < 2,x + 1,x^2))r   r6   )r<   Tz4x^2 + x*y*z + y^2 + ifelse(x < 0.5,0,1) + cos(z) - 1z9c = x^2 + x*y*z + y^2 + ifelse(x < 0.5,0,1) + cos(z) - 1;rs   r\   )r)   r   r4   rH   rh   r   )prt   r_   r,   r,   r-   test_rcode_Piecewise_deep   s   0:ry   c                  C   s,   t tdk tt} t| }d}||ksJ d S )Nr<   zifelse(x < 1,y,z))r   r4   rH   rh   r)   )rt   rx   r_   r,   r,   r-   test_rcode_ITE   s   rz   c                   C   s   t tdd  d S )Nc                   S   s   t ttddS )NZgarbage)method)r)   r   r4   r,   r,   r,   r-   rB      s    z%test_rcode_settings.<locals>.<lambda>)r!   	TypeErrorr,   r,   r,   r-   test_rcode_settings   s   r}   c                  C   s   ddl m} m} ddlm} |ddd\}}}|d||d||d	|}}}t }	t |	_| d
| }
|	|
dks>J | d||f }|	|dksOJ | d|||f }|	|dksaJ |	jt ksiJ d S )Nr   r$   r   zn m oTrZ   rX   jkr4   zx[j]rW   zA[i, j]Bz
B[i, j, k])	sympy.tensorr%   r&   rp   r   r"   setZ_not_rZ_print_Indexed)r%   r&   r   rY   morX   r   r   rx   r4   rW   r   r,   r,   r-   test_rcode_Indexed   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 )N   rH   )shaper4   Dyr<   rX   F)r]   Zcontractz&Dy[i] = (y[%s] - y[i])/(x[%s] - x[i]);)r%   r&   r   r)   ZrhsZlhs)Zlen_yrH   r4   r   rX   eZcode0r,   r,   r-   2test_rcode_Indexed_without_looking_for_contraction   s   2 r   c            	      C   sp   t ddd\} }td}td}td}td|}td| }d	}t|||f ||  || d
}||ks6J d S )Nn mTrZ   rW   r4   rH   rX   r   zjfor (i in 1:m){
   y[i] = 0;
}
for (i in 1:m){
   for (j in 1:n){
      y[i] = A[i, j]*x[j] + y[i];
   }
}r\   )r   r%   r&   r)   )	rY   r   rW   r4   rH   rX   r   srs   r,   r,   r-   test_rcode_loops_matrix_vector   s   

 
r   c                  C   sd   t ddtd\} }td}td}t| |} d| jj|jd }t||  ||  d}||ks0J d S )	Nzi mT)r[   clsr4   rH   zMfor (i_%(icount)i in 1:m_%(mcount)i){
   y[i_%(icount)i] = x[i_%(icount)i];
})ZicountZmcountr\   )r   r   r%   r&   ZlabelZdummy_indexr)   )rX   r   r4   rH   Zexpectedcoder,   r,   r-   test_dummy_loops   s   
r   c                  C   s   ddl m} m} ddlm} |ddd\}}| d}| d}| d	}| d
}|d|}	|d|}
d}t||	|
f ||
  ||	  ||	  ||	 d}||ksPJ d S )Nr   r$   r~   r   TrZ   rW   r4   rH   rh   rX   r   ztfor (i in 1:m){
   y[i] = x[i] + z[i];
}
for (i in 1:m){
   for (j in 1:n){
      y[i] = A[i, j]*x[j] + y[i];
   }
}r\   r   r%   r&   rp   r   r)   )r%   r&   r   rY   r   rW   r4   rH   rh   rX   r   r   rs   r,   r,   r-   test_rcode_loops_add  s   

0
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 ||
|||f  |	|
 d}||ksUJ d S )Nr   r$   r~   n m o pTrZ   abrH   rX   r   r   lzfor (i in 1:m){
   y[i] = 0;
}
for (i in 1:m){
   for (j in 1:n){
      for (k in 1:o){
         for (l in 1:p){
            y[i] = a[i, j, k, l]*b[j, k, l] + y[i];
         }
      }
   }
}r\   r   )r%   r&   r   rY   r   r   rx   r   r   rH   rX   r   r   r   r   rs   r,   r,   r-   &test_rcode_loops_multiple_contractions%  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|}d}t|||||f |||||f  |	|||f  |
| d}	|	|ksaJ d S )Nr   r$   r~   r   TrZ   r   r   rs   rH   rX   r   r   r   zfor (i in 1:m){
   y[i] = 0;
}
for (i in 1:m){
   for (j in 1:n){
      for (k in 1:o){
         for (l in 1:p){
            y[i] = (a[i, j, k, l] + b[i, j, k, l])*c[j, k, l] + y[i];
         }
      }
   }
}r\   r   )r%   r&   r   rY   r   r   rx   r   r   rs   rH   rX   r   r   r   r   r,   r,   r-   test_rcode_loops_addfactorC  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}d}d}d}t|| |||f  || |||f   || ||  |	|||f   |
| d}	t }|| | |d d  |d< || | |d d  |d< || | |d d  |d< || | |d d  |d< || | |d d  |d< || | |d d  |d< |	|d ks|	|d ks|	|d ks|	|d ks|	|d ks|	|d ksJ d S d S d S d S d S d S )Nr   r$   r~   r   TrZ   r   r   rs   rH   rX   r   r   zfor (i in 1:m){
   y[i] = 0;
}
zufor (i in 1:m){
   for (j in 1:n){
      for (k in 1:o){
         y[i] = b[j]*b[k]*c[i, j, k] + y[i];
      }
   }
}
zLfor (i in 1:m){
   for (k in 1:o){
      y[i] = a[i, k]*b[k] + y[i];
   }
}
zLfor (i in 1:m){
   for (j in 1:n){
      y[i] = a[i, j]*b[j] + y[i];
   }
}
r\   rT   r<   r;   r9      r   )r   r%   r&   rp   r   r)   dict)r%   r&   r   rY   r   r   rx   r   r   rs   rH   rX   r   r   Zs0s1s2Zs3r_   r,   r,   r-   test_rcode_loops_multiple_termsb  sN   



J




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)))r4   rH   r   rh   r)   )rt   r,   r,   r-   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sLJ 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   TrW   r9   r<   z8A[0] = x*y;
A[1] = ifelse(y > 0,x + 2,y);
A[2] = sin(z);)r;   r   )r<   r   r   r   z,ifelse(x > 0,2*A[2],A[2]) + sin(A[1]) + A[0]qr   M)r9   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'   r4   rH   r   r   rh   r(   r)   r   r   )ZmatrW   rx   rt   r   r   r   r,   r,   r-   test_Matrix_printing  s$   ,
6$r   c                  C   s   t tt } t| dksJ t| d}|dksJ tt dt td  t td  }|dks1J t tt} t| }|dksAJ d S )Nz	y*sign(x)rh   zz = y*sign(x);r;   zx^2 + x*sign(x^2 + 2*x)zsign(cos(x)))r   r4   rH   r)   r   )rt   rx   r,   r,   r-   test_rcode_sgn  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;)r)   r    r4   rH   rh   r   r,   r,   r,   r-   test_rcode_Assignment  s    r   c                  C   s6   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   r4   r   r   rH   r)   )fZsolr,   r,   r-   test_rcode_For  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 )
NrW   r<   r9   r   Cr   zA[0]z3*A[0]z
(A - B)[0])r(   r)   Zsubs)rW   r   r   Fr,   r,   r-   test_MatrixElement_printing  s   r   N)VZ
sympy.corer   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   Z
sympy.setsr   Zsympy.logicr   Zsympy.codegenr   r   r    Zsympy.testing.pytestr!   Zsympy.printing.rcoder"   Zsympy.utilities.lambdifyr#   r   r%   r&   Zsympy.matricesr'   r(   rp   r)   r4   rH   rh   r5   r7   rI   rJ   rK   rL   rR   rU   rV   r`   ra   rd   ri   rq   ru   rw   ry   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r,   r,   r,   r-   <module>   sZ   < <	
;!