U
    0eE                     @   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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/d0 Z.d1d2 Z/d3d4 Z0d5d6 Z1d7d8 Z2d9d: Z3d;d< Z4d=d> Z5d?d@ Z6dAdB Z7dCdD Z8dEdF Z9dGdH Z:dIdJ Z;d	S )K    )StringIO)SsymbolsEqpiCatalan
EulerGammaFunction)Equality)	Piecewise)MatrixMatrixSymbol)OctaveCodeGencodegenmake_routine)raises)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_mgetvalueAssertionError)code_genoutputsource r   M/tmp/pip-unpacked-wheel-_6tpq7m6/sympy/utilities/tests/test_codegen_octave.pytest_empty_m_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OctaveFr   r   test.m   z7function out1 = test(x, y, z)
  out1 = z.*(x + y);
end
xyzr   r   	name_exprresultr   expectedr   r   r   test_m_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$   z^function out1 = test(x, y, z)
  %TEST  Autogenerated by SymPy
  %   Code generated with SymPy z}
  %
  %   See http://www.sympy.org/ for more information.
  %
  %   This file is part of 'project'
  out1 = z.*(x + y);
end
)r&   r'   r(   r   r   sympy__version__r)   r   r   r   test_m_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$   z)function z = test(x, y)
  z = x + y;
end
)r
   r(   r&   r'   r   r   exprr*   r+   r   r,   r   r   r   test_m_simple_code_nameout8   s    r3   c                  C   sD   dt t f} t| dddd\}|d }dtd }||ks@td S )Nr!   r"   Fr   r$   z+function out1 = test()
  out1 = pi^%s;
end
   )r   r   r   Zevalfr   r)   r   r   r   test_m_numbersymbolE   s    r5   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 [out1, out2] = test()
  Catalan = 0.915965594177219;  % constant
  EulerGamma = 0.5772156649015329;  % constant
  out1 = pi^Catalan;
  out2 = EulerGamma;
end
)r   r   r   r   r   r)   r   r   r   test_m_numbersymbol_no_inlineQ   s     r8   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octave)argument_sequencelanguageFr   z2function out1 = test(z, x, y)
  out1 = x + y;
end
)	r&   r'   r   r(   r   r   r   r   r   )r2   Zroutiner   r   r   r,   r   r   r   test_m_code_argument_orderc   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$   zTfunction [out1, out2] = test(x, y, z)
  out1 = z.*(x + y);
  out2 = z.*(x - y);
end
r%   )expr1expr2r*   r+   r   r,   r   r   r   test_multiple_results_mr   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$   zVfunction [C, A, B] = test(x, y, z)
  C = z.*(x + y);
  A = z.*(x - y);
  B = 2*x;
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std S )Nr?   r@   r!   r"   Fr   r   r9   r   r#   r$   zVfunction [C, A, B] = test(x, z, y)
  C = z.*(x + y);
  A = z.*(x - y);
  B = 2*x;
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st	|d d	 }d
}||kst	d S )Nr   )cossintanZtestlong   r"   Fr   z
testlong.mr$   a5  function [out1, out2] = 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))))))));
end
)
(sympy.functions.elementary.trigonometricrJ   rK   rL   r&   r'   r(   expandr   r   )rJ   rK   rL   r*   r+   r   r,   r   r   r   test_complicated_m_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std S )Nr   )rJ   rK   afoor@   r"   Fr   foo.mr$   zkfunction [out1, y, out3, a] = foo(x)
  out1 = cos(2*x);
  y = sin(x);
  out3 = cos(x);
  a = sin(2*x);
end
)	rN   rJ   rK   r   r&   r
   r'   r   r   )rJ   rK   rQ   r*   r+   r   r,   r   r   r   !test_m_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   zfunction out1 = pwtest(x)
  out1 = ((x < -1).*(0) + (~(x < -1)).*( ...
  (x <= 1).*(x.^2) + (~(x <= 1)).*( ...
  (x > 1).*(2 - x) + (~(x > 1)).*(1))));
end
r   r&   r   r   pwr*   r+   r   r,   r   r   r   test_m_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"   Fr6   zfunction out1 = pwtest(x)
  if (x < -1)
    out1 = 0;
  elseif (x <= 1)
    out1 = x.^2;
  elseif (x > 1)
    out1 = -x + 2;
  else
    out1 = 1;
  end
end
rZ   r[   r   r   r   test_m_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$   zfunction [out1, out2] = foo(x, y)
  out1 = 2*x;
  out2 = 3*y;
end
function [out1, out2] = bar(y)
  out1 = y.^2;
  out2 = 4*y;
end
)r&   r'   r   r   r)   r   r   r   test_m_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 )NrR   r@   rM   r_   r`   r"   TFr   r   rS   r$   zafunction [out1, out2] = foo(x, y)
  %FOO  Autogenerated by SymPy
  %   Code generated with SymPy z
  %
  %   See http://www.sympy.org/ for more information.
  %
  %   This file is part of 'project'
  out1 = 2*x;
  out2 = 3*y;
end
function [out1, out2] = bar(y)
  out1 = y.^2;
  out2 = 4*y;
end
)r&   r'   r   r   r.   r/   r)   r   r   r   "test_m_multifcns_per_file_w_header	  s    (rb   c                      s>   ddt  dt gfdtd dt gfg tt fdd d S )NrR   r@   rM   r_   r`   c                      s   t  dddddS )Nr"   r_   F)prefixr   r   )r   r   r*   r   r   <lambda>#  s
      z1test_m_filename_match_first_fcn.<locals>.<lambda>)r&   r'   r   
ValueErrorr   r   rd   r   test_m_filename_match_first_fcn!  s    (rg   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#   =function myout1 = test(x, y, z)
  myout1 = [x 2*y pi*z];
end
)	r   r&   r'   r   r(   r
   r   r   r   )e2r*   r+   r   r,   r   r   r   test_m_matrix_named'  s    rk   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 )Nrh   r$   rM   r@   r!   FrW   r"   r   ri   )	r   r   r&   r'   r   r(   r
   r   r   )rh   rj   r*   r+   r   r,   r   r   r   test_m_matrix_named_matsym5  s    rl   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$   z5function out1 = test(x, y)
  out1 = [x x + y 3];
end
)r   r&   r'   r   r   r1   r   r   r   test_m_matrix_output_autonameC  s    rm   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 [out1, out2, out3, out4] = test(x, y, z)
  out1 = x + y;
  out2 = [2*x 2*y 2*z];
  out3 = [x; y; z];
  out4 = [x y; z 16];
end
)r&   r'   r   r(   r   r   )e1rj   Ze3Ze4r*   r+   r   r,   r   r   r   test_m_matrix_output_autoname_2P  s    rp   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,CrC   r$   rM   r@   r!   r"   FrH   zSfunction [C, A, B] = test(x, z, y)
  C = z.*(x + y);
  A = [1 2 x];
  B = 2*x;
end
)	r   r   r
   r&   r'   r(   r   r   r   )
rD   rE   rC   r<   r=   rF   r*   r+   r   r,   r   r   r   #test_m_results_matrix_named_orderedc  s    
rq   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 )NrC   r@   rM   rD   r$   rE   Dr!   r   r"   Fr   zNfunction [B, C, D] = test(A)
  B = A(1, :);
  C = A(2, :);
  D = A(:, 3);
end
r   r
   r   r   )rC   rD   rE   rr   r*   r+   r   r,   r   r   r   test_m_matrixsymbol_slicew  s    rt   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 )NrC   rM   r`   rD   r@   rE   r!   r   r$   r"   Fr   zDfunction [B, C] = test(A)
  B = A(1:2, 1:2);
  C = A(1:2, 2:3);
end
rs   rC   rD   rE   r*   r+   r   r,   r   r   r   test_m_matrixsymbol_slice2  s    rv   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 )NrC         rD   r@   rE   r`   r!      r$   rM   r"   Fr   zRfunction [B, C] = test(A)
  B = A(7:end, 2:3:end);
  C = A(1:2:end, 1:3:end);
end
rs   ru   r   r   r   test_m_matrixsymbol_slice3  s    rz   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 )NrC   r@   rM   rD   r$   r!   r   r"   Fr   zrfunction [B, out2, out3, out4] = test(A)
  B = A(1, :);
  out2 = A(2, :);
  out3 = A(:, 1);
  out4 = A(:, 2);
end
rs   )rC   rD   r*   r+   r   r,   r   r   r   "test_m_matrixsymbol_slice_autoname  s    Fr{   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integerrC   r&   r'   ijZmat_vec_multr"   Fr   r$   zfunction y = mat_vec_mult(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
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_m_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   r|   r   zn m o pTr   rC   rD   r'   r   r   klZtensorthingr"   Fr   r$   zfunction y = tensorthing(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
end
r   )r}   r~   r   r   r   oprC   rD   r'   r   r   r   r   r+   r   r,   r   r   r   )test_m_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$   z&function x = mysqr(x)
  x = x.^2;
end
)r
   r&   r   r   r1   r   r   r   test_m_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"   FrH   r$   z,function x = test(x, y)
  x = x.^2 + y;
end
r   )r
   r&   r'   r   r   r1   r   r   r   test_m_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 [out1, out2] = test(x)
  % unsupported: Derivative(f(x), x)
  % unsupported: zoo
  out1 = Derivative(f(x), x);
  out2 = zoo;
end
)r	   r&   Zdiffr   ZComplexInfinityr   r   )r   r*   r+   r   r,   r   r   r   test_m_not_supported'  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$   z3function out1 = f(x)
  global y
  out1 = x.*y;
end
)r   r   r9   r   z<function out1 = f(x, y)
  global t z
  out1 = x.*y + z;
end
)r   r   r   )r&   r'   r(   tr+   r   r,   r   r   r   test_global_vars_octave7  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    r-   r0   r3   r5   r8   r;   r>   rG   rI   rP   rT   r]   r^   ra   rb   rg   rk   rl   rm   rp   rq   rt   rv   rz   r{   r   r   r   r   r   r   r   r   r   r   <module>   sV   $

 "