U
    9%e5                     @   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 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! 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
l0m1Z1m2Z2 d dl3m4Z4m5Z5 d dl,m6Z6 ed\Z7Z8Z9d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&d' ZFd(d) ZGd*d+ ZHd,d- ZId.d/ ZJd0d1 ZKd2d3 ZLd4d5 ZMd6d7 ZNd8d9 ZOd:d; ZPd<d= ZQd>d? ZRd@dA ZSdBdC ZTdDdE ZUdFdG ZVdHdI ZWdJdK ZXdLdM ZYdNdO ZZdPS )Q    )SpiooSymbolsymbolsRationalIntegerGoldenRatio
EulerGammaCatalanLambdaDummy)	PiecewisesincosAbsexpceilingsqrtgammasignMaxMin	factorialbeta)EqGeGtLeLtNe)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$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abs(%s)r   )Z_printargs)selfprinter r1   ^/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sympy/printing/tests/test_rcode.py_rcode   s    z%test_printmethod.<locals>.fabs._rcodeN)__name__
__module____qualname__r3   r1   r1   r1   r2   fabs   s   r7   abs(x))r   r-   xAssertionError)r7   r1   r1   r2   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)      ?)r-   r   r9   r:   r1   r1   r1   r2   test_rcode_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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st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   r1   r1   r2   <lambda>*       z test_rcode_Pow.<locals>.<lambda>Zdpowic                 S   s   |j  S rB   rC   rE   r1   r1   r2   rG   +   rH   powPowZuser_functionszdpowi(x, 3)g	@zpow(x, 3.2))r-   r9   r:   yr(   r   r   )r?   Z_cond_cfuncr1   r1   r2   test_rcode_Pow"   s    *

rM   c                   C   s(   t tttt dddddks$td S )NZmy_maxZmy_pow)r   rJ   rK   zmy_max(x, my_pow(x, 2)))r-   r   r9   r:   r1   r1   r1   r2   test_rcode_Max0   s    rN   c                   C   sJ   t tddkstt tdks$tt tdks4tt t dksFtd S )NrA   zexp(1)r   ZInfz-Inf)r-   r   r:   r   r   r1   r1   r1   r2   test_rcode_constants_mathh5   s    rO   c                   C   s@   t dt dkstt dt dks(tt dt dks<td S )Nr@   z-GoldenRatio = 1.61803398874989;
2*GoldenRatioz&Catalan = 0.915965594177219;
2*Catalanz,EulerGamma = 0.577215664901533;
2*EulerGamma)r-   r	   r:   r   r
   r1   r1   r1   r2   test_rcode_constants_other<   s    rP   c                   C   s   t tdddkstt tdddks,tt tdddksBtt td	ddksXtt ttdd d
ksrtt tddt dkstd S )Nr>      z3.0/7.0   	   2iz-3.0/7.0zx + 3.0/7.0z(3.0/7.0)*x)r-   r   r:   r9   r1   r1   r1   r2   test_rcode_RationalC   s    rV   c                   C   s,   t tddkstt tddks(td S )NC   Z67z-1)r-   r   r:   r1   r1   r1   r2   test_rcode_IntegerL   s    rY   c                   C   s^   t tttt dkstt tttt dks8tt tt	ttt
ttdksZtd S )Nzsin(x)^cos(x)zfactorial(x) + gamma(y)zbeta(min(x, y), max(x, y)))r-   r   r9   r   r:   r   r   rL   r   r   r   r1   r1   r1   r2   test_rcode_functionsQ   s    rZ   c                  C   s   t d} tdt| d|  }t|| dks0ttdt| d|  t }t|| dt  ksdttd}tdt dd	d
}tdt| | d|   d|   }t||| || d}d}||kstd S )Nr9   r?   r@   z2*xzCatalan = %s;
2*x/CatalanAinTintegerrA   	assign_toz7for (i in 1:n){
   A[i] = (A[i] + 1)*(A[i] + 2)*A[i];
})	r   r(   r   r-   r:   r   r]   r)   r*   )r9   r?   r[   r\   resrefr1   r1   r2   test_rcode_inline_functionW   s     
 rd   c                   C   s@   t ttdkstt ttdks(tt ttdks<td S )Nz
ceiling(x)r8   zgamma(x))r-   r   r9   r:   r   r   r1   r1   r1   r2   test_rcode_exceptionsj   s    re   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d S )Nr9   Fr^   r]   TZmyceilc                 S   s   | j  S rB   rC   r9   r1   r1   r2   rG   u   rH   z+test_rcode_user_functions.<locals>.<lambda>r7   c                 S   s   | j S rB   rC   rf   r1   r1   r2   rG   u   rH   abs)r   r   rK   z	myceil(x)zfabs(x)zabs(n))r   r-   r   r:   r   )r9   r]   Zcustom_functionsr1   r1   r2   test_rcode_user_functionsp   s    rh   c                   C   s   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d S )NTTrueFFalsezx & yzx | yz!xz	x & y & zz	x | y | zz	z | x & yzz & (x | y))r-   r:   r   truefalser9   rL   zr1   r1   r1   r2   test_rcode_boolean|   s    rn   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)
r-   r   r9   rL   r:   r    r   r   r   r   r1   r1   r1   r2   test_rcode_Relational   s    ro   c                  C   s   t ttdk ftd df} t| }d}||ks2ttd}t| |}d}||ksTtdt ttdk ftd tdk ftd df } t| dkstt| d	d
}|dkstdt ttdk ftd tdk f } t| dkstd S )NrA   r@   Tzifelse(x < 1,x,x^2)tauztau = ifelse(x < 1,x,x^2);r>   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   r9   r-   r:   r   )exprrb   rc   rp   r1   r1   r2   test_rcode_Piecewise   s    
,"rs   c                  C   s0   ddl m}  | t}t|}d}||ks,td S )Nr   )sinczifelse(x != 0,sin(x)/x,1))Z(sympy.functions.elementary.trigonometricrt   r9   r-   r:   )rt   rr   rb   rc   r1   r1   r2   test_rcode_sinc   s
    ru   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d	}t |d
d} | |kstd S )Nr@   rA   Tz)2*ifelse(x < 1,x,ifelse(x < 2,x + 1,x^2))r   r<   )rA   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;rq   r`   )r-   r   r9   r:   rL   rm   r   )prr   rc   r1   r1   r2   test_rcode_Piecewise_deep   s    0:rw   c                  C   s,   t tdk tt} t| }d}||ks(td S )NrA   zifelse(x < 1,y,z))r"   r9   rL   rm   r-   r:   )rr   rv   rc   r1   r1   r2   test_rcode_ITE   s    rx   c                   C   s   t tdd  d S )Nc                   S   s   t ttddS )Ngarbage)method)r-   r   r9   r1   r1   r1   r2   rG      rH   z%test_rcode_settings.<locals>.<lambda>)r&   	TypeErrorr1   r1   r1   r2   test_rcode_settings   s    r|   c            
      C   s   t ddd\} }}td| td|td|  }}}t }t |_td| }||dks`ttd	||f }||d
ksttd|||f }	||	dkst|jt kstd S )Nzn m oTr^   r\   jkr9   zx[j]r[   zA[i, j]Bz
B[i, j, k])r   r*   r'   setZ_not_rr)   Z_print_Indexedr:   )
r]   mor\   r}   r~   rv   r9   r[   r   r1   r1   r2   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std S )N   rL   )shaper9   DyrA   r\   F)ra   Zcontractz&Dy[i] = (y[%s] - y[i])/(x[%s] - x[i]);)r)   r*   r   r-   rhslhsr:   )Zlen_yrL   r9   r   r\   eZcode0r1   r1   r2   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sltd S )Nn mTr^   r[   r9   rL   r\   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-   r:   )	r]   r   r[   r9   rL   r\   r}   srq   r1   r1   r2   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s`td S )	Nzi mT)r_   clsr9   rL   zMfor (i_%(icount)i in 1:m_%(mcount)i){
   y[i_%(icount)i] = x[i_%(icount)i];
})ZicountZmcountr`   )r   r   r)   r*   labelZdummy_indexr-   r:   )r\   r   r9   rL   expectedcoder1   r1   r2   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
}t|||f ||  ||  ||  || d}	|	|kstd S )Nr   Tr^   r[   r9   rL   rm   r\   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   r[   r9   rL   rm   r\   r}   r   rq   r1   r1   r2   test_rcode_loops_add
  s    


0r   c                  C   s   t ddd\} }}}td}td}td}td|}td| }td	|}	td
|}
d}t|||	|
f ||||	|
f  || d}||kstd S )Nn m o pTr^   abrL   r\   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   rv   r   r   rL   r\   r}   r~   r   r   rq   r1   r1   r2   &test_rcode_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}t|||	|
|f |||	|
|f  ||	|
|f  || d}||kstd S )Nr   Tr^   r   r   rq   rL   r\   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   rv   r   r   rq   rL   r\   r}   r~   r   r   r1   r1   r2   test_rcode_loops_addfactor=  s    



: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}t||	 |||	f  ||
 |||
f   ||	 ||
  |||	|
f   || d}i }|| | |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std S )Nr   Tr^   r   r   rq   rL   r\   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`   rX   r   rA   r@   r>      r   r   )r]   r   r   rv   r   r   rq   rL   r\   r}   r~   s0s1s2Zs3rc   r1   r1   r2   test_rcode_loops_multiple_termsZ  sL    



D 




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)))r9   rL   r   rm   r-   r:   )rr   r1   r1   r2   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sNt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>   rA   z8A[0] = x*y;
A[1] = ifelse(y > 0,x + 2,y);
A[2] = sin(z);)r@   r   )rA   r   r   r   z,ifelse(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;)r+   r9   rL   r   r   rm   r,   r-   r:   r   r   )matr[   rv   rr   r   r   r   r1   r1   r2   test_Matrix_printing  s$    ,
6$r   c                  C   s   t tt } t| dkstt| d}|dks2ttt dt td  t td  }|dksbtt tt} t| }|dkstd S )Nz	y*sign(x)rm   zz = y*sign(x);r@   zx^2 + x*sign(x^2 + 2*x)zsign(cos(x)))r   r9   rL   r-   r:   r   )rr   rv   r1   r1   r2   test_rcode_sgn  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;)r-   r%   r9   rL   rm   r:   r$   r1   r1   r1   r2   test_rcode_Assignment  s    r   c                  C   s6   t ttdddttdtg} t| }|dks2td S )Nr   
   r@   *z.for(x in seq(from=0, to=9, by=2){
   y *= x;
})r#   r9   r!   r$   rL   r-   r:   )fZsolr1   r1   r2   test_rcode_For  s    r   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[   rA   r>   r   Cr   zA[0]z3*A[0]z
(A - B)[0])r,   r-   r:   subs)r[   r   r   Fr1   r1   r2   test_MatrixElement_printing  s    r   N)[Z
sympy.corer   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.core.relationalr   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(   Zsympy.tensorr)   r*   Zsympy.matricesr+   r,   r-   r9   rL   rm   r;   r=   rM   rN   rO   rP   rV   rY   rZ   rd   re   rh   rn   ro   rs   ru   rw   rx   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   <module>   sZ   8< 		9