o
    jgE                     @   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sJ d S )NfileFheaderempty )r   r   dump_mgetvalue)code_genoutputsource r   a/var/www/html/zoom/venv/lib/python3.10/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sJ |d }d}||ks%J 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sJ |d }d	tj d
 }||ks*J 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      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   evalfr(   r   r   r   test_m_numbersymbolE   s   r6   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   r9   c                  C   s\   t t } td| tt tgdd}t }t }|j|g|dddd | }d}||ks,J d S )Nr    octave)argument_sequencelanguageFr   z2function out1 = test(z, x, y)
  out1 = x + y;
end
)r%   r&   r   r'   r   r   r   r   )r1   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s'J 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   rA   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s<J 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   rJ   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s=J |d d	 }d
}	||	ksKJ d S )NrB   rC   r    r!   Fr   r   r;   r   r"   r#   zVfunction [C, A, B] = test(x, z, y)
  C = z.*(x + y);
  A = z.*(x - y);
  B = 2*x;
end
rD   rE   r   r   r   test_results_named_ordered   s   
rL   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sDJ |d d	 }d
}||ksRJ d S )Nr   )cossintan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.trigonometricrM   rN   rO   r%   r&   r'   expandr   )rM   rN   rO   r)   r*   r   r+   r   r   r   test_complicated_m_codegen   s   *rT   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s7J |d
 }d}||ksCJ d S )Nr   )rM   rN   afoorC   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
)rR   rM   rN   r   r%   r
   r&   r   )rM   rN   rU   r)   r*   r   r+   r   r   r   !test_m_output_arg_mixed_unordered   s   4rX   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s3J d S )Nr   rC   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ra   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s2J d S )Nr   rY   rC   r#   rZ   r]   r!   Fr7   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
r^   r_   r   r   r   test_m_piecewise_no_inline   s   0
rb   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s&J |d	 d }d}||ks4J d S )NrV   rC   rQ   bar   r!   Fr   r   rW   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   (
re   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s&J |d
 d }dtj d }||ks9J d S )NrV   rC   rQ   rc   rd   r!   TFr   r   rW   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   (rf   c                      s>   ddt  dt gfdtd dt gfg tt fdd d S )NrV   rC   rQ   rc   rd   c                      s   t  dddddS )Nr!   rc   F)prefixr   r   )r   r   r)   r   r   <lambda>#  s    z1test_m_filename_match_first_fcn.<locals>.<lambda>)r%   r&   r   
ValueErrorr   r   rh   r   test_m_filename_match_first_fcn!  s   (rk   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s)J |d	 d }d}||ks7J d S )NrC   r    myout1r#   rQ   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   ro   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s0J d S )Nrl   r#   rQ   rC   r    Fr[   r!   r   rm   )r   r   r%   r&   r   r'   r
   r   )rl   rn   r)   r*   r   r+   r   r   r   test_m_matrix_named_matsym5  s   rp   c                  C   sJ   t ttt dgg} d| f}t|dddd\}|d }d}||ks#J d S )NrQ   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   rq   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sCJ d S )	NrC      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   )e1rn   e3e4r)   r*   r   r+   r   r   r   test_m_matrix_output_autoname_2P  s   rv   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sGJ d S )NzB,CrF   r#   rQ   rC   r    r!   FrK   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   )
rG   rH   rF   r?   r@   rI   r)   r*   r   r+   r   r   r   #test_m_results_matrix_named_orderedc  s   
rw   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sOJ d S )NrF   rC   rQ   rG   r#   rH   Dr    r   r!   Fr   zNfunction [B, C, D] = test(A)
  B = A(1, :);
  C = A(2, :);
  D = A(:, 3);
end
r   r
   r   )rF   rG   rH   rx   r)   r*   r   r+   r   r   r   test_m_matrixsymbol_slicew  s   rz   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sCJ d S )NrF   rQ   rd   rG   rC   rH   r    r   r#   r!   Fr   zDfunction [B, C] = test(A)
  B = A(1:2, 1:2);
  C = A(1:2, 2:3);
end
ry   rF   rG   rH   r)   r*   r   r+   r   r   r   test_m_matrixsymbol_slice2  s   r|   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sFJ d S )NrF         rG   rC   rH   rd   r       r#   rQ   r!   Fr   zRfunction [B, C] = test(A)
  B = A(7:end, 2:3:end);
  C = A(1:2:end, 1:3:end);
end
ry   r{   r   r   r   test_m_matrixsymbol_slice3  s   r   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sDJ d S )NrF   rC   rQ   rG   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
ry   )rF   rG   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sd||dd||	f i ksfJ d S d S )Nr   IndexedBaseIdxr   zn mTintegerrF   r%   r&   ij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)sympy.tensorr   r   sympy.core.symbolr   r   r   )r   r   r   nmrF   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saJ d S )Nr   r   r   zn m o pTr   rF   rG   r&   r   r   kl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prF   rG   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 )NrC   mysqrr!   Fr   r#   z&function x = mysqr(x)
  x = x.^2;
end
)r
   r%   r   r0   r   r   r   test_m_InOutArgument   r3   r   c                  C   s   t ttd t } d| f}t|dddttfd\}|d }d}||ks%J t ttd t } d| f}t|dddd\}|d }d}||ksGJ d S )	NrC   r    r!   FrK   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s%J 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   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s$J td| | | fddd| |f||fd	}|d d }d
}||ksFJ 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   r;   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   
sympy.corer   r   r   r   r   r   r	   sympy.core.relationalr
   $sympy.functions.elementary.piecewiser   sympy.matricesr   r   sympy.utilities.codegenr   r   r   sympy.testing.pytestr   r   r-   r%   r&   r'   r   r,   r/   r2   r6   r9   r>   rA   rJ   rL   rT   rX   ra   rb   re   rf   rk   ro   rp   rq   rv   rw   rz   r|   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sX    $

 "