
    Ugd                     ,   d dl mZmZmZ d dlZd dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZ d dlmZ d dlZddlmZ d	Z	 d dlmZ n# e$ r d
ZY nw xY we Zg dZ G d de          Zd Zd Zd ZddZ dddd e!            fdZ"	 	 ddZ#d Z$	 	 ddZ%dS )    )warncatch_warningssimplefilterN)asarray)issparseSparseEfficiencyWarning
csc_matrixeyediags)is_pydata_spmatrixconvert_pydata_sparse_to_scipy)LinAlgError   )_superluFT)
use_solverspsolvespluspilu
factorizedMatrixRankWarningspsolve_triangularc                       e Zd ZdS )r   N)__name__
__module____qualname__     c/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/scipy/sparse/linalg/_dsolve/linsolve.pyr   r      s        Dr   r   c                      d| v r| d         t                      d<   t          r!d| v rt          j        | d                    dS dS dS )as	  
    Select default sparse direct solver to be used.

    Parameters
    ----------
    useUmfpack : bool, optional
        Use UMFPACK [1]_, [2]_, [3]_, [4]_. over SuperLU. Has effect only
        if ``scikits.umfpack`` is installed. Default: True
    assumeSortedIndices : bool, optional
        Allow UMFPACK to skip the step of sorting indices for a CSR/CSC matrix.
        Has effect only if useUmfpack is True and ``scikits.umfpack`` is
        installed. Default: False

    Notes
    -----
    The default sparse solver is UMFPACK when available
    (``scikits.umfpack`` is installed). This can be changed by passing
    useUmfpack = False, which then causes the always present SuperLU
    based solver to be used.

    UMFPACK requires a CSR/CSC matrix to have sorted column/row indices. If
    sure that the matrix fulfills this, pass ``assumeSortedIndices=True``
    to gain some speed.

    References
    ----------
    .. [1] T. A. Davis, Algorithm 832:  UMFPACK - an unsymmetric-pattern
           multifrontal method with a column pre-ordering strategy, ACM
           Trans. on Mathematical Software, 30(2), 2004, pp. 196--199.
           https://dl.acm.org/doi/abs/10.1145/992200.992206

    .. [2] T. A. Davis, A column pre-ordering strategy for the
           unsymmetric-pattern multifrontal method, ACM Trans.
           on Mathematical Software, 30(2), 2004, pp. 165--195.
           https://dl.acm.org/doi/abs/10.1145/992200.992205

    .. [3] T. A. Davis and I. S. Duff, A combined unifrontal/multifrontal
           method for unsymmetric sparse matrices, ACM Trans. on
           Mathematical Software, 25(1), 1999, pp. 1--19.
           https://doi.org/10.1145/305658.287640

    .. [4] T. A. Davis and I. S. Duff, An unsymmetric-pattern multifrontal
           method for sparse LU factorization, SIAM J. Matrix Analysis and
           Computations, 18(1), 1997, pp. 140--158.
           https://doi.org/10.1137/S0895479894246905T.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.sparse.linalg import use_solver, spsolve
    >>> from scipy.sparse import csc_matrix
    >>> R = np.random.randn(5, 5)
    >>> A = csc_matrix(R)
    >>> b = np.random.randn(5)
    >>> use_solver(useUmfpack=False) # enforce superLU over UMFPACK
    >>> x = spsolve(A, b)
    >>> np.allclose(A.dot(x), b)
    True
    >>> use_solver(useUmfpack=True) # reset umfPack usage to default
    
useUmfpackassumeSortedIndices)r!   N)globalsr    umfpack	configure)kwargss    r   r   r      si    z v"("6		, M+v55f5J.KLLLLLLM M55r   c                    t           j        t           j        fdt           j        t           j        fdt           j        t           j        fdt           j        t           j        fdi}t          t           | j        j                  }t          t           | j        j        j                  }	 |||f         }n+# t          $ r}d| d| d}t          |          |d}~ww xY w|d	         d
z   }t          j        |           }t          j        | j        t           j                  |_        t          j        | j        t           j                  |_        ||fS )z8Get umfpack family string given the sparse matrix dtype.dizidlzlz]only float64 or complex128 matrices with int32 or int64 indices are supported! (got: matrix: z, indices: )Nr   ldtype)npfloat64int32
complex128int64getattrr.   nameindicesKeyError
ValueErrorcopyr   indptr)A	_familiesf_typei_typefamilyemsgA_news           r   _get_umf_familyrC   _   s9    
RX	!4	RX	!4	I R&&F R-..F%FF+, % % %T7=T TJPT T Too1$% AY_FIaLLE:ahbh777ELJqy999EM5=s   '
B2 2
C<CCc                    t          j        t           j                  j        }| j        d         |k    rt          d          t          | j         |k    r,t          j        | j        |k              rt          d          | j        	                    t           j        d          }| j        	                    t           j        d          }||fS )Nz#indptr values too large for SuperLUz$indices values too large for SuperLUFr9   )
r/   iinfointcmaxr:   r8   shapeanyr6   astype)r;   	max_valuer6   r:   s       r   _safe_downcast_indicesrN      s    !!%Ix|i>???
AG}y  6!)i'(( 	ECDDDirwU33GX__RW5_11FF?r   c           
      h
   t          |          }|r|j        nd}t          |           } t          |          }t          |           r	| j        dv s&t          |           } t          dt          d           t          |          }|st          |          }|j	        dk    p|j	        dk    o|j
        d         dk    }|                                  |                                 } t          j        | j        |j                  }| j        |k    r|                     |          } |j        |k    r|                    |          }| j
        \  }	}
|	|
k    rt#          d|	|
f d          |	|j
        d	         k    r&t#          d
| j
         d|j
        d	          d          |ot$          }|r|r|r|                                }n|}t          || j                                                  }t*          rt-          d          | j        j        dvrt#          d          t1          |           \  }} t3          j        |          }|                    t2          j        | |d          }n|r|r|                                }d}|s| j        dk    rd}nd	}| j                            t          j        d          }| j                            t          j        d          }tA          |          }tC          j"        |
| j#        | j$        |||||          \  }}|d	k    r6t          dtJ          d           |&                    t          j'                   |r|                                }ntQ          |           }|j        dk    s5t          |          s&t          dt          d           t          |          }g }g }g }tS          |j
        d                   D ]}|dd|gf                                                                         } ||          }t          j*        |          }|j
        d	         }|+                    |           |+                    t          j,        ||tZ                               |+                    t          j        ||         | j                             t          j.        |          }t          j.        |          }t          j.        |          }|                     |||ff|j
        | j                  }|r|/                    |          }|S )a  Solve the sparse linear system Ax=b, where b may be a vector or a matrix.

    Parameters
    ----------
    A : ndarray or sparse matrix
        The square matrix A will be converted into CSC or CSR form
    b : ndarray or sparse matrix
        The matrix or vector representing the right hand side of the equation.
        If a vector, b.shape must be (n,) or (n, 1).
    permc_spec : str, optional
        How to permute the columns of the matrix for sparsity preservation.
        (default: 'COLAMD')

        - ``NATURAL``: natural ordering.
        - ``MMD_ATA``: minimum degree ordering on the structure of A^T A.
        - ``MMD_AT_PLUS_A``: minimum degree ordering on the structure of A^T+A.
        - ``COLAMD``: approximate minimum degree column ordering [1]_, [2]_.

    use_umfpack : bool, optional
        if True (default) then use UMFPACK for the solution [3]_, [4]_, [5]_,
        [6]_ . This is only referenced if b is a vector and
        ``scikits.umfpack`` is installed.

    Returns
    -------
    x : ndarray or sparse matrix
        the solution of the sparse linear equation.
        If b is a vector, then x is a vector of size A.shape[1]
        If b is a matrix, then x is a matrix of size (A.shape[1], b.shape[1])

    Notes
    -----
    For solving the matrix expression AX = B, this solver assumes the resulting
    matrix X is sparse, as is often the case for very sparse inputs.  If the
    resulting X is dense, the construction of this sparse result will be
    relatively expensive.  In that case, consider converting A to a dense
    matrix and using scipy.linalg.solve or its variants.

    References
    ----------
    .. [1] T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, Algorithm 836:
           COLAMD, an approximate column minimum degree ordering algorithm,
           ACM Trans. on Mathematical Software, 30(3), 2004, pp. 377--380.
           :doi:`10.1145/1024074.1024080`

    .. [2] T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, A column approximate
           minimum degree ordering algorithm, ACM Trans. on Mathematical
           Software, 30(3), 2004, pp. 353--376. :doi:`10.1145/1024074.1024079`

    .. [3] T. A. Davis, Algorithm 832:  UMFPACK - an unsymmetric-pattern
           multifrontal method with a column pre-ordering strategy, ACM
           Trans. on Mathematical Software, 30(2), 2004, pp. 196--199.
           https://dl.acm.org/doi/abs/10.1145/992200.992206

    .. [4] T. A. Davis, A column pre-ordering strategy for the
           unsymmetric-pattern multifrontal method, ACM Trans.
           on Mathematical Software, 30(2), 2004, pp. 165--195.
           https://dl.acm.org/doi/abs/10.1145/992200.992205

    .. [5] T. A. Davis and I. S. Duff, A combined unifrontal/multifrontal
           method for unsymmetric sparse matrices, ACM Trans. on
           Mathematical Software, 25(1), 1999, pp. 1--19.
           https://doi.org/10.1145/305658.287640

    .. [6] T. A. Davis and I. S. Duff, An unsymmetric-pattern multifrontal
           method for sparse LU factorization, SIAM J. Matrix Analysis and
           Computations, 18(1), 1997, pp. 140--158.
           https://doi.org/10.1137/S0895479894246905T.


    Examples
    --------
    >>> import numpy as np
    >>> from scipy.sparse import csc_matrix
    >>> from scipy.sparse.linalg import spsolve
    >>> A = csc_matrix([[3, 2, 0], [1, -1, 0], [0, 5, 1]], dtype=float)
    >>> B = csc_matrix([[2, 0], [-1, 0], [2, 0]], dtype=float)
    >>> x = spsolve(A, B)
    >>> np.allclose(A.dot(x).toarray(), B.toarray())
    True
    N)csccsrz.spsolve requires A be CSC or CSR matrix format   
stacklevelr   z!matrix must be square (has shape r+   r   z!matrix - rhs dimension mismatch (z - r-   Scikits.umfpack not installed.dDZconvert matrix data to double, please, using .astype(), or set linsolve.useUmfpack = FalseTautoTransposeFrP   rF   )ColPerm)optionszMatrix is exactly singularzCspsolve is more efficient when sparse b is in the CSC matrix format)rJ   r.   )0r   	__class__r   r   formatr	   r   r   r   ndimrJ   sum_duplicates	_asfptyper/   promote_typesr.   rL   r8   r    toarrayravelnoScikitRuntimeErrorcharrC   r#   UmfpackContextlinsolve	UMFPACK_Ar6   rH   r:   dictr   gssvnnzdatar   fillnanr   rangeflatnonzeroappendfullintconcatenatefrom_scipy_sparse) r;   b
permc_specuse_umfpackis_pydata_sparsepydata_sparse_clsb_is_sparseb_is_vectorresult_dtypeMNb_vec
umf_familyumfxflagr6   r:   r[   info
Afactsolve	data_segsrow_segscol_segsjbjxjwsegment_lengthsparse_data
sparse_row
sparse_cols                                    r   r   r      sA   d *!,,'7AT&q))A&q))AQKK 4AH66qMM=$	4 	4 	4 	4 1++K AJJFaKEQVq[%DQWQZ1_K 	A#AGQW55Lw,HH\""w,HH\"" 7DAq	QFaVFFFGGGAGAJVQWVVQRVVVWWW,*K I;{ I; 	IIKKEEEQW---3355 	A?@@@7<t## C D D D (**
A$Z00LL*Au'+  - -  	 ; 	 		AK 2	;x5  i&&rwU&;;GX__RW5_99F:...GmAquafgv$%tW> > >GAtqyy13DQRSSSSrv GGII $AJH%%);A)>)>% 3,< < < < qMM IHH171:&& C C
 qqq1#vY&&((..00Z^^N2&&!"""" E E EFFF  BqE!A!A!ABBBB.33K11J11J[:z*BC!"  9 9A   ;%77::Hr   c           
         t          |           r:t          |           dd}|                                                                 } nt          }t          |           r| j        dk    s&t	          |           } t          dt          d           | 	                                 | 
                                } | j        \  }}||k    rt          d          t          |           \  }	}
t          ||||          }||                    |           |d
         dk    rd|d<   t!          j        || j        | j        |	|
|d|          S )a  
    Compute the LU decomposition of a sparse, square matrix.

    Parameters
    ----------
    A : sparse matrix
        Sparse matrix to factorize. Most efficient when provided in CSC
        format. Other formats will be converted to CSC before factorization.
    permc_spec : str, optional
        How to permute the columns of the matrix for sparsity preservation.
        (default: 'COLAMD')

        - ``NATURAL``: natural ordering.
        - ``MMD_ATA``: minimum degree ordering on the structure of A^T A.
        - ``MMD_AT_PLUS_A``: minimum degree ordering on the structure of A^T+A.
        - ``COLAMD``: approximate minimum degree column ordering

    diag_pivot_thresh : float, optional
        Threshold used for a diagonal entry to be an acceptable pivot.
        See SuperLU user's guide for details [1]_
    relax : int, optional
        Expert option for customizing the degree of relaxing supernodes.
        See SuperLU user's guide for details [1]_
    panel_size : int, optional
        Expert option for customizing the panel size.
        See SuperLU user's guide for details [1]_
    options : dict, optional
        Dictionary containing additional expert options to SuperLU.
        See SuperLU user guide [1]_ (section 2.4 on the 'Options' argument)
        for more details. For example, you can specify
        ``options=dict(Equil=False, IterRefine='SINGLE'))``
        to turn equilibration off and perform a single iterative refinement.

    Returns
    -------
    invA : scipy.sparse.linalg.SuperLU
        Object, which has a ``solve`` method.

    See also
    --------
    spilu : incomplete LU decomposition

    Notes
    -----
    This function uses the SuperLU library.

    References
    ----------
    .. [1] SuperLU https://portal.nersc.gov/project/sparse/superlu/

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.sparse import csc_matrix
    >>> from scipy.sparse.linalg import splu
    >>> A = csc_matrix([[1., 0., 0.], [5., 0., 2.], [0., -1., 0.]], dtype=float)
    >>> B = splu(A)
    >>> x = np.array([1., 2., 3.], dtype=float)
    >>> B.solve(x)
    array([ 1. , -3. , -1.5])
    >>> A.dot(B.solve(x))
    array([ 1.,  2.,  3.])
    >>> B.solve(A.dot(x))
    array([ 1.,  2.,  3.])
    clsc                 :    |                      t          |           S Nrv   r	   r   as     r   csc_construct_funcz splu.<locals>.csc_construct_func      ((Q888r   rP   &splu converted its input to CSC formatrR   rS   can only factor square matrices)DiagPivotThreshrZ   	PanelSizeRelaxNrZ   NATURALTSymmetricModeFr   ilur[   r   typeto_scipy_sparsetocscr	   r   r]   r   r   r_   r`   rJ   r8   rN   rj   updater   gstrfrl   rm   )r;   rx   diag_pivot_threshrelax
panel_sizer[   r   r   r   r6   r:   _optionss               r   r   r   S  sv   H ! ('+Aww 	9 	9 	9 	9 	9%%'''QKK 4AH--qMM5$	4 	4 	4 	4 	A7DAq	Q:;;;,Q//OGV$5z(7 7 7H    	y(($(!>!QUAFGV-?#X7 7 7 7r   c	           
         t          |           r:t          |           dd}	|                                                                 } nt          }	t          |           r| j        dk    s&t	          |           } t          dt          d           | 	                                 | 
                                } | j        \  }
}|
|k    rt          d          t          |           \  }}t          |||||||          }||                    |           |d
         dk    rd|d<   t!          j        || j        | j        |||	d|          S )a  
    Compute an incomplete LU decomposition for a sparse, square matrix.

    The resulting object is an approximation to the inverse of `A`.

    Parameters
    ----------
    A : (N, N) array_like
        Sparse matrix to factorize. Most efficient when provided in CSC format.
        Other formats will be converted to CSC before factorization.
    drop_tol : float, optional
        Drop tolerance (0 <= tol <= 1) for an incomplete LU decomposition.
        (default: 1e-4)
    fill_factor : float, optional
        Specifies the fill ratio upper bound (>= 1.0) for ILU. (default: 10)
    drop_rule : str, optional
        Comma-separated string of drop rules to use.
        Available rules: ``basic``, ``prows``, ``column``, ``area``,
        ``secondary``, ``dynamic``, ``interp``. (Default: ``basic,area``)

        See SuperLU documentation for details.

    Remaining other options
        Same as for `splu`

    Returns
    -------
    invA_approx : scipy.sparse.linalg.SuperLU
        Object, which has a ``solve`` method.

    See also
    --------
    splu : complete LU decomposition

    Notes
    -----
    To improve the better approximation to the inverse, you may need to
    increase `fill_factor` AND decrease `drop_tol`.

    This function uses the SuperLU library.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.sparse import csc_matrix
    >>> from scipy.sparse.linalg import spilu
    >>> A = csc_matrix([[1., 0., 0.], [5., 0., 2.], [0., -1., 0.]], dtype=float)
    >>> B = spilu(A)
    >>> x = np.array([1., 2., 3.], dtype=float)
    >>> B.solve(x)
    array([ 1. , -3. , -1.5])
    >>> A.dot(B.solve(x))
    array([ 1.,  2.,  3.])
    >>> B.solve(A.dot(x))
    array([ 1.,  2.,  3.])
    r   c                 :    |                      t          |           S r   r   r   s     r   r   z!spilu.<locals>.csc_construct_func  r   r   rP   z'spilu converted its input to CSC formatrR   rS   r   )ILU_DropRuleILU_DropTolILU_FillFactorr   rZ   r   r   NrZ   r   Tr   r   r   )r;   drop_tolfill_factor	drop_rulerx   r   r   r   r[   r   r   r   r6   r:   r   s                  r   r   r     s   v ! ('+Aww 	9 	9 	9 	9 	9%%'''QKK 4AH--qMM6$	4 	4 	4 	4 	A7DAq	Q:;;;,Q//OGV#.$5z(7 7 7H     	y(($(!>!QUAFGV-?"H6 6 6 6r   c                 :    t                     r&                                                                  t          rt          rt          d          t                     r j        dk    s&t                      t          dt          d                                              j        j        dvrt          d          t                     \  } t!          j        |                                           fd}|S t'                     j        S )	a  
    Return a function for solving a sparse linear system, with A pre-factorized.

    Parameters
    ----------
    A : (N, N) array_like
        Input. A in CSC format is most efficient. A CSR format matrix will
        be converted to CSC before factorization.

    Returns
    -------
    solve : callable
        To solve the linear system of equations given in `A`, the `solve`
        callable should be passed an ndarray of shape (N,).

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.sparse.linalg import factorized
    >>> from scipy.sparse import csc_matrix
    >>> A = np.array([[ 3. ,  2. , -1. ],
    ...               [ 2. , -2. ,  4. ],
    ...               [-1. ,  0.5, -1. ]])
    >>> solve = factorized(csc_matrix(A)) # Makes LU decomposition.
    >>> rhs1 = np.array([1, -2, 0])
    >>> solve(rhs1) # Uses the LU factors.
    array([ 1., -2., -2.])

    rU   rP   r   rR   rS   rV   rW   c                     t          j        dd          5                      t          j        | d          }d d d            n# 1 swxY w Y   |S )Nignore)divideinvalidTrX   )r/   errstatesolver#   ri   )rw   resultr;   r   s     r   r   zfactorized.<locals>.solveR  s    Hh??? P P7#4a$OOP P P P P P P P P P P P P P P Ms   $AAA)r   r   r   r    rd   re   r   r]   r	   r   r   r`   r.   rf   r8   rC   r#   rg   numericr   r   )r;   r   r   r   s   `  @r   r   r     s7   < ! (%%''  	A?@@@ 	8E 1 11A9(Q8 8 8 8 KKMM7<t## C D D D (**
A$Z00 	A	 	 	 	 	 	 Aww}r   c                    t          |           r&|                                                                 } d}t          |           r| j        dk    r| j        } d}| }t          |           r| j        dk    s't          dt          d           t          |           } n|s| 	                                } | j
        \  }}||k    rt          d| j
         d	          |rQt                      5  t          d
t                     |                     d           ddd           n# 1 swxY w Y   nu|                                 }	t!          j        |	dk              rt%          d          d|	z  }
|dk    r| t'          |
          z  } n| j        t'          |
          z  j        } |                                  t!          j        |          }|j        dvrt          d|j
         d	          ||j
        d         k    r t          d| j
         d|j
         d	          t!          j        t!          j        | j        t           j                  |j                  }| j        |k    r|                     |          } |j        |k    r|                    |          }n|s|	                                }|r| }t          ||f|          }n)t7          ||d          }| }|                    d           t9          j        |||j        |j        |j         |j!        ||j        |j        |j         |j!        |          \  }}|rt%          d          |s, |
j"        dgdgtG          |j
                  dz
  z  R  }
||
z  }|S )a  
    Solve the equation ``A x = b`` for `x`, assuming A is a triangular matrix.

    Parameters
    ----------
    A : (M, M) sparse matrix
        A sparse square triangular matrix. Should be in CSR or CSC format.
    b : (M,) or (M, N) array_like
        Right-hand side matrix in ``A x = b``
    lower : bool, optional
        Whether `A` is a lower or upper triangular matrix.
        Default is lower triangular matrix.
    overwrite_A : bool, optional
        Allow changing `A`.
        Enabling gives a performance gain. Default is False.
    overwrite_b : bool, optional
        Allow overwriting data in `b`.
        Enabling gives a performance gain. Default is False.
        If `overwrite_b` is True, it should be ensured that
        `b` has an appropriate dtype to be able to store the result.
    unit_diagonal : bool, optional
        If True, diagonal elements of `a` are assumed to be 1.

        .. versionadded:: 1.4.0

    Returns
    -------
    x : (M,) or (M, N) ndarray
        Solution to the system ``A x = b``. Shape of return matches shape
        of `b`.

    Raises
    ------
    LinAlgError
        If `A` is singular or not triangular.
    ValueError
        If shape of `A` or shape of `b` do not match the requirements.

    Notes
    -----
    .. versionadded:: 0.19.0

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.sparse import csc_array
    >>> from scipy.sparse.linalg import spsolve_triangular
    >>> A = csc_array([[3, 0, 0], [1, -1, 0], [2, 0, 1]], dtype=float)
    >>> B = np.array([[2, 0], [-1, 0], [2, 0]], dtype=float)
    >>> x = spsolve_triangular(A, B)
    >>> np.allclose(A.dot(x), B)
    True
    r   rQ   TrP   z?CSC or CSR matrix format is required. Converting to CSC matrix.rR   rS   z+A must be a square matrix but its shape is .r   r   Nr   z&A is singular: zero entry on diagonal.)r   rR   z)b must have 1 or 2 dims but its shape is zlThe size of the dimensions of A must be equal to the size of the first dimension of b but the shape of A is z and the shape of b is r-   )r.   r]   zA is singular.rE   )$r   r   r   r   r]   r   r   r   r	   r9   rJ   r8   r   r   setdiagdiagonalr/   rK   r   r   r_   
asanyarrayr^   ra   r.   float32rL   r
   r   gstrsrl   rm   r6   r:   reshapelen)r;   rw   loweroverwrite_Aoverwrite_bunit_diagonaltransr   r   diaginvdiagr~   LUr   r   s                   r   r   r   ^  s   p ! (%%''E{{ qx5((C	QKK AH--N$	4 	4 	4 	4qMM FFHH 7DAqAvvD!'DDDF F 	F  ) 	 	#:;;;IIaLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 zz||6$!) 	:8: : :D&C<<E'NN"AAuW~~%(A 
aAvVBBBBD D 	DAGAJ:w: :/0w: : :
 
 	
 #B$4QWbj$I$I17SSLw,HH\""w,HH\"" FFHH 1v\222e444			!nUqvqy!(qvqy!(   GAt  ,*+++ !'/"Bs17||a/?(@BBBKHs   -+D$$D(+D()NT)NNNNNNNN)TFFF)&warningsr   r   r   numpyr/   r   scipy.sparser   r   r	   r
   r   scipy.sparse._sputilsr   r   scipy.linalgr   r9    r   rd   scikits.umfpackr#   ImportErrorr    __all__UserWarningr   r   rC   rN   r   rj   r   r   r   r   r   r   r   <module>r      s=   7 7 7 7 7 7 7 7 7 7          K K K K K K K K K K K K K K T T T T T T T T $ $ $ $ $ $       %%%%%%%   HHH \
6 6 6	 	 	 	 	 	 	 	@M @M @MD     D  @ @ @ @F tddffe7 e7 e7 e7P JNGK^6 ^6 ^6 ^6B? ? ?D IN%*G G G G G Gs   A AA