a
    khB                     @   s  d dl Z d dlmZ d dlmZ d dlmZ d dl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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*m+Z+m,Z,m-Z-m.Z. d d	l/m0Z0m1Z1 d d
l2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD d dlCmEZE ed ZFZGeGrd dlHZHdeHjId< e;dddZJe;dddZKe;dddZLe;dddZMed\ZNZOZPZQeFdurdd eRd ddD ZSeFTeSZUe3eSZVd?ddZWd@d d!ZXd"d# ZYd$d% fd&d'ZZd(d% fd)d*Z[d+d, Z\eEd-d. Z]d/d0 Z^d1d2 Z_eEd3d4 Z`d5d6 Zad7d8 Zbd9d: Zcd;d< Zdd=d> ZedS )A    N)
Derivative)symbols)	Piecewise)ArrayTensorProductArrayAddPermuteDimsArrayDiagonal)EqNeGeGtLeLt)import_module)Absceilingexpfloorsignsinasinsqrtcosacostanatanatan2coshacoshsinhasinhtanhatanhreimargerfloggammalog)isnanisinf)Matrix
MatrixBaseeye
randMatrix)DeterminantHadamardProductInverseMatrixSymbolTrace)tensorflow_code)convert_matrix_to_array)lambdify)skip)XFAIL
tensorflow2ZTF_CPP_MIN_LOG_LEVELM   NPQzx y z tc                 C   s   g | ]}t t||d  qS )r<   )listrange.0i rE   R/var/www/auris/lib/python3.9/site-packages/sympy/printing/tests/test_tensorflow.py
<listcomp>(       rG   	   Fc           
      C   s  t | |d}|s dd | D }ndd | D }t }d }| < dd |D }tjjj|d}||| }W d    n1 s0    Y  |t	t
| |}	|	 }	|	jrt|	ts|	 }	|	 }	|s||	k sJ n:dd |D }dd |	D }	td	d
 t
||	D sJ d S )Nr9   c                 S   s   g | ]}t |j|jqS rE   r.   rowscolsrC   vrE   rE   rF   rG   0   rH   z._compare_tensorflow_matrix.<locals>.<listcomp>c                 S   s   g | ]}t |j|jd  qS )g      Y@rJ   rM   rE   rE   rF   rG   2   rH   c                 S   s   g | ]}t t|qS rE   evalr4   rB   rE   rE   rF   rG   7   rH   graphc                 S   s   g | ]}|D ]}|qqS rE   rE   rC   rowrD   rE   rE   rF   rG   E   rH   c                 S   s   g | ]}|D ]}|qqS rE   rE   rS   rE   rE   rF   rG   F   rH   c                 s   s:   | ]2\}}t || d dttt |d    k V  qdS 
      Nabsintr(   rC   abrE   rE   rF   	<genexpr>G   s   z-_compare_tensorflow_matrix.<locals>.<genexpr>r6   tfGraph
as_defaultcompatv1SessionrunsubsdictzipdoitZ	is_Matrix
isinstancer,   Zas_explicittolistall
	variablesexpr	use_floatfrandom_matricesrR   rrandom_variablessessionerE   rE   rF   _compare_tensorflow_matrix-   s.    
,
rx   c           
      C   s  t | |d}|s dd | D }ndd | D }t }d }| < dd |D }tjjj|d}||| }W d    n1 s0    Y  |t	t
| |}	|	 }	|	jrt|	ts|	 }	|	 }	|s||	k sJ n:dd |D }dd |	D }	td	d
 t
||	D sJ d S )Nr9   c                 S   s   g | ]}t |j|jd  qS )rW   r-   rK   rL   rM   rE   rE   rF   rG   P   rH   z6_compare_tensorflow_matrix_inverse.<locals>.<listcomp>c                 S   s   g | ]}t |j|jd  qS )gQ	@ry   rM   rE   rE   rF   rG   R   rH   c                 S   s   g | ]}t t|qS rE   rO   rB   rE   rE   rF   rG   W   rH   rQ   c                 S   s   g | ]}|D ]}|qqS rE   rE   rS   rE   rE   rF   rG   e   rH   c                 S   s   g | ]}|D ]}|qqS rE   rE   rS   rE   rE   rF   rG   f   rH   c                 s   s:   | ]2\}}t || d dttt |d    k V  qdS rU   rX   r[   rE   rE   rF   r^   g   s   z5_compare_tensorflow_matrix_inverse.<locals>.<genexpr>r_   rn   rE   rE   rF   "_compare_tensorflow_matrix_inverseM   s.    
,
rz   c           	      C   s   t | |d}dd | D }t }d }| < dd |D }tjjj|d}||| }W d    n1 sp0    Y  |t	t
| |}| }t|| dk sJ d S )Nr9   c                 S   s"   g | ]}t |j|j d  qS )d   )r.   rK   rL   evalfrM   rE   rE   rF   rG   m   s   z5_compare_tensorflow_matrix_scalar.<locals>.<listcomp>c                 S   s   g | ]}t t|qS rE   rO   rB   rE   rE   rF   rG   s   rH   rQ   ư>)r6   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rY   )	ro   rp   rr   rs   rR   rt   ru   rv   rw   rE   rE   rF   !_compare_tensorflow_matrix_scalark   s    
,r~   c                   C   s   t ddS Nr   rV   randomrandintrE   rE   rE   rF   <lambda>}   rH   r   c           
         s   t | |d} fdd| D }t }d }| < dd |D }tjjj|d}||| }W d    n1 st0    Y  |t	t
| |  }	t||	 dk sJ d S )Nr9   c                    s   g | ]
}  qS rE   rE   rM   rngrE   rF   rG      rH   z._compare_tensorflow_scalar.<locals>.<listcomp>c                 S   s   g | ]}t t|qS rE   rO   rB   rE   rE   rF   rG      rH   rQ   r}   )r6   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   r|   rj   rY   
ro   rp   r   rr   ZrvsrR   rt   Ztf_rvsrv   rw   rE   r   rF   _compare_tensorflow_scalar|   s    
,r   c                   C   s   t ddS r   r   rE   rE   rE   rF   r      rH   c           
         s   t | |d} fdd| D }t }d }| < dd |D }tjjj|d}||| }W d    n1 st0    Y  |t	t
| | }	||	ksJ d S )Nr9   c                    s   g | ]
}  qS rE   rE   rM   r   rE   rF   rG      rH   z2_compare_tensorflow_relational.<locals>.<listcomp>c                 S   s   g | ]}t t|qS rE   rO   rB   rE   rE   rF   rG      rH   rQ   )r6   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   r   rE   r   rF   _compare_tensorflow_relational   s    
,r   c                  C   sF   t tddksJ ttttgttt gg} t | dksBJ d S )Nr<   z6tensorflow.constant([[1, 0, 0], [0, 1, 0], [0, 0, 1]])zPtensorflow.Variable([[x, tensorflow.math.sin(y)], [tensorflow.math.exp(z), -t]]))	r4   r-   r+   xr   yr   ztrp   rE   rE   rF   test_tensorflow_printing   s    
r   c                  C   s  t std tt} t| dks$J ttf|  tt} t| dksHJ ttf|  tt} t| dkslJ ttf| dd d tt} t| dksJ ttf| d	d d t	t} t| d
ksJ ttf| dd d t
t} t| dksJ ttf| dd d td } t| dksJ ttf| dd d tt} t| dksLJ ttf| dd d tt} t| dkszJ ttf| dd d tt} t| dksJ ttf| dd d tt} t| dksJ ttf| dd d tt} t| dksJ ttf| dd d tt} t| dks2J ttf| dd d ttt} t| dksbJ tttf| dd d tt} t| dksJ ttf| d d d tt} t| d!ksJ ttf| d"d d tt} t| d#ksJ ttf| d$d d tt} t| d%ksJ ttf| d&d d tt} t| d'ksJJ ttf| d(d d tt} t| d)ksxJ ttf| d*d d tt} t| d+ksJ ttf| d,d d tt} t| d-ksJ ttf| d.d d d S )/NTensorFlow not installedztensorflow.math.abs(x)ztensorflow.math.sign(x)ztensorflow.math.ceil(x)c                   S   s   t   S Nr   rE   rE   rE   rF   r      rH   z&test_tensorflow_math.<locals>.<lambda>r   ztensorflow.math.floor(x)c                   S   s   t   S r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.exp(x)c                   S   s   t   S r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.sqrt(x)c                   S   s   t   S r   r   rE   rE   rE   rF   r      rH   rW   ztensorflow.math.pow(x, 4)c                   S   s   t   S r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.cos(x)c                   S   s   t   S r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.acos(x)c                   S   s   t ddS )Nr   gffffff?r   uniformrE   rE   rE   rF   r      rH   ztensorflow.math.sin(x)c                   S   s   t   S r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.asin(x)c                   S   s   t   S r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.tan(x)c                   S   s   t   S r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.atan(x)c                   S   s   t   S r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.atan2(y, x)c                   S   s   t   S r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.cosh(x)c                   S   s   t   S r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.acosh(x)c                   S   s   t ddS N      r   rE   rE   rE   rF   r      rH   ztensorflow.math.sinh(x)c                   S   s   t ddS r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.asinh(x)c                   S   s   t ddS r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.tanh(x)c                   S   s   t ddS r   r   rE   rE   rE   rF   r      rH   ztensorflow.math.atanh(x)c                   S   s   t ddS )Ng      g      ?r   rE   rE   rE   rF   r      rH   ztensorflow.math.erf(x)c                   S   s   t   S r   r   rE   rE   rE   rF   r     rH   ztensorflow.math.lgamma(x)c                   S   s   t   S r   r   rE   rE   rE   rF   r     rH   )r`   r7   r   r   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r&   r'   r   rE   rE   rF   test_tensorflow_math   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tensorflow.math.real(x)ztensorflow.math.imag(x)ztensorflow.math.angle(x))r4   r#   r   r$   r%   rE   rE   rE   rF   test_tensorflow_complexes
  s    r   c                  C   s   t std ttt} t| dks&J tttf|  ttt} t| dksNJ tttf|  ttt} t| dksvJ tttf|  t	tt} t| dksJ tttf|  t
tt} t| dksJ tttf|  ttt} t| dksJ tttf|  d S )Nr   ztensorflow.math.equal(x, y)ztensorflow.math.not_equal(x, y)z#tensorflow.math.greater_equal(x, y)ztensorflow.math.greater(x, y)z tensorflow.math.less_equal(x, y)ztensorflow.math.less(x, y))r`   r7   r	   r   r   r4   r   r
   r   r   r   r   r   rE   rE   rF   test_tensorflow_relational  s(    





r   c                  C   s  t std t} t| dks J ttf|  tt } t| dksDJ tttf|  tt } t| dksjJ tttf|  ttt} t| dksJ tttf|  tt t t } t| dksJ tttttf|  td } t| dksJ ttf|  t	t} t| d	ksJ ttf|  t
t} t| d
ks6J ttf|  tt} t| dks\J ttf| dd tj} t| dddksJ t| dddksJ ttf|  d S )Nr   r;   tensorflow.math.add(M, N)ztensorflow.linalg.matmul(M, N)ztensorflow.math.multiply(M, N)zXtensorflow.linalg.matmul(tensorflow.linalg.matmul(tensorflow.linalg.matmul(M, N), P), Q)r<   z;tensorflow.linalg.matmul(tensorflow.linalg.matmul(M, M), M)ztensorflow.linalg.trace(M)ztensorflow.linalg.det(M)ztensorflow.linalg.inv(M)T)rq   z1.14)Ztensorflow_versionz%tensorflow.linalg.matrix_transpose(M)z1.13ztensorflow.matrix_transpose(M))r`   r7   r;   r4   rx   r=   r0   r>   r?   r3   r/   r~   r1   rz   Tr   rE   rE   rF   test_tensorflow_matrices/  sR    




r   c            
      C   s   t std t  } |   t jjj| d}tddd}tddd}t|| }t	||f|d}t 
ddgdd	gg}t 
dd
gddgg}||||}|t ||}	||	k sJ W d    n1 s0    Y  d S )Nr   rQ   r;   r   r=   r9   r   r<   rW   )r`   r7   ra   rb   rc   rd   re   r2   r5   r6   constantrf   matmulrm   )
rR   rv   r;   r=   cgrr   mambr   crE   rE   rF   test_codegen_einsume  s    
r   c               
   C   s  t std t  } |  t t jj }tddd}tddd}tddd}tddd}t ddgdd	gg}t dd
gddgg}t ddgddgg}t ddgd	dgg}	t	||}
t
|
dksJ t||f|
d}||||}|t d||}||k sJ t||}
t
|
dks0J t||f|
d}||||}||| }||k spJ t|||}
t
|
dksJ t|||f|
d}|||||}||| | }||k sJ t||||}
t
|
dksJ t||||f|
d}||||||	}||| | |	 }||k sFJ t|ddg}
t
|
dksfJ t|f|
d}|||}|t |}||k sJ tt	||g d}
t
|
dksJ t||f|
d}||||}|t t d||g d}||k sJ tt	||d}
t
|
dks>J t||f|
d}||||}|t d||}||k sJ W d    n1 s0    Y  d S )Nr   r;   r   r=   r>   r?   r   r<   rW   r   r   r      z'tensorflow.linalg.einsum("ab,cd", M, N)r9   zij,klr   z1tensorflow.math.add(tensorflow.math.add(M, N), P)zItensorflow.math.add(tensorflow.math.add(tensorflow.math.add(M, N), P), Q)ztensorflow.transpose(M, [1, 0]))r   r   r<   r   zKtensorflow.transpose(tensorflow.linalg.einsum("ab,cd", M, N), [1, 2, 3, 0])zab,cd)r   r   z,tensorflow.linalg.einsum("ab,bc->acb", M, N)z
ab,bc->acb)r`   r7   ra   rb   rc   rd   re   r2   r   r   r4   r6   rf   Zeinsumrm   r   r   Z	transposer   )rR   rv   r;   r=   r>   r?   r   r   ZmcZmdr   rr   r   r   rE   rE   rF   test_codegen_extraz  s    




 
r   c                  C   sx   t ddd} t ddd}t ddd}t| d dks8J td| d  dksPJ |d || | }t|d	kstJ d S )
NAr   r<   BC)r   r   zA[0, 0]z	3*A[0, 0]z&(tensorflow.math.add((-1)*B, A))[0, 0])r2   r4   rg   )r   r   r   FrE   rE   rF   test_MatrixElement_printing  s    r   c                  C   s"   t ttt} t| dksJ d S )Nz2tensorflow.gradients(tensorflow.math.sin(x), x)[0])r   r   r   r4   r   rE   rE   rF   test_tensorflow_Derivative  s    r   c                  C   s\  t std td} tdt| fd}t|}d}t||ksRJ d| d| tddftd	d
ftdd
fdfD ]8\}}t| |ddt |gd}||k	 
 svJ qvtd} tdt| fd}t|}d}t||ksJ d| d| td	dftddftdd
fdfD ]<\}}t| |ddt |gd}||k	 
 sJ qd S )Nr   r   g        )      ?Tz5tensorflow.where(tensorflow.math.is_nan(x), 0.0, 1.0)zIncorrect printed result z, expected naninfr   z-inf)r   r   r9   )modules)r   z5tensorflow.where(tensorflow.math.is_inf(x), 0.0, 1.0))r`   r7   r   r   r)   r4   floatr6   r   numpyrm   r*   )r   Z
expressionZprinted_codeZexpected_printed_code_inputZ	_expected_outputrE   rE   rF   test_tensorflow_isnan_isinf  s$     , ,r   )F)F)fr   Zsympy.core.functionr   Zsympy.core.symbolr   Zsympyr   Z0sympy.tensor.array.expressions.array_expressionsr   r   r   r   Zsympy.core.relationalr	   r
   r   r   r   r   Zsympy.externalr   Zsympy.functionsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   Zsympy.codegen.cfunctionsr)   r*   Zsympy.matricesr+   r,   r-   r.   Zsympy.matrices.expressionsr/   r0   r1   r2   r3   Zsympy.printing.tensorflowr4   Z3sympy.tensor.array.expressions.from_matrix_to_arrayr5   Zsympy.utilities.lambdifyr6   Zsympy.testing.pytestr7   r8   r`   r9   osenvironr;   r=   r>   r?   r   r   r   r   rA   Zllor   Zm3x3Z	m3x3sympyrx   rz   r~   r   r   r   r   r   r   r   r   r   r   r   r   rE   rE   rE   rF   <module>   s^    l



 



`
5J