|
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