U
    ZÊ¹j©E  ã                   @   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   úh/var/www/html/bwave/python/venv/lib/python3.8/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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$   z§function [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!   Ú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    ÿrH   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@   rA   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
rB   rC   r   r   r   Útest_results_named_ordered•   s    
ÿÿrJ   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.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.trigonometricrK   rL   rM   r&   r'   r(   Úexpandr   r   )rK   rL   rM   r*   r+   r   r,   r   r   r   Útest_complicated_m_codegen©   s    *ÿÿÿrQ   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   )rK   rL   ÚaÚfoorA   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
)	rO   rK   rL   r   r&   r
   r'   r   r   )rK   rL   rR   r*   r+   r   r,   r   r   r   Ú!test_m_output_arg_mixed_unordered½   s    4ÿrU   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   éÿÿÿÿrA   r$   ©r$   TF©ÚevaluateÚpwtestr"   r   zœfunction 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   rV   rA   r$   rW   rZ   r"   Fr6   zœfunction 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
ÿÿ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 )NrS   rA   rN   Úbaré   r"   Fr   r   rT   r$   z‚function [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    (ÿ
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 )NrS   rA   rN   r`   ra   r"   TFr   r   rT   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    (þþÿrc   c                      s>   ddt  dt gfdtd dt gfg‰ tt‡ fdd„ƒ d S )NrS   rA   rN   r`   ra   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   re   r   Útest_m_filename_match_first_fcn!  s    (rh   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 )NrA   r!   Úmyout1r$   rN   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    ÿrl   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 )Nri   r$   rN   rA   r!   FrX   r"   r   rj   )	r   r   r&   r'   r   r(   r
   r   r   )ri   rk   r*   r+   r   r,   r   r   r   Útest_m_matrix_named_matsym5  s    ÿrm   c                  C   sJ   t ttt dggƒ} d| f}t|dddd�\}|d }d}||ksFt‚d S )NrN   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    ÿrn   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 )	NrA   é   r!   r"   Fr   r$   zˆfunction [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   )Úe1rk   Ze3Ze4r*   r+   r   r,   r   r   r   Útest_m_matrix_output_autoname_2P  s    ÿrq   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,CrD   r$   rN   rA   r!   r"   FrI   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   )
rE   rF   rD   r=   r>   rG   r*   r+   r   r,   r   r   r   Ú#test_m_results_matrix_named_orderedc  s    
ÿÿrr   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 )NrD   rA   rN   rE   r$   rF   ÚDr!   r   r"   Fr   zNfunction [B, C, D] = test(A)
  B = A(1, :);
  C = A(2, :);
  D = A(:, 3);
end
©r   r
   r   r   )rD   rE   rF   rs   r*   r+   r   r,   r   r   r   Útest_m_matrixsymbol_slicew  s    þÿru   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 )NrD   rN   ra   rE   rA   rF   r!   r   r$   r"   Fr   zDfunction [B, C] = test(A)
  B = A(1:2, 1:2);
  C = A(1:2, 2:3);
end
rt   ©rD   rE   rF   r*   r+   r   r,   r   r   r   Útest_m_matrixsymbol_slice2‹  s    ÿÿrw   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 )NrD   é   é   rE   rA   rF   ra   r!   é   r$   rN   r"   Fr   zRfunction [B, C] = test(A)
  B = A(7:end, 2:3:end);
  C = A(1:2:end, 1:3:end);
end
rt   rv   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sˆt‚d S )NrD   rA   rN   rE   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
rt   )rD   rE   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sÈt‚d S )Nr   ©ÚIndexedBaseÚIdx©r   zn mT©ÚintegerrD   r&   r'   ÚiÚjZmat_vec_multr"   Fr   r$   z•function 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ÚmrD   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sÂt‚d S )Nr   r}   r€   zn m o pTr�   rD   rE   r'   rƒ   r„   ÚkÚlZtensorthingr"   Fr   r$   zìfunction 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ÚprD   rE   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 )NrA   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sŽt‚d S )	NrA   r!   r"   FrI   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$   zŠfunction [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   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sŒt‚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'   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?   rH   rJ   rQ   rU   r^   r_   rb   rc   rh   rl   rm   rn   rq   rr   ru   rw   r{   r|   r‰   rŽ   r�   r�   r“   r–   r   r   r   r   Ú<module>   sV   $

 "