U
    ZÊ¹jn  ã                   @   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	 d dl
mZ ddlmZmZmZmZ d d	lmZ d
d„ Zdd„ Zdd„ Zdd„ ZdS )é    )Údefaultdict©ÚAdd)ÚMul)ÚS)Úconstruct_domain)ÚPolyNonlinearErroré   )ÚSDMÚ	sdm_irrefÚsdm_particular_from_rrefÚsdm_nullspace_from_rref)Ú
filldedentc                 C   sH  t |ƒ}t| |ƒ\}}t|||ƒ}|j}|js4|jrH| ¡  ¡ d  ¡ }t	|ƒ\}}}	|rj|d |krjdS t
||d |ƒ}
t||j|||	ƒ\}}ttƒ}|
 ¡ D ] \}}|||   | |¡¡ q t||ƒD ]>\}}|| }| ¡ D ]$\}}|||   || |¡ ¡ qäqÌdd„ | ¡ D ƒ}tj}t|ƒt|ƒ D ]}|||< �q4|S )a  Solve a linear system of equations.

    Examples
    ========

    Solve a linear system with a unique solution:

    >>> from sympy import symbols, Eq
    >>> from sympy.polys.matrices.linsolve import _linsolve
    >>> x, y = symbols('x, y')
    >>> eqs = [Eq(x + y, 1), Eq(x - y, 2)]
    >>> _linsolve(eqs, [x, y])
    {x: 3/2, y: -1/2}

    In the case of underdetermined systems the solution will be expressed in
    terms of the unknown symbols that are unconstrained:

    >>> _linsolve([Eq(x + y, 0)], [x, y])
    {x: -y, y: y}

    r   éÿÿÿÿNr	   c                 S   s   i | ]\}}|t |Ž “qS © r   )Ú.0ÚsÚtermsr   r   ú\/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/polys/matrices/linsolve.pyÚ
<dictcomp>m   s      z_linsolve.<locals>.<dictcomp>)ÚlenÚ_linear_eq_to_dictÚsympy_dict_to_dmÚdomainZis_RealFieldZis_ComplexFieldZto_ddmZrrefZto_sdmr   r   r   Úoner   ÚlistÚitemsÚappendZto_sympyÚzipr   ÚZeroÚset)ÚeqsÚsymsÚnsymsÚeqsdictÚconstZAaugÚKZArrefZpivotsZnzcolsÚPÚVZ	nonpivotsZsolÚiÚvZnpiZViÚsymÚzeror   r   r   r   Ú	_linsolve0   s.     r-   c                    sÆ   t |ƒjdd„ | D ƒŽ }t|ddd�\}}tt||ƒƒ‰ t| ƒ}t|ƒ}tt|t|ƒƒƒ‰g }t| |ƒD ]@\}	}
‡ ‡fdd„|	 ¡ D ƒ}|
ršˆ |
  ||< |rh| |¡ qht	t
|ƒ||d f|ƒ}|S )z?Convert a system of dict equations to a sparse augmented matrixc                 s   s   | ]}|  ¡ V  qd S )N)Úvalues)r   Úer   r   r   Ú	<genexpr>z   s     z#sympy_dict_to_dm.<locals>.<genexpr>T)ÚfieldÚ	extensionc                    s   i | ]\}}ˆ| ˆ | “qS r   r   )r   r   Úc©Zelem_mapZ	sym2indexr   r   r   ‚   s      z$sympy_dict_to_dm.<locals>.<dictcomp>r	   )r    Úunionr   Údictr   r   Úranger   r   r
   Ú	enumerate)Z
eqs_coeffsZeqs_rhsr"   Zelemsr&   Zelems_KZneqsr#   r$   ÚeqÚrhsZeqdictZsdm_augr   r4   r   r   x   s    r   c                 C   sÆ   g }g }t |ƒ}| D ]¨}|jršt|j|ƒ\}}t|j|ƒ\}}	||8 }|	 ¡ D ],\}
}|
|krp||
  |8  < qN| ||
< qNdd„ | ¡ D ƒ}|| }}nt||ƒ\}}| |¡ | |¡ q||fS )am  Convert a system Expr/Eq equations into dict form, returning
    the coefficient dictionaries and a list of syms-independent terms
    from each expression in ``eqs```.

    Examples
    ========

    >>> from sympy.polys.matrices.linsolve import _linear_eq_to_dict
    >>> from sympy.abc import x
    >>> _linear_eq_to_dict([2*x + 3], {x})
    ([{x: 2}], [3])
    c                 S   s   i | ]\}}|r||“qS r   r   )r   Úkr*   r   r   r   r   ¨   s       z&_linear_eq_to_dict.<locals>.<dictcomp>)r    Zis_EqualityÚ_lin_eq2dictÚlhsr:   r   r   )r!   r"   ÚcoeffsÚindÚsymsetr/   Úcoeffr   ZcRZtRr;   r*   r3   Údr   r   r   r   ‹   s$    
r   c                    sT  | |krt j| t jifS | jr�ttƒ}g }| jD ]<}t||ƒ\}}| |¡ | 	¡ D ]\}}||  |¡ qTq0t
|Ž ‰ dd„ | 	¡ D ƒ}	ˆ |	fS | j�r0d }	}
g }| jD ]D}t||ƒ\}}|sÌ| |¡ qª|	dkrÞ|}	|}
qªttd|  ƒƒ‚qªt |¡‰ |	dk�rˆ i fS ‡ fdd„|	 	¡ D ƒ}	ˆ |
 |	fS n |  |¡�sD| i fS td|  ƒ‚dS )aÓ  return (c, d) where c is the sym-independent part of ``a`` and
    ``d`` is an efficiently calculated dictionary mapping symbols to
    their coefficients. A PolyNonlinearError is raised if non-linearity
    is detected.

    The values in the dictionary will be non-zero.

    Examples
    ========

    >>> from sympy.polys.matrices.linsolve import _lin_eq2dict
    >>> from sympy.abc import x, y
    >>> _lin_eq2dict(x + 2*y + 3, {x, y})
    (3, {x: 1, y: 2})
    c                 S   s   i | ]\}}|t |Ž “qS r   r   )r   r+   r>   r   r   r   r   Ì   s      z _lin_eq2dict.<locals>.<dictcomp>Nz-
                    nonlinear cross-term: %sc                    s   i | ]\}}|ˆ | “qS r   r   )r   r+   r3   ©rA   r   r   r   á   s      znonlinear term: %s)r   r   ZOneZis_Addr   r   Úargsr<   r   r   r   Zis_Mulr   r   r   Z
_from_argsZ	has_xfree)Úar@   Z
terms_listZ
coeff_listZaiÚciÚtiZmijZcijr   Zterms_coeffr   rC   r   r<   ±   sD    


ÿ


r<   N)Úcollectionsr   Zsympy.core.addr   Zsympy.core.mulr   Zsympy.core.singletonr   Zsympy.polys.constructorr   Zsympy.polys.solversr   Zsdmr
   r   r   r   Zsympy.utilities.miscr   r-   r   r   r<   r   r   r   r   Ú<module>   s   H&