B
    `                 @   s   d Z g ZddlmZmZmZmZmZ ddlm	Z	 ddl
mZmZmZ ddddddddddddddddd	Zd
d Zdd Zdd ZdS )zrestructuredtext en    )
asanyarrayasarrayarraymatrixzeros)asmatrix)aslinearoperatorLinearOperatorIdentityOperatorfdFD))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   c             C   s$   | dkrd} |dkrd}t | |f S )NfdFDr   )_coerce_rules)xy r   O/home/dcms/DCMS/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/utils.pycoerce   s
    r   c             C   s   | S )Nr   )r   r   r   r   id   s    r   c                s  | }t | } | jd | jd kr0td| jf | jd }t   j|dfksd j|fksdtd jjdkrz d  fdd}t| d	r| jj}n|  jj}t	| jj}t
 |d
    |dkrt||d
}n:t||d
}|j|dfks|j|fkstd| }|dkrt|dr8|j}	nt}	t|drP|j}
nt}
|	tkrz|
tkrzt| j| jd}nt| j|	|
| jd}nt |}| j|jkrtd| || |fS )a8  Make a linear system Ax=b

    Parameters
    ----------
    A : LinearOperator
        sparse or dense matrix (or any valid input to aslinearoperator)
    M : {LinearOperator, Nones}
        preconditioner
        sparse or dense matrix (or any valid input to aslinearoperator)
    x0 : {array_like, None}
        initial guess to iterative method
    b : array_like
        right hand side

    Returns
    -------
    (A, M, x, b, postprocess)
        A : LinearOperator
            matrix of the linear system
        M : LinearOperator
            preconditioner
        x : rank 1 ndarray
            initial guess
        b : rank 1 ndarray
            right hand side
        postprocess : function
            converts the solution vector to the appropriate
            type and dimensions (e.g. (N,1) matrix)

    r      z(expected square matrix, but got shape=%sz$A and b have incompatible dimensionsr   r   c                s   t  trt| } |  jS )N)
isinstancer   r   Zreshapeshape)r   )br   r   postprocessO   s    
z make_system.<locals>.postprocessdtype)r   Nz$A and x have incompatible dimensionspsolverpsolve)r   r   )matvecZrmatvecr   z/matrix and preconditioner have different shapes)r   r   
ValueErrorr   r   charZastypehasattrr   r   r   Zravelr   r   r   r   r   r
   r	   )AMZx0r   ZA_Nr   Zxtyper   r   r   r   )r   r   make_system    sL    





r&   N)Z__docformat____all__numpyr   r   r   r   r   Zscipy.sparse.sputilsr   Zscipy.sparse.linalg.interfacer   r	   r
   r   r   r   r&   r   r   r   r   <module>   s   