U
    0eoH                     @   s  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 d dlmZ d dlZed	\ZZZd
d Zdd Zdd Zdd Zdd Zedd Z dd Z!dd Z"dd Z#dd Z$dd Z%d d! Z&d"d# Z'ed$d% Z(d&d' Z)d(d) Z*d*d+ Z+d,d- Z,d.d/ Z-d0d1 Z.d2d3 Z/d4d5 Z0d6d7 Z1d8d9 Z2d:d; Z3d<d= Z4d>d? Z5d@dA Z6dBdC Z7dDdE Z8dFdG Z9dHdI Z:dS )J    )StringIO)SsymbolsEqpiCatalan
EulerGammaFunction)Equality)	Piecewise)MatrixMatrixSymbol)JuliaCodeGencodegenmake_routine)XFAILNzx,y,zc                  C   s8   t  } t }| jg |dddd | }|dks4td S )NfileFheaderempty )r   r   dump_jlgetvalueAssertionError)code_genoutputsource r   L/tmp/pip-unpacked-wheel-_6tpq7m6/sympy/utilities/tests/test_codegen_julia.pytest_empty_jl_code   s
    r   c                  C   sN   dt t t f} t| dddd\}|d dks2t|d }d}||ksJtd S )	NtestJuliaFr   r   test.jl   zCfunction test(x, y, z)
    out1 = z .* (x + y)
    return out1
end
xyzr   r   	name_exprresultr   expectedr   r   r   test_jl_simple_code   s    r,   c                  C   sX   dt t t f} t| dddd\}|d dks2t|d }d	tj d
 }||ksTtd S )Nr    r!   TFr   r   r"   r#   #   Code generated with SymPy z
#
#   See http://www.sympy.org/ for more information.
#
#   This file is part of 'project'
function test(x, y, z)
    out1 = z .* (x + y)
    return out1
end
)r%   r&   r'   r   r   sympy__version__r(   r   r   r   test_jl_simple_code_with_header%   s    r0   c                  C   sD   t ttt } d| f}t|dddd\}|d }d}||ks@td S )Nr    r!   Fr   r#   z3function test(x, y)
    z = x + y
    return z
end
)r
   r'   r%   r&   r   r   exprr)   r*   r   r+   r   r   r   test_jl_simple_code_nameout8   s    r3   c                  C   s:   dt t f} t| dddd\}|d }d}||ks6td S )Nr    r!   Fr   r#   z<function test()
    out1 = pi ^ catalan
    return out1
end
)r   r   r   r   r(   r   r   r   test_jl_numbersymbolF   s    r4   c                  C   s@   dt t tgf} t| ddddd\}|d }d}||ks<td S )Nr    r!   Fr   r   inliner#   zfunction test()
    Catalan = 0.915965594177219
    EulerGamma = 0.5772156649015329
    out1 = pi ^ Catalan
    out2 = EulerGamma
    return out1, out2
end
)r   r   r   r   r   r(   r   r   r   test_jl_numbersymbol_no_inlineS   s     	r7   c                  C   s\   t t } td| tt tgdd}t }t }|j|g|dddd | }d}||ksXtd S )Nr    Zjulia)argument_sequencelanguageFr   z<function test(z, x, y)
    out1 = x + y
    return out1
end
)	r%   r&   r   r'   r   r   r   r   r   )r2   Zroutiner   r   r   r+   r   r   r   test_jl_code_argument_orderf   s    r:   c                  C   sR   t t t } t t t }d| |gf}t|dddd\}|d }d}||ksNtd S )Nr    r!   Fr   r#   zafunction test(x, y, z)
    out1 = z .* (x + y)
    out2 = z .* (x - y)
    return out1, out2
end
r$   )expr1expr2r)   r*   r   r+   r   r   r   test_multiple_results_mv   s    r=   c            
      C   s|   t d\} }}t|tt t }t| tt t }t|dt }d|||gf}t|dddd\}|d }d}	||	ksxtd S )	NA,B,C   r    r!   Fr   r#   zffunction test(x, y, z)
    C = z .* (x + y)
    A = z .* (x - y)
    B = 2 * x
    return C, A, B
end
r   r
   r%   r&   r'   r   r   
ABCr;   r<   expr3r)   r*   r   r+   r   r   r   test_results_named_unordered   s    rF   c            
      C   s   t d\} }}t|tt t }t| tt t }t|dt }d|||gf}t|dddtttfd}|d d dkszt|d d	 }d
}	||	kstd S )Nr>   r?   r    r!   Fr   r   r8   r   r"   r#   zffunction test(x, z, y)
    C = z .* (x + y)
    A = z .* (x - y)
    B = 2 * x
    return C, A, B
end
r@   rA   r   r   r   test_results_named_ordered   s    
rH   c                  C   s   ddl m} m}m} d|t| t |t d  | | | | | | | | tt t gf}t|dddd}|d d dkst	|d d	 }d
}||kst	d S )Nr   )cossintanZtestlong   r!   Fr   ztestlong.jlr#   an  function testlong(x, y, z)
    out1 = sin(x) .^ 3 + 3 * sin(x) .^ 2 .* cos(y) + 3 * sin(x) .^ 2 .* tan(z) + 3 * sin(x) .* cos(y) .^ 2 + 6 * sin(x) .* cos(y) .* tan(z) + 3 * sin(x) .* tan(z) .^ 2 + cos(y) .^ 3 + 3 * cos(y) .^ 2 .* tan(z) + 3 * cos(y) .* tan(z) .^ 2 + tan(z) .^ 3
    out2 = cos(cos(cos(cos(cos(cos(cos(cos(x + y + z))))))))
    return out1, out2
end
)
(sympy.functions.elementary.trigonometricrI   rJ   rK   r%   r&   r'   expandr   r   )rI   rJ   rK   r)   r*   r   r+   r   r   r   test_complicated_jl_codegen   s    *	rO   c               	   C   s   ddl m} m} td}d| dt tt|t| tt||dt gf}t|dddd\}|d d	ksnt|d
 }d}||kstd S )Nr   )rI   rJ   afoor?   r!   Fr   foo.jlr#   zzfunction foo(x)
    out1 = cos(2 * x)
    y = sin(x)
    out3 = cos(x)
    a = sin(2 * x)
    return out1, y, out3, a
end
)	rM   rI   rJ   r   r%   r
   r&   r   r   )rI   rJ   rP   r)   r*   r   r+   r   r   r   "test_jl_output_arg_mixed_unordered   s    4	rS   c                  C   sj   t dtdk ftd tdkft d tdkfddd} d| f}t|d	ddd
\}|d }d}||ksftd S )Nr   r?   r#   r#   TFevaluatepwtestr!   r   z{function pwtest(x)
    out1 = ((x < -1) ? (0) :
    (x <= 1) ? (x .^ 2) :
    (x > 1) ? (2 - x) : (1))
    return out1
end
r   r%   r   r   pwr)   r*   r   r+   r   r   r   test_jl_piecewise_   s    4r\   c                  C   sh   t dtdk ftd tdkft d tdkfd} d| f}t|ddddd	\}|d }d
}||ksdtd S )Nr   rT   r?   r#   rU   rX   r!   Fr5   zfunction pwtest(x)
    if (x < -1)
        out1 = 0
    elseif (x <= 1)
        out1 = x .^ 2
    elseif (x > 1)
        out1 = -x + 2
    else
        out1 = 1
    end
    return out1
end
rY   rZ   r   r   r   test_jl_piecewise_no_inline   s    0
r]   c                  C   sl   ddt  dt gfdtd dt gfg} t| dddd}|d	 d	 d
ksLt|d	 d }d}||kshtd S )NrQ   r?   rL   bar   r!   Fr   r   rR   r#   zfunction foo(x, y)
    out1 = 2 * x
    out2 = 3 * y
    return out1, out2
end
function bar(y)
    out1 = y .^ 2
    out2 = 4 * y
    return out1, out2
end
r%   r&   r   r   r(   r   r   r   test_jl_multifcns_per_file  s    (ra   c                  C   sv   ddt  dt gfdtd dt gfg} t| dddd	}|d
 d
 dksLt|d
 d }dtj d }||ksrtd S )NrQ   r?   rL   r^   r_   r!   TFr   r   rR   r#   r-   z
#
#   See http://www.sympy.org/ for more information.
#
#   This file is part of 'project'
function foo(x, y)
    out1 = 2 * x
    out2 = 3 * y
    return out1, out2
end
function bar(y)
    out1 = y .^ 2
    out2 = 4 * y
    return out1, out2
end
)r%   r&   r   r   r.   r/   r(   r   r   r   #test_jl_multifcns_per_file_w_header  s    (rb   c                  C   sP   ddt  dt gfdtd dt gfg} t| ddddd	\}|d
 dksLtd S )NrQ   r?   rL   r^   r_   r!   ZbazF)prefixr   r   r   zbaz.jlr`   )r)   r*   r   r   r   test_jl_filename_match_prefix/  s
    (
rd   c                  C   sr   t tdt tt gg} dttddd| f}t|dddd}|d	 d	 d
ksRt|d	 d }d}||ksntd S )Nr?   r    myout1r#   rL   r!   Fr   r   r"   Kfunction test(x, y, z)
    myout1 = [x 2 * y pi * z]
    return myout1
end
)	r   r%   r&   r   r'   r
   r   r   r   )e2r)   r*   r   r+   r   r   r   test_jl_matrix_named6  s    rh   c                  C   sd   t ddd} ttdt tt gg}dt| |ddf}t|dddd	\}|d }d
}||ks`td S )Nre   r#   rL   r?   r    FrV   r!   r   rf   )	r   r   r%   r&   r   r'   r
   r   r   )re   rg   r)   r*   r   r+   r   r   r   test_jl_matrix_named_matsymE  s    ri   c                  C   sJ   t ttt dgg} d| f}t|dddd\}|d }d}||ksFtd S )NrL   r    r!   Fr   r#   z?function test(x, y)
    out1 = [x x + y 3]
    return out1
end
)r   r%   r&   r   r   r1   r   r   r   test_jl_matrix_output_autonameT  s    rj   c                  C   s   t t } tdt  dt dt gg}tt gtgtgg}tt tgtdgg}d| |||ff}t|dddd\}|d }d}||kstd S )	Nr?      r    r!   Fr   r#   zfunction test(x, y, z)
    out1 = x + y
    out2 = [2 * x 2 * y 2 * z]
    out3 = [x, y, z]
    out4 = [x  y;
    z 16]
    return out1, out2, out3, out4
end
)r%   r&   r   r'   r   r   )e1rg   Ze3Ze4r)   r*   r   r+   r   r   r    test_jl_matrix_output_autoname_2b  s    
rm   c            
      C   s   t d\} }tddd}t|tt t }t|tddtgg}t| dt }d|||gf}t|dddtttfd	\}|d }d
}	||	kstd S )NzB,CrB   r#   rL   r?   r    r!   FrG   zafunction test(x, z, y)
    C = z .* (x + y)
    A = [1 2 x]
    B = 2 * x
    return C, A, B
end
)	r   r   r
   r%   r&   r'   r   r   r   )
rC   rD   rB   r;   r<   rE   r)   r*   r   r+   r   r   r   $test_jl_results_matrix_named_orderedw  s    
rn   c                  C   s   t ddd} t ddd}t ddd}t ddd}dt|| d	d d f t|| dd d f t|| d d df gf}t|d
ddd\}|d }d}||kstd S )NrB   r?   rL   rC   r#   rD   Dr    r   r!   Fr   zUfunction test(A)
    B = A[1,:]
    C = A[2,:]
    D = A[:,3]
    return B, C, D
end
r   r
   r   r   )rB   rC   rD   ro   r)   r*   r   r+   r   r   r   test_jl_matrixsymbol_slice  s    rq   c                  C   s   t ddd} t ddd}t ddd}dt|| ddddf t|| ddd	df gf}t|d
ddd\}|d	 }d}||kstd S )NrB   rL   r_   rC   r?   rD   r    r   r#   r!   Fr   zKfunction test(A)
    B = A[1:2,1:2]
    C = A[1:2,2:3]
    return B, C
end
rp   rB   rC   rD   r)   r*   r   r+   r   r   r   test_jl_matrixsymbol_slice2  s    rs   c               	   C   s   t ddd} t ddd}t ddd}dt|| d	d d
d df t|| d d dd d df gf}t|dddd\}|d
 }d}||kstd S )NrB         rC   r?   rD   r_   r       r#   rL   r!   Fr   zYfunction test(A)
    B = A[7:end,2:3:end]
    C = A[1:2:end,1:3:end]
    return B, C
end
rp   rr   r   r   r   test_jl_matrixsymbol_slice3  s    rw   c                  C   s   t ddd} t ddd}dt|| dd d f | dd d f | d d df | d d df gf}t|dd	d	d
\}|d }d}||kstd S )NrB   r?   rL   rC   r#   r    r   r!   Fr   zyfunction test(A)
    B = A[1,:]
    out2 = A[2,:]
    out3 = A[:,1]
    out4 = A[:,2]
    return B, out2, out3, out4
end
rp   )rB   rC   r)   r*   r   r+   r   r   r   #test_jl_matrixsymbol_slice_autoname  s    F	rx   c                  C   s   ddl m} m} ddlm} |ddd\}}| d}| d}| d	}|d
|}|d|}	tdt|| |||	f ||	  fdddd\}
|
d }d}||dd||	f i ks||dd||	f i kstd S )Nr   IndexedBaseIdxr   zn mTintegerrB   r%   r&   ijZmat_vec_multr!   Fr   r#   zfunction mat_vec_mult(y, A, m, n, x)
    for i = 1:m
        y[i] = 0
    end
    for i = 1:m
        for j = 1:n
            y[i] = %(rhs)s + y[i]
        end
    end
    return y
end
rhszA[%s,%s] .* x[j]zx[j] .* A[%s,%s]Zsympy.tensorrz   r{   Zsympy.core.symbolr   r   r   r   )rz   r{   r   nmrB   r%   r&   r   r   r*   r   r+   r   r   r   test_jl_loops  s$    

$ r   c               
   C   s   ddl m} m} ddlm} |ddd\}}}}| d}| d}| d	}	|d
|}
|d|}|d|}|d|}tdt|	|
 ||||f ||
|||f  fdddd\}|d }d}||kstd S )Nr   ry   r|   zn m o pTr}   rB   rC   r&   r   r   klZtensorthingr!   Fr   r#   a-  function tensorthing(y, A, B, m, n, o, p)
    for i = 1:m
        y[i] = 0
    end
    for i = 1:m
        for j = 1:n
            for k = 1:o
                for l = 1:p
                    y[i] = A[i,j,k,l] .* B[j,k,l] + y[i]
                end
            end
        end
    end
    return y
end
r   )rz   r{   r   r   r   oprB   rC   r&   r   r   r   r   r*   r   r+   r   r   r   *test_jl_tensor_loops_multiple_contractions  s&    



,  r   c                  C   sD   t ttd } d| f}t|dddd\}|d }d}||ks@td S )Nr?   Zmysqrr!   Fr   r#   z2function mysqr(x)
    x = x .^ 2
    return x
end
)r
   r%   r   r   r1   r   r   r   test_jl_InOutArgument  s    r   c                  C   s   t ttd t } d| f}t|dddttfd\}|d }d}||ksJtt ttd t } d| f}t|dddd\}|d }d}||kstd S )	Nr?   r    r!   FrG   r#   z8function test(x, y)
    x = x .^ 2 + y
    return x
end
r   )r
   r%   r&   r   r   r1   r   r   r   test_jl_InOutArgument_order)  s"     r   c                  C   sN   t d} d| tttjgf}t|dddd\}|d }d}||ksJtd S )Nfr    r!   Fr   r#   zfunction test(x)
    # unsupported: Derivative(f(x), x)
    # unsupported: zoo
    out1 = Derivative(f(x), x)
    out2 = zoo
    return out1, out2
end
)r	   r%   Zdiffr   ZComplexInfinityr   r   )r   r)   r*   r   r+   r   r   r   test_jl_not_supportedE  s    	r   c                  C   s   t d\} }}}td| | fddd|fd}|d d }d}||ksHttd| | | fddd| |f||fd	}|d d }d
}||kstd S )Nzx y z tr   r!   F)r   r   global_varsr   r#   z4function f(x)
    out1 = x .* y
    return out1
end
)r   r   r8   r   z;function f(x, y)
    out1 = x .* y + z
    return out1
end
)r   r   r   )r%   r&   r'   tr*   r   r+   r   r   r   test_global_vars_octaveV  s      r   );ior   Z
sympy.corer   r   r   r   r   r   r	   Zsympy.core.relationalr
   Z$sympy.functions.elementary.piecewiser   Zsympy.matricesr   r   Zsympy.utilities.codegenr   r   r   Zsympy.testing.pytestr   r.   r%   r&   r'   r   r,   r0   r3   r4   r7   r:   r=   rF   rH   rO   rS   r\   r]   ra   rb   rd   rh   ri   rj   rm   rn   rq   rs   rw   rx   r   r   r   r   r   r   r   r   r   r   <module>   sT   $

!#