U
    ZÊ¹jÚ<  ã                   @   sf  d dl 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-m.Z.m/Z/m0Z0m1Z1 d d	l2m3Z3m4Z4m5Z5m6Z6m7Z7 d d
l8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl>m@Z@ edƒ ZAZBeB�rdd dlCZCdeCjDd< e6dddƒZEe6dddƒZFe6dddƒZGe6dddƒZHedƒ\ZIZJZKZLeAdk	�rÖdd„ eMd ddƒD ƒZNeA OeN¡ZPe.eNƒZQd;dd„ZRd<dd„ZSd d!„ ZTd"d#„ fd$d%„ZUd&d#„ fd'd(„ZVd)d*„ ZWe@d+d,„ ƒZXd-d.„ ZYd/d0„ ZZe@d1d2„ ƒZ[d3d4„ Z\d5d6„ Z]d7d8„ Z^d9d:„ Z_dS )=é    N)Ú
Derivative)Úsymbols)Ú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)Ú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 )r9   )ÚlistÚrange©Ú.0Úi© rB   úc/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/printing/tests/test_tensorflow.pyÚ
<listcomp>&   s     rD   é	   Fc           
   	   C   s
  t | |dƒ}|s dd„ | D ƒ}ndd„ | D ƒ}t ¡ }d }| ¡ �2 dd„ |D ƒ}tjjj|d�}| ||Ž ¡}W 5 Q R X | t	t
| |ƒƒ¡}	|	 ¡ }	|	jr¶t|	tƒs®|	 ¡ }	|	 ¡ }	|sÌ||	k ¡ sÊt‚n:dd„ |D ƒ}dd„ |	D ƒ}	td	d
„ t
||	ƒD ƒƒ�st‚d S )Nr6   c                 S   s   g | ]}t |j|jƒ‘qS rB   ©r+   ÚrowsÚcols©r@   ÚvrB   rB   rC   rD   .   s     z._compare_tensorflow_matrix.<locals>.<listcomp>c                 S   s   g | ]}t |j|jƒd  ‘qS )g      Y@rF   rI   rB   rB   rC   rD   0   s     c                 S   s   g | ]}t t|ƒƒ‘qS rB   ©Úevalr1   r?   rB   rB   rC   rD   5   s     ©Úgraphc                 S   s   g | ]}|D ]}|‘qqS rB   rB   ©r@   ÚrowrA   rB   rB   rC   rD   C   s       c                 S   s   g | ]}|D ]}|‘qqS rB   rB   rO   rB   rB   rC   rD   D   s       c                 s   s:   | ]2\}}t || ƒd dttt |ƒd ƒƒ   k V  qdS ©é
   é   N©ÚabsÚintr'   ©r@   ÚaÚbrB   rB   rC   Ú	<genexpr>E   s    z-_compare_tensorflow_matrix.<locals>.<genexpr>©r3   ÚtfÚGraphÚ
as_defaultÚcompatÚv1ÚSessionÚrunÚsubsÚdictÚzipÚdoitZ	is_MatrixÚ
isinstancer)   Zas_explicitÚtolistÚallÚAssertionError©
Ú	variablesÚexprÚ	use_floatÚfÚrandom_matricesrN   ÚrÚrandom_variablesÚsessionÚerB   rB   rC   Ú_compare_tensorflow_matrix+   s.    

ÿru   c           
   	   C   s
  t | |dƒ}|s dd„ | D ƒ}ndd„ | D ƒ}t ¡ }d }| ¡ �2 dd„ |D ƒ}tjjj|d�}| ||Ž ¡}W 5 Q R X | t	t
| |ƒƒ¡}	|	 ¡ }	|	jr¶t|	tƒs®|	 ¡ }	|	 ¡ }	|sÌ||	k ¡ sÊt‚n:dd„ |D ƒ}dd„ |	D ƒ}	td	d
„ t
||	ƒD ƒƒ�st‚d S )Nr6   c                 S   s   g | ]}t |j|jƒd  ‘qS )rS   ©r*   rG   rH   rI   rB   rB   rC   rD   N   s     z6_compare_tensorflow_matrix_inverse.<locals>.<listcomp>c                 S   s   g | ]}t |j|jƒd  ‘qS )g…ëQ¸	@rv   rI   rB   rB   rC   rD   P   s     c                 S   s   g | ]}t t|ƒƒ‘qS rB   rK   r?   rB   rB   rC   rD   U   s     rM   c                 S   s   g | ]}|D ]}|‘qqS rB   rB   rO   rB   rB   rC   rD   c   s       c                 S   s   g | ]}|D ]}|‘qqS rB   rB   rO   rB   rB   rC   rD   d   s       c                 s   s:   | ]2\}}t || ƒd dttt |ƒd ƒƒ   k V  qdS rQ   rT   rW   rB   rB   rC   rZ   e   s    z5_compare_tensorflow_matrix_inverse.<locals>.<genexpr>r[   rk   rB   rB   rC   Ú"_compare_tensorflow_matrix_inverseK   s.    

ÿrw   c           	   	   C   sš   t | |dƒ}dd„ | D ƒ}t ¡ }d }| ¡ �2 dd„ |D ƒ}tjjj|d�}| ||Ž ¡}W 5 Q R X | t	t
| |ƒƒ¡}| ¡ }t|| ƒdk s–t‚d S )Nr6   c                 S   s"   g | ]}t |j|jƒ ¡ d  ‘qS )éd   )r+   rG   rH   ÚevalfrI   rB   rB   rC   rD   k   s    z5_compare_tensorflow_matrix_scalar.<locals>.<listcomp>c                 S   s   g | ]}t t|ƒƒ‘qS rB   rK   r?   rB   rB   rC   rD   q   s     rM   ç�íµ ÷Æ°>)r3   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rU   rj   )	rl   rm   ro   rp   rN   rq   rr   rs   rt   rB   rB   rC   Ú!_compare_tensorflow_matrix_scalari   s    ÿ
r{   c                   C   s   t  dd¡S ©Nr   rR   ©ÚrandomÚrandintrB   rB   rB   rC   Ú<lambda>{   ó    r€   c           
   	      sž   t | |dƒ}‡ fdd„| D ƒ}t ¡ }d }| ¡ �2 dd„ |D ƒ}tjjj|d�}| ||Ž ¡}W 5 Q R X | t	t
| |ƒƒ¡ ¡  ¡ }	t||	 ƒdk sšt‚d S )Nr6   c                    s   g | ]
}ˆ ƒ ‘qS rB   rB   rI   ©ÚrngrB   rC   rD   }   s     z._compare_tensorflow_scalar.<locals>.<listcomp>c                 S   s   g | ]}t t|ƒƒ‘qS rB   rK   r?   rB   rB   rC   rD   ‚   s     rM   rz   )r3   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   ry   rf   rU   rj   ©
rl   rm   rƒ   ro   ZrvsrN   rq   Ztf_rvsrs   rt   rB   r‚   rC   Ú_compare_tensorflow_scalarz   s    
r…   c                   C   s   t  dd¡S r|   r}   rB   rB   rB   rC   r€   ‹   r�   c           
   	      s’   t | |dƒ}‡ fdd„| D ƒ}t ¡ }d }| ¡ �2 dd„ |D ƒ}tjjj|d�}| ||Ž ¡}W 5 Q R X | t	t
| |ƒƒ¡ ¡ }	||	ksŽt‚d S )Nr6   c                    s   g | ]
}ˆ ƒ ‘qS rB   rB   rI   r‚   rB   rC   rD   �   s     z2_compare_tensorflow_relational.<locals>.<listcomp>c                 S   s   g | ]}t t|ƒƒ‘qS rB   rK   r?   rB   rB   rC   rD   ’   s     rM   )r3   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rj   r„   rB   r‚   rC   Ú_compare_tensorflow_relationalŠ   s    
r†   c                  C   sF   t tdƒƒdkst‚ttttƒgttƒt	 ggƒ} t | ƒdksBt‚d S )Nr9   z6tensorflow.constant([[1, 0, 0], [0, 1, 0], [0, 0, 1]])zPtensorflow.Variable([[x, tensorflow.math.sin(y)], [tensorflow.math.exp(z), -t]]))
r1   r*   rj   r(   Úxr   Úyr   ÚzÚt©rm   rB   rB   rC   Útest_tensorflow_printingš   s    
ÿÿrŒ   c                  C   sì  t stdƒ ttƒ} t| ƒdks$t‚ttf| ƒ ttƒ} t| ƒdksHt‚ttf| ƒ ttƒ} t| ƒdkslt‚ttf| dd„ d� t	tƒ} t| ƒdks˜t‚ttf| d	d„ d� t
tƒ} t| ƒd
ksÄt‚ttf| dd„ d� ttƒ} t| ƒdksðt‚ttf| dd„ d� td } t| ƒdk�st‚ttf| dd„ d� ttƒ} t| ƒdk�sLt‚ttf| dd„ d� ttƒ} t| ƒdk�szt‚ttf| dd„ d� ttƒ} t| ƒdk�s¨t‚ttf| dd„ d� ttƒ} t| ƒdk�sÖt‚ttf| dd„ d� ttƒ} t| ƒdk�st‚ttf| dd„ d� ttƒ} t| ƒdk�s2t‚ttf| dd„ d� tttƒ} t| ƒdk�sbt‚tttf| dd„ d� ttƒ} t| ƒdk�s’t‚ttf| d d„ d� ttƒ} t| ƒd!k�sÀt‚ttf| d"d„ d� ttƒ} t| ƒd#k�sît‚ttf| d$d„ d� ttƒ} t| ƒd%k�st‚ttf| d&d„ d� ttƒ} t| ƒd'k�sJt‚ttf| d(d„ d� ttƒ} t| ƒd)k�sxt‚ttf| d*d„ d� ttƒ} t| ƒd+k�s¦t‚ttf| d,d„ d� ttƒ} t| ƒd-k�sÔt‚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~   rB   rB   rB   rC   r€   ¶   r�   z&test_tensorflow_math.<locals>.<lambda>r‚   ztensorflow.math.floor(x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€   º   r�   ztensorflow.math.exp(x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€   ¾   r�   ztensorflow.math.sqrt(x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€   Â   r�   rS   ztensorflow.math.pow(x, 4)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€   Æ   r�   ztensorflow.math.cos(x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€   Ê   r�   ztensorflow.math.acos(x)c                   S   s   t  dd¡S )Nr   gffffffî?©r~   ÚuniformrB   rB   rB   rC   r€   Î   r�   ztensorflow.math.sin(x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€   Ò   r�   ztensorflow.math.asin(x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€   Ö   r�   ztensorflow.math.tan(x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€   Ú   r�   ztensorflow.math.atan(x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€   Þ   r�   ztensorflow.math.atan2(y, x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€   â   r�   ztensorflow.math.cosh(x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€   æ   r�   ztensorflow.math.acosh(x)c                   S   s   t  dd¡S ©Né   é   r�   rB   rB   rB   rC   r€   ê   r�   ztensorflow.math.sinh(x)c                   S   s   t  dd¡S r’   r�   rB   rB   rB   rC   r€   î   r�   ztensorflow.math.asinh(x)c                   S   s   t  dd¡S r’   r�   rB   rB   rB   rC   r€   ò   r�   ztensorflow.math.tanh(x)c                   S   s   t  dd¡S r’   r�   rB   rB   rB   rC   r€   ö   r�   ztensorflow.math.atanh(x)c                   S   s   t  dd¡S )Ng      à¿g      à?r�   rB   rB   rB   rC   r€   û   r�   ztensorflow.math.erf(x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€      r�   ztensorflow.math.lgamma(x)c                   S   s   t   ¡ S rŽ   r�   rB   rB   rB   rC   r€     r�   )r\   r4   r   r‡   r1   rj   r…   r   r   r   r   r   r   r   r   r   r   r   r   rˆ   r   r   r   r   r    r!   r%   r&   r‹   rB   rB   rC   Útest_tensorflow_math§   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‚d S )Nztensorflow.math.real(x)ztensorflow.math.imag(x)ztensorflow.math.angle(x))r1   r"   r‡   rj   r#   r$   rB   rB   rB   rC   Útest_tensorflow_complexes  s    r–   c                  C   s   t stdƒ tttƒ} t| ƒdks&t‚tttf| ƒ tttƒ} t| ƒdksNt‚tttf| ƒ t	ttƒ} t| ƒdksvt‚tttf| ƒ t
ttƒ} t| ƒdksžt‚tttf| ƒ tttƒ} t| ƒdksÆt‚tttf| ƒ tttƒ} t| ƒdksît‚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\   r4   r   r‡   rˆ   r1   rj   r†   r	   r
   r   r   r   r‹   rB   rB   rC   Útest_tensorflow_relational  s(    





r—   c                  C   s®  t stdƒ t} t| ƒdks t‚ttf| ƒ tt } t| ƒdksDt‚tttf| ƒ tt } t| ƒdksjt‚tttf| ƒ tttƒ} t| ƒdks’t‚tttf| ƒ tt t t	 } t| ƒdksÀt‚ttttt	f| ƒ td } t| ƒdksêt‚ttf| ƒ t
tƒ} t| ƒd	k�st‚ttf| ƒ ttƒ} t| ƒd
k�s6t‚ttf| ƒ ttƒ} t| ƒdk�s\t‚ttf| dd� tj} t| dd�dk�sˆt‚t| dd�dk�sžt‚ttf| ƒ d S )Nr�   r8   ú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)r9   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)rn   z1.14)Ztensorflow_versionz%tensorflow.linalg.matrix_transpose(M)z1.13ztensorflow.matrix_transpose(M))r\   r4   r8   r1   rj   ru   r:   r-   r;   r<   r0   r,   r{   r.   rw   ÚTr‹   rB   rB   rC   Ú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 ¡ sÀt‚W 5 Q R X d S )Nr�   rM   r8   r”   r:   r6   r“   r9   rS   éþÿÿÿéÿÿÿÿ)r\   r4   r]   r^   r_   r`   ra   r/   r2   r3   Úconstantrb   Úmatmulri   rj   )
rN   rs   r8   r:   Úcgro   ÚmaÚmbrˆ   ÚcrB   rB   rC   Útest_codegen_einsumc  s    
r£   c               
   C   sš  t stdƒ t  ¡ } |  ¡ ��r 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sÎt‚t||f|
dƒ}| |||ƒ¡}| t  d||¡¡}||k ¡ �st‚t||ƒ}
t
|
ƒdk�s0t‚t||f|
dƒ}| |||ƒ¡}| || ¡}||k ¡ �spt‚t|||ƒ}
t
|
ƒdk�sŽt‚t|||f|
dƒ}| ||||ƒ¡}| || | ¡}||k ¡ �sÖt‚t||||ƒ}
t
|
ƒdk�söt‚t||||f|
dƒ}| |||||	ƒ¡}| || | |	 ¡}||k ¡ �sFt‚t|ddgƒ}
t
|
ƒdk�sft‚t|f|
dƒ}| ||ƒ¡}| t  |¡¡}||k ¡ �s¤t‚tt	||ƒddddgƒ}
t
|
ƒdk�sÎt‚t||f|
dƒ}| |||ƒ¡}| t  t  d||¡ddddg¡¡}||k ¡ �s$t‚tt	||ƒdƒ}
t
|
ƒdk�sFt‚t||f|
dƒ}| |||ƒ¡}| t  d||¡¡}||k ¡ �sŒt‚W 5 Q R X d S )Nr�   r8   r”   r:   r;   r<   r“   r9   rS   r›   rœ   r   é   z'tensorflow.linalg.einsum("ab,cd", M, N)r6   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])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\   r4   r]   r^   r_   r`   ra   r/   r�   r   r1   rj   r3   rb   Zeinsumri   r   r   Z	transposer   )rN   rs   r8   r:   r;   r<   r    r¡   ZmcÚmdrŸ   ro   rˆ   r¢   rB   rB   rC   Útest_codegen_extrax  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 )
NÚAr“   r9   ÚBÚC)r   r   zA[0, 0]z	3*A[0, 0]z&(tensorflow.math.add((-1)*B, A))[0, 0])r/   r1   rj   rc   )r§   r¨   r©   ÚFrB   rB   rC   Útest_MatrixElement_printingÂ  s    r«   c                  C   s"   t ttƒtƒ} t| ƒdkst‚d S )Nz2tensorflow.gradients(tensorflow.math.sin(x), x)[0])r   r   r‡   r1   rj   r‹   rB   rB   rC   Útest_tensorflow_DerivativeÎ  s    ÿr¬   )F)F)`r~   Zsympy.core.functionr   Zsympy.core.symbolr   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.matricesr(   r)   r*   r+   Zsympy.matrices.expressionsr,   r-   r.   r/   r0   Zsympy.printing.tensorflowr1   Z3sympy.tensor.array.expressions.from_matrix_to_arrayr2   Zsympy.utilities.lambdifyr3   Zsympy.testing.pytestr4   r5   r\   r6   ÚosÚenvironr8   r:   r;   r<   r‡   rˆ   r‰   rŠ   r>   Zllor�   Zm3x3Z	m3x3sympyru   rw   r{   r…   r†   rŒ   r•   r–   r—   rš   r£   r¦   r«   r¬   rB   rB   rB   rC   Ú<module>   sX    l



 
ÿ
ÿ

`
5J