B
    dd&                 @   s~   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 G d	d
 d
Ze ZZdS )    )Expr)Dummy)_sympify)CoercionFailed)Polyparallel_poly_from_expr)QQ)DomainMatrix)DomainScalarc                   s&  e Zd ZdZddddZedd Ze fdd	Zd
d ZeddddZ	dd Z
dd Zedd Zedd Zedd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zed2d3 Zed4d5 Zd=d7d8Zd9d: Z d;d< Z!  Z"S )>MutablePolyDenseMatrixax  
    A mutable matrix of objects from poly module or to operate with them.

    Examples
    ========

    >>> from sympy.polys.polymatrix import PolyMatrix
    >>> from sympy import Symbol, Poly
    >>> x = Symbol('x')
    >>> pm1 = PolyMatrix([[Poly(x**2, x), Poly(-x, x)], [Poly(x**3, x), Poly(-1 + x, x)]])
    >>> v1 = PolyMatrix([[1, 0], [-1, 0]], x)
    >>> pm1*v1
    PolyMatrix([
    [    x**2 + x, 0],
    [x**3 - x + 1, 0]], ring=QQ[x])

    >>> pm1.ring
    ZZ[x]

    >>> v1*pm1
    PolyMatrix([
    [ x**2, -x],
    [-x**2,  x]], ring=QQ[x])

    >>> pm2 = PolyMatrix([[Poly(x**2, x, domain='QQ'), Poly(0, x, domain='QQ'), Poly(1, x, domain='QQ'),             Poly(x**3, x, domain='QQ'), Poly(0, x, domain='QQ'), Poly(-x**3, x, domain='QQ')]])
    >>> v2 = PolyMatrix([1, 0, 0, 0, 0, 0], x)
    >>> v2.ring
    QQ[x]
    >>> pm2*v2
    PolyMatrix([[x**2]], ring=QQ[x])

    N)ringc               s  |s,|d krt dddg df\} }}nFt|d tr|d |dd   }}|sfddg   } }nJt|d ttfrt|t|d  } dd |D }nt|d } |}ndd |d d D tttgk r|d |d |d	 |dd  f\} }}ntd
d |d d D tttdd gkrj|d |d |d	 |dd  f\} } fddt|D }nt dt|dkrt|d tr|d }| | |||S )Nz6The ring needs to be specified for an empty PolyMatrixr       c             S   s   g | ]}|D ]}|qqS r   r   ).0rower   r   c/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sympy/polys/polymatrix.py
<listcomp>?   s    z2MutablePolyDenseMatrix.__new__.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )type)r   ar   r   r   r   D   s          c             S   s   g | ]}t |qS r   )r   )r   r   r   r   r   r   G   s    c               S   s   dS )Nr   r   r   r   r   r   <lambda>G       z0MutablePolyDenseMatrix.__new__.<locals>.<lambda>c                s$   g | ]}t  D ]}||qqS r   )range)r   ij)colsfuncr   r   r   J   s    zInvalid arguments)		TypeError
isinstancelisttuplelenintr   r   	from_list)clsr   argsrowsitemsgenselementsr   )r   r   r   __new__0   s,    "**(zMutablePolyDenseMatrix.__new__c                sB  dd |D }|r*t dd |D r*d}nd}|d k	rTt|trtdt |dj}nd|r|d }x"|d	d  D ]}||\}}	qnW |j|j }n&t||dd
\}}
|
d |
d  }d}|rtd|j	|jd|j
jfddfdd|D n|jfdd|D  fddt|D }t|| f|}| |S )Nc             S   s   g | ]}t |qS r   )r   )r   itemr   r   r   r   Y   s    z4MutablePolyDenseMatrix.from_list.<locals>.<listcomp>c             s   s   | ]}t |tV  qd S )N)r    r   )r   r-   r   r   r   	<genexpr>Z   s    z3MutablePolyDenseMatrix.from_list.<locals>.<genexpr>TFr   )domainr   )fieldr/   r*   c                s   |   d jjS )Nr   )unifyrep)p)p_ringto_ringr   r   r   r   r   z2MutablePolyDenseMatrix.from_list.<locals>.<lambda>c                s   g | ]} |qS r   r   )r   r3   )convert_polyr   r   r   s   s    c                s   g | ]} |  qS r   )as_expr)r   r   )convert_exprr   r   r   v   s    c                s&   g | ]  fd dt D qS )c                s   g | ]}  |  qS r   r   )r   r   )r   r+   r   r   r   r   y   s    z?MutablePolyDenseMatrix.from_list.<locals>.<listcomp>.<listcomp>)r   )r   )r   r+   )r   r   r   y   s    )allr    strr   r   r/   r1   r*   r   symbolsr   r%   
from_sympyr   r	   from_dm)r&   r(   r   r)   r*   r   Zpolysr3   p2_infoZelements_loldmr   )r   r8   r6   r+   r4   r5   r   r%   U   s2    
z MutablePolyDenseMatrix.from_listc                s:   t  | }| }|j}||_||_|j|_|j|_|S )N)superr,   Z	to_sparser/   _dmr   r;   r*   )r&   rA   objR)	__class__r   r   r=   }   s    zMutablePolyDenseMatrix.from_dmc             C   s
   | j  S )N)rC   	to_Matrix)selfr   r   r   rG      s    z MutablePolyDenseMatrix.to_Matrixc            G   s   | |j | f|d|iS )Nr   )shapeflat)r&   otherr   r*   r   r   r   from_Matrix   s    z"MutablePolyDenseMatrix.from_Matrixc             C   s   |  |  |S )N)rL   rG   )rH   r*   r   r   r   set_gens   s    zMutablePolyDenseMatrix.set_gensc             C   sT   | j | j r2dt|  d d  d| j d S d| j  d| j d| j dS d S )Nr   z, ring=)zPolyMatrix(z, z, [], ring=)r(   r   reprrG   r   )rH   r   r   r   __repr__   s    &zMutablePolyDenseMatrix.__repr__c             C   s   | j jS )N)rC   rI   )rH   r   r   r   rI      s    zMutablePolyDenseMatrix.shapec             C   s
   | j d S )Nr   )rI   )rH   r   r   r   r(      s    zMutablePolyDenseMatrix.rowsc             C   s
   | j d S )Nr   )rI   )rH   r   r   r   r      s    zMutablePolyDenseMatrix.colsc             C   s   | j | j S )N)r(   r   )rH   r   r   r   __len__   s    zMutablePolyDenseMatrix.__len__c                s    fdd j }t|tr:| | }fdd|D S t|trjt| j\}}|||f }|jS |\}}t|trt|tr|||f jS  |||f S d S )Nc                s&    j jj} j jj}t|  ||dS )N)r/   )rC   r/   r;   r   to_dict)vZgroundr*   )rH   r   r   to_poly   s    

z3MutablePolyDenseMatrix.__getitem__.<locals>.to_polyc                s   g | ]} |qS r   r   )r   r-   )rU   r   r   r      s    z6MutablePolyDenseMatrix.__getitem__.<locals>.<listcomp>)	rC   r    slicerJ   r$   divmodr   elementr=   )rH   keyrA   r)   r   r   r   r   )rH   rU   r   __getitem__   s    


z"MutablePolyDenseMatrix.__getitem__c             C   s   t | t|stS | j|jkS )N)r    r   NotImplementedrC   )rH   rK   r   r   r   __eq__   s    zMutablePolyDenseMatrix.__eq__c             C   s$   t |t| r | | j|j S tS )N)r    r   r=   rC   r[   )rH   rK   r   r   r   __add__   s    zMutablePolyDenseMatrix.__add__c             C   s$   t |t| r | | j|j S tS )N)r    r   r=   rC   r[   )rH   rK   r   r   r   __sub__   s    zMutablePolyDenseMatrix.__sub__c          	   C   s   t |t| r | | j|j S t |tr2t|}t |tr| j}yt|	||}W n" t
tfk
rx   t	|}Y nX | | j| S tS )N)r    r   r=   rC   r$   r   r   r   r
   r<   r   
ValueErrorr[   )rH   rK   Kxother_dsr   r   r   __mul__   s    

zMutablePolyDenseMatrix.__mul__c             C   s:   t |trt|}t |tr6t|}| || j S tS )N)	r    r$   r   r   r
   r<   r=   rC   r[   )rH   rK   ra   r   r   r   __rmul__   s    


zMutablePolyDenseMatrix.__rmul__c             C   st   t |tr| }nt |tr&t|}t |ts4tS | j|}| j	
d| | j}t|| j	}| j| }| |S )Nr   )r    r   r7   r$   r   r   r[   r/   r<   r   Zconvert_fromr
   rC   r=   )rH   rK   ZinverserA   r   r   r   __truediv__   s    




z"MutablePolyDenseMatrix.__truediv__c             C   s   |  | j S )N)r=   rC   )rH   r   r   r   __neg__   s    zMutablePolyDenseMatrix.__neg__c             C   s   |  | j S )N)r=   rC   	transpose)rH   r   r   r   rf      s    z MutablePolyDenseMatrix.transposec             C   s   t | j|j}| |S )N)r	   ZhstackrC   r=   )rH   rK   rA   r   r   r   row_join   s    zMutablePolyDenseMatrix.row_joinc             C   s   t | j|j}| |S )N)r	   ZvstackrC   r=   )rH   rK   rA   r   r   r   col_join   s    zMutablePolyDenseMatrix.col_joinc             C   s   |   |}| || jS )N)rG   	applyfuncrL   r*   )rH   r   Mr   r   r   ri      s    z MutablePolyDenseMatrix.applyfuncc             C   s   |  t|t| S )N)r=   r	   eyer   )r&   nr*   r   r   r   rk     s    zMutablePolyDenseMatrix.eyec             C   s   |  t||ft| S )N)r=   r	   zerosr   )r&   mrl   r*   r   r   r   rm     s    zMutablePolyDenseMatrix.zerosignorec             C   s\   | j jrtdd | D s"td| j}||j j }| \}}||j }| ||fS )Nc             s   s   | ]}|j V  qd S )N)	is_ground)r   r3   r   r   r   r.     s    z.MutablePolyDenseMatrix.rref.<locals>.<genexpr>z1PolyMatrix rref is only for ground field elements)r/   is_Fieldr9   r_   rC   
convert_torrefr=   )rH   simplifyZnormalize_lastrA   Z	dm_groundZdm_rrefZpivotsr   r   r   rs     s    zMutablePolyDenseMatrix.rrefc                s   j jrtdd D s"tdj}j j }}|| |}|   fddt	 j
d D }fdd|D S )Nc             s   s   | ]}|j V  qd S )N)rp   )r   r3   r   r   r   r.     s    z3MutablePolyDenseMatrix.nullspace.<locals>.<genexpr>z6PolyMatrix nullspace is only for ground field elementsc                s   g | ]} d d |f qS )Nr   )r   r   )dm_nullr   r   r     s    z4MutablePolyDenseMatrix.nullspace.<locals>.<listcomp>r   c                s   g | ]}  |qS r   )r=   )r   Zdmvec)rH   r   r   r     s    )r/   rq   r9   r_   rC   r   rr   	nullspacerf   r   rI   )rH   rA   Kr`   Zdm_null_rowsZdm_basisr   )ru   rH   r   rv     s    z MutablePolyDenseMatrix.nullspacec             C   s   | j t|   S )N)r   r#   rv   )rH   r   r   r   rank!  s    zMutablePolyDenseMatrix.rank)ro   ro   )#__name__
__module____qualname____doc__r,   classmethodr%   r=   rG   rL   rM   rQ   propertyrI   r(   r   rR   rZ   r\   r]   r^   rb   rc   rd   re   rf   rg   rh   ri   rk   rm   rs   rv   rx   __classcell__r   r   )rF   r   r      s<   !%(

r   N)Zsympy.core.exprr   Zsympy.core.symbolr   Zsympy.core.sympifyr   Zsympy.polys.polyerrorsr   Zsympy.polys.polytoolsr   r   Zsympy.polys.domainsr   Zsympy.polys.matricesr	   Z!sympy.polys.matrices.domainscalarr
   r   ZMutablePolyMatrixZ
PolyMatrixr   r   r   r   <module>   s     