U
    ZÊ¹joH  ã                   @   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   úg/var/www/html/bwave/python/venv/lib/python3.8/site-packages/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#   zœfunction 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    Ú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    ÿrG   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s–t‚d S )Nr?   r@   r    r!   F©r   r   r9   r   r"   r#   zffunction test(x, z, y)
    C = z .* (x + y)
    A = z .* (x - y)
    B = 2 * x
    return C, A, B
end
rA   rB   r   r   r   Útest_results_named_ordered›   s    
ÿÿrI   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sˆt	‚|d d	 }d
}||ks¤t	‚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.trigonometricrJ   rK   rL   r%   r&   r'   Úexpandr   r   )rJ   rK   rL   r)   r*   r   r+   r   r   r   Útest_complicated_jl_codegen°   s    *ÿÿÿ	rP   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s†t‚d S )Nr   )rJ   rK   Ú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
)	rN   rJ   rK   r   r%   r
   r&   r   r   )rJ   rK   rQ   r)   r*   r   r+   r   r   r   Ú"test_jl_output_arg_mixed_unorderedÅ   s    4ÿ	rT   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   rU   r@   r#   rV   rY   r!   Fr5   z½function 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
rZ   r[   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 )NrR   r@   rM   Úbaré   r!   Fr   r   rS   r#   zœ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   Útest_jl_multifcns_per_file  s    (ÿrb   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 )NrR   r@   rM   r_   r`   r!   TFr   r   rS   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    (ÿrc   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 )NrR   r@   rM   r_   r`   r!   ZbazF)Úprefixr   r   r   zbaz.jlra   )r)   r*   r   r   r   Útest_jl_filename_match_prefix/  s
    (
ÿre   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#   rM   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    ÿri   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 )Nrf   r#   rM   r@   r    FrW   r!   r   rg   )	r   r   r%   r&   r   r'   r
   r   r   )rf   rh   r)   r*   r   r+   r   r   r   Útest_jl_matrix_named_matsymE  s    ÿrj   c                  C   sJ   t ttt dggƒ} d| f}t|dddd�\}|d }d}||ksFt‚d S )NrM   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    ÿrk   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s†t‚d S )	Nr@   é   r    r!   Fr   r#   zžfunction 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   )Úe1rh   Ze3Ze4r)   r*   r   r+   r   r   r   Ú test_jl_matrix_output_autoname_2b  s    ÿ
rn   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sŽt‚d S )NzB,CrC   r#   rM   r@   r    r!   FrH   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   )
rD   rE   rC   r<   r=   rF   r)   r*   r   r+   r   r   r   Ú$test_jl_results_matrix_named_orderedw  s    
ÿÿro   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sžt‚d S )NrC   r@   rM   rD   r#   rE   Ú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   )rC   rD   rE   rp   r)   r*   r   r+   r   r   r   Útest_jl_matrixsymbol_sliceŒ  s    þÿrr   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s†t‚d S )NrC   rM   r`   rD   r@   rE   r    r   r#   r!   Fr   zKfunction test(A)
    B = A[1:2,1:2]
    C = A[1:2,2:3]
    return B, C
end
rq   ©rC   rD   rE   r)   r*   r   r+   r   r   r   Útest_jl_matrixsymbol_slice2¡  s    ÿÿrt   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sŒt‚d S )NrC   é   é   rD   r@   rE   r`   r    é   r#   rM   r!   Fr   zYfunction test(A)
    B = A[7:end,2:3:end]
    C = A[1:2:end,1:3:end]
    return B, C
end
rq   rs   r   r   r   Útest_jl_matrixsymbol_slice3³  s    ÿÿrx   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sˆt‚d S )NrC   r@   rM   rD   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
rq   )rC   rD   r)   r*   r   r+   r   r   r   Ú#test_jl_matrixsymbol_slice_autonameÅ  s    Fÿ	ry   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sÈt‚d S )Nr   ©ÚIndexedBaseÚIdx©r   zn mT©ÚintegerrC   r%   r&   ÚiÚjZmat_vec_multr!   Fr   r#   z¹function 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.tensorr{   r|   Zsympy.core.symbolr   r   r   r   )r{   r|   r   ÚnÚmrC   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sÂt‚d S )Nr   rz   r}   zn m o pTr~   rC   rD   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ƒ   )r{   r|   r   r„   r…   ÚoÚprC   rD   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sŽt‚d S )	Nr@   r    r!   FrH   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#   z—function test(x)
    # unsupported: Derivative(f(x), x)
    # unsupported: zoo
    out1 = Derivative(f(x), x)
    out2 = zoo
    return out1, out2
end
)r	   r%   Ú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sŒt‚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   r9   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>   rG   rI   rP   rT   r]   r^   rb   rc   re   ri   rj   rk   rn   ro   rr   rt   rx   ry   r†   r‹   rŒ   r�   r�   r“   r   r   r   r   Ú<module>   sT   $

!#