B
    [gJ                 @   s  d 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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&hZd'd(hZd)d*d+hZd,d-iZd.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdAdBdCdDdEdFdGdHdIdJZdKdLdKdMZdNdO ZdPdQ ZG dRdS dSeZx ejD ]ZeedTe e qW xeD ]ZeedTe e q>W dUdV ZdW ZdXdY e D ZeefdZdZiZd[dLiZ G d\d] d]eZ!x e!jD ]Zee!dTe e qW xe D ]Zee!dTe e qW d^ Z"d_dY e D Z#ee#fd`dadbdcdddedfdgdZdh	Z$G didj djeZ%x e%jD ]Zee%dTe e q6W x e%j&D ]Zee%dTe e qXW d8d9dkdldmdnd<d>dodpdqdrZ'dsdLdKdtZ(G dudv dve%Z)x e)jD ]Zee)dTe e qW x e)j&D ]Zee)dTe e qW G dwdx dxeZ*dyS )zzy
Python code printers

This module contains python code printers for plain python as well as NumPy & SciPy enabled code.
    )defaultdict)wraps)chain)sympifyS   )
precedence)CodePrinterandasassertbreakclasscontinuedefdelelifelseexceptfinallyforfromglobalifimportinislambdanotorpassraisereturntrywhilewithyieldNoneexecprintFalsenonlocalTrueZAbsabsacosacoshasinasinhatanatan2atanhZceilcoscosherferfcexpexpm1	factorialfloorgammahypotZlgammaloglog10log1plog2sinsinhZsqrttantanh)r.   r/   r0   r1   r2   r3   r4   Zceilingr5   r6   r7   r8   r9   r:   r;   r<   r=   r>   loggammar?   Zlnr@   rA   rB   rC   rD   ZSqrtrE   rF   eZpi)ZExp1PiEc                s8    j |jj }dj |dt fdd|jdS )Nz{name}({args})z, c                s
     | S )N)_print)arg)self 4lib/python3.7/site-packages/sympy/printing/pycode.py<lambda>G   s    z#_print_known_func.<locals>.<lambda>)nameargs)known_functions	__class____name__format_module_formatjoinmaprR   )rM   exprknownrN   )rM   rO   _print_known_funcD   s    r\   c             C   s   | j |jj }| |S )N)known_constantsrT   rU   rW   )rM   rZ   r[   rN   rN   rO   _print_known_constJ   s    r^   c                   s  e Zd ZdZdZdZeeZ	dZ
dZeee dd e D Zdd	 e D Zd
dddZeeji dddddZdI fdd	Zdd Zdd ZdJd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# fd-d.Z$d/d0 Z%d1d2 Z&d3d4 Z'd5d6 Z(d7d8  Z) Z* Z+ Z, Z- Z. Z/Z0d9d: Z1d;d< Z2d=d> Z3d?d@ Z4dAdB Z5dCdD Z6dEdF Z7dGdH Z8  Z9S )KPythonCodePrinterZ_pythoncodePythonZpython3Nz    c             C   s   g | ]\}}|d | fqS )zmath.rN   ).0kvrN   rN   rO   
<listcomp>X   s    zPythonCodePrinter.<listcomp>c             C   s   i | ]\}}d | |qS )zmath.rN   )ra   rb   rc   rN   rN   rO   
<dictcomp>Z   s    zPythonCodePrinter.<dictcomp>r
   r   r   )r
   r   r      TF)user_functionsZ	precisionZinlinefully_qualified_modulesZcontractc                sV   t t| | tt| _t| jf|p(i di | _	t| j
f|pDi di | _d S )Nrg   Zuser_constants)superr_   __init__r   setmodule_importsdict_kfgetrS   _kcr]   )rM   settings)rT   rN   rO   rj   e   s    
zPythonCodePrinter.__init__c             C   s   |S )NrN   )rM   
codestringrN   rN   rO   _get_statementm   s    z PythonCodePrinter._get_statementc             C   s   d||f S )Nz%s = %srN   )rM   rQ   valuerN   rN   rO   _declare_number_constp   s    z'PythonCodePrinter._declare_number_constc             C   sp   | d}|r<t|dkr<| jd|d d  |d  | jd rJ|S | dd  dd  dd S d S )N.r   rh   (r   [)splitlenrl   rX   addZ	_settings)rM   ZfqnregisterpartsrN   rN   rO   rW   s   s    
"
z PythonCodePrinter._module_formatc             C   s   |S )NrN   )rM   linesrN   rN   rO   _format_code}   s    zPythonCodePrinter._format_codec             C   s   d| S )Nz%srN   )rM   rr   rN   rN   rO   rs      s    c             C   s
   d |S )Nz  # {0})rV   )rM   textrN   rN   rO   _get_comment   s    zPythonCodePrinter._get_commentc             C   s   dS )Nzfloat('nan')rN   )rM   rZ   rN   rN   rO   
_print_NaN   s    zPythonCodePrinter._print_NaNc             C   s   dS )Nzfloat('inf')rN   )rM   rZ   rN   rN   rO   _print_Infinity   s    z!PythonCodePrinter._print_Infinityc             C   s    dj | d| |jd dS )Nz"(0.0 if {e} == 0 else {f}(1, {e}))zmath.copysignr   )frH   )rV   rW   rK   rR   )rM   rH   rN   rN   rO   _print_sign   s    zPythonCodePrinter._print_signc             C   s   dS )Nzfloat('-inf')rN   )rM   rZ   rN   rN   rO   _print_NegativeInfinity   s    z)PythonCodePrinter._print_NegativeInfinityc             C   s
   |  |S )N)r   )rM   rZ   rN   rN   rO   _print_ComplexInfinity   s    z(PythonCodePrinter._print_ComplexInfinityc                s$   t | djt fdd|j S )Nz	{0} % {1}c                s    |  S )N)Zparenthesize)x)PRECrM   rN   rO   rP      s    z.PythonCodePrinter._print_Mod.<locals>.<lambda>)r   rV   rY   rR   )rM   rZ   rN   )r   rM   rO   
_print_Mod   s    zPythonCodePrinter._print_Modc             C   s   g }d}x||j D ]r}|j}|j}|dkr2|d |d || | |d |d || | |d |d7 }qW |d d }|d dkr|d d	 }|d n
|d
 d|S )Nr   rx   )z if z else r   rw   r,   z else None) )rR   rZ   condappendrK   rX   )rM   rZ   resultirL   rH   crN   rN   rO   _print_Piecewise   s(    





z"PythonCodePrinter._print_Piecewisec                sV   ddddddd}|j |krF| |j}| |j}dj|j ||d	S tt| |S )
z.Relational printer for Equality and Unequalityequal	not_equalless
less_equalgreatergreater_equal)z==z!=<z<=>z>=z({lhs} {op} {rhs}))oplhsrhs)rel_oprK   r   r   rV   ri   r_   _print_Relational)rM   rZ   r   r   r   )rT   rN   rO   r      s    
z#PythonCodePrinter._print_Relationalc             C   s   ddl m} | ||S )Nr   )	Piecewise)Z$sympy.functions.elementary.piecewiser   rK   Zrewrite)rM   rZ   r   rN   rN   rO   
_print_ITE   s    zPythonCodePrinter._print_ITEc                s0    fdd|j D }dj |jd|dS )Nc             3   s6   | ].\}}}d j  | | |dV  qdS )zfor {i} in range({a}, {b}+1))r   abN)rV   rK   )ra   r   r   r   )rM   rN   rO   	<genexpr>   s   z/PythonCodePrinter._print_Sum.<locals>.<genexpr>z"(builtins.sum({function} {loops})) )functionloops)ZlimitsrV   rK   r   rX   )rM   rZ   r   rN   )rM   rO   
_print_Sum   s
    


zPythonCodePrinter._print_Sumc             C   s   dS )NZ1jrN   )rM   rZ   rN   rN   rO   _print_ImaginaryUnit   s    z&PythonCodePrinter._print_ImaginaryUnitc             C   s,   |j j}| j||}d|| | f S )Nz%s(%s))rT   rU   rS   ro   rK   tolist)rM   rZ   rQ   funcrN   rN   rO   _print_MatrixBase   s    z#PythonCodePrinter._print_MatrixBasec             C   s
   |  |S )N)r   )rM   rZ   rN   rN   rO   rP      s    zPythonCodePrinter.<lambda>c                s   d  fdd|dD S )N
c                s   g | ]} j | qS rN   )tab)ra   line)rM   rN   rO   rd      s    z8PythonCodePrinter._indent_codestring.<locals>.<listcomp>)rX   rz   )rM   rr   rN   )rM   rO   _indent_codestring   s    z$PythonCodePrinter._indent_codestringc                sN   d t fdd|j}dj |jd  fdd|jD  |dS )	Nr   c                s
     | S )N)rK   )rL   )rM   rN   rO   rP      s    z=PythonCodePrinter._print_FunctionDefinition.<locals>.<lambda>z def {name}({parameters}):
{body}z, c                s   g | ]}  |jqS rN   )rK   symbol)ra   var)rM   rN   rO   rd      s    z?PythonCodePrinter._print_FunctionDefinition.<locals>.<listcomp>)rQ   
parametersbody)rX   rY   r   rV   rK   rQ   r   r   )rM   fdr   rN   )rM   rO   _print_FunctionDefinition   s
    
z+PythonCodePrinter._print_FunctionDefinitionc                s6   d t fdd|j}dj |j |dS )Nr   c                s
     | S )N)rK   )rL   )rM   rN   rO   rP      s    z0PythonCodePrinter._print_While.<locals>.<lambda>zwhile {cond}:
{body})r   r   )rX   rY   r   rV   rK   Z	conditionr   )rM   Zwhlr   rN   )rM   rO   _print_While   s    
zPythonCodePrinter._print_Whilec             C   s    d|  |jj|  |jjf S )Nz%s = %s)rK   Zvariabler   rt   )rM   ZdeclrN   rN   rO   _print_Declaration   s    z$PythonCodePrinter._print_Declarationc             C   s   |j \}d| | S )Nz	return %s)rR   rK   )rM   ZretrL   rN   rN   rO   _print_Return   s    zPythonCodePrinter._print_Returnc                s^   d t fdd|j}|jd kr8d |j|}|jd krV|d |j 7 }d| S )Nz, c                s
     | S )N)rK   )rL   )rM   rN   rO   rP      s    z0PythonCodePrinter._print_Print.<locals>.<lambda>z{0} % ({1})z	, file=%sz	print(%s))rX   rY   
print_argsformat_stringrV   rK   file)rM   Zprntr   rN   )rM   rO   _print_Print   s    

zPythonCodePrinter._print_Printc             C   s@   t |jdkr| dS t |jdkr0| dS | |jS d S )Nstdoutz
sys.stdoutstderrz
sys.stderr)strrQ   rW   rK   )rM   ZstrmrN   rN   rO   _print_Stream  s
    

zPythonCodePrinter._print_Streamc             C   s   dS )Nr'   rN   )rM   rL   rN   rN   rO   _print_NoneToken  s    z"PythonCodePrinter._print_NoneToken)N)T):rU   
__module____qualname__printmethodZlanguageZstandard_kw_py2and3union_kw_only_py3Zreserved_wordsmodulesr   rm   r   _known_functionsitems_known_functions_mathrn   _known_constants_mathrp   Z
_operatorsr	   Z_default_settingsrj   rs   ru   rW   r   r   r   r   r   r   r   r   r   r   r   r   r   r   _print_SparseMatrixZ_print_MutableSparseMatrix_print_ImmutableSparseMatrixZ_print_MatrixZ_print_DenseMatrixZ_print_MutableDenseMatrixZ_print_ImmutableMatrixZ_print_ImmutableDenseMatrixr   r   r   r   r   r   r   r   __classcell__rN   rN   )rT   rO   r_   O   s\   


$	r_   z	_print_%sc             K   s   t || S )a   Converts an expr to a string of Python code

    Parameters
    ==========

    expr : Expr
        A SymPy expression.
    fully_qualified_modules : bool
        Whether or not to write out full module names of functions
        (``math.sin`` vs. ``sin``). default: ``True``.

    Examples
    ========

    >>> from sympy import tan, Symbol
    >>> from sympy.printing.pycode import pycode
    >>> pycode(tan(Symbol('x')) + 1)
    'math.tan(x) + 1'

    )r_   Zdoprint)rZ   rq   rN   rN   rO   pycode  s    r   z
log1p log2c             C   s    g | ]\}}|t kr||fqS rN   )_not_in_mpmath)ra   rb   rc   rN   rN   rO   rd   3  s    rd   signrI   c               @   sd   e Zd ZdZdZeee dd e	 D Z
dd Zdd Zd	d
 Zdd Zdd Zdd ZdS )MpmathPrinterzH
    Lambda printer for mpmath which maintains precision for floats
    Z_mpmathcodec             C   s   g | ]\}}|d | fqS )zmpmath.rN   )ra   rb   rc   rN   rN   rO   rd   D  s    zMpmathPrinter.<listcomp>c             C   s(   t ttt|j}dj| d|dS )Nz{func}({args})z
mpmath.mpf)r   rR   )r   tuplerY   intZ_mpf_rV   rW   )rM   rH   rR   rN   rN   rO   _print_FloatG  s    zMpmathPrinter._print_Floatc             C   s   d | d|j|jS )Nz{0}({1})/{0}({2})z
mpmath.mpf)rV   rW   pq)rM   rH   rN   rN   rO   _print_RationalQ  s    zMpmathPrinter._print_Rationalc             C   s4   d | d| |jd | |jd | dS )Nz{0}({1}, {2}, {3})zmpmath.gammaincr   r   z
mpmath.inf)rV   rW   rK   rR   )rM   rH   rN   rN   rO   _print_uppergammaX  s
    zMpmathPrinter._print_uppergammac             C   s,   d | d| |jd | |jd S )Nz{0}({1}, 0, {2})zmpmath.gammaincr   r   )rV   rW   rK   rR   )rM   rH   rN   rN   rO   _print_lowergamma_  s    zMpmathPrinter._print_lowergammac             C   s   d | d| |jd S )Nz{0}({1})/{0}(2)z
mpmath.logr   )rV   rW   rK   rR   )rM   rH   rN   rN   rO   _print_log2e  s    zMpmathPrinter._print_log2c             C   s   d | d| |jd S )Nz
{0}({1}+1)z
mpmath.logr   )rV   rW   rK   rR   )rM   rH   rN   rN   rO   _print_log1pi  s    zMpmathPrinter._print_log1pN)rU   r   r   __doc__r   rm   r   r   r   _known_functions_mpmathrn   r   r   r   r   r   r   rN   rN   rN   rO   r   <  s   
r   z!erf erfc factorial gamma loggammac             C   s    g | ]\}}|t kr||fqS rN   )_not_in_numpy)ra   rb   rc   rN   rN   rO   rd   u  s    ZarccosZarccoshZarcsinZarcsinhZarctanZarctan2Zarctanhexp2)	r.   r/   r0   r1   r2   r3   r4   r   r   c                   s   e Zd ZdZdZeeej	 dd e
	 D Zdd e	 D Zdd Zd	d
 Zdd Zdd Z fddZdd Zdd Zdd Zdd Zdd Z fddZdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Z  ZS ))NumPyPrinterza
    Numpy printer which handles vectorized piecewise functions,
    logical operators, etc.
    Z
_numpycodec             C   s   g | ]\}}|d | fqS )znumpy.rN   )ra   rb   rc   rN   rN   rO   rd     s    zNumPyPrinter.<listcomp>c             C   s   i | ]\}}d | |qS )znumpy.rN   )ra   rb   rc   rN   rN   rO   re     s    zNumPyPrinter.<dictcomp>c                s*   t dd dt fdd|D S )z+General sequence printer: converts to tuple	delimiterz, z({},)c             3   s   | ]}  |V  qd S )N)rK   )ra   item)rM   rN   rO   r     s    z*NumPyPrinter._print_seq.<locals>.<genexpr>)Zdelimitero   rV   r   rX   )rM   seqrN   )rM   rO   
_print_seq  s    zNumPyPrinter._print_seqc                s    d d fdd|jD S )zMatrix multiplication printerz({0})z).dot(c             3   s   | ]}  |V  qd S )N)rK   )ra   r   )rM   rN   rO   r     s    z-NumPyPrinter._print_MatMul.<locals>.<genexpr>)rV   rX   rR   )rM   rZ   rN   )rM   rO   _print_MatMul  s    zNumPyPrinter._print_MatMulc             C   sR   |j \}}|jd dkr|j}|jd dkr2|j}d| d| || |f S )Nr   r   z
%s(%s, %s)z	numpy.dot)rR   shapeTrW   rK   )rM   rZ   Zarg1Zarg2rN   rN   rO   _print_DotProduct  s    

zNumPyPrinter._print_DotProductc                sT   d d fdd|jD }d d fdd|jD }d  d||S )zPiecewise function printerz[{0}],c             3   s   | ]}  |jV  qd S )N)rK   rZ   )ra   rL   )rM   rN   rO   r     s    z0NumPyPrinter._print_Piecewise.<locals>.<genexpr>c             3   s   | ]}  |jV  qd S )N)rK   r   )ra   rL   )rM   rN   rO   r     s    z {0}({1}, {2}, default=numpy.nan)znumpy.select)rV   rX   rR   rW   )rM   rZ   ZexprsZcondsrN   )rM   rO   r     s      zNumPyPrinter._print_Piecewisec                sd   ddddddd}|j |krT| |j}| |j}dj| d	||j   ||d
S tt| |S )z.Relational printer for Equality and Unequalityr   r   r   r   r   r   )z==z!=r   z<=r   z>=z{op}({lhs}, {rhs})znumpy.)r   r   r   )	r   rK   r   r   rV   rW   ri   r   r   )rM   rZ   r   r   r   )rT   rN   rO   r     s    

zNumPyPrinter._print_Relationalc                s(   d  dd fdd|jD S )zLogical And printerz{0}.reduce(({1}))znumpy.logical_andr   c             3   s   | ]}  |V  qd S )N)rK   )ra   r   )rM   rN   rO   r     s    z*NumPyPrinter._print_And.<locals>.<genexpr>)rV   rW   rX   rR   )rM   rZ   rN   )rM   rO   
_print_And  s    zNumPyPrinter._print_Andc                s(   d  dd fdd|jD S )zLogical Or printerz{0}.reduce(({1}))znumpy.logical_orr   c             3   s   | ]}  |V  qd S )N)rK   )ra   r   )rM   rN   rO   r     s    z)NumPyPrinter._print_Or.<locals>.<genexpr>)rV   rW   rX   rR   )rM   rZ   rN   )rM   rO   	_print_Or  s    zNumPyPrinter._print_Orc                s(   d  dd fdd|jD S )zLogical Not printerz{0}({1})znumpy.logical_notr   c             3   s   | ]}  |V  qd S )N)rK   )ra   r   )rM   rN   rO   r     s    z*NumPyPrinter._print_Not.<locals>.<genexpr>)rV   rW   rX   rR   )rM   rZ   rN   )rM   rO   
_print_Not  s    zNumPyPrinter._print_Notc                s(   d  dd fdd|jD S )Nz
{0}(({1}))z
numpy.aminr   c             3   s   | ]}  |V  qd S )N)rK   )ra   r   )rM   rN   rO   r     s    z*NumPyPrinter._print_Min.<locals>.<genexpr>)rV   rW   rX   rR   )rM   rZ   rN   )rM   rO   
_print_Min  s    zNumPyPrinter._print_Minc                s(   d  dd fdd|jD S )Nz
{0}(({1}))z
numpy.amaxr   c             3   s   | ]}  |V  qd S )N)rK   )ra   r   )rM   rN   rO   r     s    z*NumPyPrinter._print_Max.<locals>.<genexpr>)rV   rW   rX   rR   )rM   rZ   rN   )rM   rO   
_print_Max  s    zNumPyPrinter._print_Maxc                s8   |j dkr$d| d| |jS tt| |S d S )Ng      ?z{0}({1})z
numpy.sqrt)r9   rV   rW   rK   baseri   r   
_print_Pow)rM   rZ   )rT   rN   rO   r     s    
zNumPyPrinter._print_Powc             C   s   d|  d| |jd f S )Nz%s(%s)znumpy.angler   )rW   rK   rR   )rM   rZ   rN   rN   rO   
_print_arg  s    zNumPyPrinter._print_argc             C   s   d|  d| |jd  S )Nz%s(%s)z
numpy.imagr   )rW   rK   rR   )rM   rZ   rN   rN   rO   	_print_im  s    zNumPyPrinter._print_imc                s(   d  ddt fdd|jf S )Nz%s(%s)z	numpy.modz, c                s
     | S )N)rK   )rL   )rM   rN   rO   rP     s    z)NumPyPrinter._print_Mod.<locals>.<lambda>)rW   rX   rY   rR   )rM   rZ   rN   )rM   rO   r     s    zNumPyPrinter._print_Modc             C   s   d|  d| |jd f S )Nz%s(%s)z
numpy.realr   )rW   rK   rR   )rM   rZ   rN   rN   rO   	_print_re  s    zNumPyPrinter._print_rec             C   s$   d|  d| |jd tj f S )Nz%s(%s)z
numpy.sincr   )rW   rK   rR   r   rI   )rM   rZ   rN   rN   rO   _print_sinc  s    zNumPyPrinter._print_sincc             C   s:   | j |jjd }|d kr$| d}d|| | f S )Nznumpy.arrayz%s(%s))rS   ro   rT   rU   rW   rK   r   )rM   rZ   r   rN   rN   rO   r     s    
zNumPyPrinter._print_MatrixBase)rU   r   r   r   r   rm   r   r_   rn   r   _known_functions_numpyr   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rN   rN   )rT   rO   r     s.   
r   ZjnZynZivZknZgammalnZpsiZpoch)r7   r8   ZbesseljZbesselyZbesseliZbesselkr;   r=   rG   ZdigammaZRisingFactorialZgolden_ratio)ZGoldenRatiorI   rJ   c               @   sL   e Zd Zeeej dd e D Zdd e	 D Z
dd ZeZdS )SciPyPrinterc             C   s   g | ]\}}|d | fqS )zscipy.special.rN   )ra   rb   rc   rN   rN   rO   rd     s    zSciPyPrinter.<listcomp>c             C   s   i | ]\}}d | |qS )zscipy.constants.rN   )ra   rb   rc   rN   rN   rO   re     s    zSciPyPrinter.<dictcomp>c             C   sf   g g g   }}}x8|j  D ]*\\}}}|| || || qW dj| d||||jdS )Nz){name}({data}, ({i}, {j}), shape={shape})zscipy.sparse.coo_matrix)rQ   datar   jr   )Z_smatr   r   rV   rW   r   )rM   rZ   r   r   r   rr   rc   rN   rN   rO   r     s    

z SciPyPrinter._print_SparseMatrixN)rU   r   r   rm   r   r   rn   r   _known_functions_scipy_special _known_constants_scipy_constantsrp   r   r   rN   rN   rN   rO   r     s   r   c               @   s4   e Zd Zedd ee e D Zdd Z	dS )SymPyPrinterc             C   s   g | ]\}}|d | fqS )zsympy.rN   )ra   rb   rc   rN   rN   rO   rd   6  s    zSymPyPrinter.<listcomp>c                sH   |j jp
d}d ||rdnd |j j dt fdd|jf S )Nr   z%s(%s)rv   z, c                s
     | S )N)rK   )rL   )rM   rN   rO   rP   >  s    z.SymPyPrinter._print_Function.<locals>.<lambda>)r   r   rW   rU   rX   rY   rR   )rM   rZ   modrN   )rM   rO   _print_Function;  s    zSymPyPrinter._print_FunctionN)
rU   r   r   rm   r   r   r   r   rn   r  rN   rN   rN   rO   r  4  s   
r  N)+r   collectionsr   	functoolsr   	itertoolsr   Z
sympy.corer   r   r   Zcodeprinterr	   r   Z_kw_only_py2r   r   r   r   r\   r^   r_   rn   rb   setattrr   rz   r   r   Z
_in_mpmathrm   r   Z_known_constants_mpmathr   r   Z	_in_numpyr   r   rp   r   r   r   r  rN   rN   rN   rO   <module>   s   

 E

1

y