U
    ZÊ¹jÇc  ã                1   @  s6  d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZmZ dd	lmZ d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:g1Zd;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSœZG dTdU„ dUeƒZd[dWdX„ZdYdZ„ ZdVS )\ai  
Octave (and Matlab) code printer

The `OctaveCodePrinter` converts SymPy expressions into Octave expressions.
It uses a subset of the Octave language for Matlab compatibility.

A complete code generator, which uses `octave_code` extensively, can be found
in `sympy.utilities.codegen`.  The `codegen` module can be used to generate
complete source code files.

é    )Úannotations)ÚAny)ÚMulÚPowÚSÚRational)Ú_keep_coeff)Úequal_valued)ÚCodePrinter)Ú
precedenceÚ
PRECEDENCE©ÚsearchÚsinÚcosÚtanZcotÚsecZcscÚasinÚacosZacotÚatanÚatan2ZasecZacscÚsinhÚcoshÚtanhZcothZcschZsechÚasinhÚacoshÚatanhZacothZasechZacschÚerfcZerfiÚerfZerfinvZerfcinvZbesseliÚbesseljZbesselkÚbesselyZ	bernoulliÚbetaZeulerÚexpÚ	factorialÚfloorZfresnelcZfresnelsÚgammaZharmonicÚlogZpolylogÚsignÚzetaZlegendreÚabsZangleZbincoeffÚceilZ
chebyshevUZ
chebyshevTZcoshintZcosintZconjZdiracZ	heavisideÚimagZ	laguerreLZlambertwZlogintZgammalnÚmaxÚminÚmodÚpsiÚrealZ
pochhammerZsinhintZsinint)ZAbsÚargZbinomialZceilingZ
chebyshevuZ
chebyshevtÚChiZCiÚ	conjugateZ
DiracDeltaZ	HeavisideZimZlaguerreZLambertWZliZloggammaZMaxZMinÚModZ	polygammaÚreZRisingFactorialZShiZSic                      s  e Zd ZU dZdZdZddddœZeej	fdi d	d	d
œŽZ	de
d< i f‡ fdd„	Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z e Z!e Z"e Z#d9d:„ Z$d;d<„ Z%d=d>„ Z&d?d@„ Z'dAdB„ Z(dCdD„ Z)dEdF„ Z*dGdH„ Z+dIdJ„ Z,dKdL„ Z-dMdN„ Z.dOdP„ Z/dQdR„ Z0dSdT„ Z1dUdV„ Z2dWdX„ Z3dYdZ„ Z4d[d\„ Z5d]d^„ Z6d_d`„ Z7dadb„ Z8dcdd„ Z9dedf„ Z:dgdh„ Z;didj„ Z<dkdl„ Z=e= Z>Z?dmdn„ Z@e@ ZAZBdodp„ ZCdqdr„ ZDdsdt„ ZE‡  ZFS )uÚOctaveCodePrinterzL
    A printer to convert expressions to strings of Octave/Matlab code.
    Z_octaveÚOctaveú&ú|ú~)ÚandÚorÚnoté   T)Ú	precisionÚuser_functionsÚcontractÚinlinezdict[str, Any]Ú_default_settingsc                   sH   t ƒ  |¡ ttttƒƒ| _| j ttƒ¡ | di ¡}| j |¡ d S )Nr@   )	ÚsuperÚ__init__ÚdictÚzipÚknown_fcns_src1Úknown_functionsÚupdateÚknown_fcns_src2Úget)ÚselfÚsettingsZ	userfuncs©Ú	__class__© úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/printing/octave.pyrE   Y   s
    zOctaveCodePrinter.__init__c                 C  s   |d S )Né   rQ   )rM   ÚprQ   rQ   rR   Ú_rate_index_positiona   s    z&OctaveCodePrinter._rate_index_positionc                 C  s   d| S )Nz%s;rQ   )rM   Z
codestringrQ   rQ   rR   Ú_get_statemente   s    z OctaveCodePrinter._get_statementc                 C  s
   d  |¡S )Nz% {}©Úformat)rM   ÚtextrQ   rQ   rR   Ú_get_commenti   s    zOctaveCodePrinter._get_commentc                 C  s   d  ||¡S )Nz{} = {};rW   )rM   ÚnameÚvaluerQ   rQ   rR   Ú_declare_number_constm   s    z'OctaveCodePrinter._declare_number_constc                 C  s
   |   |¡S ©N)Úindent_code)rM   ÚlinesrQ   rQ   rR   Ú_format_codeq   s    zOctaveCodePrinter._format_codec                   s    |j \‰ }‡ fdd„t|ƒD ƒS )Nc                 3  s$   | ]}t ˆ ƒD ]}||fV  qqd S r^   )Úrange)Ú.0ÚjÚi©ÚrowsrQ   rR   Ú	<genexpr>x   s     
  z=OctaveCodePrinter._traverse_matrix_indices.<locals>.<genexpr>)Úshaperb   )rM   ZmatÚcolsrQ   rf   rR   Ú_traverse_matrix_indicesu   s    
z*OctaveCodePrinter._traverse_matrix_indicesc                 C  s^   g }g }|D ]H}t | j|j|jd |jd gƒ\}}}| d|||f ¡ | d¡ q||fS )Né   zfor %s = %s:%sÚend)ÚmapÚ_printÚlabelÚlowerÚupperÚappend)rM   ÚindicesZ
open_linesZclose_linesre   ÚvarÚstartÚstoprQ   rQ   rR   Ú_get_loop_opening_ending{   s    ÿ
z*OctaveCodePrinter._get_loop_opening_endingc                   s‚  |j r.|jr.tj| jr.dˆ tj | ¡ S t|ƒ‰ | ¡ \}}|dk r\t| |ƒ}d}nd}g }g }g }ˆj	dkr€| 
¡ }n
t |¡}|D ]ì}	|	j�r"|	j�r"|	jj�r"|	jj�r"|	jdkrÜ| t|	j|	j dd�¡ nDt|	jd jƒd	k�r
t|	jtƒ�r
| |	¡ | t|	j|	j ƒ¡ qŽ|	j�rp|	tjk	�rp|	jd	k�rR| t|	jƒ¡ |	jd	k�rz| t|	jƒ¡ qŽ| |	¡ qŽ|�pˆtjg}‡ ‡fd
d„|D ƒ}
‡ ‡fdd„|D ƒ}|D ]2}	|	j|k�r¶d|| |	j¡  || |	j¡< �q¶dd„ }|�s||||
ƒ S t|ƒd	k�rB|d j �r$dnd}||||
ƒ | |d  S tdd„ |D ƒƒ�rZdnd}||||
ƒ | d|||ƒ  S d S )Nz%sir   ú-Ú )ÚoldÚnoneéÿÿÿÿF)Úevaluaterl   c                   s   g | ]}ˆ  |ˆ ¡‘qS rQ   ©Úparenthesize©rc   Úx©ÚprecrM   rQ   rR   Ú
<listcomp>¶   s     z0OctaveCodePrinter._print_Mul.<locals>.<listcomp>c                   s   g | ]}ˆ  |ˆ ¡‘qS rQ   r   r�   rƒ   rQ   rR   r…   ·   s     z(%s)c                 S  sF   |d }t dt| ƒƒD ]*}| |d  jr,dnd}|| ||  }q|S )Nr   rl   Ú*ú.*)rb   ÚlenÚ	is_number)ÚaÚa_strÚrre   ZmulsymrQ   rQ   rR   Úmultjoin¿   s
    z.OctaveCodePrinter._print_Mul.<locals>.multjoinú/ú./c                 s  s   | ]}|j V  qd S r^   ©r‰   )rc   ZbirQ   rQ   rR   rh   Í   s     z/OctaveCodePrinter._print_Mul.<locals>.<genexpr>)r‰   Zis_imaginaryr   ZImaginaryUnitZ
is_Integerro   r   Zas_coeff_Mulr   ÚorderZas_ordered_factorsr   Z	make_argsÚis_commutativeZis_Powr"   Zis_RationalZis_negativers   r   Úbaserˆ   ÚargsÚ
isinstanceÚInfinityrT   r   ÚqZOneÚindexÚall)rM   ÚexprÚcÚer'   rŠ   ÚbZ	pow_parenr”   Úitemr‹   Zb_strr�   ZdivsymrQ   rƒ   rR   Ú
_print_Mul‡   sb    
ÿ


ÿ
$
$ÿÿzOctaveCodePrinter._print_Mulc                 C  s,   |   |j¡}|   |j¡}|j}d |||¡S )Nz{} {} {})ro   ÚlhsÚrhsZrel_oprX   )rM   rš   Úlhs_codeÚrhs_codeÚoprQ   rQ   rR   Ú_print_RelationalÑ   s    z#OctaveCodePrinter._print_Relationalc                 C  sÒ   t dd„ |jD ƒƒrdnd}t|ƒ}t|jdƒr@d|  |j¡ S |jr°t|jdƒrz|jjr^dnd	}d
| d|  |j¡  S t|jdƒr°|jjr’dnd	}d
| d|  	|j|¡  S d|  	|j|¡||  	|j|¡f S )Nc                 s  s   | ]}|j V  qd S r^   r�   r�   rQ   rQ   rR   rh   Ø   s     z/OctaveCodePrinter._print_Pow.<locals>.<genexpr>ú^z.^g      à?zsqrt(%s)g      à¿rŽ   r�   Ú1r}   ú%sz%s%s%s)
r™   r”   r   r	   r"   ro   r“   r’   r‰   r€   )rM   rš   Z	powsymbolÚPRECÚsymrQ   rQ   rR   Ú
_print_Pow×   s    ÿzOctaveCodePrinter._print_Powc                 C  s(   t |ƒ}d|  |j|¡|  |j|¡f S )Nz%s^%s)r   r€   r“   r"   ©rM   rš   r©   rQ   rQ   rR   Ú_print_MatPowë   s    ÿzOctaveCodePrinter._print_MatPowc                 C  s(   t |ƒ}d|  |j|¡|  |j|¡f S )Nz%s \ %s)r   r€   ÚmatrixZvectorr¬   rQ   rQ   rR   Ú_print_MatrixSolveð   s    ÿz$OctaveCodePrinter._print_MatrixSolvec                 C  s   dS )NÚpirQ   ©rM   rš   rQ   rQ   rR   Ú	_print_Piõ   s    zOctaveCodePrinter._print_Pic                 C  s   dS )NZ1irQ   r±   rQ   rQ   rR   Ú_print_ImaginaryUnitù   s    z&OctaveCodePrinter._print_ImaginaryUnitc                 C  s   dS )Nzexp(1)rQ   r±   rQ   rQ   rR   Ú_print_Exp1ý   s    zOctaveCodePrinter._print_Exp1c                 C  s   dS )Nz(1+sqrt(5))/2rQ   r±   rQ   rQ   rR   Ú_print_GoldenRatio  s    z$OctaveCodePrinter._print_GoldenRatioc                 C  sä   ddl m} ddlm} ddlm} |j}|j}| jd s�t	|j|ƒr�g }g }|j
D ]"\}	}
| |||	ƒ¡ | |
¡ qT|t||ƒŽ }|  |¡S | jd rº| |¡s®| |¡rº|  ||¡S |  |¡}|  |¡}|  d||f ¡S d S )Nr   )Ú
Assignment)Ú	Piecewise)ÚIndexedBaserB   rA   z%s = %s)Zsympy.codegen.astr¶   Z$sympy.functions.elementary.piecewiser·   Zsympy.tensor.indexedr¸   r    r¡   Ú	_settingsr•   r”   rs   rG   ro   ÚhasZ_doprint_loopsrV   )rM   rš   r¶   r·   r¸   r    r¡   ZexpressionsÚ
conditionsrœ   r›   Útempr¢   r£   rQ   rQ   rR   Ú_print_Assignment  s(    
ÿ

z#OctaveCodePrinter._print_Assignmentc                 C  s   dS )NÚinfrQ   r±   rQ   rQ   rR   Ú_print_Infinity$  s    z!OctaveCodePrinter._print_Infinityc                 C  s   dS )Nz-infrQ   r±   rQ   rQ   rR   Ú_print_NegativeInfinity(  s    z)OctaveCodePrinter._print_NegativeInfinityc                 C  s   dS )NÚNaNrQ   r±   rQ   rQ   rR   Ú
_print_NaN,  s    zOctaveCodePrinter._print_NaNc                   s    dd  ‡ fdd„|D ƒ¡ d S )NÚ{ú, c                 3  s   | ]}ˆ   |¡V  qd S r^   ©ro   ©rc   rŠ   ©rM   rQ   rR   rh   1  s     z0OctaveCodePrinter._print_list.<locals>.<genexpr>Ú}©Újoinr±   rQ   rÇ   rR   Ú_print_list0  s    zOctaveCodePrinter._print_listc                 C  s   dS )NÚtruerQ   r±   rQ   rQ   rR   Ú_print_BooleanTrue7  s    z$OctaveCodePrinter._print_BooleanTruec                 C  s   dS )NÚfalserQ   r±   rQ   rQ   rR   Ú_print_BooleanFalse;  s    z%OctaveCodePrinter._print_BooleanFalsec                 C  s   t |ƒ ¡ S r^   )Ústrrq   r±   rQ   rQ   rR   Ú_print_bool?  s    zOctaveCodePrinter._print_boolc                   sr   ˆ j ˆ jfdkrdS tjˆ jkr0dˆ j ˆ jf S ˆ j ˆ jfdkrNˆ ˆ d ¡S dd ‡ ‡fdd„tˆ j ƒD ƒ¡ S )	N)r   r   z[]zzeros(%s, %s))rl   rl   z[%s]z; c                 3  s2   | ]*}d   ‡fdd„ˆ |dd…f D ƒ¡V  qdS )ú c                   s   g | ]}ˆ   |¡‘qS rQ   rÅ   rÆ   rÇ   rQ   rR   r…   P  s     zAOctaveCodePrinter._print_MatrixBase.<locals>.<genexpr>.<listcomp>NrÉ   )rc   rŒ   ©ÚArM   rQ   rR   rh   P  s   ÿz6OctaveCodePrinter._print_MatrixBase.<locals>.<genexpr>)rg   rj   r   ZZerori   ro   rÊ   rb   )rM   rÔ   rQ   rÓ   rR   Ú_print_MatrixBaseG  s    ÿz#OctaveCodePrinter._print_MatrixBasec                 C  sx   ddl m} | ¡ }|dd„ |D ƒgƒ}|dd„ |D ƒgƒ}|dd„ |D ƒgƒ}d|  |¡|  |¡|  |¡|j|jf S )Nr   )ÚMatrixc                 S  s   g | ]}|d  d ‘qS )r   rl   rQ   ©rc   ÚkrQ   rQ   rR   r…   X  s     z<OctaveCodePrinter._print_SparseRepMatrix.<locals>.<listcomp>c                 S  s   g | ]}|d  d  ‘qS )rl   rQ   r×   rQ   rQ   rR   r…   Y  s     c                 S  s   g | ]}|d  ‘qS )é   rQ   r×   rQ   rQ   rR   r…   Z  s     zsparse(%s, %s, %s, %s, %s))Zsympy.matricesrÖ   Zcol_listro   rg   rj   )rM   rÔ   rÖ   ÚLÚIÚJZAIJrQ   rQ   rR   Ú_print_SparseRepMatrixT  s      ÿz(OctaveCodePrinter._print_SparseRepMatrixc                 C  s.   | j |jtd dd�d|jd |jd f  S )NZAtomT)Ústrictz(%s, %s)rl   )r€   Úparentr   re   rd   r±   rQ   rQ   rR   Ú_print_MatrixElement_  s    ÿz&OctaveCodePrinter._print_MatrixElementc                   sL   ‡ fdd„}ˆ   |j¡d ||j|jjd ƒ d ||j|jjd ƒ d S )Nc                   sŒ   | d d }| d }| d }ˆ   |¡}||kr2dnˆ   |¡}|dkrr|dkrX||krXdS ||krd|S |d | S nd |ˆ   |¡|f¡S d S )Nr   rl   rÙ   rm   ú:)ro   rÊ   )r‚   ZlimÚlÚhÚstepZlstrZhstrrÇ   rQ   rR   Ústrslicee  s    
z6OctaveCodePrinter._print_MatrixSlice.<locals>.strsliceú(r   rÄ   rl   ú))ro   rß   Zrowsliceri   Zcolslice)rM   rš   rå   rQ   rÇ   rR   Ú_print_MatrixSliced  s    ÿÿþþz$OctaveCodePrinter._print_MatrixSlicec                   s0   ‡ fdd„|j D ƒ}dˆ  |jj¡d |¡f S )Nc                   s   g | ]}ˆ   |¡‘qS rQ   rÅ   )rc   re   rÇ   rQ   rR   r…   z  s     z4OctaveCodePrinter._print_Indexed.<locals>.<listcomp>z%s(%s)rÄ   )rt   ro   r“   rp   rÊ   )rM   rš   ZindsrQ   rÇ   rR   Ú_print_Indexedy  s    z OctaveCodePrinter._print_Indexedc                 C  s   |   |j¡S r^   )ro   rp   r±   rQ   rQ   rR   Ú
_print_Idx~  s    zOctaveCodePrinter._print_Idxc                   s&   t d ‰ dt‡ ‡fdd„|jD ƒƒ S )Nr   zdouble(%s == %s)c                 3  s   | ]}ˆ  |ˆ ¡V  qd S r^   r   r�   rƒ   rQ   rR   rh   „  s   ÿz:OctaveCodePrinter._print_KroneckerDelta.<locals>.<genexpr>)r   Útupler”   r±   rQ   rƒ   rR   Ú_print_KroneckerDelta‚  s    ÿz'OctaveCodePrinter._print_KroneckerDeltac                   s   d  ‡ ‡fdd„ˆ jD ƒ¡S )Nr‡   c                   s   g | ]}ˆ  |tˆ ƒ¡‘qS rQ   )r€   r   )rc   r1   ©rš   rM   rQ   rR   r…   ˆ  s   ÿz<OctaveCodePrinter._print_HadamardProduct.<locals>.<listcomp>)rÊ   r”   r±   rQ   rí   rR   Ú_print_HadamardProduct‡  s    ÿz(OctaveCodePrinter._print_HadamardProductc                 C  s*   t |ƒ}d |  |j|¡|  |j|¡g¡S )Nz.**)r   rÊ   r€   r“   r"   r¬   rQ   rQ   rR   Ú_print_HadamardPower‹  s
    þz&OctaveCodePrinter._print_HadamardPowerc                   sP   |j }t|ƒdkr,|d |d kr,|d g}d ‡ fdd„|D ƒ¡}d| d S )	NrÙ   r   rl   rÄ   c                 3  s   | ]}ˆ   |¡V  qd S r^   rÅ   )rc   ÚnrÇ   rQ   rR   rh   –  s     z4OctaveCodePrinter._print_Identity.<locals>.<genexpr>zeye(rç   )ri   rˆ   rÊ   )rM   rš   ri   ÚsrQ   rÇ   rR   Ú_print_Identity’  s
    
z!OctaveCodePrinter._print_Identityc                 C  s$   d  |  |jd ¡|  |jd ¡¡S )Nz (gammainc({1}, {0}).*gamma({0}))r   rl   ©rX   ro   r”   r±   rQ   rQ   rR   Ú_print_lowergamma™  s     ÿz#OctaveCodePrinter._print_lowergammac                 C  s$   d  |  |jd ¡|  |jd ¡¡S )Nz)(gammainc({1}, {0}, 'upper').*gamma({0}))r   rl   ró   r±   rQ   rQ   rR   Ú_print_uppergammaŸ  s     ÿz#OctaveCodePrinter._print_uppergammac                 C  s   d|   |jd tj ¡ S )Nzsinc(%s)r   )ro   r”   r   ÚPir±   rQ   rQ   rR   Ú_print_sinc¤  s    zOctaveCodePrinter._print_sincc                 C  s   d|   |j¡|   |j¡f S )Nzbesselh(%s, 1, %s)©ro   r‘   Úargumentr±   rQ   rQ   rR   Ú_print_hankel1©  s    
ÿz OctaveCodePrinter._print_hankel1c                 C  s   d|   |j¡|   |j¡f S )Nzbesselh(%s, 2, %s)rø   r±   rQ   rQ   rR   Ú_print_hankel2®  s    
ÿz OctaveCodePrinter._print_hankel2c                 C  sD   ddl m}m} |j}|tjd|  ƒ||jtj |ƒ }|  |¡S )Nr   )Úsqrtr   rÙ   )	Úsympy.functionsrü   r   rù   r   rö   r‘   ÚHalfro   )rM   rš   rü   r   r‚   Úexpr2rQ   rQ   rR   Ú	_print_jn´  s    $zOctaveCodePrinter._print_jnc                 C  sD   ddl m}m} |j}|tjd|  ƒ||jtj |ƒ }|  |¡S )Nr   )rü   r    rÙ   )	rý   rü   r    rù   r   rö   r‘   rþ   ro   )rM   rš   rü   r    r‚   rÿ   rQ   rQ   rR   Ú	_print_yn»  s    $zOctaveCodePrinter._print_ync                 C  s   d|   |jd ¡ S )Nzairy(0, %s)r   ©ro   r”   r±   rQ   rQ   rR   Ú_print_airyaiÂ  s    zOctaveCodePrinter._print_airyaic                 C  s   d|   |jd ¡ S )Nzairy(1, %s)r   r  r±   rQ   rQ   rR   Ú_print_airyaiprimeÆ  s    z$OctaveCodePrinter._print_airyaiprimec                 C  s   d|   |jd ¡ S )Nzairy(2, %s)r   r  r±   rQ   rQ   rR   Ú_print_airybiÊ  s    zOctaveCodePrinter._print_airybic                 C  s   d|   |jd ¡ S )Nzairy(3, %s)r   r  r±   rQ   rQ   rR   Ú_print_airybiprimeÎ  s    z$OctaveCodePrinter._print_airybiprimec                 C  s*   |j \}}|dkr|  |¡S d|  |¡ S )Nrl   z
expint(%s))r”   Ú_print_not_supportedro   )rM   rš   Úmur‚   rQ   rQ   rR   Ú_print_expintÒ  s    

zOctaveCodePrinter._print_expintc                   sD   t |jƒdkst‚djˆ j|jj d ‡ fdd„t|jƒD ƒ¡d�S )NrÙ   z{name}({args})rÄ   c                   s   g | ]}ˆ   |¡‘qS rQ   rÅ   r�   rÇ   rQ   rR   r…   Ý  s     z?OctaveCodePrinter._one_or_two_reversed_args.<locals>.<listcomp>)r[   r”   )	rˆ   r”   ÚAssertionErrorrX   rI   rP   Ú__name__rÊ   Úreversedr±   rQ   rÇ   rR   Ú_one_or_two_reversed_argsÙ  s
    þz+OctaveCodePrinter._one_or_two_reversed_argsc              	   C  s<   dj | j|jj |  |jd ¡|  |j|jdd … Ž ¡d�S )Nz{name}({arg1}, {arg2})r   rl   )r[   Zarg1Zarg2)rX   rI   rP   r  ro   r”   Úfuncr±   rQ   rQ   rR   Ú_nested_binary_math_funcä  s
    ýz*OctaveCodePrinter._nested_binary_math_funcc           
        s,  |j d jdkrtdƒ‚g }ˆ jd r~‡ fdd„|j d d… D ƒ}dˆ  |j d j¡ }d |¡| d	t|ƒ  }d
| d	 S t|j ƒD ]”\}\}}|dkr²| 	dˆ  |¡ ¡ n:|t|j ƒd krØ|dkrØ| 	d¡ n| 	dˆ  |¡ ¡ ˆ  |¡}	| 	|	¡ |t|j ƒd krˆ| 	d¡ qˆd |¡S d S )Nr}   Tz¼All Piecewise expressions must contain an (expr, True) statement to be used as a default condition. Without one, the generated expression may not evaluate to anything under some condition.rB   c                   s(   g | ] \}}d   ˆ  |¡ˆ  |¡¡‘qS )z({0}).*({1}) + (~({0})).*()rX   ro   )rc   rœ   r›   rÇ   rQ   rR   r…   ü  s
   þ ÿz6OctaveCodePrinter._print_Piecewise.<locals>.<listcomp>r¨   z ...
rç   ræ   r   zif (%s)rl   Úelsezelseif (%s)rm   Ú
)
r”   ZcondÚ
ValueErrorr¹   ro   rš   rÊ   rˆ   Ú	enumeraters   )
rM   rš   r`   ZecpairsZelastÚpwre   rœ   r›   Zcode0rQ   rÇ   rR   Ú_print_Piecewiseî  s*    

þ

z"OctaveCodePrinter._print_Piecewisec                 C  s0   t |jƒdkr"d|  |jd ¡ S |  |¡S d S )Nrl   zzeta(%s)r   )rˆ   r”   ro   r  r±   rQ   rQ   rR   Ú_print_zeta  s    zOctaveCodePrinter._print_zetac           
        sÂ   t |tƒr$|  | d¡¡}d |¡S d}d‰d‰ dd„ |D ƒ}‡fdd„|D ƒ}‡ fd	d„|D ƒ}g }d
}t|ƒD ]J\}}	|	dkrŽ| |	¡ qr||| 8 }| d|| |	f ¡ ||| 7 }qr|S )z0Accepts a string of code or a list of code linesTrz   z  )z
^function z^if ú^elseif ú^else$z^for )z^end$r  r  c                 S  s   g | ]}|  d ¡‘qS )z 	)Úlstrip)rc   ÚlinerQ   rQ   rR   r…   (  s     z1OctaveCodePrinter.indent_code.<locals>.<listcomp>c                   s&   g | ]‰ t t‡ fd d„ˆD ƒƒƒ‘qS )c                 3  s   | ]}t |ˆ ƒV  qd S r^   r   ©rc   r5   ©r  rQ   rR   rh   *  s     ú;OctaveCodePrinter.indent_code.<locals>.<listcomp>.<genexpr>©ÚintÚany©rc   )Ú	inc_regexr  rR   r…   *  s   ÿc                   s&   g | ]‰ t t‡ fd d„ˆD ƒƒƒ‘qS )c                 3  s   | ]}t |ˆ ƒV  qd S r^   r   r  r  rQ   rR   rh   ,  s     r  r  r!  )Ú	dec_regexr  rR   r…   ,  s   ÿr   )rz   r  z%s%s)r•   rÐ   r_   Ú
splitlinesrÊ   r  rs   )
rM   ÚcodeZ
code_linesÚtabZincreaseZdecreaseÚprettyÚlevelrð   r  rQ   )r#  r"  rR   r_     s.    


ÿ
ÿ
zOctaveCodePrinter.indent_code)Gr  Ú
__module__Ú__qualname__Ú__doc__ZprintmethodÚlanguageÚ
_operatorsrF   r
   rC   Ú__annotations__rE   rU   rV   rZ   r]   ra   rk   rx   rŸ   r¥   r«   r­   r¯   r²   r³   r´   rµ   r½   r¿   rÀ   rÂ   rË   Z_print_tupleZ_print_TupleZ_print_ListrÍ   rÏ   rÑ   rÕ   rÝ   rà   rè   ré   rê   rì   rî   rï   rò   rô   rõ   r÷   rú   rû   r   r  r  r  r  r  r	  r  Z_print_DiracDeltaZ_print_LambertWr  Z
_print_MaxZ
_print_Minr  r  r_   Ú__classcell__rQ   rQ   rO   rR   r6   A   sŒ   
ýüJ%r6   Nc                 K  s   t |ƒ | |¡S )aŠ  Converts `expr` to a string of Octave (or Matlab) code.

    The string uses a subset of the Octave language for Matlab compatibility.

    Parameters
    ==========

    expr : Expr
        A SymPy expression to be converted.
    assign_to : optional
        When given, the argument is used as the name of the variable to which
        the expression is assigned.  Can be a string, ``Symbol``,
        ``MatrixSymbol``, or ``Indexed`` type.  This can be helpful for
        expressions that generate multi-line statements.
    precision : integer, optional
        The precision for numbers such as pi  [default=16].
    user_functions : dict, optional
        A dictionary where keys are ``FunctionClass`` instances and values are
        their string representations.  Alternatively, the dictionary value can
        be a list of tuples i.e. [(argument_test, cfunction_string)].  See
        below for examples.
    human : bool, optional
        If True, the result is a single string that may contain some constant
        declarations for the number symbols.  If False, the same information is
        returned in a tuple of (symbols_to_declare, not_supported_functions,
        code_text).  [default=True].
    contract: bool, optional
        If True, ``Indexed`` instances are assumed to obey tensor contraction
        rules and the corresponding nested loops over indices are generated.
        Setting contract=False will not generate loops, instead the user is
        responsible to provide values for the indices in the code.
        [default=True].
    inline: bool, optional
        If True, we try to create single-statement code instead of multiple
        statements.  [default=True].

    Examples
    ========

    >>> from sympy import octave_code, symbols, sin, pi
    >>> x = symbols('x')
    >>> octave_code(sin(x).series(x).removeO())
    'x.^5/120 - x.^3/6 + x'

    >>> from sympy import Rational, ceiling
    >>> x, y, tau = symbols("x, y, tau")
    >>> octave_code((2*tau)**Rational(7, 2))
    '8*sqrt(2)*tau.^(7/2)'

    Note that element-wise (Hadamard) operations are used by default between
    symbols.  This is because its very common in Octave to write "vectorized"
    code.  It is harmless if the values are scalars.

    >>> octave_code(sin(pi*x*y), assign_to="s")
    's = sin(pi*x.*y);'

    If you need a matrix product "*" or matrix power "^", you can specify the
    symbol as a ``MatrixSymbol``.

    >>> from sympy import Symbol, MatrixSymbol
    >>> n = Symbol('n', integer=True, positive=True)
    >>> A = MatrixSymbol('A', n, n)
    >>> octave_code(3*pi*A**3)
    '(3*pi)*A^3'

    This class uses several rules to decide which symbol to use a product.
    Pure numbers use "*", Symbols use ".*" and MatrixSymbols use "*".
    A HadamardProduct can be used to specify componentwise multiplication ".*"
    of two MatrixSymbols.  There is currently there is no easy way to specify
    scalar symbols, so sometimes the code might have some minor cosmetic
    issues.  For example, suppose x and y are scalars and A is a Matrix, then
    while a human programmer might write "(x^2*y)*A^3", we generate:

    >>> octave_code(x**2*y*A**3)
    '(x.^2.*y)*A^3'

    Matrices are supported using Octave inline notation.  When using
    ``assign_to`` with matrices, the name can be specified either as a string
    or as a ``MatrixSymbol``.  The dimensions must align in the latter case.

    >>> from sympy import Matrix, MatrixSymbol
    >>> mat = Matrix([[x**2, sin(x), ceiling(x)]])
    >>> octave_code(mat, assign_to='A')
    'A = [x.^2 sin(x) ceil(x)];'

    ``Piecewise`` expressions are implemented with logical masking by default.
    Alternatively, you can pass "inline=False" to use if-else conditionals.
    Note that if the ``Piecewise`` lacks a default term, represented by
    ``(expr, True)`` then an error will be thrown.  This is to prevent
    generating an expression that may not evaluate to anything.

    >>> from sympy import Piecewise
    >>> pw = Piecewise((x + 1, x > 0), (x, True))
    >>> octave_code(pw, assign_to=tau)
    'tau = ((x > 0).*(x + 1) + (~(x > 0)).*(x));'

    Note that any expression that can be generated normally can also exist
    inside a Matrix:

    >>> mat = Matrix([[x**2, pw, sin(x)]])
    >>> octave_code(mat, assign_to='A')
    'A = [x.^2 ((x > 0).*(x + 1) + (~(x > 0)).*(x)) sin(x)];'

    Custom printing can be defined for certain types by passing a dictionary of
    "type" : "function" to the ``user_functions`` kwarg.  Alternatively, the
    dictionary value can be a list of tuples i.e., [(argument_test,
    cfunction_string)].  This can be used to call a custom Octave function.

    >>> from sympy import Function
    >>> f = Function('f')
    >>> g = Function('g')
    >>> custom_functions = {
    ...   "f": "existing_octave_fcn",
    ...   "g": [(lambda x: x.is_Matrix, "my_mat_fcn"),
    ...         (lambda x: not x.is_Matrix, "my_fcn")]
    ... }
    >>> mat = Matrix([[1, x]])
    >>> octave_code(f(x) + g(x) + g(mat), user_functions=custom_functions)
    'existing_octave_fcn(x) + my_fcn(x) + my_mat_fcn([1 x])'

    Support for loops is provided through ``Indexed`` types. With
    ``contract=True`` these expressions will be turned into loops, whereas
    ``contract=False`` will just print the assignment expression that should be
    looped over:

    >>> from sympy import Eq, IndexedBase, Idx
    >>> len_y = 5
    >>> y = IndexedBase('y', shape=(len_y,))
    >>> t = IndexedBase('t', shape=(len_y,))
    >>> Dy = IndexedBase('Dy', shape=(len_y-1,))
    >>> i = Idx('i', len_y-1)
    >>> e = Eq(Dy[i], (y[i+1]-y[i])/(t[i+1]-t[i]))
    >>> octave_code(e.rhs, assign_to=e.lhs, contract=False)
    'Dy(i) = (y(i + 1) - y(i))./(t(i + 1) - t(i));'
    )r6   Zdoprint)rš   Z	assign_torN   rQ   rQ   rR   Úoctave_code;  s     	r0  c                 K  s   t t| f|Žƒ dS )zŒPrints the Octave (or Matlab) representation of the given expression.

    See `octave_code` for the meaning of the optional arguments.
    N)Úprintr0  )rš   rN   rQ   rQ   rR   Úprint_octave_codeÆ  s    r2  )N)r+  Ú
__future__r   Útypingr   Z
sympy.corer   r   r   r   Zsympy.core.mulr   Zsympy.core.numbersr	   Zsympy.printing.codeprinterr
   Zsympy.printing.precedencer   r   r5   r   rH   rK   r6   r0  r2  rQ   rQ   rQ   rR   Ú<module>   sª                                      øè   }
 