o
    :Î®c´  ã                   @   s"   d dl mZ d dlZddd„ZdS )é    )Útrimap_splitNç      Y@Fc                 C   sl   |j dd… \}}t|ƒ\}}}}	|| }
|| }tj |
¡}| | }| ¡ }| ¡  |r2|||
fS ||fS )aò  This function constructs a linear system from a matting Laplacian by constraining the foreground and background pixels with a diagonal matrix `C` to values in the right-hand-side vector `b`. The constraints are weighted by a factor :math:`\lambda`. The linear system is given as

    .. math::

      A = L + \lambda C,

    where :math:`C=\mathop{Diag}(c)` having :math:`c_i = 1` if pixel i is known and :math:`c_i = 0` otherwise.
    The right-hand-side :math:`b` is a vector with entries :math:`b_i = 1` is pixel is is a foreground pixel and :math:`b_i = 0` otherwise.


    Parameters
    ----------
    L: scipy.sparse.spmatrix
        Laplacian matrix, e.g. calculated with :code:`lbdm_laplacian` function
    trimap: numpy.ndarray
        Trimap with shape :math:`h\times w`
    lambda_value: float
        Constraint penalty, defaults to 100
    return_c: bool
        Whether to return the constraint matrix `C`, defaults to False

    Returns
    -------
    A: scipy.sparse.spmatrix
        Matrix describing the system of linear equations
    b: numpy.ndarray
        Vector describing the right-hand side of the system
    C: numpy.ndarray
        Vector describing the diagonal entries of the matrix `C`, only returned if `return_c` is set to True
    Né   )Úshaper   ÚscipyÚsparseÚdiagsÚtocsrÚsum_duplicates)ÚLÚtrimapÚlambda_valueÚreturn_cÚhÚwÚis_fgÚis_bgÚis_knownÚ
is_unknownÚcÚbÚCÚA© r   úD/tmp/pip-target-vg8gfxp4/lib/python/pymatting/laplacian/laplacian.pyÚmake_linear_system   s   
r   )r   F)Úpymatting.util.utilr   Úscipy.sparser   r   r   r   r   r   Ú<module>   s    