
    {KgA                     V   d Z ddlZddlmZ ddlmZmZ ddlZddl	m
Z
 ddlmZ ddlmZmZmZ dd	lmZ dd
lmZmZmZ ddlmZmZ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%m&Z& dZ'd'dZ(	 	 	 	 	 d(dZ) edgejT                  g eeddd      dg eeddd      dgd edh      gdgdgdgdd      dddddddd       Z+ edgdg eeddd      dg eeddd      dgddgdgdgdgdgd	d      dddddddd d!       Z, G d" d#eee%      Z-	 	 	 d)d$Z. G d% d&ee%      Z/y)*z&Orthogonal matching pursuit algorithms    N)sqrt)IntegralReal)linalg)get_lapack_funcs   )MultiOutputMixinRegressorMixin_fit_context)check_cv)Bunchas_float_arraycheck_array)Interval
StrOptionsvalidate_params)MetadataRouterMethodMapping_raise_for_params_routing_enabledprocess_routing)Paralleldelayed   )LinearModel_pre_fitzOrthogonal matching pursuit ended prematurely due to linear dependence in the dictionary. The requested precision might not have been met.TFc                    |r| j                  d      } nt        j                  |       } t        j                  | j                        j
                  }t        j                  d| f      \  }}t        d| f      \  }	t        j                  | j                  |      }
|}t        j                  d      }d}t        j                  | j                  d         }|| j                  d   n|}t        j                  ||f| j                        }|rt        j                  |      }	 t        j                  t        j                   t        j                  | j                  |                  }||k  s|
|   d	z  |k  r"t#        j$                  t&        t(        d	
       n|dkD  rt        j                  | ddd|f   j                  | dd|f         ||d|f<   t        j*                  |d|d|f   ||d|f   dddd        |||d|f         d	z  }t        j,                  | dd|f         d	z  |z
  }||k  r!t#        j$                  t&        t(        d	
       nt/        |      |||f<   nt        j,                  | dd|f         |d<    || j                  |   | j                  |         \  | j                  |<   | j                  |<   |
|   |
|   c|
|<   |
|<   ||   ||   c||<   ||<   |dz  } |	|d|d|f   |
d| dd      \  }}|r|d||dz
  f<   |t        j                  | ddd|f   |      z
  }| ||      d	z  |k  rn||k(  rn4|r||d| ddd|f   |fS ||d| |fS )a  Orthogonal Matching Pursuit step using the Cholesky decomposition.

    Parameters
    ----------
    X : ndarray of shape (n_samples, n_features)
        Input dictionary. Columns are assumed to have unit norm.

    y : ndarray of shape (n_samples,)
        Input targets.

    n_nonzero_coefs : int
        Targeted number of non-zero elements.

    tol : float, default=None
        Targeted squared error, if not None overrides n_nonzero_coefs.

    copy_X : bool, default=True
        Whether the design matrix X must be copied by the algorithm. A false
        value is only helpful if X is already Fortran-ordered, otherwise a
        copy is made anyway.

    return_path : bool, default=False
        Whether to return every value of the nonzero coefficients along the
        forward path. Useful for cross-validation.

    Returns
    -------
    gamma : ndarray of shape (n_nonzero_coefs,)
        Non-zero elements of the solution.

    idx : ndarray of shape (n_nonzero_coefs,)
        Indices of the positions of the elements in gamma within the solution
        vector.

    coef : ndarray of shape (n_features, n_nonzero_coefs)
        The first k values of column k correspond to the coefficient value
        for the active features at that step. The lower left triangle contains
        garbage. Only returned if ``return_path=True``.

    n_active : int
        Number of active features at convergence.
    Fnrm2swappotrsr   r   NdtypeTr   
stacklevelFtransloweroverwrite_bcheck_finiter   r   r*   r+   )copynpasfortranarrayfinfor%   epsr   get_blas_funcsr   dotTemptyarangeshape
empty_likeargmaxabswarningswarn	prematureRuntimeWarningsolve_triangularnormr   )Xyn_nonzero_coefstolcopy_Xreturn_path	min_floatr    r!   r#   alpharesidualgamman_activeindicesmax_featuresLcoefslamvLkk_s                         ]/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/linear_model/_omp.py_cholesky_omprW   $   s   V FF3Ka !%%I&&'7!>JD$
QD1HUFF133NEHHHQKEHii
#G!$1771:oL
,-QWW=Aa 
iirvvacc8456>U3Z1_y8MM)^Ba<%'VVAa(lO,=,=qCy%IAh		!"##)8)YhY&'(IXI%& " Qx(*+,1A++a3i(A-1CiiAF$(IAh !kk!AsF),AdG"&qss8}acc#h"?Hqss3x&+Cj%/#hs*1#,8I'73<A ixi("#U9H%5Tu
q -2E)8)X\)*rvva9H9ou55?tH~2c9%W Z gix(%9H9*=xGGgix((22    c                    |r| j                  d      nt        j                  |       } |s|j                  j                  s|j                         }t        j
                  | j                        j                  }t        j                  d| f      \  }	}
t        d| f      \  }t        j                  t        |             }|}|}d}t        j                  d      }d}|t        |       n|}t        j                  ||f| j                        }d|d<   |rt        j                  |      }	 t        j                  t        j                   |            }||k  s||   d
z  |k  r"t#        j$                  t&        t(        d       n|dkD  r| |d|f   ||d|f<   t        j*                  |d|d|f   ||d|f   ddd	d        |	||d|f         d
z  }| ||f   |z
  }||k  r"t#        j$                  t&        t(        d       n,t-        |      |||f<   nt-        | ||f         |d<    |
| |   | |         \  | |<   | |<    |
| j.                  |   | j.                  |         \  | j.                  |<   | j.                  |<   ||   ||   c||<   ||<   ||   ||   c||<   ||<   |dz  } ||d|d|f   |d| d	d      \  }}|r|d||dz
  f<   t        j0                  | ddd|f   |      }||z
  }|2||z  }t        j2                  ||d|       }||z  }t!        |      |k  rn||k(  rn	|r||d| ddd|f   |fS ||d| |fS )a  Orthogonal Matching Pursuit step on a precomputed Gram matrix.

    This function uses the Cholesky decomposition method.

    Parameters
    ----------
    Gram : ndarray of shape (n_features, n_features)
        Gram matrix of the input data matrix.

    Xy : ndarray of shape (n_features,)
        Input targets.

    n_nonzero_coefs : int
        Targeted number of non-zero elements.

    tol_0 : float, default=None
        Squared norm of y, required if tol is not None.

    tol : float, default=None
        Targeted squared error, if not None overrides n_nonzero_coefs.

    copy_Gram : bool, default=True
        Whether the gram matrix must be copied by the algorithm. A false
        value is only helpful if it is already Fortran-ordered, otherwise a
        copy is made anyway.

    copy_Xy : bool, default=True
        Whether the covariance vector Xy must be copied by the algorithm.
        If False, it may be overwritten.

    return_path : bool, default=False
        Whether to return every value of the nonzero coefficients along the
        forward path. Useful for cross-validation.

    Returns
    -------
    gamma : ndarray of shape (n_nonzero_coefs,)
        Non-zero elements of the solution.

    idx : ndarray of shape (n_nonzero_coefs,)
        Indices of the positions of the elements in gamma within the solution
        vector.

    coefs : ndarray of shape (n_features, n_nonzero_coefs)
        The first k values of column k correspond to the coefficient value
        for the active features at that step. The lower left triangle contains
        garbage. Only returned if ``return_path=True``.

    n_active : int
        Number of active features at convergence.
    r   r   r"   r   Nr$   g      ?r-   Tr      r&   r   Fr(   r.   )r/   r0   r1   flags	writeabler2   r%   r3   r   r4   r   r8   lenr7   r:   r;   r<   r=   r>   r?   r@   rA   r   r6   r5   inner)GramXyrE   tol_0rF   	copy_Gramcopy_XyrH   rI   r    r!   r#   rN   rJ   tol_currdeltarL   rM   rO   rP   rQ   rR   rS   rT   rU   betas                             rV   	_gram_omprg      s   z '499S>B,=,=d,CDbhh((WWY$((I&&'7$AJD$
TG4HUiiD	"GEHEHHQKEH #3t9_L
,-TZZ@AAdGa 
iiu&>U3Z1_y8MM)^Ba<%)#yy.%9Ah		!"##)8)YhY&'(IXI%& " Qx(*+,1AsCx.1$CiiAF$(IAh !4S>*AdG$(hc$C!XS	(,TVVH-=tvvc{(K%x$&&+*1#,8I'73< "3H8bgAixi("#R	]$E
q -2E)8)X\)*vvd1ixi<(%0T	?HHHUD(O4EH8}#%[ ^ gix(%9H9*=xGGgix((22rX   z
array-likeleftclosedbooleanauto)rC   rD   rE   rF   
precomputerG   rH   return_n_iterprefer_skip_nested_validation)rE   rF   rm   rG   rH   rn   c          
      J   t        | d|      } d}|j                  dk(  r|j                  dd      }t        |      }|j                  d   dkD  rd}|'|%t	        t        d| j                  d   z        d      }||| j                  d   kD  rt        d	      |d
k(  r| j                  d   | j                  d   kD  }|rt        j                  | j                  |       }t        j                  |      }t        j                  | j                  |      }	|t        j                  |dz  d      }
nd}
t        ||	|||
|d|      S |r@t        j                  | j                  d   |j                  d   | j                  d   f      }n1t        j                  | j                  d   |j                  d   f      }g }t        |j                  d         D ]  }t        | |dd|f   ||||      }|rP|\  }}}}|dddddt!        |      f   }t#        |j                        D ]  \  }}|d|dz    ||d|dz    ||f<    n|\  }}}||||f<   |j%                  |        |j                  d   dk(  r|d   }|rt        j&                  |      |fS t        j&                  |      S )a^  Orthogonal Matching Pursuit (OMP).

    Solves n_targets Orthogonal Matching Pursuit problems.
    An instance of the problem has the form:

    When parametrized by the number of non-zero coefficients using
    `n_nonzero_coefs`:
    argmin ||y - X\gamma||^2 subject to ||\gamma||_0 <= n_{nonzero coefs}

    When parametrized by error using the parameter `tol`:
    argmin ||\gamma||_0 subject to ||y - X\gamma||^2 <= tol

    Read more in the :ref:`User Guide <omp>`.

    Parameters
    ----------
    X : array-like of shape (n_samples, n_features)
        Input data. Columns are assumed to have unit norm.

    y : ndarray of shape (n_samples,) or (n_samples, n_targets)
        Input targets.

    n_nonzero_coefs : int, default=None
        Desired number of non-zero entries in the solution. If None (by
        default) this value is set to 10% of n_features.

    tol : float, default=None
        Maximum squared norm of the residual. If not None, overrides n_nonzero_coefs.

    precompute : 'auto' or bool, default=False
        Whether to perform precomputations. Improves performance when n_targets
        or n_samples is very large.

    copy_X : bool, default=True
        Whether the design matrix X must be copied by the algorithm. A false
        value is only helpful if X is already Fortran-ordered, otherwise a
        copy is made anyway.

    return_path : bool, default=False
        Whether to return every value of the nonzero coefficients along the
        forward path. Useful for cross-validation.

    return_n_iter : bool, default=False
        Whether or not to return the number of iterations.

    Returns
    -------
    coef : ndarray of shape (n_features,) or (n_features, n_targets)
        Coefficients of the OMP solution. If `return_path=True`, this contains
        the whole coefficient path. In this case its shape is
        (n_features, n_features) or (n_features, n_targets, n_features) and
        iterating over the last axis generates coefficients in increasing order
        of active features.

    n_iters : array-like or int
        Number of active features across every target. Returned only if
        `return_n_iter` is set to True.

    See Also
    --------
    OrthogonalMatchingPursuit : Orthogonal Matching Pursuit model.
    orthogonal_mp_gram : Solve OMP problems using Gram matrix and the product X.T * y.
    lars_path : Compute Least Angle Regression or Lasso path using LARS algorithm.
    sklearn.decomposition.sparse_encode : Sparse coding.

    Notes
    -----
    Orthogonal matching pursuit was introduced in S. Mallat, Z. Zhang,
    Matching pursuits with time-frequency dictionaries, IEEE Transactions on
    Signal Processing, Vol. 41, No. 12. (December 1993), pp. 3397-3415.
    (https://www.di.ens.fr/~mallat/papiers/MallatPursuit93.pdf)

    This implementation is based on Rubinstein, R., Zibulevsky, M. and Elad,
    M., Efficient Implementation of the K-SVD Algorithm using Batch Orthogonal
    Matching Pursuit Technical Report - CS Technion, April 2008.
    https://www.cs.technion.ac.il/~ronrubin/Publications/KSVD-OMP-v2.pdf

    Examples
    --------
    >>> from sklearn.datasets import make_regression
    >>> from sklearn.linear_model import orthogonal_mp
    >>> X, y = make_regression(noise=4, random_state=0)
    >>> coef = orthogonal_mp(X, y)
    >>> coef.shape
    (100,)
    >>> X[:1,] @ coef
    array([-78.68...])
    r   orderr/   Fr   TN皙?>The number of atoms cannot be more than the number of featuresrl   r   r   axis)rE   rF   norms_squaredrb   rc   rH   )rG   rH   )r   ndimreshaper9   maxint
ValueErrorr0   r5   r6   r1   sumorthogonal_mp_gramzerosrangerW   r]   	enumerateappendsqueeze)rC   rD   rE   rF   rm   rG   rH   rn   Gr`   ry   coefn_iterskoutrU   idxrQ   n_iterrM   xs                        rV   orthogonal_mpr   "  s   ` 	ASv.AFvv{IIb!AAwwqzA~3; c#
"23Q7
{3L
 	
 VWWQZ!''!*,
FF133Na VVACC^?FFAqD2M M!+'#	
 		
 xxQWWQZ<=xxQWWQZ01G1771:qAwV
 $'!AsE61jCj()D(1!9:>X\9JS8a<(!X56  2 !NAsFDaLv  	wwqzQ!*zz$((zz$rX   neither)	r_   r`   rE   rF   ry   rb   rc   rH   rn   )rE   rF   ry   rb   rc   rH   rn   c                   t        | d|      } t        j                  |      }|j                  dkD  r|j                  d   dkD  rd}|j                  dk(  r|ddt        j
                  f   }||g}|s|j                  j                  s|j                         }||t        dt        |       z        }||t        d      ||dk  rt        d	      ||dk  rt        d
      ||t        |       kD  rt        d      |rDt        j                  t        |       |j                  d   t        |       f| j                        }	n9t        j                  t        |       |j                  d   f| j                        }	g }
t        |j                  d         D ]  }t        | |dd|f   ||||   nd||d|      }|rP|\  }}}}|	dddddt        |      f   }	t!        |j"                        D ]  \  }}|d|dz    |	|d|dz    ||f<    n|\  }}}||	||f<   |
j%                  |        |j                  d   dk(  r|
d   }
|rt        j&                  |	      |
fS t        j&                  |	      S )an  Gram Orthogonal Matching Pursuit (OMP).

    Solves n_targets Orthogonal Matching Pursuit problems using only
    the Gram matrix X.T * X and the product X.T * y.

    Read more in the :ref:`User Guide <omp>`.

    Parameters
    ----------
    Gram : array-like of shape (n_features, n_features)
        Gram matrix of the input data: `X.T * X`.

    Xy : array-like of shape (n_features,) or (n_features, n_targets)
        Input targets multiplied by `X`: `X.T * y`.

    n_nonzero_coefs : int, default=None
        Desired number of non-zero entries in the solution. If `None` (by
        default) this value is set to 10% of n_features.

    tol : float, default=None
        Maximum squared norm of the residual. If not `None`,
        overrides `n_nonzero_coefs`.

    norms_squared : array-like of shape (n_targets,), default=None
        Squared L2 norms of the lines of `y`. Required if `tol` is not None.

    copy_Gram : bool, default=True
        Whether the gram matrix must be copied by the algorithm. A `False`
        value is only helpful if it is already Fortran-ordered, otherwise a
        copy is made anyway.

    copy_Xy : bool, default=True
        Whether the covariance vector `Xy` must be copied by the algorithm.
        If `False`, it may be overwritten.

    return_path : bool, default=False
        Whether to return every value of the nonzero coefficients along the
        forward path. Useful for cross-validation.

    return_n_iter : bool, default=False
        Whether or not to return the number of iterations.

    Returns
    -------
    coef : ndarray of shape (n_features,) or (n_features, n_targets)
        Coefficients of the OMP solution. If `return_path=True`, this contains
        the whole coefficient path. In this case its shape is
        `(n_features, n_features)` or `(n_features, n_targets, n_features)` and
        iterating over the last axis yields coefficients in increasing order
        of active features.

    n_iters : list or int
        Number of active features across every target. Returned only if
        `return_n_iter` is set to True.

    See Also
    --------
    OrthogonalMatchingPursuit : Orthogonal Matching Pursuit model (OMP).
    orthogonal_mp : Solves n_targets Orthogonal Matching Pursuit problems.
    lars_path : Compute Least Angle Regression or Lasso path using
        LARS algorithm.
    sklearn.decomposition.sparse_encode : Generic sparse coding.
        Each column of the result is the solution to a Lasso problem.

    Notes
    -----
    Orthogonal matching pursuit was introduced in G. Mallat, Z. Zhang,
    Matching pursuits with time-frequency dictionaries, IEEE Transactions on
    Signal Processing, Vol. 41, No. 12. (December 1993), pp. 3397-3415.
    (https://www.di.ens.fr/~mallat/papiers/MallatPursuit93.pdf)

    This implementation is based on Rubinstein, R., Zibulevsky, M. and Elad,
    M., Efficient Implementation of the K-SVD Algorithm using Batch Orthogonal
    Matching Pursuit Technical Report - CS Technion, April 2008.
    https://www.cs.technion.ac.il/~ronrubin/Publications/KSVD-OMP-v2.pdf

    Examples
    --------
    >>> from sklearn.datasets import make_regression
    >>> from sklearn.linear_model import orthogonal_mp_gram
    >>> X, y = make_regression(noise=4, random_state=0)
    >>> coef = orthogonal_mp_gram(X.T @ X, X.T @ y)
    >>> coef.shape
    (100,)
    >>> X[:1,] @ coef
    array([-78.68...])
    r   rr   r   TNru   zSGram OMP needs the precomputed norms in order to evaluate the error sum of squares.r   zEpsilon cannot be negativez$The number of atoms must be positiverv   r$   F)rb   rc   rH   )r   r0   asarrayrz   r9   newaxisr[   r\   r/   r}   r]   r~   r   r%   r   rg   r   r6   r   r   )r_   r`   rE   rF   ry   rb   rc   rH   rn   r   r   r   r   rU   r   rQ   r   rM   r   s                      rV   r   r     s   b t3Y7D	BB	ww{rxx{Q		ww!|2::?*OMbhh((WWY3;cCIo.
=04
 	
 37566
{!+?@@
{T2L
 	
 xxTBHHQKT;4::NxxTBHHQK0

CG288A;q!tH #M!T#	
 $'!AsE61jCj()D(1!9:>X\9JS8a<(!X56  2 !NAsFDaLv'  * 
xx{a!*zz$((zz$rX   c                       e Zd ZU dZ eeddd      dg eeddd      dgdg edh      dgd	Ze	e
d
<   ddddd	dZ ed      d        Zy)OrthogonalMatchingPursuita  Orthogonal Matching Pursuit model (OMP).

    Read more in the :ref:`User Guide <omp>`.

    Parameters
    ----------
    n_nonzero_coefs : int, default=None
        Desired number of non-zero entries in the solution. Ignored if `tol` is set.
        When `None` and `tol` is also `None`, this value is either set to 10% of
        `n_features` or 1, whichever is greater.

    tol : float, default=None
        Maximum squared norm of the residual. If not None, overrides n_nonzero_coefs.

    fit_intercept : bool, default=True
        Whether to calculate the intercept for this model. If set
        to false, no intercept will be used in calculations
        (i.e. data is expected to be centered).

    precompute : 'auto' or bool, default='auto'
        Whether to use a precomputed Gram and Xy matrix to speed up
        calculations. Improves performance when :term:`n_targets` or
        :term:`n_samples` is very large. Note that if you already have such
        matrices, you can pass them directly to the fit method.

    Attributes
    ----------
    coef_ : ndarray of shape (n_features,) or (n_targets, n_features)
        Parameter vector (w in the formula).

    intercept_ : float or ndarray of shape (n_targets,)
        Independent term in decision function.

    n_iter_ : int or array-like
        Number of active features across every target.

    n_nonzero_coefs_ : int or None
        The number of non-zero coefficients in the solution or `None` when `tol` is
        set. If `n_nonzero_coefs` is None and `tol` is None this value is either set
        to 10% of `n_features` or 1, whichever is greater.

    n_features_in_ : int
        Number of features seen during :term:`fit`.

        .. versionadded:: 0.24

    feature_names_in_ : ndarray of shape (`n_features_in_`,)
        Names of features seen during :term:`fit`. Defined only when `X`
        has feature names that are all strings.

        .. versionadded:: 1.0

    See Also
    --------
    orthogonal_mp : Solves n_targets Orthogonal Matching Pursuit problems.
    orthogonal_mp_gram :  Solves n_targets Orthogonal Matching Pursuit
        problems using only the Gram matrix X.T * X and the product X.T * y.
    lars_path : Compute Least Angle Regression or Lasso path using LARS algorithm.
    Lars : Least Angle Regression model a.k.a. LAR.
    LassoLars : Lasso model fit with Least Angle Regression a.k.a. Lars.
    sklearn.decomposition.sparse_encode : Generic sparse coding.
        Each column of the result is the solution to a Lasso problem.
    OrthogonalMatchingPursuitCV : Cross-validated
        Orthogonal Matching Pursuit model (OMP).

    Notes
    -----
    Orthogonal matching pursuit was introduced in G. Mallat, Z. Zhang,
    Matching pursuits with time-frequency dictionaries, IEEE Transactions on
    Signal Processing, Vol. 41, No. 12. (December 1993), pp. 3397-3415.
    (https://www.di.ens.fr/~mallat/papiers/MallatPursuit93.pdf)

    This implementation is based on Rubinstein, R., Zibulevsky, M. and Elad,
    M., Efficient Implementation of the K-SVD Algorithm using Batch Orthogonal
    Matching Pursuit Technical Report - CS Technion, April 2008.
    https://www.cs.technion.ac.il/~ronrubin/Publications/KSVD-OMP-v2.pdf

    Examples
    --------
    >>> from sklearn.linear_model import OrthogonalMatchingPursuit
    >>> from sklearn.datasets import make_regression
    >>> X, y = make_regression(noise=4, random_state=0)
    >>> reg = OrthogonalMatchingPursuit().fit(X, y)
    >>> reg.score(X, y)
    0.9991...
    >>> reg.predict(X[:1,])
    array([-78.3854...])
    r   Nrh   ri   r   rk   rl   rE   rF   fit_interceptrm   _parameter_constraintsTc                <    || _         || _        || _        || _        y Nr   )selfrE   rF   r   rm   s        rV   __init__z"OrthogonalMatchingPursuit.__init__  s"      /*$rX   ro   c           
         | j                  ||dd      \  }}|j                  d   }t        ||d| j                  | j                  d      \  }}}}}}}|j
                  dk(  r|ddt        j                  f   }| j                  *| j                  t        t        d|z        d      | _        n%| j                  d| _        n| j                  | _        |du r/t        ||| j                  | j                  ddd      \  }	| _        nW| j                  t        j                  |d	z  d
      nd}
t!        ||| j                  | j                  |
ddd      \  }	| _        |	j"                  | _        | j'                  |||       | S )a  Fit the model using X, y as training data.

        Parameters
        ----------
        X : array-like of shape (n_samples, n_features)
            Training data.

        y : array-like of shape (n_samples,) or (n_samples, n_targets)
            Target values. Will be cast to X's dtype if necessary.

        Returns
        -------
        self : object
            Returns an instance of self.
        T)multi_output	y_numericr   Nr/   ru   F)rE   rF   rm   rG   rn   r   r   rw   )r`   rE   rF   ry   rb   rc   rn   )_validate_datar9   r   rm   r   rz   r0   r   rE   rF   r|   r}   n_nonzero_coefs_r   n_iter_r   r   r6   coef__set_intercept)r   rC   rD   
n_featuresX_offsety_offsetX_scaler_   r`   r   norms_sqs              rV   fitzOrthogonalMatchingPursuit.fit  s|   " ""1add"K1WWQZ
6>q$););$7
31h'4 66Q;!RZZ- A'DHH,< %(C*,<(=q$AD!XX!$(D!$($8$8D!5="/ $ 5 5HH "#E4< 04xx/Crvvad+H"4 $ 5 5HH&"	#E4< WW
Hh8rX   )__name__
__module____qualname____doc__r   r   r   r   r   dict__annotations__r   r   r    rX   rV   r   r     s    Wt %Xq$vFMq$v6=#!6(+Y7	$D  % 5< 6<rX   r   c           	         |r@| j                         } |j                         }|j                         }|j                         }|rR| j                  d      }| |z  } ||z  }|j                  d      }t        |d      }||z  }t        |d      }||z  }t        | ||dddd      }	|	j                  dk(  r|	ddt
        j                  f   }	t        j                  |	j                  |j                        |z
  S )	a[  Compute the residues on left-out data for a full LARS path.

    Parameters
    ----------
    X_train : ndarray of shape (n_samples, n_features)
        The data to fit the LARS on.

    y_train : ndarray of shape (n_samples)
        The target variable to fit LARS on.

    X_test : ndarray of shape (n_samples, n_features)
        The data to compute the residues on.

    y_test : ndarray of shape (n_samples)
        The target variable to compute the residues on.

    copy : bool, default=True
        Whether X_train, X_test, y_train and y_test should be copied.  If
        False, they may be overwritten.

    fit_intercept : bool, default=True
        Whether to calculate the intercept for this model. If set
        to false, no intercept will be used in calculations
        (i.e. data is expected to be centered).

    max_iter : int, default=100
        Maximum numbers of iterations to perform, therefore maximum features
        to include. 100 by default.

    Returns
    -------
    residues : ndarray of shape (n_samples, max_features)
        Residues of the prediction on the test data.
    r   rw   Fr   NT)rE   rF   rm   rG   rH   r   )	r/   meanr   r   rz   r0   r   r5   r6   )
X_trainy_trainX_testy_testr/   r   max_iterX_meany_meanrQ   s
             rV   _omp_path_residuesr   3  s    X ,,.,,.1%6&1% u56U3& E zzQam$66%''688$v--rX   c                       e Zd ZU dZdgdg eeddd      dgdgedgdgd	Zeed
<   ddddddd	dZ	 e
d      d        Zd Zy)OrthogonalMatchingPursuitCVa  Cross-validated Orthogonal Matching Pursuit model (OMP).

    See glossary entry for :term:`cross-validation estimator`.

    Read more in the :ref:`User Guide <omp>`.

    Parameters
    ----------
    copy : bool, default=True
        Whether the design matrix X must be copied by the algorithm. A false
        value is only helpful if X is already Fortran-ordered, otherwise a
        copy is made anyway.

    fit_intercept : bool, default=True
        Whether to calculate the intercept for this model. If set
        to false, no intercept will be used in calculations
        (i.e. data is expected to be centered).

    max_iter : int, default=None
        Maximum numbers of iterations to perform, therefore maximum features
        to include. 10% of ``n_features`` but at least 5 if available.

    cv : int, cross-validation generator or iterable, default=None
        Determines the cross-validation splitting strategy.
        Possible inputs for cv are:

        - None, to use the default 5-fold cross-validation,
        - integer, to specify the number of folds.
        - :term:`CV splitter`,
        - An iterable yielding (train, test) splits as arrays of indices.

        For integer/None inputs, :class:`~sklearn.model_selection.KFold` is used.

        Refer :ref:`User Guide <cross_validation>` for the various
        cross-validation strategies that can be used here.

        .. versionchanged:: 0.22
            ``cv`` default value if None changed from 3-fold to 5-fold.

    n_jobs : int, default=None
        Number of CPUs to use during the cross validation.
        ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context.
        ``-1`` means using all processors. See :term:`Glossary <n_jobs>`
        for more details.

    verbose : bool or int, default=False
        Sets the verbosity amount.

    Attributes
    ----------
    intercept_ : float or ndarray of shape (n_targets,)
        Independent term in decision function.

    coef_ : ndarray of shape (n_features,) or (n_targets, n_features)
        Parameter vector (w in the problem formulation).

    n_nonzero_coefs_ : int
        Estimated number of non-zero coefficients giving the best mean squared
        error over the cross-validation folds.

    n_iter_ : int or array-like
        Number of active features across every target for the model refit with
        the best hyperparameters got by cross-validating across all folds.

    n_features_in_ : int
        Number of features seen during :term:`fit`.

        .. versionadded:: 0.24

    feature_names_in_ : ndarray of shape (`n_features_in_`,)
        Names of features seen during :term:`fit`. Defined only when `X`
        has feature names that are all strings.

        .. versionadded:: 1.0

    See Also
    --------
    orthogonal_mp : Solves n_targets Orthogonal Matching Pursuit problems.
    orthogonal_mp_gram : Solves n_targets Orthogonal Matching Pursuit
        problems using only the Gram matrix X.T * X and the product X.T * y.
    lars_path : Compute Least Angle Regression or Lasso path using LARS algorithm.
    Lars : Least Angle Regression model a.k.a. LAR.
    LassoLars : Lasso model fit with Least Angle Regression a.k.a. Lars.
    OrthogonalMatchingPursuit : Orthogonal Matching Pursuit model (OMP).
    LarsCV : Cross-validated Least Angle Regression model.
    LassoLarsCV : Cross-validated Lasso model fit with Least Angle Regression.
    sklearn.decomposition.sparse_encode : Generic sparse coding.
        Each column of the result is the solution to a Lasso problem.

    Notes
    -----
    In `fit`, once the optimal number of non-zero coefficients is found through
    cross-validation, the model is fit again using the entire training set.

    Examples
    --------
    >>> from sklearn.linear_model import OrthogonalMatchingPursuitCV
    >>> from sklearn.datasets import make_regression
    >>> X, y = make_regression(n_features=100, n_informative=10,
    ...                        noise=4, random_state=0)
    >>> reg = OrthogonalMatchingPursuitCV(cv=5).fit(X, y)
    >>> reg.score(X, y)
    0.9991...
    >>> reg.n_nonzero_coefs_
    np.int64(10)
    >>> reg.predict(X[:1,])
    array([-78.3854...])
    rk   r   Nrh   ri   	cv_objectverboser/   r   r   cvn_jobsr   r   TFc                X    || _         || _        || _        || _        || _        || _        y r   r   )r   r/   r   r   r   r   r   s          rV   r   z$OrthogonalMatchingPursuitCV.__init__  s/     	* rX   ro   c           	          t        | d        j                  dd      \  t        dd      t         j                  d      }t               rt         dfi |}nt               }t        i       |_         j                  s<t        t        t        d	j                  d
   z        d      j                  d
         n j                   t         j                   j                          fd |j"                  fi |j                  j"                  D              }t        d |D              }t%        j&                  |D cg c]  }|d| dz  j)                  d
       c}      }	t%        j*                  |	j)                  d            d
z   }
|
 _        t/        |
 j0                        j3                        }|j4                   _        |j6                   _        |j8                   _         S c c}w )a  Fit the model using X, y as training data.

        Parameters
        ----------
        X : array-like of shape (n_samples, n_features)
            Training data.

        y : array-like of shape (n_samples,)
            Target values. Will be cast to X's dtype if necessary.

        **fit_params : dict
            Parameters to pass to the underlying splitter.

            .. versionadded:: 1.4
                Only available if `enable_metadata_routing=True`,
                which can be set by using
                ``sklearn.set_config(enable_metadata_routing=True)``.
                See :ref:`Metadata Routing User Guide <metadata_routing>` for
                more details.

        Returns
        -------
        self : object
            Returns an instance of self.
        r   Tr   )r   ensure_min_featuresF)r/   force_all_finite)
classifier)splitru   r      )r   r   c           
   3      K   | ]B  \  }} t        t              |   |   |   |   j                  j                         D y wr   )r   r   r/   r   ).0traintestrC   r   r   rD   s      rV   	<genexpr>z2OrthogonalMatchingPursuitCV.fit.<locals>.<genexpr>1  s`      F
  Kt (G&'%%$$		""  Ks   AAc              3   :   K   | ]  }|j                   d      yw)r   N)r9   )r   folds     rV   r   z2OrthogonalMatchingPursuitCV.fit.<locals>.<genexpr>>  s     @xtTZZ]xs   Nrw   r   )rE   r   )r   r   r   r   r   r   r   r   splitterr   minr|   r}   r9   r   r   r   r   r0   arrayr   argminr   r   r   r   r   
intercept_r   )r   rC   rD   
fit_paramsr   routed_paramscv_pathsmin_early_stopr   	mse_foldsbest_n_nonzero_coefsompr   s   ```         @rV   r   zOrthogonalMatchingPursuitCV.fit  s   6 	*dE2""1a4Q"O1155Adgg%0+D%F:FM "GM%*_M" == Caggaj()1-qwwqz: 	
 F84;;E F
  (rxxJ]-C-C-I-IJF
 
 @x@@HHCKL84d?N#q(..A.68L
	  "yyQ)?@1D 4'0,,
 #a) 	
 YY
..{{ Ms   Hc                     t        | j                  j                        j                  | j                  t               j                  dd            }|S )aj  Get metadata routing of this object.

        Please check :ref:`User Guide <metadata_routing>` on how the routing
        mechanism works.

        .. versionadded:: 1.4

        Returns
        -------
        routing : MetadataRouter
            A :class:`~sklearn.utils.metadata_routing.MetadataRouter` encapsulating
            routing information.
        )ownerr   r   )callercallee)r   method_mapping)r   	__class__r   addr   r   )r   routers     rV   get_metadata_routingz0OrthogonalMatchingPursuitCV.get_metadata_routingN  sL      dnn&=&=>BBWW(?..eG.L C 
 rX   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   rX   rV   r   r   ~  s    k\ #h4?FmT";$D  " 5E 6ENrX   r   )NTF)NNTTF)TTd   )0r   r=   mathr   numbersr   r   numpyr0   scipyr   scipy.linalg.lapackr   baser	   r
   r   model_selectionr   utilsr   r   r   utils._param_validationr   r   r   utils.metadata_routingr   r   r   r   r   utils.parallelr   r   _baser   r   r?   rW   rg   ndarrayr   r   r   r   r   r   rX   rV   <module>r      s   ,   "   0 A A & 6 6 K K  / ( 
q3p G3T ^jj\$Xq$vFMq$v6= *fX"67+!{#	 #'" a a H n$Xq$yI4Pq$v6=&-[;!{#
 #'$ a a Hk 0.+ kf 
H.Vc.+ crX   