| 
21 | 21 | from skglm.utils.jit_compilation import compiled_clone  | 
22 | 22 | from skglm.solvers import AndersonCD, MultiTaskBCD, GroupBCD  | 
23 | 23 | from skglm.datafits import (Cox, Quadratic, Logistic, QuadraticSVC,  | 
24 |  | -                            QuadraticMultiTask, QuadraticGroup, HessianQuadratic)  | 
 | 24 | +                            QuadraticMultiTask, QuadraticGroup, QuadraticHessian)  | 
25 | 25 | from skglm.penalties import (L1, WeightedL1, L1_plus_L2, L2, WeightedGroupL2,  | 
26 | 26 |                              MCPenalty, WeightedMCPenalty, IndicatorBox, L2_1)  | 
27 | 27 | from skglm.utils.data import grp_converter  | 
@@ -126,8 +126,7 @@ def _glm_fit(X, y, model, datafit, penalty, solver):  | 
126 | 126 |             w = np.zeros(n_features + fit_intercept, dtype=X_.dtype)  | 
127 | 127 |             Xw = np.zeros(n_samples, dtype=X_.dtype)  | 
128 | 128 |         else:  # multitask  | 
129 |  | -            w = np.zeros((n_features + fit_intercept,  | 
130 |  | -                         y.shape[1]), dtype=X_.dtype)  | 
 | 129 | +            w = np.zeros((n_features + fit_intercept, y.shape[1]), dtype=X_.dtype)  | 
131 | 130 |             Xw = np.zeros(y.shape, dtype=X_.dtype)  | 
132 | 131 | 
 
  | 
133 | 132 |     # check consistency of weights for WeightedL1  | 
@@ -450,42 +449,6 @@ def path(self, X, y, alphas, coef_init=None, return_n_iter=True, **params):  | 
450 | 449 |         return solver.path(X, y, datafit, penalty, alphas, coef_init, return_n_iter)  | 
451 | 450 | 
 
  | 
452 | 451 | 
 
  | 
453 |  | -class L1PenalizedQP(BaseEstimator):  | 
454 |  | -    def __init__(self, alpha=1., max_iter=50, max_epochs=50_000, p0=10, verbose=0,  | 
455 |  | -                 tol=1e-4, positive=False, fit_intercept=True, warm_start=False,  | 
456 |  | -                 ws_strategy="subdiff"):  | 
457 |  | -        super().__init__()  | 
458 |  | -        self.alpha = alpha  | 
459 |  | -        self.tol = tol  | 
460 |  | -        self.max_iter = max_iter  | 
461 |  | -        self.max_epochs = max_epochs  | 
462 |  | -        self.p0 = p0  | 
463 |  | -        self.ws_strategy = ws_strategy  | 
464 |  | -        self.positive = positive  | 
465 |  | -        self.fit_intercept = fit_intercept  | 
466 |  | -        self.warm_start = warm_start  | 
467 |  | -        self.verbose = verbose  | 
468 |  | - | 
469 |  | -    def fit(self, A, b):  | 
470 |  | -        """Fit the model according to the given training data.  | 
471 |  | -
  | 
472 |  | -        Parameters  | 
473 |  | -        ----------  | 
474 |  | -        A : array-like, shape (n_features, n_features)  | 
475 |  | -        b : array-like, shape (n_samples,)  | 
476 |  | -
  | 
477 |  | -        Returns  | 
478 |  | -        -------  | 
479 |  | -        self :  | 
480 |  | -            Fitted estimator.  | 
481 |  | -        """  | 
482 |  | -        solver = AndersonCD(  | 
483 |  | -            self.max_iter, self.max_epochs, self.p0, tol=self.tol,  | 
484 |  | -            ws_strategy=self.ws_strategy, fit_intercept=self.fit_intercept,  | 
485 |  | -            warm_start=self.warm_start, verbose=self.verbose)  | 
486 |  | -        return _glm_fit(A, b, self, HessianQuadratic(), L1(self.alpha, self.positive), solver)  | 
487 |  | - | 
488 |  | - | 
489 | 452 | class WeightedLasso(LinearModel, RegressorMixin):  | 
490 | 453 |     r"""WeightedLasso estimator based on Celer solver and primal extrapolation.  | 
491 | 454 | 
  | 
@@ -613,8 +576,7 @@ def path(self, X, y, alphas, coef_init=None, return_n_iter=True, **params):  | 
613 | 576 |             raise ValueError("The number of weights must match the number of \  | 
614 | 577 |                               features. Got %s, expected %s." % (  | 
615 | 578 |                 len(weights), X.shape[1]))  | 
616 |  | -        penalty = compiled_clone(WeightedL1(  | 
617 |  | -            self.alpha, weights, self.positive))  | 
 | 579 | +        penalty = compiled_clone(WeightedL1(self.alpha, weights, self.positive))  | 
618 | 580 |         datafit = compiled_clone(Quadratic(), to_float32=X.dtype == np.float32)  | 
619 | 581 |         solver = AndersonCD(  | 
620 | 582 |             self.max_iter, self.max_epochs, self.p0, tol=self.tol,  | 
@@ -952,8 +914,7 @@ def path(self, X, y, alphas, coef_init=None, return_n_iter=True, **params):  | 
952 | 914 |                     f"Got {len(self.weights)}, expected {X.shape[1]}."  | 
953 | 915 |                 )  | 
954 | 916 |             penalty = compiled_clone(  | 
955 |  | -                WeightedMCPenalty(self.alpha, self.gamma,  | 
956 |  | -                                  self.weights, self.positive)  | 
 | 917 | +                WeightedMCPenalty(self.alpha, self.gamma, self.weights, self.positive)  | 
957 | 918 |             )  | 
958 | 919 |         datafit = compiled_clone(Quadratic(), to_float32=X.dtype == np.float32)  | 
959 | 920 |         solver = AndersonCD(  | 
@@ -1348,8 +1309,7 @@ def fit(self, X, y):  | 
1348 | 1309 |             # copy/paste from https://github.com/scikit-learn/scikit-learn/blob/ \  | 
1349 | 1310 |             # 23ff51c07ebc03c866984e93c921a8993e96d1f9/sklearn/utils/ \  | 
1350 | 1311 |             # estimator_checks.py#L3886  | 
1351 |  | -            raise ValueError(  | 
1352 |  | -                "requires y to be passed, but the target y is None")  | 
 | 1312 | +            raise ValueError("requires y to be passed, but the target y is None")  | 
1353 | 1313 |         y = check_array(  | 
1354 | 1314 |             y,  | 
1355 | 1315 |             accept_sparse=False,  | 
@@ -1390,8 +1350,7 @@ def fit(self, X, y):  | 
1390 | 1350 | 
 
  | 
1391 | 1351 |         # init solver  | 
1392 | 1352 |         if self.l1_ratio == 0.:  | 
1393 |  | -            solver = LBFGS(max_iter=self.max_iter,  | 
1394 |  | -                           tol=self.tol, verbose=self.verbose)  | 
 | 1353 | +            solver = LBFGS(max_iter=self.max_iter, tol=self.tol, verbose=self.verbose)  | 
1395 | 1354 |         else:  | 
1396 | 1355 |             solver = ProxNewton(  | 
1397 | 1356 |                 max_iter=self.max_iter, tol=self.tol, verbose=self.verbose,  | 
@@ -1529,8 +1488,7 @@ def fit(self, X, Y):  | 
1529 | 1488 |         if not self.warm_start or not hasattr(self, "coef_"):  | 
1530 | 1489 |             self.coef_ = None  | 
1531 | 1490 | 
 
  | 
1532 |  | -        datafit_jit = compiled_clone(  | 
1533 |  | -            QuadraticMultiTask(), X.dtype == np.float32)  | 
 | 1491 | +        datafit_jit = compiled_clone(QuadraticMultiTask(), X.dtype == np.float32)  | 
1534 | 1492 |         penalty_jit = compiled_clone(L2_1(self.alpha), X.dtype == np.float32)  | 
1535 | 1493 | 
 
  | 
1536 | 1494 |         solver = MultiTaskBCD(  | 
@@ -1710,8 +1668,7 @@ def fit(self, X, y):  | 
1710 | 1668 |                 "The total number of group members must equal the number of features. "  | 
1711 | 1669 |                 f"Got {n_features}, expected {X.shape[1]}.")  | 
1712 | 1670 | 
 
  | 
1713 |  | -        weights = np.ones(  | 
1714 |  | -            len(group_sizes)) if self.weights is None else self.weights  | 
 | 1671 | +        weights = np.ones(len(group_sizes)) if self.weights is None else self.weights  | 
1715 | 1672 |         group_penalty = WeightedGroupL2(alpha=self.alpha, grp_ptr=grp_ptr,  | 
1716 | 1673 |                                         grp_indices=grp_indices, weights=weights,  | 
1717 | 1674 |                                         positive=self.positive)  | 
 | 
0 commit comments