
    g                        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 Z\d Z]d  Z^d! Z_d" Z`d# Zad$ Zbd% Zcd& Zdd' Zed( Zfd) Zgd* Zhd+ Zid, Zjd- Zkd. Zld/ Zmd0 Znd1 Zod2 Zpd3 Zqd4 Zrd5 Zsd6 Ztd7 Zud8 Zvd9 Zwd: Zxd; Zyd< Zzd= Z{d> Z|d? Z}d@ Z~dA ZdB ZdC ZdD ZdE ZdF ZdG ZdH ZdIS )J    )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                     t          dd          \  } }}t          ||z             }t          t          | |z                       }t	          |d          dk    sJ t          d          \  }}}t          ||z             }t          t          ||z                       }	t	          |	d	          d
                                         dk    sJ t	          |	ddi                                          dk    sJ 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))rerealpartuser_functionsz"exp(realpart(x) + realpart(y + z)))r   r3   absr   r<   lstrip)
pqrq_rexprxyzy_zexpr2s
             ]/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/printing/tests/test_fortran.pytest_UnevaluatedExprr]   #   s    gD)))GAq!
!a%
 
 Cs1S5zz??DV,,,0BBBBBgGAq!
!a%
 
 CAcE

OOEe$$$Q'..004LLLLLj'9:::AACCGkkkkkkk    c                      t          d          }  G d dt                    }t           ||                     dk    sJ d S )NrW   c                       e Zd Zd ZdS )test_printmethod.<locals>.nintc                 H    d|                     | j        d                   z  S )Nznint(%s)r   )_printargs)selfprinters     r\   _fcodez%test_printmethod.<locals>.nint._fcode3   s    ty| < <<<r^   N)__name__
__module____qualname__rg    r^   r\   nintra   2   s#        	= 	= 	= 	= 	=r^   rl   z      nint(x))r   r   r<   )rW   rl   s     r\   test_printmethodrm   /   s^    A= = = = =x = = = a>>_,,,,,,r^   c                  x   t          d          t          dd          } t          dd          }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          fd           d S )NrW   rX   Tr0   rY   )complex_   rE   standardrG   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                  <    t          t                               S N)r<   r   rW   s   r\   <lambda>z!test_fcode_sign.<locals>.<lambda>?   s    d1gg r^   )r   r<   r   rC   NotImplementedError)rX   rY   rW   s     @r\   test_fcode_signry   8   s    cllAc4   Ac4   Aa2V<<<@eeeeea2V<<<@_____a2V<<<@qqqqq
 6 6 6 677777r^   c                     t          d          \  } }t          dd          }t          | dz            dk    sJ t          | |dz  z            dk    sJ t          dt          |           d	z  | || z  z
  z  z  | d
z  |z   z            dk    sJ t          t          |                     dk    sJ t          t          |                    dk    sJ t          | dz            dk    sJ t          t          |                     dk    sJ t          t          d                    dk    sJ t          | dz            dk    sJ t          | dz  dd          dk    sJ t          | t	          dd          z            dk    sJ d S )Nx,ynTro      z
      x**3z      x**(y**3)   g      @rK   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       rX   rE   rF   zy = x**(-2.0d0)   z      x**(3.0d0/7.0d0))r   r<   r   r   r   )rW   rX   r|   s      r\   test_fcode_Powr   B   s   5>>DAqT"""AA;;,&&&&QT00000CFF3J!ad(++QTAX67767 7 7 7a>>_,,,,a>>22222C==O++++a>>_,,,,b??22222D>>]****D#V4448IIIIIHQNN"##'???????r^   c                     t          d          } 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          dd          z             dk    sJ t          t          dd          | z            dk    sJ d S )NrW   r}   r   z      3.0d0/7.0d0   	   z      2iz      -3.0d0/7.0d0z      x + 3.0d0/7.0d0z      (3.0d0/7.0d0)*x)r   r<   r   rv   s    r\   test_fcode_Rationalr   T   s    A!Q  $77777"a!!Y....!R!!%99999"b!!""&99999Xa^^#$$(?????!Q!""&=======r^   c                      t          t          d                    dk    sJ t          t          d                    dk    sJ d S )NC   z      67z      -1)r<   r   rk   r^   r\   test_fcode_Integerr   ^   sF    ++++++++++r^   c                      t          t          d                    dk    sJ t          t          d                    dk    sJ d S )Ng      E@z      42.0000000000000d0g@xz      -1.00000000000000d+20)r<   r   rk   r^   r\   test_fcode_Floatr   c   sH    t!;;;;;u"???????r^   c                     t          d          \  t          t                    t                    z            dk    sJ t	          t
          fd           t	          t
          fd           t	          t
          fd           t	          t
          fd           dD ]A} t          t                    |           d	k    sJ t          z  |           d	k    sJ Bd S )
Nr{   z      sin(x)**cos(y)c                  B    t          t                     d          S NB   rs   r<   r   rW   rX   s   r\   rw   z&test_fcode_functions.<locals>.<lambda>k       c!Qii"(E(E(E r^   c                  ,    t           z  d          S r   r<   r   s   r\   rw   z&test_fcode_functions.<locals>.<lambda>l       a!eb(A(A(A r^   c                  B    t          t                     d          S NM   r   r   r   s   r\   rw   z&test_fcode_functions.<locals>.<lambda>m   r   r^   c                  ,    t           z  d          S r   r   r   s   r\   rw   z&test_fcode_functions.<locals>.<lambda>n   r   r^   )Z   rq   i  i  r   z      modulo(x, y))r   r<   r   r   rC   rx   r   )rs   rW   rX   s    @@r\   test_fcode_functionsr   h   s    5>>DAqQ3q66!""&<<<<<
 E E E E EFFF
 A A A A ABBB
 E E E E EFFF
 A A A A ABBB( G GSAYY2226JJJJJQUX...2FFFFFFG Gr^   c            	      T   t                      } t          d          \  }}}}}}}t          t          |          t	          ||z            z   t          ||z            z             dk    sJ t          t          |          d|z  |z  |t          dd          z  z  z             dk    sJ t          t          |          t	          ||z            z   t          ||z            z   d          dk    sJ t          |t          |          z
  d          d	k    sJ |                     |t	          |          z  |z   d
          dk    sJ |                     |t	          |          z  d          dk    sJ |                     |d          dk    sJ t          dd          \  }}	t          d          }
t          d          }t          d          }t          d|	          }t          d|          }t          |
||f         ||         z  ||         d          dk    sJ d S )Nzx,x_,x__,y,X,X_,Yz&      exp(x_) + sin(x*y) + cos(X__*Y_)rK   r   z(      2*X_**(7.0d0/2.0d0)*Y*x + exp(x__)F)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,mTro   ArW   rX   ir   rE   r   rG   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   r   doprintr>   r?   )obrW   x_x__rX   XX_Yr|   mr   r   r   s                r\   	test_caser   t   sO   	B 344AbQqAR3qs88#c!A#hh.//@A A A ASAaCE"hq!nn"44455BC C C CR3qs88#c!A#hh.eDDD=> > > >SVV51115GGGGG::aAhmt:448TTTTT::aAh$://3IIIII::bD:))-=====5$'''DAqCACACACACA1a411VDDD-57 7 7 7 7 7r^   c            
      R   t          d          } t          d                              d          }d}t          | t          d          z            d|z  k    sJ t          | t          d          z            d|z  k    sJ t          | t          t	          d                    z            d|z  k    sJ t          t          t	          d                              d|z  k    sJ t          t          d                    dt          d                              d          z  k    sJ t          | t          t          d                    z            d|z  k    sJ t          | t          t          t	          d                              z            d|z  k    sJ d S )NrW   r      z0.8340324452479558d0z      x*%sd0z
      %sd0z
      x*%s)r   r   evalfr<   r   r   )rW   log10_17loglog10_17s      r\   "test_fcode_functions_with_integersr      so   s||A2ww}}R  H(KSWW(!:::::SWW(!:::::S2ZZ  NX$=====QrUUx 77777R>>\CGGMM",=,======SR\\!""l[&@@@@@SQrUU__$%%)CCCCCCCr^   c                     d} t                      }t          t                    dt          j        |           z  k    sJ t          t                    dt	          j        |           z  k    sJ t          t
                    dt          j        |           z  k    sJ t          t                    dt          j        |           z  k    sJ t          t                    dt          j        |           z  k    sJ t          t          d          dt          j        d          z  k    sJ t          t          d	
          t          |                    t          j        |                     fht                      dfk    sJ t          t          d	
          t          |                    t	          j        |                     fht                      dfk    sJ t          t
          d	
          t
          |                    t          j        |                     fht                      dfk    sJ t          t          d	
          t          |                    t          j        |                     fht                      dfk    sJ t          t          d	
          t          |                    t          j        |                     fht                      dfk    sJ t          t          dd	          t          |                    t          j        d                    fht                      dfk    sJ d S )Nr   z.      parameter (Catalan = %sd0)
      Catalanz4      parameter (EulerGamma = %sd0)
      EulerGammaz"      parameter (E = %sd0)
      Ez6      parameter (GoldenRatio = %sd0)
      GoldenRatioz$      parameter (pi = %sd0)
      pi   )	precisionFrI   z      Catalanz      EulerGammaz      Ez      GoldenRatioz      pi)r   rJ   )
r=   r<   r	   r   r
   r   r   r   rc   set)precrR   s     r\   test_fcode_NumberSymbolr      s0   DA>>NQXQ^_cQdQdddddd WZdZjkoZpZp ppppp88<qwt}}LLLLL!Z]h]nos]t]t!ttttt99?"(4..PPPPP
a  CbhqkkQR R R R&&&	!((7=..//0,23655/+K K K K K5)))
AHH=  =  0! /"#&55*<.> > > > >%   
QXXagdmm$$	%&y%: : : : :E***ahh$?! ?! 1" 0#$'EE+>/@ @ @ @ @5!!!
ahhrx~~&&	'(#%%&= = = = =q...
ahhrx{{##	$%suuj3: : : : : : :r^   c                  T   t          t                    dk    sJ t          d          } t          dt          z            dk    sJ t          ddt          z  z             dk    sJ t          ddt          z  z   | z             dk    sJ t          t          | z            dk    sJ t          ddt          z  z   | z
            d	k    sJ t          dd
          } t          d| z            dk    sJ t          t          | z            dk    sJ t          d| z             dk    sJ d S )Nz      cmplx(0,1)rW      z      cmplx(0,4)r}   z      cmplx(3,4)z      cmplx(3,4) + xz      cmplx(0,1)*xz      cmplx(3,4) - xT)	imaginaryr   z	      5*xz      x + 3)r<   r   r   rv   s    r\   test_fcode_complexr      s3   88)))))A1::+++++QqS>>/////QqS1!777771::-----QqS1!77777t$$$A1::$$$$1::-----Q<<=((((((r^   c                      t          d          \  } }t          t          |                     dk    sJ t          t          | |                    dk    sJ t          t	          |                     dk    sJ d S )Nr{   z      sin(x)z      atan2(x, y)z      conjg(x))r   r<   r   r   r   r   s     r\   test_implicitr      sv    5>>DAqQ==N****q!!444441"2222222r^   c                     t          d          } t          d          }t          t                    5  t	          t          |                      d d d            n# 1 swxY w Y   t	          t          t          |                     d          dk    sJ t          t                    5  t	           ||                      d d d            d S # 1 swxY w Y   d S )NrW   gF)strictzHC     Not supported in Fortran:
C     Integral
      Integral(sin(x), x))r   r   rC   rx   r<   r    r!   r   )rW   r   s     r\   test_not_fortranr      sO   AA	#	$	$  eAhh              #a&&!!%000  5A  A  A  A  A	#	$	$  aadd                 s#   AA #A ,CCCc                     t          d          } t          t          |           ddi          dk    sJ t          d          } t          t          |           ddi          dk    sJ t	          d	          }t           ||           d	d
i          dk    sJ t          dd          }t          t          |          ddi          dk    sJ d S )NrW   r   zsinrN   z      zsin(x)r    mygammaz      mygamma(x)r   greatz      great(x)r|   Tro   r   fctz      fct(n))r   r<   r   r    r   r   )rW   r   r|   s      r\   test_user_functionsr      s   AQ888OKKKKAa'9!57 7 7:LM M M MA1sGn5559IIIIIT"""A!k5%9; ; ;>LM M M M M Mr^   c            	      b   t          d          } t          dt          | d| z                      }t           ||                     dk    sJ t          dt          | dt          z  | z                      }t           ||                     dt	          j        d          z  k    sJ t          d          }t          dt          d	d
                    }t          dt          | | d| z   z  d| z   z                      }t           |||                   ||                   dk    sJ d S )NrW   r   rK   z	      2*xz(      parameter (pi = %sd0)
      2*pi/xr   r   r   r|   Tro   r~   r   zI      do i = 1, n
         A(i) = (A(i) + 1)*(A(i) + 2)*A(i)
      end do)r   rB   r   r<   r   r   r>   r?   )rW   r   r   r   s       r\   test_inline_functionr      s:   AS&AaC..11A1;;+%%%%S&AbDF"3"344A1;;	
     	CACd+++,,AS&Aq1uIq1u,=">">??A1Q4AaD)))	     r^   c                  l    t          d          } t          t          |           d          dk    sJ d S )NrW   sr   z      s = sin(x))r   r<   r   rv   s    r\   test_assign_tor      s8    AQ3'''+=======r^   c                      t          d          \  } t          | z   dz                                  d          dk    sJ fdt          d          D             }t          t	          |           dk    sJ d S )	Nr{   r   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                     g | ]}|z  S rk   rk   ).0r   rW   s     r\   
<listcomp>z&test_line_wrapping.<locals>.<listcomp>  s    !!!!A!!!r^      zR      x**10 + x**9 + x**8 + x**7 + x**6 + x**5 + x**4 + x**3 + x**2 + x
     @ + 1)r   r<   expandranger   )rX   erW   s     @r\   test_line_wrappingr      s    5>>DAq1q52+%%''5999	)   
 	"!!!uRyy!!!Aa>>	     r^   c                     t          d          \  } }t          t          | |k     || dz   k               d          dk    sJ t          t          | |k     || dz   k               d          dk    sJ t          t	          | |k     || dz   k     d          d          d	k    sJ t          t          | |k     || dz   k               d          d
k    sJ d S )Nx yr~   rE   rF   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<   r5   r6   r9   r8   r   s     r\   test_fcode_precedencer   
  s   5>>DAqQUAAI&&f===       AE1q1u9%%V<<<   QUAAI666  !9: : : :AE1q1u9--VDDD           r^   c            	      
   t          d          \  } }}t          t          |           d          dk    sJ t          t          | |          d          dk    sJ t          t          | t          |                    d          dk    sJ t          t          t          |           |          d          dk    sJ t          t          t          |           t          |                    d          dk    sJ t          t          t          | |          d	
          d          dk    sJ t          t	          | |          d          dk    sJ t          t	          | t          |                    d          dk    sJ t          t	          t          |           |          d          dk    sJ t          t	          t          |           t          |                    d          dk    sJ t          t          t	          | |          d	
          d          dk    sJ t          t          t	          ||          |           d          dk    sJ t          t          t	          ||           |          d          dk    sJ t          t          t	          | |          |          d          dk    sJ t          t	          t          ||          |           d          dk    sJ t          t	          t          ||           |          d          dk    sJ t          t	          t          | |          |          d          dk    sJ t          t          | ||          d          dk    sJ t          t          | |t          |                    d          dk    sJ t          t          | t          |          |          d          dk    sJ t          t          t          |           ||          d          dk    sJ t          t          t          | ||          d	
          d          dk    sJ t          t	          | ||          d          dk    sJ t          t	          | |t          |                    d          dk    sJ t          t	          | t          |          |          d          dk    sJ t          t	          t          |           ||          d          dk    sJ t          t          t	          | ||          d	
          d          d k    sJ d S )!NrH   rE   rF   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<   r7   r5   r6   rW   rX   rY   s      r\   test_fcode_Logicalr     s   gGAq!Qv...);;;;Q&111[@@@@QAv666:KKKKKSVVQv666:KKKKKSVVSVV$$F;;;       SAYY///vFFF    Aq000J>>>>As1vvf5559IIIIICFFAf5559IIIIICFFCFF##6:::   R1XX...fEEE    R1XXq!!888<PPPPPR1XXq!!888<PPPPPR1XXq!!888<PPPPPC1IIq!!888<NNNNNC1IIq!!888<NNNNNC1IIq!!888<NNNNNQ1V4448KKKKKQ3q66""&999!" " " "QA""&999!" " " "SVVQ""&999!" " " "SAq\\E222&III#$ $ $ $ Aq!F3337HHHHHAq#a&&!!888       As1vvq!!888       CFFAq!!888       R1a[[5111HHH!" " " " " "r^   c            	         t          d          \  } }}t          t          | |d          d          dk    sJ t          t          | t          |          d          d          dk    sJ t          t          t          |           |d          d          dk    sJ t          t          t          |           t          |          d          d          d	k    sJ t          t          t          | |d          d          d          d
k    sJ t          t	          | |          d          dk    sJ t          t	          | t          |                    d          dk    sJ t          t	          t          |           |          d          dk    sJ t          t	          t          |           t          |                    d          dk    sJ t          t          t	          | |          d          d          dk    sJ t          t	          t          ||          |           d          dk    sJ t          t	          t          ||           |          d          dk    sJ t          t	          t          | |          |          d          dk    sJ t          t          t	          ||          |           d          dk    sJ t          t          t	          ||           |          d          dk    sJ t          t          t	          | |          |          d          dk    sJ t          t	          t          ||          |           d          dk    sJ t          t	          t          ||           |          d          dk    sJ t          t	          t          | |          |          d          dk    sJ t          t          t	          ||          |           d          dk    sJ t          t          t	          ||           |          d          dk    sJ t          t          t	          | |          |          d          dk    sJ t          t	          t          ||d          |           d          dk    sJ t          t	          t          || d          |          d          dk    sJ t          t	          t          | |d          |          d          dk    sJ t          t          t	          ||          | d          d          dk    sJ t          t          t	          ||           |d          d          d k    sJ t          t          t	          | |          |d          d          d!k    sJ t          t          t          ||          | d          d          d"k    sJ t          t          t          ||           |d          d          d#k    sJ t          t          t          | |          |d          d          d$k    sJ t          t          t          ||d          |           d          d%k    sJ t          t          t          || d          |          d          d&k    sJ t          t          t          | |d          |          d          d'k    sJ t          t          t          ||          | d          d          d(k    sJ t          t          t          ||           |d          d          d)k    sJ t          t          t          | |          |d          d          d*k    sJ t          t          t          ||d          |           d          d+k    sJ t          t          t          || d          |          d          d,k    sJ t          t          t          | |d          |          d          d-k    sJ t          t          | ||d          d          d.k    sJ t          t          | |t          |          d          d          d/k    sJ t          t          | t          |          |d          d          d0k    sJ t          t          t          |           ||d          d          d1k    sJ d S )2NrH   Fr   rE   rF   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<   r9   r7   r8   r5   r6   r   s      r\   test_fcode_Xlogicalr   G  s
   gGAq!QE***&AAA   QA///vFFF   SVVQ///vFFF   SVVSVVe444  !9: : : :SA...???  !56 6 6 6 Aq!!888KGGGGAs1vv&&f===   CFFA&&f===   CFFCFF++6BBB       Z1%%666  !45 5 5 5 C1IIq))@@@   C1IIq))@@@   C1IIq))@@@   Z1%%q))@@@   Z1%%q))@@@   Z1%%q))@@@    Bq!HHa((???   Bq!HHa((???   Bq!HHa((???   Jq!$$a((???   Jq!$$a((???   Jq!$$a((???    C1u555q99  !78 8 8 8C1u555q99  !78 8 8 8C1u555q99  !78 8 8 8Z1%%q5999  !78 8 8 8Z1%%q5999  !78 8 8 8Z1%%q5999  !78 8 8 8 SAYYE222&III   SAYYE222&III   SAYYE222&III   SA...22&III   SA...22&III   SA...22&III    R1XXq5111HHH   R1XXq5111HHH   R1XXq5111HHH   C1u---q11HHH   C1u---q11HHH   C1u---q11HHH    Q1u---VDDD   Q3q66E222&III#$ $ $ $QAE222&III#$ $ $ $SVVQE222&III#$ $ $ $ $ $r^   c                     t          d          \  } }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          | |d          d          dk    sJ t          t          | |d          d          dk    sJ d S )Nr   z==rE   rF   zx == yz!=zx /= yz>=zx >= yz<=zx <= y>zx > y<zx < y)r   r<   r4   r   s     r\   test_fcode_Relationalr     s   5>>DAqAq$''v>>>(JJJJAq$''v>>>(JJJJAq$''v>>>(JJJJAq$''v>>>(JJJJAq#&&f===HHHHAq#&&f===HHHHHHr^   c            	      V   t          d          } t          | | dk     f| dz  df          t          t          fd           t	          d          }d}||k    sJ t	          t          | | dk     f| dz  df          d	
          dk    sJ t          |           | z  }t          |           | z  }t          d          D ]"}t          ||           }t          ||           }#d}t	          t          || dk     f|df          d
          }||k    sJ t	          t          | | dk     f| dz  | dk    ft          |           df          d          }d}||k    sJ t          | | dk     f| dz  | dk    ft          |           | dk    f          t          t          fd           d S )NrW   r~   rK   Tc                  "    t                     S ru   r   rV   s   r\   rw   z&test_fcode_Piecewise.<locals>.<lambda>  s    d r^   rq   r   z      merge(x, x**2, x < 1)r   r   zR      if (x < 1) then
         var = x
      else
         var = x**2
      end ifr   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   
weird_namez1      merge(x, merge(x**2, sin(x), x > 1), x < 1)c                  "    t                     S ru   r   r   s   r\   rw   z&test_fcode_Piecewise.<locals>.<lambda>  s    uT{{ r^   )
r   r   rC   rx   r<   r   r   r   r   
ValueError)rW   codeexpectedabr   rV   s         @r\   test_fcode_Piecewiser     s   AaQZ!Q$..D
 3 3 3 3444###D,H8Aq1u:1d|44FFF	    	AqAAqA2YY  AJJAJJ
	  Aq1u:4y11\JJJD8Aq1u:1a!e}s1vvtnEEPRSSSDBH8aQZ!Q$AQQ@@D
:****+++++r^   c                     t                      } g d}|                     |          }g d}|D ]}t          |          dk    sJ t          ||          D ]\  }}||k    sJ t          |          t          |          k    sJ d S )N)zbC     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 + properly)zBC     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 *%     @ must + be + wrapped + properlyzH      this = is + a + long + and + nasty + fortran + statement +  that *r   G      this = is + a + long + and + nasty + fortran + statement +   thatz'     @ * must + be + wrapped + properlyzF      this = is + a + long + and + nasty + fortran + statement + that*r   zH      this = is + a + long + and + nasty + fortran + statement +   that*r   H      this = is + a + long + and + nasty + fortran + statement +    thatz&     @ *must + be + wrapped + properly@      this = is + a + long + and + nasty + fortran + statement +z*     @ that*must + be + wrapped + properlyzG      this = is + a + long + and + nasty + fortran + statement + that**r   zH      this = is + a + long + and + nasty + fortran + statement +  that**r   r   '     @ **must + be + wrapped + properlyr   r   r   z+     @ that**must + be + wrapped + properlyzE      this = is + a + long + and + nasty + fortran + statement(that)/r   zH      this = is + a + long + and + nasty + fortran +     statement(that)z&     @ /must + be + wrapped + properlyH   )r=   _wrap_fortranlenzip)rf   lineswrapped_linesexpected_lineslinewr   s          r\   test_wrap_fortranr    s    nnG  E" ))%00M  N@   4yyBM>22  1Avvvvv}^!4!4444444r^   c                  h    t                      } g d}g d}|                     |          |k    sJ d S )N)H      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.0d0)r  D      this_variable_is_very_long_because_we_try_to_test_line_break =     @ 1.0d0zE      this_variable_is_very_long_because_we_try_to_test_line_break  =r	  zF      this_variable_is_very_long_because_we_try_to_test_line_break   =r	  zG      this_variable_is_very_long_because_we_try_to_test_line_break    =r	  r  z     @ 10.0d0r=   r   rf   r   r   s      r\   test_wrap_fortran_keep_d0r    sT    nnG  E  H   ''8333333r^   c                  2    t          t          d            d S )Nc                  >    t          t          d          d          S )Nr   garbage)method)r<   r   rk   r^   r\   rw   ztest_settings.<locals>.<lambda>6  s    eAaDD;;; r^   )rC   	TypeErrorrk   r^   r\   test_settingsr  5  s    
9;;<<<<<r^   c                      t          d          \  } }t          t          |           t          |          z   d          dk    sJ d S )Nr{   rE   rF   zsin(y) + cos(x))r   r<   r   r   r   s     r\   test_free_form_code_liner  9  sF    5>>DAqQ#a&&777;LLLLLLLr^   c                      t          d          \  } }t          t          |           t          |          z   dz                                  d          }d}||k    sJ d S )Nr{   r   rE   rF   zsin(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   )rW   rX   resultr   s       r\    test_free_form_continuation_liner  >  sg    5>>DAqSVVc!ff_*2244FKKKF	- 
 Xr^   c                  l    t          ddi          } dg}ddg}|                     |          |k    sJ d S )NrG   rE   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  s      r\   test_free_form_comment_liner  I  sP    OV455GnoEQ"$H   ''8333333r^   c                     t          dd          \  } }t          d          }t          d          }t          d          }t          d|          }t          d|           }d	}t          |||f         ||         z  ||         d
          }||ddiz  k    s#||ddiz  k    s||ddiz  k    s||ddiz  k    sJ d S d S d S d S )Nr   Tro   r   rW   rX   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 dorE   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<   )	r|   r   r   rW   rX   r   r  r   r   s	            r\   
test_loopsr  R  s   5$'''DAqCACACACACA	  1a411VDDDDH'<====H'<====H'<====H'<====== >=======r^   c                     t          ddt                    \  } }t          d          }t          d          }t          | |          } d| j        j        |j        dz  }t          ||          ||          d	          }||k    sJ d S )
Nzi mT)r0   clsrW   rX   zMdo i_%(icount)i = 1, m_%(mcount)i
   y(i_%(icount)i) = x(i_%(icount)i)
end do)icountmcountrE   r   )r   r   r>   r?   labeldummy_indexr<   )r   r   rW   rX   r   r   s         r\   test_dummy_loopsr$  l  s    5$E222DAqCACAAq		A	 7&!-@@	AH
 11V<<<D8r^   c                     d} t          d| f          }t          d| f          }t          d| dz
  f          }t          d| dz
            }t          ||         ||dz            ||         z
  ||dz            ||         z
  z            }t          |j        |j        d	          }|                    d
          sJ d S )Nr   rX   shaperW   Dyr~   r   F)r   contract+Dy(i) = (y(i + 1) - y(i))/(x(i + 1) - x(i)))r>   r?   r   r<   r  lhsendswith)len_yrX   rW   r(  r   r   code0s          r\   2test_fcode_Indexed_without_looking_for_contractionr/  {  s    ECx(((ACx(((A	T%'	,	,	,BCqAA1Q3!q1vad{+,,A!%155999E>>GHHHHHHHr^   c                  4   d} t          d| f          }t          d| f          }t          d| dz
  f          }t          d| dz
            }t          ||         ||dz            ||         z
  ||dz            ||         z
  z            }t          t	          |j        |j                            }|                    d          sJ  G d	 d
t          t                    |
                    fd|                    t                    D                       }t          ||         ||dz            ||         z
  ||dz            ||         z
  z            }t          t	          |j        |j                            }|                    d          sJ d S )Nr   rX   r&  rW   r(  r~   r   r*  c                       e Zd ZdS ).test_element_like_objects.<locals>.ElementExprN)rh   ri   rj   rk   r^   r\   ElementExprr2    s        r^   r3  c              3   H   K   | ]}| |j         |j                  fV  d S ru   )nameindices)r   r   r3  s     r\   	<genexpr>z,test_element_like_objects.<locals>.<genexpr>  s8      TTq;;qvqy112TTTTTTr^   )r@   r?   r   r<   r$   r+  r  r,  r2   r   subsatomsrA   )r-  rX   rW   r(  r   r   r.  r3  s          @r\   test_element_like_objectsr:    s   ECx(((ACx(((A	T%'	,	,	,BCqAA1Q3!q1vad{+,,A*QUAE**++E>>GHHHHH    gt    	
TTTTAGGL<Q<QTTTTTAA1Q3!q1vad{+,,A*QUAE**++E>>GHHHHHHHr^   c                       G d dt                     }  |             }t          d          }|                    t          |          d          dk    sJ d S )Nc                   @    e Zd Zej                                        ZdS )1test_derived_classes.<locals>.MyFancyFCodePrinterN)rh   ri   rj   r=   _default_settingscopyrk   r^   r\   MyFancyFCodePrinterr=    s%        (:??AAr^   r@  rW   borkz      bork = sin(x))r=   r   r   r   )r@  rf   rW   s      r\   test_derived_classesrB    s{    B B B B Bl B B B "!##GA??3q666**.CCCCCCCr^   c                  j    d} d}t          ddi          }|                    |           }||k    sJ 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
rG   rE   )r=   indent_code)	codelinesr   rR   r  s       r\   test_indentrF    sR    	 <	 : 	ov.//A]]9%%FXr^   c            	         t          d          \  } }}t          | |z  t          d| z   |dk    f|df          t          |          g          }t	          ddd          }t          ||          dk    sJ t          d|d	         z  | dk    f|d	         df          t          |d
                   z   |d         z   }t          |d          dk    sJ t	          ddd          }t	          ddd          }t          t          |d
                   dt          |d	                   g|d
         |d	         z   |d         dgd|d         z  |d
         z  t          |d                   dz   dgg          }t          ||          dk    sJ d S )Nzx,y,zrK   r   Tr   r}   r~   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))rK   r   )r~   r   r   r   rq   r   z?      merge(2*A(3, 1), A(3, 1), x > 0) + sin(A(2, 1)) + A(1, 1)rS   r   M)r}   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   r:   r   r   r;   r<   r   r   )	rW   rX   rY   matr   rV   rS   rI  r   s	            r\   test_Matrix_printingrK    s   gGAq!
!A#y!a%14y993q66B
C
CCS!QAa==	!" " " " a$iQ'!D'499C$LLH1T7RD###IK K K K 	S!QAS!QAQsVaQsV-	
3!C&!D'1%	
1T71S6	4#<<!+Q/1 	2 	2A A;;		 	 	 	 	 	r^   c            	          t          d          \  } }t          | t          ddd          t          || |z            g          }t	          |          }|dk    sJ d S )Nr   r   r   rK   z2      do x = 0, 9, 2
         y = x*y
      end do)r   r#   r"   r$   r<   )rW   rX   fsols       r\   test_fcode_ForrO    sn    5>>DAqAuQAAq1u!5!5 677A
((C " # # # # # #r^   c                  D   d } t          dd          }t          j        |          }t          |          } | |d           t          d          \  }}t          |t          dt
          h          }t          |          } | |d	           t          |t          
          }t          |          }	 | |	d            | t          d            | t          d            | t          dt          t          i            | t          dt          t          i           d S )Nc                 2    t          | fddd||k    sJ d S )Nrq   rE   rr   r   )rV   refkwargss      r\   checkz%test_fcode_Declaration.<locals>.check  s0    TGBfGGGG3NNNNNNr^   r   Tro   zinteger*4 :: ir   *   )valueattrszreal*4, parameter :: x = 42typezlogical :: yzreal*4zreal*8)type_aliases)	r   r'   deducedr&   r(   r*   r,   r)   r+   )
rT  r   var1dcl1rW   rX   var2dcl2bvar3dcl3s
             r\   test_fcode_Declarationrb    s2   O O O 	T"""AADtD	E$ !!! 5>>DAqAwb>>>DE	E%.///AE"""DtD	E$	E'8	E'8	E$g7777	E$g777777r^   c                  F   t          ddd          } t          ddd          }t          ddd          }t          | d                   dk    sJ t          d| d         z            dk    sJ |d                             || |z
            }t          |          d	k    sJ d S )
Nr   r~   r}   BCrH  z      A(1, 1)z      3*A(1, 1)z      (A - B)(1, 1))r;   r<   r8  )r   rd  re  Fs       r\   test_MatrixElement_printingrg  '  s    S!QAS!QAS!QA4>>_,,,,QtW!22222	$QAA88,,,,,,,r^   c                  p    t          d          } t          t          | dd          d          dk    sJ d S )NrW   +r~   rE   rF   z	x = x + 1)r   r<   r%   rv   s    r\   test_aug_assignrj  4  s=    AAsA&&f===LLLLLLr^   c            
          t          d          } t          t          t          |           dk    t	          | dd          g          d          dk    sJ d S )NrW   r~   -rE   rF   z)do while (abs(x) > 1)
   x = x - 1
end do)r   r<   r-   rP   r%   rv   s    r\   
test_Whilerm  9  sc    As1vvzJq#q$9$9#:;;6RRR	     r^   c                      t          d          } t          dd          }t          | t                    }t          |t                    }t	          t          d||g          t          t          fd           d S )NrW   r|   Tro   rX  powerc                  "    t                     S ru   r   )fp1s   r\   rw   z.test_FunctionPrototype_print.<locals>.<lambda>J      c

 r^   )r   r'   r+   r0   r.   rC   rx   )rW   r|   vxvnrq  s       @r\   test_FunctionPrototype_printru  B  s|    AT"""A	!$			B	!'	"	"	"B
D'B8
4
4C  2 2 2 233333r^   c                  F   t          d          } t          dd          }t          | t                    }t          |t                    }t	          | | |z            t          |           g}t          t          d||g|          t          t          fd           d S )NrW   r|   Tro   rX  ro  c                  "    t                     S ru   r   )fd1s   r\   rw   z/test_FunctionDefinition_print.<locals>.<lambda>V  rr  r^   )	r   r'   r+   r0   r$   r1   r/   rC   rx   )rW   r|   rs  rt  bodyrx  s        @r\   test_FunctionDefinition_printrz  M  s    AT"""A	!$			B	!'	"	"	"Bq!Q$+D
T7RHd
;
;C  2 2 2 233333r^   N)sympy.core.addr   sympy.core.exprr   sympy.core.functionr   r   r   sympy.core.modr   
sympy.corer	   r
   r   sympy.core.numbersr   r   r   r   r   r   sympy.core.relationalr   sympy.core.singletonr   sympy.core.symbolr   r   (sympy.functions.combinatorial.factorialsr   $sympy.functions.elementary.complexesr   r   &sympy.functions.elementary.exponentialr   r   (sympy.functions.elementary.miscellaneousr   $sympy.functions.elementary.piecewiser   (sympy.functions.elementary.trigonometricr   r   r   'sympy.functions.special.gamma_functionsr    sympy.integrals.integralsr!   sympy.sets.fancysetsr"   sympy.codegenr#   r$   r%   sympy.codegen.astr&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   sympy.logic.boolalgr5   r6   r7   r8   r9   sympy.matricesr:   r;   sympy.printing.fortranr<   r=   sympy.tensorr>   r?   sympy.tensor.array.expressionsr@   rA   sympy.utilities.lambdifyrB   sympy.testing.pytestrC   r]   rm   ry   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:  rB  rF  rK  rO  rb  rg  rj  rm  ru  rz  rk   r^   r\   <module>r     s                     8 8 8 8 8 8 8 8 8 8       9 9 9 9 9 9 9 9 9 9 C C C C C C C C C C C C C C C C $ $ $ $ $ $ " " " " " " . . . . . . . . > > > > > > B B B B B B B B = = = = = = = = 9 9 9 9 9 9 : : : : : : F F F F F F F F F F 9 9 9 9 9 9 . . . . . . & & & & & & 5 5 5 5 5 5 5 5 5 5! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! , + + + + + , , , , , , = = = = = = = = = = = = = = / / / / / / / / 6 6 6 6 6 6 6 6 ) ) ) ) ) ) ) ) D D D D D D D D 9 9 9 9 9 9 ' ' ' ' ' '	l 	l 	l- - -8 8 8@ @ @$> > >, , ,
@ @ @
	G 	G 	G7 7 7>
D 
D 
D: : :0) ) )3 3 3  
M 
M 
M  &> > >
  	  	  	 ." ." ."b`$ `$ `$FI I I(, (, (,V95 95 95x4 4 44= = =M M M
  4 4 4? ? ?4  I I II I I&D D D= = =~     F# # #8 8 82
. 
. 
.M M M
  4 4 4	4 	4 	4 	4 	4r^   