o
    8Va                    @   sP  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
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" d dl#m$Z$m%Z% d dl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 e-Z2e0Z3G dd deZ4ee4dd Z5dd Z6e6Z7dd Z8dS )    N)S)Tuple)_coeff_isnegMul)NumberRational)PowSymbol)SympifyError)requires_partial)
PRECEDENCE
precedenceprecedence_traditional)Printerprint_function)sstr)default_sort_key)has_variety)SymPyDeprecationWarning)
prettyForm
stringPict)hobjvobjxobjxsympretty_symbolpretty_atompretty_use_unicodegreek_unicodeUpretty_try_use_unicode	annotatedc                   @   s:	  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 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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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? ZeZeZeZdddɐd@dA df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`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 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autoTZ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   sV   t | | t| jd tstd| jd | jd dvr)td| jd d S )Nr.   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:   >/usr/lib/python3/dist-packages/sympy/printing/pretty/pretty.pyr1   .   s   zPrettyPrinter.__init__c                 C      t t|S Nr   r4   r8   exprr:   r:   r;   emptyPrinter6      zPrettyPrinter.emptyPrinterc                 C   s   | j d rdS t S )Nr)   T)r3   r   r8   r:   r:   r;   _use_unicode9   s   
zPrettyPrinter._use_unicodec                 C   s   |  |jdi | jS )Nr:   )_printZrenderr3   r?   r:   r:   r;   doprint@      zPrettyPrinter.doprintc                 C   s   |S r=   r:   r8   er:   r:   r;   _print_stringPictD   s   zPrettyPrinter._print_stringPictc                 C   s   t |S r=   )r   rH   r:   r:   r;   _print_basestringG   s   zPrettyPrinter._print_basestringc                 C   s&   t | |j  }t |d }|S )NZatan2)r   
_print_seqargsparensleftr8   rI   pformr:   r:   r;   _print_atan2J   s   zPrettyPrinter._print_atan2Fc                 C   s   t |j|}t|S r=   )r   namer   )r8   rI   Z	bold_nameZsymbr:   r:   r;   _print_SymbolO   s   zPrettyPrinter._print_Symbolc                 C   s   |  || jd dkS )Nr-   Zbold)rT   r3   rH   r:   r:   r;   _print_MatrixSymbolS   s   z!PrettyPrinter._print_MatrixSymbolc                 C   s,   | j d }|dkr| jdk}tt||dS )Nr(   r%      )r(   )r3   Z_print_levelr   r   )r8   rI   r(   r:   r:   r;   _print_FloatV   s   

zPrettyPrinter._print_Floatc                 C   ~   |j }|j}| |}t|d }t|d }t|| td }t|d }t|| | }t|d }|S )N()MULTIPLICATION SIGNZ_expr1Z_expr2rE   r   rO   rightr!   r8   rI   Zvec1Zvec2rQ   r:   r:   r;   _print_Cross^      
zPrettyPrinter._print_Crossc                 C   `   |j }| |}t|d }t|d }t|| td }t|| td }|S )NrY   rZ   r[   NABLAZ_exprrE   r   rO   r]   r!   r8   rI   ZvecrQ   r:   r:   r;   _print_Curlj      
zPrettyPrinter._print_Curlc                 C   ra   )NrY   rZ   DOT OPERATORrb   rc   rd   r:   r:   r;   _print_Divergences   rf   zPrettyPrinter._print_Divergencec                 C   rX   )NrY   rZ   rg   r\   r^   r:   r:   r;   
_print_Dot|   r`   zPrettyPrinter._print_Dotc                 C   H   |j }| |}t|d }t|d }t|| td }|S )NrY   rZ   rb   rc   r8   rI   funcrQ   r:   r:   r;   _print_Gradient      
zPrettyPrinter._print_Gradientc                 C   rj   )NrY   rZ   Z	INCREMENTrc   rk   r:   r:   r;   _print_Laplacian   rn   zPrettyPrinter._print_Laplacianc                 C   s4   zt t|jj| dW S  ty   | | Y S w )N)Zprinter)r   r   	__class____name__KeyErrorrA   rH   r:   r:   r;   _print_Atom   s
   zPrettyPrinter._print_Atomc                 C   s&   | j r| |S ddg}| |ddS )Nz-ooZoorY   rZ   )rD   rs   rL   )r8   rI   Zinf_listr:   r:   r;   _print_Reals   s   
zPrettyPrinter._print_Realsc                 C   D   |j d }| |}|jr|js|jst|  }t|d }|S Nr   !)rM   rE   
is_Integeris_nonnegative	is_Symbolr   rN   rO   r8   rI   xrQ   r:   r:   r;   _print_subfactorial      

z!PrettyPrinter._print_subfactorialc                 C   ru   rv   rM   rE   rx   ry   rz   r   rN   r]   r{   r:   r:   r;   _print_factorial   r~   zPrettyPrinter._print_factorialc                 C   ru   )Nr   z!!r   r{   r:   r:   r;   _print_factorial2   r~   zPrettyPrinter._print_factorial2c                 C   st   |j \}}| |}| |}dt| |  }t|| }t|| }t|dd }|jd d |_|S )N rY   rZ   rV      )rM   rE   maxwidthr   aboverN   baseline)r8   rI   nkZn_pformZk_pformZbarrQ   r:   r:   r;   _print_binomial   s   


zPrettyPrinter._print_binomialc                 C   D   t dt|j d }| |j}| |j}t t||| }|S Nr   )r   r   Zrel_oprE   lhsrhsr   nextr8   rI   oplrrQ   r:   r:   r;   _print_Relational   s
   zPrettyPrinter._print_Relationalc                 C   s   ddl m}m} | jr@|jd }| |}t||r!| j|ddS t||r-| j|ddS |j	r9|j
s9t|  }t|d S | |S )Nr   )
EquivalentImpliesu   ⇎)altcharu   ↛   ¬)sympyr   r   rD   rM   rE   r2   _print_Equivalent_print_Implies
is_Booleanis_Notr   rN   rO   _print_Function)r8   rI   r   r   argrQ   r:   r:   r;   
_print_Not   s   




zPrettyPrinter._print_Notc                 C   s   |j }|rt|j td}|d }| |}|jr!|js!t|  }|dd  D ]#}| |}|jr:|js:t|  }t|d|  }t|| }q'|S )Nkeyr   rV    %s )	rM   sortedr   rE   r   r   r   rN   r]   )r8   rI   charsortrM   r   rQ   	pform_argr:   r:   r;   Z__print_Boolean   s   

zPrettyPrinter.__print_Booleanc                 C       | j r	| |dS | j|ddS )N   ∧Tr   rD   _PrettyPrinter__print_Booleanr   rH   r:   r:   r;   
_print_And     zPrettyPrinter._print_Andc                 C   r   )Nu   ∨Tr   r   rH   r:   r:   r;   	_print_Or  r   zPrettyPrinter._print_Orc                 C   r   )Nu   ⊻Tr   r   rH   r:   r:   r;   
_print_Xor  r   zPrettyPrinter._print_Xorc                 C   r   )Nu   ⊼Tr   r   rH   r:   r:   r;   _print_Nand  r   zPrettyPrinter._print_Nandc                 C   r   )Nu   ⊽Tr   r   rH   r:   r:   r;   
_print_Nor#  r   zPrettyPrinter._print_Norc                 C   s$   | j r| j||p	dddS | |S )Nu   →Fr   r   r8   rI   r   r:   r:   r;   r   )  s   
zPrettyPrinter._print_Impliesc                 C   s$   | j r| ||p	dS | j|ddS )Nu   ⇔Tr   r   r   r:   r:   r;   r   /  s   zPrettyPrinter._print_Equivalentc                 C   s(   |  |jd }t|td|  S )Nr   _)rE   rM   r   r   r   r   rP   r:   r:   r;   _print_conjugate5  s   zPrettyPrinter._print_conjugatec                 C   s$   |  |jd }t|dd }|S )Nr   |)rE   rM   r   rN   rP   r:   r:   r;   
_print_Abs9  s   zPrettyPrinter._print_Absc                 C   4   | j r| |jd }t|dd }|S | |S )Nr   ZlfloorZrfloorrD   rE   rM   r   rN   r   rP   r:   r:   r;   _print_floor?  
   
zPrettyPrinter._print_floorc                 C   r   )Nr   ZlceilZrceilr   rP   r:   r:   r;   _print_ceilingG  r   zPrettyPrinter._print_ceilingc                 C   s  t |jr| jrtd}nd}d }d}t|jD ]8\}}| |}t|| }||7 }|j	r3|dkr;|tt
| }|d u rB|}qt|d }t|| }qt| |j dtji}	t|}
|dkdkrq|
tt
| }
t|
tj| }
|
jd |
_tt|
|	 }
tj|
_|
S )NPARTIAL DIFFERENTIALdr   rV   r   bindingF)r   r@   rD   r!   reversedZvariable_countrE   r   rO   rx   r4   r]   rN   FUNCbelowr   LINEr   r   MULr   )r8   derivderiv_symbolr|   Zcount_total_derivsymnumsdsfrQ   r:   r:   r;   _print_DerivativeO  s8   

zPrettyPrinter._print_Derivativec                 C   s   ddl m}m} || krtd}t|  S || j}|g kr0| |j	d }t|  S td}|D ]}| t
t|dd}t|| }q6|S )Nr   PermutationCycle rV   ,) sympy.combinatorics.permutationsr   r   r   r   rN   listZcyclic_formrE   sizer4   tuplereplacer]   )r8   Zdcr   r   ZcycZdc_listr&   r   r:   r:   r;   _print_Cyclet  s   
zPrettyPrinter._print_Cyclec                 C   s   ddl m}m} |j}|d ur td|d|ddd  n| jdd	}|r0| 	||S |j
}ttt|}td
}d	}t||D ](\}	}
| |	}| |
}t|| }|r`d}nt|d }t|| }qFt|  S )Nr   r   zPermutation.print_cyclic = {}zinit_printing(perm_cyclic={})ia;  z1.6)ZfeatureZ
useinsteadZissueZdeprecated_since_versionr/   Tr   Fr   )r   r   r   Zprint_cyclicr   r6   warnr3   getr   Z
array_formr   rangelenr   ziprE   r   r   rO   r]   rN   )r8   r@   r   r   r/   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r+t|  }t|d| }qd}d }|jD ]}	| }
|
d }| j	 }|rO|d7 }t
d|}t|}|j||
 d  |_t|	dkrt|	dkrytd}| |	d }t|	dkr| |	d }| |	d }|rtdd|  }t|d	|  }tdd
|  }t|d	|  }t|| }t|| }|st|d	 }|r|}d}q;t|| }q;t|| }tj|_|S )Nr   rV   z dTr   intr      r      F)functionrE   is_Addr   rN   limitsr   r]   heightrD   r   r   r   r   rO   r   r   r   r   )r8   Zintegralr   prettyFr   r|   Z	prettyArgZ	firsttermr   limhH
ascii_modeZvintrQ   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r!tdd}d}| }d}d}	d}
|jD ]}| |\}}|d d	 d
 d }|| ||d   | | g}t|d D ]}|d| d|d   | d  qVt	d}t
|j|  }t|	| }	|r| }
t
|| }t
|| }|rd|_d}| }t	d}t
|jdg|d    }t
|| }t
|| }q.|	|
d  |_t
j|_|S )Nr   rV   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   )r8   r@   rl   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   Z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   rQ   rC   r:   r;   print_start+  s
   

z<PrettyPrinter.__print_SumProduct_Limits.<locals>.print_startr   r   rV   rE   )r8   r   r   prettyUpperprettyLowerr:   rC   r;   Z__print_SumProduct_Limits*  s   z'PrettyPrinter.__print_SumProduct_Limitsc                 C   sX  | j  }dd }|j}| |}|jrt|  }| d }d}d}d}	|jD ]n}
| |
\}}t	|| }|||
 |
 |\}}}}td}t|j|  }|rX| }	t|| }t|| }|rz| j|| d |j  8  _d}td}t|jdg|   }t|| }t|| }q(|s|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  q3|rV|	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  qttd|D ]}
|	dd|
 |d d||
 d  f  q|	|d |  ||d|  |	|fS )N<^>c                 S   s   |rt | |kr
| S |t |  }|dks|dks|tdvr$| d|  S |d }d| }|dkr6d| |  S ||  d|t |   S )Nr  <r   r   >)r   r   )r   ZwidZhowZneedZhalfZleadr:   r:   r;   adjust:  s   z6PrettyPrinter._print_Sum.<locals>.asum.<locals>.adjustr   rV   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   wZmorelinesr&   Zvsumr:   r:   r;   asum9  s6   

  
**z&PrettyPrinter._print_Sum.<locals>.asumr   Tr   r   Fr   )rD   r   rE   r   r   rN   r   r   r   r   r   r   r   r   r   r   r]   r   r   )r8   r@   r   r
  r   r   r   r   r   r   r   r   r   r   r   ZslinesZ
adjustmentZ
prettySignZpadZascii_adjustmentr:   r:   r;   
_print_Sum6  sF   *


zPrettyPrinter._print_Sumc           	      C   s   |j \}}}}| |}t|td krt|dd }td}| |}| jr0t|d }nt|d }t|| | }t|dksO|t	j
t	jfv rRd}n| jr_t|d	kr]d
nd}t|| | }t|| }t||dtji}|S )Nr   rY   rZ   r   u   ─→z->z+-r   +u   ⁺u   ⁻r   )rM   rE   r   r   r   rN   rD   r]   r4   r   InfinityNegativeInfinityr   r   )	r8   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 pBdg|< q0d}t |jD ]q}d}t |jD ]K |f }	|	 | ksiJ | |	  }
|
d }|
| }t|	d|  }	t|	d|  }	|du r|	}qWt|d|  }t||	 }qW|du r|}qNt |D ]	}t|	d }qt|	| }qN|du rtd	}|S )
zL
        This method factors out what is essentially grid printing.
        r   rV   c                       g | ]
} |f   qS r:   r   .0r&   ZMsr0   r:   r;   
<listcomp>      z8PrettyPrinter._print_matrix_contents.<locals>.<listcomp>r   Nr   r   )
r   rowscolsrE   r   r   r   r]   rO   r   )r8   rI   Mr&   hsepvsepmaxwDD_rowr   wdeltawleftwrightr   r:   r  r;   _print_matrix_contents  sH   *z$PrettyPrinter._print_matrix_contentsc                 C   s,   |  |}| d |_t|dd }|S )Nr   [])r&  r   r   r   rN   r8   rI   r!  r:   r:   r;   _print_MatrixBase  s   
zPrettyPrinter._print_MatrixBasec                 C      d}| j |jd d |dd dS )Nu   ⊗c                 S      t | td kS Nr   r   r   r|   r:   r:   r;   <lambda>      z4PrettyPrinter._print_TensorProduct.<locals>.<lambda>parenthesizerL   rM   )r8   r@   Zcircled_timesr:   r:   r;   _print_TensorProduct     z"PrettyPrinter._print_TensorProductc                 C   r+  )Nr   c                 S   r,  r-  r.  r/  r:   r:   r;   r0    r1  z3PrettyPrinter._print_WedgeProduct.<locals>.<lambda>r2  r4  )r8   r@   Zwedge_symbolr:   r:   r;   _print_WedgeProduct  r6  z!PrettyPrinter._print_WedgeProductc                 C   s<   |  |j}t|dd }| d |_t|d }|S )NrY   rZ   r   tr)rE   r   r   rN   r   r   rO   r)  r:   r:   r;   _print_Trace
  s
   zPrettyPrinter._print_Tracec                 C   s   ddl m} ddlm} t|j|r+|jjr+|jjr+| 	||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 )Nr   MatrixSymbolr
   z_%d%d, 	delimiterr'  r(  rO   r]   r   )sympy.matricesr;  r   r   r2   parentr&   Z	is_numberr0   rE   rS   r   rN   rL   r   r   r   
prettyFunc
prettyArgs)r8   r@   r;  r   rB  ZprettyIndicesrQ   r:   r:   r;   _print_MatrixElement  s.   
z"PrettyPrinter._print_MatrixElementc                    s   ddl m}  |j}t|j|st|  } 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   r:  c                    sT   t | } | d dkr| d= | d dkrd| d< | d |kr!d| d< t j| dd S )Nr   rV   r   r   :r=  )r   r   rL   )r|   ZdimrC   r:   r;   ppslice.  s   z1PrettyPrinter._print_MatrixSlice.<locals>.ppslicer<  r=  r'  r(  r?  r   )r@  r;  rE   rA  r2   r   rN   rL   Zrowslicer  Zcolslicer  r   r   r   rB  rC  )r8   mr;  rB  rF  rC  rQ   r:   rC   r;   _print_MatrixSlice(  s,   	
z PrettyPrinter._print_MatrixSlicec                 C   s@   |  |j}ddlm} t|j|st|  }|td }|S )Nr   r:  T)rE   r   r@  r;  r2   r   rN   r8   r@   rQ   r;  r:   r:   r;   _print_TransposeC  s   zPrettyPrinter._print_Transposec                 C   sT   |  |j}| jrtd}ntd}ddlm} t|j|s$t|  }|| }|S )Nu   †r  r   r:  )rE   r   rD   r   r@  r;  r2   rN   )r8   r@   rQ   Zdagr;  r:   r:   r;   _print_AdjointK  s   
zPrettyPrinter._print_Adjointc                 C   s(   |j jdkr| |j d S | |j S )NrV   rV   r   r   )ZblocksshaperE   )r8   Br:   r:   r;   _print_BlockMatrixW  s   z PrettyPrinter._print_BlockMatrixc                 C   s   d }|j D ]8}| |}|d u r|}q| d }tt|r-tt|d }| |}ntt|d }tt|| }q|S )Nr   r    + )rM   rE   Zas_coeff_mmulr   r   r   r   r   )r8   r@   r   itemrQ   coeffr:   r:   r;   _print_MatAdd\  s   

zPrettyPrinter._print_MatAddc           	      C   s   t |j}ddlm}m}m}m} t|D ]'\}}t|||||fr5t	|jdkr5t
| |  ||< q| |||< qt
j| S )Nr   )AddMatAddHadamardProductKroneckerProductrV   )r   rM   r   rV  rW  rX  rY  	enumerater2   r   r   rE   rN   __mul__)	r8   r@   rM   rV  rW  rX  rY  r&   ar:   r:   r;   _print_MatMulm  s   

zPrettyPrinter._print_MatMulc                 C      | j rtdS tdS )Nu   𝕀IrD   r   r?   r:   r:   r;   _print_Identityy     zPrettyPrinter._print_Identityc                 C   r^  )Nu   𝟘0r`  r?   r:   r:   r;   _print_ZeroMatrix  rb  zPrettyPrinter._print_ZeroMatrixc                 C   r^  )Nu   𝟙1r`  r?   r:   r:   r;   _print_OneMatrix  rb  zPrettyPrinter._print_OneMatrixc                 C   s4   t |j}t|D ]\}}| |||< q	tj| S r=   )r   rM   rZ  rE   r   r[  r8   r@   rM   r&   r\  r:   r:   r;   _print_DotProduct  s   

zPrettyPrinter._print_DotProductc                 C   sD   |  |j}ddlm} t|j|st|  }||  |j }|S )Nr   r:  )rE   baser@  r;  r2   r   rN   exprJ  r:   r:   r;   _print_MatPow  s   zPrettyPrinter._print_MatPowc                    sJ   ddl mmm  | jrtd}nd}| j|jd d | fdddS )Nr   )rW  MatMulrX  Ringz.*c                    s   t |  fS r=   r2   r/  rX  rW  rl  r:   r;   r0    r1  z6PrettyPrinter._print_HadamardProduct.<locals>.<lambda>r2  )r   rW  rl  rX  rD   r   rL   rM   r8   r@   Zdelimr:   ro  r;   _print_HadamardProduct  s   
z$PrettyPrinter._print_HadamardProductc                 C   sp   | j rtd}n| d}| |j}| |j}t|jtd k r(t|  }tt	
||dtji}|| S )Nrm  .r   r   )rD   r   rE   ri  rj  r   r   r   rN   r   r   r   )r8   r@   circZpretty_baseZ
pretty_expZpretty_circ_expr:   r:   r;   _print_HadamardPower  s   


z"PrettyPrinter._print_HadamardPowerc                    s@   ddl m m | jrd}nd}| j|jd d | fdddS )Nr   rW  rl  u    ⨂ z x c                    s   t |  fS r=   rn  r/  ru  r:   r;   r0    s    z7PrettyPrinter._print_KroneckerProduct.<locals>.<lambda>r2  )r   rW  rl  rD   rL   rM   rp  r:   ru  r;   _print_KroneckerProduct  s   z%PrettyPrinter._print_KroneckerProductc                 C   s"   |  |jj}t|dd }|S Nr'  r(  )rE   lamdar@   r   rN   )r8   Xr!  r:   r:   r;   _print_FunctionMatrix  s   z#PrettyPrinter._print_FunctionMatrixc                 C   sP   |j dks|j |j}}t|t|ddddd}| |S | d| |j S )NrV   r  Fevaluate)r   denr   r	   
_print_MulrE   )r8   r@   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   rM   rZ  r   rE   rN   r[  rg  r:   r:   r;   _print_Series  s   

zPrettyPrinter._print_Seriesc                 C   s   ddl m} t|j}g }tt|D ]7\}}t||r9t|jdkr9| |}|	 d |_
|t|   q| |}|	 d |_
|| qtj| S )Nr   )MIMOParallelrV   r   )sympy.physics.control.ltir  r   rM   rZ  r   r2   r   rE   r   r   r   r   rN   r[  )r8   r@   r  rM   Zpretty_argsr&   r\  Z
expressionr:   r:   r;   _print_MIMOSeries  s   



zPrettyPrinter._print_MIMOSeriesc                 C   sh   d }|j D ],}| |}|d u r|}qtt| }| d |_tt|d }tt|| }q|S )Nr   rR  )rM   rE   r   r   r   r   r   )r8   r@   r   rS  rQ   r:   r:   r;   _print_Parallel  s   

zPrettyPrinter._print_Parallelc                 C   s   ddl m} d }|jD ]8}| |}|d u r|}qtt| }| d |_tt|d }t	||r;| d |_tt|| }q|S )Nr   )TransferFunctionMatrixr   rR  rV   )
r  r  rM   rE   r   r   r   r   r   r2   )r8   r@   r  r   rS  rQ   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|r,t|jjn|jg}t||rEt|j|rE|g ||R  }nYt||ret|j|re|j|krZ|| }nD|g ||jR  }n9t||rt|j|r||kry|| }n%||g|R  }n||kr|| }n|j|kr|| }n	|g ||R  }t	t
| | }	|	 d |	_|jdkrt	t
|	d nt	t
|	d }	t	t
|	| | }	| ||	 S )Nr   )TransferFunctionSeriesrV   r   r  rR   - )sympy.physics.controlr  r  sys1varr2   r   rM   sys2r   r   r   rE   r   r   sign)
r8   r@   r  r  r   Z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r,tt
d| ntt
d| }tt| }d|_tt
|d }| d |_t|td}t|j|rb| d	 |_tt|| }|S )
Nr   )
MIMOSeriesr  r  zI + zI - z-1 r   r   rV   )r  r  r  rE   r  r  r   r   r   r  r]   rN   r   r   r[  r2   )r8   r@   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 )NrV   Ztauz{t})rE   Z	_expr_matr   r   rD   r    r   r]   )r8   r@   matZ	subscriptr:   r:   r;   _print_TransferFunctionMatrix2  s
   z+PrettyPrinter._print_TransferFunctionMatrixc                 C   s  ddl m} | jstd||jkrt|jjS g }g }t||r(| 	 }nd|fg}|D ]M\}}t
|j	 }|jdd d |D ]7\}	}
|
dkrU|d|	j  n |
d	krb|d
|	j  n| |
 d }||d |	j  ||	j qDq/|d dr|d dd  |d< n|d dr|d dd  |d< g }dg}g }t|D ]j\}}|d d|v r|}||| d}d|v rtt|D ]$}d||< || dkr|d | d d ||  ||d d   } nqnd|v rd||< |dd||  }n
|dd||  }|||< qdd |D }tdd |D }d|v rLt|D ]\}}t|dkrJ|ddt|d   d||< q/t|D ]\}}|t|||   t|D ]}|d t|kr|t|kr|dt|d d	 dt|d     ||| kr|||   |||  d 7  < qc||  || d|d	 t||  d   7  < qc|t|kr|dt|d d	 dt|d     ||  d|d	 d  7  < qcqPt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;   r0  I      z5PrettyPrinter._print_BasisDependent.<locals>.<lambda>r   rV   r   r  z(-1) r   rR  r   
u   ⎟u   ⎠u   ⎠ u   ⎞u   ⎞ c                 S   s   g | ]}| d qS )r  )splitr  r|   r:   r:   r;   r        z7PrettyPrinter._print_BasisDependent.<locals>.<listcomp>c                 S   s   g | ]}t |qS r:   )r   r  r:   r:   r;   r    s    c                 S   s   g | ]}|d d qS )Nr:   )r  r   r:   r:   r;   r        )Zsympy.vectorr  rD   NotImplementedErrorZzeror   Z_pretty_formr2   Zseparateitemsr   
componentsr   r   rE   rN   
startswithrZ  r   r   r   r   insertr  join)r8   r@   r  Zo1Zvectstrsr  systemZvectZ
inneritemsr   vZarg_strZlengthsZstrsflagr&   ZpartstrZtempstrZparenZ
n_newlinespartsr0   r:   r:   r;   _print_BasisDependent9  s   






$
 z#PrettyPrinter._print_BasisDependentc           	         sd  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 ]e}|d	 ||  d
}t| d d	d	D ]M}t	||d  |j| k r\ n=|rj|| ||d   n%|| |||d   t	||d  dkr||| d	 gg|| d	< | }g ||d < qKq4|d d }| d dkr||g}| |S )Nr   ImmutableMatrixr:   c                 S   s   g | ]}g qS r:   r:   r  r:   r:   r;   r    r1  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;   r0    r  z0PrettyPrinter._print_NDimArray.<locals>.<lambda>r  TrV   r   )
r   r  rankrE   r   rO  	itertoolsproductr   r   )	r8   r@   Z	level_strZshape_rangesr  Zouter_iZevenZback_outer_iZout_exprr:   r  r;   _print_NDimArray  s8   



zPrettyPrinter._print_NDimArrayc              	   C   sn  t |}t d|  }t d|  }d }d }t|D ]\}	}
| |
jd }|
|v s.|rG||
jkrG|
jr?tt |d }ntt |d }|
|v rctt |d }tt || ||
  }d}nd}|
jrt || }t |d|   }t |d|   }nt || }t |d|   }t |d|   }|
j}qt|	| }t|
| }|S )Nr   r   r   =TF)r   r   rZ  rE   rM   is_upr   r   r]   r   r   )r8   rS   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  )rM   rS   get_indicesr  )r8   r@   rS   r  r:   r:   r;   _print_Tensor  s   zPrettyPrinter._print_Tensorc                 C   s,   |j jd j}|j  }|j}| |||S r  )r@   rM   rS   r  r  r  )r8   r@   rS   r  r  r:   r:   r;   _print_TensorElement  s   
z"PrettyPrinter._print_TensorElementc                    s>   |  \}} fdd|D }tj| }|rt|| S |S )Nc                    8   g | ]}t |td  k rt |  n |qS r   r   r   r   rE   rN   r  rC   r:   r;   r        z0PrettyPrinter._print_TensMul.<locals>.<listcomp>)Z!_get_args_for_traditional_printerr   r[  rO   )r8   r@   r  rM   rQ   r:   rC   r;   _print_TensMul  s   

zPrettyPrinter._print_TensMulc                    s    fdd|j D }tj| S )Nc                    r  r   r  r  rC   r:   r;   r    r  z0PrettyPrinter._print_TensAdd.<locals>.<listcomp>)rM   r   __add__)r8   r@   rM   r:   rC   r;   _print_TensAdd  s   

zPrettyPrinter._print_TensAddc                 C   s    |j d }|js| }| |S r  )rM   r  rE   )r8   r@   r   r:   r:   r;   _print_TensorIndex  s   

z PrettyPrinter._print_TensorIndexc           	      C   s   | j rtd}nd}d }t|jD ]#}| |}t|| }|d u r&|}qt|d }t|| }qt| |j	 dtj
i}t|}t|jdkrX|| t|j }t|tj| }|jd |_tt|| }tj|_|S )Nr   r   r   r   rV   )rD   r!   r   	variablesrE   r   rO   r]   r@   rN   r   r   r   r   r   r   r   r   r   )	r8   r   r   r|   variabler   r   r   rQ   r:   r:   r;   _print_PartialDerivative  s0   

z&PrettyPrinter._print_PartialDerivativec                    s  i  t |jD ]-\}}| |j |df< |jdkr#td |df< qttd| |j  |df< qd}d}t|j fddtdD }d }tD ]p}d }	tdD ]K}
 ||
f }|	 ||
 ksjJ ||
 |	  }|d }|| }t|d	|  }t|
d	|  }|	d u r|}	qXt|	d	|  }	t|	| }	qX|d u r|	}qPt|D ]	}t|d	 }qt||	 }qPt|d
d }| d |_tj|_|S )Nr   TZ	otherwiserV   zfor r   c                    s(   g | ] t  fd dtD qS )c                    r  r:   r  r  )Pr0   r:   r;   r  6  r  z=PrettyPrinter._print_Piecewise.<locals>.<listcomp>.<listcomp>)r   r   r  r  Zlen_args)r0   r;   r  6  s     z2PrettyPrinter._print_Piecewise.<locals>.<listcomp>r   {r   )rZ  rM   rE   r@   condr   r]   r   r   r   rO   r   rN   r   r   OPENr   )r8   Zpexprr   Zecr  r  r   r!  r&   r"  r0   pr#  r$  r%  r   r:   r  r;   _print_Piecewise'  sP   

zPrettyPrinter._print_Piecewisec                 C   s   ddl m} | ||S )Nr   )	Piecewise)Z$sympy.functions.elementary.piecewiser  rE   Zrewrite)r8   Ziter  r:   r:   r;   
_print_ITE_  s   zPrettyPrinter._print_ITEc                 C   sP   d }|D ]}|}|d u r|}qt |d }t || }q|d u r&td}|S )Nr<  r   )r   r]   r   )r8   r  r!  r\  r  r:   r:   r;   _hprint_vecc  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)rO   r]   r>  ifascii_nougly)rO   r]   r>  r   )rD   rL   r   r   r   r   )	r8   p1p2rO   r]   r>  r  tmpsepr:   r:   r;   _hprint_vseparatorr  s   
z PrettyPrinter._hprint_vseparatorc                    s   fdd|j D } fdd|jD } |j}| d |_d }||fD ]} |}|d u r5|}q't|d }t|| }q'| 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                       g | ]}  |qS r:   r   r  r\  rC   r:   r;   r  }  r  z.PrettyPrinter._print_hyper.<locals>.<listcomp>c                    r  r:   r   r  brC   r:   r;   r  ~  r  r   r   rY   rZ   rV   Fr  r  )apbqrE   argumentr   r   r  r   r   rO   r]   r  rN   r#   r   )r8   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 ]} || ||< qCt	d
D ]H}t
|d|f  |d|f  }t	d
D ]0}|||f }	||	  d
 }
||
 |	  }t|	d|
  }	t|	d|  }	|	|||f< qjqSt|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rit|d|  }t|| }||_t|| }|| |_t|d| }|S )Nc                    r  r:   r   r  rC   r:   r;   r    r  z0PrettyPrinter._print_meijerg.<locals>.<listcomp>rN  c                    r  r:   r   r  rC   r:   r;   r    r  )r   rV   c                    r  r:   r   r  rC   r:   r;   r    r  )rV   r   c                    r  r:   r   r  rC   r:   r;   r    r  rM  r   r   rV   r   z  rY   rZ   Gr  r  c                 S   sV   |   |   }|dkr| |fS |dkr| t|d|  fS t| d|   |fS )Nr   r   )r   r   rO   )r  r  diffr:   r:   r;   r    s   z,PrettyPrinter._print_meijerg.<locals>.adjustr<  )ZanZaotherZbmZbotherrE   r  r   r   r  r   r   r   r   rO   r]   r   r  rN   r#   r   r  r  ) r8   rI   r  r  Zvpidxr&   r   r0   r   rO   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  sj   "

zPrettyPrinter._print_meijergc                 C   s"   t tdd}|| |jd  S )NExp1rI   r   )r   r   rE   rM   )r8   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     zPrettyPrinter._print_Exp1c                 C   s   | j |j|j||dS )N)r   	func_name)_helper_print_functionrl   rM   )r8   rI   r   r  r:   r:   r;   r     s   zPrettyPrinter._print_Functionc                 C      | j |ddS NCr  r   rH   r:   r:   r;   _print_mathieuc  r  zPrettyPrinter._print_mathieucc                 C   r  Nr   r  r  rH   r:   r:   r;   _print_mathieus  r  zPrettyPrinter._print_mathieusc                 C   r  )NzC'r  r  rH   r:   r:   r;   _print_mathieucprime  r  z"PrettyPrinter._print_mathieucprimec                 C   r  )NzS'r  r  rH   r:   r:   r;   _print_mathieusprime  r  z"PrettyPrinter._print_mathieusprimer<  c                 C   s   |rt |td}|st|dr|j}|r| t|}n	t| |  }|rB| jr/t	d}nd}| |}tt
||dtji}t| j||d  }	tt
||	dtji}
||
_|	|
_|
S )Nr   rq   zModifier Letter Low Ringrr  r   r=  )r   r   hasattrrq   rE   r   r   rN   rD   r   r   r   r   rL   r   rB  rC  )r8   rl   rM   r   r  r>  elementwiserB  rs  rC  rQ   r:   r:   r;   r    s4   



z$PrettyPrinter._helper_print_functionc                 C   s$   |j }|j}|g}| j||dddS )Nr   T)r>  r  )r   r@   r  )r8   rI   rl   r   rM   r:   r:   r;   _print_ElementwiseApplyFunction;  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  BetarP  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    )r8   r  r  r   r  r  r  r  r:   r:   r;   _special_function_classesA  s   z'PrettyPrinter._special_function_classesc                 C   sf   | j D ]&}t||r)|j|jkr)| jrt| j | d   S t| j | d   S q|j}tt|S )Nr   rV   )r	  
issubclassrq   rD   r   r   )r8   r@   clsr  r:   r:   r;   _print_FunctionClassQ  s   
z"PrettyPrinter._print_FunctionClassc                 C   
   |  |S r=   )rA   r?   r:   r:   r;   _print_GeometryEntity[  s   
z#PrettyPrinter._print_GeometryEntityc                 C       | j rtd nd}| j||dS )Nr  r  r  rD   r    r   r8   rI   r  r:   r:   r;   _print_lerchphi_     zPrettyPrinter._print_lerchphic                 C   r  )NZetaZdirichlet_etar  r  r  r:   r:   r;   _print_dirichlet_etac  r  z"PrettyPrinter._print_dirichlet_etac                 C   sX   | j rtd nd}|jd dkr%t| |jd   }t|| }|S | j||dS )NZthetaZ	HeavisiderV   g      ?r   r  )rD   r    rM   r   rE   rN   rO   r   )r8   rI   r  rQ   r:   r:   r;   _print_Heavisideg  s   zPrettyPrinter._print_Heavisidec                 C   r  r  r  rH   r:   r:   r;   _print_fresnelsp  r  zPrettyPrinter._print_fresnelsc                 C   r  r  r  rH   r:   r:   r;   _print_fresnelcs  r  zPrettyPrinter._print_fresnelcc                 C   r  )NZAir  r  rH   r:   r:   r;   _print_airyaiv  r  zPrettyPrinter._print_airyaic                 C   r  )NZBir  r  rH   r:   r:   r;   _print_airybiy  r  zPrettyPrinter._print_airybic                 C   r  )NzAi'r  r  rH   r:   r:   r;   _print_airyaiprime|  r  z PrettyPrinter._print_airyaiprimec                 C   r  )NzBi'r  r  rH   r:   r:   r;   _print_airybiprime  r  z PrettyPrinter._print_airybiprimec                 C   r  )NWr  r  rH   r:   r:   r;   _print_LambertW  r  zPrettyPrinter._print_LambertWc                 C   sb   |j }|j}| jrd}nd}t|dkr|d jr|d }| |}tt||| |ddiS )Nu    ↦  -> rV   r   r   r  )	r@   	signaturerD   r   Z	is_symbolrE   r   r   r   )r8   rI   r@   ZsigarrowZvar_formr:   r:   r;   _print_Lambda  s   
zPrettyPrinter._print_Lambdac                 C   s  |  |j}|jrtdd |jD st|jdkrxt|d }t|jdkr4t||  |j }nt|jrFt||  |jd  }| jrQt|d }nt|d }t|jdkrkt||  |j }nt||  |jd  }t|	  }t|
d }|S )	Nc                 s   s    | ]}|t jkV  qd S r=   )r   ZZero)r  r  r:   r:   r;   	<genexpr>      z-PrettyPrinter._print_Order.<locals>.<genexpr>rV   ; r   u    → r  O)rE   r@   pointanyr   r  r   r]   rD   rN   rO   r8   r@   rQ   r:   r:   r;   _print_Order  s$   
zPrettyPrinter._print_Orderc                 C   s   | j r0| |jd |jd  }| |jd }td}t|| }t|d }|| }|S | |jd }| |jd |jd  }| |ddd}|| S )Nr   rV   r   r  r  r   )rD   rE   rM   r   r]   rL   )r8   rI   shiftr   ri  rQ   r:   r:   r;   _print_SingularityFunction  s   z(PrettyPrinter._print_SingularityFunctionc                 C   r  )Nr  rP  r  r  r  r:   r:   r;   _print_beta  r  zPrettyPrinter._print_betac                 C      d}| j ||dS )NzB'r  r  r  r:   r:   r;   _print_betainc     zPrettyPrinter._print_betaincc                 C   r-  )Nr_  r  r  r  r:   r:   r;   _print_betainc_regularized  r/  z(PrettyPrinter._print_betainc_regularizedc                 C       | j rtd nd}| j||dS Nr  r  r  r  r:   r:   r;   _print_gamma  r  zPrettyPrinter._print_gammac                 C   r1  r2  r  r  r:   r:   r;   _print_uppergamma  r  zPrettyPrinter._print_uppergammac                 C   r  )Nr  r   r  r  r  r:   r:   r;   _print_lowergamma  r  zPrettyPrinter._print_lowergammac                 C   s   | j rYt|jdkr@ttd }| |jd }t|  }| |jd }t|  }|| }t|d }t|| }|S | |jd }t|  }t|td  }|S | 	|S )Nr   r  rV   r   r   )
rD   r   rM   r   r    rE   rN   r]   rO   r   )r8   rI   r\  r  crQ   r:   r:   r;   _print_DiracDelta  s    
zPrettyPrinter._print_DiracDeltac                 C   sJ   ddl m} |jd jr | jr | |d|jd  |jd S | |S )Nr   )FunctionzE_%srV   )r   r8  rM   rx   rD   r   )r8   rI   r8  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   rL   rM   rN   r   r   r   rB  rC  )r8   rI   rB  rC  rQ   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   rV   r  )rE   rM   r   r  r   rN   rO   )r8   rI   pforma0rQ   pforma1r:   r:   r;   _print_elliptic_e  s   zPrettyPrinter._print_elliptic_ec                 C   s.   |  |jd }t|  }t|d }|S )Nr   K)rE   rM   r   rN   rO   rP   r:   r:   r;   _print_elliptic_k  s   zPrettyPrinter._print_elliptic_kc                 C   sJ   |  |jd }|  |jd }| ||}t|  }t|d }|S )Nr   rV   r  )rE   rM   r  r   rN   rO   )r8   rI   r;  r<  rQ   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r'| ||}n| |jd }| j||dd}t|d }t|| }t|  }t|| }|S )NZPir   rV   r   Fr  r$  )	rD   r    rE   rM   r   r  r   rO   rN   )r8   rI   rS   r;  r<  rQ   Zpforma2Zpformar:   r:   r;   _print_elliptic_pi  s   z PrettyPrinter._print_elliptic_pic                 C       | j r	ttdS | tdS )NZphiZGoldenRatiorD   r   r   rE   r   r?   r:   r:   r;   _print_GoldenRatio     z PrettyPrinter._print_GoldenRatioc                 C   rC  )Nr  Z
EulerGammarD  r?   r:   r:   r;   _print_EulerGamma#  rF  zPrettyPrinter._print_EulerGammac                 C   s\   |  |jd }|jtjkrt|  }t|d }t||  |jd  }tj|_|S )Nr   z mod rV   )rE   rM   r   r   r   rN   r]   r  r(  r:   r:   r;   
_print_Mod(  s   zPrettyPrinter._print_Modc                 C   s  | j ||d}g g }}dd }t|D ]z\}}|jrMt|rM|jdd\}	}
|	dkr3t|
ddi}nt|	 g|
R ddi}| |}|||| q|jr`|j	dkr`|d  || q|j
rv|d	k rv| | }|||| q|jr|t| |   q|| | q|rd
}|D ]}|d ur| dkr nqd}|D ]4}|| d}}|d	k r| d
}}|rtt|jtt|j	 }n| |}|r|||}|||< qtj| S )Nr'   c                 S   sj   |dkr|   dkrd}nd}nd}| jtjks| jtjkr%t|   }n| }t||}t|dtjiS )z'Prepend a minus sign to a pretty form. r   rV   z- r   r  r   )r   r   r   NEGZADDr   rN   r   )rQ   r  Z	pform_negr  r:   r:   r;   pretty_negative5  s   
z1PrettyPrinter._print_Add.<locals>.pretty_negativeF)Zrationalr  r|  rV   r   T)Z_as_ordered_termsrZ  Zis_Mulr   Zas_coeff_mulr   rE   r   is_RationalqZ	is_Numberis_Relationalr   rN   r   r4   r  r  )r8   r@   r'   Ztermspformsr  rK  r&   r   rT  otherZnegtermrQ   Zlargenegativer:   r:   r;   
_print_Add1  sL   






zPrettyPrinter._print_Addc                    s  ddl m  |j}|d tju stdd |dd  D rItt| j|}|d dk}|r5t	ddd|d< t	j
| }|rGt	d|j |j|j}|S g }g }| jd	vrW| }nt|j}t| fd
dd}|D ]W}|jr|jr|jjr|jjr|jdkr|t|j|j dd qh|t|j|j  qh|jr|tjur|jdkr|t|j |jdkr|t|j qh|| qhddlm}	m}
m }m!} t"dt#|D ]M}|| j$rt#|dks|t#|d krt%|| |	|
||frt	| || &  ||< q|| j'rt	| || &  ||< q| || ||< qt"dt#|D ]=}|| j$r7t#|dksL|t#|d kr[t%|| |	|
||fr[t	| || &  ||< q(| || ||< q(t#|dkrrt	j
| S t#|dkr|| tj t	j
| t	j
|  S )Nr   Quantityc                 s   s    | ]}t |tV  qd S r=   )r2   r   r  r   r:   r:   r;   r"    r#  z+PrettyPrinter._print_Mul.<locals>.<genexpr>rV   z-1re  r   )oldZnonec                    s    t |  pt | tot | j S r=   )r2   r	   ri  r/  rS  r:   r;   r0    s   
 z*PrettyPrinter._print_Mul.<locals>.<lambda>r   r  Fr{  )Integralr  ProductSum)(Zsympy.physics.unitsrT  rM   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   rW  r  rX  rY  r   r   r   r2   rN   rN  )r8   r  rM   ZstrargsZnegoneobjr\  r  rS  rW  r  rX  rY  r&   r:   rS  r;   r~  y  sb   (






(,
zPrettyPrinter._print_Mulc           	         st  |  |}| jd r*| jr*|dkr*| dkr*| dks#|jr*|jr*t|d S t	dd t	dd  }|  |}| dkrM|  ||  d|  S |dkrSdnt
|d}t|dkrjd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   rV   u   √r  \r   r   r  r   c                 3   s,    | ]}d | d    d |  V  qdS )r   rV   Nr:   r  Z_zZZ
linelengthr:   r;   r"    s
    
z0PrettyPrinter._print_nth_root.<locals>.<genexpr>r   )rE   r3   rD   r   r   rx   ry   r   rO   r   r4   ljustr   r   r   r  r   r]   r   r   r   )	r8   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rU|tju rtd| | S ||\}}|tju r?|j	r?|j
s?|js4|jr?| jd r?| ||S |jrU|dk rUtd| t|| dd S |jrgt| |  | |S | || | S )Nr   )fractionre  r,   Fr{  )Zsympy.simplify.simplifyrc  Zas_base_expr\  r   ZNegativeOner   rE   rZ  Zis_Atomrx   rL  rz   r3   rb  r	   rN  rN   __pow__)r8   Zpowerrc  r  rI   r   r   r:   r:   r;   
_print_Pow  s   
"zPrettyPrinter._print_Powc                 C   s   |  |jd S r  )rE   rM   r?   r:   r:   r;   _print_UnevaluatedExpr     z$PrettyPrinter._print_UnevaluatedExprc                 C   s   |dkr|dk rt t|t jdS t t|S t|dkrBt|dkrB|dk r6t t|t jdt t| S t t|t t| S d S )NrV   r   )r   
   )r   r4   rJ  abs)r8   r  rM  r:   r:   r;   Z__print_numer_denom  s   z!PrettyPrinter.__print_numer_denomc                 C   &   |  |j|j}|d ur|S | |S r=   )!_PrettyPrinter__print_numer_denomr  rM  rA   r8   r@   r   r:   r:   r;   _print_Rational     
zPrettyPrinter._print_Rationalc                 C   rj  r=   )rk  	numeratordenominatorrA   rl  r:   r:   r;   _print_Fraction!  rn  zPrettyPrinter._print_Fractionc                 C   sd   t |jdkrt|js| |jd | t |j S | jr!dnd}| j|jd d d| dd dS )	NrV   r      ×r|   r   c                 S      | j p| jp| jS r=   )is_Unionis_Intersectionis_ProductSetsetr:   r:   r;   r0  /      z1PrettyPrinter._print_ProductSet.<locals>.<lambda>r2  )r   setsr   rE   rD   rL   )r8   r  Z	prod_charr:   r:   r;   _print_ProductSet)  s    zPrettyPrinter._print_ProductSetc                 C   s   t |jtd}| |dddS )Nr   r  }r<  )r   rM   r   rL   )r8   r   r  r:   r:   r;   _print_FiniteSet2  s   zPrettyPrinter._print_FiniteSetc                 C   s   | j rd}nd}|jjr$|jjr$|jjr|ddd|f}nF|ddd|f}n>|jjr5||d |j |d f}n-|jjrGt|}t|t||f}nt|dkr^t|}t|t|||d f}nt	|}| 
|ddd	S )
N   …...r  r   rV   r   r  r|  r<  )rD   startZis_infinitestopstepZis_positiveiterr   r   r   rL   )r8   r   dotsprintsetitr:   r:   r;   _print_Range6  s"   zPrettyPrinter._print_Rangec                 C   s\   |j |jkr| |jd d ddS |jrd}nd}|jr d}nd}| |jd d ||S )	NrV   r  r|  rY   r'  rZ   r(  r   )r  endrL   rM   Z	left_openZ
right_openr8   r&   rO   r]   r:   r:   r;   _print_IntervalO  s   zPrettyPrinter._print_Intervalc                 C   s    d}d}|  |jd d ||S )Nr  r  r   r4  r  r:   r:   r;   _print_AccumulationBounds`  s   z'PrettyPrinter._print_AccumulationBoundsc                 C   (   dt dd }| j|jd d |dd dS )Nr   ZIntersectionr   c                 S   rs  r=   )rv  rt  is_Complementrw  r:   r:   r;   r0  k  ry  z3PrettyPrinter._print_Intersection.<locals>.<lambda>r2  r   rL   rM   r8   r   r>  r:   r:   r;   _print_Intersectionf     z!PrettyPrinter._print_Intersectionc                 C   r  )Nr   ZUnionr!   c                 S   rs  r=   )rv  ru  r  rw  r:   r:   r;   r0  s  ry  z,PrettyPrinter._print_Union.<locals>.<lambda>r2  r  )r8   r   Zunion_delimiterr:   r:   r;   _print_Unionn  r  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   rL   rM   )r8   r   Zsym_delimeterr:   r:   r;   _print_SymmetricDifferencev  s   z(PrettyPrinter._print_SymmetricDifferencec                 C   r+  )Nz \ c                 S   rs  r=   )rv  ru  rt  rw  r:   r:   r;   r0    s    z1PrettyPrinter._print_Complement.<locals>.<lambda>r2  r4  r  r:   r:   r;   _print_Complement~  s   zPrettyPrinter._print_Complementc                    s   | j rd nd |j}|j}|j}| |j}t|dkr6| 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 )N   ∊inrV   r   r   r=  r  r|  TrO   r]   r  r>  c                 3   s.    | ]\}}|d  d |dfD ]}|V  qqdS )r   r<  Nr:   )r  r  Zsetvr0   innr:   r;   r"    s   
 z0PrettyPrinter._print_ImageSet.<locals>.<genexpr>r  r   )rD   rx  Z	base_setsr  rE   r@   r   rL   r  r   r   )r8   tsfunrz  r  r@   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r(| |j }n| |j}| j r<| |}t|	  }|j
tju rM| 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  r|  Tr   r  r=  )rD   rL   r   r   getattrZ	conditionrE   r  r   rN   Zbase_setr   UniversalSetr  )	r8   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   r=  r  r|  Tr  )rD   rL   r  rE   r@   rz  r  )r8   r  r  r  r@   Zprodsetsr  r:   r:   r;   _print_ComplexRegion  s   z"PrettyPrinter._print_ComplexRegionc                 C   sD   |j \}}| jrd}tt| ||| |ddiS tt|S )Nu    ∈ r   r  )rM   rD   r   r   r   rE   r   )r8   rI   r  rx  elr:   r:   r;   _print_Contains  s   

zPrettyPrinter._print_Containsc                 C   s(   | j rd}nd}| | | | S )Nr~  r  )rD   rR  truncaterE   )r8   r   r  r:   r:   r;   _print_FourierSeries  s   z"PrettyPrinter._print_FourierSeriesc                 C      |  |jS r=   )rR  Zinfiniter8   r   r:   r:   r;   _print_FormalPowerSeries  rB   z&PrettyPrinter._print_FormalPowerSeriesc                 C   s0   t | |j  }| td}t || S )NZSetExpr)r   rE   rx  rN   r   r]   )r8   Z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st|jjdkrtd|jtju r?|j}|||d ||d ||d ||f}n|jtj	u sJ|j
dkrZ|d d }|| t|}nt|}| |S )	Nr~  r  r   z@Pretty printing of sequences with symbolic bound not implementedr   r   rV   r   )rD   r   r  Zfree_symbolsr  r  r   r  rT  r  lengthr   r   _print_list)r8   r   r  r  r  r:   r:   r;   _print_SeqFormula  s     


zPrettyPrinter._print_SeqFormulac                 C   s   dS )NFr:   r/  r:   r:   r;   r0  	  s    zPrettyPrinter.<lambda>c              	   C   s   z2g }|D ]}|  |}	||rt|	  }	|r|| ||	 q|s*td}
nttj|  }
W n> typ   d }
|D ](}| |}	||rNt|	  }	|
d u rU|	}
q=tt|
| }
tt|
|	 }
q=|
d u rntd}
Y nw t|
j|||d }
|
S )Nr   rA  )rE   r   rN   r   r   r   AttributeErrorrF   )r8   seqrO   r]   r>  r3  r  rO  rS  rQ   r   r:   r:   r;   rL   	  s:   



zPrettyPrinter._print_seqc                 C   sL   d }|D ]}|d u r|}qt || }t || }q|d u r$t dS |S )Nr   )r   r]   )r8   r>  rM   rQ   r   r:   r:   r;   r  *	  s   zPrettyPrinter.joinc                 C      |  |ddS rw  rL   )r8   r   r:   r:   r;   r  9	  r  zPrettyPrinter._print_listc                 C   sH   t |dkrtt| |d d }t|jdddd S | |ddS )NrV   r   r   rY   rZ   TrA  )r   r   r   r   rE   rN   rL   )r8   r  Zptupler:   r:   r;   _print_tuple<	  s   zPrettyPrinter._print_tuplec                 C   r  r=   )r  r?   r:   r:   r;   _print_TupleC	     
zPrettyPrinter._print_Tuplec                 C   s`   t | td}g }|D ]}| |}| || }tt|d| }|| q| |ddS )Nr   z: r  r|  )	r   keysr   rE   r   r   r   r   rL   )r8   r   r  r  r   r>  Vr   r:   r:   r;   _print_dictF	  s   
zPrettyPrinter._print_dictc                 C   r  r=   )r  )r8   r   r:   r:   r;   _print_DictS	  r  zPrettyPrinter._print_Dictc                 C   s:   |st dS t|td}| |}t |jdddd }|S )Nzset()r   r  r|  TrA  )r   r   r   rL   rN   r8   r   r  prettyr:   r:   r;   
_print_setV	  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  r|  TrA  rY   rZ   )	r   r   r   rL   rN   r   r   typerq   r  r:   r:   r;   _print_frozenset^	  s   
zPrettyPrinter._print_frozensetc                 C   r^  )Nu   𝕌r  r`  r  r:   r:   r;   _print_UniversalSeth	  rb  z!PrettyPrinter._print_UniversalSetc                 C   r<   r=   r   r   )r8   ringr:   r:   r;   _print_PolyRingn	  rB   zPrettyPrinter._print_PolyRingc                 C   r<   r=   r  )r8   fieldr:   r:   r;   _print_FracFieldq	  rB   zPrettyPrinter._print_FracFieldc                 C   r<   r=   r>   )r8   Zelmr:   r:   r;   _print_FreeGroupElementt	  rB   z%PrettyPrinter._print_FreeGroupElementc                 C   r<   r=   r  )r8   Zpolyr:   r:   r;   _print_PolyElementw	  rB   z PrettyPrinter._print_PolyElementc                 C   r<   r=   r  )r8   Zfracr:   r:   r;   _print_FracElementz	  rB   z PrettyPrinter._print_FracElementc                 C   s&   |j r| |  S | | 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  r@   r  r   rL   rN   rO   r8   r@   rM   rQ   r:   r:   r;   _print_ComplexRootOf	  s   z"PrettyPrinter._print_ComplexRootOfc                 C   sT   | j |jddg}|jtjur|| |j t| |	  }t|
d }|S )Nr  rI  ZRootSum)rR  r@   r  r   ZIdentityFunctionr   rE   r   rL   rN   rO   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)r8   r@   Zformr:   r:   r;   _print_FiniteField	  s   z PrettyPrinter._print_FiniteFieldc                 C   r^  )Nu   ℤZZZr`  r?   r:   r:   r;   _print_IntegerRing	  rb  z PrettyPrinter._print_IntegerRingc                 C   r^  )Nu   ℚZQQr`  r?   r:   r:   r;   _print_RationalField	  rb  z"PrettyPrinter._print_RationalFieldc                 C   :   | j rd}nd}|jrt|S | t|d t|j S )Nu   ℝZRRr   rD   Zhas_default_precisionr   rE   r   r4   Z	precisionr8   domainprefixr:   r:   r;   _print_RealField	     zPrettyPrinter._print_RealFieldc                 C   r  )Nu   ℂZCCr   r  r  r:   r:   r;   _print_ComplexField	  r  z!PrettyPrinter._print_ComplexFieldc                 C   ^   t |j}|jjsttd| |j }|| | |dd}t|	| |j
 }|S Norder=r'  r(  r   symbolsr'   Z
is_defaultr   r]   rE   r   rL   rO   r  r8   r@   rM   r'   rQ   r:   r:   r;   _print_PolynomialRing	     

z#PrettyPrinter._print_PolynomialRingc                 C   r  )Nr  rY   rZ   r  r  r:   r:   r;   _print_FractionField	  r  z"PrettyPrinter._print_FractionFieldc                 C   sV   |j }t|jt|jkr|dt|j f }| |dd}t|| |j }|S r  )	r  r4   r'   Zdefault_orderrL   r   rO   rE   r  )r8   r@   grQ   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  basisr8   r:   r;   r  	  s    z6PrettyPrinter._print_GroebnerBasis.<locals>.<listcomp>r<  r'  r(  r?  c                    r  r:   r   )r  genrC   r:   r;   r  	  r  zdomain=r  )exprsr   r  rN   gensr]   rE   r  r'   rO   rp   rq   )r8   r  r  r  r  r'   rQ   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 )NrV   r   r   r  c              	      s8   g | ]} j  |d  td |d fddqS )r   r   rV   r   r=  )rL   rE   r   )r  r  rC   r:   r;   r  	  s    $z-PrettyPrinter._print_Subs.<locals>.<listcomp>)rE   r@   r   rN   r   r   r   r   r]   rL   r   r  r&  )r8   rI   rQ   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r+|S |j\}}|}t | |g  }	t t	
||	dt ji}||_|	|_|S )Nr   r   rV   r   )r   rE   rM   r   r   r]   r   rL   rN   r   r   r   rB  rC  )
r8   rI   rS   rQ   r   r   rG  r|   rB  rC  r:   r:   r;   _print_number_function
  s$   

z$PrettyPrinter._print_number_functionc                 C      |  |dS )Nr  r  rH   r:   r:   r;   _print_euler
  rB   zPrettyPrinter._print_eulerc                 C   r  )Nr  r  rH   r:   r:   r;   _print_catalan
  rB   zPrettyPrinter._print_catalanc                 C   r  )NrP  r  rH   r:   r:   r;   _print_bernoulli
  rB   zPrettyPrinter._print_bernoullic                 C   r  )NLr  rH   r:   r:   r;   _print_lucas"
  rB   zPrettyPrinter._print_lucasc                 C   r  )Nr  r  rH   r:   r:   r;   _print_fibonacci%
  rB   zPrettyPrinter._print_fibonaccic                 C   r  )NrI  r  rH   r:   r:   r;   _print_tribonacci(
  rB   zPrettyPrinter._print_tribonaccic                 C   s   | j r	| |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r(ttd}ntd}|}t|d|   }t|d|   }t|	|dtj
iS )Nr   r   rV   r  r   r   r   )rE   rM   r   r]   rD   r   r   rO   r   r   ZPOW)r8   rI   rQ   r\  r  r  r  r:   r:   r;   _print_KroneckerDelta1
  s   z#PrettyPrinter._print_KroneckerDeltac                 C   s   t |dr| d}t|| |  }|S t |drD| d}t|| |j }t|| d }t|| |j }|S t |dr[| d}t|| |j }|S | d S )N
as_booleanzDomain: rx  z in r  z
Domain on )r  rE   r   r]   r  r  rx  )r8   r   rQ   r:   r:   r;   _print_RandomDomain>
  s   






z!PrettyPrinter._print_RandomDomainc                 C   sD   z|j d ur| |j |W S W n	 ty   Y nw | t|S r=   )r  rE   Zto_sympyr   reprr8   r  r:   r:   r;   
_print_DMPP
  s   
zPrettyPrinter._print_DMPc                 C   r  r=   )r  r  r:   r:   r;   
_print_DMFY
  r  zPrettyPrinter._print_DMFc                 C      |  t|jS r=   rE   r   rS   )r8   objectr:   r:   r;   _print_Object\
  rg  zPrettyPrinter._print_Objectc                 C   s8   t d}| |j}| |j}|||d }t|S )Nz-->r   )r   rE   r  codomainr]   r   )r8   morphismr   r  r  tailr:   r:   r;   _print_Morphism_
  s
   zPrettyPrinter._print_Morphismc                 C   s.   |  t|j}| |}t|d|d S )NrE  r   )rE   r   rS   r  r   r]   )r8   r  r  pretty_morphismr:   r:   r;   _print_NamedMorphismh
  s   
z"PrettyPrinter._print_NamedMorphismc                 C   s"   ddl m} | ||j|jdS )Nr   )NamedMorphismid)Zsympy.categoriesr  r  r  r  )r8   r  r  r:   r:   r;   _print_IdentityMorphismm
  s   z%PrettyPrinter._print_IdentityMorphismc                 C   sT   t d}dd |jD }|  ||d }| |}| |}t||d S )Nrr  c                 S   s   g | ]}t |jqS r:   )r   rS   )r  Z	componentr:   r:   r;   r  x
  s    z:PrettyPrinter._print_CompositeMorphism.<locals>.<listcomp>rE  r   )r   r  reverser  rE   r  r   r]   )r8   r  ZcircleZcomponent_names_listZcomponent_namesr  r  r:   r:   r;   _print_CompositeMorphismr
  s   

z&PrettyPrinter._print_CompositeMorphismc                 C   r  r=   r  )r8   categoryr:   r:   r;   _print_Category
  rg  zPrettyPrinter._print_Categoryc                 C   sX   |j s	| tjS | |j }|jr&dtd }| |jd }|||}t|d S )Nr   z==>r   )ZpremisesrE   r   ZEmptySetZconclusionsr   r]   r   )r8   ZdiagramZpretty_resultZresults_arrowZpretty_conclusionsr:   r:   r;   _print_Diagram
  s   zPrettyPrinter._print_Diagramc                    s@   ddl m} ddlm  | fddtjD }| |S )Nr   )Matrixr
   c                    s(   g | ]  fd dt jD qS )c                    s,   g | ]}|f r|f n d qS )r   r:   )r  r0   )r   gridr&   r:   r;   r  
  s    $z?PrettyPrinter._print_DiagramGrid.<locals>.<listcomp>.<listcomp>)r   r   r  r   r  )r&   r;   r  
  s
    
z4PrettyPrinter._print_DiagramGrid.<locals>.<listcomp>)r@  r  r   r   r   r   r&  )r8   r  r  matrixr:   r  r;   _print_DiagramGrid
  s   
z PrettyPrinter._print_DiagramGridc                 C   r  rw  r  r8   rG  r:   r:   r;   _print_FreeModuleElement
  s   z&PrettyPrinter._print_FreeModuleElementc                 C   s   |  |jddS )Nr  r  )rL   r  r8   r  r:   r:   r;   _print_SubModule
  rg  zPrettyPrinter._print_SubModulec                 C   s   |  |j|  |j S r=   )rE   r  r  r  r:   r:   r;   _print_FreeModule
  rG   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  
  s    z?PrettyPrinter._print_ModuleImplementedIdeal.<locals>.<listcomp>r  r  )rL   _moduler  r  r:   r:   r;   _print_ModuleImplementedIdeal
  s   z+PrettyPrinter._print_ModuleImplementedIdealc                 C      |  |j|  |j S r=   )rE   r  
base_idealr8   Rr:   r:   r;   _print_QuotientRing
  rG   z!PrettyPrinter._print_QuotientRingc                 C      |  |j|  |jj S r=   )rE   datar  r  r  r:   r:   r;   _print_QuotientRingElement
     z(PrettyPrinter._print_QuotientRingElementc                 C   r   r=   )rE   r!  modulekilled_moduler  r:   r:   r;   _print_QuotientModuleElement
  r#  z*PrettyPrinter._print_QuotientModuleElementc                 C   r  r=   )rE   ri  r%  r  r:   r:   r;   _print_QuotientModule
  rG   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  )r8   r   r  rQ   r:   r:   r;   _print_MatrixHomomorphism
  s   z'PrettyPrinter._print_MatrixHomomorphismc                 C   r  r=   rE   rS   )r8   Zmanifoldr:   r:   r;   _print_Manifold
  rB   zPrettyPrinter._print_Manifoldc                 C   r  r=   r)  )r8   Zpatchr:   r:   r;   _print_Patch
  rB   zPrettyPrinter._print_Patchc                 C   r  r=   r)  )r8   Zcoordsr:   r:   r;   _print_CoordSystem
  rB   z PrettyPrinter._print_CoordSystemc                 C   s   |j j|j j}| t|S r=   )
_coord_sysr  _indexrS   rE   r   )r8   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.  rS   rE   r   )r8   r  r   r:   r:   r;   _print_BaseVectorField
  s   z$PrettyPrinter._print_BaseVectorFieldc                 C   sV   |j }t|dr|jj|j j}| dt| S | |}t|	  }t|
d S )Nr-  u   ⅆ u   ⅆ)Z_form_fieldr  r-  r  r.  rS   rE   r   r   rN   rO   )r8   r  r  r/  rQ   r:   r:   r;   _print_Differential
  s   

z!PrettyPrinter._print_Differentialc                 C   s8   |  |jd }t|d|jj  }t|d }|S )Nr   z%s(rZ   )rE   rM   r   rO   rp   rq   r]   )r8   r  rQ   r:   r:   r;   	_print_Tr
  s   zPrettyPrinter._print_Trc                 C   J   |  |jd }t|  }| jrt|td  }|S t|d }|S )Nr   ZnurE   rM   r   rN   rD   rO   r    rP   r:   r:   r;   _print_primenu
     zPrettyPrinter._print_primenuc                 C   r4  )Nr   ZOmegar5  rP   r:   r:   r;   _print_primeomega
  r7  zPrettyPrinter._print_primeomegac                 C   s$   |j j dkr| d}|S | |S )NZdegree   °)rS   rE   rA   rP   r:   r:   r;   _print_Quantity
  s   

zPrettyPrinter._print_Quantityc                 C   r   r   )r   r   r   rE   r   r   r   r   r   r:   r:   r;   _print_AssignmentBase
  s
   z#PrettyPrinter._print_AssignmentBasec                 C   r  r=   r)  r  r:   r:   r;   
_print_Str
  rB   zPrettyPrinter._print_Strr=   )F)T)NNr   F)FN)FNr<  F)rq   
__module____qualname____doc__ZprintmethodZ_default_settingsr1   rA   propertyrD   rF   rJ   rK   rR   rT   Z_print_RandomSymbolrU   rW   r_   re   rh   ri   rm   ro   rs   Z_print_InfinityZ_print_NegativeInfinityZ_print_EmptySetZ_print_NaturalsZ_print_Naturals0Z_print_IntegersZ_print_RationalsZ_print_ComplexesZ_print_EmptySequencert   r}   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*  r5  r7  r9  rD  rH  rK  rL  rQ  rU  r]  ra  rd  rf  rh  rk  rq  rt  rv  rz  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  r3  r4  r5  r7  r9  r:  r=  r?  r@  rB  rE  rG  rH  rR  r~  rb  re  rf  rk  rm  rq  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  Z_print_SeqPerZ_print_SeqAddZ_print_SeqMulrL   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,  r0  r1  r2  r3  r6  r8  r:  r;  r<  r:   r:   r:   r;   r$      s    
					%"K6aE		$d!# 8	0T"

		HM,		)
			
			r$   c                 K   s:   t |}|jd }t|}z
|| W t| S t| w )zReturns a string containing the prettified form of expr.

    For information on keyword arguments see pretty_print function.

    r)   )r$   r3   r   rF   )r@   r9   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  )r@   kwargsr:   r:   r;   pretty_print  s   +rC  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)pydocrD  localerE  r  encode)r@   r9   rD  rE  r:   r:   r;   pager_printF  s
    rI  )9r  Z
sympy.corer   Zsympy.core.containersr   Zsympy.core.functionr   Zsympy.core.mulr   Zsympy.core.numbersr   r   Zsympy.core.powerr	   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.utilitiesr   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  rC  ZpprintrI  r:   r:   r:   r;   <module>   s^    4                     {
-