a
    lhE                     @   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s4J d S )NfileFheaderempty )r   r   dump_mgetvalue)code_genoutputsource r   W/var/www/auris/lib/python3.9/site-packages/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s2J |d }d}||ksJJ d S )	NtestOctaveFr   r   test.m   z7function out1 = test(x, y, z)
  out1 = z.*(x + y);
end
xyzr   	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s2J |d }d	tj d
 }||ksTJ 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   sympy__version__r(   r   r   r   test_m_simple_code_with_header%   s    r/   c                  C   sD   t ttt } d| f}t|dddd\}|d }d}||ks@J d S )Nr    r!   Fr   r#   z)function z = test(x, y)
  z = x + y;
end
)r
   r'   r%   r&   r   exprr)   r*   r   r+   r   r   r   test_m_simple_code_nameout8   s    r2   c                  C   sD   dt t f} t| dddd\}|d }dtd }||ks@J d S )Nr    r!   Fr   r#   z+function out1 = test()
  out1 = pi^%s;
end
   )r   r   r   Zevalfr(   r   r   r   test_m_numbersymbolE   s    r4   c                  C   s@   dt t tgf} t| ddddd\}|d }d}||ks<J 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   test_m_numbersymbol_no_inlineQ   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sXJ 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   )r1   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sNJ 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sxJ 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   
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szJ |d d	 }d
}	||	ksJ d S )Nr>   r?   r    r!   Fr   r   r8   r   r"   r#   zVfunction [C, A, B] = test(x, z, y)
  C = z.*(x + y);
  A = z.*(x - y);
  B = 2*x;
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sJ |d d	 }d
}||ksJ 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.trigonometricrI   rJ   rK   r%   r&   r'   expandr   )rI   rJ   rK   r)   r*   r   r+   r   r   r   test_complicated_m_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snJ |d
 }d}||ksJ d S )Nr   )rI   rJ   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
)rM   rI   rJ   r   r%   r
   r&   r   )rI   rJ   rP   r)   r*   r   r+   r   r   r   !test_m_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sfJ 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   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sdJ d S )Nr   rT   r?   r#   rU   rX   r!   Fr5   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
rY   rZ   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sLJ |d	 d }d}||kshJ d S )NrQ   r?   rL   bar   r!   Fr   r   rR   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   test_m_multifcns_per_file   s    (
r`   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sLJ |d
 d }dtj d }||ksrJ d S )NrQ   r?   rL   r^   r_   r!   TFr   r   rR   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   "test_m_multifcns_per_file_w_header	  s    (ra   c                      s>   ddt  dt gfdtd dt gfg tt fdd d S )NrQ   r?   rL   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   rc   r   test_m_filename_match_first_fcn!  s    (rf   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sRJ |d	 d }d}||ksnJ d S )Nr?   r    myout1r#   rL   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   )e2r)   r*   r   r+   r   r   r   test_m_matrix_named'  s    rj   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`J d S )Nrg   r#   rL   r?   r    FrV   r!   r   rh   )r   r   r%   r&   r   r'   r
   r   )rg   ri   r)   r*   r   r+   r   r   r   test_m_matrix_named_matsym5  s    rk   c                  C   sJ   t ttt dgg} d| f}t|dddd\}|d }d}||ksFJ d S )NrL   r    r!   Fr   r#   z5function out1 = test(x, y)
  out1 = [x x + y 3];
end
)r   r%   r&   r   r0   r   r   r   test_m_matrix_output_autonameC  s    rl   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sJ 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   )e1ri   Ze3Ze4r)   r*   r   r+   r   r   r   test_m_matrix_output_autoname_2P  s    ro   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sJ d S )NzB,CrB   r#   rL   r?   r    r!   FrG   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   )
rC   rD   rB   r;   r<   rE   r)   r*   r   r+   r   r   r   #test_m_results_matrix_named_orderedc  s    
rp   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sJ d S )NrB   r?   rL   rC   r#   rD   Dr    r   r!   Fr   zNfunction [B, C, D] = test(A)
  B = A(1, :);
  C = A(2, :);
  D = A(:, 3);
end
r   r
   r   )rB   rC   rD   rq   r)   r*   r   r+   r   r   r   test_m_matrixsymbol_slicew  s    rs   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sJ d S )NrB   rL   r_   rC   r?   rD   r    r   r#   r!   Fr   zDfunction [B, C] = test(A)
  B = A(1:2, 1:2);
  C = A(1:2, 2:3);
end
rr   rB   rC   rD   r)   r*   r   r+   r   r   r   test_m_matrixsymbol_slice2  s    ru   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sJ d S )NrB         rC   r?   rD   r_   r       r#   rL   r!   Fr   zRfunction [B, C] = test(A)
  B = A(7:end, 2:3:end);
  C = A(1:2:end, 1:3:end);
end
rr   rt   r   r   r   test_m_matrixsymbol_slice3  s    ry   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sJ d S )NrB   r?   rL   rC   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
rr   )rB   rC   r)   r*   r   r+   r   r   r   "test_m_matrixsymbol_slice_autoname  s    Frz   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sJ d S )Nr   IndexedBaseIdxr   zn mTintegerrB   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   nmrB   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sJ d S )Nr   r{   r~   zn m o pTr   rB   rC   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prB   rC   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@J d S )Nr?   Zmysqrr!   Fr   r#   z&function x = mysqr(x)
  x = x.^2;
end
)r
   r%   r   r0   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sJJ t ttd t } d| f}t|dddd\}|d }d}||ksJ d S )	Nr?   r    r!   FrG   r#   z,function x = test(x, y)
  x = x.^2 + y;
end
r   )r
   r%   r&   r   r0   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sJJ 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%   diffr   ZComplexInfinityr   )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sHJ td| | | fddd| |f||fd	}|d d }d
}||ksJ 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   r8   r   z<function out1 = f(x, y)
  global t z
  out1 = x.*y + z;
end
)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,   r/   r2   r4   r7   r:   r=   rF   rH   rO   rS   r\   r]   r`   ra   rf   rj   rk   rl   ro   rp   rs   ru   ry   rz   r   r   r   r   r   r   r   r   r   r   <module>   sV   $

 "