|
18 | 18 | from sklearn.utils._param_validation import Interval, StrOptions |
19 | 19 | from sklearn.multiclass import OneVsRestClassifier, check_classification_targets |
20 | 20 |
|
21 | | -from skglm.utils.jit_compilation import compiled_clone |
22 | 21 | from skglm.solvers import AndersonCD, MultiTaskBCD, GroupBCD |
23 | 22 | from skglm.datafits import (Cox, Quadratic, Logistic, QuadraticSVC, |
24 | 23 | QuadraticMultiTask, QuadraticGroup,) |
@@ -102,12 +101,10 @@ def _glm_fit(X, y, model, datafit, penalty, solver): |
102 | 101 |
|
103 | 102 | n_samples, n_features = X_.shape |
104 | 103 |
|
105 | | - penalty_jit = compiled_clone(penalty) |
106 | | - datafit_jit = compiled_clone(datafit, to_float32=X.dtype == np.float32) |
107 | 104 | if issparse(X): |
108 | | - datafit_jit.initialize_sparse(X_.data, X_.indptr, X_.indices, y) |
| 105 | + datafit.initialize_sparse(X_.data, X_.indptr, X_.indices, y) |
109 | 106 | else: |
110 | | - datafit_jit.initialize(X_, y) |
| 107 | + datafit.initialize(X_, y) |
111 | 108 |
|
112 | 109 | # if model.warm_start and hasattr(model, 'coef_') and model.coef_ is not None: |
113 | 110 | if solver.warm_start and hasattr(model, 'coef_') and model.coef_ is not None: |
@@ -136,7 +133,7 @@ def _glm_fit(X, y, model, datafit, penalty, solver): |
136 | 133 | "The size of the WeightedL1 penalty weights should be n_features, " |
137 | 134 | "expected %i, got %i." % (X_.shape[1], len(penalty.weights))) |
138 | 135 |
|
139 | | - coefs, p_obj, kkt = solver.solve(X_, y, datafit_jit, penalty_jit, w, Xw) |
| 136 | + coefs, p_obj, kkt = solver.solve(X_, y, datafit, penalty, w, Xw) |
140 | 137 | model.coef_, model.stop_crit_ = coefs[:n_features], kkt |
141 | 138 | if y.ndim == 1: |
142 | 139 | model.intercept_ = coefs[-1] if fit_intercept else 0. |
@@ -440,8 +437,8 @@ def path(self, X, y, alphas, coef_init=None, return_n_iter=True, **params): |
440 | 437 | The number of iterations along the path. If return_n_iter is set to |
441 | 438 | ``True``. |
442 | 439 | """ |
443 | | - penalty = compiled_clone(L1(self.alpha, self.positive)) |
444 | | - datafit = compiled_clone(Quadratic(), to_float32=X.dtype == np.float32) |
| 440 | + penalty = L1(self.alpha, self.positive) |
| 441 | + datafit = Quadratic() |
445 | 442 | solver = AndersonCD( |
446 | 443 | self.max_iter, self.max_epochs, self.p0, tol=self.tol, |
447 | 444 | ws_strategy=self.ws_strategy, fit_intercept=self.fit_intercept, |
@@ -581,8 +578,8 @@ def path(self, X, y, alphas, coef_init=None, return_n_iter=True, **params): |
581 | 578 | raise ValueError("The number of weights must match the number of \ |
582 | 579 | features. Got %s, expected %s." % ( |
583 | 580 | len(weights), X.shape[1])) |
584 | | - penalty = compiled_clone(WeightedL1(self.alpha, weights, self.positive)) |
585 | | - datafit = compiled_clone(Quadratic(), to_float32=X.dtype == np.float32) |
| 581 | + penalty = WeightedL1(self.alpha, weights, self.positive) |
| 582 | + datafit = Quadratic() |
586 | 583 | solver = AndersonCD( |
587 | 584 | self.max_iter, self.max_epochs, self.p0, tol=self.tol, |
588 | 585 | ws_strategy=self.ws_strategy, fit_intercept=self.fit_intercept, |
@@ -744,8 +741,8 @@ def path(self, X, y, alphas, coef_init=None, return_n_iter=True, **params): |
744 | 741 | The number of iterations along the path. If return_n_iter is set to |
745 | 742 | ``True``. |
746 | 743 | """ |
747 | | - penalty = compiled_clone(L1_plus_L2(self.alpha, self.l1_ratio, self.positive)) |
748 | | - datafit = compiled_clone(Quadratic(), to_float32=X.dtype == np.float32) |
| 744 | + penalty = L1_plus_L2(self.alpha, self.l1_ratio, self.positive) |
| 745 | + datafit = Quadratic() |
749 | 746 | solver = AndersonCD( |
750 | 747 | self.max_iter, self.max_epochs, self.p0, tol=self.tol, |
751 | 748 | ws_strategy=self.ws_strategy, fit_intercept=self.fit_intercept, |
@@ -917,19 +914,17 @@ def path(self, X, y, alphas, coef_init=None, return_n_iter=True, **params): |
917 | 914 | ``True``. |
918 | 915 | """ |
919 | 916 | if self.weights is None: |
920 | | - penalty = compiled_clone( |
921 | | - MCPenalty(self.alpha, self.gamma, self.positive) |
922 | | - ) |
| 917 | + penalty = MCPenalty(self.alpha, self.gamma, self.positive) |
923 | 918 | else: |
924 | 919 | if X.shape[1] != len(self.weights): |
925 | 920 | raise ValueError( |
926 | 921 | "The number of weights must match the number of features. " |
927 | 922 | f"Got {len(self.weights)}, expected {X.shape[1]}." |
928 | 923 | ) |
929 | | - penalty = compiled_clone( |
930 | | - WeightedMCPenalty(self.alpha, self.gamma, self.weights, self.positive) |
931 | | - ) |
932 | | - datafit = compiled_clone(Quadratic(), to_float32=X.dtype == np.float32) |
| 924 | + penalty = WeightedMCPenalty( |
| 925 | + self.alpha, self.gamma, self.weights, self.positive) |
| 926 | + |
| 927 | + datafit = Quadratic() |
933 | 928 | solver = AndersonCD( |
934 | 929 | self.max_iter, self.max_epochs, self.p0, tol=self.tol, |
935 | 930 | ws_strategy=self.ws_strategy, fit_intercept=self.fit_intercept, |
@@ -1369,10 +1364,6 @@ def fit(self, X, y): |
1369 | 1364 | else: |
1370 | 1365 | penalty = L2(self.alpha) |
1371 | 1366 |
|
1372 | | - # skglm internal: JIT compile classes |
1373 | | - datafit = compiled_clone(datafit) |
1374 | | - penalty = compiled_clone(penalty) |
1375 | | - |
1376 | 1367 | # init solver |
1377 | 1368 | if self.l1_ratio == 0.: |
1378 | 1369 | solver = LBFGS(max_iter=self.max_iter, tol=self.tol, verbose=self.verbose) |
@@ -1518,14 +1509,14 @@ def fit(self, X, Y): |
1518 | 1509 | if not self.warm_start or not hasattr(self, "coef_"): |
1519 | 1510 | self.coef_ = None |
1520 | 1511 |
|
1521 | | - datafit_jit = compiled_clone(QuadraticMultiTask(), X.dtype == np.float32) |
1522 | | - penalty_jit = compiled_clone(L2_1(self.alpha), X.dtype == np.float32) |
| 1512 | + datafit = QuadraticMultiTask() |
| 1513 | + penalty = L2_1(self.alpha) |
1523 | 1514 |
|
1524 | 1515 | solver = MultiTaskBCD( |
1525 | 1516 | self.max_iter, self.max_epochs, self.p0, tol=self.tol, |
1526 | 1517 | ws_strategy=self.ws_strategy, fit_intercept=self.fit_intercept, |
1527 | 1518 | warm_start=self.warm_start, verbose=self.verbose) |
1528 | | - W, obj_out, kkt = solver.solve(X, Y, datafit_jit, penalty_jit) |
| 1519 | + W, obj_out, kkt = solver.solve(X, Y, datafit, penalty) |
1529 | 1520 |
|
1530 | 1521 | self.coef_ = W[:X.shape[1], :].T |
1531 | 1522 | self.intercept_ = self.fit_intercept * W[-1, :] |
@@ -1573,8 +1564,8 @@ def path(self, X, Y, alphas, coef_init=None, return_n_iter=False, **params): |
1573 | 1564 | The number of iterations along the path. If return_n_iter is set to |
1574 | 1565 | ``True``. |
1575 | 1566 | """ |
1576 | | - datafit = compiled_clone(QuadraticMultiTask(), to_float32=X.dtype == np.float32) |
1577 | | - penalty = compiled_clone(L2_1(self.alpha)) |
| 1567 | + datafit = QuadraticMultiTask() |
| 1568 | + penalty = L2_1(self.alpha) |
1578 | 1569 | solver = MultiTaskBCD( |
1579 | 1570 | self.max_iter, self.max_epochs, self.p0, tol=self.tol, |
1580 | 1571 | ws_strategy=self.ws_strategy, fit_intercept=self.fit_intercept, |
|
0 commit comments