U
    ZÊ¹j+&  ã                   @   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ƒržt|ƒt|d ƒ }‰ dd„ |D ƒ}nt|ƒd }‰ |}nÀd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�r˜t|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   úU/var/www/html/bwave/python/venv/lib/python3.8/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   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   Ú__new__0   s,    "**(zMutablePolyDenseMatrix.__new__c                    s>  dd„ |D ƒ}|r*t dd„ |D ƒƒr*d}nd}|d k	rTt|tƒr´tdtƒ |d�j}n`|rŽ|d }|d	d … D ]}| |¡\}}	ql|j|j }n&t||dd
�\}}
|
d |
d  }d}|rôt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   r3   r   r   r   Ú	<genexpr>Z   s     z3MutablePolyDenseMatrix.from_list.<locals>.<genexpr>TFr   ©Údomainr   )Úfieldr8   r0   c                    s   ˆ|   ˆ ¡d j ¡ ƒS r   )ÚunifyÚrepZto_list)Ú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   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#   r1   r    r   r   r   y   s     z?MutablePolyDenseMatrix.from_list.<locals>.<listcomp>.<listcomp>r   )r   )r#   r1   )r    r   r   y   s     )Úallr&   Ústrr   r   r8   r:   r0   r   Úsymbolsr   r+   Ú
from_sympyr   r
   Úfrom_dm)r,   r.   r#   r/   r0   r   Zpolysr<   Z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,   rJ   ÚobjÚR©Ú	__class__r   r   rG   }   s    zMutablePolyDenseMatrix.from_dmc                 C   s
   | j  ¡ S r5   )rL   Ú	to_Matrix©Úselfr   r   r   rQ   ˆ   s    z MutablePolyDenseMatrix.to_Matrixc                G   s   | |j | ¡ f|žd|iŽS )Nr   )ÚshapeÚflat)r,   Úotherr   r0   r   r   r   Úfrom_Matrix‹   s    z"MutablePolyDenseMatrix.from_Matrixc                 C   s   |   |  ¡ |¡S r5   )rW   rQ   )rS   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#   ÚreprrQ   r   rR   r   r   r   Ú__repr__’   s    &zMutablePolyDenseMatrix.__repr__c                 C   s   | j jS r5   )rL   rT   rR   r   r   r   rT   ˜   s    zMutablePolyDenseMatrix.shapec                 C   s
   | j d S r   ©rT   rR   r   r   r   r.   œ   s    zMutablePolyDenseMatrix.rowsc                 C   s
   | j d S ©Nr   r]   rR   r   r   r   r#       s    zMutablePolyDenseMatrix.colsc                 C   s   | j | j S r5   )r.   r#   rR   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ƒr˜t|tƒr˜ˆ|||f jƒS ˆ  |||f ¡S d S )Nc                    s&   ˆ j jj}ˆ j jj}t|  ¡ ||d�S )Nr7   )rL   r8   rE   r   Úto_dict)ÚvZgroundr0   rR   r   r   Úto_poly©   s    

z3MutablePolyDenseMatrix.__getitem__.<locals>.to_polyc                    s   g | ]}ˆ |ƒ‘qS r   r   r3   )rb   r   r   r   ²   s     z6MutablePolyDenseMatrix.__getitem__.<locals>.<listcomp>)	rL   r&   ÚslicerU   r*   Údivmodr#   ÚelementrG   )rS   ÚkeyrJ   r/   r    r!   r   r   )rS   rb   r   Ú__getitem__§   s    


z"MutablePolyDenseMatrix.__getitem__c                 C   s   t | t|ƒƒstS | j|jkS r5   )r&   r   ÚNotImplementedrL   ©rS   rV   r   r   r   Ú__eq__¾   s    zMutablePolyDenseMatrix.__eq__c                 C   s$   t |t| ƒƒr |  | j|j ¡S tS r5   ©r&   r   rG   rL   rh   ri   r   r   r   Ú__add__Ã   s    zMutablePolyDenseMatrix.__add__c                 C   s$   t |t| ƒƒr |  | j|j ¡S tS r5   rk   ri   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k
rx   t 	|¡}Y nX |  | j| ¡S tS r5   )r&   r   rG   rL   r*   r   r   r   r   rF   r   Ú
ValueErrorrh   )rS   rV   Ú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   rL   rh   )rS   rV   rp   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   rh   r8   rF   r   Zconvert_fromr   rL   rG   )rS   rV   ZinverserJ   r   r   r   Ú__truediv__ã   s    




z"MutablePolyDenseMatrix.__truediv__c                 C   s   |   | j ¡S r5   )rG   rL   rR   r   r   r   Ú__neg__ò   s    zMutablePolyDenseMatrix.__neg__c                 C   s   |   | j ¡ ¡S r5   )rG   rL   Ú	transposerR   r   r   r   ru   õ   s    z MutablePolyDenseMatrix.transposec                 C   s   t  | j|j¡}|  |¡S r5   )r
   ZhstackrL   rG   ©rS   rV   rJ   r   r   r   Úrow_joinø   s    zMutablePolyDenseMatrix.row_joinc                 C   s   t  | j|j¡}|  |¡S r5   )r
   ZvstackrL   rG   rv   r   r   r   Úcol_joinü   s    zMutablePolyDenseMatrix.col_joinc                 C   s   |   ¡  |¡}|  || j¡S r5   )rQ   Ú	applyfuncrW   r0   )rS   r$   ÚMr   r   r   ry      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     s     z.MutablePolyDenseMatrix.rref.<locals>.<genexpr>z1PolyMatrix rref is only for ground field elements)r8   Úis_FieldrC   rn   rL   Ú
convert_toÚrrefrG   )rS   ÚsimplifyZnormalize_lastrJ   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 }}| |¡jdd� |¡}| ¡ ‰ ‡ 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     s     z3MutablePolyDenseMatrix.nullspace.<locals>.<genexpr>z6PolyMatrix nullspace is only for ground field elementsT)Zdivide_lastc                    s   g | ]}ˆ d d …|f ‘qS r5   r   )r   r    )Údm_nullr   r   r     s     z4MutablePolyDenseMatrix.nullspace.<locals>.<listcomp>r   c                    s   g | ]}ˆ   |¡‘qS r   )rG   )r   ZdmvecrR   r   r   r     s     )r8   r�   rC   rn   rL   r   r‚   Ú	nullspaceru   r   rT   )rS   rJ   ÚKro   Zdm_null_rowsZdm_basisr   )r…   rS   r   r†     s    z MutablePolyDenseMatrix.nullspacec                 C   s   | j t|  ¡ ƒ S r5   )r#   r)   r†   rR   r   r   r   Úrank!  s    zMutablePolyDenseMatrix.rank)r   r   )#Ú__name__Ú
__module__Ú__qualname__Ú__doc__r2   Úclassmethodr+   rG   rQ   rW   rX   r\   ÚpropertyrT   r.   r#   r_   rg   rj   rl   rm   rq   rr   rs   rt   ru   rw   rx   ry   r{   r}   rƒ   r†   rˆ   Ú__classcell__r   r   rO   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     