
    MZd()                     v   d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlm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mZmZ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%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z;  e;d      Z<e<rJe<jz                  j}                  e<jz                  j                  g       j                        ZAeAj                  ZCd ZDd ZEd ZFd ZGd ZHd ZId ZJd ZKd ZLd ZMd  ZNd! ZOd" ZPd# ZQd$ ZRd% ZSd& ZTd' ZUd( ZVd) ZWd* ZXd+ ZYd, ZZy-).    )Sum)Mod)Equality
Unequality)sqrt)	Piecewise)BlockMatrix)MatrixSymbol)Identity)lambdify)xijabcd)Pow)MatrixSolve)	logaddexp
logaddexp2)log1pexpm1hypotlog10exp2log2Sqrt)Array)ArrayTensorProductArrayAddPermuteDimsArrayDiagonal)
JaxPrinter_jax_known_constants_jax_known_functions)convert_matrix_to_array)skipraises)import_modulejaxc                      t               } t        dt        dk  fd      }| j                  |      dk(  sJ | j                  dh dik(  sJ y)z
    NumPyPrinter needs to print Piecewise()'s choicelist as a list to avoid
    breaking compatibility with numpy 1.8. This is not necessary in numpy 1.9+.
    See gh-9747 and gh-9749 for details.
       r   )r   TzKjax.numpy.select([jax.numpy.less(x, 0),True], [1,0], default=jax.numpy.nan)z	jax.numpy>   nanlessselectN)r$   r   r   doprintmodule_imports)printerps     ?/usr/lib/python3/dist-packages/sympy/printing/tests/test_jax.pytest_jax_piecewise_regressionr6   '   sZ     lG1a!e*i(A??1UV V V!!k3L%MMMM    c                      t        t        t              } t               j	                  |       dk(  sJ t        t        t              }t               j	                  |      dk(  sJ y )Nzjax.numpy.logaddexp(a, b)zjax.numpy.logaddexp2(a, b))r   r   r   r$   r1   r   )laelae2s     r5   test_jax_logaddexpr;   4   sQ    
Aq/C<$(CCCCaD<%)EEEEr7   c                     t         st        d       t        t        t        z  t        t
        t        f      } t        t
        t        t        f| d      }d\  }}t         j                  j                  ddd      t         j                  j                   |||      t        fdt        ||dz         D                    sJ t        t        t        z  t        t
        t        f      } t        t
        t        t        f| d      }d\  }}t         j                  j                  ddd      t         j                  j                   |||      t        fdt        ||dz         D                    sJ y )	NJAX not installedr+   r   
   r-   r?   c              3   (   K   | ]	  }|z    y wN .0i_x_s     r5   	<genexpr>ztest_jax_sum.<locals>.<genexpr>D   s     0Vbr0V   c              3   (   K   | ]	  }|z    y wrB   rC   rD   s     r5   rH   ztest_jax_sum.<locals>.<genexpr>K   s     0URb0UrI   )r+   r(   r   r   r   r   r   r   numpylinspaceallclosesumrange)sfa_b_rG   s       @r5   test_jax_sumrT   ;   s    !AFQ1IA!QAu%AFB			BB	'B99aBmS0VE"bSTfDU0V-VWWWAEAq!9A!QAu%AFB			BB	'B99aBmS0U5RRSVCT0U-UVVVr7   c                     t         st        d       t        t        t        z   t
        z  t
        t        t        ft        t        t        f      } t        t        t        t        t        t        f| d      }d\  }}d\  t         j                  j                  ddd      t         j                  j                   |||      t        fdt        ||dz         D                    sJ y )	Nr=   r+   r>   )      r@   r-   r?   c              3   V   K   | ]   }t        d z         D ]  }|z   |z    " yw)r-   N)rO   )rE   rF   j_c_d_rG   s      r5   rH   z)test_jax_multiple_sums.<locals>.<genexpr>Y   s5     bbPUVXZ\_`Z`Pab"BGr>b>bs   &))r+   r(   r   r   r   r   r   r   r   r   r   rK   rL   rM   rN   rO   )rP   rQ   rR   rS   rZ   r[   rG   s       @@@r5   test_jax_multiple_sumsr\   N   s     !QUaK!QQ1I.A!Q1a!U+AFBFB			BB	'B99aBB3bE"b1f4Ebbd d dr7   c                     t         st        d       t        ddd      } t        ddd      }t        | |z        }t	        | |f|d      }t         j
                  j                  ddgddgg      }t         j
                  j                  dd	gd
dgg      } |||      t         j
                  j                  ||      k(  j                         sJ y )Nr=   M   Nr+   r-         r@   )	r+   r(   r
   r'   r   rK   arraymatmulall)r^   r`   cgrQ   mambs         r5   test_jax_codegen_einsumrj   \   s     !S!QAS!QA	 Q	'B!QU#A	1a&1a&)	*B	1R&2q'*	+Bb"I))"b1166888r7   c            
         t         st        d       t        ddd      } t        ddd      }t        ddd      }t        ddd      }t         j                  j	                  ddgdd	gg      }t         j                  j	                  dd
gddgg      }t         j                  j	                  ddgddgg      }t         j                  j	                  ddgd	dgg      }t        | |      }t        | |f|d      }	 |	||      t         j                  j                  |ddg|ddg      k(  j                         sJ t        | |      }t        | |f|d      }	 |	||      ||z   k(  j                         sJ t        | ||      }t        | ||f|d      }	 |	|||      ||z   |z   k(  j                         sJ t        | |||      }t        | |||f|d      }	 |	||||      ||z   |z   |z   k(  j                         sJ t        | ddg      }t        | f|d      }	 |	|      |j                  k(  j                         sJ t        t        | |      g d      }t        | |f|d      }	 |	||      t         j                  j                  t         j                  j                  |ddg|ddg      d      k(  j                         sJ t        t        | |      d      }t        | |f|d      }	 |	||      t         j                  j                  t         j                  j                  |ddg|ddg      dd      k(  j                         sJ y )Nr=   r^   r_   r`   PQr-   ra   rb   rc   r@   r      r+   )r-   r_   ra   r   r-   r_   )axis1axis2)r+   r(   r
   rK   rd   r    r   einsumrf   r!   r"   T	transposer#   diagonal)
r^   r`   rl   rm   rh   ri   mcmdrg   rQ   s
             r5   test_jax_codegen_extrarx   k   s    !S!QAS!QAS!QAS!QA	1a&1a&)	*B	1R&2q'*	+B	1a&1a&)	*B	1R&1a&)	*B	Aq	!B!QU#Ab"I))"q!fb1a&AAFFHHH	!QB!QU#Ab"IB##%%%	!Q	B!QB&Ab"bMRU2X%**,,,	!Q1	B!Q1r5)Ab"b"Br",11333	QA	B!r5!AbERTTM   	'1-|	<B!QU#Ab"I,,SYY-=-=b1a&"qRSf-UWcddiikkk	)!Q/	8B!QU#Ab"I++CII,<,<R!QaQRV,T\]ef+ggllnnnr7   c                     t         st        d       t        t        d      } t	        t        f| d      }t         j
                  j                  g d      }t         j
                  j                   ||      g d      sJ t        t        d      } t	        t        f| d      }t         j
                  j                  g d      }t         j
                  j                   ||      g d      sJ t        dk  } t	        t        f| d      }t         j
                  j                  g d      }t         j
                  j                   ||      g d      sJ t        dk  } t	        t        f| d      }t         j
                  j                  g d      }t         j
                  j                   ||      g d      sJ t        dkD  } t	        t        f| d      }t         j
                  j                  g d      }t         j
                  j                   ||      g d	      sJ t        dk\  } t	        t        f| d      }t         j
                  j                  g d      }t         j
                  j                   ||      g d
      sJ t        dk\  t        dk  z  } t	        t        f| d      }t         j
                  j                  g d      }t         j
                  j                   ||      g d      sJ t        dk\  t        dk  z  } t	        t        f| d      }t         j
                  j                  g d      }t         j
                  j                   ||      g d      sJ y )Nr=   r-   r+   )r   r-   r_   )FTF)TFT)TFF)TTF)FFT)FTTr_   )TTT)	r+   r(   r   r   r   rK   rd   array_equalr   )erQ   rG   s      r5   test_jax_relationalr|      sw    !AA!q% A		#B99  2(<===1aA!q% A		#B99  2(;<<<	
QA!q% A		#B99  2(<===	
aA!q% A		#B99  2(;<<<	
QA!q% A		#B99  2(<===	
aA!q% A		#B99  2(;<<< 
aAEA!q% A		#B99  2(<===	
aAEA!q% A		#B99  2(:;;;r7   c                     t         st        d       t        t        t              } t        t        t        f| d      }t         j                  j                  g d      }d}t         j                  j                   |||      g d      sJ t         j                  j                  g d      }t         j                  j                  g d      }t         j                  j                   |||      g d      sJ t         j                  j                  g d      }t         j                  j                  g d      }t         j                  j                   |||      g d      sJ y )	Nr=   r+   )r   r-   r_   ra   r_   )r   r-   r   r-   )r_   r_   r_   r_   )r_   ra   rb      )r   r   r   r   )	r+   r(   r   r   r   r   rK   rd   rz   )r{   rQ   rR   rS   s       r5   test_jax_modr      s     !Aq	A!QE"A		&B	
B99  2rL999		&B		&B99  2rL999		&B		&B99  2rL999r7   c                  t    t         st        d       t        ddd      } t        g | d      } |       dk(  sJ y )Nr=   r_   r@   F)evaluater+   g      ?)r+   r(   r   r   )exprrQ   s     r5   test_jax_powr      s8     !q"u%DT5!A3#::r7   c                      t         st        d       t        t        ft	        t              d      } t         | d      dz
  dz
        dt        z  k  sJ y )Nr=   r+   g|=g#B;)r+   r(   r   r   r   absJAX_DEFAULT_EPSILONrQ   s    r5   test_jax_expm1r      sI     !!uQx'Aqx%%'(E4G,GGGGr7   c                      t         st        d       t        t        ft	        t              d      } t         | d      dz
        dt        z  k  sJ y )Nr=   r+   g>N}a+)r+   r(   r   r   r   r   r   r   s    r5   test_jax_log1pr      sD     !!uQx'Aqx% E,?$????r7   c            
          t         st        d       t         t        t        t
        ft        t        t
              d      dd      dz
        t        k  sJ y )Nr=   r+   ra   rb   r~   )r+   r(   r   r   r   r   r   r   rC   r7   r5   test_jax_hypotr      sD     !3xAaU3Aq9A=>BUUUUr7   c            	          t         st        d       t         t        t        ft        t              d      d      dz
        t        k  sJ y )Nr=   r+   d   r_   )r+   r(   r   r   r   r   r   rC   r7   r5   test_jax_log10r      s>     !.xeAh.s3a78<OOOOr7   c            	          t         st        d       t         t        t        ft        t              d      d      dz
        t        k  sJ y )Nr=   r+   r~       )r+   r(   r   r   r   r   r   rC   r7   r5   test_jax_exp2r      s>     !-xd1gu-a0256:MMMMr7   c            	          t         st        d       t         t        t        ft        t              d      d      dz
        t        k  sJ y )Nr=   r+         )r+   r(   r   r   r   r   r   rC   r7   r5   test_jax_log2r     s>     !-xd1gu-c2Q67;NNNNr7   c            	          t         st        d       t         t        t        ft        t              d      d      dz
        t        k  sJ y Nr=   r+   rb   r_   )r+   r(   r   r   r   r   r   rC   r7   r5   test_jax_Sqrtr     >     !-xd1gu-a01459LLLLr7   c            	          t         st        d       t         t        t        ft        t              d      d      dz
        t        k  sJ y r   )r+   r(   r   r   r   r   r   rC   r7   r5   test_jax_sqrtr     r   r7   c                     t         st        d       t        ddd      } t        ddd      }| dz  |z  |z   }t        | |      |z   }t	        | |f|d      }t	        | |f|d      }t         j
                  j                  g dg d	g d
g      }t         j
                  j                  j                  |      dk(  sJ t         j
                  j                  g d      }t         j
                  j                   |||       |||            sJ y )Nr=   r^   ra   r   r-   r@   r+   )r-   r_   ra   )ra   r_   r~   )r~      rn   )ra   rb   r~   )
r+   r(   r
   r   r   rK   rd   linalgmatrix_rankrM   )r^   r   r   matsolve_exprrQ   
f_matsolvem0x0s           r5   test_jax_matsolver     s     !S!QAS!QAr7Q;?D1%)M!Qu%A1a&-7J	)Y	:	;B99''+q000		#B99jR0!B)<<<r7   c                     t         st        d       t        ddd      } t        ddd      }t        ddd      }t        ddd      }t        | |g||gg      }|j                  dk(  sJ t               }|j                  |      d	k(  sJ y )
Nr=   a_1r?   ra   a_2a_3a_4)   r   z)jax.numpy.block([[a_1, a_2], [a_3, a_4]]))r+   r(   r
   r	   shaper$   r1   )r   r   r   r   Ar3   s         r5   
test_16857r   -  s     !
ub!
$C
ub!
$C
ub!
$C
ub!
$Cc3Z#s,-A77glG??1!LLLLr7   c                     t         st        d       t        ddd      } t        | | t	        d      z   d      }t         j
                  j                  ddgddgg      }t         j
                  j                  ddgddgg      } ||      |k(  j                         sJ d	d
lm	}  |dd      t        d      t        t        fd       y )Nr=   r^   r_   r+   r-   ra   rb   r~   r   )symbolsnT)integerc                  6    t          t              z   d      S )Nr+   )r   r   )r`   r   s   r5   <lambda>z"test_issue_17006.<locals>.<lambda>K  s    AOU(K r7   )r+   r(   r
   r   r   rK   rd   rf   sympy.core.symbolr   r)   NotImplementedError)r^   rQ   rh   mrr   r`   r   s        @@r5   test_issue_17006r   <  s     !S!QAAOU+A	1a&1a&)	*B	1a&1a&)	*BbERK)T"AS!QA
 KLr7   c                      t               j                  t        d            dk(  sJ t               j                  t        d            dk(  sJ y )N)ro   )ra   r~   z!jax.numpy.array([[1, 2], [3, 5]])ro   zjax.numpy.array((1, 2)))r$   r1   r   rC   r7   r5   test_jax_arrayr   M  sD    <&6 78<____<f.2KKKKr7   c                  t    t         d   dk(  sJ t         d   dk(  sJ t        d   dk(  sJ t        d   dk(  sJ y )	NNaNzjax.numpy.nan
EulerGammazjax.numpy.euler_gammaacoszjax.numpy.arccoslogzjax.numpy.log)r%   r&   rC   r7   r5   test_jax_known_funcs_constsr   Q  sP    &/999-1HHHH'+====&/999r7   c                  P    t               } t        | d      sJ t        | d      sJ y )N_print_acos
_print_log)r$   hasattr)prntrs    r5   test_jax_print_methodsr   X  s)    LE5-(((5,'''r7   N)[sympy.concrete.summationsr   sympy.core.modr   sympy.core.relationalr   r   (sympy.functions.elementary.miscellaneousr   $sympy.functions.elementary.piecewiser   &sympy.matrices.expressions.blockmatrixr	   "sympy.matrices.expressions.matexprr
   "sympy.matrices.expressions.specialr   sympy.utilities.lambdifyr   	sympy.abcr   r   r   r   r   r   r   
sympy.corer   sympy.codegen.matrix_nodesr   sympy.codegen.numpy_nodesr   r   sympy.codegen.cfunctionsr   r   r   r   r   r   r   sympy.tensor.arrayr   0sympy.tensor.array.expressions.array_expressionsr    r!   r"   r#   sympy.printing.numpyr$   r%   r&   3sympy.tensor.array.expressions.from_matrix_to_arrayr'   sympy.testing.pytestr(   r)   sympy.externalr*   r+   rK   finford   dtypedeafult_float_infoepsr   r6   r;   rT   r\   rj   rx   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rC   r7   r5   <module>r      s   )  8 9 : > ; 7 - ) ) )  2 ; Q Q Q $  W W W - ( E)<)B)BC,00
NFW&d9'oT1<f:(H@V
PNOMM=*MM"L:(r7   