a
    <b&                     @   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 u 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   f/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/sympy/polys/polymatrix.py
<listcomp>?       z2MutablePolyDenseMatrix.__new__.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   typer   ar   r   r   r   D   r         c                 S   s   g | ]}t |qS r   r   r   r   r   r   r   G   r   c                   S   s   dS Nr   r   r   r   r   r   <lambda>G   r   z0MutablePolyDenseMatrix.__new__.<locals>.<lambda>c                    s$   g | ]}t  D ]}||qqS r   range)r   ijcolsfuncr   r   r   J   r   zInvalid arguments)		TypeError
isinstancelisttuplelenintr   r   	from_list)clsr   argsrowsitemsgenselementsr   r"   r   __new__0   s,    "**(zMutablePolyDenseMatrix.__new__c                    s>  dd |D }|r*t dd |D r*d}nd}|d urTt|trtdt |dj}n`|r|d }|d	d  D ]}||\}}	ql|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   r   z4MutablePolyDenseMatrix.from_list.<locals>.<listcomp>c                 s   s   | ]}t |tV  qd S N)r&   r   r3   r   r   r   	<genexpr>Z   r   z3MutablePolyDenseMatrix.from_list.<locals>.<genexpr>TFr   domainr   )fieldr8   r0   c                    s   |   d jjS r   )unifyrep)p)p_ringto_ringr   r   r   r   r   z2MutablePolyDenseMatrix.from_list.<locals>.<lambda>c                    s   g | ]} |qS r   r   r   r<   )convert_polyr   r   r   s   r   c                    s   g | ]} |  qS r   )as_expr)r   r   )convert_exprr   r   r   v   r   c                    s&   g | ]  fd dt D qS )c                    s   g | ]}  |  qS r   r   )r   r!   )r#   r1   r    r   r   r   y   r   z?MutablePolyDenseMatrix.from_list.<locals>.<listcomp>.<listcomp>r   )r   )r#   r1   )r    r   r   y   r   )allr&   strr   r   r8   r:   r0   r   symbolsr   r+   
from_sympyr   r
   from_dm)r,   r.   r#   r/   r0   r   Zpolysr<   p2_infoZelements_loldmr   )r#   rB   r@   r1   r=   r>   r   r+   U   s2    
z MutablePolyDenseMatrix.from_listc                    s:   t  | }| }|j}||_||_|j|_|j|_|S r5   )superr2   Z	to_sparser8   _dmr   rE   r0   )r,   rK   objR	__class__r   r   rG   }   s    zMutablePolyDenseMatrix.from_dmc                 C   s
   | j  S r5   )rM   	to_Matrixselfr   r   r   rR      s    z MutablePolyDenseMatrix.to_Matrixc                G   s"   | g |j | |R d|iS )Nr   )shapeflat)r,   otherr   r0   r   r   r   from_Matrix   s    z"MutablePolyDenseMatrix.from_Matrixc                 C   s   |  |  |S r5   )rX   rR   )rT   r0   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#   reprrR   r   rS   r   r   r   __repr__   s    &zMutablePolyDenseMatrix.__repr__c                 C   s   | j jS r5   )rM   rU   rS   r   r   r   rU      s    zMutablePolyDenseMatrix.shapec                 C   s
   | j d S r   rU   rS   r   r   r   r.      s    zMutablePolyDenseMatrix.rowsc                 C   s
   | j d S Nr   r^   rS   r   r   r   r#      s    zMutablePolyDenseMatrix.colsc                 C   s   | j | j S r5   )r.   r#   rS   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 )Nr7   )rM   r8   rE   r   to_dict)vZgroundr0   rS   r   r   to_poly   s    

z3MutablePolyDenseMatrix.__getitem__.<locals>.to_polyc                    s   g | ]} |qS r   r   r3   )rc   r   r   r      r   z6MutablePolyDenseMatrix.__getitem__.<locals>.<listcomp>)	rM   r&   slicerV   r*   divmodr#   elementrG   )rT   keyrK   r/   r    r!   r   r   )rT   rc   r   __getitem__   s    


z"MutablePolyDenseMatrix.__getitem__c                 C   s   t | t|stS | j|jkS r5   )r&   r   NotImplementedrM   rT   rW   r   r   r   __eq__   s    zMutablePolyDenseMatrix.__eq__c                 C   s$   t |t| r | | j|j S tS r5   r&   r   rG   rM   ri   rj   r   r   r   __add__   s    zMutablePolyDenseMatrix.__add__c                 C   s$   t |t| r | | j|j S tS r5   rl   rj   r   r   r   __sub__   s    zMutablePolyDenseMatrix.__sub__c              	   C   s   t |t| r | | j|j S t |tr2t|}t |tr| j}zt|	||}W n  t
tfyv   t	|}Y n0 | | j| S tS r5   )r&   r   rG   rM   r*   r   r   r   r   rF   r   
ValueErrorri   )rT   rW   Kxother_dsr   r   r   __mul__   s    

zMutablePolyDenseMatrix.__mul__c                 C   s:   t |trt|}t |tr6t|}| || j S tS r5   )	r&   r*   r   r   r   rF   rG   rM   ri   )rT   rW   rq   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 r_   )r&   r   rA   r*   r   r   ri   r8   rF   r   Zconvert_fromr   rM   rG   )rT   rW   ZinverserK   r   r   r   __truediv__   s    




z"MutablePolyDenseMatrix.__truediv__c                 C   s   |  | j S r5   )rG   rM   rS   r   r   r   __neg__   s    zMutablePolyDenseMatrix.__neg__c                 C   s   |  | j S r5   )rG   rM   	transposerS   r   r   r   rv      s    z MutablePolyDenseMatrix.transposec                 C   s   t | j|j}| |S r5   )r
   ZhstackrM   rG   rT   rW   rK   r   r   r   row_join   s    zMutablePolyDenseMatrix.row_joinc                 C   s   t | j|j}| |S r5   )r
   ZvstackrM   rG   rw   r   r   r   col_join   s    zMutablePolyDenseMatrix.col_joinc                 C   s   |   |}| || jS r5   )rR   	applyfuncrX   r0   )rT   r$   Mr   r   r   rz      s    z MutablePolyDenseMatrix.applyfuncc                 C   s   |  t|t| S r5   )rG   r
   eyer	   )r,   nr0   r   r   r   r|     s    zMutablePolyDenseMatrix.eyec                 C   s   |  t||ft| S r5   )rG   r
   zerosr	   )r,   mr}   r0   r   r   r   r~     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 r5   Z	is_groundr?   r   r   r   r6     r   z.MutablePolyDenseMatrix.rref.<locals>.<genexpr>z1PolyMatrix rref is only for ground field elements)r8   is_FieldrC   ro   rM   
convert_torrefrG   )rT   ZsimplifyZnormalize_lastrK   Z	dm_groundZdm_rrefZpivotsr   r   r   r     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 r5   r   r?   r   r   r   r6     r   z3MutablePolyDenseMatrix.nullspace.<locals>.<genexpr>z6PolyMatrix nullspace is only for ground field elementsc                    s   g | ]} d d |f qS r5   r   )r   r    )dm_nullr   r   r     r   z4MutablePolyDenseMatrix.nullspace.<locals>.<listcomp>r   c                    s   g | ]}  |qS r   )rG   )r   ZdmvecrS   r   r   r     r   )r8   r   rC   ro   rM   r   r   	nullspacerv   r   rU   )rT   rK   Krp   Zdm_null_rowsZdm_basisr   )r   rT   r   r     s    z MutablePolyDenseMatrix.nullspacec                 C   s   | j t|   S r5   )r#   r)   r   rS   r   r   r   rank!  s    zMutablePolyDenseMatrix.rank)r   r   )#__name__
__module____qualname____doc__r2   classmethodr+   rG   rR   rX   rY   r]   propertyrU   r.   r#   r`   rh   rk   rm   rn   rr   rs   rt   ru   rv   rx   ry   rz   r|   r~   r   r   r   __classcell__r   r   rP   r   r      sJ   "%
'







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     