o
    8Va|-                     @   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 d dl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  d dl!m"Z"m#Z# d dl$m%Z%m&Z&m'Z' d dl(m)Z) ed	\Z*Z+Z,d
d Z-dd Z.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4d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?d0d1 Z@d2d3 ZAd4d5 ZBd6d7 ZCd8d9 ZDd:d; ZEd<S )=    )SpioosymbolsRationalIntegerGoldenRatio
EulerGammaCatalanLambdaDummyEqNeLeLtGtGe)	PiecewisesincosAbsexpceilingsqrtsign)ITE)raises)implemented_functionIndexedBaseIdx)MatrixSymbolSparseMatrixMatrix	rust_codezx,y,zc                   C   s,   t tddks
J t tddksJ d S )N*   Z42iz-56)r%   r    r'   r'   @/usr/lib/python3/dist-packages/sympy/printing/tests/test_rust.pytest_Integer   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)	r%   r   xyr   r   r   r   r   r'   r'   r'   r(   test_Relational   s   r,   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 )N      z	3_f64/7.0   	   2iz
-3_f64/7.0zx + 3_f64/7.0z(3_f64/7.0)*x)r%   r   r*   r'   r'   r'   r(   test_Rational   s   r3   c                   C   sf   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s(J t t dks1J d S )Nzx + yzx - yzx*yzx/yz-x)r%   r*   r+   r'   r'   r'   r(   test_basic_ops(   s
   r4   c                  C   sH   G dd dt } t| tdksJ tddd}t|d 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	%s.fabs()r   )Z_printargs)selfZprinterr'   r'   r(   
_rust_code2   s   z)test_printmethod.<locals>.fabs._rust_codeN)__name__
__module____qualname__r7   r'   r'   r'   r(   fabs1   s    r;   zx.fabs()a   r-   )r   r   za[0])r   r%   r*   r!   )r;   r<   r'   r'   r(   test_printmethod0   s   r>   c                   C   sH   t tttt dksJ t ttdksJ t ttdks"J d S )Nzx.sin().powf(x.cos())zx.abs()x.ceil())r%   r   r*   r   absr   r'   r'   r'   r(   test_Functions9   s   rA   c                  C   sJ  t dt dks
J t td t td   krdks J  J t ttdks*J t ttj t td   kr>dksAJ  J t dtt dksMJ t ttj  t td   krbdkseJ  J t dt d	ksoJ t td t td   krd	ksJ  J t td d
ksJ t ttdd dksJ t dt dksJ t ttdksJ t td dksJ t ttd  dksJ t ttdd dksJ t	dt
tdt } t d| td ttt    td t  dksJ dd ddfdd ddfg}t td d|iddksJ t td d|iddks#J d S ) Nr=   z	x.recip()g      zx.sqrt()g      ?zx.sqrt().recip()g      z
PI.recip()zPI.sqrt().recip()r-   zx.cbrt()   zx.exp2()zx.exp()z	x.powi(3)zx.powf(y.powi(3))zx.powf(2_f64/3.0)gg      @z.(3.5*2*x).powf(-x + y.powf(x))/(x.powi(2) + y)c                 S   s   |j S N
is_integerbaser   r'   r'   r(   <lambda>V       ztest_Pow.<locals>.<lambda>Zdpowic                 S   s   |j  S rE   rF   rH   r'   r'   r(   rJ   W       powZPowZuser_functionsz
x.dpowi(3)g	@z
x.pow(3.2))r%   r*   r   r   ZHalfr   r   r   r+   r   r   )rD   Z_cond_cfuncr'   r'   r(   test_Pow?   s0   ,.0,*"rO   c                   C   s   t tdksJ t tdksJ t tjdksJ t t dks"J t tjdks+J t tjdks4J t tddks>J t tjdksGJ d S )NZPIZINFINITYZNEG_INFINITYZNANr=   E)	r%   r   r   r   ZInfinityZNegativeInfinityZNaNr   ZExp1r'   r'   r'   r(   test_constants\   s   rQ   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 )NrC   z*const GoldenRatio: f64 = %s;
2*GoldenRatio   z"const Catalan: f64 = %s;
2*Catalanz(const EulerGamma: f64 = %s;
2*EulerGamma)r%   r   evalfr
   r	   r'   r'   r'   r(   test_constants_otherg   s   "rT   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   rU   rV   r*   r+   zr'   r'   r'   r(   test_booleann   s   rX   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 dddd	ks*J t ttdk ftd td
k ftd df t dddksHJ t ddddksSJ t dddks]J dt ttdk ftd td
k ftd df  t dddks}J dt ttdk ftd td
k ftd df d  t dddksJ 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=   rC   Tz'if (x < 1) {
    x
} else {
    x + 2
}r	assign_toz,r = if (x < 1) {
    x
} else {
    x + 2
};)r[   inlinez$r = if (x < 1) { x } else { x + 2 };   )r\   z9if (x < 1) { x } else if (x < 5) { x + 1 } else { x + 2 }z>r = if (x < 1) { x } else if (x < 5) { x + 1 } else { x + 2 };zJr = if (x < 1) {
    x
} else if (x < 5) {
    x + 1
} else {
    x + 2
};z;2*if (x < 1) { x } else if (x < 5) { x + 1 } else { x + 2 }r&   z@2*if (x < 1) { x } else if (x < 5) { x + 1 } else { x + 2 } - 42r   c                      s   t  S rE   r$   r'   exprr'   r(   rJ      rL   z test_Piecewise.<locals>.<lambda>)r   r*   r%   r   r   
ValueErrorr'   r'   r^   r(   test_Piecewise|   s<   
(

,
0
,ra   c                  C   s.   t t tt t } t| tgddksJ d S )NZdereferencezx + y + (*z) + (*z).sin())r*   r+   r   rW   r%   r^   r'   r'   r(   test_dereference_printing   s   rc   c                  C   s   t tt } t| dksJ t| dddksJ t tt d } t| dks(J t| dddks2J t tt} t| dks@J d S )	Nzy*x.signum()rY   rZ   zr = y*x.signum();r&   z(x + y).signum() + 42zr = (x + y).signum() + 42;zx.cos().signum())r   r*   r+   r%   r   r^   r'   r'   r(   	test_sign   s   rd   c                  C   s   t d\} }t|}t|dksJ t||gddksJ t|dddks'J tt t|dd	 W d    d S 1 s=w   Y  d S )
Nzx ifz	if_.sin()rb   z(*if_).sin()Z_unreserved)Zreserved_word_suffixzif_unreserved.sin()T)Zerror_on_reserved)r   r   r%   r   r`   )r*   r+   r_   r'   r'   r(   test_reserved_words   s   
"re   c                  C   s$   t tdk tt} t| dksJ d S )Nr=   z#if (x < 1) {
    y
} else {
    z
})r   r*   r+   rW   r%   r^   r'   r'   r(   test_ITE   s   rf   c                  C   s   ddl m} m} ddlm} |ddd\}}}|d||d||d	|}}}| d
| }	t|	dks6J | d||f }
t|
dksFJ | d|||f }t|dksWJ d S )Nr   r   r   zn m oTintegerijkr*   zx[j]Az
A[m*i + j]BzB[m*o*i + o*j + k]sympy.tensorr   r    sympyr   r%   )r   r    r   nmorj   rk   rl   r*   rm   rn   r'   r'   r(   test_Indexed   s   "ru   c                  C   sL   t ddtd\} }td}td}t| |} t||  ||  ddks$J d S )Nzi mT)ri   clsr*   r+   rZ   z"for i in 0..m {
    y[i] = x[i];
})r   r   r   r    r%   )rj   rs   r*   r+   r'   r'   r(   test_dummy_loops   s   
rw   c                  C   s   ddl m} m} ddlm} |ddd\}}| d}| d}| d	}| d
}|d|}	|d|}
t||	|
f ||
  ||	 ddksDJ t||	|
f ||
  ||	  ||	  ||	 ddks`J d S )Nr   r   rg   zm nTrh   rm   r*   r+   rW   rj   rk   rZ   zrfor i in 0..m {
    y[i] = 0;
}
for i in 0..m {
    for j in 0..n {
        y[i] = A[n*i + j]*x[j] + y[i];
    }
}z|for i in 0..m {
    y[i] = x[i] + z[i];
}
for i in 0..m {
    for j in 0..n {
        y[i] = A[n*i + j]*x[j] + y[i];
    }
}ro   )r   r    r   rs   rr   rm   r*   r+   rW   rj   rk   r'   r'   r(   
test_loops   s   

.
rx   c                  C   s   ddl m} m} ddlm} |ddd\}}}}| d}| d}| d	}	|d
|}
|d|}|d|}|d|}t||||f ||
|||f  |	|
 dd|
| | | || |  ||  | || | ||  | f d kssJ d S )Nr   r   rg   zn m o pTrh   r<   br+   rj   rk   rl   lrZ   zfor i in 0..m {
    y[i] = 0;
}
for i in 0..m {
    for j in 0..n {
        for k in 0..o {
            for l in 0..p {
                y[i] = a[%s]*b[%s] + y[i];
            }
        }
    }
}ro   )r   r    r   rr   rs   rt   pr<   ry   r+   rj   rk   rl   rz   r'   r'   r(    test_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|}t|||||f |||||f  |	|||f  |
| d}|d|| | | || |  ||  | || | | || |  ||  | || | ||  | f d ksJ d S )Nr   r   rg   zm n o pTrh   r<   ry   cr+   rj   rk   rl   rz   rZ   zfor i in 0..m {
    y[i] = 0;
}
for i in 0..m {
    for j in 0..n {
        for k in 0..o {
            for l in 0..p {
                y[i] = (a[%s] + b[%s])*c[%s] + y[i];
r{   ro   )r   r    r   rs   rr   rt   r|   r<   ry   r~   r+   rj   rk   rl   rz   coder'   r'   r(   test_loops_addfactor$  s&   



:dr   c                   C   s   t tdd  d S )Nc                   S   s   t ttddS )NZgarbage)method)r%   r   r*   r'   r'   r'   r(   rJ   B  s    ztest_settings.<locals>.<lambda>)r   	TypeErrorr'   r'   r'   r(   test_settingsA  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*   rD   rC   z2*xz$const Catalan: f64 = %s;
2*x/CatalanrR   rm   rj   rr   Trh   r=   rZ   z8for i in 0..n {
    A[i] = (A[i] + 1)*(A[i] + 2)*A[i];
})r   r   r   r%   r
   rS   r   r    )r*   rD   rm   rj   r'   r'   r(   test_inline_functionE  s   
 r   c                  C   s   t ddd} t ddd}ddd d	d
fdd dd
fgd}tt| |ddks)J tt| |ddks5J tt||ddksAJ d S )Nr*   Frh   rr   TZceilc                 S   s   | j  S rE   rF   r*   r'   r'   r(   rJ   \  rL   z%test_user_functions.<locals>.<lambda>r;      c                 S   s   | j S rE   rF   r   r'   r'   r(   rJ   \  rK   r@   )r   r   rN   r?   zfabs(x)zabs(n))r   r%   r   r   )r*   rr   Zcustom_functionsr'   r'   r(   test_user_functionsW  s   r   c                   C   sX   t tg ddksJ tt t tg dg W d    d S 1 s%w   Y  d S )Nr=   rC   r-   z	[1, 2, 3])r%   r#   r   r`   r'   r'   r'   r(   test_matrixc  s   
"r   c                   C   s   dt tg dgv sJ d S )NzNot supported in Rustr   )r%   r"   r'   r'   r'   r(   test_sparse_matrixi  s   r   N)FZ
sympy.corer   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Zsympy.functionsr   r   r   r   r   r   r   r   Zsympy.logicr   Zsympy.testing.pytestr   Zsympy.utilities.lambdifyr   rp   r   r    Zsympy.matricesr!   r"   r#   rq   r%   r*   r+   rW   r)   r,   r3   r4   r>   rA   rO   rQ   rT   rX   ra   rc   rd   re   rf   ru   rw   rx   r}   r   r   r   r   r   r   r'   r'   r'   r(   <module>   sD   L (			(
 