a
    <b*                    @   s\  d dl Z d dlmZ d dl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	lmZ d d
lmZ d dlmZ d dlmZ d dlmZmZmZ d dl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)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 e/Z4e2Z5G dd deZ6ee6dd Z7dd Z8e8Z9dd Z:dS )    N)S)Add)Tuple)FunctionMul)NumberRational)Pow)default_sort_keySymbol)SympifyError)requires_partial)
PRECEDENCE
precedenceprecedence_traditional)Printerprint_function)sstr)has_variety)sympy_deprecation_warning)
prettyForm
stringPict)hobjvobjxobjxsympretty_symbolpretty_atompretty_use_unicodegreek_unicodeUpretty_try_use_unicode	annotatedc                   @   sz	  e Zd ZdZdZddddddddddd
Zdd	d
Zdd Zedd Z	dd Z
dd Zdd Zdd ZdddZe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eZeZeZeZeZeZeZeZ eZ!d,d- Z"d.d/ Z#d0d1 Z$d2d3 Z%d4d5 Z&d6d7 Z'd8d9 Z(dd:d;Z)d<d= Z*d>d? Z+d@dA Z,dBdC Z-dDdE Z.ddFdGZ/ddHdIZ0dJdK Z1dLdM Z2e2Z3dNdO Z4dPdQ Z5dRdS Z6dTdU Z7dVdW Z8dXdY Z9dZd[ Z:d\d] Z;d^d_ Z<d`da Z=dbdc Z>ddde Z?dfdg Z@dhdi ZAdjdk ZBdldm ZCdndo ZDdpdq ZEdrds ZFdtdu ZGdvdw ZHdxdy ZIdzd{ ZJd|d} ZKd~d ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\i fddZ]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd ZfdddZgdd Zhdd Zidd Zjdd ZkdddZlddĄ ZmddƄ ZnddȄ Zoddʄ Zpddd̈́Zqddτ Zreddф Zsddӄ ZtddՄ Zuddׄ Zvddل Zwddۄ Zxdd݄ Zydd߄ Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd 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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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZdFdG ZdHdI ZdJdK ZeZeZeZdddːdLdM dfdNdOZdPdQ ZdRdS ZdTdU ZdVdW ZdXdY ZdZd[ Zd\d] Zd^d_ Zd`da Zdbdc Zddde Zdfdg Zdhdi Zdjdk Zdldm ZÐdndo ZĐdpdq ZŐdrds ZƐdtdu Zǐdvdw ZȐdxdy Zɐdz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 ZeZԐ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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Ґdӄ ZdԐdՄ Zd֐dׄ ZdS (  PrettyPrinterz?Printer, which converts an expression into 2D ASCII-art figure.Z_prettyNautoTplaini)
order	full_precuse_unicodeZ	wrap_linenum_columnsuse_unicode_sqrt_charroot_notationmat_symbol_styleimaginary_unitperm_cyclicc                 C   sX   t | | t| jd ts2td| jd n"| jd dvrTtd| jd d S )Nr0   z&'imaginary_unit' must a string, not {})r(   jz4'imaginary_unit' must be either 'i' or 'j', not '{}')r   __init__
isinstance	_settingsstr	TypeErrorformat
ValueError)selfsettings r<   l/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/sympy/printing/pretty/pretty.pyr3   /   s
    zPrettyPrinter.__init__c                 C   s   t t|S Nr   r6   r:   exprr<   r<   r=   emptyPrinter7   s    zPrettyPrinter.emptyPrinterc                 C   s   | j d rdS t S d S )Nr+   T)r5   r    r:   r<   r<   r=   _use_unicode:   s    
zPrettyPrinter._use_unicodec                 C   s   |  |jf i | jS r>   )_printrenderr5   r@   r<   r<   r=   doprintA   s    zPrettyPrinter.doprintc                 C   s   |S r>   r<   r:   er<   r<   r=   _print_stringPictE   s    zPrettyPrinter._print_stringPictc                 C   s   t |S r>   )r   rH   r<   r<   r=   _print_basestringH   s    zPrettyPrinter._print_basestringc                 C   s&   t | |j  }t |d }|S )Natan2)r   
_print_seqargsparensleftr:   rI   pformr<   r<   r=   _print_atan2K   s    zPrettyPrinter._print_atan2Fc                 C   s   t |j|}t|S r>   )r   namer   )r:   rI   Z	bold_nameZsymbr<   r<   r=   _print_SymbolP   s    zPrettyPrinter._print_Symbolc                 C   s   |  || jd dkS )Nr/   bold)rU   r5   rH   r<   r<   r=   _print_MatrixSymbolT   s    z!PrettyPrinter._print_MatrixSymbolc                 C   s,   | j d }|dkr| jdk}tt||dS )Nr*   r&      )r*   )r5   Z_print_levelr   r   )r:   rI   r*   r<   r<   r=   _print_FloatW   s    

zPrettyPrinter._print_Floatc                 C   s~   |j }|j}| |}t|d }t|d }t|| td }t|d }t|| | }t|d }|S )N()MULTIPLICATION SIGNZ_expr1Z_expr2rE   r   rP   rightr"   r:   rI   Zvec1Zvec2rR   r<   r<   r=   _print_Cross_   s    
zPrettyPrinter._print_Crossc                 C   s`   |j }| |}t|d }t|d }t|| td }t|| td }|S )NrZ   r[   r\   NABLAZ_exprrE   r   rP   r^   r"   r:   rI   ZvecrR   r<   r<   r=   _print_Curlk   s    
zPrettyPrinter._print_Curlc                 C   s`   |j }| |}t|d }t|d }t|| td }t|| td }|S )NrZ   r[   DOT OPERATORra   rb   rc   r<   r<   r=   _print_Divergencet   s    
zPrettyPrinter._print_Divergencec                 C   s~   |j }|j}| |}t|d }t|d }t|| td }t|d }t|| | }t|d }|S )NrZ   r[   re   r]   r_   r<   r<   r=   
_print_Dot}   s    
zPrettyPrinter._print_Dotc                 C   sH   |j }| |}t|d }t|d }t|| td }|S )NrZ   r[   ra   rb   r:   rI   funcrR   r<   r<   r=   _print_Gradient   s    
zPrettyPrinter._print_Gradientc                 C   sH   |j }| |}t|d }t|d }t|| td }|S )NrZ   r[   Z	INCREMENTrb   rh   r<   r<   r=   _print_Laplacian   s    
zPrettyPrinter._print_Laplacianc                 C   s8   zt t|jj| dW S  ty2   | | Y S 0 d S )N)printer)r   r   	__class____name__KeyErrorrB   rH   r<   r<   r=   _print_Atom   s    zPrettyPrinter._print_Atomc                 C   s*   | j r| |S ddg}| |ddS d S )Nz-ooZoorZ   r[   )rD   rp   rM   )r:   rI   Zinf_listr<   r<   r=   _print_Reals   s    
zPrettyPrinter._print_Realsc                 C   sD   |j d }| |}|jr |js2|js2t|  }t|d }|S Nr   !)rN   rE   
is_Integeris_nonnegative	is_Symbolr   rO   rP   r:   rI   xrR   r<   r<   r=   _print_subfactorial   s    

z!PrettyPrinter._print_subfactorialc                 C   sD   |j d }| |}|jr |js2|js2t|  }t|d }|S rr   rN   rE   rt   ru   rv   r   rO   r^   rw   r<   r<   r=   _print_factorial   s    

zPrettyPrinter._print_factorialc                 C   sD   |j d }| |}|jr |js2|js2t|  }t|d }|S )Nr   z!!rz   rw   r<   r<   r=   _print_factorial2   s    

zPrettyPrinter._print_factorial2c                 C   st   |j \}}| |}| |}dt| |  }t|| }t|| }t|dd }|jd d |_|S )N rZ   r[   rX      )rN   rE   maxwidthr   aboverO   baseline)r:   rI   nkZn_pformZk_pformbarrR   r<   r<   r=   _print_binomial   s    


zPrettyPrinter._print_binomialc                 C   sL   t dt|j d }| |j}| |j}t t|||dt ji}|S )Nr}   binding)	r   r   Zrel_oprE   lhsrhsr   nextOPENr:   rI   oplrrR   r<   r<   r=   _print_Relational   s
    zPrettyPrinter._print_Relationalc                 C   s   ddl m}m} | jr|jd }| |}t||rB| j|ddS t||rZ| j|ddS |j	rr|j
srt|  }t|d S | |S d S )Nr   )
EquivalentImpliesu   ⇎)altcharu   ↛   ¬)Zsympy.logic.boolalgr   r   rD   rN   rE   r4   _print_Equivalent_print_Implies
is_Booleanis_Notr   rO   rP   _print_Function)r:   rI   r   r   argrR   r<   r<   r=   
_print_Not   s    



zPrettyPrinter._print_Notc                 C   s   |j }|rt|j td}|d }| |}|jrB|jsBt|  }|dd  D ]F}| |}|jrt|jstt|  }t|d|  }t|| }qN|S )Nkeyr   rX    %s )	rN   sortedr   rE   r   r   r   rO   r^   )r:   rI   charsortrN   r   rR   	pform_argr<   r<   r=   Z__print_Boolean   s    

zPrettyPrinter.__print_Booleanc                 C   s$   | j r| |dS | j|ddS d S )N   ∧Tr   rD   _PrettyPrinter__print_Booleanr   rH   r<   r<   r=   
_print_And  s    zPrettyPrinter._print_Andc                 C   s$   | j r| |dS | j|ddS d S )Nu   ∨Tr   r   rH   r<   r<   r=   	_print_Or  s    zPrettyPrinter._print_Orc                 C   s$   | j r| |dS | j|ddS d S )Nu   ⊻Tr   r   rH   r<   r<   r=   
_print_Xor  s    zPrettyPrinter._print_Xorc                 C   s$   | j r| |dS | j|ddS d S )Nu   ⊼Tr   r   rH   r<   r<   r=   _print_Nand  s    zPrettyPrinter._print_Nandc                 C   s$   | j r| |dS | j|ddS d S )Nu   ⊽Tr   r   rH   r<   r<   r=   
_print_Nor$  s    zPrettyPrinter._print_Norc                 C   s(   | j r| j||pdddS | |S d S )Nu   →Fr   r   r:   rI   r   r<   r<   r=   r   *  s    zPrettyPrinter._print_Impliesc                 C   s(   | j r| ||pdS | j|ddS d S )Nu   ⇔Tr   r   r   r<   r<   r=   r   0  s    zPrettyPrinter._print_Equivalentc                 C   s(   |  |jd }t|td|  S )Nr   _)rE   rN   r   r   r   r   rQ   r<   r<   r=   _print_conjugate6  s    zPrettyPrinter._print_conjugatec                 C   s$   |  |jd }t|dd }|S )Nr   |)rE   rN   r   rO   rQ   r<   r<   r=   
_print_Abs:  s    zPrettyPrinter._print_Absc                 C   s8   | j r*| |jd }t|dd }|S | |S d S )Nr   lfloorrfloorrD   rE   rN   r   rO   r   rQ   r<   r<   r=   _print_floor@  s
    zPrettyPrinter._print_floorc                 C   s8   | j r*| |jd }t|dd }|S | |S d S )Nr   lceilrceilr   rQ   r<   r<   r=   _print_ceilingH  s
    zPrettyPrinter._print_ceilingc                 C   s  t |jr| jrtd}nd}d }d}t|jD ]p\}}| |}t|| }||7 }|j	rf|dkrv|tt
| }|d u r|}q0t|d }t|| }q0t| |j dtji}	t|}
|dkdkr|
tt
| }
t|
tj| }
|
jd |
_tt|
|	 }
tj|
_|
S )NPARTIAL DIFFERENTIALdr   rX   r}   r   F)r   rA   rD   r"   reversedZvariable_countrE   r   rP   rt   r6   r^   rO   FUNCbelowr   LINEr   r   MULr   )r:   derivderiv_symbolrx   Zcount_total_derivsymnumsdsfrR   r<   r<   r=   _print_DerivativeP  s8    

zPrettyPrinter._print_Derivativec                 C   s   ddl m}m} || kr.td}t|  S || j}|g kr`| |j	d }t|  S td}|D ],}| t
t|dd}t|| }ql|S )Nr   PermutationCycle rX   ,) sympy.combinatorics.permutationsr   r   r   r   rO   listZcyclic_formrE   sizer6   tuplereplacer^   )r:   dcr   r   ZcycZdc_listr(   r   r<   r<   r=   _print_Cycleu  s    
zPrettyPrinter._print_Cyclec                 C   s   ddl m}m} |j}|d ur8td| ddddd n| jd	d
}|rX| ||S |j}t	t
t|}td}d
}t||D ]P\}	}
| |	}| |
}t|| }|rd}nt|d }t|| }qt|  S )Nr   r   zw
                Setting Permutation.print_cyclic is deprecated. Instead use
                init_printing(perm_cyclic=z).
                z1.6z#deprecated-permutation-print_cyclic   )Zdeprecated_since_versionZactive_deprecations_target
stacklevelr1   Tr   Fr}   )r   r   r   Zprint_cyclicr   r5   getr   Z
array_formr   rangelenr   ziprE   r   r   rP   r^   rO   )r:   rA   r   r   r1   lowerupperresultfirstur   s1s2colr<   r<   r=   _print_Permutation  s6    


z PrettyPrinter._print_Permutationc                 C   s  |j }| |}|jr"t|  }|}|jD ]:}| |d }| dkrVt|  }t|d| }q,d}d }|jD ]D}	| }
|
d }| j	 }|r|d7 }t
d|}t|}|j||
 d  |_t|	dkrt|	dkrtd}| |	d }t|	dkr | |	d }| |	d }|rntdd|  }t|d	|  }tdd
|  }t|d	|  }t|| }t|| }|st|d	 }|r|}d}qvt|| }qvt|| }tj|_|S )Nr   rX   z dTr~   intr      r}      F)functionrE   is_Addr   rO   limitsr   r^   heightrD   r   r   r   r   rP   r   r   r   r   )r:   Zintegralr   prettyFr   rx   Z	prettyArgZ	firsttermr   limhH
ascii_modeZvintrR   ZprettyAZprettyBZspcr<   r<   r=   _print_Integral  s\    


zPrettyPrinter._print_Integralc                 C   s  |j }| |}tdd}tdd}tdd}| jrBtdd}d}| }d}d}	d}
|jD ]}| |\}}|d d	 d
 d }|| ||d   | | g}t|d D ]&}|d| d|d   | d  qt	d}t
|j|  }t|	| }	|r| }
t
|| }t
|| }|r4d|_d}| }t	d}t
|jdg|d    }t
|| }t
|| }q\|	|
d  |_t
j|_|S )Nr   rX   r   -u   ┬Tr   r~      r   r}   r   F)termrE   r   rD   r   r   '_PrettyPrinter__print_SumProduct_Limitsr   appendr   r   stackr   r   r   r   r^   r   r   )r:   rA   ri   Zpretty_funcZhorizontal_chrZ
corner_chrZvertical_chrZfunc_heightr   	max_uppersign_heightr   Zpretty_lowerZpretty_upperr   Z
sign_linesr   Zpretty_signr   paddingr<   r<   r=   _print_Product  sH    




$zPrettyPrinter._print_Productc                    s4    fdd}  |d }||d |d }||fS )Nc                    s>   t dtd d } | } |}t t||| }|S )Nr}   ==)r   r   rE   r   r   )r   r   r   r   r   rR   rC   r<   r=   print_start/  s
    

z<PrettyPrinter.__print_SumProduct_Limits.<locals>.print_startr~   r   rX   rE   )r:   r   r   prettyUpperprettyLowerr<   rC   r=   Z__print_SumProduct_Limits.  s    z'PrettyPrinter.__print_SumProduct_Limitsc                 C   sZ  | j  }dd }|j}| |}|jr2t|  }| d }d}d}d}	|jD ]}
| |
\}}t	|| }|||
 |
 |\}}}}td}t|j|  }|r| }	t|| }t|| }|r| j|| d |j  8  _d}td}t|jdg|   }t|| }t|| }qP|s8|nd}||	d  | |_tj|_|S )	Nc              	   S   s  ddd}t | d}|d }|d }| d }g }	|r
|	d| d  |	dd|d    td|D ]"}
|	d	d|
 d||
  f  qh|r|	d
d| d||  f  ttd|D ]"}
|	dd|
 d||
  f  q|	dd|d   d  ||| |	|fS || }|| }tdd}|	d|  td|D ].}
|	dd|
 |d d||
 d  f  q<ttd|D ].}
|	dd|
 |d d||
 d  f  qz|	|d |  ||d|  |	|fS d S )N<^>c                 S   s|   |rt | |kr| S |t |  }|dv s4|tdvr@| d|  S |d }d| }|dkrdd| |  S ||  d|t |   S )N)r   <r   r}   r~   >)r   r   )r   ZwidhowZneedZhalfZleadr<   r<   r=   adjust>  s    z6PrettyPrinter._print_Sum.<locals>.asum.<locals>.adjustr~   rX   r   r}   z\%s`z%s\%sz%s)%sz%s/%s/r   sumr   r   z%s%s%s   )Nr   )r   r   r   r   r   )Z	hrequiredr   r   Z	use_asciir  r   r   wmorelinesr(   Zvsumr<   r<   r=   asum=  s6    

  
,,z&PrettyPrinter._print_Sum.<locals>.asumr~   Tr   r   Fr}   )rD   r   rE   r   r   rO   r   r   r   r   r   r   r   r   r   r   r^   r   r   )r:   rA   r   r	  r   r   r   r   r   r   r   r   r   r   r   ZslinesZ
adjustmentZ
prettySignpadZascii_adjustmentr<   r<   r=   
_print_Sum:  sF    *


zPrettyPrinter._print_Sumc           	      C   s   |j \}}}}| |}t|td kr8t|dd }td}| |}| jr`t|d }nt|d }t|| | }t|dks|t	j
t	jfv rd}n| jrt|d	krd
nd}t|| | }t|| }t||dtji}|S )Nr   rZ   r[   r   u   ─→z->z+-r   +u   ⁺u   ⁻r   )rN   rE   r   r   r   rO   rD   r^   r6   r   InfinityNegativeInfinityr   r   )	r:   r   rI   zZz0dirEZLimZLimArgr<   r<   r=   _print_Limit  s$    

zPrettyPrinter._print_Limitc                    s  |}i  t |jD ].}t |jD ]| ||f  |f< q qd}d}dg|j }t |jD ],t fddt |jD pdg|< q`d}t |jD ]}d}t |jD ] |f }	|	 | ksJ | |	  }
|
d }|
| }t|	d|  }	t|	d|  }	|du r&|	}qt|d|  }t||	 }q|du rX|}qt |D ]}t|	d }q`t|	| }q|du rtd	}|S )
zL
        This method factors out what is essentially grid printing.
        r~   rX   c                    s   g | ]} |f   qS r<   r   .0r(   ZMsr2   r<   r=   
<listcomp>      z8PrettyPrinter._print_matrix_contents.<locals>.<listcomp>r   Nr}   r   )
r   rowscolsrE   r   r   r   r^   rP   r   )r:   rI   Mr(   hsepvsepmaxwDD_rowr   wdeltawleftwrightr   r<   r  r=   _print_matrix_contents  sF    *


z$PrettyPrinter._print_matrix_contentsc                 C   s,   |  |}| d |_t|dd }|S )Nr~   [])r%  r   r   r   rO   r:   rI   r   r<   r<   r=   _print_MatrixBase  s    
zPrettyPrinter._print_MatrixBasec                 C   s*   | j rd}nd}| j|jd d |dd dS )Nu   ⊗.*c                 S   s   t | td kS Nr   r   r   rx   r<   r<   r=   <lambda>	  r  z4PrettyPrinter._print_TensorProduct.<locals>.<lambda>parenthesizerD   rM   rN   )r:   rA   Zcircled_timesr<   r<   r=   _print_TensorProduct  s    z"PrettyPrinter._print_TensorProductc                 C   s*   | j rd}nd}| j|jd d |dd dS )Nr   z/\c                 S   s   t | td kS r+  r,  r-  r<   r<   r=   r.    r  z3PrettyPrinter._print_WedgeProduct.<locals>.<lambda>r/  r1  )r:   rA   Zwedge_symbolr<   r<   r=   _print_WedgeProduct  s    z!PrettyPrinter._print_WedgeProductc                 C   s<   |  |j}t|dd }| d |_t|d }|S )NrZ   r[   r~   tr)rE   r   r   rO   r   r   rP   r(  r<   r<   r=   _print_Trace  s
    zPrettyPrinter._print_Tracec                 C   s   ddl m} t|j|rJ|jjrJ|jjrJ| t|jj	d|j|jf  S | |j}t
|  }| j|j|jfddjdddd }t
t||d	t
ji}||_||_|S d S )
Nr   MatrixSymbolz_%d%d, 	delimiterr&  r'  rP   r^   r   )sympy.matricesr7  r4   parentr(   Z	is_numberr2   rE   r   rT   r   rO   rM   r   r   r   
prettyFunc
prettyArgs)r:   rA   r7  r>  ZprettyIndicesrR   r<   r<   r=   _print_MatrixElement  s,    
z"PrettyPrinter._print_MatrixElementc                    s   ddl m}  |j}t|j|s0t|  } fdd} j||j|jj	||j
|jjfddjddd	d }tt||d
tji}||_||_|S )Nr   r6  c                    sT   t | } | d dkr| d= | d dkr.d| d< | d |krBd| d< t j| dd S )Nr~   rX   r   r   :r9  )r   r   rM   )rx   ZdimrC   r<   r=   ppslice7  s    z1PrettyPrinter._print_MatrixSlice.<locals>.ppslicer8  r9  r&  r'  r;  r   )r<  r7  rE   r=  r4   r   rO   rM   Zrowslicer  Zcolslicer  r   r   r   r>  r?  )r:   mr7  r>  rB  r?  rR   r<   rC   r=   _print_MatrixSlice1  s,    	
z PrettyPrinter._print_MatrixSlicec                 C   sH   |  |j}ddlm} t|j|s8|jjr8t|  }|td }|S )Nr   r6  T)rE   r   r<  r7  r4   is_MatrixExprr   rO   r:   rA   rR   r7  r<   r<   r=   _print_TransposeL  s    zPrettyPrinter._print_Transposec                 C   s\   |  |j}| jrtd}ntd}ddlm} t|j|sP|jjrPt|  }|| }|S )Nu   †r  r   r6  )	rE   r   rD   r   r<  r7  r4   rF  rO   )r:   rA   rR   Zdagr7  r<   r<   r=   _print_AdjointT  s    
zPrettyPrinter._print_Adjointc                 C   s(   |j jdkr| |j d S | |j S )NrX   rX   r   r   )blocksshaperE   )r:   Br<   r<   r=   _print_BlockMatrix`  s    z PrettyPrinter._print_BlockMatrixc                 C   s   d }|j D ]p}| |}|d u r&|}q
| d }t| rZtt|d }| |}ntt|d }tt|| }q
|S )Nr   r}    + )rN   rE   Zas_coeff_mmulr   could_extract_minus_signr   r   r   )r:   rA   r   itemrR   coeffr<   r<   r=   _print_MatAdde  s    

zPrettyPrinter._print_MatAddc                 C   s   t |j}ddlm} ddlm} ddlm} t|D ]N\}}t	|t
|||frvt|jdkrvt| |  ||< q6| |||< q6tj| S )Nr   HadamardProduct)KroneckerProductMatAddrX   )r   rN   #sympy.matrices.expressions.hadamardrV  Z$sympy.matrices.expressions.kroneckerrW  !sympy.matrices.expressions.mataddrY  	enumerater4   r   r   r   rE   rO   __mul__)r:   rA   rN   rV  rW  rY  r(   ar<   r<   r=   _print_MatMulv  s    
zPrettyPrinter._print_MatMulc                 C   s   | j rtdS tdS d S )Nu   𝕀IrD   r   r@   r<   r<   r=   _print_Identity  s    zPrettyPrinter._print_Identityc                 C   s   | j rtdS tdS d S )Nu   𝟘0ra  r@   r<   r<   r=   _print_ZeroMatrix  s    zPrettyPrinter._print_ZeroMatrixc                 C   s   | j rtdS tdS d S )Nu   𝟙1ra  r@   r<   r<   r=   _print_OneMatrix  s    zPrettyPrinter._print_OneMatrixc                 C   s4   t |j}t|D ]\}}| |||< qtj| S r>   )r   rN   r\  rE   r   r]  r:   rA   rN   r(   r^  r<   r<   r=   _print_DotProduct  s    
zPrettyPrinter._print_DotProductc                 C   sD   |  |j}ddlm} t|j|s0t|  }||  |j }|S )Nr   r6  )rE   baser<  r7  r4   r   rO   exprG  r<   r<   r=   _print_MatPow  s    zPrettyPrinter._print_MatPowc                    sZ   ddl m  ddlm ddlm | jr4td}nd}| j|j	d d | fddd	S )
Nr   rU  rX  MatMulRingr*  c                    s   t |  fS r>   r4   r-  rV  rY  rm  r<   r=   r.    r  z6PrettyPrinter._print_HadamardProduct.<locals>.<lambda>r/  )
rZ  rV  r[  rY  !sympy.matrices.expressions.matmulrm  rD   r   rM   rN   r:   rA   delimr<   rp  r=   _print_HadamardProduct  s    
z$PrettyPrinter._print_HadamardProductc                 C   sp   | j rtd}n
| d}| |j}| |j}t|jtd k rPt|  }tt	
||dtji}|| S )Nrn  .r   r   )rD   r   rE   ri  rj  r   r   r   rO   r   r   r   )r:   rA   circZpretty_baseZ
pretty_expZpretty_circ_expr<   r<   r=   _print_HadamardPower  s    


z"PrettyPrinter._print_HadamardPowerc                    sH   ddl m  ddlm | jr$d}nd}| j|jd d | fdddS )	Nr   rX  rl  u    ⨂ z x c                    s   t |  fS r>   ro  r-  rY  rm  r<   r=   r.    r  z7PrettyPrinter._print_KroneckerProduct.<locals>.<lambda>r/  )r[  rY  rq  rm  rD   rM   rN   rr  r<   rx  r=   _print_KroneckerProduct  s    z%PrettyPrinter._print_KroneckerProductc                 C   s"   |  |jj}t|dd }|S Nr&  r'  )rE   lamdarA   r   rO   )r:   Xr   r<   r<   r=   _print_FunctionMatrix  s    z#PrettyPrinter._print_FunctionMatrixc                 C   sT   |j dks:|j |j }}t|t|ddddd}| |S | d| |j S d S )NrX   r  Fevaluate)r   denr   r
   
_print_MulrE   )r:   rA   r   r  resr<   r<   r=   _print_TransferFunction  s
    

z%PrettyPrinter._print_TransferFunctionc                 C   s>   t |j}t|jD ]\}}t| |  ||< qtj| S r>   )r   rN   r\  r   rE   rO   r]  rg  r<   r<   r=   _print_Series  s    
zPrettyPrinter._print_Seriesc                 C   s   ddl m} t|j}g }tt|D ]n\}}t||rrt|jdkrr| |}|	 d |_
|t|   q&| |}|	 d |_
|| q&tj| S )Nr   )MIMOParallelrX   r~   )sympy.physics.control.ltir  r   rN   r\  r   r4   r   rE   r   r   r   r   rO   r]  )r:   rA   r  rN   Zpretty_argsr(   r^  Z
expressionr<   r<   r=   _print_MIMOSeries  s    


zPrettyPrinter._print_MIMOSeriesc                 C   sh   d }|j D ]X}| |}|d u r&|}q
tt| }| d |_tt|d }tt|| }q
|S )Nr~   rP  )rN   rE   r   r   r   r   r   )r:   rA   r   rR  rR   r<   r<   r=   _print_Parallel  s    

zPrettyPrinter._print_Parallelc                 C   s   ddl m} d }|jD ]p}| |}|d u r2|}qtt| }| d |_tt|d }t	||rv| d |_tt|| }q|S )Nr   )TransferFunctionMatrixr~   rP  rX   )
r  r  rN   rE   r   r   r   r   r   r4   )r:   rA   r  r   rR  rR   r<   r<   r=   _print_MIMOParallel  s    


z!PrettyPrinter._print_MIMOParallelc           
      C   s  ddl m}m} |j|dd|j }}t||r:t|jn|g}t|j|rXt|jjn|jg}t||rt|j|r|g ||R  }nt||rt|j|r|j|kr|| }n|g ||jR  }nzt||rt|j|r||kr|| }n||g|R  }n<||kr|| }n(|j|kr2|| }n|g ||R  }t	t
| | }	|	 d |	_|jdkrt	t
|	d nt	t
|	d }	t	t
|	| | }	| ||	 S )Nr   )TransferFunctionSeriesrX   r~   r  rP   - )sympy.physics.controlr  r  sys1varr4   r   rN   sys2r   r   r   rE   r   r   sign)
r:   rA   r  r  r   tfZnum_arg_listZden_arg_listr  Zdenomr<   r<   r=   _print_Feedback
  s:    






zPrettyPrinter._print_Feedbackc                 C   s   ddl m}m} | ||j|j}| |j}tt| }|j	dkrXtt
d| ntt
d| }tt| }d|_tt
|d }| d |_t|td}t|j|r| d	 |_tt|| }|S )
Nr   )
MIMOSeriesr  r  zI + zI - z-1 r~   r}   rX   )r  r  r  rE   r  r  r   r   r   r  r^   rO   r   r   r]  r4   )r:   rA   r  r  Zinv_matZplantZ	_feedbackr<   r<   r=   _print_MIMOFeedback.  s     z!PrettyPrinter._print_MIMOFeedbackc                 C   s>   |  |j}| d |_| jr(td nd}t|| }|S )NrX   tauz{t})rE   Z	_expr_matr   r   rD   r!   r   r^   )r:   rA   matZ	subscriptr<   r<   r=   _print_TransferFunctionMatrix@  s
    z+PrettyPrinter._print_TransferFunctionMatrixc                 C   s  ddl m} | jstd||jkr0t|jjS g }g }t||rP| 	 }n
d|fg}|D ]\}}t
|j	 }|jdd d |D ]n\}	}
|
dkr|d|	j  n@|
d	kr|d
|	j  n&| |
 d }||d |	j  ||	j qq^|d dr |d dd  |d< n$|d drD|d dd  |d< g }dg}g }t|D ]\}}|d d|v rZ|}||| d}d|v rtt|D ]N}d||< || dkr|d | d d ||  ||d d   } q.qn<d|v rd||< |dd||  }n|dd||  }|||< qZdd |D }tdd |D }d|v rt|D ]8\}}t|dkrl|ddt|d   d||< qlt|D ]2\}}|t|||   t|D ]}|d t|kr|t|kr&|dt|d d	 dt|d     ||| krV|||   |||  d 7  < n0||  || d|d	 t||  d   7  < nT|t|kr|dt|d d	 dt|d     ||  d|d	 d  7  < q֐qtddd |D S )Nr   )Vectorz:ASCII pretty printing of BasisDependent is not implementedc                 S   s   | d   S Nr   )__str__r-  r<   r<   r=   r.  W  r  z5PrettyPrinter._print_BasisDependent.<locals>.<lambda>r   rX   r   r  z(-1) r}   rP  r   
u   ⎟u   ⎠u   ⎠ u   ⎞u   ⎞ c                 S   s   g | ]}| d qS )r  )splitr  rx   r<   r<   r=   r    r  z7PrettyPrinter._print_BasisDependent.<locals>.<listcomp>c                 S   s   g | ]}t |qS r<   )r   r  r<   r<   r=   r    r  c                 S   s   g | ]}|d d qS )Nr<   )r  r   r<   r<   r=   r    r  )Zsympy.vectorr  rD   NotImplementedErrorZzeror   Z_pretty_formr4   Zseparateitemsr   
componentsr   r   rE   rO   
startswithr\  r   r   r   r   insertr  join)r:   rA   r  Zo1Zvectstrsr  systemZvectZ
inneritemsr   vZarg_strlengthsstrsflagr(   ZpartstrZtempstrZparenZ
n_newlinespartsr2   r<   r<   r=   _print_BasisDependentG  s    







"
$z#PrettyPrinter._print_BasisDependentc           	         sh  ddl m  | dkr&| |d S g gdd t| D  }dd |jD } fdd}tj| D ]}|d	 ||  d
}t| d d	d	D ]}t	||d  |j| k r qh|r|| ||d   nL|| |||d   t	||d  dkr ||| d	 gg|| d	< | }g ||d < qqh|d d }| d dkr^||g}| |S )Nr   ImmutableMatrixr<   c                 S   s   g | ]}g qS r<   r<   r  r<   r<   r=   r    r  z2PrettyPrinter._print_NDimArray.<locals>.<listcomp>c                 S   s   g | ]}t t|qS r<   )r   r   r  r<   r<   r=   r    r  c                    s    | ddS )NFr~  r<   r-  r  r<   r=   r.    r  z0PrettyPrinter._print_NDimArray.<locals>.<lambda>r  TrX   r~   )
Zsympy.matrices.immutabler  rankrE   r   rM  	itertoolsproductr   r   )	r:   rA   Z	level_strZshape_rangesr  Zouter_iZevenZback_outer_iZout_exprr<   r  r=   _print_NDimArray  s6    


zPrettyPrinter._print_NDimArrayc              	   C   sr  t |}t d|  }t d|  }d }d }t|D ]\}	}
| |
jd }|
|v s^|r||
jkr|
jrtt |d }ntt |d }|
|v rtt |d }tt || ||
  }d}nd}|
jrt || }t |d|   }t |d|   }n:t || }t |d|   }t |d|   }|
j}q8t|	| }t|
| }|S )Nr}   r   r   =TF)r   r   r\  rE   rN   is_upr   r   r^   r   r   )r:   rT   indices	index_mapcentertopbotZlast_valenceZprev_mapr(   indexZindpicZpictr<   r<   r=   _printer_tensor_indices  s6    z%PrettyPrinter._printer_tensor_indicesc                 C   s    |j d j}| }| ||S r  )rN   rT   get_indicesr  )r:   rA   rT   r  r<   r<   r=   _print_Tensor  s    zPrettyPrinter._print_Tensorc                 C   s,   |j jd j}|j  }|j}| |||S r  )rA   rN   rT   r  r  r  )r:   rA   rT   r  r  r<   r<   r=   _print_TensorElement  s    
z"PrettyPrinter._print_TensorElementc                    sB   |  \}} fdd|D }tj| }|r:t|| S |S d S )Nc                    s8   g | ]0}t |td  k r*t |  n |qS r   r   r   r   rE   rO   r  rC   r<   r=   r    s   z0PrettyPrinter._print_TensMul.<locals>.<listcomp>)Z!_get_args_for_traditional_printerr   r]  rP   )r:   rA   r  rN   rR   r<   rC   r=   _print_TensMul  s    

zPrettyPrinter._print_TensMulc                    s    fdd|j D }tj| S )Nc                    s8   g | ]0}t |td  k r*t |  n |qS r   r  r  rC   r<   r=   r    s   z0PrettyPrinter._print_TensAdd.<locals>.<listcomp>)rN   r   __add__)r:   rA   rN   r<   rC   r=   _print_TensAdd  s    
zPrettyPrinter._print_TensAddc                 C   s    |j d }|js| }| |S r  )rN   r  rE   )r:   rA   r   r<   r<   r=   _print_TensorIndex  s    
z PrettyPrinter._print_TensorIndexc           	      C   s   | j rtd}nd}d }t|jD ]F}| |}t|| }|d u rL|}q"t|d }t|| }q"t| |j	 dtj
i}t|}t|jdkr|| t|j }t|tj| }|jd |_tt|| }tj|_|S )Nr   r   r}   r   rX   )rD   r"   r   	variablesrE   r   rP   r^   rA   rO   r   r   r   r   r   r   r   r   r   )	r:   r   r   rx   variabler   r   r   rR   r<   r<   r=   _print_PartialDerivative  s0    

z&PrettyPrinter._print_PartialDerivativec                    s  i  t |jD ]Z\}}| |j |df< |jdkrFtd |df< qttd| |j  |df< qd}d}t|j fddtdD }d }tD ]}d }	tdD ]}
 ||
f }|	 ||
 ksJ ||
 |	  }|d }|| }t|d	|  }t|
d	|  }|	d u r(|}	qt|	d	|  }	t|	| }	q|d u rZ|	}qt|D ]}t|d	 }qbt||	 }qt|d
d }| d |_tj|_|S )Nr   TZ	otherwiserX   zfor r~   c                    s(   g | ]  t  fd dtD qS )c                    s   g | ]} |f   qS r<   r  r  )Pr2   r<   r=   r  D  r  z=PrettyPrinter._print_Piecewise.<locals>.<listcomp>.<listcomp>)r   r   r  r  Zlen_args)r2   r=   r  D  s   z2PrettyPrinter._print_Piecewise.<locals>.<listcomp>r}   {r   )r\  rN   rE   rA   condr   r^   r   r   r   rP   r   rO   r   r   r   r   )r:   Zpexprr   Zecr  r  r  r   r(   r!  r2   pr"  r#  r$  r   r<   r  r=   _print_Piecewise5  sP    



zPrettyPrinter._print_Piecewisec                 C   s   ddl m} | ||S )Nr   )	Piecewise)Z$sympy.functions.elementary.piecewiser  rE   Zrewrite)r:   Ziter  r<   r<   r=   
_print_ITEm  s    zPrettyPrinter._print_ITEc                 C   sP   d }|D ]2}|}|d u r|}qt |d }t || }q|d u rLtd}|S )Nr8  r}   )r   r^   r   )r:   r  r   r^  r  r<   r<   r=   _hprint_vecq  s    zPrettyPrinter._hprint_vecr   c           	      C   sj   |r$| j s$| j|d|f|||ddS | j||f|||d}ttd| |jd}| j|||f|||dS )Nr   T)rP   r^   r:  ifascii_nougly)rP   r^   r:  r   )rD   rM   r   r   r   r   )	r:   p1p2rP   r^   r:  r  tmpsepr<   r<   r=   _hprint_vseparator  s    
z PrettyPrinter._hprint_vseparatorc                    s   fdd|j D } fdd|jD } |j}| d |_d }||fD ]8} |}|d u rj|}qNt|d }t|| }qN| d |_t|	d }t|
d } ||}t|dd }| d d }| | d }	td	\}
}}}}td
||  | d
|	|   ||
 d}|
d d }t|	 t|j  }t|
 t|j }|| |_t|
d| }|S )Nc                    s   g | ]}  |qS r<   r   r  r^  rC   r<   r=   r    r  z.PrettyPrinter._print_hyper.<locals>.<listcomp>c                    s   g | ]}  |qS r<   r   r  brC   r<   r=   r    r  r~   r}   rZ   r[   rX   Fr  r  )apbqrE   argumentr   r   r  r   r   rP   r^   r  rO   r$   r   )r:   rI   r  r  r  r   r  r!  r   r   sztr  addimgr  r<   rC   r=   _print_hyper  s8    

zPrettyPrinter._print_hyperc                     s  i } fdd|j D |d<  fdd|jD |d<  fdd|jD |d<  fdd|jD |d	<  |j}| d
 |_i }|D ]} || ||< qt	d
D ]}t
|d|f  |d|f  }t	d
D ]`}|||f }	||	  d
 }
||
 |	  }t|	d|
  }	t|	d|  }	|	|||f< qqt|d d|d  }t|d }t|d d|d	  }t|| }| d
 |_t|d }t|d } ||}t|dd }| d
 d }| | d }td\}}}}}td||  | d||   || d} t|j} t|j} t|j} t|j }dd }|||\}}|||\}}t|d| }t|d| }|j| d
 }|dkrt|d|  }t|| }||_t|| }|| |_t|d| }|S )Nc                    s   g | ]}  |qS r<   r   r  rC   r<   r=   r    r  z0PrettyPrinter._print_meijerg.<locals>.<listcomp>rK  c                    s   g | ]}  |qS r<   r   r  rC   r<   r=   r    r  )r   rX   c                    s   g | ]}  |qS r<   r   r  rC   r<   r=   r    r  )rX   r   c                    s   g | ]}  |qS r<   r   r  rC   r<   r=   r    r  rJ  r~   r   rX   r}   z  rZ   r[   Gr  r  c                 S   sZ   |   |   }|dkr | |fS |dkr>| t|d|  fS t| d|   |fS d S )Nr   r}   )r   r   rP   )r  r  diffr<   r<   r=   r    s    z,PrettyPrinter._print_meijerg.<locals>.adjustr8  )anZaotherZbmZbotherrE   r  r   r   r  r   r   r   r   rP   r^   r   r  rO   r$   r   r  r  ) r:   rI   r  r  Zvpidxr(   r  r2   r   rP   r^   ZD1ZD2r   r   r   r  r  r  r  r  r  ppZpqZpmZpnr  ZpuplZhtr  r<   rC   r=   _print_meijerg  sh    "

zPrettyPrinter._print_meijergc                 C   s"   t tdd}|| |jd  S )NExp1rI   r   )r   r   rE   rN   )r:   rI   ri  r<   r<   r=   _print_ExpBase  s    zPrettyPrinter._print_ExpBasec                 C   s   t tddS )Nr  rI   )r   r   rH   r<   r<   r=   _print_Exp1  s    zPrettyPrinter._print_Exp1rZ   r[   c                 C   s   | j |j|j||||dS )N)r   	func_namerP   r^   )_helper_print_functionri   rN   )r:   rI   r   r  rP   r^   r<   r<   r=   r     s    zPrettyPrinter._print_Functionc                 C   s   | j |ddS NCr  r   rH   r<   r<   r=   _print_mathieuc  s    zPrettyPrinter._print_mathieucc                 C   s   | j |ddS Nr   r  r  rH   r<   r<   r=   _print_mathieus  s    zPrettyPrinter._print_mathieusc                 C   s   | j |ddS )NzC'r  r  rH   r<   r<   r=   _print_mathieucprime"  s    z"PrettyPrinter._print_mathieucprimec                 C   s   | j |ddS )NzS'r  r  rH   r<   r<   r=   _print_mathieusprime%  s    z"PrettyPrinter._print_mathieusprimer8  c	                 C   s   |rt |td}|s$t|dr$|j}|r8| t|}	nt| |  }	|r| jr^t	d}
nd}
| |
}
tt
|	|
dtji}	t| j||dj||d }tt
|	|dtji}|	|_||_|S )Nr   rn   zModifier Letter Low Ringru  r   r9  r;  )r   r   hasattrrn   rE   r   r   rO   rD   r   r   r   r   rM   r   r>  r?  )r:   ri   rN   r   r  r:  elementwiserP   r^   r>  rv  r?  rR   r<   r<   r=   r  (  s8    



z$PrettyPrinter._helper_print_functionc                 C   s$   |j }|j}|g}| j||dddS )Nr   T)r:  r  )r   rA   r  )r:   rI   ri   r   rN   r<   r<   r=   _print_ElementwiseApplyFunctionM  s    z-PrettyPrinter._print_ElementwiseApplyFunctionc                 C   s   ddl m} ddlm}m} ddlm} ddlm} ddl	m
} ddlm} |td dg|td	 d	g|td
 dg|td dg|td dg|td dg|ddgiS )Nr   )KroneckerDelta)gamma
lowergamma)lerchphi)beta)
DiracDelta)ChideltaGammaPhir   r  BetarN  r  )Z(sympy.functions.special.tensor_functionsr  Z'sympy.functions.special.gamma_functionsr  r  Z&sympy.functions.special.zeta_functionsr   Z&sympy.functions.special.beta_functionsr  Z'sympy.functions.special.delta_functionsr  Z'sympy.functions.special.error_functionsr  r!   )r:   r  r  r  r   r  r  r  r<   r<   r=   _special_function_classesS  s    z'PrettyPrinter._special_function_classesc                 C   sf   | j D ]L}t||r|j|jkr| jr<t| j | d   S t| j | d   S q|j}tt|S )Nr   rX   )r  
issubclassrn   rD   r   r   )r:   rA   clsr  r<   r<   r=   _print_FunctionClassc  s    
z"PrettyPrinter._print_FunctionClassc                 C   s
   |  |S r>   )rB   r@   r<   r<   r=   _print_GeometryEntitym  s    z#PrettyPrinter._print_GeometryEntityc                 C   s    | j rtd nd}| j||dS )Nr  r   r  rD   r!   r   r:   rI   r  r<   r<   r=   _print_lerchphiq  s    zPrettyPrinter._print_lerchphic                 C   s    | j rtd nd}| j||dS )NetaZdirichlet_etar  r  r  r<   r<   r=   _print_dirichlet_etau  s    z"PrettyPrinter._print_dirichlet_etac                 C   s\   | j rtd nd}|jd dkrJt| |jd   }t|| }|S | j||dS d S )NthetaZ	HeavisiderX   g      ?r   r  )rD   r!   rN   r   rE   rO   rP   r   )r:   rI   r  rR   r<   r<   r=   _print_Heavisidey  s    zPrettyPrinter._print_Heavisidec                 C   s   | j |ddS r  r  rH   r<   r<   r=   _print_fresnels  s    zPrettyPrinter._print_fresnelsc                 C   s   | j |ddS r  r  rH   r<   r<   r=   _print_fresnelc  s    zPrettyPrinter._print_fresnelcc                 C   s   | j |ddS )NZAir  r  rH   r<   r<   r=   _print_airyai  s    zPrettyPrinter._print_airyaic                 C   s   | j |ddS )NZBir  r  rH   r<   r<   r=   _print_airybi  s    zPrettyPrinter._print_airybic                 C   s   | j |ddS )NzAi'r  r  rH   r<   r<   r=   _print_airyaiprime  s    z PrettyPrinter._print_airyaiprimec                 C   s   | j |ddS )NzBi'r  r  rH   r<   r<   r=   _print_airybiprime  s    z PrettyPrinter._print_airybiprimec                 C   s   | j |ddS )NWr  r  rH   r<   r<   r=   _print_LambertW  s    zPrettyPrinter._print_LambertWc                 C   s   | j |ddS )NZCovr  r  rH   r<   r<   r=   _print_Covariance  s    zPrettyPrinter._print_Covariancec                 C   s   | j |ddS )NZVarr  r  rH   r<   r<   r=   _print_Variance  s    zPrettyPrinter._print_Variancec                 C   s   | j |ddS )Nr  r  r  rH   r<   r<   r=   _print_Probability  s    z PrettyPrinter._print_Probabilityc                 C   s   | j |ddddS )Nr  r&  r'  )r  rP   r^   r  rH   r<   r<   r=   _print_Expectation  s    z PrettyPrinter._print_Expectationc                 C   sb   |j }|j}| jrd}nd}t|dkr:|d jr:|d }| |}tt||| |ddiS )Nu    ↦  -> rX   r   r   r  )	rA   	signaturerD   r   Z	is_symbolrE   r   r   r   )r:   rI   rA   sigarrowZvar_formr<   r<   r=   _print_Lambda  s    
zPrettyPrinter._print_Lambdac                 C   s  |  |j}|jr&tdd |jD s4t|jdkrt|d }t|jdkrht||  |j }n$t|jrt||  |jd  }| jrt|d }nt|d }t|jdkrt||  |j }nt||  |jd  }t|	  }t|
d }|S )	Nc                 s   s   | ]}|t jkV  qd S r>   )r   Zero)r  r  r<   r<   r=   	<genexpr>  r  z-PrettyPrinter._print_Order.<locals>.<genexpr>rX   ; r   u    → r   O)rE   rA   pointanyr   r  r   r^   rD   rO   rP   r:   rA   rR   r<   r<   r=   _print_Order  s$    
zPrettyPrinter._print_Orderc                 C   s   | j r`| |jd |jd  }| |jd }td}t|| }t|d }|| }|S | |jd }| |jd |jd  }| |ddd}|| S d S )Nr   rX   r~   r   r   r}   )rD   rE   rN   r   r^   rM   )r:   rI   shiftr   ri  rR   r<   r<   r=   _print_SingularityFunction  s    z(PrettyPrinter._print_SingularityFunctionc                 C   s    | j rtd nd}| j||dS )Nr  rN  r  r  r  r<   r<   r=   _print_beta  s    zPrettyPrinter._print_betac                 C   s   d}| j ||dS )NzB'r  r  r  r<   r<   r=   _print_betainc  s    zPrettyPrinter._print_betaincc                 C   s   d}| j ||dS )Nr`  r  r  r  r<   r<   r=   _print_betainc_regularized  s    z(PrettyPrinter._print_betainc_regularizedc                 C   s    | j rtd nd}| j||dS Nr  r  r  r  r<   r<   r=   _print_gamma  s    zPrettyPrinter._print_gammac                 C   s    | j rtd nd}| j||dS r2  r  r  r<   r<   r=   _print_uppergamma  s    zPrettyPrinter._print_uppergammac                 C   s    | j rtd nd}| j||dS )Nr  r  r  r  r  r<   r<   r=   _print_lowergamma  s    zPrettyPrinter._print_lowergammac                 C   s   | j rt|jdkrttd }| |jd }t|  }| |jd }t|  }|| }t|d }t|| }|S | |jd }t|  }t|td  }|S | 	|S d S )Nr~   r  rX   r   r}   )
rD   r   rN   r   r!   rE   rO   r^   rP   r   )r:   rI   r^  r  crR   r<   r<   r=   _print_DiracDelta  s     zPrettyPrinter._print_DiracDeltac                 C   s>   |j d jr4| jr4| td|j d  |j d S | |S )Nr   zE_%srX   )rN   rt   rD   r   r   rH   r<   r<   r=   _print_expint  s    "zPrettyPrinter._print_expintc                 C   sD   t d}t | |j  }t t||dt ji}||_||_|S )Nr  r   )	r   rM   rN   rO   r   r   r   r>  r?  )r:   rI   r>  r?  rR   r<   r<   r=   
_print_Chi  s    
zPrettyPrinter._print_Chic                 C   s^   |  |jd }t|jdkr$|}n|  |jd }| ||}t|  }t|d }|S )Nr   rX   r  )rE   rN   r   r  r   rO   rP   )r:   rI   pforma0rR   pforma1r<   r<   r=   _print_elliptic_e  s    zPrettyPrinter._print_elliptic_ec                 C   s.   |  |jd }t|  }t|d }|S )Nr   K)rE   rN   r   rO   rP   rQ   r<   r<   r=   _print_elliptic_k  s    zPrettyPrinter._print_elliptic_kc                 C   sJ   |  |jd }|  |jd }| ||}t|  }t|d }|S )Nr   rX   r  )rE   rN   r  r   rO   rP   )r:   rI   r:  r;  rR   r<   r<   r=   _print_elliptic_f$  s    zPrettyPrinter._print_elliptic_fc                 C   s   | j rtd nd}| |jd }| |jd }t|jdkrN| ||}n<| |jd }| j||dd}t|d }t|| }t|  }t|| }|S )NPir   rX   r~   Fr  r'  )	rD   r!   rE   rN   r   r  r   rP   rO   )r:   rI   rT   r:  r;  rR   Zpforma2Zpformar<   r<   r=   _print_elliptic_pi,  s    z PrettyPrinter._print_elliptic_pic                 C   s    | j rttdS | tdS )NphiZGoldenRatiorD   r   r   rE   r   r@   r<   r<   r=   _print_GoldenRatio;  s    z PrettyPrinter._print_GoldenRatioc                 C   s    | j rttdS | tdS )Nr  Z
EulerGammarD  r@   r<   r<   r=   _print_EulerGamma@  s    zPrettyPrinter._print_EulerGammac                 C   s   |  tdS )Nr  )rE   r   r@   r<   r<   r=   _print_CatalanE  s    zPrettyPrinter._print_Catalanc                 C   s\   |  |jd }|jtjkr(t|  }t|d }t||  |jd  }tj|_|S )Nr   z mod rX   )rE   rN   r   r   r   rO   r^   r   r+  r<   r<   r=   
_print_ModH  s    zPrettyPrinter._print_Modc                 C   s  | j ||d}g g  }}dd }t|D ]\}}|jr| r|jdd\}	}
|	dkrft|
ddi}nt|	 g|
R ddi}| |}|||| q(|jr|j	dkr|d  || q(|j
r|d	k r| | }|||| q(|jr|t| |   q(|| | q(|rd
}|D ]$}|d ur.| dkr. qXq.d}|D ]p}|| d }}|d	k r| d
 }}|rtt|jtt|j	 }n
| |}|r|||}|||< q\tj| S )Nr)   c                 S   sj   |dkr |   dkrd}q$d}nd}| jtjks<| jtjkrJt|   }n| }t||}t|dtjiS )z'Prepend a minus sign to a pretty form. r   rX   z- r   r  r   )r   r   r   NEGZADDr   rO   r   )rR   r  Z	pform_negr  r<   r<   r=   pretty_negativeU  s    
z1PrettyPrinter._print_Add.<locals>.pretty_negativeF)Zrationalr  r  rX   r   T)Z_as_ordered_termsr\  Zis_MulrQ  Zas_coeff_mulr   rE   r   is_RationalqZ	is_Numberis_Relationalr   rO   r   r6   r  r  )r:   rA   r)   Ztermspformsr  rK  r(   r   rS  otherZnegtermrR   Zlargenegativer<   r<   r=   
_print_AddQ  sJ    






zPrettyPrinter._print_Addc           	         s  ddl m  |j}|d tju s:tdd |dd  D rttj|}|d dk}|rjt	ddd|d< t	j
| }|rt	d|j |j|j}|S g }g }jd	vr| }n
t|j}t| fd
dd}|D ]}|jr8|jr8|jjr8|jjr8|jdkr |t|j|j dd n|t|j|j  q|jr|tjur|jdkrh|t|j |jdkr|t|j q|| qЇfdd|D }fdd|D }t|dkrt	j
| S t|dkr|tj t	j
| t	j
|  S d S )Nr   Quantityc                 s   s   | ]}t |tV  qd S r>   )r4   r   r  r   r<   r<   r=   r&    r  z+PrettyPrinter._print_Mul.<locals>.<genexpr>rX   z-1re  r   )oldnonec                    s    t |  pt | tot | j S r>   )r4   r
   ri  r-  rS  r<   r=   r.    s   
z*PrettyPrinter._print_Mul.<locals>.<lambda>r   r  Fr~  c                    s   g | ]}  |qS r<   r   )r  ZairC   r<   r=   r    r  z,PrettyPrinter._print_Mul.<locals>.<listcomp>c                    s   g | ]}  |qS r<   r   )r  ZbirC   r<   r=   r    r  )Zsympy.physics.unitsrT  rN   r   Oner*  r   maprE   r   r]  r   r   r   r)   Zas_ordered_factorsr   is_commutativeZis_Powrj  rL  Zis_negativer   r
   ri  r  r  r	   rM  r   )	r:   r  rN   ZstrargsZnegoneobjr^  r  rR  r<   )rT  r:   r=   r    sF    (



$
zPrettyPrinter._print_Mulc           	         st  |  |}| jd rT| jrT|dkrT| dkrT| dksF|jrT|jrTt|d S t	dd t	dd  }|  |}| dkr|  ||  d|  S |dkrdnt
|d}t|dkrdt|d  | }t|d	 | }d
|_| d td	 fddtD }d |_t|| }td|j|_ttdd|  }t|| }t|| }|S )Nr-   r~   rX   u   √r  \r   r}   r  r   c                 3   s*   | ]"}d | d    d |  V  qdS )r}   rX   Nr<   r  Z_zZZ
linelengthr<   r=   r&    s   z0PrettyPrinter._print_nth_root.<locals>.<genexpr>r   )rE   r5   rD   r   r   rt   ru   r   rP   r   r6   ljustr   r   r   r  r   r^   r   r   r   )	r:   ri  rootZbprettyZrootsignZrprettyrj  Zdiagonalr   r<   r]  r=   _print_nth_root  sD    






zPrettyPrinter._print_nth_rootc                 C   s   ddl m} | \}}|jr|tju r:td| | S ||\}}|tju r~|j	r~|j
s~|jsh|jr~| jd r~| ||S |jr|dk rtd| t|| dd S |jrt| |  | |S | || | S )Nr   )fractionre  r.   Fr~  )Zsympy.simplify.simplifyra  Zas_base_exprZ  r   ZNegativeOner   rE   rX  Zis_Atomrt   rL  rv   r5   r`  r
   rN  rO   __pow__)r:   powerra  r  rI   r   r   r<   r<   r=   
_print_Pow  s    
"zPrettyPrinter._print_Powc                 C   s   |  |jd S r  )rE   rN   r@   r<   r<   r=   _print_UnevaluatedExpr  s    z$PrettyPrinter._print_UnevaluatedExprc                 C   s   |dkr0|dk r"t t|t jdS t t|S n\t|dkrt|dkr|dk rnt t|t jdt t| S t t|t t| S nd S d S )NrX   r   )r   
   )r   r6   rJ  abs)r:   r  rM  r<   r<   r=   Z__print_numer_denom  s    z!PrettyPrinter.__print_numer_denomc                 C   s*   |  |j|j}|d ur|S | |S d S r>   )!_PrettyPrinter__print_numer_denomr  rM  rB   r:   rA   r   r<   r<   r=   _print_Rational)  s    zPrettyPrinter._print_Rationalc                 C   s*   |  |j|j}|d ur|S | |S d S r>   )rh  	numeratordenominatorrB   ri  r<   r<   r=   _print_Fraction1  s    zPrettyPrinter._print_Fractionc                 C   sh   t |jdkr8t|js8| |jd | t |j S | jrBdnd}| j|jd d d| dd dS d S )	NrX   r      ×rx   r   c                 S   s   | j p| jp| jS r>   )is_Unionis_Intersectionis_ProductSetsetr<   r<   r=   r.  ?  s   z1PrettyPrinter._print_ProductSet.<locals>.<lambda>r/  )r   setsr   rE   rD   rM   )r:   r  Z	prod_charr<   r<   r=   _print_ProductSet9  s     zPrettyPrinter._print_ProductSetc                 C   s   t |jtd}| |dddS )Nr   r  }r8  )r   rN   r   rM   )r:   r   r  r<   r<   r=   _print_FiniteSetB  s    zPrettyPrinter._print_FiniteSetc                 C   s   | j rd}nd}|jjrH|jjrH|jjr8|ddd|f}q|ddd|f}n||jjrj||d |j |d f}nZ|jjrt|}t|t||f}n6t|dkrt|}t|t|||d f}nt	|}| 
|ddd	S )
N   …...r  r   rX   r   r  rv  r8  )rD   startis_infinitestopstepZis_positiveiterr   r   r   rM   )r:   r   dotsprintsetitr<   r<   r=   _print_RangeF  s"    zPrettyPrinter._print_Rangec                 C   s`   |j |jkr$| |jd d ddS |jr0d}nd}|jr@d}nd}| |jd d ||S d S )	NrX   r  rv  rZ   r&  r[   r'  r~   )rz  endrM   rN   Z	left_openZ
right_openr:   r(   rP   r^   r<   r<   r=   _print_Interval_  s    zPrettyPrinter._print_Intervalc                 C   s    d}d}|  |jd d ||S )Nr   r   r~   rM   rN   r  r<   r<   r=   _print_AccumulationBoundsp  s    z'PrettyPrinter._print_AccumulationBoundsc                 C   s(   dt dd }| j|jd d |dd dS )Nr   ZIntersectionr   c                 S   s   | j p| jp| jS r>   )rq  ro  is_Complementrr  r<   r<   r=   r.  {  s   z3PrettyPrinter._print_Intersection.<locals>.<lambda>r/  r   rM   rN   r:   r   r:  r<   r<   r=   _print_Intersectionv  s    z!PrettyPrinter._print_Intersectionc                 C   s(   dt dd }| j|jd d |dd dS )Nr   Unionr"   c                 S   s   | j p| jp| jS r>   )rq  rp  r  rr  r<   r<   r=   r.    s   z,PrettyPrinter._print_Union.<locals>.<lambda>r/  r  )r:   r   Zunion_delimiterr<   r<   r=   _print_Union~  s    zPrettyPrinter._print_Unionc                 C   s,   | j stddtd }| |jd d |S )Nz?ASCII pretty printing of SymmetricDifference is not implementedr   ZSymmetricDifference)rD   r  r   rM   rN   )r:   r   Zsym_delimeterr<   r<   r=   _print_SymmetricDifference  s    z(PrettyPrinter._print_SymmetricDifferencec                 C   s   d}| j |jd d |dd dS )Nz \ c                 S   s   | j p| jp| jS r>   )rq  rp  ro  rr  r<   r<   r=   r.    s   z1PrettyPrinter._print_Complement.<locals>.<lambda>r/  r  r  r<   r<   r=   _print_Complement  s    zPrettyPrinter._print_Complementc                    s   | j rd nd |j}|j}|j}| |j}t|dkrl| j|d  |d fdd}| j||ddd	dd
S t	 fddt
||D }| j|d d dd}| j||ddd	dd
S d S )N   ∊inrX   r   r}   r9  r  rv  TrP   r^   r  r:  c                 3   s,   | ]$\}}|d  d |dfD ]
}|V  qqdS )r}   r8  Nr<   )r  r  Zsetvr2   innr<   r=   r&    s   
z0PrettyPrinter._print_ImageSet.<locals>.<genexpr>r  r   )rD   r{  Z	base_setsr!  rE   rA   r   rM   r  r   r   )r:   tsfunrt  r!  rA   r   Zpargsr<   r  r=   _print_ImageSet  s*    zPrettyPrinter._print_ImageSetc           	      C   s   | j rd}d}nd}d}| t|j}t|jdd }|d urP| |j }n(| |j}| j rx| |}t|	  }|j
tju r| j||dddd	d
S | |j
}| j|||||fd	d}| j||dddd	d
S )Nr  r   r  andas_exprr  rv  Tr}   r  r9  )rD   rM   r   r   getattr	conditionrE   r  r   rO   Zbase_setr   UniversalSetr  )	r:   r  r  Z_andr  r  r  ri  r  r<   r<   r=   _print_ConditionSet  s2    

z!PrettyPrinter._print_ConditionSetc                 C   s^   | j rd}nd}| |j}| |j}| |j}| j|||fdd}| j||dddddS )	Nr  r  r}   r9  r  rv  Tr  )rD   rM   r  rE   rA   rt  r  )r:   r  r  r  rA   Zprodsetsr  r<   r<   r=   _print_ComplexRegion  s    z"PrettyPrinter._print_ComplexRegionc                 C   sH   |j \}}| jr8d}tt| ||| |ddiS tt|S d S )Nu    ∈ r   r  )rN   rD   r   r   r   rE   r   )r:   rI   r  rs  elr<   r<   r=   _print_Contains  s    

zPrettyPrinter._print_Containsc                 C   sP   |j jtju r(|jjtju r(| |jS | jr4d}nd}| |	 | | S )Nrx  ry  )
r  Zformular   r%  ZbnrE   Za0rD   rR  truncate)r:   r   r  r<   r<   r=   _print_FourierSeries  s    z"PrettyPrinter._print_FourierSeriesc                 C   s   |  |jS r>   )rR  Zinfiniter:   r   r<   r<   r=   _print_FormalPowerSeries  s    z&PrettyPrinter._print_FormalPowerSeriesc                 C   s0   t | |j  }| td}t || S )NZSetExpr)r   rE   rs  rO   r   r^   )r:   seZ
pretty_setpretty_namer<   r<   r=   _print_SetExpr  s    zPrettyPrinter._print_SetExprc                 C   s   | j rd}nd}t|jjdks0t|jjdkr8td|jtju r~|j}|||d ||d ||d ||f}n>|jtj	u s|j
dkr|d d }|| t|}nt|}| |S )	Nrx  ry  r   z@Pretty printing of sequences with symbolic bound not implementedr   r~   rX   r   )rD   r   rz  Zfree_symbolsr|  r  r   r  rS  r  lengthr   r   _print_list)r:   r   r  r|  r  r<   r<   r=   _print_SeqFormula  s      

zPrettyPrinter._print_SeqFormulac                 C   s   dS )NFr<   r-  r<   r<   r=   r.  	  r  zPrettyPrinter.<lambda>c              	   C   s   zdg }|D ]:}|  |}	||r,t|	  }	|r:|| ||	 q
|sTtd}
nttj|  }
W n| ty   d }
|D ]P}| |}	||rt|	  }	|
d u r|	}
qztt|
| }
tt|
|	 }
qz|
d u rtd}
Y n0 t|
j|||d }
|
S )Nr   rA  )rE   r   rO   r   r   r   AttributeErrorrG   )r:   seqrP   r^   r:  r0  r  rO  rR  rR   r   r<   r<   r=   rM   	  s4    



zPrettyPrinter._print_seqc                 C   sP   d }|D ].}|d u r|}qt || }t || }q|d u rHt dS |S d S )Nr   )r   r^   )r:   r:  rN   rR   r   r<   r<   r=   r  <	  s    zPrettyPrinter.joinc                 C   s   |  |ddS rz  rM   )r:   r   r<   r<   r=   r  K	  s    zPrettyPrinter._print_listc                 C   sL   t |dkr:tt| |d d }t|jdddd S | |ddS d S )NrX   r   r   rZ   r[   TrA  )r   r   r   r   rE   rO   rM   )r:   r  Zptupler<   r<   r=   _print_tupleN	  s    zPrettyPrinter._print_tuplec                 C   s
   |  |S r>   )r  r@   r<   r<   r=   _print_TupleU	  s    zPrettyPrinter._print_Tuplec                 C   s`   t | td}g }|D ]8}| |}| || }tt|d| }|| q| |ddS )Nr   z: r  rv  )	r   keysr   rE   r   r   r   r   rM   )r:   r   r  r  r   r=  Vr   r<   r<   r=   _print_dictX	  s    
zPrettyPrinter._print_dictc                 C   s
   |  |S r>   )r  )r:   r   r<   r<   r=   _print_Dicte	  s    zPrettyPrinter._print_Dictc                 C   s:   |st dS t|td}| |}t |jdddd }|S )Nzset()r   r  rv  TrA  )r   r   r   rM   rO   r:   r   r  prettyr<   r<   r=   
_print_seth	  s    
zPrettyPrinter._print_setc                 C   sd   |st dS t|td}| |}t |jdddd }t |jdddd }t tt|j| }|S )	Nzfrozenset()r   r  rv  TrA  rZ   r[   )	r   r   r   rM   rO   r   r   typern   r  r<   r<   r=   _print_frozensetp	  s    
zPrettyPrinter._print_frozensetc                 C   s   | j rtdS tdS d S )Nu   𝕌r  ra  r  r<   r<   r=   _print_UniversalSetz	  s    z!PrettyPrinter._print_UniversalSetc                 C   s   t t|S r>   r   r   )r:   ringr<   r<   r=   _print_PolyRing	  s    zPrettyPrinter._print_PolyRingc                 C   s   t t|S r>   r  )r:   fieldr<   r<   r=   _print_FracField	  s    zPrettyPrinter._print_FracFieldc                 C   s   t t|S r>   r?   )r:   elmr<   r<   r=   _print_FreeGroupElement	  s    z%PrettyPrinter._print_FreeGroupElementc                 C   s   t t|S r>   r  )r:   Zpolyr<   r<   r=   _print_PolyElement	  s    z PrettyPrinter._print_PolyElementc                 C   s   t t|S r>   r  )r:   fracr<   r<   r=   _print_FracElement	  s    z PrettyPrinter._print_FracElementc                 C   s*   |j r| |  S | | S d S r>   )Z
is_aliasedrE   Zas_polyr  r@   r<   r<   r=   _print_AlgebraicNumber	  s    z$PrettyPrinter._print_AlgebraicNumberc                 C   s:   | j |jdd|jg}t| |  }t|d }|S )NlexrI  ZCRootOf)rR  rA   r  r   rM   rO   rP   r:   rA   rN   rR   r<   r<   r=   _print_ComplexRootOf	  s    z"PrettyPrinter._print_ComplexRootOfc                 C   sT   | j |jddg}|jtjur0|| |j t| |	  }t|
d }|S )Nr  rI  ZRootSum)rR  rA   r  r   ZIdentityFunctionr   rE   r   rM   rO   rP   r  r<   r<   r=   _print_RootSum	  s    zPrettyPrinter._print_RootSumc                 C   s"   | j rd}nd}tt||j S )Nu   ℤ_%dzGF(%d))rD   r   r   mod)r:   rA   formr<   r<   r=   _print_FiniteField	  s    z PrettyPrinter._print_FiniteFieldc                 C   s   | j rtdS tdS d S )Nu   ℤZZZra  r@   r<   r<   r=   _print_IntegerRing	  s    z PrettyPrinter._print_IntegerRingc                 C   s   | j rtdS tdS d S )Nu   ℚZQQra  r@   r<   r<   r=   _print_RationalField	  s    z"PrettyPrinter._print_RationalFieldc                 C   s>   | j rd}nd}|jrt|S | t|d t|j S d S )Nu   ℝZRRr   rD   Zhas_default_precisionr   rE   r   r6   Z	precisionr:   domainprefixr<   r<   r=   _print_RealField	  s    zPrettyPrinter._print_RealFieldc                 C   s>   | j rd}nd}|jrt|S | t|d t|j S d S )Nu   ℂCCr   r  r  r<   r<   r=   _print_ComplexField	  s    z!PrettyPrinter._print_ComplexFieldc                 C   s^   t |j}|jjs6ttd| |j }|| | |dd}t|	| |j
 }|S Norder=r&  r'  r   symbolsr)   Z
is_defaultr   r^   rE   r   rM   rP   r  r:   rA   rN   r)   rR   r<   r<   r=   _print_PolynomialRing	  s    

z#PrettyPrinter._print_PolynomialRingc                 C   s^   t |j}|jjs6ttd| |j }|| | |dd}t|	| |j
 }|S )Nr  rZ   r[   r  r  r<   r<   r=   _print_FractionField	  s    

z"PrettyPrinter._print_FractionFieldc                 C   sV   |j }t|jt|jkr.|dt|j f }| |dd}t|| |j }|S r  )	r  r6   r)   Zdefault_orderrM   r   rP   rE   r  )r:   rA   grR   r<   r<   r=   _print_PolynomialRingBase	  s    z'PrettyPrinter._print_PolynomialRingBasec                    s    fdd j D }td|jddd }fdd jD }ttd j }ttd	 j }d|g| ||g }t|  }t|	 j
j }|S )
Nc                    s   g | ]}j | jd qS )rI  )rR  r)   rU  basisr:   r<   r=   r  	  s   z6PrettyPrinter._print_GroebnerBasis.<locals>.<listcomp>r8  r&  r'  r;  c                    s   g | ]}  |qS r<   r   )r  genrC   r<   r=   r  	  r  zdomain=r  )exprsr   r  rO   gensr^   rE   r  r)   rP   rm   rn   )r:   r  r  r  r  r)   rR   r<   r  r=   _print_GroebnerBasis	  s    z"PrettyPrinter._print_GroebnerBasisc              	      s     |j}t|  }| dkr,| nd}ttd||jd}t|| }|j}| d |_t| 	 fddt
|j|jD  }||_|S )NrX   r~   r   r  c              	      s8   g | ]0} j  |d  td |d fddqS )r   r   rX   r   r9  )rM   rE   r   )r  r  rC   r<   r=   r  
  s   $z-PrettyPrinter._print_Subs.<locals>.<listcomp>)rE   rA   r   rO   r   r   r   r   r^   rM   r   r  r)  )r:   rI   rR   r   Zrvertr  r<   rC   r=   _print_Subs
  s    zPrettyPrinter._print_Subsc           
      C   s   t |}| |jd }t d|  }t || }t || }t|jdkrV|S |j\}}|}t | |g  }	t t	
||	dt ji}||_|	|_|S )Nr   r}   rX   r   )r   rE   rN   r   r   r^   r   rM   rO   r   r   r   r>  r?  )
r:   rI   rT   rR   r   r   rC  rx   r>  r?  r<   r<   r=   _print_number_function
  s$    

z$PrettyPrinter._print_number_functionc                 C   s   |  |dS )Nr  r  rH   r<   r<   r=   _print_euler)
  s    zPrettyPrinter._print_eulerc                 C   s   |  |dS )Nr  r  rH   r<   r<   r=   _print_catalan,
  s    zPrettyPrinter._print_catalanc                 C   s   |  |dS )NrN  r  rH   r<   r<   r=   _print_bernoulli/
  s    zPrettyPrinter._print_bernoullic                 C   s   |  |dS )NLr  rH   r<   r<   r=   _print_lucas4
  s    zPrettyPrinter._print_lucasc                 C   s   |  |dS )Nr  r  rH   r<   r<   r=   _print_fibonacci7
  s    zPrettyPrinter._print_fibonaccic                 C   s   |  |dS )NrE  r  rH   r<   r<   r=   _print_tribonacci:
  s    zPrettyPrinter._print_tribonaccic                 C   s"   | j r| |dS | |dS d S )Nu   γZ	stieltjes)rD   r  rH   r<   r<   r=   _print_stieltjes=
  s    zPrettyPrinter._print_stieltjesc                 C   s   |  |jd }t|td }t||  |jd  }| jrPttd}ntd}|}t|d|   }t|d|   }t|	|dtj
iS )Nr   r   rX   r  r   r}   r   )rE   rN   r   r^   rD   r   r   rP   r   r   ZPOW)r:   rI   rR   r^  r  r  r  r<   r<   r=   _print_KroneckerDeltaC
  s    z#PrettyPrinter._print_KroneckerDeltac                 C   s   t |dr0| d}t|| |  }|S t |dr| d}t|| |j }t|| d }t|| |j }|S t |dr| d}t|| |j }|S | d S d S )N
as_booleanzDomain: rs  z in r  z
Domain on )r  rE   r   r^   r  r  rs  )r:   r   rR   r<   r<   r=   _print_RandomDomainP
  s    





z!PrettyPrinter._print_RandomDomainc                 C   sD   z"|j d ur | |j |W S W n ty4   Y n0 | t|S r>   )r  rE   Zto_sympyr   reprr:   r  r<   r<   r=   
_print_DMPb
  s    
zPrettyPrinter._print_DMPc                 C   s
   |  |S r>   )r  r  r<   r<   r=   
_print_DMFk
  s    zPrettyPrinter._print_DMFc                 C   s   |  t|jS r>   rE   r   rT   )r:   objectr<   r<   r=   _print_Objectn
  s    zPrettyPrinter._print_Objectc                 C   s8   t d}| |j}| |j}|||d }t|S )Nz-->r   )r   rE   r  codomainr^   r   )r:   morphismr#  r  r  tailr<   r<   r=   _print_Morphismq
  s
    zPrettyPrinter._print_Morphismc                 C   s.   |  t|j}| |}t|d|d S )NrA  r   )rE   r   rT   r  r   r^   )r:   r  r  pretty_morphismr<   r<   r=   _print_NamedMorphismz
  s    
z"PrettyPrinter._print_NamedMorphismc                 C   s"   ddl m} | ||j|jdS )Nr   )NamedMorphismid)Zsympy.categoriesr  r  r  r  )r:   r  r  r<   r<   r=   _print_IdentityMorphism
  s    z%PrettyPrinter._print_IdentityMorphismc                 C   sT   t d}dd |jD }|  ||d }| |}| |}t||d S )Nru  c                 S   s   g | ]}t |jqS r<   )r   rT   )r  	componentr<   r<   r=   r  
  s   z:PrettyPrinter._print_CompositeMorphism.<locals>.<listcomp>rA  r   )r   r  reverser  rE   r  r   r^   )r:   r  ZcircleZcomponent_names_listZcomponent_namesr  r  r<   r<   r=   _print_CompositeMorphism
  s    

z&PrettyPrinter._print_CompositeMorphismc                 C   s   |  t|jS r>   r  )r:   categoryr<   r<   r=   _print_Category
  s    zPrettyPrinter._print_Categoryc                 C   sX   |j s| tjS | |j }|jrLdtd }| |jd }|||}t|d S )Nr   z==>r   )ZpremisesrE   r   ZEmptySetZconclusionsr   r^   r   )r:   ZdiagramZpretty_resultZresults_arrowZpretty_conclusionsr<   r<   r=   _print_Diagram
  s    zPrettyPrinter._print_Diagramc                    s2   ddl m} | fddt jD }| |S )Nr   )Matrixc                    s&   g | ]  fd dt jD qS )c                    s,   g | ]$} |f r  |f nt d qS )r}   r   )r  r2   )gridr(   r<   r=   r  
  s   z?PrettyPrinter._print_DiagramGrid.<locals>.<listcomp>.<listcomp>)r   r   r  r	  )r(   r=   r  
  s   z4PrettyPrinter._print_DiagramGrid.<locals>.<listcomp>)r<  r  r   r   r%  )r:   r	  r  matrixr<   r
  r=   _print_DiagramGrid
  s
    z PrettyPrinter._print_DiagramGridc                 C   s   |  |ddS rz  r  r:   rC  r<   r<   r=   _print_FreeModuleElement
  s    z&PrettyPrinter._print_FreeModuleElementc                 C   s   |  |jddS )Nr   r   )rM   r  r:   r  r<   r<   r=   _print_SubModule
  s    zPrettyPrinter._print_SubModulec                 C   s   |  |j|  |j S r>   )rE   r  r  r  r<   r<   r=   _print_FreeModule
  s    zPrettyPrinter._print_FreeModulec                 C   s   |  dd |jjD ddS )Nc                 S   s   g | ]
\}|qS r<   r<   r  r<   r<   r=   r  
  r  z?PrettyPrinter._print_ModuleImplementedIdeal.<locals>.<listcomp>r   r   )rM   _moduler  r  r<   r<   r=   _print_ModuleImplementedIdeal
  s    z+PrettyPrinter._print_ModuleImplementedIdealc                 C   s   |  |j|  |j S r>   )rE   r  
base_idealr:   Rr<   r<   r=   _print_QuotientRing
  s    z!PrettyPrinter._print_QuotientRingc                 C   s   |  |j|  |jj S r>   )rE   datar  r  r  r<   r<   r=   _print_QuotientRingElement
  s    z(PrettyPrinter._print_QuotientRingElementc                 C   s   |  |j|  |jj S r>   )rE   r  modulekilled_moduler  r<   r<   r=   _print_QuotientModuleElement
  s    z*PrettyPrinter._print_QuotientModuleElementc                 C   s   |  |j|  |j S r>   )rE   ri  r  r  r<   r<   r=   _print_QuotientModule
  s    z#PrettyPrinter._print_QuotientModulec              	   C   sN   |  | }| d |_t|d|  |jdtdd |  |j }|S )Nr~   z : z %s> r   )	rE   Z_sympy_matrixr   r   r   r^   r  r   r  )r:   r   r  rR   r<   r<   r=   _print_MatrixHomomorphism
  s    z'PrettyPrinter._print_MatrixHomomorphismc                 C   s   |  |jS r>   rE   rT   )r:   Zmanifoldr<   r<   r=   _print_Manifold
  s    zPrettyPrinter._print_Manifoldc                 C   s   |  |jS r>   r  )r:   patchr<   r<   r=   _print_Patch
  s    zPrettyPrinter._print_Patchc                 C   s   |  |jS r>   r  )r:   Zcoordsr<   r<   r=   _print_CoordSystem
  s    z PrettyPrinter._print_CoordSystemc                 C   s   |j j|j j}| t|S r>   )
_coord_sysr  _indexrT   rE   r   )r:   r  stringr<   r<   r=   _print_BaseScalarField
  s    z$PrettyPrinter._print_BaseScalarFieldc                 C   s*   t dd |jj|j j }| t|S )Nr   r   )r"   r$  r  r%  rT   rE   r   )r:   r  r   r<   r<   r=   _print_BaseVectorField
  s    z$PrettyPrinter._print_BaseVectorFieldc                 C   sn   | j rd}nd}|j}t|drF|jj|j j}| |d t| S | |}t	|
  }t	|| S d S )Nu   ⅆr   r$  r}   )rD   Z_form_fieldr  r$  r  r%  rT   rE   r   r   rO   rP   )r:   r  r   r  r&  rR   r<   r<   r=   _print_Differential
  s    

z!PrettyPrinter._print_Differentialc                 C   s8   |  |jd }t|d|jj  }t|d }|S )Nr   z%s(r[   )rE   rN   r   rP   rm   rn   r^   )r:   r  rR   r<   r<   r=   	_print_Tr
  s    zPrettyPrinter._print_Trc                 C   sH   |  |jd }t|  }| jr6t|td  }nt|d }|S )Nr   nurE   rN   r   rO   rD   rP   r!   rQ   r<   r<   r=   _print_primenu
  s    zPrettyPrinter._print_primenuc                 C   sH   |  |jd }t|  }| jr6t|td  }nt|d }|S )Nr   Omegar,  rQ   r<   r<   r=   _print_primeomega
  s    zPrettyPrinter._print_primeomegac                 C   s(   |j j dkr| d}|S | |S d S )NZdegree   °)rT   rE   rB   rQ   r<   r<   r=   _print_Quantity  s    
zPrettyPrinter._print_Quantityc                 C   sD   t dt|j d }| |j}| |j}t t||| }|S )Nr}   )r   r   r   rE   r   r   r   r   r   r<   r<   r=   _print_AssignmentBase  s
    z#PrettyPrinter._print_AssignmentBasec                 C   s   |  |jS r>   r  r  r<   r<   r=   
_print_Str  s    zPrettyPrinter._print_Str)N)F)T)N)N)NNr   F)FNrZ   r[   )FNr8  FrZ   r[   )N)rn   
__module____qualname____doc__ZprintmethodZ_default_settingsr3   rB   propertyrD   rG   rJ   rK   rS   rU   Z_print_RandomSymbolrW   rY   r`   rd   rf   rg   rj   rk   rp   Z_print_InfinityZ_print_NegativeInfinityZ_print_EmptySetZ_print_NaturalsZ_print_Naturals0Z_print_IntegersZ_print_RationalsZ_print_ComplexesZ_print_EmptySequencerq   ry   r{   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   Z_print_Determinantr   r   r   r   r   r   r   r   r  r  r%  r)  r2  r3  r5  r@  rD  rH  rI  rO  rT  r_  rb  rd  rf  rh  rk  rt  rw  ry  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  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  r$  r,  r.  r/  r0  r1  r3  r4  r5  r7  r8  r9  r<  r>  r?  rB  rE  rF  rG  rH  rR  r  r`  rd  re  rh  rj  rm  ru  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  Z_print_SeqPerZ_print_SeqAddZ_print_SeqMulrM   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  r  r  r  r  r  r  Z_print_bellr  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   r"  r#  r'  r(  r)  r*  r-  r/  r1  r2  r3  r<   r<   r<   r=   r%      s  
					%%K6aE		
$d!# 8	0T 
  
%

		H=,			)
						r%   c                 K   s>   t |}|jd }t|}z|| W t| S t| 0 dS )zReturns a string containing the prettified form of expr.

    For information on keyword arguments see pretty_print function.

    r+   N)r%   r5   r    rG   )rA   r;   r  r+   Zuflagr<   r<   r=   r    s    

r  c                 K   s   t t| fi | dS )a  Prints expr in pretty form.

    pprint is just a shortcut for this function.

    Parameters
    ==========

    expr : expression
        The expression to print.

    wrap_line : bool, optional (default=True)
        Line wrapping enabled/disabled.

    num_columns : int or None, optional (default=None)
        Number of columns before line breaking (default to None which reads
        the terminal width), useful when using SymPy without terminal.

    use_unicode : bool or None, optional (default=None)
        Use unicode characters, such as the Greek letter pi instead of
        the string pi.

    full_prec : bool or string, optional (default="auto")
        Use full precision.

    order : bool or string, optional (default=None)
        Set to 'none' for long expressions if slow; default is None.

    use_unicode_sqrt_char : bool, optional (default=True)
        Use compact single-character square root symbol (when unambiguous).

    root_notation : bool, optional (default=True)
        Set to 'False' for printing exponents of the form 1/n in fractional form.
        By default exponent is printed in root form.

    mat_symbol_style : string, optional (default="plain")
        Set to "bold" for printing MatrixSymbols using a bold mathematical symbol face.
        By default the standard face is used.

    imaginary_unit : string, optional (default="i")
        Letter to use for imaginary unit when use_unicode is True.
        Can be "i" (default) or "j".
    N)printr  )rA   kwargsr<   r<   r=   pretty_print+  s    +r:  c                 K   sH   ddl m} ddlm} d|vr(d|d< |t| fi ||  dS )a  Prints expr using the pager, in pretty form.

    This invokes a pager command using pydoc. Lines are not wrapped
    automatically. This routine is meant to be used with a pager that allows
    sideways scrolling, like ``less -S``.

    Parameters are the same as for ``pretty_print``. If you wish to wrap lines,
    pass ``num_columns=None`` to auto-detect the width of the terminal.

    r   )pager)getpreferredencodingr,   i  N)pydocr;  localer<  r  encode)rA   r;   r;  r<  r<   r<   r=   pager_print[  s
    r@  );r  Z
sympy.corer   Zsympy.core.addr   Zsympy.core.containersr   Zsympy.core.functionr   Zsympy.core.mulr   Zsympy.core.numbersr   r	   Zsympy.core.powerr
   Zsympy.core.sortingr   Zsympy.core.symbolr   Zsympy.core.sympifyr   Zsympy.printing.conventionsr   Zsympy.printing.precedencer   r   r   Zsympy.printing.printerr   r   Zsympy.printing.strr   Zsympy.utilities.iterablesr   Zsympy.utilities.exceptionsr   Z sympy.printing.pretty.stringpictr   r   Z&sympy.printing.pretty.pretty_symbologyr   r   r   r   r   r   r    r!   r"   r#   r$   Zpprint_use_unicodeZpprint_try_use_unicoder%   r  r:  pprintr@  r<   r<   r<   r=   <module>   s`   4                      
-