U
    ZÊ¹j€Š  ã                   @   sH  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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 d d
lmZ d dlmZm Z  d dl!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l0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC d dlmDZD d dlmEZE d dlFmGZGmHZHmIZImJZJmKZK d dlLmMZMmNZN d dlOmPZPmQZQ d dlRmSZSmTZT d dlUmVZVmWZW d dlXmYZY d dlZm[Z[ dd„ Z\d d!„ Z]d"d#„ Z^d$d%„ Z_d&d'„ Z`d(d)„ Zad*d+„ Zbd,d-„ Zcd.d/„ Zdd0d1„ Zed2d3„ Zfd4d5„ Zgd6d7„ Zhd8d9„ Zid:d;„ Zjd<d=„ Zkd>d?„ Zld@dA„ ZmdBdC„ ZndDdE„ ZodFdG„ ZpdHdI„ ZqdJdK„ ZrdLdM„ ZsdNdO„ ZtdPdQ„ ZudRdS„ ZvdTdU„ ZwdVdW„ ZxdXdY„ ZydZd[„ Zzd\d]„ Z{d^d_„ Z|d`da„ Z}dbdc„ Z~ddde„ Zdfdg„ Z€dhdi„ Z�djdk„ Z‚dldm„ Zƒdndo„ Z„dpdq„ Z…drds„ Z†dtS )ué    )ÚAdd)ÚExpr)ÚFunctionÚLambdaÚdiff)ÚMod)ÚCatalanÚ
EulerGammaÚGoldenRatio)ÚEÚFloatÚIÚIntegerÚRationalÚpi)ÚEq)ÚS)ÚDummyÚsymbols)Ú	factorial)Ú	conjugateÚsign)ÚexpÚlog)Úsqrt)Ú	Piecewise)Úatan2ÚcosÚsin)Úgamma)ÚIntegral)ÚRange)ÚForÚ
AssignmentÚ
aug_assign)ÚDeclarationÚVariableÚfloat32Úfloat64Úvalue_constÚrealÚbool_ÚWhileÚFunctionPrototypeÚFunctionDefinitionÚintegerÚReturnÚElement)ÚUnevaluatedExpr)Ú
Relational)ÚAndÚOrÚNotÚ
EquivalentÚXor)ÚMatrixÚMatrixSymbol)ÚfcodeÚFCodePrinter)ÚIndexedBaseÚIdx)ÚArraySymbolÚArrayElement)Úimplemented_function)Úraisesc            
      C   s¨   t ddd�\} }}t|| ƒ}tt| | ƒƒ}t|dd�dksBt‚t dƒ\}}}t|| ƒ}tt|| ƒƒ}	t|	dd	�d
  ¡ dksˆt‚t|	ddid� ¡ dks¤t‚d S )Nzp q rT)r*   Úfree©Úsource_formatzexp(p + (q + r))úx y zF©Úhumané   zexp(re(x) + re(y + z))ÚreZrealpart©Zuser_functionsz"exp(realpart(x) + realpart(y + z)))r   r2   Úabsr   r;   ÚAssertionErrorÚlstrip)
ÚpÚqÚrZq_rÚexprÚxÚyÚzZy_zZexpr2© rV   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/printing/tests/test_fortran.pyÚtest_UnevaluatedExpr#   s    rX   c                  C   s0   t dƒ} G dd„ dtƒ}t|| ƒƒdks,t‚d S )NrS   c                   @   s   e Zd Zdd„ ZdS )ztest_printmethod.<locals>.nintc                 S   s   d|  | jd ¡ S )Nznint(%s)r   )Ú_printÚargs)ÚselfÚprinterrV   rV   rW   Ú_fcode3   s    z%test_printmethod.<locals>.nint._fcodeN)Ú__name__Ú
__module__Ú__qualname__r]   rV   rV   rV   rW   Únint2   s   ra   z      nint(x))r   r   r;   rM   )rS   ra   rV   rV   rW   Útest_printmethod/   s    rb   c                     s„   t dƒ‰ t ddd�} t ddd�}ttˆ ƒddd	�d
ks:t‚tt| ƒddd	�dksTt‚tt|ƒddd	�dksnt‚tt‡ fdd„ƒ d S )NrS   rT   T©r/   rU   )Úcomplexé_   rC   ©ÚstandardrE   z#merge(0d0, dsign(1d0, x), x == 0d0)zmerge(0, isign(1, y), y == 0)z/merge(cmplx(0d0, 0d0), z/abs(z), abs(z) == 0d0)c                      s   t tˆ ƒƒS ©N)r;   r   rV   ©rS   rV   rW   Ú<lambda>?   ó    z!test_fcode_sign.<locals>.<lambda>)r   r;   r   rM   rB   ÚNotImplementedError)rT   rU   rV   ri   rW   Útest_fcode_sign8   s    rm   c                  C   s,  t dƒ\} }t ddd�}t| d ƒdks,t‚t| |d  ƒdksDt‚tdt| ƒd	 | ||     | d
 |  ƒdksxt‚tt| ƒƒdksŒt‚tt|ƒƒdks t‚t| d ƒdks´t‚tt| ƒƒdksÈt‚ttdƒƒdksÜt‚t| d ƒdksðt‚t| d ddd�dk�st‚t| tddƒ ƒdk�s(t‚d S )Núx,yÚnTrc   é   z
      x**3z      x**(y**3)é   g      @rI   z,      (3.5d0*sin(x))**(-x + y**x)/(x**2 + y)z      sqrt(x)z      sqrt(dble(n))g      à?é
   z      sqrt(10.0d0)g      ð¿z      1d0/xg       ÀrT   rC   rD   zy = x**(-2.0d0)é   z      x**(3.0d0/7.0d0))r   r;   rM   r   r   r   )rS   rT   ro   rV   rV   rW   Útest_fcode_PowB   s    *ÿrt   c                  C   s˜   t dƒ} ttddƒƒdkst‚ttddƒƒdks4t‚ttddƒƒd	ksJt‚ttd
dƒƒdks`t‚t| tddƒ ƒdkszt‚ttddƒ|  ƒdks”t‚d S )NrS   rp   rs   z      3.0d0/7.0d0é   é	   z      2iùÿÿÿz      -3.0d0/7.0d0éýÿÿÿz      x + 3.0d0/7.0d0z      (3.0d0/7.0d0)*x)r   r;   r   rM   ri   rV   rV   rW   Útest_fcode_RationalT   s    rx   c                   C   s,   t tdƒƒdkst‚t tdƒƒdks(t‚d S )NéC   z      67éÿÿÿÿz      -1)r;   r   rM   rV   rV   rV   rW   Útest_fcode_Integer^   s    r{   c                   C   s,   t tdƒƒdkst‚t tdƒƒdks(t‚d S )Ng      E@z      42.0000000000000d0g@Œµx¯Äz      -1.00000000000000d+20)r;   r   rM   rV   rV   rV   rW   Útest_fcode_Floatc   s    r|   c                     s¸   t dƒ\‰ ‰ttˆ ƒtˆƒ ƒdks(t‚tt‡ ‡fdd„ƒ tt‡ ‡fdd„ƒ tt‡ ‡fdd„ƒ tt‡ ‡fdd„ƒ dD ]6} ttˆ ˆƒ| d	�d
ksšt‚tˆ ˆ | d	�d
ks|t‚q|d S )Nrn   z      sin(x)**cos(y)c                      s   t tˆ ˆƒdd�S ©NéB   ©rg   ©r;   r   rV   ©rS   rT   rV   rW   rj   k   rk   z&test_fcode_functions.<locals>.<lambda>c                      s   t ˆ ˆ dd�S r}   ©r;   rV   r�   rV   rW   rj   l   rk   c                      s   t tˆ ˆƒdd�S ©NéM   r   r€   rV   r�   rV   rW   rj   m   rk   c                      s   t ˆ ˆ dd�S rƒ   r‚   rV   r�   rV   rW   rj   n   rk   )éZ   re   iÓ  iØ  r   z      modulo(x, y))r   r;   r   r   rM   rB   rl   r   r   rV   r�   rW   Útest_fcode_functionsh   s    r†   c                  C   sˆ  t ƒ } tdƒ\}}}}}}}tt|ƒt|| ƒ t|| ƒ ƒdksHt‚tt|ƒd| | |tddƒ   ƒdksvt‚tt|ƒt|| ƒ t|| ƒ dd�dks¦t‚t|t|ƒ dd�d	ksÂt‚| j|t|ƒ | d
d�dksät‚| j|t|ƒ dd�dk�st‚| j|dd�dk�st‚tddd�\}}	t	dƒ}
t	dƒ}t	dƒ}t
d|	ƒ}t
d|ƒ}t|
||f ||  || dd�dk�s„t‚d S )Nzx,x_,x__,y,X,X_,Yz&      exp(x_) + sin(x*y) + cos(X__*Y_)rI   rs   z(      2*X_**(7.0d0/2.0d0)*Y*x + exp(x__)F)Zname_manglingz#      exp(x_) + sin(x*y) + cos(X*Y)z      x - cos(X)Úme©Ú	assign_toz      me = X*sin(x_) + x__Úmuz      mu = X*sin(x_)Úadz      ad = x__ún,mTrc   ÚArS   rT   Úir   rC   ©r‰   rE   zndo i = 1, m
   y(i) = 0
end do
do i = 1, m
   do I_ = 1, n
      y(i) = A(i, I_)*x(I_) + y(i)
   end do
end do)r<   r   r;   r   r   r   rM   r   Údoprintr=   r>   )ÚobrS   Zx_Zx__rT   ÚXZX_ÚYro   Úmr�   rŽ   r   rV   rV   rW   Ú	test_caset   s0    "ÿ$ÿ&ÿ" 

 ÿr•   c                  C   sø   t dƒ} tdƒ d¡}d}t| tdƒ ƒd| ks6t‚t| tdƒ ƒd| ksRt‚t| ttdƒƒ ƒd| ksrt‚tttdƒƒƒd| ksŽt‚ttdƒƒdtdƒ d¡ ks°t‚t| ttdƒƒ ƒd| ksÐt‚t| tttdƒƒƒ ƒd| ksôt‚d S )NrS   rr   é   z0.8340324452479558d0z      x*%sd0z
      %sd0z
      x*%s)r   r   Úevalfr;   rM   r   r   )rS   Zlog10_17Zloglog10_17rV   rV   rW   Ú"test_fcode_functions_with_integers“   s     " r˜   c                  C   sÎ  d} t ƒ }ttƒdt | ¡ ks$t‚ttƒdt | ¡ ks>t‚ttƒdt | ¡ ksXt‚ttƒdt | ¡ ksrt‚ttƒdt | ¡ ksŒt‚ttdd�dt d¡ ksªt‚ttd	d
�t| 	t | ¡¡fht
ƒ dfksØt‚ttd	d
�t| 	t | ¡¡fht
ƒ dfk�st‚ttd	d
�t| 	t | ¡¡fht
ƒ dfk�s8t‚ttd	d
�t| 	t | ¡¡fht
ƒ dfk�sht‚ttd	d
�t| 	t | ¡¡fht
ƒ dfk�s˜t‚ttdd	d�t| 	t d¡¡fht
ƒ dfk�sÊt‚d S )Nr–   z.      parameter (Catalan = %sd0)
      Catalanz4      parameter (EulerGamma = %sd0)
      EulerGammaz"      parameter (E = %sd0)
      Ez6      parameter (GoldenRatio = %sd0)
      GoldenRatioz$      parameter (pi = %sd0)
      pié   )Ú	precisionFrG   z      Catalanz      EulerGammaz      Ez      GoldenRatioz      pi)rš   rH   )r<   r;   r   r—   rM   r	   r   r
   r   rY   Úset)ÚprecrO   rV   rV   rW   Útest_fcode_NumberSymbol    s\     ÿÿ
ÿ ÿ
ÿ ÿ
  ÿÿ ÿ
  ÿ  ÿr�   c                  C   sÜ   t tƒdkst‚tdƒ} t dt ƒdks,t‚t ddt  ƒdksDt‚t ddt  |  ƒdks`t‚t t|  ƒdkstt‚t ddt  |  ƒd	ks�t‚tdd
d�} t d|  ƒdks°t‚t t|  ƒdksÄt‚t d|  ƒdksØt‚d S )Nz      cmplx(0,1)rS   é   z      cmplx(0,4)rp   z      cmplx(3,4)z      cmplx(3,4) + xz      cmplx(0,1)*xz      cmplx(3,4) - xT)Z	imaginaryr™   z	      5*xz      x + 3)r;   r   rM   r   ri   rV   rV   rW   Útest_fcode_complex¸   s    rŸ   c                  C   sN   t dƒ\} }tt| ƒƒdks t‚tt| |ƒƒdks6t‚tt| ƒƒdksJt‚d S )Nrn   z      sin(x)z      atan2(x, y)z      conjg(x))r   r;   r   rM   r   r   r�   rV   rV   rW   Útest_implicitÆ   s    r    c               	   C   sp   t dƒ} tdƒ}ttƒ� tt| ƒƒ W 5 Q R X ttt| ƒƒdd�dksLt‚ttƒ� t|| ƒƒ W 5 Q R X d S )NrS   ÚgF)ÚstrictzHC     Not supported in Fortran:
C     Integral
      Integral(sin(x), x))	r   r   rB   rl   r;   r   r    r   rM   )rS   r¡   rV   rV   rW   Útest_not_fortranÍ   s    

r£   c                  C   s˜   t dƒ} tt| ƒddid�dks$t‚t dƒ} tt| ƒddid�dksHt‚td	ƒ}t|| ƒd	d
id�dkslt‚t ddd�}tt|ƒddid�dks”t‚d S )NrS   r   ZzsinrK   z      zsin(x)r   Zmygammaz      mygamma(x)r¡   Zgreatz      great(x)ro   Trc   r   Zfctz      fct(n))r   r;   r   rM   r   r   r   )rS   r¡   ro   rV   rV   rW   Útest_user_functions×   s$     ÿÿ ÿÿr¤   c                  C   sÄ   t dƒ} tdt| d|  ƒƒ}t|| ƒƒdks0t‚tdt| dt |  ƒƒ}t|| ƒƒdt d¡ ksft‚tdƒ}tdt d	d
d�ƒ}tdt| | d|   d|   ƒƒ}t||| ƒ|| d�dksÀt‚d S )NrS   r¡   rI   z	      2*xz(      parameter (pi = %sd0)
      2*pi/xr–   r�   rŽ   ro   Trc   rq   rˆ   zI      do i = 1, n
         A(i) = (A(i) + 1)*(A(i) + 2)*A(i)
      end do)	r   rA   r   r;   rM   r   r—   r=   r>   )rS   r¡   r�   rŽ   rV   rV   rW   Útest_inline_functionä   s    
ý
 ÿr¥   c                  C   s$   t dƒ} tt| ƒdd�dks t‚d S )NrS   Úsrˆ   z      s = sin(x))r   r;   r   rM   ri   rV   rV   rW   Útest_assign_to÷   s    r§   c                     sZ   t dƒ\‰ } tˆ |  d  ¡ dd�dks,t‚‡ fdd„tdƒD ƒ}tt|Ž ƒd	ksVt‚d S )
Nrn   rr   Úvarrˆ   z¯      var = x**10 + 10*x**9*y + 45*x**8*y**2 + 120*x**7*y**3 + 210*x**6*
     @ y**4 + 252*x**5*y**5 + 210*x**4*y**6 + 120*x**3*y**7 + 45*x**2*y
     @ **8 + 10*x*y**9 + y**10c                    s   g | ]}ˆ | ‘qS rV   rV   )Ú.0rŽ   ri   rV   rW   Ú
<listcomp>  s     z&test_line_wrapping.<locals>.<listcomp>é   zR      x**10 + x**9 + x**8 + x**7 + x**6 + x**5 + x**4 + x**3 + x**2 + x
     @ + 1)r   r;   ÚexpandrM   Úranger   )rT   ÚerV   ri   rW   Útest_line_wrappingü   s    ÿ
ÿr¯   c                  C   s¬   t dƒ\} }tt| |k || d k ƒdd�dks2t‚tt| |k || d k ƒdd�dksXt‚tt| |k || d k dd�dd�d	ks‚t‚tt| |k || d k ƒdd�d
ks¨t‚d S )Núx yrq   rC   rD   zx < y .and. y < x + 1zx < y .or. y < x + 1F©Úevaluatezx < y .neqv. y < x + 1zx < y .eqv. y < x + 1)r   r;   r4   rM   r5   r8   r7   r�   rV   rV   rW   Útest_fcode_precedence
  s    ÿÿÿÿÿr³   c                  C   s„  t dƒ\} }}tt| ƒdd�dks&t‚tt| |ƒdd�dks@t‚tt| t|ƒƒdd�dks^t‚ttt| ƒ|ƒdd�dks|t‚ttt| ƒt|ƒƒdd�dksžt‚ttt| |ƒd	d
�dd�dksÀt‚tt| |ƒdd�dksÚt‚tt| t|ƒƒdd�dksøt‚ttt| ƒ|ƒdd�dk�st‚ttt| ƒt|ƒƒdd�dk�s<t‚ttt| |ƒd	d
�dd�dk�s`t‚ttt||ƒ| ƒdd�dk�s‚t‚ttt|| ƒ|ƒdd�dk�s¤t‚ttt| |ƒ|ƒdd�dk�sÆt‚ttt||ƒ| ƒdd�dk�sèt‚ttt|| ƒ|ƒdd�dk�s
t‚ttt| |ƒ|ƒdd�dk�s,t‚tt| ||ƒdd�dk�sJt‚tt| |t|ƒƒdd�dk�slt‚tt| t|ƒ|ƒdd�dk�sŽt‚ttt| ƒ||ƒdd�dk�s°t‚ttt| ||ƒd	d
�dd�dk�sÖt‚tt| ||ƒdd�dk�sôt‚tt| |t|ƒƒdd�dk�st‚tt| t|ƒ|ƒdd�dk�s8t‚ttt| ƒ||ƒdd�dk�sZt‚ttt| ||ƒd	d
�dd�d k�s€t‚d S )!NrF   rC   rD   z.not. xz	x .and. yzx .and. .not. yzy .and. .not. xz.not. x .and. .not. yFr±   z.not. (x .and. y)zx .or. yzx .or. .not. yzy .or. .not. xz.not. x .or. .not. yz.not. (x .or. y)zx .and. (y .or. z)zy .and. (x .or. z)zz .and. (x .or. y)zx .or. y .and. zzy .or. x .and. zzz .or. x .and. yzx .and. y .and. zzx .and. y .and. .not. zzx .and. z .and. .not. yzy .and. z .and. .not. xz.not. (x .and. y .and. z)zx .or. y .or. zzx .or. y .or. .not. zzx .or. z .or. .not. yzy .or. z .or. .not. xz.not. (x .or. y .or. z))r   r;   r6   rM   r4   r5   ©rS   rT   rU   rV   rV   rW   Útest_fcode_Logical  sh    ÿÿ ÿ
ÿ
""""""ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿrµ   c                  C   s8  t dƒ\} }}tt| |dd�dd�dks,t‚tt| t|ƒdd�dd�dksNt‚ttt| ƒ|dd�dd�dkspt‚ttt| ƒt|ƒdd�dd�d	ks–t‚ttt| |dd�dd�dd�d
ks¼t‚tt| |ƒdd�dksÖt‚tt| t|ƒƒdd�dksôt‚ttt| ƒ|ƒdd�dk�st‚ttt| ƒt|ƒƒdd�dk�s8t‚ttt| |ƒdd�dd�dk�s\t‚ttt||ƒ| ƒdd�dk�s~t‚ttt|| ƒ|ƒdd�dk�s t‚ttt| |ƒ|ƒdd�dk�sÂt‚ttt||ƒ| ƒdd�dk�sät‚ttt|| ƒ|ƒdd�dk�st‚ttt| |ƒ|ƒdd�dk�s(t‚ttt||ƒ| ƒdd�dk�sJt‚ttt|| ƒ|ƒdd�dk�slt‚ttt| |ƒ|ƒdd�dk�sŽt‚ttt||ƒ| ƒdd�dk�s°t‚ttt|| ƒ|ƒdd�dk�sÒt‚ttt| |ƒ|ƒdd�dk�sôt‚ttt||dd�| ƒdd�dk�st‚ttt|| dd�|ƒdd�dk�s@t‚ttt| |dd�|ƒdd�dk�sft‚ttt||ƒ| dd�dd�dk�sŒt‚ttt|| ƒ|dd�dd�d k�s²t‚ttt| |ƒ|dd�dd�d!k�sØt‚ttt||ƒ| dd�dd�d"k�sþt‚ttt|| ƒ|dd�dd�d#k�s$t‚ttt| |ƒ|dd�dd�d$k�sJt‚ttt||dd�| ƒdd�d%k�spt‚ttt|| dd�|ƒdd�d&k�s–t‚ttt| |dd�|ƒdd�d'k�s¼t‚ttt||ƒ| dd�dd�d(k�sât‚ttt|| ƒ|dd�dd�d)k�st‚ttt| |ƒ|dd�dd�d*k�s.t‚ttt||dd�| ƒdd�d+k�sTt‚ttt|| dd�|ƒdd�d,k�szt‚ttt| |dd�|ƒdd�d-k�s t‚tt| ||dd�dd�d.k�sÂt‚tt| |t|ƒdd�dd�d/k�sèt‚tt| t|ƒ|dd�dd�d0k�st‚ttt| ƒ||dd�dd�d1k�s4t‚d S )2NrF   Fr±   rC   rD   z
x .neqv. yzx .neqv. .not. yzy .neqv. .not. xz.not. x .neqv. .not. yz.not. (x .neqv. y)z	x .eqv. yzx .eqv. .not. yzy .eqv. .not. xz.not. x .eqv. .not. yz.not. (x .eqv. y)zx .eqv. y .and. zzy .eqv. x .and. zzz .eqv. x .and. yzx .and. (y .eqv. z)zy .and. (x .eqv. z)zz .and. (x .eqv. y)zx .eqv. y .or. zzy .eqv. x .or. zzz .eqv. x .or. yzx .or. (y .eqv. z)zy .or. (x .eqv. z)zz .or. (x .eqv. y)zx .eqv. (y .neqv. z)zy .eqv. (x .neqv. z)zz .eqv. (x .neqv. y)zx .neqv. (y .eqv. z)zy .neqv. (x .eqv. z)zz .neqv. (x .eqv. y)zx .neqv. y .and. zzy .neqv. x .and. zzz .neqv. x .and. yzx .and. (y .neqv. z)zy .and. (x .neqv. z)zz .and. (x .neqv. y)zx .neqv. y .or. zzy .neqv. x .or. zzz .neqv. x .or. yzx .or. (y .neqv. z)zy .or. (x .neqv. z)zz .or. (x .neqv. y)zx .neqv. y .neqv. zzx .neqv. y .neqv. .not. zzx .neqv. z .neqv. .not. yzy .neqv. z .neqv. .not. x)r   r;   r8   rM   r6   r7   r4   r5   r´   rV   rV   rW   Útest_fcode_XlogicalG  s*   ÿÿÿÿÿÿÿÿÿ
ÿ
ÿÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿÿ
ÿÿ
ÿÿ
ÿÿ
ÿÿ
ÿÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿr¶   c                  C   s¸   t dƒ\} }tt| |dƒdd�dks(t‚tt| |dƒdd�dksDt‚tt| |dƒdd�d	ks`t‚tt| |d
ƒdd�dks|t‚tt| |dƒdd�dks˜t‚tt| |dƒdd�dks´t‚d S )Nr°   z==rC   rD   zx == yz!=zx /= yz>=zx >= yz<=zx <= yú>zx > yú<zx < y)r   r;   r3   rM   r�   rV   rV   rW   Útest_fcode_Relationalª  s    r¹   c                     sf  t dƒ} t| | dk f| d dfƒ‰ tt‡ fdd„ƒ tˆ dd�}d	}||ksPt‚tt| | dk f| d dfƒd
d�dkszt‚t| ƒ|  }t| ƒ|  }tdƒD ]}t	|| ƒ}t	|| ƒ}qšd}tt|| dk f|dfƒdd�}||ksât‚tt| | dk f| d | dkft| ƒdfƒdd�}d}||k�s$t‚t| | dk f| d | dkft| ƒ| dkfƒ‰ tt
‡ fdd„ƒ d S )NrS   rq   rI   Tc                      s   t ˆ ƒS rh   r‚   rV   ©rR   rV   rW   rj   ¸  rk   z&test_fcode_Piecewise.<locals>.<lambda>re   r   z      merge(x, x**2, x < 1)r¨   rˆ   zR      if (x < 1) then
         var = x
      else
         var = x**2
      end ifrr   a/        if (x < 0) then
         weird_name = -cos(x)/x + 10*sin(x)/x**2 + 90*cos(x)/x**3 - 720*
     @ sin(x)/x**4 - 5040*cos(x)/x**5 + 30240*sin(x)/x**6 + 151200*cos(x
     @ )/x**7 - 604800*sin(x)/x**8 - 1814400*cos(x)/x**9 + 3628800*sin(x
     @ )/x**10 + 3628800*cos(x)/x**11
      else
         weird_name = -sin(x)/x - 10*cos(x)/x**2 + 90*sin(x)/x**3 + 720*
     @ cos(x)/x**4 - 5040*sin(x)/x**5 - 30240*cos(x)/x**6 + 151200*sin(x
     @ )/x**7 + 604800*cos(x)/x**8 - 1814400*sin(x)/x**9 - 3628800*cos(x
     @ )/x**10 + 3628800*sin(x)/x**11
      end ifr   Z
weird_namez1      merge(x, merge(x**2, sin(x), x > 1), x < 1)c                      s   t ˆ ƒS rh   r‚   rV   rº   rV   rW   rj   Ü  rk   )r   r   rB   rl   r;   rM   r   r   r­   r   Ú
ValueError)rS   ÚcodeÚexpectedÚaÚbrŽ   rV   rº   rW   Útest_fcode_Piecewise´  s.     ÿ
ÿ0,rÀ   c                  C   sÄ   t ƒ } ddddddddd	d
dddddg}|  |¡}dddddddddddddddddddddddddd d!dd"d#g}|D ]}t|ƒd$ksvt‚qvt||ƒD ]\}}||ks–t‚q–t|ƒt|ƒksÀt‚d S )%NzbC     This is a long comment on a single line that must be wrapped properly to produce nice outputzf      this = is + a + long + and + nasty + fortran + statement + that * must + be + wrapped + properlyzg      this = is + a + long + and + nasty + fortran + statement +  that * must + be + wrapped + properlyzh      this = is + a + long + and + nasty + fortran + statement +   that * must + be + wrapped + properlyzd      this = is + a + long + and + nasty + fortran + statement + that*must + be + wrapped + properlyzf      this = is + a + long + and + nasty + fortran + statement +   that*must + be + wrapped + properlyzg      this = is + a + long + and + nasty + fortran + statement +    that*must + be + wrapped + properlyzh      this = is + a + long + and + nasty + fortran + statement +     that*must + be + wrapped + properlyze      this = is + a + long + and + nasty + fortran + statement + that**must + be + wrapped + properlyzf      this = is + a + long + and + nasty + fortran + statement +  that**must + be + wrapped + properlyzg      this = is + a + long + and + nasty + fortran + statement +   that**must + be + wrapped + properlyzh      this = is + a + long + and + nasty + fortran + statement +    that**must + be + wrapped + properlyzi      this = is + a + long + and + nasty + fortran + statement +     that**must + be + wrapped + properlyzc      this = is + a + long + and + nasty + fortran + statement(that)/must + be + wrapped + properlyzg      this = is + a + long + and + nasty + fortran +     statement(that)/must + be + wrapped + properlyzBC     This is a long comment on a single line that must be wrappedz%C     properly to produce nice outputzG      this = is + a + long + and + nasty + fortran + statement + that *z%     @ must + be + wrapped + properlyzH      this = is + a + long + and + nasty + fortran + statement +  that *zG      this = is + a + long + and + nasty + fortran + statement +   thatz'     @ * must + be + wrapped + properlyzF      this = is + a + long + and + nasty + fortran + statement + that*zH      this = is + a + long + and + nasty + fortran + statement +   that*zH      this = is + a + long + and + nasty + fortran + statement +    thatz&     @ *must + be + wrapped + properlyz@      this = is + a + long + and + nasty + fortran + statement +z*     @ that*must + be + wrapped + properlyzG      this = is + a + long + and + nasty + fortran + statement + that**zH      this = is + a + long + and + nasty + fortran + statement +  that**z'     @ **must + be + wrapped + properlyz+     @ that**must + be + wrapped + properlyzE      this = is + a + long + and + nasty + fortran + statement(that)/zH      this = is + a + long + and + nasty + fortran +     statement(that)z&     @ /must + be + wrapped + properlyéH   )r<   Ú_wrap_fortranÚlenrM   Úzip)r\   ÚlinesÚwrapped_linesZexpected_linesÚlineÚwr®   rV   rV   rW   Útest_wrap_fortranß  sl    ñ
â rÉ   c                  C   sF   t ƒ } ddddddg}dddd	dd
dddddg}|  |¡|ksBt‚d S )NzH      this_variable_is_very_long_because_we_try_to_test_line_break=1.0d0zI      this_variable_is_very_long_because_we_try_to_test_line_break =1.0d0zK      this_variable_is_very_long_because_we_try_to_test_line_break  = 1.0d0zL      this_variable_is_very_long_because_we_try_to_test_line_break   = 1.0d0zM      this_variable_is_very_long_because_we_try_to_test_line_break    = 1.0d0zK      this_variable_is_very_long_because_we_try_to_test_line_break = 10.0d0zD      this_variable_is_very_long_because_we_try_to_test_line_break =z     @ 1.0d0zE      this_variable_is_very_long_because_we_try_to_test_line_break  =zF      this_variable_is_very_long_because_we_try_to_test_line_break   =zG      this_variable_is_very_long_because_we_try_to_test_line_break    =z     @ 10.0d0©r<   rÂ   rM   ©r\   rÅ   r½   rV   rV   rW   Útest_wrap_fortran_keep_d0  s*    ú	õrÌ   c                   C   s   t tdd„ ƒ d S )Nc                   S   s   t tdƒdd�S )Nrž   Úgarbage)Úmethod)r;   r   rV   rV   rV   rW   rj   6  rk   ztest_settings.<locals>.<lambda>)rB   Ú	TypeErrorrV   rV   rV   rW   Útest_settings5  s    rÐ   c                  C   s0   t dƒ\} }tt| ƒt|ƒ dd�dks,t‚d S )Nrn   rC   rD   zsin(y) + cos(x))r   r;   r   r   rM   r�   rV   rV   rW   Útest_free_form_code_line9  s    rÑ   c                  C   s@   t dƒ\} }tt| ƒt|ƒ d  ¡ dd�}d}||ks<t‚d S )Nrn   rs   rC   rD   zµsin(y)**7 + 7*sin(y)**6*cos(x) + 21*sin(y)**5*cos(x)**2 + 35*sin(y)**4* &
      cos(x)**3 + 35*sin(y)**3*cos(x)**4 + 21*sin(y)**2*cos(x)**5 + 7* &
      sin(y)*cos(x)**6 + cos(x)**7)r   r;   r   r   r¬   rM   )rS   rT   Úresultr½   rV   rV   rW   Ú test_free_form_continuation_line>  s
     ÿrÓ   c                  C   s0   t ddiƒ} dg}ddg}|  |¡|ks,t‚d S )NrE   rC   z^! This is a long comment on a single line that must be wrapped properly to produce nice outputzG! This is a long comment on a single line that must be wrapped properlyz! to produce nice outputrÊ   rË   rV   rV   rW   Útest_free_form_comment_lineI  s    þrÔ   c            	      C   sª   t ddd�\} }tdƒ}tdƒ}tdƒ}td|ƒ}td| ƒ}d	}t|||f ||  || d
d�}||ddi ks¦||ddi ks¦||ddi ks¦||ddi ks¦t‚d S )NrŒ   Trc   r�   rS   rT   rŽ   Újz_do i = 1, m
   y(i) = 0
end do
do i = 1, m
   do j = 1, n
      y(i) = %(rhs)s
   end do
end dorC   r�   Úrhszy(i) + A(i, j)*x(j)zy(i) + x(j)*A(i, j)zx(j)*A(i, j) + y(i)zA(i, j)*x(j) + y(i))r   r=   r>   r;   rM   )	ro   r”   r�   rS   rT   rŽ   rÕ   r½   r¼   rV   rV   rW   Ú
test_loopsR  s     

ÿ"ÿþýr×   c                  C   sf   t ddtd�\} }tdƒ}tdƒ}t| |ƒ} d| jj|jdœ }t||  ||  dd	�}||ksbt‚d S )
Nzi mT)r/   ÚclsrS   rT   zMdo i_%(icount)i = 1, m_%(mcount)i
   y(i_%(icount)i) = x(i_%(icount)i)
end do)ZicountZmcountrC   r�   )r   r   r=   r>   ÚlabelZdummy_indexr;   rM   )rŽ   r”   rS   rT   r½   r¼   rV   rV   rW   Útest_dummy_loopsl  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
¡s’t‚d S )Nr™   rT   ©ÚshaperS   ÚDyrq   rŽ   F)r‰   Zcontractú+Dy(i) = (y(i + 1) - y(i))/(x(i + 1) - x(i)))r=   r>   r   r;   rÖ   ÚlhsÚendswithrM   ©Zlen_yrT   rS   rÝ   rŽ   r®   Zcode0rV   rV   rW   Ú2test_fcode_Indexed_without_looking_for_contraction{  s    2râ   c                     s  d} t d| fd�}t d| fd�}t d| d fd�}td| d ƒ}t|| ||d  ||  ||d  ||   ƒ}tt|j|jƒƒ}| d¡s’t‚G d	d
„ d
t	t
ƒ‰ | ‡ fdd„| t¡D ƒ¡}t|| ||d  ||  ||d  ||   ƒ}tt|j|jƒƒ}| d¡�st‚d S )Nr™   rT   rÛ   rS   rÝ   rq   rŽ   rÞ   c                   @   s   e Zd ZdS )z.test_element_like_objects.<locals>.ElementExprN)r^   r_   r`   rV   rV   rV   rW   ÚElementExpr�  s   rã   c                 3   s    | ]}|ˆ |j |jƒfV  qd S rh   )ÚnameÚindices)r©   r¾   ©rã   rV   rW   Ú	<genexpr>“  s     z,test_element_like_objects.<locals>.<genexpr>)r?   r>   r   r;   r#   rß   rÖ   rà   rM   r1   r   ÚsubsZatomsr@   rá   rV   ræ   rW   Útest_element_like_objects†  s    22ré   c                  C   s:   G dd„ dt ƒ} | ƒ }tdƒ}| t|ƒd¡dks6t‚d S )Nc                   @   s   e Zd Zej ¡ ZdS )z1test_derived_classes.<locals>.MyFancyFCodePrinterN)r^   r_   r`   r<   Z_default_settingsÚcopyrV   rV   rV   rW   ÚMyFancyFCodePrinterš  s   rë   rS   Zborkz      bork = sin(x))r<   r   r�   r   rM   )rë   r\   rS   rV   rV   rW   Útest_derived_classes™  s    rì   c                  C   s.   d} d}t ddiƒ}| | ¡}||ks*t‚d S )Nau  subroutine test(a)
integer :: a, i, j

do
do 
do j = 1, 5
if (a>b) then
if(b>0) then
a = 3
donot_indent_me = 2
do_not_indent_me_either = 2
ifIam_indented_something_went_wrong = 2
if_I_am_indented_something_went_wrong = 2
end should not be unindented here
end if
endif
end do
end do
enddo
end subroutine

subroutine test2(a)
integer :: a
do
a = a + 1
end do 
end subroutine
a  subroutine test(a)
integer :: a, i, j

do
   do 
      do j = 1, 5
         if (a>b) then
            if(b>0) then
               a = 3
               donot_indent_me = 2
               do_not_indent_me_either = 2
               ifIam_indented_something_went_wrong = 2
               if_I_am_indented_something_went_wrong = 2
               end should not be unindented here
            end if
         endif
      end do
   end do
enddo
end subroutine

subroutine test2(a)
integer :: a
do
   a = a + 1
end do 
end subroutine
rE   rC   )r<   Zindent_coderM   )Z	codelinesr½   rO   rÒ   rV   rV   rW   Útest_indent¢  s    ÿÿ
rí   c            	      C   s.  t dƒ\} }}t| | td|  |dkf|dfƒt|ƒgƒ}tdddƒ}t||ƒdksXt‚td|d	  | dkf|d	 dfƒt|d
 ƒ |d  }t|dd�dks¢t‚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 )Nzx,y,zrI   r   Tr�   rp   rq   z†      A(1, 1) = x*y
      if (y > 0) then
         A(2, 1) = x + 2
      else
         A(2, 1) = y
      end if
      A(3, 1) = sin(z))rI   r   )rq   r   ©r   r   re   r   z?      merge(2*A(3, 1), A(3, 1), x > 0) + sin(A(2, 1)) + A(1, 1)rP   r™   ÚM)rp   r   )rž   r   rž   zí      M(1, 1) = sin(q(2, 1))
      M(2, 1) = q(2, 1) + q(3, 1)
      M(3, 1) = 2*q(5, 1)/q(2, 1)
      M(1, 2) = 0
      M(2, 2) = q(4, 1)
      M(3, 2) = sqrt(q(1, 1)) + 4
      M(1, 3) = cos(q(3, 1))
      M(2, 3) = 5
      M(3, 3) = 0)	r   r9   r   r   r:   r;   rM   r   r   )	rS   rT   rU   Zmatr�   rR   rP   rï   r”   rV   rV   rW   Útest_Matrix_printingá  s&    ,ÿ	6
ÿ$þÿrð   c                  C   sD   t dƒ\} }t| tdddƒt|| | ƒgƒ}t|ƒ}|dks@t‚d S )Nr°   r   rr   rI   z2      do x = 0, 9, 2
         y = x*y
      end do)r   r"   r!   r#   r;   rM   )rS   rT   ÚfZsolrV   rV   rW   Útest_fcode_For  s     rò   c            
      C   sº   dd„ } t ddd�}t |¡}t|ƒ}| |dƒ t dƒ\}}t|tdthd	�}t|ƒ}| |d
ƒ t|td�}t|ƒ}	| |	dƒ | tdƒ | tdƒ | tdttid� | tdttid� d S )Nc                 [   s"   t | fdddœ|—Ž|kst‚d S )Nre   rC   rf   )r;   rM   )rR   ÚrefÚkwargsrV   rV   rW   Úcheck  s    z%test_fcode_Declaration.<locals>.checkrŽ   Trc   zinteger*4 :: ir°   é*   )ÚvalueÚattrszreal*4, parameter :: x = 42©Útypezlogical :: yzreal*4zreal*8)Ztype_aliases)	r   r&   Zdeducedr%   r'   r)   r+   r(   r*   )
rõ   rŽ   Zvar1Zdcl1rS   rT   Zvar2Zdcl2bZvar3Zdcl3rV   rV   rW   Útest_fcode_Declaration  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�   rq   rp   ÚBÚCrî   z      A(1, 1)z      3*A(1, 1)z      (A - B)(1, 1))r:   r;   rM   rè   )r�   rü   rý   ÚFrV   rV   rW   Útest_MatrixElement_printing'  s    rÿ   c                  C   s(   t dƒ} tt| ddƒdd�dks$t‚d S )NrS   ú+rq   rC   rD   z	x = x + 1)r   r;   r$   rM   ri   rV   rV   rW   Útest_aug_assign4  s    r  c                  C   s8   t dƒ} ttt| ƒdkt| ddƒgƒdd�dks4t‚d S )NrS   rq   ú-rC   rD   z)do while (abs(x) > 1)
   x = x - 1
end do)r   r;   r,   rL   r$   rM   ri   rV   rV   rW   Ú
test_While9  s    "ÿr  c                     sR   t dƒ} t ddd�}t| td�}t|td�}ttd||gƒ‰ tt‡ fdd„ƒ d S )	NrS   ro   Trc   rù   Úpowerc                      s   t ˆ ƒS rh   r‚   rV   ©Úfp1rV   rW   rj   J  rk   z.test_FunctionPrototype_print.<locals>.<lambda>)r   r&   r*   r/   r-   rB   rl   )rS   ro   ÚvxÚvnrV   r  rW   Útest_FunctionPrototype_printB  s    r	  c                     sj   t dƒ} t ddd�}t| td�}t|td�}t| | | ƒt| ƒg}ttd||g|ƒ‰ tt‡ fdd„ƒ d S )	NrS   ro   Trc   rù   r  c                      s   t ˆ ƒS rh   r‚   rV   ©Zfd1rV   rW   rj   V  rk   z/test_FunctionDefinition_print.<locals>.<lambda>)	r   r&   r*   r/   r#   r0   r.   rB   rl   )rS   ro   r  r  ÚbodyrV   r
  rW   Útest_FunctionDefinition_printM  s    r  N)‡Zsympy.core.addr   Zsympy.core.exprr   Zsympy.core.functionr   r   r   Zsympy.core.modr   Z
sympy.corer   r	   r
   Zsympy.core.numbersr   r   r   r   r   r   Zsympy.core.relationalr   Zsympy.core.singletonr   Zsympy.core.symbolr   r   Z(sympy.functions.combinatorial.factorialsr   Z$sympy.functions.elementary.complexesr   r   Z&sympy.functions.elementary.exponentialr   r   Z(sympy.functions.elementary.miscellaneousr   Z$sympy.functions.elementary.piecewiser   Z(sympy.functions.elementary.trigonometricr   r   r   Z'sympy.functions.special.gamma_functionsr   Zsympy.integrals.integralsr    Zsympy.sets.fancysetsr!   Zsympy.codegenr"   r#   r$   Zsympy.codegen.astr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   Zsympy.logic.boolalgr4   r5   r6   r7   r8   Zsympy.matricesr9   r:   Zsympy.printing.fortranr;   r<   Zsympy.tensorr=   r>   Zsympy.tensor.array.expressionsr?   r@   Zsympy.utilities.lambdifyrA   Zsympy.testing.pytestrB   rX   rb   rm   rt   rx   r{   r|   r†   r•   r˜   r�   rŸ   r    r£   r¤   r¥   r§   r¯   r³   rµ   r¶   r¹   rÀ   rÉ   rÌ   rÐ   rÑ   rÓ   rÔ   r×   rÚ   râ   ré   rì   rí   rð   rò   rû   rÿ   r  r  r	  r  rV   rV   rV   rW   Ú<module>   sŽ    <	


1c
+<		?#
	