diff --git a/doc/modules/tree.rst b/doc/modules/tree.rst index e35f028a1eb96..9606397b388a9 100644 --- a/doc/modules/tree.rst +++ b/doc/modules/tree.rst @@ -312,10 +312,13 @@ total cost over the entire trees (by summing the cost at each node) of Scikit-learn offers a more efficient implementation for the construction of decision trees. A naive implementation (as above) would recompute the class label histograms (for classification) or the means (for regression) at for each -new split point along a given feature. By presorting the feature over all -relevant samples, and retaining a running label count, we reduce the complexity +new split point along a given feature. Presorting the feature over all +relevant samples, and retaining a running label count, will reduce the complexity at each node to :math:`O(n_{features}\log(n_{samples}))`, which results in a -total cost of :math:`O(n_{features}n_{samples}\log(n_{samples}))`. +total cost of :math:`O(n_{features}n_{samples}\log(n_{samples}))`. This is an option +for all tree based algorithms. By default it is turned on for gradient boosting, +where in general it makes training faster, but turned off for all other algorithms as +it tends to slow down training when training deep trees. Tips on practical use diff --git a/doc/whats_new.rst b/doc/whats_new.rst index 3c9de1e82144a..7f1334c2a035b 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -202,6 +202,11 @@ Enhancements - Added ``sample_weight`` support to :class:`linear_model.LogisticRegression` for the ``lbfgs``, ``newton-cg``, and ``sag`` solvers. By `Valentin Stolbunov`_. + - Added optional parameter ``presort`` to :class:`ensemble.GradientBoostingRegressor` + and :class:`ensemble.GradientBoostingClassifier`, keeping default behavior + the same. This allows gradient boosters to turn off presorting when building + deep trees or using sparse data. By `Jacob Schreiber`_. + Bug fixes ......... diff --git a/sklearn/ensemble/_gradient_boosting.c b/sklearn/ensemble/_gradient_boosting.c index cd2c5b7138123..f13c336ba9d1f 100644 --- a/sklearn/ensemble/_gradient_boosting.c +++ b/sklearn/ensemble/_gradient_boosting.c @@ -995,6 +995,7 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; */ typedef npy_cdouble __pyx_t_5numpy_complex_t; struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord; +struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init; /* "sklearn/tree/_splitter.pxd":23 * ctypedef np.npy_uint32 UINT32_t # Unsigned 32 bit integer @@ -1011,6 +1012,18 @@ struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord { double impurity_left; double impurity_right; }; + +/* "sklearn/tree/_splitter.pxd":84 + * + * # Methods + * cdef void init(self, object X, np.ndarray y, # <<<<<<<<<<<<<< + * DOUBLE_t* sample_weight, + * np.ndarray X_idx_sorted=*) except * + */ +struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init { + int __pyx_n; + PyArrayObject *X_idx_sorted; +}; struct __pyx_t_7sklearn_4tree_5_tree_Node; struct __pyx_opt_args_7sklearn_4tree_5_tree_4Tree__resize_c; struct __pyx_opt_args_7sklearn_4tree_5_tree_4Tree_compute_feature_importances; @@ -1061,12 +1074,13 @@ struct __pyx_opt_args_7sklearn_4tree_5_tree_4Tree_compute_feature_importances { * cdef SIZE_t max_depth # Maximal tree depth * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=*) - * cdef _check_input(self, object X, np.ndarray y, np.ndarray sample_weight) + * np.ndarray sample_weight=*, + * np.ndarray X_idx_sorted=*) */ struct __pyx_opt_args_7sklearn_4tree_5_tree_11TreeBuilder_build { int __pyx_n; PyArrayObject *sample_weight; + PyArrayObject *X_idx_sorted; }; /* "sklearn/tree/_criterion.pxd":21 @@ -1123,6 +1137,7 @@ struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter { __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *feature_values; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t start; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t end; + int presort; __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *y; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t y_stride; __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *sample_weight; @@ -1278,7 +1293,7 @@ static struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *__pyx_vtab */ struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter { - void (*init)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *); + void (*init)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *, struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init *__pyx_optional_args); void (*node_reset)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, double *); void (*node_split)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *); void (*node_value)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double *); diff --git a/sklearn/ensemble/gradient_boosting.py b/sklearn/ensemble/gradient_boosting.py index e7e57ddeaa6ed..3425a132108ad 100644 --- a/sklearn/ensemble/gradient_boosting.py +++ b/sklearn/ensemble/gradient_boosting.py @@ -22,36 +22,48 @@ from __future__ import print_function from __future__ import division -from abc import ABCMeta, abstractmethod -from time import time - -import numbers -import numpy as np -from scipy import stats +from abc import ABCMeta +from abc import abstractmethod from .base import BaseEnsemble from ..base import BaseEstimator from ..base import ClassifierMixin from ..base import RegressorMixin -from ..utils import check_random_state, check_array, check_X_y, column_or_1d -from ..utils import check_consistent_length, deprecated -from ..utils.extmath import logsumexp -from ..utils.fixes import expit, bincount -from ..utils.stats import _weighted_percentile -from ..utils.validation import check_is_fitted, NotFittedError + from ..externals import six from ..feature_selection.from_model import _LearntSelectorMixin -from ..tree.tree import DecisionTreeRegressor -from ..tree._tree import DTYPE, TREE_LEAF -from ..tree._splitter import PresortBestSplitter -from ..tree._criterion import FriedmanMSE - from ._gradient_boosting import predict_stages from ._gradient_boosting import predict_stage from ._gradient_boosting import _random_sample_mask +import numbers +import numpy as np + +from scipy import stats +from scipy.sparse import csc_matrix +from scipy.sparse import csr_matrix +from scipy.sparse import issparse + +from time import time +from ..tree.tree import DecisionTreeRegressor +from ..tree._tree import DTYPE +from ..tree._tree import TREE_LEAF + +from ..utils import check_random_state +from ..utils import check_array +from ..utils import check_X_y +from ..utils import column_or_1d +from ..utils import check_consistent_length +from ..utils import deprecated +from ..utils.extmath import logsumexp +from ..utils.fixes import expit +from ..utils.fixes import bincount +from ..utils.stats import _weighted_percentile +from ..utils.validation import check_is_fitted +from ..utils.validation import NotFittedError + class QuantileEstimator(BaseEstimator): """An estimator predicting the alpha-quantile of the training targets.""" @@ -711,7 +723,7 @@ def __init__(self, loss, learning_rate, n_estimators, min_samples_split, min_samples_leaf, min_weight_fraction_leaf, max_depth, init, subsample, max_features, random_state, alpha=0.9, verbose=0, max_leaf_nodes=None, - warm_start=False): + warm_start=False, presort='auto'): self.n_estimators = n_estimators self.learning_rate = learning_rate @@ -728,11 +740,12 @@ def __init__(self, loss, learning_rate, n_estimators, min_samples_split, self.verbose = verbose self.max_leaf_nodes = max_leaf_nodes self.warm_start = warm_start + self.presort = presort self.estimators_ = np.empty((0, 0), dtype=np.object) def _fit_stage(self, i, X, y, y_pred, sample_weight, sample_mask, - criterion, splitter, random_state): + random_state, X_idx_sorted, X_csc=None, X_csr=None): """Fit another stage of ``n_classes_`` trees to the boosting model. """ assert sample_mask.dtype == np.bool @@ -748,27 +761,37 @@ def _fit_stage(self, i, X, y, y_pred, sample_weight, sample_mask, # induce regression tree on residuals tree = DecisionTreeRegressor( - criterion=criterion, - splitter=splitter, + criterion='friedman_mse', + splitter='best', max_depth=self.max_depth, min_samples_split=self.min_samples_split, min_samples_leaf=self.min_samples_leaf, min_weight_fraction_leaf=self.min_weight_fraction_leaf, max_features=self.max_features, max_leaf_nodes=self.max_leaf_nodes, - random_state=random_state) + random_state=random_state, + presort=self.presort) if self.subsample < 1.0: # no inplace multiplication! sample_weight = sample_weight * sample_mask.astype(np.float64) - tree.fit(X, residual, sample_weight=sample_weight, - check_input=False) + if X_csc is not None: + tree.fit(X_csc, residual, sample_weight=sample_weight, + check_input=False, X_idx_sorted=X_idx_sorted) + else: + tree.fit(X, residual, sample_weight=sample_weight, + check_input=False, X_idx_sorted=X_idx_sorted) # update tree leaves - loss.update_terminal_regions(tree.tree_, X, y, residual, y_pred, - sample_weight, sample_mask, - self.learning_rate, k=k) + if X_csr is not None: + loss.update_terminal_regions(tree.tree_, X_csr, y, residual, y_pred, + sample_weight, sample_mask, + self.learning_rate, k=k) + else: + loss.update_terminal_regions(tree.tree_, X, y, residual, y_pred, + sample_weight, sample_mask, + self.learning_rate, k=k) # add tree to ensemble self.estimators_[i, k] = tree @@ -944,7 +967,7 @@ def fit(self, X, y, sample_weight=None, monitor=None): self._clear_state() # Check input - X, y = check_X_y(X, y, dtype=DTYPE) + X, y = check_X_y(X, y, accept_sparse=['csr', 'csc', 'coo'], dtype=DTYPE) n_samples, self.n_features = X.shape if sample_weight is None: sample_weight = np.ones(n_samples, dtype=np.float32) @@ -981,9 +1004,25 @@ def fit(self, X, y, sample_weight=None, monitor=None): y_pred = self._decision_function(X) self._resize_state() + X_idx_sorted = None + presort = self.presort + # Allow presort to be 'auto', which means True if the dataset is dense, + # otherwise it will be False. + if presort == 'auto' and issparse(X): + presort = False + elif presort == 'auto': + presort = True + + if self.presort == True: + if issparse(X): + raise ValueError("Presorting is not supported for sparse matrices.") + else: + X_idx_sorted = np.asfortranarray(np.argsort(X, axis=0), + dtype=np.int32) + # fit the boosting stages n_stages = self._fit_stages(X, y, y_pred, sample_weight, random_state, - begin_at_stage, monitor) + begin_at_stage, monitor, X_idx_sorted) # change shape of arrays after fit (early-stopping or additional ests) if n_stages != self.estimators_.shape[0]: self.estimators_ = self.estimators_[:n_stages] @@ -994,7 +1033,7 @@ def fit(self, X, y, sample_weight=None, monitor=None): return self def _fit_stages(self, X, y, y_pred, sample_weight, random_state, - begin_at_stage=0, monitor=None): + begin_at_stage=0, monitor=None, X_idx_sorted=None): """Iteratively fits the stages. For each stage it computes the progress (OOB, train score) @@ -1015,18 +1054,13 @@ def _fit_stages(self, X, y, y_pred, sample_weight, random_state, else: min_weight_leaf = 0. - # init criterion and splitter - criterion = FriedmanMSE(1) - splitter = PresortBestSplitter(criterion, - self.max_features_, - self.min_samples_leaf, - min_weight_leaf, - random_state) - if self.verbose: verbose_reporter = VerboseReporter(self.verbose) verbose_reporter.init(self, begin_at_stage) + X_csc = csc_matrix(X) if issparse(X) else None + X_csr = csr_matrix(X) if issparse(X) else None + # perform boosting iterations i = begin_at_stage for i in range(begin_at_stage, self.n_estimators): @@ -1042,8 +1076,8 @@ def _fit_stages(self, X, y, y_pred, sample_weight, random_state, # fit next stage of trees y_pred = self._fit_stage(i, X, y, y_pred, sample_weight, - sample_mask, criterion, splitter, - random_state) + sample_mask, random_state, X_idx_sorted, + X_csc, X_csr) # track deviance (= loss) if do_oob: @@ -1074,6 +1108,7 @@ def _make_estimator(self, append=True): def _init_decision_function(self, X): """Check input and compute prediction of ``init``. """ self._check_initialized() + X = self.estimators_[0, 0]._validate_X_predict(X, check_input=True) if X.shape[1] != self.n_features: raise ValueError("X.shape[1] should be {0:d}, not {1:d}.".format( self.n_features, X.shape[1])) @@ -1104,7 +1139,9 @@ def decision_function(self, X): Regression and binary classification produce an array of shape [n_samples]. """ - X = check_array(X, dtype=DTYPE, order="C") + + self._check_initialized() + X = self.estimators_[0, 0]._validate_X_predict(X, check_input=True) score = self._decision_function(X) if score.shape[1] == 1: return score.ravel() @@ -1318,6 +1355,12 @@ class GradientBoostingClassifier(BaseGradientBoosting, ClassifierMixin): If None, the random number generator is the RandomState instance used by `np.random`. + presort : bool or 'auto', optional (default='auto') + Whether to presort the data to speed up the finding of best splits in + fitting. Auto mode by default will use presorting on dense data and + default to normal sorting on sparse data. Setting presort to true on + sparse data will raise an error. + Attributes ---------- feature_importances_ : array, shape = [n_features] @@ -1369,7 +1412,8 @@ def __init__(self, loss='deviance', learning_rate=0.1, n_estimators=100, min_samples_leaf=1, min_weight_fraction_leaf=0., max_depth=3, init=None, random_state=None, max_features=None, verbose=0, - max_leaf_nodes=None, warm_start=False): + max_leaf_nodes=None, warm_start=False, + presort='auto'): super(GradientBoostingClassifier, self).__init__( loss=loss, learning_rate=learning_rate, n_estimators=n_estimators, @@ -1379,7 +1423,8 @@ def __init__(self, loss='deviance', learning_rate=0.1, n_estimators=100, max_depth=max_depth, init=init, subsample=subsample, max_features=max_features, random_state=random_state, verbose=verbose, - max_leaf_nodes=max_leaf_nodes, warm_start=warm_start) + max_leaf_nodes=max_leaf_nodes, warm_start=warm_start, + presort=presort) def _validate_y(self, y): self.classes_, y = np.unique(y, return_inverse=True) @@ -1644,6 +1689,11 @@ class GradientBoostingRegressor(BaseGradientBoosting, RegressorMixin): If None, the random number generator is the RandomState instance used by `np.random`. + presort : bool or 'auto', optional (default='auto') + Whether to presort the data to speed up the finding of best splits in + fitting. Auto mode by default will use presorting on dense data and + default to normal sorting on sparse data. Setting presort to true on + sparse data will raise an error. Attributes ---------- @@ -1693,7 +1743,7 @@ def __init__(self, loss='ls', learning_rate=0.1, n_estimators=100, min_samples_leaf=1, min_weight_fraction_leaf=0., max_depth=3, init=None, random_state=None, max_features=None, alpha=0.9, verbose=0, max_leaf_nodes=None, - warm_start=False): + warm_start=False, presort='auto'): super(GradientBoostingRegressor, self).__init__( loss=loss, learning_rate=learning_rate, n_estimators=n_estimators, @@ -1703,7 +1753,8 @@ def __init__(self, loss='ls', learning_rate=0.1, n_estimators=100, max_depth=max_depth, init=init, subsample=subsample, max_features=max_features, random_state=random_state, alpha=alpha, verbose=verbose, - max_leaf_nodes=max_leaf_nodes, warm_start=warm_start) + max_leaf_nodes=max_leaf_nodes, warm_start=warm_start, + presort='auto') def predict(self, X): """Predict regression target for X. diff --git a/sklearn/ensemble/tests/test_forest.py b/sklearn/ensemble/tests/test_forest.py index 43e2e761d1994..1723b6131d5ea 100644 --- a/sklearn/ensemble/tests/test_forest.py +++ b/sklearn/ensemble/tests/test_forest.py @@ -114,8 +114,7 @@ def check_iris_criterion(name, criterion): # Check consistency on dataset iris. ForestClassifier = FOREST_CLASSIFIERS[name] - clf = ForestClassifier(n_estimators=10, criterion=criterion, - random_state=1) + clf = ForestClassifier(n_estimators=10, criterion=criterion, random_state=1) clf.fit(iris.data, iris.target) score = clf.score(iris.data, iris.target) assert_greater(score, 0.9, "Failed with criterion %s and score = %f" @@ -138,7 +137,8 @@ def check_boston_criterion(name, criterion): # Check consistency on dataset boston house prices. ForestRegressor = FOREST_REGRESSORS[name] - clf = ForestRegressor(n_estimators=5, criterion=criterion, random_state=1) + clf = ForestRegressor(n_estimators=5, criterion=criterion, + random_state=1) clf.fit(boston.data, boston.target) score = clf.score(boston.data, boston.target) assert_greater(score, 0.95, "Failed with max_features=None, criterion %s " @@ -194,8 +194,7 @@ def test_probability(): def check_importances(X, y, name, criterion): ForestEstimator = FOREST_ESTIMATORS[name] - est = ForestEstimator(n_estimators=20, criterion=criterion, - random_state=0) + est = ForestEstimator(n_estimators=20, criterion=criterion,random_state=0) est.fit(X, y) importances = est.feature_importances_ n_important = np.sum(importances > 0.1) @@ -213,15 +212,13 @@ def check_importances(X, y, name, criterion): # Check with sample weights sample_weight = check_random_state(0).randint(1, 10, len(X)) - est = ForestEstimator(n_estimators=20, random_state=0, - criterion=criterion) + est = ForestEstimator(n_estimators=20, random_state=0, criterion=criterion) est.fit(X, y, sample_weight=sample_weight) importances = est.feature_importances_ assert_true(np.all(importances >= 0.0)) for scale in [0.5, 10, 100]: - est = ForestEstimator(n_estimators=20, random_state=0, - criterion=criterion) + est = ForestEstimator(n_estimators=20, random_state=0, criterion=criterion) est.fit(X, y, sample_weight=scale * sample_weight) importances_bis = est.feature_importances_ assert_less(np.abs(importances - importances_bis).mean(), 0.001) diff --git a/sklearn/ensemble/tests/test_gradient_boosting.py b/sklearn/ensemble/tests/test_gradient_boosting.py index 38558eaca0045..024e7cf5e3975 100644 --- a/sklearn/ensemble/tests/test_gradient_boosting.py +++ b/sklearn/ensemble/tests/test_gradient_boosting.py @@ -4,6 +4,12 @@ import warnings import numpy as np +from itertools import product + +from scipy.sparse import csr_matrix +from scipy.sparse import csc_matrix +from scipy.sparse import coo_matrix + from sklearn import datasets from sklearn.base import clone from sklearn.ensemble import GradientBoostingClassifier @@ -45,25 +51,27 @@ iris.target = iris.target[perm] -def test_classification_toy(): +def check_classification_toy(presort, loss): # Check classification on a toy dataset. + clf = GradientBoostingClassifier(loss=loss, n_estimators=10, + random_state=1, presort=presort) - for loss in ('deviance', 'exponential'): - clf = GradientBoostingClassifier(loss=loss, n_estimators=10, - random_state=1) + assert_raises(ValueError, clf.predict, T) + + clf.fit(X, y) + assert_array_equal(clf.predict(T), true_result) + assert_equal(10, len(clf.estimators_)) - assert_raises(ValueError, clf.predict, T) + deviance_decrease = (clf.train_score_[:-1] - clf.train_score_[1:]) + assert_true(np.any(deviance_decrease >= 0.0)) - clf.fit(X, y) - assert_array_equal(clf.predict(T), true_result) - assert_equal(10, len(clf.estimators_)) + leaves = clf.apply(X) + assert_equal(leaves.shape, (6, 10, 1)) - deviance_decrease = (clf.train_score_[:-1] - clf.train_score_[1:]) - assert np.any(deviance_decrease >= 0.0), \ - "Train deviance does not monotonically decrease." - leaves = clf.apply(X) - assert_equal(leaves.shape, (6, 10, 1)) +def test_classification_toy(): + for presort, loss in product(('auto', True, False), ('deviance', 'exponential')): + yield check_classification_toy, presort, loss def test_parameter_checks(): @@ -140,7 +148,7 @@ def test_loss_function(): GradientBoostingRegressor(loss='exponential').fit, X, y) -def test_classification_synthetic(): +def check_classification_synthetic(presort, loss): # Test GradientBoostingClassifier on synthetic dataset used by # Hastie et al. in ESLII Example 12.7. X, y = datasets.make_hastie_10_2(n_samples=12000, random_state=1) @@ -148,73 +156,87 @@ def test_classification_synthetic(): X_train, X_test = X[:2000], X[2000:] y_train, y_test = y[:2000], y[2000:] - for loss in ('deviance', 'exponential'): + gbrt = GradientBoostingClassifier(n_estimators=100, min_samples_split=1, + max_depth=1, loss=loss, + learning_rate=1.0, random_state=0, + presort=presort) + gbrt.fit(X_train, y_train) + error_rate = (1.0 - gbrt.score(X_test, y_test)) + assert_less(error_rate, 0.09) + + gbrt = GradientBoostingClassifier(n_estimators=200, min_samples_split=1, + max_depth=1, + learning_rate=1.0, subsample=0.5, + random_state=0, + presort=presort) + gbrt.fit(X_train, y_train) + error_rate = (1.0 - gbrt.score(X_test, y_test)) + assert_less(error_rate, 0.08) - gbrt = GradientBoostingClassifier(n_estimators=100, min_samples_split=1, - max_depth=1, loss=loss, - learning_rate=1.0, random_state=0) - gbrt.fit(X_train, y_train) - error_rate = (1.0 - gbrt.score(X_test, y_test)) - assert error_rate < 0.09, \ - "GB(loss={}) failed with error {}".format(loss, error_rate) - gbrt = GradientBoostingClassifier(n_estimators=200, min_samples_split=1, - max_depth=1, - learning_rate=1.0, subsample=0.5, - random_state=0) - gbrt.fit(X_train, y_train) - error_rate = (1.0 - gbrt.score(X_test, y_test)) - assert error_rate < 0.08, ("Stochastic GradientBoostingClassifier(loss={}) " - "failed with error {}".format(loss, error_rate)) +def test_classification_synthetic(): + for presort, loss in product(('auto', True, False), ('deviance', 'exponential')): + yield check_classification_synthetic, presort, loss -def test_boston(): +def check_boston(presort, loss, subsample): # Check consistency on dataset boston house prices with least squares # and least absolute deviation. - for loss in ("ls", "lad", "huber"): - for subsample in (1.0, 0.5): - last_y_pred = None - for i, sample_weight in enumerate( - (None, np.ones(len(boston.target)), - 2 * np.ones(len(boston.target)))): - clf = GradientBoostingRegressor(n_estimators=100, loss=loss, - max_depth=4, subsample=subsample, - min_samples_split=1, - random_state=1) - - assert_raises(ValueError, clf.predict, boston.data) - clf.fit(boston.data, boston.target, - sample_weight=sample_weight) - leaves = clf.apply(boston.data) - assert_equal(leaves.shape, (506, 100)) - - y_pred = clf.predict(boston.data) - mse = mean_squared_error(boston.target, y_pred) - assert mse < 6.0, "Failed with loss %s and " \ - "mse = %.4f" % (loss, mse) - - if last_y_pred is not None: - np.testing.assert_array_almost_equal( - last_y_pred, y_pred, - err_msg='pred_%d doesnt match last pred_%d for loss %r and subsample %r. ' - % (i, i - 1, loss, subsample)) - - last_y_pred = y_pred + ones = np.ones(len(boston.target)) + last_y_pred = None + for sample_weight in None, ones, 2*ones: + clf = GradientBoostingRegressor(n_estimators=100, + loss=loss, + max_depth=4, + subsample=subsample, + min_samples_split=1, + random_state=1, + presort=presort) + + assert_raises(ValueError, clf.predict, boston.data) + clf.fit(boston.data, boston.target, + sample_weight=sample_weight) + leaves = clf.apply(boston.data) + assert_equal(leaves.shape, (506, 100)) + + y_pred = clf.predict(boston.data) + mse = mean_squared_error(boston.target, y_pred) + assert_less( mse, 6.0 ) + + if last_y_pred is not None: + assert_array_almost_equal(last_y_pred, y_pred) + + last_y_pred = y_pred -def test_iris(): +def test_boston(): + for presort, loss, subsample in product(('auto', True, False), + ('ls', 'lad', 'huber'), + (1.0, 0.5)): + yield check_boston, presort, loss, subsample + + +def check_iris(presort, subsample, sample_weight): # Check consistency on dataset iris. - for subsample in (1.0, 0.5): - for sample_weight in (None, np.ones(len(iris.target))): - clf = GradientBoostingClassifier(n_estimators=100, loss='deviance', - random_state=1, subsample=subsample) - clf.fit(iris.data, iris.target, sample_weight=sample_weight) - score = clf.score(iris.data, iris.target) - assert score > 0.9, "Failed with subsample %.1f " \ - "and score = %f" % (subsample, score) + clf = GradientBoostingClassifier(n_estimators=100, + loss='deviance', + random_state=1, + subsample=subsample, + presort=presort) + clf.fit(iris.data, iris.target, sample_weight=sample_weight) + score = clf.score(iris.data, iris.target) + assert_greater(score, 0.9) + + leaves = clf.apply(iris.data) + assert_equal(leaves.shape, (150, 100, 3)) - leaves = clf.apply(iris.data) - assert_equal(leaves.shape, (150, 100, 3)) + +def test_iris(): + ones = np.ones(len(iris.target)) + for presort, subsample, sample_weight in product(('auto', True, False), + (1.0, 0.5), + (None, ones)): + yield check_iris, presort, subsample, sample_weight def test_regression_synthetic(): @@ -227,52 +249,58 @@ def test_regression_synthetic(): # Friedman1 X, y = datasets.make_friedman1(n_samples=1200, - random_state=random_state, noise=1.0) + random_state=random_state, + noise=1.0) X_train, y_train = X[:200], y[:200] X_test, y_test = X[200:], y[200:] - clf = GradientBoostingRegressor() - clf.fit(X_train, y_train) - mse = mean_squared_error(y_test, clf.predict(X_test)) - assert mse < 5.0, "Failed on Friedman1 with mse = %.4f" % mse + + for presort in True, False: + clf = GradientBoostingRegressor(presort=presort) + clf.fit(X_train, y_train) + mse = mean_squared_error(y_test, clf.predict(X_test)) + assert_less(mse, 5.0) # Friedman2 X, y = datasets.make_friedman2(n_samples=1200, random_state=random_state) X_train, y_train = X[:200], y[:200] X_test, y_test = X[200:], y[200:] - clf = GradientBoostingRegressor(**regression_params) - clf.fit(X_train, y_train) - mse = mean_squared_error(y_test, clf.predict(X_test)) - assert mse < 1700.0, "Failed on Friedman2 with mse = %.4f" % mse + + for presort in True, False: + regression_params['presort'] = presort + clf = GradientBoostingRegressor(**regression_params) + clf.fit(X_train, y_train) + mse = mean_squared_error(y_test, clf.predict(X_test)) + assert_less(mse, 1700.0) # Friedman3 X, y = datasets.make_friedman3(n_samples=1200, random_state=random_state) X_train, y_train = X[:200], y[:200] X_test, y_test = X[200:], y[200:] - clf = GradientBoostingRegressor(**regression_params) - clf.fit(X_train, y_train) - mse = mean_squared_error(y_test, clf.predict(X_test)) - assert mse < 0.015, "Failed on Friedman3 with mse = %.4f" % mse + + for presort in True, False: + regression_params['presort'] = presort + clf = GradientBoostingRegressor(**regression_params) + clf.fit(X_train, y_train) + mse = mean_squared_error(y_test, clf.predict(X_test)) + assert_less(mse, 0.015) def test_feature_importances(): X = np.array(boston.data, dtype=np.float32) y = np.array(boston.target, dtype=np.float32) - clf = GradientBoostingRegressor(n_estimators=100, max_depth=5, - min_samples_split=1, random_state=1) - clf.fit(X, y) - #feature_importances = clf.feature_importances_ - assert_true(hasattr(clf, 'feature_importances_')) - - X_new = clf.transform(X, threshold="mean") - assert_less(X_new.shape[1], X.shape[1]) + for presort in True, False: + clf = GradientBoostingRegressor(n_estimators=100, max_depth=5, + min_samples_split=1, random_state=1, + presort=presort) + clf.fit(X, y) + assert_true(hasattr(clf, 'feature_importances_')) - feature_mask = clf.feature_importances_ > clf.feature_importances_.mean() - assert_array_almost_equal(X_new, X[:, feature_mask]) + X_new = clf.transform(X, threshold="mean") + assert_less(X_new.shape[1], X.shape[1]) - # true feature importance ranking - # true_ranking = np.array([3, 1, 8, 2, 10, 9, 4, 11, 0, 6, 7, 5, 12]) - # assert_array_equal(true_ranking, feature_importances.argsort()) + feature_mask = clf.feature_importances_ > clf.feature_importances_.mean() + assert_array_almost_equal(X_new, X[:, feature_mask]) def test_probability_log(): @@ -286,8 +314,8 @@ def test_probability_log(): # check if probabilities are in [0, 1]. y_proba = clf.predict_proba(T) - assert np.all(y_proba >= 0.0) - assert np.all(y_proba <= 1.0) + assert_true(np.all(y_proba >= 0.0)) + assert_true(np.all(y_proba <= 1.0)) # derive predictions from probabilities y_pred = clf.classes_.take(y_proba.argmax(axis=1), axis=0) @@ -299,14 +327,6 @@ def test_check_inputs(): clf = GradientBoostingClassifier(n_estimators=100, random_state=1) assert_raises(ValueError, clf.fit, X, y + [0, 1]) - from scipy import sparse - X_sparse = sparse.csr_matrix(X) - clf = GradientBoostingClassifier(n_estimators=100, random_state=1) - assert_raises(TypeError, clf.fit, X_sparse, y) - - clf = GradientBoostingClassifier().fit(X, y) - assert_raises(TypeError, clf.predict, X_sparse) - clf = GradientBoostingClassifier(n_estimators=100, random_state=1) assert_raises(ValueError, clf.fit, X, y, sample_weight=([1] * len(y)) + [0, 1]) @@ -595,7 +615,7 @@ def test_oob_improvement(): clf = GradientBoostingClassifier(n_estimators=100, random_state=1, subsample=0.5) clf.fit(X, y) - assert clf.oob_improvement_.shape[0] == 100 + assert_equal(clf.oob_improvement_.shape[0], 100) # hard-coded regression test - change if modification in OOB computation assert_array_almost_equal(clf.oob_improvement_[:5], np.array([0.19, 0.15, 0.12, -0.12, -0.11]), @@ -616,10 +636,8 @@ def test_oob_multilcass_iris(): random_state=1, subsample=0.5) clf.fit(iris.data, iris.target) score = clf.score(iris.data, iris.target) - assert score > 0.9, "Failed with subsample %.1f " \ - "and score = %f" % (0.5, score) - - assert clf.oob_improvement_.shape[0] == clf.n_estimators + assert_greater(score, 0.9) + assert_equal(clf.oob_improvement_.shape[0], clf.n_estimators) # hard-coded regression test - change if modification in OOB computation # FIXME: the following snippet does not yield the same results on 32 bits # assert_array_almost_equal(clf.oob_improvement_[:5], @@ -717,9 +735,9 @@ def test_warm_start_max_depth(): est.fit(X, y) # last 10 trees have different depth - assert est.estimators_[0, 0].max_depth == 1 + assert_equal(est.estimators_[0, 0].max_depth, 1) for i in range(1, 11): - assert est.estimators_[-i, 0].max_depth == 2 + assert_equal(est.estimators_[-i, 0].max_depth, 2) def test_warm_start_clear(): @@ -907,13 +925,13 @@ def test_zero_estimator_clf(): random_state=1, init=ZeroEstimator()) est.fit(X, y) - assert est.score(X, y) > 0.96 + assert_greater(est.score(X, y), 0.96) est = GradientBoostingClassifier(n_estimators=20, max_depth=1, random_state=1, init='zero') est.fit(X, y) - assert est.score(X, y) > 0.96 + assert_greater(est.score(X, y), 0.96) # binary clf mask = y != 0 @@ -922,7 +940,7 @@ def test_zero_estimator_clf(): est = GradientBoostingClassifier(n_estimators=20, max_depth=1, random_state=1, init='zero') est.fit(X, y) - assert est.score(X, y) > 0.96 + assert_greater(est.score(X, y), 0.96) est = GradientBoostingClassifier(n_estimators=20, max_depth=1, random_state=1, init='foobar') @@ -951,9 +969,9 @@ def test_warm_start_wo_nestimators_change(): # Regression test for #3513. clf = GradientBoostingClassifier(n_estimators=10, warm_start=True) clf.fit([[0, 1], [2, 3]], [0, 1]) - assert clf.estimators_.shape[0] == 10 + assert_equal(clf.estimators_.shape[0], 10) clf.fit([[0, 1], [2, 3]], [0, 1]) - assert clf.estimators_.shape[0] == 10 + assert_equal(clf.estimators_.shape[0], 10) def test_probability_exponential(): @@ -968,8 +986,8 @@ def test_probability_exponential(): # check if probabilities are in [0, 1]. y_proba = clf.predict_proba(T) - assert np.all(y_proba >= 0.0) - assert np.all(y_proba <= 1.0) + assert_true(np.all(y_proba >= 0.0)) + assert_true(np.all(y_proba <= 1.0)) score = clf.decision_function(T).ravel() assert_array_almost_equal(y_proba[:, 1], 1.0 / (1.0 + np.exp(-2 * score))) @@ -993,22 +1011,6 @@ def test_non_uniform_weights_toy_edge_case_reg(): assert_greater(gb.predict([[1, 0]])[0], 0.5) -def test_non_uniform_weights_toy_min_weight_leaf(): - # Regression test for issue #4447 - X = [[1, 0], - [1, 0], - [1, 0], - [0, 1], - ] - y = [0, 0, 1, 0] - # ignore the first 2 training samples by setting their weight to 0 - sample_weight = [0, 0, 1, 1] - gb = GradientBoostingRegressor(n_estimators=5, min_weight_fraction_leaf=0.1) - gb.fit(X, y, sample_weight=sample_weight) - assert_true(gb.predict([[1, 0]])[0] > 0.5) - assert_almost_equal(gb.estimators_[0, 0].splitter.min_weight_leaf, 0.2) - - def test_non_uniform_weights_toy_edge_case_clf(): X = [[1, 0], [1, 0], @@ -1022,3 +1024,44 @@ def test_non_uniform_weights_toy_edge_case_clf(): gb.fit(X, y, sample_weight=sample_weight) assert_array_equal(gb.predict([[1, 0]]), [1]) +def check_sparse_input(EstimatorClass, X, X_sparse, y): + dense = EstimatorClass(n_estimators=10, random_state=0, max_depth=2).fit(X, y) + sparse = EstimatorClass(n_estimators=10, random_state=0, max_depth=2, + presort=False).fit(X_sparse, y) + auto = EstimatorClass(n_estimators=10, random_state=0, max_depth=2, + presort='auto').fit(X_sparse, y) + + assert_array_almost_equal(sparse.apply(X), dense.apply(X)) + assert_array_almost_equal(sparse.predict(X), dense.predict(X)) + assert_array_almost_equal(sparse.feature_importances_, + dense.feature_importances_) + + assert_array_almost_equal(sparse.apply(X), auto.apply(X)) + assert_array_almost_equal(sparse.predict(X), auto.predict(X)) + assert_array_almost_equal(sparse.feature_importances_, + auto.feature_importances_) + + if isinstance(EstimatorClass, GradientBoostingClassifier): + assert_array_almost_equal(sparse.predict_proba(X), + dense.predict_proba(X)) + assert_array_almost_equal(sparse.predict_log_proba(X), + dense.predict_log_proba(X)) + + assert_array_almost_equal(sparse.predict_proba(X), + auto.predict_proba(X)) + assert_array_almost_equal(sparse.predict_log_proba(X), + auto.predict_log_proba(X)) + + +def test_sparse_input(): + ests = (GradientBoostingClassifier, GradientBoostingRegressor) + sparse_matrices = (csr_matrix, csc_matrix, coo_matrix) + + y, X = datasets.make_multilabel_classification(random_state=0, + n_samples=50, + n_features=1, + n_classes=20) + y = y[:, 0] + + for EstimatorClass, sparse_matrix in product(ests, sparse_matrices): + yield check_sparse_input, EstimatorClass, X, sparse_matrix(X), y diff --git a/sklearn/tree/_criterion.c b/sklearn/tree/_criterion.c index 16edb3e6b19d8..319badb36769e 100644 --- a/sklearn/tree/_criterion.c +++ b/sklearn/tree/_criterion.c @@ -3552,7 +3552,7 @@ static void __pyx_f_7sklearn_4tree_10_criterion_23ClassificationCriterion_update * * self.weighted_n_left -= w # <<<<<<<<<<<<<< * - * # Upate right part statistics + * # Update right part statistics */ __pyx_v_self->__pyx_base.weighted_n_left = (__pyx_v_self->__pyx_base.weighted_n_left - __pyx_v_w); } @@ -3561,7 +3561,7 @@ static void __pyx_f_7sklearn_4tree_10_criterion_23ClassificationCriterion_update /* "sklearn/tree/_criterion.pyx":461 * - * # Upate right part statistics + * # Update right part statistics * self.weighted_n_right = self.weighted_n_node_samples - self.weighted_n_left # <<<<<<<<<<<<<< * for k in range(self.n_outputs): * for c in range(n_classes[k]): @@ -3569,7 +3569,7 @@ static void __pyx_f_7sklearn_4tree_10_criterion_23ClassificationCriterion_update __pyx_v_self->__pyx_base.weighted_n_right = (__pyx_v_self->__pyx_base.weighted_n_node_samples - __pyx_v_self->__pyx_base.weighted_n_left); /* "sklearn/tree/_criterion.pyx":462 - * # Upate right part statistics + * # Update right part statistics * self.weighted_n_right = self.weighted_n_node_samples - self.weighted_n_left * for k in range(self.n_outputs): # <<<<<<<<<<<<<< * for c in range(n_classes[k]): diff --git a/sklearn/tree/_splitter.c b/sklearn/tree/_splitter.c index 31461cbf31cd3..2181192a3b8cc 100644 --- a/sklearn/tree/_splitter.c +++ b/sklearn/tree/_splitter.c @@ -853,7 +853,6 @@ struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter; struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter; struct __pyx_obj_7sklearn_4tree_9_splitter_BestSplitter; struct __pyx_obj_7sklearn_4tree_9_splitter_RandomSplitter; -struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter; struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter; struct __pyx_obj_7sklearn_4tree_9_splitter_BestSparseSplitter; struct __pyx_obj_7sklearn_4tree_9_splitter_RandomSparseSplitter; @@ -944,6 +943,9 @@ struct __pyx_t_7sklearn_4tree_6_utils_PriorityHeapRecord { double improvement; }; struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord; +struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init; +struct __pyx_opt_args_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init; +struct __pyx_opt_args_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init; /* "sklearn/tree/_splitter.pxd":23 * ctypedef np.npy_uint32 UINT32_t # Unsigned 32 bit integer @@ -961,6 +963,42 @@ struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord { double impurity_right; }; +/* "sklearn/tree/_splitter.pxd":84 + * + * # Methods + * cdef void init(self, object X, np.ndarray y, # <<<<<<<<<<<<<< + * DOUBLE_t* sample_weight, + * np.ndarray X_idx_sorted=*) except * + */ +struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init { + int __pyx_n; + PyArrayObject *X_idx_sorted; +}; + +/* "sklearn/tree/_splitter.pyx":260 + * free(self.sample_mask) + * + * cdef void init(self, # <<<<<<<<<<<<<< + * object X, + * np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, + */ +struct __pyx_opt_args_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init { + int __pyx_n; + PyArrayObject *X_idx_sorted; +}; + +/* "sklearn/tree/_splitter.pyx":868 + * free(self.sorted_samples) + * + * cdef void init(self, # <<<<<<<<<<<<<< + * object X, + * np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, + */ +struct __pyx_opt_args_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init { + int __pyx_n; + PyArrayObject *X_idx_sorted; +}; + /* "sklearn/tree/_criterion.pxd":21 * ctypedef np.npy_uint32 UINT32_t # Unsigned 32 bit integer * @@ -1047,13 +1085,14 @@ struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter { __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *feature_values; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t start; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t end; + int presort; __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *y; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t y_stride; __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *sample_weight; }; -/* "sklearn/tree/_splitter.pyx":231 +/* "sklearn/tree/_splitter.pyx":232 * * * cdef class BaseDenseSplitter(Splitter): # <<<<<<<<<<<<<< @@ -1064,11 +1103,16 @@ struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter { struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter __pyx_base; __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *X; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t X_sample_stride; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t X_fx_stride; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t X_feature_stride; + PyArrayObject *X_idx_sorted; + __pyx_t_7sklearn_4tree_9_splitter_INT32_t *X_idx_sorted_ptr; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t X_idx_sorted_stride; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t n_total_samples; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *sample_mask; }; -/* "sklearn/tree/_splitter.pyx":261 +/* "sklearn/tree/_splitter.pyx":288 * * * cdef class BestSplitter(BaseDenseSplitter): # <<<<<<<<<<<<<< @@ -1080,7 +1124,7 @@ struct __pyx_obj_7sklearn_4tree_9_splitter_BestSplitter { }; -/* "sklearn/tree/_splitter.pyx":567 +/* "sklearn/tree/_splitter.pyx":624 * * * cdef class RandomSplitter(BaseDenseSplitter): # <<<<<<<<<<<<<< @@ -1092,27 +1136,9 @@ struct __pyx_obj_7sklearn_4tree_9_splitter_RandomSplitter { }; -/* "sklearn/tree/_splitter.pyx":778 +/* "sklearn/tree/_splitter.pyx":838 * * - * cdef class PresortBestSplitter(BaseDenseSplitter): # <<<<<<<<<<<<<< - * """Splitter for finding the best split, using presorting.""" - * cdef DTYPE_t* X_old - */ -struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter { - struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter __pyx_base; - __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *X_old; - PyArrayObject *X_argsorted; - __pyx_t_7sklearn_4tree_9_splitter_INT32_t *X_argsorted_ptr; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t X_argsorted_stride; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t n_total_samples; - unsigned char *sample_mask; -}; - - -/* "sklearn/tree/_splitter.pyx":1032 - * n_constant_features[0] = n_total_constants - * * cdef class BaseSparseSplitter(Splitter): # <<<<<<<<<<<<<< * # The sparse splitter works only with csc sparse matrix format * cdef DTYPE_t* X_data @@ -1128,7 +1154,7 @@ struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter { }; -/* "sklearn/tree/_splitter.pyx":1351 +/* "sklearn/tree/_splitter.pyx":1158 * * * cdef class BestSparseSplitter(BaseSparseSplitter): # <<<<<<<<<<<<<< @@ -1140,7 +1166,7 @@ struct __pyx_obj_7sklearn_4tree_9_splitter_BestSparseSplitter { }; -/* "sklearn/tree/_splitter.pyx":1577 +/* "sklearn/tree/_splitter.pyx":1385 * * * cdef class RandomSparseSplitter(BaseSparseSplitter): # <<<<<<<<<<<<<< @@ -1207,7 +1233,7 @@ struct __pyx_vtabstruct_7sklearn_4tree_6_utils_PriorityHeap { static struct __pyx_vtabstruct_7sklearn_4tree_6_utils_PriorityHeap *__pyx_vtabptr_7sklearn_4tree_6_utils_PriorityHeap; -/* "sklearn/tree/_splitter.pyx":55 +/* "sklearn/tree/_splitter.pyx":54 * self.improvement = -INFINITY * * cdef class Splitter: # <<<<<<<<<<<<<< @@ -1216,7 +1242,7 @@ static struct __pyx_vtabstruct_7sklearn_4tree_6_utils_PriorityHeap *__pyx_vtabpt */ struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter { - void (*init)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *); + void (*init)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *, struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init *__pyx_optional_args); void (*node_reset)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, double *); void (*node_split)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *); void (*node_value)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double *); @@ -1225,7 +1251,7 @@ struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter { static struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *__pyx_vtabptr_7sklearn_4tree_9_splitter_Splitter; -/* "sklearn/tree/_splitter.pyx":231 +/* "sklearn/tree/_splitter.pyx":232 * * * cdef class BaseDenseSplitter(Splitter): # <<<<<<<<<<<<<< @@ -1239,7 +1265,7 @@ struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_BaseDenseSplitter { static struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_BaseDenseSplitter *__pyx_vtabptr_7sklearn_4tree_9_splitter_BaseDenseSplitter; -/* "sklearn/tree/_splitter.pyx":261 +/* "sklearn/tree/_splitter.pyx":288 * * * cdef class BestSplitter(BaseDenseSplitter): # <<<<<<<<<<<<<< @@ -1253,7 +1279,7 @@ struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_BestSplitter { static struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_BestSplitter *__pyx_vtabptr_7sklearn_4tree_9_splitter_BestSplitter; -/* "sklearn/tree/_splitter.pyx":567 +/* "sklearn/tree/_splitter.pyx":624 * * * cdef class RandomSplitter(BaseDenseSplitter): # <<<<<<<<<<<<<< @@ -1267,23 +1293,9 @@ struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_RandomSplitter { static struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_RandomSplitter *__pyx_vtabptr_7sklearn_4tree_9_splitter_RandomSplitter; -/* "sklearn/tree/_splitter.pyx":778 +/* "sklearn/tree/_splitter.pyx":838 * * - * cdef class PresortBestSplitter(BaseDenseSplitter): # <<<<<<<<<<<<<< - * """Splitter for finding the best split, using presorting.""" - * cdef DTYPE_t* X_old - */ - -struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_PresortBestSplitter { - struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_BaseDenseSplitter __pyx_base; -}; -static struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_PresortBestSplitter *__pyx_vtabptr_7sklearn_4tree_9_splitter_PresortBestSplitter; - - -/* "sklearn/tree/_splitter.pyx":1032 - * n_constant_features[0] = n_total_constants - * * cdef class BaseSparseSplitter(Splitter): # <<<<<<<<<<<<<< * # The sparse splitter works only with csc sparse matrix format * cdef DTYPE_t* X_data @@ -1299,7 +1311,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_extract_nnz(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *, int *); -/* "sklearn/tree/_splitter.pyx":1351 +/* "sklearn/tree/_splitter.pyx":1158 * * * cdef class BestSparseSplitter(BaseSparseSplitter): # <<<<<<<<<<<<<< @@ -1313,7 +1325,7 @@ struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_BestSparseSplitter { static struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_BestSparseSplitter *__pyx_vtabptr_7sklearn_4tree_9_splitter_BestSparseSplitter; -/* "sklearn/tree/_splitter.pyx":1577 +/* "sklearn/tree/_splitter.pyx":1385 * * * cdef class RandomSparseSplitter(BaseSparseSplitter): # <<<<<<<<<<<<<< @@ -1680,17 +1692,15 @@ static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (** static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); -static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight); /* proto*/ +static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight, struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init *__pyx_optional_args); /* proto*/ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_reset(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_start, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_end, double *__pyx_v_weighted_n_node_samples); /* proto*/ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_split(CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, CYTHON_UNUSED double __pyx_v_impurity, CYTHON_UNUSED struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *__pyx_v_split, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_n_constant_features); /* proto*/ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_value(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, double *__pyx_v_dest); /* proto*/ static double __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_impurity(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self); /* proto*/ -static void __pyx_f_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight); /* proto*/ +static void __pyx_f_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight, struct __pyx_opt_args_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init *__pyx_optional_args); /* proto*/ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct __pyx_obj_7sklearn_4tree_9_splitter_BestSplitter *__pyx_v_self, double __pyx_v_impurity, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *__pyx_v_split, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_n_constant_features); /* proto*/ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_obj_7sklearn_4tree_9_splitter_RandomSplitter *__pyx_v_self, double __pyx_v_impurity, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *__pyx_v_split, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_n_constant_features); /* proto*/ -static void __pyx_f_7sklearn_4tree_9_splitter_19PresortBestSplitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight); /* proto*/ -static void __pyx_f_7sklearn_4tree_9_splitter_19PresortBestSplitter_node_split(struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *__pyx_v_self, double __pyx_v_impurity, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *__pyx_v_split, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_n_constant_features); /* proto*/ -static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight); /* proto*/ +static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight, struct __pyx_opt_args_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init *__pyx_optional_args); /* proto*/ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter__partition(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self, double __pyx_v_threshold, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_end_negative, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_start_positive, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_zero_pos); /* proto*/ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_extract_nnz(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_feature, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_end_negative, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_start_positive, int *__pyx_v_is_samples_sorted); /* proto*/ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(struct __pyx_obj_7sklearn_4tree_9_splitter_BestSparseSplitter *__pyx_v_self, double __pyx_v_impurity, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *__pyx_v_split, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_n_constant_features); /* proto*/ @@ -1741,7 +1751,6 @@ static PyTypeObject *__pyx_ptype_7sklearn_4tree_9_splitter_Splitter = 0; static PyTypeObject *__pyx_ptype_7sklearn_4tree_9_splitter_BaseDenseSplitter = 0; static PyTypeObject *__pyx_ptype_7sklearn_4tree_9_splitter_BestSplitter = 0; static PyTypeObject *__pyx_ptype_7sklearn_4tree_9_splitter_RandomSplitter = 0; -static PyTypeObject *__pyx_ptype_7sklearn_4tree_9_splitter_PresortBestSplitter = 0; static PyTypeObject *__pyx_ptype_7sklearn_4tree_9_splitter_BaseSparseSplitter = 0; static PyTypeObject *__pyx_ptype_7sklearn_4tree_9_splitter_BestSparseSplitter = 0; static PyTypeObject *__pyx_ptype_7sklearn_4tree_9_splitter_RandomSparseSplitter = 0; @@ -1770,7 +1779,7 @@ int __pyx_module_is_main_sklearn__tree___splitter = 0; static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_ValueError; static PyObject *__pyx_builtin_RuntimeError; -static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, double __pyx_v_min_weight_leaf, PyObject *__pyx_v_random_state); /* proto */ +static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, double __pyx_v_min_weight_leaf, PyObject *__pyx_v_random_state, int __pyx_v_presort); /* proto */ static void __pyx_pf_7sklearn_4tree_9_splitter_8Splitter_2__dealloc__(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_8Splitter_4__getstate__(CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_8Splitter_6__setstate__(CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_d); /* proto */ @@ -1783,13 +1792,11 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_8Splitter_16min_samples_leaf static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter_16min_samples_leaf_2__set__(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_8Splitter_15min_weight_leaf___get__(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self); /* proto */ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter_15min_weight_leaf_2__set__(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ -static int __pyx_pf_7sklearn_4tree_9_splitter_17BaseDenseSplitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *__pyx_v_self, CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, CYTHON_UNUSED double __pyx_v_min_weight_leaf, CYTHON_UNUSED PyObject *__pyx_v_random_state); /* proto */ +static int __pyx_pf_7sklearn_4tree_9_splitter_17BaseDenseSplitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *__pyx_v_self, CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, CYTHON_UNUSED double __pyx_v_min_weight_leaf, CYTHON_UNUSED PyObject *__pyx_v_random_state, int __pyx_v_presort); /* proto */ +static void __pyx_pf_7sklearn_4tree_9_splitter_17BaseDenseSplitter_2__dealloc__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_12BestSplitter___reduce__(struct __pyx_obj_7sklearn_4tree_9_splitter_BestSplitter *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_14RandomSplitter___reduce__(struct __pyx_obj_7sklearn_4tree_9_splitter_RandomSplitter *__pyx_v_self); /* proto */ -static int __pyx_pf_7sklearn_4tree_9_splitter_19PresortBestSplitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *__pyx_v_self, CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, CYTHON_UNUSED double __pyx_v_min_weight_leaf, CYTHON_UNUSED PyObject *__pyx_v_random_state); /* proto */ -static void __pyx_pf_7sklearn_4tree_9_splitter_19PresortBestSplitter_2__dealloc__(struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_19PresortBestSplitter_4__reduce__(struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *__pyx_v_self); /* proto */ -static int __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self, CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, CYTHON_UNUSED double __pyx_v_min_weight_leaf, CYTHON_UNUSED PyObject *__pyx_v_random_state); /* proto */ +static int __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self, CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, CYTHON_UNUSED double __pyx_v_min_weight_leaf, CYTHON_UNUSED PyObject *__pyx_v_random_state, CYTHON_UNUSED int __pyx_v_presort); /* proto */ static void __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter_2__dealloc__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_18BestSparseSplitter___reduce__(struct __pyx_obj_7sklearn_4tree_9_splitter_BestSparseSplitter *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_20RandomSparseSplitter___reduce__(struct __pyx_obj_7sklearn_4tree_9_splitter_RandomSparseSplitter *__pyx_v_self); /* proto */ @@ -1799,7 +1806,6 @@ static PyObject *__pyx_tp_new_7sklearn_4tree_9_splitter_Splitter(PyTypeObject *t static PyObject *__pyx_tp_new_7sklearn_4tree_9_splitter_BaseDenseSplitter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_7sklearn_4tree_9_splitter_BestSplitter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_7sklearn_4tree_9_splitter_RandomSplitter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ -static PyObject *__pyx_tp_new_7sklearn_4tree_9_splitter_PresortBestSplitter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_7sklearn_4tree_9_splitter_BaseSparseSplitter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_7sklearn_4tree_9_splitter_BestSparseSplitter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_7sklearn_4tree_9_splitter_RandomSparseSplitter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ @@ -1822,19 +1828,16 @@ static char __pyx_k_Zf[] = "Zf"; static char __pyx_k_Zg[] = "Zg"; static char __pyx_k_np[] = "np"; static char __pyx_k_inf[] = "inf"; -static char __pyx_k_axis[] = "axis"; static char __pyx_k_data[] = "data"; static char __pyx_k_main[] = "__main__"; static char __pyx_k_test[] = "__test__"; -static char __pyx_k_dtype[] = "dtype"; -static char __pyx_k_int32[] = "int32"; static char __pyx_k_numpy[] = "numpy"; static char __pyx_k_range[] = "range"; static char __pyx_k_shape[] = "shape"; static char __pyx_k_import[] = "__import__"; static char __pyx_k_indptr[] = "indptr"; -static char __pyx_k_argsort[] = "argsort"; static char __pyx_k_indices[] = "indices"; +static char __pyx_k_presort[] = "presort"; static char __pyx_k_randint[] = "randint"; static char __pyx_k_strides[] = "strides"; static char __pyx_k_getstate[] = "__getstate__"; @@ -1847,7 +1850,6 @@ static char __pyx_k_RuntimeError[] = "RuntimeError"; static char __pyx_k_max_features[] = "max_features"; static char __pyx_k_random_state[] = "random_state"; static char __pyx_k_scipy_sparse[] = "scipy.sparse"; -static char __pyx_k_asfortranarray[] = "asfortranarray"; static char __pyx_k_min_weight_leaf[] = "min_weight_leaf"; static char __pyx_k_min_samples_leaf[] = "min_samples_leaf"; static char __pyx_k_X_should_be_in_csc_format[] = "X should be in csc format"; @@ -1863,19 +1865,14 @@ static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; static PyObject *__pyx_n_s_RuntimeError; static PyObject *__pyx_n_s_ValueError; static PyObject *__pyx_kp_s_X_should_be_in_csc_format; -static PyObject *__pyx_n_s_argsort; -static PyObject *__pyx_n_s_asfortranarray; -static PyObject *__pyx_n_s_axis; static PyObject *__pyx_n_s_criterion; static PyObject *__pyx_n_s_csc_matrix; static PyObject *__pyx_n_s_data; -static PyObject *__pyx_n_s_dtype; static PyObject *__pyx_n_s_getstate; static PyObject *__pyx_n_s_import; static PyObject *__pyx_n_s_indices; static PyObject *__pyx_n_s_indptr; static PyObject *__pyx_n_s_inf; -static PyObject *__pyx_n_s_int32; static PyObject *__pyx_n_s_itemsize; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_max_features; @@ -1885,6 +1882,7 @@ static PyObject *__pyx_kp_u_ndarray_is_not_C_contiguous; static PyObject *__pyx_kp_u_ndarray_is_not_Fortran_contiguou; static PyObject *__pyx_n_s_np; static PyObject *__pyx_n_s_numpy; +static PyObject *__pyx_n_s_presort; static PyObject *__pyx_n_s_pyx_vtable; static PyObject *__pyx_n_s_randint; static PyObject *__pyx_n_s_random_state; @@ -1903,7 +1901,7 @@ static PyObject *__pyx_tuple__5; static PyObject *__pyx_tuple__6; static PyObject *__pyx_tuple__7; -/* "sklearn/tree/_splitter.pyx":47 +/* "sklearn/tree/_splitter.pyx":46 * cdef DTYPE_t EXTRACT_NNZ_SWITCH = 0.1 * * cdef inline void _init_split(SplitRecord* self, SIZE_t start_pos) nogil: # <<<<<<<<<<<<<< @@ -1913,7 +1911,7 @@ static PyObject *__pyx_tuple__7; static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter__init_split(struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *__pyx_v_self, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_start_pos) { - /* "sklearn/tree/_splitter.pyx":48 + /* "sklearn/tree/_splitter.pyx":47 * * cdef inline void _init_split(SplitRecord* self, SIZE_t start_pos) nogil: * self.impurity_left = INFINITY # <<<<<<<<<<<<<< @@ -1922,7 +1920,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter__init_split(struct _ */ __pyx_v_self->impurity_left = __pyx_v_7sklearn_4tree_9_splitter_INFINITY; - /* "sklearn/tree/_splitter.pyx":49 + /* "sklearn/tree/_splitter.pyx":48 * cdef inline void _init_split(SplitRecord* self, SIZE_t start_pos) nogil: * self.impurity_left = INFINITY * self.impurity_right = INFINITY # <<<<<<<<<<<<<< @@ -1931,7 +1929,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter__init_split(struct _ */ __pyx_v_self->impurity_right = __pyx_v_7sklearn_4tree_9_splitter_INFINITY; - /* "sklearn/tree/_splitter.pyx":50 + /* "sklearn/tree/_splitter.pyx":49 * self.impurity_left = INFINITY * self.impurity_right = INFINITY * self.pos = start_pos # <<<<<<<<<<<<<< @@ -1940,7 +1938,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter__init_split(struct _ */ __pyx_v_self->pos = __pyx_v_start_pos; - /* "sklearn/tree/_splitter.pyx":51 + /* "sklearn/tree/_splitter.pyx":50 * self.impurity_right = INFINITY * self.pos = start_pos * self.feature = 0 # <<<<<<<<<<<<<< @@ -1949,7 +1947,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter__init_split(struct _ */ __pyx_v_self->feature = 0; - /* "sklearn/tree/_splitter.pyx":52 + /* "sklearn/tree/_splitter.pyx":51 * self.pos = start_pos * self.feature = 0 * self.threshold = 0. # <<<<<<<<<<<<<< @@ -1958,7 +1956,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter__init_split(struct _ */ __pyx_v_self->threshold = 0.; - /* "sklearn/tree/_splitter.pyx":53 + /* "sklearn/tree/_splitter.pyx":52 * self.feature = 0 * self.threshold = 0. * self.improvement = -INFINITY # <<<<<<<<<<<<<< @@ -1967,7 +1965,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter__init_split(struct _ */ __pyx_v_self->improvement = (-__pyx_v_7sklearn_4tree_9_splitter_INFINITY); - /* "sklearn/tree/_splitter.pyx":47 + /* "sklearn/tree/_splitter.pyx":46 * cdef DTYPE_t EXTRACT_NNZ_SWITCH = 0.1 * * cdef inline void _init_split(SplitRecord* self, SIZE_t start_pos) nogil: # <<<<<<<<<<<<<< @@ -1978,12 +1976,12 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter__init_split(struct _ /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":62 +/* "sklearn/tree/_splitter.pyx":61 * """ * * def __cinit__(self, Criterion criterion, SIZE_t max_features, # <<<<<<<<<<<<<< * SIZE_t min_samples_leaf, double min_weight_leaf, - * object random_state): + * object random_state, bint presort): */ /* Python wrapper */ @@ -1994,6 +1992,7 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_8Splitter_1__cinit__(PyObject *__p __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf; double __pyx_v_min_weight_leaf; PyObject *__pyx_v_random_state = 0; + int __pyx_v_presort; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -2001,12 +2000,13 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_8Splitter_1__cinit__(PyObject *__p __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_criterion,&__pyx_n_s_max_features,&__pyx_n_s_min_samples_leaf,&__pyx_n_s_min_weight_leaf,&__pyx_n_s_random_state,0}; - PyObject* values[5] = {0,0,0,0,0}; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_criterion,&__pyx_n_s_max_features,&__pyx_n_s_min_samples_leaf,&__pyx_n_s_min_weight_leaf,&__pyx_n_s_random_state,&__pyx_n_s_presort,0}; + PyObject* values[6] = {0,0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); @@ -2023,28 +2023,33 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_8Splitter_1__cinit__(PyObject *__p case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_max_features)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_samples_leaf)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_weight_leaf)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_random_state)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 5: + if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_presort)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } - } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { + } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); @@ -2052,23 +2057,25 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_8Splitter_1__cinit__(PyObject *__p values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + values[5] = PyTuple_GET_ITEM(__pyx_args, 5); } __pyx_v_criterion = ((struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *)values[0]); - __pyx_v_max_features = __Pyx_PyInt_As_Py_intptr_t(values[1]); if (unlikely((__pyx_v_max_features == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_samples_leaf = __Pyx_PyInt_As_Py_intptr_t(values[2]); if (unlikely((__pyx_v_min_samples_leaf == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_weight_leaf = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_min_weight_leaf == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_max_features = __Pyx_PyInt_As_Py_intptr_t(values[1]); if (unlikely((__pyx_v_max_features == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_samples_leaf = __Pyx_PyInt_As_Py_intptr_t(values[2]); if (unlikely((__pyx_v_min_samples_leaf == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_weight_leaf = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_min_weight_leaf == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_random_state = values[4]; + __pyx_v_presort = __Pyx_PyObject_IsTrue(values[5]); if (unlikely((__pyx_v_presort == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._splitter.Splitter.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_10_criterion_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_r = __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(((struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_self), __pyx_v_criterion, __pyx_v_max_features, __pyx_v_min_samples_leaf, __pyx_v_min_weight_leaf, __pyx_v_random_state); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_10_criterion_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(((struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_self), __pyx_v_criterion, __pyx_v_max_features, __pyx_v_min_samples_leaf, __pyx_v_min_weight_leaf, __pyx_v_random_state, __pyx_v_presort); /* function exit code */ goto __pyx_L0; @@ -2079,12 +2086,12 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_8Splitter_1__cinit__(PyObject *__p return __pyx_r; } -static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, double __pyx_v_min_weight_leaf, PyObject *__pyx_v_random_state) { +static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, double __pyx_v_min_weight_leaf, PyObject *__pyx_v_random_state, int __pyx_v_presort) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__", 0); - /* "sklearn/tree/_splitter.pyx":88 + /* "sklearn/tree/_splitter.pyx":87 * """ * * self.criterion = criterion # <<<<<<<<<<<<<< @@ -2097,7 +2104,7 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o __Pyx_DECREF(((PyObject *)__pyx_v_self->criterion)); __pyx_v_self->criterion = __pyx_v_criterion; - /* "sklearn/tree/_splitter.pyx":90 + /* "sklearn/tree/_splitter.pyx":89 * self.criterion = criterion * * self.samples = NULL # <<<<<<<<<<<<<< @@ -2106,7 +2113,7 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o */ __pyx_v_self->samples = NULL; - /* "sklearn/tree/_splitter.pyx":91 + /* "sklearn/tree/_splitter.pyx":90 * * self.samples = NULL * self.n_samples = 0 # <<<<<<<<<<<<<< @@ -2115,7 +2122,7 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o */ __pyx_v_self->n_samples = 0; - /* "sklearn/tree/_splitter.pyx":92 + /* "sklearn/tree/_splitter.pyx":91 * self.samples = NULL * self.n_samples = 0 * self.features = NULL # <<<<<<<<<<<<<< @@ -2124,7 +2131,7 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o */ __pyx_v_self->features = NULL; - /* "sklearn/tree/_splitter.pyx":93 + /* "sklearn/tree/_splitter.pyx":92 * self.n_samples = 0 * self.features = NULL * self.n_features = 0 # <<<<<<<<<<<<<< @@ -2133,7 +2140,7 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o */ __pyx_v_self->n_features = 0; - /* "sklearn/tree/_splitter.pyx":94 + /* "sklearn/tree/_splitter.pyx":93 * self.features = NULL * self.n_features = 0 * self.feature_values = NULL # <<<<<<<<<<<<<< @@ -2142,7 +2149,7 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o */ __pyx_v_self->feature_values = NULL; - /* "sklearn/tree/_splitter.pyx":96 + /* "sklearn/tree/_splitter.pyx":95 * self.feature_values = NULL * * self.y = NULL # <<<<<<<<<<<<<< @@ -2151,7 +2158,7 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o */ __pyx_v_self->y = NULL; - /* "sklearn/tree/_splitter.pyx":97 + /* "sklearn/tree/_splitter.pyx":96 * * self.y = NULL * self.y_stride = 0 # <<<<<<<<<<<<<< @@ -2160,7 +2167,7 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o */ __pyx_v_self->y_stride = 0; - /* "sklearn/tree/_splitter.pyx":98 + /* "sklearn/tree/_splitter.pyx":97 * self.y = NULL * self.y_stride = 0 * self.sample_weight = NULL # <<<<<<<<<<<<<< @@ -2169,7 +2176,7 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o */ __pyx_v_self->sample_weight = NULL; - /* "sklearn/tree/_splitter.pyx":100 + /* "sklearn/tree/_splitter.pyx":99 * self.sample_weight = NULL * * self.max_features = max_features # <<<<<<<<<<<<<< @@ -2178,7 +2185,7 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o */ __pyx_v_self->max_features = __pyx_v_max_features; - /* "sklearn/tree/_splitter.pyx":101 + /* "sklearn/tree/_splitter.pyx":100 * * self.max_features = max_features * self.min_samples_leaf = min_samples_leaf # <<<<<<<<<<<<<< @@ -2187,21 +2194,21 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o */ __pyx_v_self->min_samples_leaf = __pyx_v_min_samples_leaf; - /* "sklearn/tree/_splitter.pyx":102 + /* "sklearn/tree/_splitter.pyx":101 * self.max_features = max_features * self.min_samples_leaf = min_samples_leaf * self.min_weight_leaf = min_weight_leaf # <<<<<<<<<<<<<< * self.random_state = random_state - * + * self.presort = presort */ __pyx_v_self->min_weight_leaf = __pyx_v_min_weight_leaf; - /* "sklearn/tree/_splitter.pyx":103 + /* "sklearn/tree/_splitter.pyx":102 * self.min_samples_leaf = min_samples_leaf * self.min_weight_leaf = min_weight_leaf * self.random_state = random_state # <<<<<<<<<<<<<< + * self.presort = presort * - * def __dealloc__(self): */ __Pyx_INCREF(__pyx_v_random_state); __Pyx_GIVEREF(__pyx_v_random_state); @@ -2209,12 +2216,21 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o __Pyx_DECREF(__pyx_v_self->random_state); __pyx_v_self->random_state = __pyx_v_random_state; - /* "sklearn/tree/_splitter.pyx":62 + /* "sklearn/tree/_splitter.pyx":103 + * self.min_weight_leaf = min_weight_leaf + * self.random_state = random_state + * self.presort = presort # <<<<<<<<<<<<<< + * + * def __dealloc__(self): + */ + __pyx_v_self->presort = __pyx_v_presort; + + /* "sklearn/tree/_splitter.pyx":61 * """ * * def __cinit__(self, Criterion criterion, SIZE_t max_features, # <<<<<<<<<<<<<< * SIZE_t min_samples_leaf, double min_weight_leaf, - * object random_state): + * object random_state, bint presort): */ /* function exit code */ @@ -2224,7 +2240,7 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter___cinit__(struct __pyx_o } /* "sklearn/tree/_splitter.pyx":105 - * self.random_state = random_state + * self.presort = presort * * def __dealloc__(self): # <<<<<<<<<<<<<< * """Destructor.""" @@ -2283,7 +2299,7 @@ static void __pyx_pf_7sklearn_4tree_9_splitter_8Splitter_2__dealloc__(struct __p free(__pyx_v_self->feature_values); /* "sklearn/tree/_splitter.pyx":105 - * self.random_state = random_state + * self.presort = presort * * def __dealloc__(self): # <<<<<<<<<<<<<< * """Destructor.""" @@ -2398,7 +2414,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_8Splitter_6__setstate__(CYTH * np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, */ -static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight) { +static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight, struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init *__pyx_optional_args) { __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_samples; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_samples; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_i; @@ -2425,6 +2441,8 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("init", 0); + if (__pyx_optional_args) { + } __pyx_pybuffer_y.pybuffer.buf = NULL; __pyx_pybuffer_y.refcount = 0; __pyx_pybuffernd_y.data = NULL; @@ -2435,16 +2453,16 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s } __pyx_pybuffernd_y.diminfo[0].strides = __pyx_pybuffernd_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_y.diminfo[0].shape = __pyx_pybuffernd_y.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_y.diminfo[1].strides = __pyx_pybuffernd_y.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_y.diminfo[1].shape = __pyx_pybuffernd_y.rcbuffer->pybuffer.shape[1]; - /* "sklearn/tree/_splitter.pyx":141 + /* "sklearn/tree/_splitter.pyx":142 * """ * * self.rand_r_state = self.random_state.randint(0, RAND_R_MAX) # <<<<<<<<<<<<<< * cdef SIZE_t n_samples = X.shape[0] * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->random_state, __pyx_n_s_randint); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->random_state, __pyx_n_s_randint); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_e_7sklearn_4tree_6_utils_RAND_R_MAX); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_e_7sklearn_4tree_6_utils_RAND_R_MAX); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; @@ -2458,7 +2476,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s __pyx_t_5 = 1; } } - __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); if (__pyx_t_4) { __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; @@ -2469,41 +2487,41 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_t_3); __pyx_t_3 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_7 = __Pyx_PyInt_As_npy_uint32(__pyx_t_1); if (unlikely((__pyx_t_7 == (npy_uint32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyInt_As_npy_uint32(__pyx_t_1); if (unlikely((__pyx_t_7 == (npy_uint32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_self->rand_r_state = __pyx_t_7; - /* "sklearn/tree/_splitter.pyx":142 + /* "sklearn/tree/_splitter.pyx":143 * * self.rand_r_state = self.random_state.randint(0, RAND_R_MAX) * cdef SIZE_t n_samples = X.shape[0] # <<<<<<<<<<<<<< * * # Create a new array which will be used to store nonzero */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_8 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_2); if (unlikely((__pyx_t_8 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_2); if (unlikely((__pyx_t_8 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_n_samples = __pyx_t_8; - /* "sklearn/tree/_splitter.pyx":146 + /* "sklearn/tree/_splitter.pyx":147 * # Create a new array which will be used to store nonzero * # samples from the feature of interest * cdef SIZE_t* samples = safe_realloc(&self.samples, n_samples) # <<<<<<<<<<<<<< * * cdef SIZE_t i, j */ - __pyx_t_9 = __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->samples), __pyx_v_n_samples); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_9 = __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->samples), __pyx_v_n_samples); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_samples = __pyx_t_9; - /* "sklearn/tree/_splitter.pyx":149 + /* "sklearn/tree/_splitter.pyx":150 * * cdef SIZE_t i, j * cdef double weighted_n_samples = 0.0 # <<<<<<<<<<<<<< @@ -2512,7 +2530,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s */ __pyx_v_weighted_n_samples = 0.0; - /* "sklearn/tree/_splitter.pyx":150 + /* "sklearn/tree/_splitter.pyx":151 * cdef SIZE_t i, j * cdef double weighted_n_samples = 0.0 * j = 0 # <<<<<<<<<<<<<< @@ -2521,7 +2539,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s */ __pyx_v_j = 0; - /* "sklearn/tree/_splitter.pyx":152 + /* "sklearn/tree/_splitter.pyx":153 * j = 0 * * for i in range(n_samples): # <<<<<<<<<<<<<< @@ -2532,7 +2550,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_8; __pyx_t_10+=1) { __pyx_v_i = __pyx_t_10; - /* "sklearn/tree/_splitter.pyx":154 + /* "sklearn/tree/_splitter.pyx":155 * for i in range(n_samples): * # Only work with positively weighted samples * if sample_weight == NULL or sample_weight[i] != 0.0: # <<<<<<<<<<<<<< @@ -2550,7 +2568,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s __pyx_L6_bool_binop_done:; if (__pyx_t_11) { - /* "sklearn/tree/_splitter.pyx":155 + /* "sklearn/tree/_splitter.pyx":156 * # Only work with positively weighted samples * if sample_weight == NULL or sample_weight[i] != 0.0: * samples[j] = i # <<<<<<<<<<<<<< @@ -2559,7 +2577,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s */ (__pyx_v_samples[__pyx_v_j]) = __pyx_v_i; - /* "sklearn/tree/_splitter.pyx":156 + /* "sklearn/tree/_splitter.pyx":157 * if sample_weight == NULL or sample_weight[i] != 0.0: * samples[j] = i * j += 1 # <<<<<<<<<<<<<< @@ -2571,7 +2589,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s } __pyx_L5:; - /* "sklearn/tree/_splitter.pyx":158 + /* "sklearn/tree/_splitter.pyx":159 * j += 1 * * if sample_weight != NULL: # <<<<<<<<<<<<<< @@ -2581,7 +2599,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s __pyx_t_11 = ((__pyx_v_sample_weight != NULL) != 0); if (__pyx_t_11) { - /* "sklearn/tree/_splitter.pyx":159 + /* "sklearn/tree/_splitter.pyx":160 * * if sample_weight != NULL: * weighted_n_samples += sample_weight[i] # <<<<<<<<<<<<<< @@ -2593,7 +2611,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s } /*else*/ { - /* "sklearn/tree/_splitter.pyx":161 + /* "sklearn/tree/_splitter.pyx":162 * weighted_n_samples += sample_weight[i] * else: * weighted_n_samples += 1.0 # <<<<<<<<<<<<<< @@ -2605,7 +2623,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s __pyx_L8:; } - /* "sklearn/tree/_splitter.pyx":164 + /* "sklearn/tree/_splitter.pyx":165 * * # Number of samples is number of positively weighted samples * self.n_samples = j # <<<<<<<<<<<<<< @@ -2614,7 +2632,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s */ __pyx_v_self->n_samples = __pyx_v_j; - /* "sklearn/tree/_splitter.pyx":165 + /* "sklearn/tree/_splitter.pyx":166 * # Number of samples is number of positively weighted samples * self.n_samples = j * self.weighted_n_samples = weighted_n_samples # <<<<<<<<<<<<<< @@ -2623,33 +2641,33 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s */ __pyx_v_self->weighted_n_samples = __pyx_v_weighted_n_samples; - /* "sklearn/tree/_splitter.pyx":167 + /* "sklearn/tree/_splitter.pyx":168 * self.weighted_n_samples = weighted_n_samples * * cdef SIZE_t n_features = X.shape[1] # <<<<<<<<<<<<<< * cdef SIZE_t* features = safe_realloc(&self.features, n_features) * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_8 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_8 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_8 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_n_features = __pyx_t_8; - /* "sklearn/tree/_splitter.pyx":168 + /* "sklearn/tree/_splitter.pyx":169 * * cdef SIZE_t n_features = X.shape[1] * cdef SIZE_t* features = safe_realloc(&self.features, n_features) # <<<<<<<<<<<<<< * * for i in range(n_features): */ - __pyx_t_9 = __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->features), __pyx_v_n_features); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_9 = __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->features), __pyx_v_n_features); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_features = __pyx_t_9; - /* "sklearn/tree/_splitter.pyx":170 + /* "sklearn/tree/_splitter.pyx":171 * cdef SIZE_t* features = safe_realloc(&self.features, n_features) * * for i in range(n_features): # <<<<<<<<<<<<<< @@ -2660,7 +2678,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_8; __pyx_t_10+=1) { __pyx_v_i = __pyx_t_10; - /* "sklearn/tree/_splitter.pyx":171 + /* "sklearn/tree/_splitter.pyx":172 * * for i in range(n_features): * features[i] = i # <<<<<<<<<<<<<< @@ -2670,7 +2688,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s (__pyx_v_features[__pyx_v_i]) = __pyx_v_i; } - /* "sklearn/tree/_splitter.pyx":173 + /* "sklearn/tree/_splitter.pyx":174 * features[i] = i * * self.n_features = n_features # <<<<<<<<<<<<<< @@ -2679,25 +2697,25 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s */ __pyx_v_self->n_features = __pyx_v_n_features; - /* "sklearn/tree/_splitter.pyx":175 + /* "sklearn/tree/_splitter.pyx":176 * self.n_features = n_features * * safe_realloc(&self.feature_values, n_samples) # <<<<<<<<<<<<<< * safe_realloc(&self.constant_features, n_features) * */ - __pyx_fuse_0__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->feature_values), __pyx_v_n_samples); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_fuse_0__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->feature_values), __pyx_v_n_samples); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_splitter.pyx":176 + /* "sklearn/tree/_splitter.pyx":177 * * safe_realloc(&self.feature_values, n_samples) * safe_realloc(&self.constant_features, n_features) # <<<<<<<<<<<<<< * * self.y = y.data */ - __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->constant_features), __pyx_v_n_features); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->constant_features), __pyx_v_n_features); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_splitter.pyx":178 + /* "sklearn/tree/_splitter.pyx":179 * safe_realloc(&self.constant_features, n_features) * * self.y = y.data # <<<<<<<<<<<<<< @@ -2706,20 +2724,20 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s */ __pyx_v_self->y = ((__pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *)__pyx_v_y->data); - /* "sklearn/tree/_splitter.pyx":179 + /* "sklearn/tree/_splitter.pyx":180 * * self.y = y.data * self.y_stride = y.strides[0] / y.itemsize # <<<<<<<<<<<<<< * * self.sample_weight = sample_weight */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_y), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_y), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_8 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_8 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_8 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_self->y_stride = (((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)(__pyx_v_y->strides[0])) / ((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)__pyx_t_8)); - /* "sklearn/tree/_splitter.pyx":181 + /* "sklearn/tree/_splitter.pyx":182 * self.y_stride = y.strides[0] / y.itemsize * * self.sample_weight = sample_weight # <<<<<<<<<<<<<< @@ -2756,7 +2774,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_splitter.pyx":183 +/* "sklearn/tree/_splitter.pyx":184 * self.sample_weight = sample_weight * * cdef void node_reset(self, SIZE_t start, SIZE_t end, # <<<<<<<<<<<<<< @@ -2767,7 +2785,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(struct __pyx_obj_7s static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_reset(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_start, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_end, double *__pyx_v_weighted_n_node_samples) { double __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":197 + /* "sklearn/tree/_splitter.pyx":198 * """ * * self.start = start # <<<<<<<<<<<<<< @@ -2776,7 +2794,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_reset(struct __pyx_ */ __pyx_v_self->start = __pyx_v_start; - /* "sklearn/tree/_splitter.pyx":198 + /* "sklearn/tree/_splitter.pyx":199 * * self.start = start * self.end = end # <<<<<<<<<<<<<< @@ -2785,7 +2803,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_reset(struct __pyx_ */ __pyx_v_self->end = __pyx_v_end; - /* "sklearn/tree/_splitter.pyx":200 + /* "sklearn/tree/_splitter.pyx":201 * self.end = end * * self.criterion.init(self.y, # <<<<<<<<<<<<<< @@ -2794,7 +2812,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_reset(struct __pyx_ */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->criterion->__pyx_vtab)->init(__pyx_v_self->criterion, __pyx_v_self->y, __pyx_v_self->y_stride, __pyx_v_self->sample_weight, __pyx_v_self->weighted_n_samples, __pyx_v_self->samples, __pyx_v_start, __pyx_v_end); - /* "sklearn/tree/_splitter.pyx":208 + /* "sklearn/tree/_splitter.pyx":209 * end) * * weighted_n_node_samples[0] = self.criterion.weighted_n_node_samples # <<<<<<<<<<<<<< @@ -2804,7 +2822,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_reset(struct __pyx_ __pyx_t_1 = __pyx_v_self->criterion->weighted_n_node_samples; (__pyx_v_weighted_n_node_samples[0]) = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":183 + /* "sklearn/tree/_splitter.pyx":184 * self.sample_weight = sample_weight * * cdef void node_reset(self, SIZE_t start, SIZE_t end, # <<<<<<<<<<<<<< @@ -2815,7 +2833,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_reset(struct __pyx_ /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":210 +/* "sklearn/tree/_splitter.pyx":211 * weighted_n_node_samples[0] = self.criterion.weighted_n_node_samples * * cdef void node_split(self, double impurity, SplitRecord* split, # <<<<<<<<<<<<<< @@ -2828,7 +2846,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_split(CYTHON_UNUSED /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":220 +/* "sklearn/tree/_splitter.pyx":221 * pass * * cdef void node_value(self, double* dest) nogil: # <<<<<<<<<<<<<< @@ -2838,7 +2856,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_split(CYTHON_UNUSED static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_value(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self, double *__pyx_v_dest) { - /* "sklearn/tree/_splitter.pyx":223 + /* "sklearn/tree/_splitter.pyx":224 * """Copy the value of node samples[start:end] into dest.""" * * self.criterion.node_value(dest) # <<<<<<<<<<<<<< @@ -2847,7 +2865,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_value(struct __pyx_ */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->criterion->__pyx_vtab)->node_value(__pyx_v_self->criterion, __pyx_v_dest); - /* "sklearn/tree/_splitter.pyx":220 + /* "sklearn/tree/_splitter.pyx":221 * pass * * cdef void node_value(self, double* dest) nogil: # <<<<<<<<<<<<<< @@ -2858,7 +2876,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_value(struct __pyx_ /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":225 +/* "sklearn/tree/_splitter.pyx":226 * self.criterion.node_value(dest) * * cdef double node_impurity(self) nogil: # <<<<<<<<<<<<<< @@ -2869,7 +2887,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_value(struct __pyx_ static double __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_impurity(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_self) { double __pyx_r; - /* "sklearn/tree/_splitter.pyx":228 + /* "sklearn/tree/_splitter.pyx":229 * """Return the impurity of the current node.""" * * return self.criterion.node_impurity() # <<<<<<<<<<<<<< @@ -2879,7 +2897,7 @@ static double __pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_impurity(struct _ __pyx_r = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->criterion->__pyx_vtab)->node_impurity(__pyx_v_self->criterion); goto __pyx_L0; - /* "sklearn/tree/_splitter.pyx":225 + /* "sklearn/tree/_splitter.pyx":226 * self.criterion.node_value(dest) * * cdef double node_impurity(self) nogil: # <<<<<<<<<<<<<< @@ -3246,12 +3264,12 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_8Splitter_15min_weight_leaf_2__set return __pyx_r; } -/* "sklearn/tree/_splitter.pyx":236 - * cdef SIZE_t X_fx_stride +/* "sklearn/tree/_splitter.pyx":243 + * cdef SIZE_t* sample_mask * * def __cinit__(self, Criterion criterion, SIZE_t max_features, # <<<<<<<<<<<<<< * SIZE_t min_samples_leaf, double min_weight_leaf, - * object random_state): + * object random_state, bint presort): */ /* Python wrapper */ @@ -3262,6 +3280,7 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_17BaseDenseSplitter_1__cinit__(PyO CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf; CYTHON_UNUSED double __pyx_v_min_weight_leaf; CYTHON_UNUSED PyObject *__pyx_v_random_state = 0; + int __pyx_v_presort; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -3269,12 +3288,13 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_17BaseDenseSplitter_1__cinit__(PyO __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_criterion,&__pyx_n_s_max_features,&__pyx_n_s_min_samples_leaf,&__pyx_n_s_min_weight_leaf,&__pyx_n_s_random_state,0}; - PyObject* values[5] = {0,0,0,0,0}; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_criterion,&__pyx_n_s_max_features,&__pyx_n_s_min_samples_leaf,&__pyx_n_s_min_weight_leaf,&__pyx_n_s_random_state,&__pyx_n_s_presort,0}; + PyObject* values[6] = {0,0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); @@ -3291,28 +3311,33 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_17BaseDenseSplitter_1__cinit__(PyO case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_max_features)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_samples_leaf)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_weight_leaf)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_random_state)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 5: + if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_presort)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } - } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { + } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); @@ -3320,23 +3345,25 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_17BaseDenseSplitter_1__cinit__(PyO values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + values[5] = PyTuple_GET_ITEM(__pyx_args, 5); } __pyx_v_criterion = ((struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *)values[0]); - __pyx_v_max_features = __Pyx_PyInt_As_Py_intptr_t(values[1]); if (unlikely((__pyx_v_max_features == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_samples_leaf = __Pyx_PyInt_As_Py_intptr_t(values[2]); if (unlikely((__pyx_v_min_samples_leaf == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_weight_leaf = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_min_weight_leaf == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_max_features = __Pyx_PyInt_As_Py_intptr_t(values[1]); if (unlikely((__pyx_v_max_features == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_samples_leaf = __Pyx_PyInt_As_Py_intptr_t(values[2]); if (unlikely((__pyx_v_min_samples_leaf == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_weight_leaf = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_min_weight_leaf == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_random_state = values[4]; + __pyx_v_presort = __Pyx_PyObject_IsTrue(values[5]); if (unlikely((__pyx_v_presort == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._splitter.BaseDenseSplitter.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_10_criterion_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_r = __pyx_pf_7sklearn_4tree_9_splitter_17BaseDenseSplitter___cinit__(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *)__pyx_v_self), __pyx_v_criterion, __pyx_v_max_features, __pyx_v_min_samples_leaf, __pyx_v_min_weight_leaf, __pyx_v_random_state); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_10_criterion_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_7sklearn_4tree_9_splitter_17BaseDenseSplitter___cinit__(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *)__pyx_v_self), __pyx_v_criterion, __pyx_v_max_features, __pyx_v_min_samples_leaf, __pyx_v_min_weight_leaf, __pyx_v_random_state, __pyx_v_presort); /* function exit code */ goto __pyx_L0; @@ -3347,44 +3374,80 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_17BaseDenseSplitter_1__cinit__(PyO return __pyx_r; } -static int __pyx_pf_7sklearn_4tree_9_splitter_17BaseDenseSplitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *__pyx_v_self, CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, CYTHON_UNUSED double __pyx_v_min_weight_leaf, CYTHON_UNUSED PyObject *__pyx_v_random_state) { +static int __pyx_pf_7sklearn_4tree_9_splitter_17BaseDenseSplitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *__pyx_v_self, CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, CYTHON_UNUSED double __pyx_v_min_weight_leaf, CYTHON_UNUSED PyObject *__pyx_v_random_state, int __pyx_v_presort) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__", 0); - /* "sklearn/tree/_splitter.pyx":240 - * object random_state): + /* "sklearn/tree/_splitter.pyx":247 + * object random_state, bint presort): * * self.X = NULL # <<<<<<<<<<<<<< * self.X_sample_stride = 0 - * self.X_fx_stride = 0 + * self.X_feature_stride = 0 */ __pyx_v_self->X = NULL; - /* "sklearn/tree/_splitter.pyx":241 + /* "sklearn/tree/_splitter.pyx":248 * * self.X = NULL * self.X_sample_stride = 0 # <<<<<<<<<<<<<< - * self.X_fx_stride = 0 - * + * self.X_feature_stride = 0 + * self.X_idx_sorted_ptr = NULL */ __pyx_v_self->X_sample_stride = 0; - /* "sklearn/tree/_splitter.pyx":242 + /* "sklearn/tree/_splitter.pyx":249 * self.X = NULL * self.X_sample_stride = 0 - * self.X_fx_stride = 0 # <<<<<<<<<<<<<< + * self.X_feature_stride = 0 # <<<<<<<<<<<<<< + * self.X_idx_sorted_ptr = NULL + * self.X_idx_sorted_stride = 0 + */ + __pyx_v_self->X_feature_stride = 0; + + /* "sklearn/tree/_splitter.pyx":250 + * self.X_sample_stride = 0 + * self.X_feature_stride = 0 + * self.X_idx_sorted_ptr = NULL # <<<<<<<<<<<<<< + * self.X_idx_sorted_stride = 0 + * self.sample_mask = NULL + */ + __pyx_v_self->X_idx_sorted_ptr = NULL; + + /* "sklearn/tree/_splitter.pyx":251 + * self.X_feature_stride = 0 + * self.X_idx_sorted_ptr = NULL + * self.X_idx_sorted_stride = 0 # <<<<<<<<<<<<<< + * self.sample_mask = NULL + * self.presort = presort + */ + __pyx_v_self->X_idx_sorted_stride = 0; + + /* "sklearn/tree/_splitter.pyx":252 + * self.X_idx_sorted_ptr = NULL + * self.X_idx_sorted_stride = 0 + * self.sample_mask = NULL # <<<<<<<<<<<<<< + * self.presort = presort * - * cdef void init(self, */ - __pyx_v_self->X_fx_stride = 0; + __pyx_v_self->sample_mask = NULL; + + /* "sklearn/tree/_splitter.pyx":253 + * self.X_idx_sorted_stride = 0 + * self.sample_mask = NULL + * self.presort = presort # <<<<<<<<<<<<<< + * + * def __dealloc__(self): + */ + __pyx_v_self->__pyx_base.presort = __pyx_v_presort; - /* "sklearn/tree/_splitter.pyx":236 - * cdef SIZE_t X_fx_stride + /* "sklearn/tree/_splitter.pyx":243 + * cdef SIZE_t* sample_mask * * def __cinit__(self, Criterion criterion, SIZE_t max_features, # <<<<<<<<<<<<<< * SIZE_t min_samples_leaf, double min_weight_leaf, - * object random_state): + * object random_state, bint presort): */ /* function exit code */ @@ -3393,15 +3456,82 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_17BaseDenseSplitter___cinit__(stru return __pyx_r; } -/* "sklearn/tree/_splitter.pyx":244 - * self.X_fx_stride = 0 +/* "sklearn/tree/_splitter.pyx":255 + * self.presort = presort + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * """Destructor.""" + * if self.presort == 1: + */ + +/* Python wrapper */ +static void __pyx_pw_7sklearn_4tree_9_splitter_17BaseDenseSplitter_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pw_7sklearn_4tree_9_splitter_17BaseDenseSplitter_3__dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_pf_7sklearn_4tree_9_splitter_17BaseDenseSplitter_2__dealloc__(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_7sklearn_4tree_9_splitter_17BaseDenseSplitter_2__dealloc__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *__pyx_v_self) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "sklearn/tree/_splitter.pyx":257 + * def __dealloc__(self): + * """Destructor.""" + * if self.presort == 1: # <<<<<<<<<<<<<< + * free(self.sample_mask) + * + */ + __pyx_t_1 = ((__pyx_v_self->__pyx_base.presort == 1) != 0); + if (__pyx_t_1) { + + /* "sklearn/tree/_splitter.pyx":258 + * """Destructor.""" + * if self.presort == 1: + * free(self.sample_mask) # <<<<<<<<<<<<<< + * + * cdef void init(self, + */ + free(__pyx_v_self->sample_mask); + goto __pyx_L3; + } + __pyx_L3:; + + /* "sklearn/tree/_splitter.pyx":255 + * self.presort = presort + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * """Destructor.""" + * if self.presort == 1: + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "sklearn/tree/_splitter.pyx":260 + * free(self.sample_mask) * * cdef void init(self, # <<<<<<<<<<<<<< * object X, * np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, */ -static void __pyx_f_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight) { +static void __pyx_f_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight, struct __pyx_opt_args_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init *__pyx_optional_args) { + + /* "sklearn/tree/_splitter.pyx":264 + * np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, + * DOUBLE_t* sample_weight, + * np.ndarray X_idx_sorted=None) except *: # <<<<<<<<<<<<<< + * """Initialize the splitter.""" + * + */ + PyArrayObject *__pyx_v_X_idx_sorted = ((PyArrayObject *)Py_None); PyArrayObject *__pyx_v_X_ndarray = 0; __Pyx_LocalBuf_ND __pyx_pybuffernd_y; __Pyx_Buffer __pyx_pybuffer_y; @@ -3410,93 +3540,189 @@ static void __pyx_f_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init(struct __ PyObject *__pyx_t_2 = NULL; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_3; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_4; + int __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("init", 0); + if (__pyx_optional_args) { + if (__pyx_optional_args->__pyx_n > 0) { + __pyx_v_X_idx_sorted = __pyx_optional_args->X_idx_sorted; + } + } __pyx_pybuffer_y.pybuffer.buf = NULL; __pyx_pybuffer_y.refcount = 0; __pyx_pybuffernd_y.data = NULL; __pyx_pybuffernd_y.rcbuffer = &__pyx_pybuffer_y; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_y.diminfo[0].strides = __pyx_pybuffernd_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_y.diminfo[0].shape = __pyx_pybuffernd_y.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_y.diminfo[1].strides = __pyx_pybuffernd_y.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_y.diminfo[1].shape = __pyx_pybuffernd_y.rcbuffer->pybuffer.shape[1]; - /* "sklearn/tree/_splitter.pyx":251 + /* "sklearn/tree/_splitter.pyx":268 * * # Call parent init * Splitter.init(self, X, y, sample_weight) # <<<<<<<<<<<<<< * * # Initialize X */ - __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(((struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_self), __pyx_v_X, ((PyArrayObject *)__pyx_v_y), __pyx_v_sample_weight); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_vtabptr_7sklearn_4tree_9_splitter_Splitter->init(((struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_self), __pyx_v_X, ((PyArrayObject *)__pyx_v_y), __pyx_v_sample_weight, NULL); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_splitter.pyx":254 + /* "sklearn/tree/_splitter.pyx":271 * * # Initialize X * cdef np.ndarray X_ndarray = X # <<<<<<<<<<<<<< * * self.X = X_ndarray.data */ - if (!(likely(((__pyx_v_X) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_X, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_v_X) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_X, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_1 = __pyx_v_X; __Pyx_INCREF(__pyx_t_1); __pyx_v_X_ndarray = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_splitter.pyx":256 + /* "sklearn/tree/_splitter.pyx":273 * cdef np.ndarray X_ndarray = X * * self.X = X_ndarray.data # <<<<<<<<<<<<<< * self.X_sample_stride = X.strides[0] / X.itemsize - * self.X_fx_stride = X.strides[1] / X.itemsize + * self.X_feature_stride = X.strides[1] / X.itemsize */ __pyx_v_self->X = ((__pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *)__pyx_v_X_ndarray->data); - /* "sklearn/tree/_splitter.pyx":257 + /* "sklearn/tree/_splitter.pyx":274 * * self.X = X_ndarray.data * self.X_sample_stride = X.strides[0] / X.itemsize # <<<<<<<<<<<<<< - * self.X_fx_stride = X.strides[1] / X.itemsize + * self.X_feature_stride = X.strides[1] / X.itemsize * */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_strides); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_strides); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_3 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_2); if (unlikely((__pyx_t_3 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_2); if (unlikely((__pyx_t_3 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_2); if (unlikely((__pyx_t_4 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_2); if (unlikely((__pyx_t_4 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_self->X_sample_stride = (((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)__pyx_t_3) / ((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)__pyx_t_4)); - /* "sklearn/tree/_splitter.pyx":258 + /* "sklearn/tree/_splitter.pyx":275 * self.X = X_ndarray.data * self.X_sample_stride = X.strides[0] / X.itemsize - * self.X_fx_stride = X.strides[1] / X.itemsize # <<<<<<<<<<<<<< - * + * self.X_feature_stride = X.strides[1] / X.itemsize # <<<<<<<<<<<<<< * + * if self.presort == 1: */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_strides); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_strides); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_4 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_4 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_3 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_3 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_self->X_fx_stride = (((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)__pyx_t_4) / ((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)__pyx_t_3)); + __pyx_v_self->X_feature_stride = (((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)__pyx_t_4) / ((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)__pyx_t_3)); + + /* "sklearn/tree/_splitter.pyx":277 + * self.X_feature_stride = X.strides[1] / X.itemsize + * + * if self.presort == 1: # <<<<<<<<<<<<<< + * self.X_idx_sorted = X_idx_sorted + * self.X_idx_sorted_ptr = self.X_idx_sorted.data + */ + __pyx_t_5 = ((__pyx_v_self->__pyx_base.presort == 1) != 0); + if (__pyx_t_5) { + + /* "sklearn/tree/_splitter.pyx":278 + * + * if self.presort == 1: + * self.X_idx_sorted = X_idx_sorted # <<<<<<<<<<<<<< + * self.X_idx_sorted_ptr = self.X_idx_sorted.data + * self.X_idx_sorted_stride = ( self.X_idx_sorted.strides[1] / + */ + __Pyx_INCREF(((PyObject *)__pyx_v_X_idx_sorted)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_X_idx_sorted)); + __Pyx_GOTREF(__pyx_v_self->X_idx_sorted); + __Pyx_DECREF(((PyObject *)__pyx_v_self->X_idx_sorted)); + __pyx_v_self->X_idx_sorted = __pyx_v_X_idx_sorted; + + /* "sklearn/tree/_splitter.pyx":279 + * if self.presort == 1: + * self.X_idx_sorted = X_idx_sorted + * self.X_idx_sorted_ptr = self.X_idx_sorted.data # <<<<<<<<<<<<<< + * self.X_idx_sorted_stride = ( self.X_idx_sorted.strides[1] / + * self.X_idx_sorted.itemsize) + */ + __pyx_v_self->X_idx_sorted_ptr = ((__pyx_t_7sklearn_4tree_9_splitter_INT32_t *)__pyx_v_self->X_idx_sorted->data); + + /* "sklearn/tree/_splitter.pyx":281 + * self.X_idx_sorted_ptr = self.X_idx_sorted.data + * self.X_idx_sorted_stride = ( self.X_idx_sorted.strides[1] / + * self.X_idx_sorted.itemsize) # <<<<<<<<<<<<<< + * + * self.n_total_samples = X.shape[0] + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->X_idx_sorted), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_3 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "sklearn/tree/_splitter.pyx":280 + * self.X_idx_sorted = X_idx_sorted + * self.X_idx_sorted_ptr = self.X_idx_sorted.data + * self.X_idx_sorted_stride = ( self.X_idx_sorted.strides[1] / # <<<<<<<<<<<<<< + * self.X_idx_sorted.itemsize) + * + */ + __pyx_v_self->X_idx_sorted_stride = (((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)(__pyx_v_self->X_idx_sorted->strides[1])) / ((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)__pyx_t_3)); + + /* "sklearn/tree/_splitter.pyx":283 + * self.X_idx_sorted.itemsize) + * + * self.n_total_samples = X.shape[0] # <<<<<<<<<<<<<< + * safe_realloc(&self.sample_mask, self.n_total_samples) + * memset(self.sample_mask, 0, self.n_total_samples*sizeof(SIZE_t)) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_2); if (unlikely((__pyx_t_3 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_self->n_total_samples = __pyx_t_3; + + /* "sklearn/tree/_splitter.pyx":284 + * + * self.n_total_samples = X.shape[0] + * safe_realloc(&self.sample_mask, self.n_total_samples) # <<<<<<<<<<<<<< + * memset(self.sample_mask, 0, self.n_total_samples*sizeof(SIZE_t)) + * + */ + __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->sample_mask), __pyx_v_self->n_total_samples); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "sklearn/tree/_splitter.pyx":285 + * self.n_total_samples = X.shape[0] + * safe_realloc(&self.sample_mask, self.n_total_samples) + * memset(self.sample_mask, 0, self.n_total_samples*sizeof(SIZE_t)) # <<<<<<<<<<<<<< + * + * + */ + memset(__pyx_v_self->sample_mask, 0, (__pyx_v_self->n_total_samples * (sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)))); + goto __pyx_L3; + } + __pyx_L3:; - /* "sklearn/tree/_splitter.pyx":244 - * self.X_fx_stride = 0 + /* "sklearn/tree/_splitter.pyx":260 + * free(self.sample_mask) * * cdef void init(self, # <<<<<<<<<<<<<< * object X, @@ -3521,7 +3747,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init(struct __ __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_splitter.pyx":263 +/* "sklearn/tree/_splitter.pyx":290 * cdef class BestSplitter(BaseDenseSplitter): * """Splitter for finding the best split.""" * def __reduce__(self): # <<<<<<<<<<<<<< @@ -3549,12 +3775,13 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_12BestSplitter___reduce__(st PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); - /* "sklearn/tree/_splitter.pyx":264 + /* "sklearn/tree/_splitter.pyx":291 * """Splitter for finding the best split.""" * def __reduce__(self): * return (BestSplitter, (self.criterion, # <<<<<<<<<<<<<< @@ -3563,112 +3790,125 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_12BestSplitter___reduce__(st */ __Pyx_XDECREF(__pyx_r); - /* "sklearn/tree/_splitter.pyx":265 + /* "sklearn/tree/_splitter.pyx":292 * def __reduce__(self): * return (BestSplitter, (self.criterion, * self.max_features, # <<<<<<<<<<<<<< * self.min_samples_leaf, * self.min_weight_leaf, */ - __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.max_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.max_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - /* "sklearn/tree/_splitter.pyx":266 + /* "sklearn/tree/_splitter.pyx":293 * return (BestSplitter, (self.criterion, * self.max_features, * self.min_samples_leaf, # <<<<<<<<<<<<<< * self.min_weight_leaf, - * self.random_state), self.__getstate__()) + * self.random_state, */ - __pyx_t_2 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - /* "sklearn/tree/_splitter.pyx":267 + /* "sklearn/tree/_splitter.pyx":294 * self.max_features, * self.min_samples_leaf, * self.min_weight_leaf, # <<<<<<<<<<<<<< - * self.random_state), self.__getstate__()) - * + * self.random_state, + * self.presort), self.__getstate__()) */ - __pyx_t_3 = PyFloat_FromDouble(__pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - /* "sklearn/tree/_splitter.pyx":264 + /* "sklearn/tree/_splitter.pyx":296 + * self.min_weight_leaf, + * self.random_state, + * self.presort), self.__getstate__()) # <<<<<<<<<<<<<< + * + * cdef void node_split(self, double impurity, SplitRecord* split, + */ + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_self->__pyx_base.__pyx_base.presort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "sklearn/tree/_splitter.pyx":291 * """Splitter for finding the best split.""" * def __reduce__(self): * return (BestSplitter, (self.criterion, # <<<<<<<<<<<<<< * self.max_features, * self.min_samples_leaf, */ - __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); __Pyx_GIVEREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); - PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); + PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_3); __Pyx_INCREF(__pyx_v_self->__pyx_base.__pyx_base.random_state); __Pyx_GIVEREF(__pyx_v_self->__pyx_base.__pyx_base.random_state); - PyTuple_SET_ITEM(__pyx_t_4, 4, __pyx_v_self->__pyx_base.__pyx_base.random_state); + PyTuple_SET_ITEM(__pyx_t_5, 4, __pyx_v_self->__pyx_base.__pyx_base.random_state); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 5, __pyx_t_4); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; + __pyx_t_4 = 0; - /* "sklearn/tree/_splitter.pyx":268 - * self.min_samples_leaf, + /* "sklearn/tree/_splitter.pyx":296 * self.min_weight_leaf, - * self.random_state), self.__getstate__()) # <<<<<<<<<<<<<< + * self.random_state, + * self.presort), self.__getstate__()) # <<<<<<<<<<<<<< * * cdef void node_split(self, double impurity, SplitRecord* split, */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_getstate); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = NULL; - if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_1)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_getstate); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); + __Pyx_DECREF_SET(__pyx_t_3, function); } } - if (__pyx_t_1) { - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else { - __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "sklearn/tree/_splitter.pyx":264 + /* "sklearn/tree/_splitter.pyx":291 * """Splitter for finding the best split.""" * def __reduce__(self): * return (BestSplitter, (self.criterion, # <<<<<<<<<<<<<< * self.max_features, * self.min_samples_leaf, */ - __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_BestSplitter))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_BestSplitter))); - PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_BestSplitter))); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_BestSplitter))); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_4); + __pyx_t_5 = 0; __pyx_t_4 = 0; + __pyx_r = __pyx_t_3; __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; goto __pyx_L0; - /* "sklearn/tree/_splitter.pyx":263 + /* "sklearn/tree/_splitter.pyx":290 * cdef class BestSplitter(BaseDenseSplitter): * """Splitter for finding the best split.""" * def __reduce__(self): # <<<<<<<<<<<<<< @@ -3682,6 +3922,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_12BestSplitter___reduce__(st __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("sklearn.tree._splitter.BestSplitter.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; @@ -3690,8 +3931,8 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_12BestSplitter___reduce__(st return __pyx_r; } -/* "sklearn/tree/_splitter.pyx":270 - * self.random_state), self.__getstate__()) +/* "sklearn/tree/_splitter.pyx":298 + * self.presort), self.__getstate__()) * * cdef void node_split(self, double impurity, SplitRecord* split, # <<<<<<<<<<<<<< * SIZE_t* n_constant_features) nogil: @@ -3708,19 +3949,25 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *__pyx_v_X; __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *__pyx_v_Xf; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_X_sample_stride; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_X_fx_stride; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_X_feature_stride; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf; double __pyx_v_min_weight_leaf; __pyx_t_7sklearn_4tree_9_splitter_UINT32_t *__pyx_v_random_state; + __pyx_t_7sklearn_4tree_9_splitter_INT32_t *__pyx_v_X_idx_sorted; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_sample_mask; struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord __pyx_v_best; struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord __pyx_v_current; double __pyx_v_current_proxy_improvement; double __pyx_v_best_proxy_improvement; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_f_i; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_f_j; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_p; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_tmp; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_p; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_feature_idx_offset; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_feature_offset; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_i; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_j; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_visited_features; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_found_constants; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_drawn_constants; @@ -3731,11 +3978,12 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_2; __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *__pyx_t_3; double __pyx_t_4; - int __pyx_t_5; + __pyx_t_7sklearn_4tree_9_splitter_INT32_t *__pyx_t_5; int __pyx_t_6; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_7; + int __pyx_t_8; - /* "sklearn/tree/_splitter.pyx":274 + /* "sklearn/tree/_splitter.pyx":302 * """Find the best split on node samples[start:end].""" * # Find the best split * cdef SIZE_t* samples = self.samples # <<<<<<<<<<<<<< @@ -3745,7 +3993,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.samples; __pyx_v_samples = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":275 + /* "sklearn/tree/_splitter.pyx":303 * # Find the best split * cdef SIZE_t* samples = self.samples * cdef SIZE_t start = self.start # <<<<<<<<<<<<<< @@ -3755,7 +4003,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.start; __pyx_v_start = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":276 + /* "sklearn/tree/_splitter.pyx":304 * cdef SIZE_t* samples = self.samples * cdef SIZE_t start = self.start * cdef SIZE_t end = self.end # <<<<<<<<<<<<<< @@ -3765,7 +4013,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.end; __pyx_v_end = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":278 + /* "sklearn/tree/_splitter.pyx":306 * cdef SIZE_t end = self.end * * cdef SIZE_t* features = self.features # <<<<<<<<<<<<<< @@ -3775,7 +4023,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.features; __pyx_v_features = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":279 + /* "sklearn/tree/_splitter.pyx":307 * * cdef SIZE_t* features = self.features * cdef SIZE_t* constant_features = self.constant_features # <<<<<<<<<<<<<< @@ -3785,7 +4033,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.constant_features; __pyx_v_constant_features = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":280 + /* "sklearn/tree/_splitter.pyx":308 * cdef SIZE_t* features = self.features * cdef SIZE_t* constant_features = self.constant_features * cdef SIZE_t n_features = self.n_features # <<<<<<<<<<<<<< @@ -3795,7 +4043,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.n_features; __pyx_v_n_features = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":282 + /* "sklearn/tree/_splitter.pyx":310 * cdef SIZE_t n_features = self.n_features * * cdef DTYPE_t* X = self.X # <<<<<<<<<<<<<< @@ -3805,39 +4053,39 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_3 = __pyx_v_self->__pyx_base.X; __pyx_v_X = __pyx_t_3; - /* "sklearn/tree/_splitter.pyx":283 + /* "sklearn/tree/_splitter.pyx":311 * * cdef DTYPE_t* X = self.X * cdef DTYPE_t* Xf = self.feature_values # <<<<<<<<<<<<<< * cdef SIZE_t X_sample_stride = self.X_sample_stride - * cdef SIZE_t X_fx_stride = self.X_fx_stride + * cdef SIZE_t X_feature_stride = self.X_feature_stride */ __pyx_t_3 = __pyx_v_self->__pyx_base.__pyx_base.feature_values; __pyx_v_Xf = __pyx_t_3; - /* "sklearn/tree/_splitter.pyx":284 + /* "sklearn/tree/_splitter.pyx":312 * cdef DTYPE_t* X = self.X * cdef DTYPE_t* Xf = self.feature_values * cdef SIZE_t X_sample_stride = self.X_sample_stride # <<<<<<<<<<<<<< - * cdef SIZE_t X_fx_stride = self.X_fx_stride + * cdef SIZE_t X_feature_stride = self.X_feature_stride * cdef SIZE_t max_features = self.max_features */ __pyx_t_2 = __pyx_v_self->__pyx_base.X_sample_stride; __pyx_v_X_sample_stride = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":285 + /* "sklearn/tree/_splitter.pyx":313 * cdef DTYPE_t* Xf = self.feature_values * cdef SIZE_t X_sample_stride = self.X_sample_stride - * cdef SIZE_t X_fx_stride = self.X_fx_stride # <<<<<<<<<<<<<< + * cdef SIZE_t X_feature_stride = self.X_feature_stride # <<<<<<<<<<<<<< * cdef SIZE_t max_features = self.max_features * cdef SIZE_t min_samples_leaf = self.min_samples_leaf */ - __pyx_t_2 = __pyx_v_self->__pyx_base.X_fx_stride; - __pyx_v_X_fx_stride = __pyx_t_2; + __pyx_t_2 = __pyx_v_self->__pyx_base.X_feature_stride; + __pyx_v_X_feature_stride = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":286 + /* "sklearn/tree/_splitter.pyx":314 * cdef SIZE_t X_sample_stride = self.X_sample_stride - * cdef SIZE_t X_fx_stride = self.X_fx_stride + * cdef SIZE_t X_feature_stride = self.X_feature_stride * cdef SIZE_t max_features = self.max_features # <<<<<<<<<<<<<< * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf @@ -3845,8 +4093,8 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.max_features; __pyx_v_max_features = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":287 - * cdef SIZE_t X_fx_stride = self.X_fx_stride + /* "sklearn/tree/_splitter.pyx":315 + * cdef SIZE_t X_feature_stride = self.X_feature_stride * cdef SIZE_t max_features = self.max_features * cdef SIZE_t min_samples_leaf = self.min_samples_leaf # <<<<<<<<<<<<<< * cdef double min_weight_leaf = self.min_weight_leaf @@ -3855,7 +4103,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf; __pyx_v_min_samples_leaf = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":288 + /* "sklearn/tree/_splitter.pyx":316 * cdef SIZE_t max_features = self.max_features * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf # <<<<<<<<<<<<<< @@ -3865,52 +4113,72 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_4 = __pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf; __pyx_v_min_weight_leaf = __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":289 + /* "sklearn/tree/_splitter.pyx":317 * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf * cdef UINT32_t* random_state = &self.rand_r_state # <<<<<<<<<<<<<< * - * cdef SplitRecord best, current + * cdef INT32_t* X_idx_sorted = self.X_idx_sorted_ptr */ __pyx_v_random_state = (&__pyx_v_self->__pyx_base.__pyx_base.rand_r_state); - /* "sklearn/tree/_splitter.pyx":292 + /* "sklearn/tree/_splitter.pyx":319 + * cdef UINT32_t* random_state = &self.rand_r_state + * + * cdef INT32_t* X_idx_sorted = self.X_idx_sorted_ptr # <<<<<<<<<<<<<< + * cdef SIZE_t* sample_mask = self.sample_mask + * + */ + __pyx_t_5 = __pyx_v_self->__pyx_base.X_idx_sorted_ptr; + __pyx_v_X_idx_sorted = __pyx_t_5; + + /* "sklearn/tree/_splitter.pyx":320 + * + * cdef INT32_t* X_idx_sorted = self.X_idx_sorted_ptr + * cdef SIZE_t* sample_mask = self.sample_mask # <<<<<<<<<<<<<< * * cdef SplitRecord best, current - * cdef double current_proxy_improvement = - INFINITY # <<<<<<<<<<<<<< - * cdef double best_proxy_improvement = - INFINITY + */ + __pyx_t_1 = __pyx_v_self->__pyx_base.sample_mask; + __pyx_v_sample_mask = __pyx_t_1; + + /* "sklearn/tree/_splitter.pyx":323 + * + * cdef SplitRecord best, current + * cdef double current_proxy_improvement = -INFINITY # <<<<<<<<<<<<<< + * cdef double best_proxy_improvement = -INFINITY * */ __pyx_v_current_proxy_improvement = (-__pyx_v_7sklearn_4tree_9_splitter_INFINITY); - /* "sklearn/tree/_splitter.pyx":293 + /* "sklearn/tree/_splitter.pyx":324 * cdef SplitRecord best, current - * cdef double current_proxy_improvement = - INFINITY - * cdef double best_proxy_improvement = - INFINITY # <<<<<<<<<<<<<< + * cdef double current_proxy_improvement = -INFINITY + * cdef double best_proxy_improvement = -INFINITY # <<<<<<<<<<<<<< * * cdef SIZE_t f_i = n_features */ __pyx_v_best_proxy_improvement = (-__pyx_v_7sklearn_4tree_9_splitter_INFINITY); - /* "sklearn/tree/_splitter.pyx":295 - * cdef double best_proxy_improvement = - INFINITY + /* "sklearn/tree/_splitter.pyx":326 + * cdef double best_proxy_improvement = -INFINITY * * cdef SIZE_t f_i = n_features # <<<<<<<<<<<<<< - * cdef SIZE_t f_j, p, tmp - * cdef SIZE_t n_visited_features = 0 + * cdef SIZE_t f_j + * cdef SIZE_t tmp */ __pyx_v_f_i = __pyx_v_n_features; - /* "sklearn/tree/_splitter.pyx":297 - * cdef SIZE_t f_i = n_features - * cdef SIZE_t f_j, p, tmp + /* "sklearn/tree/_splitter.pyx":335 + * cdef SIZE_t j + * * cdef SIZE_t n_visited_features = 0 # <<<<<<<<<<<<<< * # Number of features discovered to be constant during the split search * cdef SIZE_t n_found_constants = 0 */ __pyx_v_n_visited_features = 0; - /* "sklearn/tree/_splitter.pyx":299 + /* "sklearn/tree/_splitter.pyx":337 * cdef SIZE_t n_visited_features = 0 * # Number of features discovered to be constant during the split search * cdef SIZE_t n_found_constants = 0 # <<<<<<<<<<<<<< @@ -3919,7 +4187,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_n_found_constants = 0; - /* "sklearn/tree/_splitter.pyx":301 + /* "sklearn/tree/_splitter.pyx":339 * cdef SIZE_t n_found_constants = 0 * # Number of features known to be constant and drawn without replacement * cdef SIZE_t n_drawn_constants = 0 # <<<<<<<<<<<<<< @@ -3928,7 +4196,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_n_drawn_constants = 0; - /* "sklearn/tree/_splitter.pyx":302 + /* "sklearn/tree/_splitter.pyx":340 * # Number of features known to be constant and drawn without replacement * cdef SIZE_t n_drawn_constants = 0 * cdef SIZE_t n_known_constants = n_constant_features[0] # <<<<<<<<<<<<<< @@ -3937,7 +4205,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_n_known_constants = (__pyx_v_n_constant_features[0]); - /* "sklearn/tree/_splitter.pyx":304 + /* "sklearn/tree/_splitter.pyx":342 * cdef SIZE_t n_known_constants = n_constant_features[0] * # n_total_constants = n_known_constants + n_found_constants * cdef SIZE_t n_total_constants = n_known_constants # <<<<<<<<<<<<<< @@ -3946,16 +4214,50 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_n_total_constants = __pyx_v_n_known_constants; - /* "sklearn/tree/_splitter.pyx":308 + /* "sklearn/tree/_splitter.pyx":346 * cdef SIZE_t partition_end * * _init_split(&best, end) # <<<<<<<<<<<<<< * - * # Sample up to max_features without replacement using a + * if self.presort == 1: */ __pyx_f_7sklearn_4tree_9_splitter__init_split((&__pyx_v_best), __pyx_v_end); - /* "sklearn/tree/_splitter.pyx":319 + /* "sklearn/tree/_splitter.pyx":348 + * _init_split(&best, end) + * + * if self.presort == 1: # <<<<<<<<<<<<<< + * for p in range(start, end): + * sample_mask[samples[p]] = 1 + */ + __pyx_t_6 = ((__pyx_v_self->__pyx_base.__pyx_base.presort == 1) != 0); + if (__pyx_t_6) { + + /* "sklearn/tree/_splitter.pyx":349 + * + * if self.presort == 1: + * for p in range(start, end): # <<<<<<<<<<<<<< + * sample_mask[samples[p]] = 1 + * + */ + __pyx_t_2 = __pyx_v_end; + for (__pyx_t_7 = __pyx_v_start; __pyx_t_7 < __pyx_t_2; __pyx_t_7+=1) { + __pyx_v_p = __pyx_t_7; + + /* "sklearn/tree/_splitter.pyx":350 + * if self.presort == 1: + * for p in range(start, end): + * sample_mask[samples[p]] = 1 # <<<<<<<<<<<<<< + * + * # Sample up to max_features without replacement using a + */ + (__pyx_v_sample_mask[(__pyx_v_samples[__pyx_v_p])]) = 1; + } + goto __pyx_L3; + } + __pyx_L3:; + + /* "sklearn/tree/_splitter.pyx":361 * # newly discovered constant features to spare computation on descendant * # nodes. * while (f_i > n_total_constants and # Stop early if remaining features # <<<<<<<<<<<<<< @@ -3963,40 +4265,40 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ * (n_visited_features < max_features or */ while (1) { - __pyx_t_6 = ((__pyx_v_f_i > __pyx_v_n_total_constants) != 0); - if (__pyx_t_6) { + __pyx_t_8 = ((__pyx_v_f_i > __pyx_v_n_total_constants) != 0); + if (__pyx_t_8) { } else { - __pyx_t_5 = __pyx_t_6; - goto __pyx_L5_bool_binop_done; + __pyx_t_6 = __pyx_t_8; + goto __pyx_L8_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":321 + /* "sklearn/tree/_splitter.pyx":363 * while (f_i > n_total_constants and # Stop early if remaining features * # are constant * (n_visited_features < max_features or # <<<<<<<<<<<<<< * # At least one drawn features must be non constant * n_visited_features <= n_found_constants + n_drawn_constants)): */ - __pyx_t_6 = ((__pyx_v_n_visited_features < __pyx_v_max_features) != 0); - if (!__pyx_t_6) { + __pyx_t_8 = ((__pyx_v_n_visited_features < __pyx_v_max_features) != 0); + if (!__pyx_t_8) { } else { - __pyx_t_5 = __pyx_t_6; - goto __pyx_L5_bool_binop_done; + __pyx_t_6 = __pyx_t_8; + goto __pyx_L8_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":323 + /* "sklearn/tree/_splitter.pyx":365 * (n_visited_features < max_features or * # At least one drawn features must be non constant * n_visited_features <= n_found_constants + n_drawn_constants)): # <<<<<<<<<<<<<< * * n_visited_features += 1 */ - __pyx_t_6 = ((__pyx_v_n_visited_features <= (__pyx_v_n_found_constants + __pyx_v_n_drawn_constants)) != 0); - __pyx_t_5 = __pyx_t_6; - __pyx_L5_bool_binop_done:; - if (!__pyx_t_5) break; + __pyx_t_8 = ((__pyx_v_n_visited_features <= (__pyx_v_n_found_constants + __pyx_v_n_drawn_constants)) != 0); + __pyx_t_6 = __pyx_t_8; + __pyx_L8_bool_binop_done:; + if (!__pyx_t_6) break; - /* "sklearn/tree/_splitter.pyx":325 + /* "sklearn/tree/_splitter.pyx":367 * n_visited_features <= n_found_constants + n_drawn_constants)): * * n_visited_features += 1 # <<<<<<<<<<<<<< @@ -4005,7 +4307,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_n_visited_features = (__pyx_v_n_visited_features + 1); - /* "sklearn/tree/_splitter.pyx":339 + /* "sklearn/tree/_splitter.pyx":381 * * # Draw a feature at random * f_j = rand_int(n_drawn_constants, f_i - n_found_constants, # <<<<<<<<<<<<<< @@ -4014,17 +4316,17 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_f_j = __pyx_f_7sklearn_4tree_6_utils_rand_int(__pyx_v_n_drawn_constants, (__pyx_v_f_i - __pyx_v_n_found_constants), __pyx_v_random_state); - /* "sklearn/tree/_splitter.pyx":342 + /* "sklearn/tree/_splitter.pyx":384 * random_state) * * if f_j < n_known_constants: # <<<<<<<<<<<<<< * # f_j in the interval [n_drawn_constants, n_known_constants[ * tmp = features[f_j] */ - __pyx_t_5 = ((__pyx_v_f_j < __pyx_v_n_known_constants) != 0); - if (__pyx_t_5) { + __pyx_t_6 = ((__pyx_v_f_j < __pyx_v_n_known_constants) != 0); + if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":344 + /* "sklearn/tree/_splitter.pyx":386 * if f_j < n_known_constants: * # f_j in the interval [n_drawn_constants, n_known_constants[ * tmp = features[f_j] # <<<<<<<<<<<<<< @@ -4033,7 +4335,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_tmp = (__pyx_v_features[__pyx_v_f_j]); - /* "sklearn/tree/_splitter.pyx":345 + /* "sklearn/tree/_splitter.pyx":387 * # f_j in the interval [n_drawn_constants, n_known_constants[ * tmp = features[f_j] * features[f_j] = features[n_drawn_constants] # <<<<<<<<<<<<<< @@ -4042,7 +4344,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ (__pyx_v_features[__pyx_v_f_j]) = (__pyx_v_features[__pyx_v_n_drawn_constants]); - /* "sklearn/tree/_splitter.pyx":346 + /* "sklearn/tree/_splitter.pyx":388 * tmp = features[f_j] * features[f_j] = features[n_drawn_constants] * features[n_drawn_constants] = tmp # <<<<<<<<<<<<<< @@ -4051,7 +4353,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ (__pyx_v_features[__pyx_v_n_drawn_constants]) = __pyx_v_tmp; - /* "sklearn/tree/_splitter.pyx":348 + /* "sklearn/tree/_splitter.pyx":390 * features[n_drawn_constants] = tmp * * n_drawn_constants += 1 # <<<<<<<<<<<<<< @@ -4059,69 +4361,172 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ * else: */ __pyx_v_n_drawn_constants = (__pyx_v_n_drawn_constants + 1); - goto __pyx_L8; + goto __pyx_L11; } /*else*/ { - /* "sklearn/tree/_splitter.pyx":352 + /* "sklearn/tree/_splitter.pyx":394 * else: * # f_j in the interval [n_known_constants, f_i - n_found_constants[ * f_j += n_found_constants # <<<<<<<<<<<<<< * # f_j in the interval [n_total_constants, f_i[ - * + * current.feature = features[f_j] */ __pyx_v_f_j = (__pyx_v_f_j + __pyx_v_n_found_constants); - /* "sklearn/tree/_splitter.pyx":355 + /* "sklearn/tree/_splitter.pyx":396 + * f_j += n_found_constants * # f_j in the interval [n_total_constants, f_i[ - * * current.feature = features[f_j] # <<<<<<<<<<<<<< + * feature_offset = self.X_feature_stride * current.feature * - * # Sort samples along that feature; first copy the feature */ __pyx_v_current.feature = (__pyx_v_features[__pyx_v_f_j]); - /* "sklearn/tree/_splitter.pyx":361 - * # Xf[i] == X[samples[i], j], so the sort uses the cache more + /* "sklearn/tree/_splitter.pyx":397 + * # f_j in the interval [n_total_constants, f_i[ + * current.feature = features[f_j] + * feature_offset = self.X_feature_stride * current.feature # <<<<<<<<<<<<<< + * + * # Sort samples along that feature; either by utilizing + */ + __pyx_v_feature_offset = (__pyx_v_self->__pyx_base.X_feature_stride * __pyx_v_current.feature); + + /* "sklearn/tree/_splitter.pyx":403 + * # sorting the array in a manner which utilizes the cache more * # effectively. - * for p in range(start, end): # <<<<<<<<<<<<<< - * Xf[p] = X[X_sample_stride * samples[p] + - * X_fx_stride * current.feature] + * if self.presort == 1: # <<<<<<<<<<<<<< + * p = start + * feature_idx_offset = self.X_idx_sorted_stride * current.feature */ - __pyx_t_2 = __pyx_v_end; - for (__pyx_t_7 = __pyx_v_start; __pyx_t_7 < __pyx_t_2; __pyx_t_7+=1) { - __pyx_v_p = __pyx_t_7; + __pyx_t_6 = ((__pyx_v_self->__pyx_base.__pyx_base.presort == 1) != 0); + if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":362 + /* "sklearn/tree/_splitter.pyx":404 * # effectively. - * for p in range(start, end): - * Xf[p] = X[X_sample_stride * samples[p] + # <<<<<<<<<<<<<< - * X_fx_stride * current.feature] + * if self.presort == 1: + * p = start # <<<<<<<<<<<<<< + * feature_idx_offset = self.X_idx_sorted_stride * current.feature + * + */ + __pyx_v_p = __pyx_v_start; + + /* "sklearn/tree/_splitter.pyx":405 + * if self.presort == 1: + * p = start + * feature_idx_offset = self.X_idx_sorted_stride * current.feature # <<<<<<<<<<<<<< + * + * for i in range(self.n_total_samples): + */ + __pyx_v_feature_idx_offset = (__pyx_v_self->__pyx_base.X_idx_sorted_stride * __pyx_v_current.feature); + + /* "sklearn/tree/_splitter.pyx":407 + * feature_idx_offset = self.X_idx_sorted_stride * current.feature + * + * for i in range(self.n_total_samples): # <<<<<<<<<<<<<< + * j = X_idx_sorted[i + feature_idx_offset] + * if sample_mask[j] == 1: + */ + __pyx_t_2 = __pyx_v_self->__pyx_base.n_total_samples; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_2; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "sklearn/tree/_splitter.pyx":408 * + * for i in range(self.n_total_samples): + * j = X_idx_sorted[i + feature_idx_offset] # <<<<<<<<<<<<<< + * if sample_mask[j] == 1: + * samples[p] = j + */ + __pyx_v_j = (__pyx_v_X_idx_sorted[(__pyx_v_i + __pyx_v_feature_idx_offset)]); + + /* "sklearn/tree/_splitter.pyx":409 + * for i in range(self.n_total_samples): + * j = X_idx_sorted[i + feature_idx_offset] + * if sample_mask[j] == 1: # <<<<<<<<<<<<<< + * samples[p] = j + * Xf[p] = X[self.X_sample_stride * j + feature_offset] + */ + __pyx_t_6 = (((__pyx_v_sample_mask[__pyx_v_j]) == 1) != 0); + if (__pyx_t_6) { + + /* "sklearn/tree/_splitter.pyx":410 + * j = X_idx_sorted[i + feature_idx_offset] + * if sample_mask[j] == 1: + * samples[p] = j # <<<<<<<<<<<<<< + * Xf[p] = X[self.X_sample_stride * j + feature_offset] + * p += 1 + */ + (__pyx_v_samples[__pyx_v_p]) = __pyx_v_j; + + /* "sklearn/tree/_splitter.pyx":411 + * if sample_mask[j] == 1: + * samples[p] = j + * Xf[p] = X[self.X_sample_stride * j + feature_offset] # <<<<<<<<<<<<<< + * p += 1 + * else: + */ + (__pyx_v_Xf[__pyx_v_p]) = (__pyx_v_X[((__pyx_v_self->__pyx_base.X_sample_stride * __pyx_v_j) + __pyx_v_feature_offset)]); + + /* "sklearn/tree/_splitter.pyx":412 + * samples[p] = j + * Xf[p] = X[self.X_sample_stride * j + feature_offset] + * p += 1 # <<<<<<<<<<<<<< + * else: + * for i in range(start, end): */ - (__pyx_v_Xf[__pyx_v_p]) = (__pyx_v_X[((__pyx_v_X_sample_stride * (__pyx_v_samples[__pyx_v_p])) + (__pyx_v_X_fx_stride * __pyx_v_current.feature))]); + __pyx_v_p = (__pyx_v_p + 1); + goto __pyx_L15; + } + __pyx_L15:; + } + goto __pyx_L12; } + /*else*/ { + + /* "sklearn/tree/_splitter.pyx":414 + * p += 1 + * else: + * for i in range(start, end): # <<<<<<<<<<<<<< + * Xf[i] = X[self.X_sample_stride * samples[i] + feature_offset] + * + */ + __pyx_t_2 = __pyx_v_end; + for (__pyx_t_7 = __pyx_v_start; __pyx_t_7 < __pyx_t_2; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "sklearn/tree/_splitter.pyx":415 + * else: + * for i in range(start, end): + * Xf[i] = X[self.X_sample_stride * samples[i] + feature_offset] # <<<<<<<<<<<<<< + * + * sort(Xf + start, samples + start, end - start) + */ + (__pyx_v_Xf[__pyx_v_i]) = (__pyx_v_X[((__pyx_v_self->__pyx_base.X_sample_stride * (__pyx_v_samples[__pyx_v_i])) + __pyx_v_feature_offset)]); + } - /* "sklearn/tree/_splitter.pyx":365 - * X_fx_stride * current.feature] + /* "sklearn/tree/_splitter.pyx":417 + * Xf[i] = X[self.X_sample_stride * samples[i] + feature_offset] * - * sort(Xf + start, samples + start, end - start) # <<<<<<<<<<<<<< + * sort(Xf + start, samples + start, end - start) # <<<<<<<<<<<<<< * * if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: */ - __pyx_f_7sklearn_4tree_9_splitter_sort((__pyx_v_Xf + __pyx_v_start), (__pyx_v_samples + __pyx_v_start), (__pyx_v_end - __pyx_v_start)); + __pyx_f_7sklearn_4tree_9_splitter_sort((__pyx_v_Xf + __pyx_v_start), (__pyx_v_samples + __pyx_v_start), (__pyx_v_end - __pyx_v_start)); + } + __pyx_L12:; - /* "sklearn/tree/_splitter.pyx":367 - * sort(Xf + start, samples + start, end - start) + /* "sklearn/tree/_splitter.pyx":419 + * sort(Xf + start, samples + start, end - start) * * if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: # <<<<<<<<<<<<<< * features[f_j] = features[n_total_constants] * features[n_total_constants] = current.feature */ - __pyx_t_5 = (((__pyx_v_Xf[(__pyx_v_end - 1)]) <= ((__pyx_v_Xf[__pyx_v_start]) + __pyx_v_7sklearn_4tree_9_splitter_FEATURE_THRESHOLD)) != 0); - if (__pyx_t_5) { + __pyx_t_6 = (((__pyx_v_Xf[(__pyx_v_end - 1)]) <= ((__pyx_v_Xf[__pyx_v_start]) + __pyx_v_7sklearn_4tree_9_splitter_FEATURE_THRESHOLD)) != 0); + if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":368 + /* "sklearn/tree/_splitter.pyx":420 * * if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: * features[f_j] = features[n_total_constants] # <<<<<<<<<<<<<< @@ -4130,7 +4535,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ (__pyx_v_features[__pyx_v_f_j]) = (__pyx_v_features[__pyx_v_n_total_constants]); - /* "sklearn/tree/_splitter.pyx":369 + /* "sklearn/tree/_splitter.pyx":421 * if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: * features[f_j] = features[n_total_constants] * features[n_total_constants] = current.feature # <<<<<<<<<<<<<< @@ -4140,7 +4545,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_t_2 = __pyx_v_current.feature; (__pyx_v_features[__pyx_v_n_total_constants]) = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":371 + /* "sklearn/tree/_splitter.pyx":423 * features[n_total_constants] = current.feature * * n_found_constants += 1 # <<<<<<<<<<<<<< @@ -4149,7 +4554,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_n_found_constants = (__pyx_v_n_found_constants + 1); - /* "sklearn/tree/_splitter.pyx":372 + /* "sklearn/tree/_splitter.pyx":424 * * n_found_constants += 1 * n_total_constants += 1 # <<<<<<<<<<<<<< @@ -4157,11 +4562,11 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ * else: */ __pyx_v_n_total_constants = (__pyx_v_n_total_constants + 1); - goto __pyx_L11; + goto __pyx_L18; } /*else*/ { - /* "sklearn/tree/_splitter.pyx":375 + /* "sklearn/tree/_splitter.pyx":427 * * else: * f_i -= 1 # <<<<<<<<<<<<<< @@ -4170,7 +4575,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_f_i = (__pyx_v_f_i - 1); - /* "sklearn/tree/_splitter.pyx":376 + /* "sklearn/tree/_splitter.pyx":428 * else: * f_i -= 1 * features[f_i], features[f_j] = features[f_j], features[f_i] # <<<<<<<<<<<<<< @@ -4182,7 +4587,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ (__pyx_v_features[__pyx_v_f_i]) = __pyx_t_2; (__pyx_v_features[__pyx_v_f_j]) = __pyx_t_7; - /* "sklearn/tree/_splitter.pyx":379 + /* "sklearn/tree/_splitter.pyx":431 * * # Evaluate all splits * self.criterion.reset() # <<<<<<<<<<<<<< @@ -4191,7 +4596,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->reset(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":380 + /* "sklearn/tree/_splitter.pyx":432 * # Evaluate all splits * self.criterion.reset() * p = start # <<<<<<<<<<<<<< @@ -4200,7 +4605,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_p = __pyx_v_start; - /* "sklearn/tree/_splitter.pyx":382 + /* "sklearn/tree/_splitter.pyx":434 * p = start * * while p < end: # <<<<<<<<<<<<<< @@ -4208,10 +4613,10 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ * Xf[p + 1] <= Xf[p] + FEATURE_THRESHOLD): */ while (1) { - __pyx_t_5 = ((__pyx_v_p < __pyx_v_end) != 0); - if (!__pyx_t_5) break; + __pyx_t_6 = ((__pyx_v_p < __pyx_v_end) != 0); + if (!__pyx_t_6) break; - /* "sklearn/tree/_splitter.pyx":383 + /* "sklearn/tree/_splitter.pyx":435 * * while p < end: * while (p + 1 < end and # <<<<<<<<<<<<<< @@ -4219,26 +4624,26 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ * p += 1 */ while (1) { - __pyx_t_6 = (((__pyx_v_p + 1) < __pyx_v_end) != 0); - if (__pyx_t_6) { + __pyx_t_8 = (((__pyx_v_p + 1) < __pyx_v_end) != 0); + if (__pyx_t_8) { } else { - __pyx_t_5 = __pyx_t_6; - goto __pyx_L16_bool_binop_done; + __pyx_t_6 = __pyx_t_8; + goto __pyx_L23_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":384 + /* "sklearn/tree/_splitter.pyx":436 * while p < end: * while (p + 1 < end and * Xf[p + 1] <= Xf[p] + FEATURE_THRESHOLD): # <<<<<<<<<<<<<< * p += 1 * */ - __pyx_t_6 = (((__pyx_v_Xf[(__pyx_v_p + 1)]) <= ((__pyx_v_Xf[__pyx_v_p]) + __pyx_v_7sklearn_4tree_9_splitter_FEATURE_THRESHOLD)) != 0); - __pyx_t_5 = __pyx_t_6; - __pyx_L16_bool_binop_done:; - if (!__pyx_t_5) break; + __pyx_t_8 = (((__pyx_v_Xf[(__pyx_v_p + 1)]) <= ((__pyx_v_Xf[__pyx_v_p]) + __pyx_v_7sklearn_4tree_9_splitter_FEATURE_THRESHOLD)) != 0); + __pyx_t_6 = __pyx_t_8; + __pyx_L23_bool_binop_done:; + if (!__pyx_t_6) break; - /* "sklearn/tree/_splitter.pyx":385 + /* "sklearn/tree/_splitter.pyx":437 * while (p + 1 < end and * Xf[p + 1] <= Xf[p] + FEATURE_THRESHOLD): * p += 1 # <<<<<<<<<<<<<< @@ -4248,7 +4653,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ __pyx_v_p = (__pyx_v_p + 1); } - /* "sklearn/tree/_splitter.pyx":389 + /* "sklearn/tree/_splitter.pyx":441 * # (p + 1 >= end) or (X[samples[p + 1], current.feature] > * # X[samples[p], current.feature]) * p += 1 # <<<<<<<<<<<<<< @@ -4257,17 +4662,17 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_p = (__pyx_v_p + 1); - /* "sklearn/tree/_splitter.pyx":393 + /* "sklearn/tree/_splitter.pyx":445 * # X[samples[p - 1], current.feature]) * * if p < end: # <<<<<<<<<<<<<< * current.pos = p * */ - __pyx_t_5 = ((__pyx_v_p < __pyx_v_end) != 0); - if (__pyx_t_5) { + __pyx_t_6 = ((__pyx_v_p < __pyx_v_end) != 0); + if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":394 + /* "sklearn/tree/_splitter.pyx":446 * * if p < end: * current.pos = p # <<<<<<<<<<<<<< @@ -4276,43 +4681,43 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_current.pos = __pyx_v_p; - /* "sklearn/tree/_splitter.pyx":397 + /* "sklearn/tree/_splitter.pyx":449 * * # Reject if min_samples_leaf is not guaranteed * if (((current.pos - start) < min_samples_leaf) or # <<<<<<<<<<<<<< * ((end - current.pos) < min_samples_leaf)): * continue */ - __pyx_t_6 = (((__pyx_v_current.pos - __pyx_v_start) < __pyx_v_min_samples_leaf) != 0); - if (!__pyx_t_6) { + __pyx_t_8 = (((__pyx_v_current.pos - __pyx_v_start) < __pyx_v_min_samples_leaf) != 0); + if (!__pyx_t_8) { } else { - __pyx_t_5 = __pyx_t_6; - goto __pyx_L20_bool_binop_done; + __pyx_t_6 = __pyx_t_8; + goto __pyx_L27_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":398 + /* "sklearn/tree/_splitter.pyx":450 * # Reject if min_samples_leaf is not guaranteed * if (((current.pos - start) < min_samples_leaf) or * ((end - current.pos) < min_samples_leaf)): # <<<<<<<<<<<<<< * continue * */ - __pyx_t_6 = (((__pyx_v_end - __pyx_v_current.pos) < __pyx_v_min_samples_leaf) != 0); - __pyx_t_5 = __pyx_t_6; - __pyx_L20_bool_binop_done:; - if (__pyx_t_5) { + __pyx_t_8 = (((__pyx_v_end - __pyx_v_current.pos) < __pyx_v_min_samples_leaf) != 0); + __pyx_t_6 = __pyx_t_8; + __pyx_L27_bool_binop_done:; + if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":399 + /* "sklearn/tree/_splitter.pyx":451 * if (((current.pos - start) < min_samples_leaf) or * ((end - current.pos) < min_samples_leaf)): * continue # <<<<<<<<<<<<<< * * self.criterion.update(current.pos) */ - goto __pyx_L12_continue; + goto __pyx_L19_continue; } - /* "sklearn/tree/_splitter.pyx":401 + /* "sklearn/tree/_splitter.pyx":453 * continue * * self.criterion.update(current.pos) # <<<<<<<<<<<<<< @@ -4321,43 +4726,43 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->update(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_current.pos); - /* "sklearn/tree/_splitter.pyx":404 + /* "sklearn/tree/_splitter.pyx":456 * * # Reject if min_weight_leaf is not satisfied * if ((self.criterion.weighted_n_left < min_weight_leaf) or # <<<<<<<<<<<<<< * (self.criterion.weighted_n_right < min_weight_leaf)): * continue */ - __pyx_t_6 = ((__pyx_v_self->__pyx_base.__pyx_base.criterion->weighted_n_left < __pyx_v_min_weight_leaf) != 0); - if (!__pyx_t_6) { + __pyx_t_8 = ((__pyx_v_self->__pyx_base.__pyx_base.criterion->weighted_n_left < __pyx_v_min_weight_leaf) != 0); + if (!__pyx_t_8) { } else { - __pyx_t_5 = __pyx_t_6; - goto __pyx_L23_bool_binop_done; + __pyx_t_6 = __pyx_t_8; + goto __pyx_L30_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":405 + /* "sklearn/tree/_splitter.pyx":457 * # Reject if min_weight_leaf is not satisfied * if ((self.criterion.weighted_n_left < min_weight_leaf) or * (self.criterion.weighted_n_right < min_weight_leaf)): # <<<<<<<<<<<<<< * continue * */ - __pyx_t_6 = ((__pyx_v_self->__pyx_base.__pyx_base.criterion->weighted_n_right < __pyx_v_min_weight_leaf) != 0); - __pyx_t_5 = __pyx_t_6; - __pyx_L23_bool_binop_done:; - if (__pyx_t_5) { + __pyx_t_8 = ((__pyx_v_self->__pyx_base.__pyx_base.criterion->weighted_n_right < __pyx_v_min_weight_leaf) != 0); + __pyx_t_6 = __pyx_t_8; + __pyx_L30_bool_binop_done:; + if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":406 + /* "sklearn/tree/_splitter.pyx":458 * if ((self.criterion.weighted_n_left < min_weight_leaf) or * (self.criterion.weighted_n_right < min_weight_leaf)): * continue # <<<<<<<<<<<<<< * * current_proxy_improvement = self.criterion.proxy_impurity_improvement() */ - goto __pyx_L12_continue; + goto __pyx_L19_continue; } - /* "sklearn/tree/_splitter.pyx":408 + /* "sklearn/tree/_splitter.pyx":460 * continue * * current_proxy_improvement = self.criterion.proxy_impurity_improvement() # <<<<<<<<<<<<<< @@ -4366,17 +4771,17 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_current_proxy_improvement = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->proxy_impurity_improvement(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":410 + /* "sklearn/tree/_splitter.pyx":462 * current_proxy_improvement = self.criterion.proxy_impurity_improvement() * * if current_proxy_improvement > best_proxy_improvement: # <<<<<<<<<<<<<< * best_proxy_improvement = current_proxy_improvement * current.threshold = (Xf[p - 1] + Xf[p]) / 2.0 */ - __pyx_t_5 = ((__pyx_v_current_proxy_improvement > __pyx_v_best_proxy_improvement) != 0); - if (__pyx_t_5) { + __pyx_t_6 = ((__pyx_v_current_proxy_improvement > __pyx_v_best_proxy_improvement) != 0); + if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":411 + /* "sklearn/tree/_splitter.pyx":463 * * if current_proxy_improvement > best_proxy_improvement: * best_proxy_improvement = current_proxy_improvement # <<<<<<<<<<<<<< @@ -4385,7 +4790,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_best_proxy_improvement = __pyx_v_current_proxy_improvement; - /* "sklearn/tree/_splitter.pyx":412 + /* "sklearn/tree/_splitter.pyx":464 * if current_proxy_improvement > best_proxy_improvement: * best_proxy_improvement = current_proxy_improvement * current.threshold = (Xf[p - 1] + Xf[p]) / 2.0 # <<<<<<<<<<<<<< @@ -4394,17 +4799,17 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_current.threshold = (((__pyx_v_Xf[(__pyx_v_p - 1)]) + (__pyx_v_Xf[__pyx_v_p])) / 2.0); - /* "sklearn/tree/_splitter.pyx":414 + /* "sklearn/tree/_splitter.pyx":466 * current.threshold = (Xf[p - 1] + Xf[p]) / 2.0 * * if current.threshold == Xf[p]: # <<<<<<<<<<<<<< * current.threshold = Xf[p - 1] * */ - __pyx_t_5 = ((__pyx_v_current.threshold == (__pyx_v_Xf[__pyx_v_p])) != 0); - if (__pyx_t_5) { + __pyx_t_6 = ((__pyx_v_current.threshold == (__pyx_v_Xf[__pyx_v_p])) != 0); + if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":415 + /* "sklearn/tree/_splitter.pyx":467 * * if current.threshold == Xf[p]: * current.threshold = Xf[p - 1] # <<<<<<<<<<<<<< @@ -4412,11 +4817,11 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ * best = current # copy */ __pyx_v_current.threshold = (__pyx_v_Xf[(__pyx_v_p - 1)]); - goto __pyx_L26; + goto __pyx_L33; } - __pyx_L26:; + __pyx_L33:; - /* "sklearn/tree/_splitter.pyx":417 + /* "sklearn/tree/_splitter.pyx":469 * current.threshold = Xf[p - 1] * * best = current # copy # <<<<<<<<<<<<<< @@ -4424,41 +4829,50 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ * # Reorganize into samples[start:best.pos] + samples[best.pos:end] */ __pyx_v_best = __pyx_v_current; - goto __pyx_L25; + goto __pyx_L32; } - __pyx_L25:; - goto __pyx_L18; + __pyx_L32:; + goto __pyx_L25; } - __pyx_L18:; - __pyx_L12_continue:; + __pyx_L25:; + __pyx_L19_continue:; } } - __pyx_L11:; + __pyx_L18:; } - __pyx_L8:; + __pyx_L11:; } - /* "sklearn/tree/_splitter.pyx":420 + /* "sklearn/tree/_splitter.pyx":472 * * # Reorganize into samples[start:best.pos] + samples[best.pos:end] * if best.pos < end: # <<<<<<<<<<<<<< + * feature_offset = X_feature_stride * best.feature * partition_end = end - * p = start */ - __pyx_t_5 = ((__pyx_v_best.pos < __pyx_v_end) != 0); - if (__pyx_t_5) { + __pyx_t_6 = ((__pyx_v_best.pos < __pyx_v_end) != 0); + if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":421 + /* "sklearn/tree/_splitter.pyx":473 * # Reorganize into samples[start:best.pos] + samples[best.pos:end] * if best.pos < end: + * feature_offset = X_feature_stride * best.feature # <<<<<<<<<<<<<< + * partition_end = end + * p = start + */ + __pyx_v_feature_offset = (__pyx_v_X_feature_stride * __pyx_v_best.feature); + + /* "sklearn/tree/_splitter.pyx":474 + * if best.pos < end: + * feature_offset = X_feature_stride * best.feature * partition_end = end # <<<<<<<<<<<<<< * p = start * */ __pyx_v_partition_end = __pyx_v_end; - /* "sklearn/tree/_splitter.pyx":422 - * if best.pos < end: + /* "sklearn/tree/_splitter.pyx":475 + * feature_offset = X_feature_stride * best.feature * partition_end = end * p = start # <<<<<<<<<<<<<< * @@ -4466,40 +4880,40 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_p = __pyx_v_start; - /* "sklearn/tree/_splitter.pyx":424 + /* "sklearn/tree/_splitter.pyx":477 * p = start * * while p < partition_end: # <<<<<<<<<<<<<< - * if X[X_sample_stride * samples[p] + - * X_fx_stride * best.feature] <= best.threshold: + * if X[X_sample_stride * samples[p] + feature_offset] <= best.threshold: + * p += 1 */ while (1) { - __pyx_t_5 = ((__pyx_v_p < __pyx_v_partition_end) != 0); - if (!__pyx_t_5) break; + __pyx_t_6 = ((__pyx_v_p < __pyx_v_partition_end) != 0); + if (!__pyx_t_6) break; - /* "sklearn/tree/_splitter.pyx":426 + /* "sklearn/tree/_splitter.pyx":478 + * * while p < partition_end: - * if X[X_sample_stride * samples[p] + - * X_fx_stride * best.feature] <= best.threshold: # <<<<<<<<<<<<<< + * if X[X_sample_stride * samples[p] + feature_offset] <= best.threshold: # <<<<<<<<<<<<<< * p += 1 * */ - __pyx_t_5 = (((__pyx_v_X[((__pyx_v_X_sample_stride * (__pyx_v_samples[__pyx_v_p])) + (__pyx_v_X_fx_stride * __pyx_v_best.feature))]) <= __pyx_v_best.threshold) != 0); - if (__pyx_t_5) { + __pyx_t_6 = (((__pyx_v_X[((__pyx_v_X_sample_stride * (__pyx_v_samples[__pyx_v_p])) + __pyx_v_feature_offset)]) <= __pyx_v_best.threshold) != 0); + if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":427 - * if X[X_sample_stride * samples[p] + - * X_fx_stride * best.feature] <= best.threshold: + /* "sklearn/tree/_splitter.pyx":479 + * while p < partition_end: + * if X[X_sample_stride * samples[p] + feature_offset] <= best.threshold: * p += 1 # <<<<<<<<<<<<<< * * else: */ __pyx_v_p = (__pyx_v_p + 1); - goto __pyx_L30; + goto __pyx_L37; } /*else*/ { - /* "sklearn/tree/_splitter.pyx":430 + /* "sklearn/tree/_splitter.pyx":482 * * else: * partition_end -= 1 # <<<<<<<<<<<<<< @@ -4508,7 +4922,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_partition_end = (__pyx_v_partition_end - 1); - /* "sklearn/tree/_splitter.pyx":432 + /* "sklearn/tree/_splitter.pyx":484 * partition_end -= 1 * * tmp = samples[partition_end] # <<<<<<<<<<<<<< @@ -4517,7 +4931,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_tmp = (__pyx_v_samples[__pyx_v_partition_end]); - /* "sklearn/tree/_splitter.pyx":433 + /* "sklearn/tree/_splitter.pyx":485 * * tmp = samples[partition_end] * samples[partition_end] = samples[p] # <<<<<<<<<<<<<< @@ -4526,7 +4940,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ (__pyx_v_samples[__pyx_v_partition_end]) = (__pyx_v_samples[__pyx_v_p]); - /* "sklearn/tree/_splitter.pyx":434 + /* "sklearn/tree/_splitter.pyx":486 * tmp = samples[partition_end] * samples[partition_end] = samples[p] * samples[p] = tmp # <<<<<<<<<<<<<< @@ -4535,10 +4949,10 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ (__pyx_v_samples[__pyx_v_p]) = __pyx_v_tmp; } - __pyx_L30:; + __pyx_L37:; } - /* "sklearn/tree/_splitter.pyx":436 + /* "sklearn/tree/_splitter.pyx":488 * samples[p] = tmp * * self.criterion.reset() # <<<<<<<<<<<<<< @@ -4547,7 +4961,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->reset(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":437 + /* "sklearn/tree/_splitter.pyx":489 * * self.criterion.reset() * self.criterion.update(best.pos) # <<<<<<<<<<<<<< @@ -4556,7 +4970,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->update(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_best.pos); - /* "sklearn/tree/_splitter.pyx":438 + /* "sklearn/tree/_splitter.pyx":490 * self.criterion.reset() * self.criterion.update(best.pos) * best.improvement = self.criterion.impurity_improvement(impurity) # <<<<<<<<<<<<<< @@ -4565,7 +4979,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ __pyx_v_best.improvement = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->impurity_improvement(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_impurity); - /* "sklearn/tree/_splitter.pyx":439 + /* "sklearn/tree/_splitter.pyx":491 * self.criterion.update(best.pos) * best.improvement = self.criterion.impurity_improvement(impurity) * self.criterion.children_impurity(&best.impurity_left, # <<<<<<<<<<<<<< @@ -4573,11 +4987,45 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ * */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->children_impurity(__pyx_v_self->__pyx_base.__pyx_base.criterion, (&__pyx_v_best.impurity_left), (&__pyx_v_best.impurity_right)); - goto __pyx_L27; + goto __pyx_L34; + } + __pyx_L34:; + + /* "sklearn/tree/_splitter.pyx":495 + * + * # Reset sample mask + * if self.presort == 1: # <<<<<<<<<<<<<< + * for p in range(start, end): + * sample_mask[samples[p]] = 0 + */ + __pyx_t_6 = ((__pyx_v_self->__pyx_base.__pyx_base.presort == 1) != 0); + if (__pyx_t_6) { + + /* "sklearn/tree/_splitter.pyx":496 + * # Reset sample mask + * if self.presort == 1: + * for p in range(start, end): # <<<<<<<<<<<<<< + * sample_mask[samples[p]] = 0 + * + */ + __pyx_t_7 = __pyx_v_end; + for (__pyx_t_2 = __pyx_v_start; __pyx_t_2 < __pyx_t_7; __pyx_t_2+=1) { + __pyx_v_p = __pyx_t_2; + + /* "sklearn/tree/_splitter.pyx":497 + * if self.presort == 1: + * for p in range(start, end): + * sample_mask[samples[p]] = 0 # <<<<<<<<<<<<<< + * + * # Respect invariant for constant features: the original order of + */ + (__pyx_v_sample_mask[(__pyx_v_samples[__pyx_v_p])]) = 0; + } + goto __pyx_L38; } - __pyx_L27:; + __pyx_L38:; - /* "sklearn/tree/_splitter.pyx":445 + /* "sklearn/tree/_splitter.pyx":502 * # element in features[:n_known_constants] must be preserved for sibling * # and child nodes * memcpy(features, constant_features, sizeof(SIZE_t) * n_known_constants) # <<<<<<<<<<<<<< @@ -4586,7 +5034,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ memcpy(__pyx_v_features, __pyx_v_constant_features, ((sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)) * __pyx_v_n_known_constants)); - /* "sklearn/tree/_splitter.pyx":448 + /* "sklearn/tree/_splitter.pyx":505 * * # Copy newly found constant features * memcpy(constant_features + n_known_constants, # <<<<<<<<<<<<<< @@ -4595,7 +5043,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ memcpy((__pyx_v_constant_features + __pyx_v_n_known_constants), (__pyx_v_features + __pyx_v_n_known_constants), ((sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)) * __pyx_v_n_found_constants)); - /* "sklearn/tree/_splitter.pyx":453 + /* "sklearn/tree/_splitter.pyx":510 * * # Return values * split[0] = best # <<<<<<<<<<<<<< @@ -4604,7 +5052,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ (__pyx_v_split[0]) = __pyx_v_best; - /* "sklearn/tree/_splitter.pyx":454 + /* "sklearn/tree/_splitter.pyx":511 * # Return values * split[0] = best * n_constant_features[0] = n_total_constants # <<<<<<<<<<<<<< @@ -4613,8 +5061,8 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ */ (__pyx_v_n_constant_features[0]) = __pyx_v_n_total_constants; - /* "sklearn/tree/_splitter.pyx":270 - * self.random_state), self.__getstate__()) + /* "sklearn/tree/_splitter.pyx":298 + * self.presort), self.__getstate__()) * * cdef void node_split(self, double impurity, SplitRecord* split, # <<<<<<<<<<<<<< * SIZE_t* n_constant_features) nogil: @@ -4624,7 +5072,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":459 +/* "sklearn/tree/_splitter.pyx":516 * # Sort n-element arrays pointed to by Xf and samples, simultaneously, * # by the values in Xf. Algorithm: Introsort (Musser, SP&E, 1997). * cdef inline void sort(DTYPE_t* Xf, SIZE_t* samples, SIZE_t n) nogil: # <<<<<<<<<<<<<< @@ -4635,7 +5083,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split(struct _ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sort(__pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *__pyx_v_Xf, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_samples, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n) { int __pyx_v_maxd; - /* "sklearn/tree/_splitter.pyx":460 + /* "sklearn/tree/_splitter.pyx":517 * # by the values in Xf. Algorithm: Introsort (Musser, SP&E, 1997). * cdef inline void sort(DTYPE_t* Xf, SIZE_t* samples, SIZE_t n) nogil: * cdef int maxd = 2 * log(n) # <<<<<<<<<<<<<< @@ -4644,7 +5092,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sort(__pyx_t_7sklear */ __pyx_v_maxd = (2 * ((int)__pyx_f_7sklearn_4tree_6_utils_log(__pyx_v_n))); - /* "sklearn/tree/_splitter.pyx":461 + /* "sklearn/tree/_splitter.pyx":518 * cdef inline void sort(DTYPE_t* Xf, SIZE_t* samples, SIZE_t n) nogil: * cdef int maxd = 2 * log(n) * introsort(Xf, samples, n, maxd) # <<<<<<<<<<<<<< @@ -4653,7 +5101,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sort(__pyx_t_7sklear */ __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_v_Xf, __pyx_v_samples, __pyx_v_n, __pyx_v_maxd); - /* "sklearn/tree/_splitter.pyx":459 + /* "sklearn/tree/_splitter.pyx":516 * # Sort n-element arrays pointed to by Xf and samples, simultaneously, * # by the values in Xf. Algorithm: Introsort (Musser, SP&E, 1997). * cdef inline void sort(DTYPE_t* Xf, SIZE_t* samples, SIZE_t n) nogil: # <<<<<<<<<<<<<< @@ -4664,7 +5112,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sort(__pyx_t_7sklear /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":464 +/* "sklearn/tree/_splitter.pyx":521 * * * cdef inline void swap(DTYPE_t* Xf, SIZE_t* samples, SIZE_t i, SIZE_t j) nogil: # <<<<<<<<<<<<<< @@ -4678,7 +5126,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_swap(__pyx_t_7sklear __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_3; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":466 + /* "sklearn/tree/_splitter.pyx":523 * cdef inline void swap(DTYPE_t* Xf, SIZE_t* samples, SIZE_t i, SIZE_t j) nogil: * # Helper for sort * Xf[i], Xf[j] = Xf[j], Xf[i] # <<<<<<<<<<<<<< @@ -4690,7 +5138,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_swap(__pyx_t_7sklear (__pyx_v_Xf[__pyx_v_i]) = __pyx_t_1; (__pyx_v_Xf[__pyx_v_j]) = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":467 + /* "sklearn/tree/_splitter.pyx":524 * # Helper for sort * Xf[i], Xf[j] = Xf[j], Xf[i] * samples[i], samples[j] = samples[j], samples[i] # <<<<<<<<<<<<<< @@ -4702,7 +5150,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_swap(__pyx_t_7sklear (__pyx_v_samples[__pyx_v_i]) = __pyx_t_3; (__pyx_v_samples[__pyx_v_j]) = __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":464 + /* "sklearn/tree/_splitter.pyx":521 * * * cdef inline void swap(DTYPE_t* Xf, SIZE_t* samples, SIZE_t i, SIZE_t j) nogil: # <<<<<<<<<<<<<< @@ -4713,7 +5161,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_swap(__pyx_t_7sklear /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":470 +/* "sklearn/tree/_splitter.pyx":527 * * * cdef inline DTYPE_t median3(DTYPE_t* Xf, SIZE_t n) nogil: # <<<<<<<<<<<<<< @@ -4728,7 +5176,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_r; int __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":473 + /* "sklearn/tree/_splitter.pyx":530 * # Median of three pivot selection, after Bentley and McIlroy (1993). * # Engineering a sort function. SP&E. Requires 8/3 comparisons on average. * cdef DTYPE_t a = Xf[0], b = Xf[n / 2], c = Xf[n - 1] # <<<<<<<<<<<<<< @@ -4739,7 +5187,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ __pyx_v_b = (__pyx_v_Xf[(__pyx_v_n / 2)]); __pyx_v_c = (__pyx_v_Xf[(__pyx_v_n - 1)]); - /* "sklearn/tree/_splitter.pyx":474 + /* "sklearn/tree/_splitter.pyx":531 * # Engineering a sort function. SP&E. Requires 8/3 comparisons on average. * cdef DTYPE_t a = Xf[0], b = Xf[n / 2], c = Xf[n - 1] * if a < b: # <<<<<<<<<<<<<< @@ -4749,7 +5197,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ __pyx_t_1 = ((__pyx_v_a < __pyx_v_b) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":475 + /* "sklearn/tree/_splitter.pyx":532 * cdef DTYPE_t a = Xf[0], b = Xf[n / 2], c = Xf[n - 1] * if a < b: * if b < c: # <<<<<<<<<<<<<< @@ -4759,7 +5207,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ __pyx_t_1 = ((__pyx_v_b < __pyx_v_c) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":476 + /* "sklearn/tree/_splitter.pyx":533 * if a < b: * if b < c: * return b # <<<<<<<<<<<<<< @@ -4770,7 +5218,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ goto __pyx_L0; } - /* "sklearn/tree/_splitter.pyx":477 + /* "sklearn/tree/_splitter.pyx":534 * if b < c: * return b * elif a < c: # <<<<<<<<<<<<<< @@ -4780,7 +5228,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ __pyx_t_1 = ((__pyx_v_a < __pyx_v_c) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":478 + /* "sklearn/tree/_splitter.pyx":535 * return b * elif a < c: * return c # <<<<<<<<<<<<<< @@ -4792,7 +5240,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ } /*else*/ { - /* "sklearn/tree/_splitter.pyx":480 + /* "sklearn/tree/_splitter.pyx":537 * return c * else: * return a # <<<<<<<<<<<<<< @@ -4804,7 +5252,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ } } - /* "sklearn/tree/_splitter.pyx":481 + /* "sklearn/tree/_splitter.pyx":538 * else: * return a * elif b < c: # <<<<<<<<<<<<<< @@ -4814,7 +5262,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ __pyx_t_1 = ((__pyx_v_b < __pyx_v_c) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":482 + /* "sklearn/tree/_splitter.pyx":539 * return a * elif b < c: * if a < c: # <<<<<<<<<<<<<< @@ -4824,7 +5272,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ __pyx_t_1 = ((__pyx_v_a < __pyx_v_c) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":483 + /* "sklearn/tree/_splitter.pyx":540 * elif b < c: * if a < c: * return a # <<<<<<<<<<<<<< @@ -4836,7 +5284,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ } /*else*/ { - /* "sklearn/tree/_splitter.pyx":485 + /* "sklearn/tree/_splitter.pyx":542 * return a * else: * return c # <<<<<<<<<<<<<< @@ -4849,7 +5297,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ } /*else*/ { - /* "sklearn/tree/_splitter.pyx":487 + /* "sklearn/tree/_splitter.pyx":544 * return c * else: * return b # <<<<<<<<<<<<<< @@ -4860,7 +5308,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ goto __pyx_L0; } - /* "sklearn/tree/_splitter.pyx":470 + /* "sklearn/tree/_splitter.pyx":527 * * * cdef inline DTYPE_t median3(DTYPE_t* Xf, SIZE_t n) nogil: # <<<<<<<<<<<<<< @@ -4873,7 +5321,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t __pyx_f_7sklearn_ return __pyx_r; } -/* "sklearn/tree/_splitter.pyx":492 +/* "sklearn/tree/_splitter.pyx":549 * # Introsort with median of 3 pivot selection and 3-way partition function * # (robust to repeated elements, e.g. lots of zero features). * cdef void introsort(DTYPE_t* Xf, SIZE_t *samples, SIZE_t n, int maxd) nogil: # <<<<<<<<<<<<<< @@ -4888,7 +5336,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_r; int __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":496 + /* "sklearn/tree/_splitter.pyx":553 * cdef SIZE_t i, l, r * * while n > 1: # <<<<<<<<<<<<<< @@ -4899,7 +5347,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 __pyx_t_1 = ((__pyx_v_n > 1) != 0); if (!__pyx_t_1) break; - /* "sklearn/tree/_splitter.pyx":497 + /* "sklearn/tree/_splitter.pyx":554 * * while n > 1: * if maxd <= 0: # max depth limit exceeded ("gone quadratic") # <<<<<<<<<<<<<< @@ -4909,7 +5357,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 __pyx_t_1 = ((__pyx_v_maxd <= 0) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":498 + /* "sklearn/tree/_splitter.pyx":555 * while n > 1: * if maxd <= 0: # max depth limit exceeded ("gone quadratic") * heapsort(Xf, samples, n) # <<<<<<<<<<<<<< @@ -4918,7 +5366,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 */ __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_v_Xf, __pyx_v_samples, __pyx_v_n); - /* "sklearn/tree/_splitter.pyx":499 + /* "sklearn/tree/_splitter.pyx":556 * if maxd <= 0: # max depth limit exceeded ("gone quadratic") * heapsort(Xf, samples, n) * return # <<<<<<<<<<<<<< @@ -4928,7 +5376,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 goto __pyx_L0; } - /* "sklearn/tree/_splitter.pyx":500 + /* "sklearn/tree/_splitter.pyx":557 * heapsort(Xf, samples, n) * return * maxd -= 1 # <<<<<<<<<<<<<< @@ -4937,7 +5385,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 */ __pyx_v_maxd = (__pyx_v_maxd - 1); - /* "sklearn/tree/_splitter.pyx":502 + /* "sklearn/tree/_splitter.pyx":559 * maxd -= 1 * * pivot = median3(Xf, n) # <<<<<<<<<<<<<< @@ -4946,7 +5394,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 */ __pyx_v_pivot = __pyx_f_7sklearn_4tree_9_splitter_median3(__pyx_v_Xf, __pyx_v_n); - /* "sklearn/tree/_splitter.pyx":505 + /* "sklearn/tree/_splitter.pyx":562 * * # Three-way partition. * i = l = 0 # <<<<<<<<<<<<<< @@ -4956,7 +5404,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 __pyx_v_i = 0; __pyx_v_l = 0; - /* "sklearn/tree/_splitter.pyx":506 + /* "sklearn/tree/_splitter.pyx":563 * # Three-way partition. * i = l = 0 * r = n # <<<<<<<<<<<<<< @@ -4965,7 +5413,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 */ __pyx_v_r = __pyx_v_n; - /* "sklearn/tree/_splitter.pyx":507 + /* "sklearn/tree/_splitter.pyx":564 * i = l = 0 * r = n * while i < r: # <<<<<<<<<<<<<< @@ -4976,7 +5424,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 __pyx_t_1 = ((__pyx_v_i < __pyx_v_r) != 0); if (!__pyx_t_1) break; - /* "sklearn/tree/_splitter.pyx":508 + /* "sklearn/tree/_splitter.pyx":565 * r = n * while i < r: * if Xf[i] < pivot: # <<<<<<<<<<<<<< @@ -4986,7 +5434,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 __pyx_t_1 = (((__pyx_v_Xf[__pyx_v_i]) < __pyx_v_pivot) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":509 + /* "sklearn/tree/_splitter.pyx":566 * while i < r: * if Xf[i] < pivot: * swap(Xf, samples, i, l) # <<<<<<<<<<<<<< @@ -4995,7 +5443,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 */ __pyx_f_7sklearn_4tree_9_splitter_swap(__pyx_v_Xf, __pyx_v_samples, __pyx_v_i, __pyx_v_l); - /* "sklearn/tree/_splitter.pyx":510 + /* "sklearn/tree/_splitter.pyx":567 * if Xf[i] < pivot: * swap(Xf, samples, i, l) * i += 1 # <<<<<<<<<<<<<< @@ -5004,7 +5452,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 */ __pyx_v_i = (__pyx_v_i + 1); - /* "sklearn/tree/_splitter.pyx":511 + /* "sklearn/tree/_splitter.pyx":568 * swap(Xf, samples, i, l) * i += 1 * l += 1 # <<<<<<<<<<<<<< @@ -5015,7 +5463,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 goto __pyx_L8; } - /* "sklearn/tree/_splitter.pyx":512 + /* "sklearn/tree/_splitter.pyx":569 * i += 1 * l += 1 * elif Xf[i] > pivot: # <<<<<<<<<<<<<< @@ -5025,7 +5473,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 __pyx_t_1 = (((__pyx_v_Xf[__pyx_v_i]) > __pyx_v_pivot) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":513 + /* "sklearn/tree/_splitter.pyx":570 * l += 1 * elif Xf[i] > pivot: * r -= 1 # <<<<<<<<<<<<<< @@ -5034,7 +5482,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 */ __pyx_v_r = (__pyx_v_r - 1); - /* "sklearn/tree/_splitter.pyx":514 + /* "sklearn/tree/_splitter.pyx":571 * elif Xf[i] > pivot: * r -= 1 * swap(Xf, samples, i, r) # <<<<<<<<<<<<<< @@ -5046,7 +5494,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 } /*else*/ { - /* "sklearn/tree/_splitter.pyx":516 + /* "sklearn/tree/_splitter.pyx":573 * swap(Xf, samples, i, r) * else: * i += 1 # <<<<<<<<<<<<<< @@ -5058,7 +5506,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 __pyx_L8:; } - /* "sklearn/tree/_splitter.pyx":518 + /* "sklearn/tree/_splitter.pyx":575 * i += 1 * * introsort(Xf, samples, l, maxd) # <<<<<<<<<<<<<< @@ -5067,7 +5515,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 */ __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_v_Xf, __pyx_v_samples, __pyx_v_l, __pyx_v_maxd); - /* "sklearn/tree/_splitter.pyx":519 + /* "sklearn/tree/_splitter.pyx":576 * * introsort(Xf, samples, l, maxd) * Xf += r # <<<<<<<<<<<<<< @@ -5076,7 +5524,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 */ __pyx_v_Xf = (__pyx_v_Xf + __pyx_v_r); - /* "sklearn/tree/_splitter.pyx":520 + /* "sklearn/tree/_splitter.pyx":577 * introsort(Xf, samples, l, maxd) * Xf += r * samples += r # <<<<<<<<<<<<<< @@ -5085,7 +5533,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 */ __pyx_v_samples = (__pyx_v_samples + __pyx_v_r); - /* "sklearn/tree/_splitter.pyx":521 + /* "sklearn/tree/_splitter.pyx":578 * Xf += r * samples += r * n -= r # <<<<<<<<<<<<<< @@ -5095,7 +5543,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 __pyx_v_n = (__pyx_v_n - __pyx_v_r); } - /* "sklearn/tree/_splitter.pyx":492 + /* "sklearn/tree/_splitter.pyx":549 * # Introsort with median of 3 pivot selection and 3-way partition function * # (robust to repeated elements, e.g. lots of zero features). * cdef void introsort(DTYPE_t* Xf, SIZE_t *samples, SIZE_t n, int maxd) nogil: # <<<<<<<<<<<<<< @@ -5107,7 +5555,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_introsort(__pyx_t_7sklearn_4tree_9 __pyx_L0:; } -/* "sklearn/tree/_splitter.pyx":524 +/* "sklearn/tree/_splitter.pyx":581 * * * cdef inline void sift_down(DTYPE_t* Xf, SIZE_t* samples, # <<<<<<<<<<<<<< @@ -5122,7 +5570,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s int __pyx_t_1; int __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":529 + /* "sklearn/tree/_splitter.pyx":586 * cdef SIZE_t child, maxind, root * * root = start # <<<<<<<<<<<<<< @@ -5131,7 +5579,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s */ __pyx_v_root = __pyx_v_start; - /* "sklearn/tree/_splitter.pyx":530 + /* "sklearn/tree/_splitter.pyx":587 * * root = start * while True: # <<<<<<<<<<<<<< @@ -5140,7 +5588,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s */ while (1) { - /* "sklearn/tree/_splitter.pyx":531 + /* "sklearn/tree/_splitter.pyx":588 * root = start * while True: * child = root * 2 + 1 # <<<<<<<<<<<<<< @@ -5149,7 +5597,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s */ __pyx_v_child = ((__pyx_v_root * 2) + 1); - /* "sklearn/tree/_splitter.pyx":534 + /* "sklearn/tree/_splitter.pyx":591 * * # find max of root, left child, right child * maxind = root # <<<<<<<<<<<<<< @@ -5158,7 +5606,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s */ __pyx_v_maxind = __pyx_v_root; - /* "sklearn/tree/_splitter.pyx":535 + /* "sklearn/tree/_splitter.pyx":592 * # find max of root, left child, right child * maxind = root * if child < end and Xf[maxind] < Xf[child]: # <<<<<<<<<<<<<< @@ -5176,7 +5624,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s __pyx_L6_bool_binop_done:; if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":536 + /* "sklearn/tree/_splitter.pyx":593 * maxind = root * if child < end and Xf[maxind] < Xf[child]: * maxind = child # <<<<<<<<<<<<<< @@ -5188,7 +5636,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s } __pyx_L5:; - /* "sklearn/tree/_splitter.pyx":537 + /* "sklearn/tree/_splitter.pyx":594 * if child < end and Xf[maxind] < Xf[child]: * maxind = child * if child + 1 < end and Xf[maxind] < Xf[child + 1]: # <<<<<<<<<<<<<< @@ -5206,7 +5654,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s __pyx_L9_bool_binop_done:; if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":538 + /* "sklearn/tree/_splitter.pyx":595 * maxind = child * if child + 1 < end and Xf[maxind] < Xf[child + 1]: * maxind = child + 1 # <<<<<<<<<<<<<< @@ -5218,7 +5666,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s } __pyx_L8:; - /* "sklearn/tree/_splitter.pyx":540 + /* "sklearn/tree/_splitter.pyx":597 * maxind = child + 1 * * if maxind == root: # <<<<<<<<<<<<<< @@ -5228,7 +5676,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s __pyx_t_1 = ((__pyx_v_maxind == __pyx_v_root) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":541 + /* "sklearn/tree/_splitter.pyx":598 * * if maxind == root: * break # <<<<<<<<<<<<<< @@ -5239,7 +5687,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s } /*else*/ { - /* "sklearn/tree/_splitter.pyx":543 + /* "sklearn/tree/_splitter.pyx":600 * break * else: * swap(Xf, samples, root, maxind) # <<<<<<<<<<<<<< @@ -5248,7 +5696,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s */ __pyx_f_7sklearn_4tree_9_splitter_swap(__pyx_v_Xf, __pyx_v_samples, __pyx_v_root, __pyx_v_maxind); - /* "sklearn/tree/_splitter.pyx":544 + /* "sklearn/tree/_splitter.pyx":601 * else: * swap(Xf, samples, root, maxind) * root = maxind # <<<<<<<<<<<<<< @@ -5260,7 +5708,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s } __pyx_L4_break:; - /* "sklearn/tree/_splitter.pyx":524 + /* "sklearn/tree/_splitter.pyx":581 * * * cdef inline void sift_down(DTYPE_t* Xf, SIZE_t* samples, # <<<<<<<<<<<<<< @@ -5271,7 +5719,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_t_7s /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":547 +/* "sklearn/tree/_splitter.pyx":604 * * * cdef void heapsort(DTYPE_t* Xf, SIZE_t* samples, SIZE_t n) nogil: # <<<<<<<<<<<<<< @@ -5284,7 +5732,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_end; int __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":551 + /* "sklearn/tree/_splitter.pyx":608 * * # heapify * start = (n - 2) / 2 # <<<<<<<<<<<<<< @@ -5293,7 +5741,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ */ __pyx_v_start = ((__pyx_v_n - 2) / 2); - /* "sklearn/tree/_splitter.pyx":552 + /* "sklearn/tree/_splitter.pyx":609 * # heapify * start = (n - 2) / 2 * end = n # <<<<<<<<<<<<<< @@ -5302,7 +5750,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ */ __pyx_v_end = __pyx_v_n; - /* "sklearn/tree/_splitter.pyx":553 + /* "sklearn/tree/_splitter.pyx":610 * start = (n - 2) / 2 * end = n * while True: # <<<<<<<<<<<<<< @@ -5311,7 +5759,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ */ while (1) { - /* "sklearn/tree/_splitter.pyx":554 + /* "sklearn/tree/_splitter.pyx":611 * end = n * while True: * sift_down(Xf, samples, start, end) # <<<<<<<<<<<<<< @@ -5320,7 +5768,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ */ __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_v_Xf, __pyx_v_samples, __pyx_v_start, __pyx_v_end); - /* "sklearn/tree/_splitter.pyx":555 + /* "sklearn/tree/_splitter.pyx":612 * while True: * sift_down(Xf, samples, start, end) * if start == 0: # <<<<<<<<<<<<<< @@ -5330,7 +5778,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ __pyx_t_1 = ((__pyx_v_start == 0) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":556 + /* "sklearn/tree/_splitter.pyx":613 * sift_down(Xf, samples, start, end) * if start == 0: * break # <<<<<<<<<<<<<< @@ -5340,7 +5788,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ goto __pyx_L4_break; } - /* "sklearn/tree/_splitter.pyx":557 + /* "sklearn/tree/_splitter.pyx":614 * if start == 0: * break * start -= 1 # <<<<<<<<<<<<<< @@ -5351,7 +5799,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ } __pyx_L4_break:; - /* "sklearn/tree/_splitter.pyx":560 + /* "sklearn/tree/_splitter.pyx":617 * * # sort by shrinking the heap, putting the max element immediately after it * end = n - 1 # <<<<<<<<<<<<<< @@ -5360,7 +5808,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ */ __pyx_v_end = (__pyx_v_n - 1); - /* "sklearn/tree/_splitter.pyx":561 + /* "sklearn/tree/_splitter.pyx":618 * # sort by shrinking the heap, putting the max element immediately after it * end = n - 1 * while end > 0: # <<<<<<<<<<<<<< @@ -5371,7 +5819,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ __pyx_t_1 = ((__pyx_v_end > 0) != 0); if (!__pyx_t_1) break; - /* "sklearn/tree/_splitter.pyx":562 + /* "sklearn/tree/_splitter.pyx":619 * end = n - 1 * while end > 0: * swap(Xf, samples, 0, end) # <<<<<<<<<<<<<< @@ -5380,7 +5828,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ */ __pyx_f_7sklearn_4tree_9_splitter_swap(__pyx_v_Xf, __pyx_v_samples, 0, __pyx_v_end); - /* "sklearn/tree/_splitter.pyx":563 + /* "sklearn/tree/_splitter.pyx":620 * while end > 0: * swap(Xf, samples, 0, end) * sift_down(Xf, samples, 0, end) # <<<<<<<<<<<<<< @@ -5389,7 +5837,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ */ __pyx_f_7sklearn_4tree_9_splitter_sift_down(__pyx_v_Xf, __pyx_v_samples, 0, __pyx_v_end); - /* "sklearn/tree/_splitter.pyx":564 + /* "sklearn/tree/_splitter.pyx":621 * swap(Xf, samples, 0, end) * sift_down(Xf, samples, 0, end) * end = end - 1 # <<<<<<<<<<<<<< @@ -5399,7 +5847,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ __pyx_v_end = (__pyx_v_end - 1); } - /* "sklearn/tree/_splitter.pyx":547 + /* "sklearn/tree/_splitter.pyx":604 * * * cdef void heapsort(DTYPE_t* Xf, SIZE_t* samples, SIZE_t n) nogil: # <<<<<<<<<<<<<< @@ -5410,7 +5858,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_heapsort(__pyx_t_7sklearn_4tree_9_ /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":569 +/* "sklearn/tree/_splitter.pyx":626 * cdef class RandomSplitter(BaseDenseSplitter): * """Splitter for finding the best random split.""" * def __reduce__(self): # <<<<<<<<<<<<<< @@ -5438,12 +5886,13 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_14RandomSplitter___reduce__( PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); - /* "sklearn/tree/_splitter.pyx":570 + /* "sklearn/tree/_splitter.pyx":627 * """Splitter for finding the best random split.""" * def __reduce__(self): * return (RandomSplitter, (self.criterion, # <<<<<<<<<<<<<< @@ -5452,112 +5901,125 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_14RandomSplitter___reduce__( */ __Pyx_XDECREF(__pyx_r); - /* "sklearn/tree/_splitter.pyx":571 + /* "sklearn/tree/_splitter.pyx":628 * def __reduce__(self): * return (RandomSplitter, (self.criterion, * self.max_features, # <<<<<<<<<<<<<< * self.min_samples_leaf, * self.min_weight_leaf, */ - __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.max_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.max_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - /* "sklearn/tree/_splitter.pyx":572 + /* "sklearn/tree/_splitter.pyx":629 * return (RandomSplitter, (self.criterion, * self.max_features, * self.min_samples_leaf, # <<<<<<<<<<<<<< * self.min_weight_leaf, - * self.random_state), self.__getstate__()) + * self.random_state, */ - __pyx_t_2 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - /* "sklearn/tree/_splitter.pyx":573 + /* "sklearn/tree/_splitter.pyx":630 * self.max_features, * self.min_samples_leaf, * self.min_weight_leaf, # <<<<<<<<<<<<<< - * self.random_state), self.__getstate__()) - * + * self.random_state, + * self.presort), self.__getstate__()) */ - __pyx_t_3 = PyFloat_FromDouble(__pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - /* "sklearn/tree/_splitter.pyx":570 + /* "sklearn/tree/_splitter.pyx":632 + * self.min_weight_leaf, + * self.random_state, + * self.presort), self.__getstate__()) # <<<<<<<<<<<<<< + * + * cdef void node_split(self, double impurity, SplitRecord* split, + */ + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_self->__pyx_base.__pyx_base.presort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "sklearn/tree/_splitter.pyx":627 * """Splitter for finding the best random split.""" * def __reduce__(self): * return (RandomSplitter, (self.criterion, # <<<<<<<<<<<<<< * self.max_features, * self.min_samples_leaf, */ - __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); __Pyx_GIVEREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); - PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); + PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_3); __Pyx_INCREF(__pyx_v_self->__pyx_base.__pyx_base.random_state); __Pyx_GIVEREF(__pyx_v_self->__pyx_base.__pyx_base.random_state); - PyTuple_SET_ITEM(__pyx_t_4, 4, __pyx_v_self->__pyx_base.__pyx_base.random_state); + PyTuple_SET_ITEM(__pyx_t_5, 4, __pyx_v_self->__pyx_base.__pyx_base.random_state); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 5, __pyx_t_4); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; + __pyx_t_4 = 0; - /* "sklearn/tree/_splitter.pyx":574 - * self.min_samples_leaf, + /* "sklearn/tree/_splitter.pyx":632 * self.min_weight_leaf, - * self.random_state), self.__getstate__()) # <<<<<<<<<<<<<< + * self.random_state, + * self.presort), self.__getstate__()) # <<<<<<<<<<<<<< * * cdef void node_split(self, double impurity, SplitRecord* split, */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_getstate); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = NULL; - if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_1)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_getstate); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); + __Pyx_DECREF_SET(__pyx_t_3, function); } } - if (__pyx_t_1) { - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else { - __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "sklearn/tree/_splitter.pyx":570 + /* "sklearn/tree/_splitter.pyx":627 * """Splitter for finding the best random split.""" * def __reduce__(self): * return (RandomSplitter, (self.criterion, # <<<<<<<<<<<<<< * self.max_features, * self.min_samples_leaf, */ - __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_RandomSplitter))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_RandomSplitter))); - PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_RandomSplitter))); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_RandomSplitter))); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_4); + __pyx_t_5 = 0; __pyx_t_4 = 0; + __pyx_r = __pyx_t_3; __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; goto __pyx_L0; - /* "sklearn/tree/_splitter.pyx":569 + /* "sklearn/tree/_splitter.pyx":626 * cdef class RandomSplitter(BaseDenseSplitter): * """Splitter for finding the best random split.""" * def __reduce__(self): # <<<<<<<<<<<<<< @@ -5571,6 +6033,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_14RandomSplitter___reduce__( __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("sklearn.tree._splitter.RandomSplitter.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; @@ -5579,8 +6042,8 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_14RandomSplitter___reduce__( return __pyx_r; } -/* "sklearn/tree/_splitter.pyx":576 - * self.random_state), self.__getstate__()) +/* "sklearn/tree/_splitter.pyx":634 + * self.presort), self.__getstate__()) * * cdef void node_split(self, double impurity, SplitRecord* split, # <<<<<<<<<<<<<< * SIZE_t* n_constant_features) nogil: @@ -5597,7 +6060,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *__pyx_v_X; __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *__pyx_v_Xf; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_X_sample_stride; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_X_fx_stride; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_X_feature_stride; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf; double __pyx_v_min_weight_leaf; @@ -5610,6 +6073,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_f_j; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_p; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_tmp; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_feature_stride; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_found_constants; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_drawn_constants; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_known_constants; @@ -5627,7 +6091,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct int __pyx_t_6; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_7; - /* "sklearn/tree/_splitter.pyx":580 + /* "sklearn/tree/_splitter.pyx":638 * """Find the best random split on node samples[start:end].""" * # Draw random splits and pick the best * cdef SIZE_t* samples = self.samples # <<<<<<<<<<<<<< @@ -5637,7 +6101,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.samples; __pyx_v_samples = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":581 + /* "sklearn/tree/_splitter.pyx":639 * # Draw random splits and pick the best * cdef SIZE_t* samples = self.samples * cdef SIZE_t start = self.start # <<<<<<<<<<<<<< @@ -5647,7 +6111,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.start; __pyx_v_start = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":582 + /* "sklearn/tree/_splitter.pyx":640 * cdef SIZE_t* samples = self.samples * cdef SIZE_t start = self.start * cdef SIZE_t end = self.end # <<<<<<<<<<<<<< @@ -5657,7 +6121,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.end; __pyx_v_end = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":584 + /* "sklearn/tree/_splitter.pyx":642 * cdef SIZE_t end = self.end * * cdef SIZE_t* features = self.features # <<<<<<<<<<<<<< @@ -5667,7 +6131,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.features; __pyx_v_features = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":585 + /* "sklearn/tree/_splitter.pyx":643 * * cdef SIZE_t* features = self.features * cdef SIZE_t* constant_features = self.constant_features # <<<<<<<<<<<<<< @@ -5677,7 +6141,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.constant_features; __pyx_v_constant_features = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":586 + /* "sklearn/tree/_splitter.pyx":644 * cdef SIZE_t* features = self.features * cdef SIZE_t* constant_features = self.constant_features * cdef SIZE_t n_features = self.n_features # <<<<<<<<<<<<<< @@ -5687,7 +6151,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.n_features; __pyx_v_n_features = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":588 + /* "sklearn/tree/_splitter.pyx":646 * cdef SIZE_t n_features = self.n_features * * cdef DTYPE_t* X = self.X # <<<<<<<<<<<<<< @@ -5697,39 +6161,39 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_3 = __pyx_v_self->__pyx_base.X; __pyx_v_X = __pyx_t_3; - /* "sklearn/tree/_splitter.pyx":589 + /* "sklearn/tree/_splitter.pyx":647 * * cdef DTYPE_t* X = self.X * cdef DTYPE_t* Xf = self.feature_values # <<<<<<<<<<<<<< * cdef SIZE_t X_sample_stride = self.X_sample_stride - * cdef SIZE_t X_fx_stride = self.X_fx_stride + * cdef SIZE_t X_feature_stride = self.X_feature_stride */ __pyx_t_3 = __pyx_v_self->__pyx_base.__pyx_base.feature_values; __pyx_v_Xf = __pyx_t_3; - /* "sklearn/tree/_splitter.pyx":590 + /* "sklearn/tree/_splitter.pyx":648 * cdef DTYPE_t* X = self.X * cdef DTYPE_t* Xf = self.feature_values * cdef SIZE_t X_sample_stride = self.X_sample_stride # <<<<<<<<<<<<<< - * cdef SIZE_t X_fx_stride = self.X_fx_stride + * cdef SIZE_t X_feature_stride = self.X_feature_stride * cdef SIZE_t max_features = self.max_features */ __pyx_t_2 = __pyx_v_self->__pyx_base.X_sample_stride; __pyx_v_X_sample_stride = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":591 + /* "sklearn/tree/_splitter.pyx":649 * cdef DTYPE_t* Xf = self.feature_values * cdef SIZE_t X_sample_stride = self.X_sample_stride - * cdef SIZE_t X_fx_stride = self.X_fx_stride # <<<<<<<<<<<<<< + * cdef SIZE_t X_feature_stride = self.X_feature_stride # <<<<<<<<<<<<<< * cdef SIZE_t max_features = self.max_features * cdef SIZE_t min_samples_leaf = self.min_samples_leaf */ - __pyx_t_2 = __pyx_v_self->__pyx_base.X_fx_stride; - __pyx_v_X_fx_stride = __pyx_t_2; + __pyx_t_2 = __pyx_v_self->__pyx_base.X_feature_stride; + __pyx_v_X_feature_stride = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":592 + /* "sklearn/tree/_splitter.pyx":650 * cdef SIZE_t X_sample_stride = self.X_sample_stride - * cdef SIZE_t X_fx_stride = self.X_fx_stride + * cdef SIZE_t X_feature_stride = self.X_feature_stride * cdef SIZE_t max_features = self.max_features # <<<<<<<<<<<<<< * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf @@ -5737,8 +6201,8 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.max_features; __pyx_v_max_features = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":593 - * cdef SIZE_t X_fx_stride = self.X_fx_stride + /* "sklearn/tree/_splitter.pyx":651 + * cdef SIZE_t X_feature_stride = self.X_feature_stride * cdef SIZE_t max_features = self.max_features * cdef SIZE_t min_samples_leaf = self.min_samples_leaf # <<<<<<<<<<<<<< * cdef double min_weight_leaf = self.min_weight_leaf @@ -5747,7 +6211,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf; __pyx_v_min_samples_leaf = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":594 + /* "sklearn/tree/_splitter.pyx":652 * cdef SIZE_t max_features = self.max_features * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf # <<<<<<<<<<<<<< @@ -5757,7 +6221,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_4 = __pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf; __pyx_v_min_weight_leaf = __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":595 + /* "sklearn/tree/_splitter.pyx":653 * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf * cdef UINT32_t* random_state = &self.rand_r_state # <<<<<<<<<<<<<< @@ -5766,7 +6230,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_random_state = (&__pyx_v_self->__pyx_base.__pyx_base.rand_r_state); - /* "sklearn/tree/_splitter.pyx":598 + /* "sklearn/tree/_splitter.pyx":656 * * cdef SplitRecord best, current * cdef double current_proxy_improvement = - INFINITY # <<<<<<<<<<<<<< @@ -5775,7 +6239,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_current_proxy_improvement = (-__pyx_v_7sklearn_4tree_9_splitter_INFINITY); - /* "sklearn/tree/_splitter.pyx":599 + /* "sklearn/tree/_splitter.pyx":657 * cdef SplitRecord best, current * cdef double current_proxy_improvement = - INFINITY * cdef double best_proxy_improvement = - INFINITY # <<<<<<<<<<<<<< @@ -5784,17 +6248,17 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_best_proxy_improvement = (-__pyx_v_7sklearn_4tree_9_splitter_INFINITY); - /* "sklearn/tree/_splitter.pyx":601 + /* "sklearn/tree/_splitter.pyx":659 * cdef double best_proxy_improvement = - INFINITY * * cdef SIZE_t f_i = n_features # <<<<<<<<<<<<<< - * cdef SIZE_t f_j, p, tmp - * # Number of features discovered to be constant during the split search + * cdef SIZE_t f_j + * cdef SIZE_t p */ __pyx_v_f_i = __pyx_v_n_features; - /* "sklearn/tree/_splitter.pyx":604 - * cdef SIZE_t f_j, p, tmp + /* "sklearn/tree/_splitter.pyx":665 + * cdef SIZE_t feature_stride * # Number of features discovered to be constant during the split search * cdef SIZE_t n_found_constants = 0 # <<<<<<<<<<<<<< * # Number of features known to be constant and drawn without replacement @@ -5802,7 +6266,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_n_found_constants = 0; - /* "sklearn/tree/_splitter.pyx":606 + /* "sklearn/tree/_splitter.pyx":667 * cdef SIZE_t n_found_constants = 0 * # Number of features known to be constant and drawn without replacement * cdef SIZE_t n_drawn_constants = 0 # <<<<<<<<<<<<<< @@ -5811,7 +6275,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_n_drawn_constants = 0; - /* "sklearn/tree/_splitter.pyx":607 + /* "sklearn/tree/_splitter.pyx":668 * # Number of features known to be constant and drawn without replacement * cdef SIZE_t n_drawn_constants = 0 * cdef SIZE_t n_known_constants = n_constant_features[0] # <<<<<<<<<<<<<< @@ -5820,7 +6284,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_n_known_constants = (__pyx_v_n_constant_features[0]); - /* "sklearn/tree/_splitter.pyx":609 + /* "sklearn/tree/_splitter.pyx":670 * cdef SIZE_t n_known_constants = n_constant_features[0] * # n_total_constants = n_known_constants + n_found_constants * cdef SIZE_t n_total_constants = n_known_constants # <<<<<<<<<<<<<< @@ -5829,7 +6293,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_n_total_constants = __pyx_v_n_known_constants; - /* "sklearn/tree/_splitter.pyx":610 + /* "sklearn/tree/_splitter.pyx":671 * # n_total_constants = n_known_constants + n_found_constants * cdef SIZE_t n_total_constants = n_known_constants * cdef SIZE_t n_visited_features = 0 # <<<<<<<<<<<<<< @@ -5838,7 +6302,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_n_visited_features = 0; - /* "sklearn/tree/_splitter.pyx":616 + /* "sklearn/tree/_splitter.pyx":677 * cdef SIZE_t partition_end * * _init_split(&best, end) # <<<<<<<<<<<<<< @@ -5847,7 +6311,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_f_7sklearn_4tree_9_splitter__init_split((&__pyx_v_best), __pyx_v_end); - /* "sklearn/tree/_splitter.pyx":627 + /* "sklearn/tree/_splitter.pyx":688 * # newly discovered constant features to spare computation on descendant * # nodes. * while (f_i > n_total_constants and # Stop early if remaining features # <<<<<<<<<<<<<< @@ -5862,7 +6326,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct goto __pyx_L5_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":629 + /* "sklearn/tree/_splitter.pyx":690 * while (f_i > n_total_constants and # Stop early if remaining features * # are constant * (n_visited_features < max_features or # <<<<<<<<<<<<<< @@ -5876,7 +6340,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct goto __pyx_L5_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":631 + /* "sklearn/tree/_splitter.pyx":692 * (n_visited_features < max_features or * # At least one drawn features must be non constant * n_visited_features <= n_found_constants + n_drawn_constants)): # <<<<<<<<<<<<<< @@ -5888,7 +6352,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_L5_bool_binop_done:; if (!__pyx_t_5) break; - /* "sklearn/tree/_splitter.pyx":632 + /* "sklearn/tree/_splitter.pyx":693 * # At least one drawn features must be non constant * n_visited_features <= n_found_constants + n_drawn_constants)): * n_visited_features += 1 # <<<<<<<<<<<<<< @@ -5897,7 +6361,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_n_visited_features = (__pyx_v_n_visited_features + 1); - /* "sklearn/tree/_splitter.pyx":646 + /* "sklearn/tree/_splitter.pyx":707 * * # Draw a feature at random * f_j = rand_int(n_drawn_constants, f_i - n_found_constants, # <<<<<<<<<<<<<< @@ -5906,7 +6370,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_f_j = __pyx_f_7sklearn_4tree_6_utils_rand_int(__pyx_v_n_drawn_constants, (__pyx_v_f_i - __pyx_v_n_found_constants), __pyx_v_random_state); - /* "sklearn/tree/_splitter.pyx":649 + /* "sklearn/tree/_splitter.pyx":710 * random_state) * * if f_j < n_known_constants: # <<<<<<<<<<<<<< @@ -5916,7 +6380,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_5 = ((__pyx_v_f_j < __pyx_v_n_known_constants) != 0); if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":651 + /* "sklearn/tree/_splitter.pyx":712 * if f_j < n_known_constants: * # f_j in the interval [n_drawn_constants, n_known_constants[ * tmp = features[f_j] # <<<<<<<<<<<<<< @@ -5925,7 +6389,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_tmp = (__pyx_v_features[__pyx_v_f_j]); - /* "sklearn/tree/_splitter.pyx":652 + /* "sklearn/tree/_splitter.pyx":713 * # f_j in the interval [n_drawn_constants, n_known_constants[ * tmp = features[f_j] * features[f_j] = features[n_drawn_constants] # <<<<<<<<<<<<<< @@ -5934,7 +6398,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ (__pyx_v_features[__pyx_v_f_j]) = (__pyx_v_features[__pyx_v_n_drawn_constants]); - /* "sklearn/tree/_splitter.pyx":653 + /* "sklearn/tree/_splitter.pyx":714 * tmp = features[f_j] * features[f_j] = features[n_drawn_constants] * features[n_drawn_constants] = tmp # <<<<<<<<<<<<<< @@ -5943,7 +6407,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ (__pyx_v_features[__pyx_v_n_drawn_constants]) = __pyx_v_tmp; - /* "sklearn/tree/_splitter.pyx":655 + /* "sklearn/tree/_splitter.pyx":716 * features[n_drawn_constants] = tmp * * n_drawn_constants += 1 # <<<<<<<<<<<<<< @@ -5955,7 +6419,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct } /*else*/ { - /* "sklearn/tree/_splitter.pyx":659 + /* "sklearn/tree/_splitter.pyx":720 * else: * # f_j in the interval [n_known_constants, f_i - n_found_constants[ * f_j += n_found_constants # <<<<<<<<<<<<<< @@ -5964,35 +6428,44 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_f_j = (__pyx_v_f_j + __pyx_v_n_found_constants); - /* "sklearn/tree/_splitter.pyx":662 + /* "sklearn/tree/_splitter.pyx":723 * # f_j in the interval [n_total_constants, f_i[ * * current.feature = features[f_j] # <<<<<<<<<<<<<< + * feature_stride = X_feature_stride * current.feature * - * # Find min, max */ __pyx_v_current.feature = (__pyx_v_features[__pyx_v_f_j]); - /* "sklearn/tree/_splitter.pyx":665 + /* "sklearn/tree/_splitter.pyx":724 + * + * current.feature = features[f_j] + * feature_stride = X_feature_stride * current.feature # <<<<<<<<<<<<<< + * + * # Find min, max + */ + __pyx_v_feature_stride = (__pyx_v_X_feature_stride * __pyx_v_current.feature); + + /* "sklearn/tree/_splitter.pyx":727 * * # Find min, max - * min_feature_value = X[X_sample_stride * samples[start] + # <<<<<<<<<<<<<< - * X_fx_stride * current.feature] + * min_feature_value = X[X_sample_stride * samples[start] + feature_stride] # <<<<<<<<<<<<<< * max_feature_value = min_feature_value + * Xf[start] = min_feature_value */ - __pyx_v_min_feature_value = (__pyx_v_X[((__pyx_v_X_sample_stride * (__pyx_v_samples[__pyx_v_start])) + (__pyx_v_X_fx_stride * __pyx_v_current.feature))]); + __pyx_v_min_feature_value = (__pyx_v_X[((__pyx_v_X_sample_stride * (__pyx_v_samples[__pyx_v_start])) + __pyx_v_feature_stride)]); - /* "sklearn/tree/_splitter.pyx":667 - * min_feature_value = X[X_sample_stride * samples[start] + - * X_fx_stride * current.feature] + /* "sklearn/tree/_splitter.pyx":728 + * # Find min, max + * min_feature_value = X[X_sample_stride * samples[start] + feature_stride] * max_feature_value = min_feature_value # <<<<<<<<<<<<<< * Xf[start] = min_feature_value * */ __pyx_v_max_feature_value = __pyx_v_min_feature_value; - /* "sklearn/tree/_splitter.pyx":668 - * X_fx_stride * current.feature] + /* "sklearn/tree/_splitter.pyx":729 + * min_feature_value = X[X_sample_stride * samples[start] + feature_stride] * max_feature_value = min_feature_value * Xf[start] = min_feature_value # <<<<<<<<<<<<<< * @@ -6000,36 +6473,36 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ (__pyx_v_Xf[__pyx_v_start]) = __pyx_v_min_feature_value; - /* "sklearn/tree/_splitter.pyx":670 + /* "sklearn/tree/_splitter.pyx":731 * Xf[start] = min_feature_value * * for p in range(start + 1, end): # <<<<<<<<<<<<<< - * current_feature_value = X[X_sample_stride * samples[p] + - * X_fx_stride * current.feature] + * current_feature_value = X[X_sample_stride * samples[p] + feature_stride] + * Xf[p] = current_feature_value */ __pyx_t_2 = __pyx_v_end; for (__pyx_t_7 = (__pyx_v_start + 1); __pyx_t_7 < __pyx_t_2; __pyx_t_7+=1) { __pyx_v_p = __pyx_t_7; - /* "sklearn/tree/_splitter.pyx":671 + /* "sklearn/tree/_splitter.pyx":732 * * for p in range(start + 1, end): - * current_feature_value = X[X_sample_stride * samples[p] + # <<<<<<<<<<<<<< - * X_fx_stride * current.feature] + * current_feature_value = X[X_sample_stride * samples[p] + feature_stride] # <<<<<<<<<<<<<< * Xf[p] = current_feature_value + * */ - __pyx_v_current_feature_value = (__pyx_v_X[((__pyx_v_X_sample_stride * (__pyx_v_samples[__pyx_v_p])) + (__pyx_v_X_fx_stride * __pyx_v_current.feature))]); + __pyx_v_current_feature_value = (__pyx_v_X[((__pyx_v_X_sample_stride * (__pyx_v_samples[__pyx_v_p])) + __pyx_v_feature_stride)]); - /* "sklearn/tree/_splitter.pyx":673 - * current_feature_value = X[X_sample_stride * samples[p] + - * X_fx_stride * current.feature] + /* "sklearn/tree/_splitter.pyx":733 + * for p in range(start + 1, end): + * current_feature_value = X[X_sample_stride * samples[p] + feature_stride] * Xf[p] = current_feature_value # <<<<<<<<<<<<<< * * if current_feature_value < min_feature_value: */ (__pyx_v_Xf[__pyx_v_p]) = __pyx_v_current_feature_value; - /* "sklearn/tree/_splitter.pyx":675 + /* "sklearn/tree/_splitter.pyx":735 * Xf[p] = current_feature_value * * if current_feature_value < min_feature_value: # <<<<<<<<<<<<<< @@ -6039,7 +6512,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_5 = ((__pyx_v_current_feature_value < __pyx_v_min_feature_value) != 0); if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":676 + /* "sklearn/tree/_splitter.pyx":736 * * if current_feature_value < min_feature_value: * min_feature_value = current_feature_value # <<<<<<<<<<<<<< @@ -6050,7 +6523,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct goto __pyx_L11; } - /* "sklearn/tree/_splitter.pyx":677 + /* "sklearn/tree/_splitter.pyx":737 * if current_feature_value < min_feature_value: * min_feature_value = current_feature_value * elif current_feature_value > max_feature_value: # <<<<<<<<<<<<<< @@ -6060,7 +6533,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_5 = ((__pyx_v_current_feature_value > __pyx_v_max_feature_value) != 0); if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":678 + /* "sklearn/tree/_splitter.pyx":738 * min_feature_value = current_feature_value * elif current_feature_value > max_feature_value: * max_feature_value = current_feature_value # <<<<<<<<<<<<<< @@ -6073,7 +6546,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_L11:; } - /* "sklearn/tree/_splitter.pyx":680 + /* "sklearn/tree/_splitter.pyx":740 * max_feature_value = current_feature_value * * if max_feature_value <= min_feature_value + FEATURE_THRESHOLD: # <<<<<<<<<<<<<< @@ -6083,7 +6556,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_5 = ((__pyx_v_max_feature_value <= (__pyx_v_min_feature_value + __pyx_v_7sklearn_4tree_9_splitter_FEATURE_THRESHOLD)) != 0); if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":681 + /* "sklearn/tree/_splitter.pyx":741 * * if max_feature_value <= min_feature_value + FEATURE_THRESHOLD: * features[f_j] = features[n_total_constants] # <<<<<<<<<<<<<< @@ -6092,7 +6565,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ (__pyx_v_features[__pyx_v_f_j]) = (__pyx_v_features[__pyx_v_n_total_constants]); - /* "sklearn/tree/_splitter.pyx":682 + /* "sklearn/tree/_splitter.pyx":742 * if max_feature_value <= min_feature_value + FEATURE_THRESHOLD: * features[f_j] = features[n_total_constants] * features[n_total_constants] = current.feature # <<<<<<<<<<<<<< @@ -6102,7 +6575,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_2 = __pyx_v_current.feature; (__pyx_v_features[__pyx_v_n_total_constants]) = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":684 + /* "sklearn/tree/_splitter.pyx":744 * features[n_total_constants] = current.feature * * n_found_constants += 1 # <<<<<<<<<<<<<< @@ -6111,7 +6584,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_n_found_constants = (__pyx_v_n_found_constants + 1); - /* "sklearn/tree/_splitter.pyx":685 + /* "sklearn/tree/_splitter.pyx":745 * * n_found_constants += 1 * n_total_constants += 1 # <<<<<<<<<<<<<< @@ -6123,7 +6596,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct } /*else*/ { - /* "sklearn/tree/_splitter.pyx":688 + /* "sklearn/tree/_splitter.pyx":748 * * else: * f_i -= 1 # <<<<<<<<<<<<<< @@ -6132,7 +6605,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_f_i = (__pyx_v_f_i - 1); - /* "sklearn/tree/_splitter.pyx":689 + /* "sklearn/tree/_splitter.pyx":749 * else: * f_i -= 1 * features[f_i], features[f_j] = features[f_j], features[f_i] # <<<<<<<<<<<<<< @@ -6144,7 +6617,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct (__pyx_v_features[__pyx_v_f_i]) = __pyx_t_2; (__pyx_v_features[__pyx_v_f_j]) = __pyx_t_7; - /* "sklearn/tree/_splitter.pyx":692 + /* "sklearn/tree/_splitter.pyx":752 * * # Draw a random threshold * current.threshold = rand_uniform(min_feature_value, # <<<<<<<<<<<<<< @@ -6153,7 +6626,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_current.threshold = __pyx_f_7sklearn_4tree_6_utils_rand_uniform(__pyx_v_min_feature_value, __pyx_v_max_feature_value, __pyx_v_random_state); - /* "sklearn/tree/_splitter.pyx":696 + /* "sklearn/tree/_splitter.pyx":756 * random_state) * * if current.threshold == max_feature_value: # <<<<<<<<<<<<<< @@ -6163,7 +6636,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_5 = ((__pyx_v_current.threshold == __pyx_v_max_feature_value) != 0); if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":697 + /* "sklearn/tree/_splitter.pyx":757 * * if current.threshold == max_feature_value: * current.threshold = min_feature_value # <<<<<<<<<<<<<< @@ -6175,7 +6648,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct } __pyx_L13:; - /* "sklearn/tree/_splitter.pyx":700 + /* "sklearn/tree/_splitter.pyx":760 * * # Partition * partition_end = end # <<<<<<<<<<<<<< @@ -6184,7 +6657,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_partition_end = __pyx_v_end; - /* "sklearn/tree/_splitter.pyx":701 + /* "sklearn/tree/_splitter.pyx":761 * # Partition * partition_end = end * p = start # <<<<<<<<<<<<<< @@ -6193,7 +6666,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_p = __pyx_v_start; - /* "sklearn/tree/_splitter.pyx":702 + /* "sklearn/tree/_splitter.pyx":762 * partition_end = end * p = start * while p < partition_end: # <<<<<<<<<<<<<< @@ -6204,7 +6677,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_5 = ((__pyx_v_p < __pyx_v_partition_end) != 0); if (!__pyx_t_5) break; - /* "sklearn/tree/_splitter.pyx":703 + /* "sklearn/tree/_splitter.pyx":763 * p = start * while p < partition_end: * current_feature_value = Xf[p] # <<<<<<<<<<<<<< @@ -6213,7 +6686,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_current_feature_value = (__pyx_v_Xf[__pyx_v_p]); - /* "sklearn/tree/_splitter.pyx":704 + /* "sklearn/tree/_splitter.pyx":764 * while p < partition_end: * current_feature_value = Xf[p] * if current_feature_value <= current.threshold: # <<<<<<<<<<<<<< @@ -6223,7 +6696,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_5 = ((__pyx_v_current_feature_value <= __pyx_v_current.threshold) != 0); if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":705 + /* "sklearn/tree/_splitter.pyx":765 * current_feature_value = Xf[p] * if current_feature_value <= current.threshold: * p += 1 # <<<<<<<<<<<<<< @@ -6235,7 +6708,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct } /*else*/ { - /* "sklearn/tree/_splitter.pyx":707 + /* "sklearn/tree/_splitter.pyx":767 * p += 1 * else: * partition_end -= 1 # <<<<<<<<<<<<<< @@ -6244,7 +6717,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_partition_end = (__pyx_v_partition_end - 1); - /* "sklearn/tree/_splitter.pyx":709 + /* "sklearn/tree/_splitter.pyx":769 * partition_end -= 1 * * Xf[p] = Xf[partition_end] # <<<<<<<<<<<<<< @@ -6253,7 +6726,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ (__pyx_v_Xf[__pyx_v_p]) = (__pyx_v_Xf[__pyx_v_partition_end]); - /* "sklearn/tree/_splitter.pyx":710 + /* "sklearn/tree/_splitter.pyx":770 * * Xf[p] = Xf[partition_end] * Xf[partition_end] = current_feature_value # <<<<<<<<<<<<<< @@ -6262,7 +6735,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ (__pyx_v_Xf[__pyx_v_partition_end]) = __pyx_v_current_feature_value; - /* "sklearn/tree/_splitter.pyx":712 + /* "sklearn/tree/_splitter.pyx":772 * Xf[partition_end] = current_feature_value * * tmp = samples[partition_end] # <<<<<<<<<<<<<< @@ -6271,7 +6744,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_tmp = (__pyx_v_samples[__pyx_v_partition_end]); - /* "sklearn/tree/_splitter.pyx":713 + /* "sklearn/tree/_splitter.pyx":773 * * tmp = samples[partition_end] * samples[partition_end] = samples[p] # <<<<<<<<<<<<<< @@ -6280,7 +6753,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ (__pyx_v_samples[__pyx_v_partition_end]) = (__pyx_v_samples[__pyx_v_p]); - /* "sklearn/tree/_splitter.pyx":714 + /* "sklearn/tree/_splitter.pyx":774 * tmp = samples[partition_end] * samples[partition_end] = samples[p] * samples[p] = tmp # <<<<<<<<<<<<<< @@ -6292,7 +6765,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_L16:; } - /* "sklearn/tree/_splitter.pyx":716 + /* "sklearn/tree/_splitter.pyx":776 * samples[p] = tmp * * current.pos = partition_end # <<<<<<<<<<<<<< @@ -6301,7 +6774,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_current.pos = __pyx_v_partition_end; - /* "sklearn/tree/_splitter.pyx":719 + /* "sklearn/tree/_splitter.pyx":779 * * # Reject if min_samples_leaf is not guaranteed * if (((current.pos - start) < min_samples_leaf) or # <<<<<<<<<<<<<< @@ -6315,7 +6788,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct goto __pyx_L18_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":720 + /* "sklearn/tree/_splitter.pyx":780 * # Reject if min_samples_leaf is not guaranteed * if (((current.pos - start) < min_samples_leaf) or * ((end - current.pos) < min_samples_leaf)): # <<<<<<<<<<<<<< @@ -6327,7 +6800,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_L18_bool_binop_done:; if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":721 + /* "sklearn/tree/_splitter.pyx":781 * if (((current.pos - start) < min_samples_leaf) or * ((end - current.pos) < min_samples_leaf)): * continue # <<<<<<<<<<<<<< @@ -6337,7 +6810,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct goto __pyx_L3_continue; } - /* "sklearn/tree/_splitter.pyx":724 + /* "sklearn/tree/_splitter.pyx":784 * * # Evaluate split * self.criterion.reset() # <<<<<<<<<<<<<< @@ -6346,7 +6819,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->reset(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":725 + /* "sklearn/tree/_splitter.pyx":785 * # Evaluate split * self.criterion.reset() * self.criterion.update(current.pos) # <<<<<<<<<<<<<< @@ -6355,7 +6828,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->update(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_current.pos); - /* "sklearn/tree/_splitter.pyx":728 + /* "sklearn/tree/_splitter.pyx":788 * * # Reject if min_weight_leaf is not satisfied * if ((self.criterion.weighted_n_left < min_weight_leaf) or # <<<<<<<<<<<<<< @@ -6369,7 +6842,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct goto __pyx_L21_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":729 + /* "sklearn/tree/_splitter.pyx":789 * # Reject if min_weight_leaf is not satisfied * if ((self.criterion.weighted_n_left < min_weight_leaf) or * (self.criterion.weighted_n_right < min_weight_leaf)): # <<<<<<<<<<<<<< @@ -6381,7 +6854,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_L21_bool_binop_done:; if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":730 + /* "sklearn/tree/_splitter.pyx":790 * if ((self.criterion.weighted_n_left < min_weight_leaf) or * (self.criterion.weighted_n_right < min_weight_leaf)): * continue # <<<<<<<<<<<<<< @@ -6391,7 +6864,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct goto __pyx_L3_continue; } - /* "sklearn/tree/_splitter.pyx":732 + /* "sklearn/tree/_splitter.pyx":792 * continue * * current_proxy_improvement = self.criterion.proxy_impurity_improvement() # <<<<<<<<<<<<<< @@ -6400,7 +6873,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_current_proxy_improvement = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->proxy_impurity_improvement(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":734 + /* "sklearn/tree/_splitter.pyx":794 * current_proxy_improvement = self.criterion.proxy_impurity_improvement() * * if current_proxy_improvement > best_proxy_improvement: # <<<<<<<<<<<<<< @@ -6410,7 +6883,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_5 = ((__pyx_v_current_proxy_improvement > __pyx_v_best_proxy_improvement) != 0); if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":735 + /* "sklearn/tree/_splitter.pyx":795 * * if current_proxy_improvement > best_proxy_improvement: * best_proxy_improvement = current_proxy_improvement # <<<<<<<<<<<<<< @@ -6419,7 +6892,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_best_proxy_improvement = __pyx_v_current_proxy_improvement; - /* "sklearn/tree/_splitter.pyx":736 + /* "sklearn/tree/_splitter.pyx":796 * if current_proxy_improvement > best_proxy_improvement: * best_proxy_improvement = current_proxy_improvement * best = current # copy # <<<<<<<<<<<<<< @@ -6437,9 +6910,18 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_L3_continue:; } - /* "sklearn/tree/_splitter.pyx":739 + /* "sklearn/tree/_splitter.pyx":799 * * # Reorganize into samples[start:best.pos] + samples[best.pos:end] + * feature_stride = X_feature_stride * best.feature # <<<<<<<<<<<<<< + * if best.pos < end: + * if current.feature != best.feature: + */ + __pyx_v_feature_stride = (__pyx_v_X_feature_stride * __pyx_v_best.feature); + + /* "sklearn/tree/_splitter.pyx":800 + * # Reorganize into samples[start:best.pos] + samples[best.pos:end] + * feature_stride = X_feature_stride * best.feature * if best.pos < end: # <<<<<<<<<<<<<< * if current.feature != best.feature: * partition_end = end @@ -6447,8 +6929,8 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_5 = ((__pyx_v_best.pos < __pyx_v_end) != 0); if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":740 - * # Reorganize into samples[start:best.pos] + samples[best.pos:end] + /* "sklearn/tree/_splitter.pyx":801 + * feature_stride = X_feature_stride * best.feature * if best.pos < end: * if current.feature != best.feature: # <<<<<<<<<<<<<< * partition_end = end @@ -6457,7 +6939,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct __pyx_t_5 = ((__pyx_v_current.feature != __pyx_v_best.feature) != 0); if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":741 + /* "sklearn/tree/_splitter.pyx":802 * if best.pos < end: * if current.feature != best.feature: * partition_end = end # <<<<<<<<<<<<<< @@ -6466,7 +6948,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_partition_end = __pyx_v_end; - /* "sklearn/tree/_splitter.pyx":742 + /* "sklearn/tree/_splitter.pyx":803 * if current.feature != best.feature: * partition_end = end * p = start # <<<<<<<<<<<<<< @@ -6475,30 +6957,30 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_p = __pyx_v_start; - /* "sklearn/tree/_splitter.pyx":744 + /* "sklearn/tree/_splitter.pyx":805 * p = start * * while p < partition_end: # <<<<<<<<<<<<<< - * if X[X_sample_stride * samples[p] + - * X_fx_stride * best.feature] <= best.threshold: + * if X[X_sample_stride * samples[p] + feature_stride] <= best.threshold: + * p += 1 */ while (1) { __pyx_t_5 = ((__pyx_v_p < __pyx_v_partition_end) != 0); if (!__pyx_t_5) break; - /* "sklearn/tree/_splitter.pyx":746 + /* "sklearn/tree/_splitter.pyx":806 + * * while p < partition_end: - * if X[X_sample_stride * samples[p] + - * X_fx_stride * best.feature] <= best.threshold: # <<<<<<<<<<<<<< + * if X[X_sample_stride * samples[p] + feature_stride] <= best.threshold: # <<<<<<<<<<<<<< * p += 1 * */ - __pyx_t_5 = (((__pyx_v_X[((__pyx_v_X_sample_stride * (__pyx_v_samples[__pyx_v_p])) + (__pyx_v_X_fx_stride * __pyx_v_best.feature))]) <= __pyx_v_best.threshold) != 0); + __pyx_t_5 = (((__pyx_v_X[((__pyx_v_X_sample_stride * (__pyx_v_samples[__pyx_v_p])) + __pyx_v_feature_stride)]) <= __pyx_v_best.threshold) != 0); if (__pyx_t_5) { - /* "sklearn/tree/_splitter.pyx":747 - * if X[X_sample_stride * samples[p] + - * X_fx_stride * best.feature] <= best.threshold: + /* "sklearn/tree/_splitter.pyx":807 + * while p < partition_end: + * if X[X_sample_stride * samples[p] + feature_stride] <= best.threshold: * p += 1 # <<<<<<<<<<<<<< * * else: @@ -6508,7 +6990,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct } /*else*/ { - /* "sklearn/tree/_splitter.pyx":750 + /* "sklearn/tree/_splitter.pyx":810 * * else: * partition_end -= 1 # <<<<<<<<<<<<<< @@ -6517,7 +6999,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_partition_end = (__pyx_v_partition_end - 1); - /* "sklearn/tree/_splitter.pyx":752 + /* "sklearn/tree/_splitter.pyx":812 * partition_end -= 1 * * tmp = samples[partition_end] # <<<<<<<<<<<<<< @@ -6526,7 +7008,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_tmp = (__pyx_v_samples[__pyx_v_partition_end]); - /* "sklearn/tree/_splitter.pyx":753 + /* "sklearn/tree/_splitter.pyx":813 * * tmp = samples[partition_end] * samples[partition_end] = samples[p] # <<<<<<<<<<<<<< @@ -6535,7 +7017,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ (__pyx_v_samples[__pyx_v_partition_end]) = (__pyx_v_samples[__pyx_v_p]); - /* "sklearn/tree/_splitter.pyx":754 + /* "sklearn/tree/_splitter.pyx":814 * tmp = samples[partition_end] * samples[partition_end] = samples[p] * samples[p] = tmp # <<<<<<<<<<<<<< @@ -6550,7 +7032,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct } __pyx_L25:; - /* "sklearn/tree/_splitter.pyx":757 + /* "sklearn/tree/_splitter.pyx":817 * * * self.criterion.reset() # <<<<<<<<<<<<<< @@ -6559,7 +7041,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->reset(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":758 + /* "sklearn/tree/_splitter.pyx":818 * * self.criterion.reset() * self.criterion.update(best.pos) # <<<<<<<<<<<<<< @@ -6568,7 +7050,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->update(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_best.pos); - /* "sklearn/tree/_splitter.pyx":759 + /* "sklearn/tree/_splitter.pyx":819 * self.criterion.reset() * self.criterion.update(best.pos) * best.improvement = self.criterion.impurity_improvement(impurity) # <<<<<<<<<<<<<< @@ -6577,7 +7059,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ __pyx_v_best.improvement = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->impurity_improvement(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_impurity); - /* "sklearn/tree/_splitter.pyx":760 + /* "sklearn/tree/_splitter.pyx":820 * self.criterion.update(best.pos) * best.improvement = self.criterion.impurity_improvement(impurity) * self.criterion.children_impurity(&best.impurity_left, # <<<<<<<<<<<<<< @@ -6589,7 +7071,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct } __pyx_L24:; - /* "sklearn/tree/_splitter.pyx":766 + /* "sklearn/tree/_splitter.pyx":826 * # element in features[:n_known_constants] must be preserved for sibling * # and child nodes * memcpy(features, constant_features, sizeof(SIZE_t) * n_known_constants) # <<<<<<<<<<<<<< @@ -6598,7 +7080,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ memcpy(__pyx_v_features, __pyx_v_constant_features, ((sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)) * __pyx_v_n_known_constants)); - /* "sklearn/tree/_splitter.pyx":769 + /* "sklearn/tree/_splitter.pyx":829 * * # Copy newly found constant features * memcpy(constant_features + n_known_constants, # <<<<<<<<<<<<<< @@ -6607,7 +7089,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ memcpy((__pyx_v_constant_features + __pyx_v_n_known_constants), (__pyx_v_features + __pyx_v_n_known_constants), ((sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)) * __pyx_v_n_found_constants)); - /* "sklearn/tree/_splitter.pyx":774 + /* "sklearn/tree/_splitter.pyx":834 * * # Return values * split[0] = best # <<<<<<<<<<<<<< @@ -6616,7 +7098,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ (__pyx_v_split[0]) = __pyx_v_best; - /* "sklearn/tree/_splitter.pyx":775 + /* "sklearn/tree/_splitter.pyx":835 * # Return values * split[0] = best * n_constant_features[0] = n_total_constants # <<<<<<<<<<<<<< @@ -6625,8 +7107,8 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct */ (__pyx_v_n_constant_features[0]) = __pyx_v_n_total_constants; - /* "sklearn/tree/_splitter.pyx":576 - * self.random_state), self.__getstate__()) + /* "sklearn/tree/_splitter.pyx":634 + * self.presort), self.__getstate__()) * * cdef void node_split(self, double impurity, SplitRecord* split, # <<<<<<<<<<<<<< * SIZE_t* n_constant_features) nogil: @@ -6636,22 +7118,23 @@ static void __pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split(struct /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":788 - * cdef unsigned char* sample_mask +/* "sklearn/tree/_splitter.pyx":849 + * cdef SIZE_t* sorted_samples * * def __cinit__(self, Criterion criterion, SIZE_t max_features, # <<<<<<<<<<<<<< - * SIZE_t min_samples_leaf, - * double min_weight_leaf, + * SIZE_t min_samples_leaf, double min_weight_leaf, + * object random_state, bint presort): */ /* Python wrapper */ -static int __pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static int __pyx_pw_7sklearn_4tree_9_splitter_18BaseSparseSplitter_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_7sklearn_4tree_9_splitter_18BaseSparseSplitter_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion = 0; CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features; CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf; CYTHON_UNUSED double __pyx_v_min_weight_leaf; CYTHON_UNUSED PyObject *__pyx_v_random_state = 0; + CYTHON_UNUSED int __pyx_v_presort; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -6659,12 +7142,13 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_1__cinit__(P __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_criterion,&__pyx_n_s_max_features,&__pyx_n_s_min_samples_leaf,&__pyx_n_s_min_weight_leaf,&__pyx_n_s_random_state,0}; - PyObject* values[5] = {0,0,0,0,0}; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_criterion,&__pyx_n_s_max_features,&__pyx_n_s_min_samples_leaf,&__pyx_n_s_min_weight_leaf,&__pyx_n_s_random_state,&__pyx_n_s_presort,0}; + PyObject* values[6] = {0,0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); @@ -6681,28 +7165,33 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_1__cinit__(P case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_max_features)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_samples_leaf)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_weight_leaf)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_random_state)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 5: + if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_presort)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } - } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { + } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); @@ -6710,23 +7199,25 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_1__cinit__(P values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + values[5] = PyTuple_GET_ITEM(__pyx_args, 5); } __pyx_v_criterion = ((struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *)values[0]); - __pyx_v_max_features = __Pyx_PyInt_As_Py_intptr_t(values[1]); if (unlikely((__pyx_v_max_features == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_samples_leaf = __Pyx_PyInt_As_Py_intptr_t(values[2]); if (unlikely((__pyx_v_min_samples_leaf == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 789; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_weight_leaf = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_min_weight_leaf == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_max_features = __Pyx_PyInt_As_Py_intptr_t(values[1]); if (unlikely((__pyx_v_max_features == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_samples_leaf = __Pyx_PyInt_As_Py_intptr_t(values[2]); if (unlikely((__pyx_v_min_samples_leaf == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_weight_leaf = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_min_weight_leaf == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_random_state = values[4]; + __pyx_v_presort = __Pyx_PyObject_IsTrue(values[5]); if (unlikely((__pyx_v_presort == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; - __Pyx_AddTraceback("sklearn.tree._splitter.PresortBestSplitter.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("sklearn.tree._splitter.BaseSparseSplitter.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_10_criterion_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_r = __pyx_pf_7sklearn_4tree_9_splitter_19PresortBestSplitter___cinit__(((struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *)__pyx_v_self), __pyx_v_criterion, __pyx_v_max_features, __pyx_v_min_samples_leaf, __pyx_v_min_weight_leaf, __pyx_v_random_state); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_10_criterion_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter___cinit__(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *)__pyx_v_self), __pyx_v_criterion, __pyx_v_max_features, __pyx_v_min_samples_leaf, __pyx_v_min_weight_leaf, __pyx_v_random_state, __pyx_v_presort); /* function exit code */ goto __pyx_L0; @@ -6737,53 +7228,71 @@ static int __pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_1__cinit__(P return __pyx_r; } -static int __pyx_pf_7sklearn_4tree_9_splitter_19PresortBestSplitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *__pyx_v_self, CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, CYTHON_UNUSED double __pyx_v_min_weight_leaf, CYTHON_UNUSED PyObject *__pyx_v_random_state) { +static int __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self, CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, CYTHON_UNUSED double __pyx_v_min_weight_leaf, CYTHON_UNUSED PyObject *__pyx_v_random_state, CYTHON_UNUSED int __pyx_v_presort) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__", 0); - /* "sklearn/tree/_splitter.pyx":793 - * object random_state): - * # Initialize pointers - * self.X_old = NULL # <<<<<<<<<<<<<< - * self.X_argsorted_ptr = NULL - * self.X_argsorted_stride = 0 + /* "sklearn/tree/_splitter.pyx":854 + * # Parent __cinit__ is automatically called + * + * self.X_data = NULL # <<<<<<<<<<<<<< + * self.X_indices = NULL + * self.X_indptr = NULL */ - __pyx_v_self->X_old = NULL; + __pyx_v_self->X_data = NULL; - /* "sklearn/tree/_splitter.pyx":794 - * # Initialize pointers - * self.X_old = NULL - * self.X_argsorted_ptr = NULL # <<<<<<<<<<<<<< - * self.X_argsorted_stride = 0 - * self.sample_mask = NULL + /* "sklearn/tree/_splitter.pyx":855 + * + * self.X_data = NULL + * self.X_indices = NULL # <<<<<<<<<<<<<< + * self.X_indptr = NULL + * */ - __pyx_v_self->X_argsorted_ptr = NULL; + __pyx_v_self->X_indices = NULL; - /* "sklearn/tree/_splitter.pyx":795 - * self.X_old = NULL - * self.X_argsorted_ptr = NULL - * self.X_argsorted_stride = 0 # <<<<<<<<<<<<<< - * self.sample_mask = NULL + /* "sklearn/tree/_splitter.pyx":856 + * self.X_data = NULL + * self.X_indices = NULL + * self.X_indptr = NULL # <<<<<<<<<<<<<< * + * self.n_total_samples = 0 */ - __pyx_v_self->X_argsorted_stride = 0; + __pyx_v_self->X_indptr = NULL; - /* "sklearn/tree/_splitter.pyx":796 - * self.X_argsorted_ptr = NULL - * self.X_argsorted_stride = 0 - * self.sample_mask = NULL # <<<<<<<<<<<<<< + /* "sklearn/tree/_splitter.pyx":858 + * self.X_indptr = NULL + * + * self.n_total_samples = 0 # <<<<<<<<<<<<<< + * + * self.index_to_samples = NULL + */ + __pyx_v_self->n_total_samples = 0; + + /* "sklearn/tree/_splitter.pyx":860 + * self.n_total_samples = 0 + * + * self.index_to_samples = NULL # <<<<<<<<<<<<<< + * self.sorted_samples = NULL + * + */ + __pyx_v_self->index_to_samples = NULL; + + /* "sklearn/tree/_splitter.pyx":861 + * + * self.index_to_samples = NULL + * self.sorted_samples = NULL # <<<<<<<<<<<<<< * * def __dealloc__(self): */ - __pyx_v_self->sample_mask = NULL; + __pyx_v_self->sorted_samples = NULL; - /* "sklearn/tree/_splitter.pyx":788 - * cdef unsigned char* sample_mask + /* "sklearn/tree/_splitter.pyx":849 + * cdef SIZE_t* sorted_samples * * def __cinit__(self, Criterion criterion, SIZE_t max_features, # <<<<<<<<<<<<<< - * SIZE_t min_samples_leaf, - * double min_weight_leaf, + * SIZE_t min_samples_leaf, double min_weight_leaf, + * object random_state, bint presort): */ /* function exit code */ @@ -6792,1747 +7301,39 @@ static int __pyx_pf_7sklearn_4tree_9_splitter_19PresortBestSplitter___cinit__(st return __pyx_r; } -/* "sklearn/tree/_splitter.pyx":798 - * self.sample_mask = NULL +/* "sklearn/tree/_splitter.pyx":863 + * self.sorted_samples = NULL * * def __dealloc__(self): # <<<<<<<<<<<<<< - * """Destructor.""" - * free(self.sample_mask) + * """Deallocate memory.""" + * free(self.index_to_samples) */ /* Python wrapper */ -static void __pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_3__dealloc__(PyObject *__pyx_v_self) { +static void __pyx_pw_7sklearn_4tree_9_splitter_18BaseSparseSplitter_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pw_7sklearn_4tree_9_splitter_18BaseSparseSplitter_3__dealloc__(PyObject *__pyx_v_self) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_pf_7sklearn_4tree_9_splitter_19PresortBestSplitter_2__dealloc__(((struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *)__pyx_v_self)); + __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter_2__dealloc__(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); } -static void __pyx_pf_7sklearn_4tree_9_splitter_19PresortBestSplitter_2__dealloc__(struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *__pyx_v_self) { +static void __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter_2__dealloc__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__dealloc__", 0); - /* "sklearn/tree/_splitter.pyx":800 + /* "sklearn/tree/_splitter.pyx":865 * def __dealloc__(self): - * """Destructor.""" - * free(self.sample_mask) # <<<<<<<<<<<<<< - * - * def __reduce__(self): - */ - free(__pyx_v_self->sample_mask); - - /* "sklearn/tree/_splitter.pyx":798 - * self.sample_mask = NULL - * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * """Destructor.""" - * free(self.sample_mask) - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "sklearn/tree/_splitter.pyx":802 - * free(self.sample_mask) - * - * def __reduce__(self): # <<<<<<<<<<<<<< - * return (PresortBestSplitter, (self.criterion, - * self.max_features, - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0); - __pyx_r = __pyx_pf_7sklearn_4tree_9_splitter_19PresortBestSplitter_4__reduce__(((struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_19PresortBestSplitter_4__reduce__(struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce__", 0); - - /* "sklearn/tree/_splitter.pyx":803 - * - * def __reduce__(self): - * return (PresortBestSplitter, (self.criterion, # <<<<<<<<<<<<<< - * self.max_features, - * self.min_samples_leaf, - */ - __Pyx_XDECREF(__pyx_r); - - /* "sklearn/tree/_splitter.pyx":804 - * def __reduce__(self): - * return (PresortBestSplitter, (self.criterion, - * self.max_features, # <<<<<<<<<<<<<< - * self.min_samples_leaf, - * self.min_weight_leaf, - */ - __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.max_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - - /* "sklearn/tree/_splitter.pyx":805 - * return (PresortBestSplitter, (self.criterion, - * self.max_features, - * self.min_samples_leaf, # <<<<<<<<<<<<<< - * self.min_weight_leaf, - * self.random_state), self.__getstate__()) - */ - __pyx_t_2 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - - /* "sklearn/tree/_splitter.pyx":806 - * self.max_features, - * self.min_samples_leaf, - * self.min_weight_leaf, # <<<<<<<<<<<<<< - * self.random_state), self.__getstate__()) - * - */ - __pyx_t_3 = PyFloat_FromDouble(__pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_3); - - /* "sklearn/tree/_splitter.pyx":803 - * - * def __reduce__(self): - * return (PresortBestSplitter, (self.criterion, # <<<<<<<<<<<<<< - * self.max_features, - * self.min_samples_leaf, - */ - __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - __Pyx_INCREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); - PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); - __Pyx_INCREF(__pyx_v_self->__pyx_base.__pyx_base.random_state); - __Pyx_GIVEREF(__pyx_v_self->__pyx_base.__pyx_base.random_state); - PyTuple_SET_ITEM(__pyx_t_4, 4, __pyx_v_self->__pyx_base.__pyx_base.random_state); - __pyx_t_1 = 0; - __pyx_t_2 = 0; - __pyx_t_3 = 0; - - /* "sklearn/tree/_splitter.pyx":807 - * self.min_samples_leaf, - * self.min_weight_leaf, - * self.random_state), self.__getstate__()) # <<<<<<<<<<<<<< - * - * cdef void init(self, object X, - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_getstate); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = NULL; - if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_1)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_1); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - if (__pyx_t_1) { - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } else { - __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "sklearn/tree/_splitter.pyx":803 - * - * def __reduce__(self): - * return (PresortBestSplitter, (self.criterion, # <<<<<<<<<<<<<< - * self.max_features, - * self.min_samples_leaf, - */ - __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_PresortBestSplitter))); - __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_PresortBestSplitter))); - PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_PresortBestSplitter))); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_3); - __pyx_t_4 = 0; - __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "sklearn/tree/_splitter.pyx":802 - * free(self.sample_mask) - * - * def __reduce__(self): # <<<<<<<<<<<<<< - * return (PresortBestSplitter, (self.criterion, - * self.max_features, - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("sklearn.tree._splitter.PresortBestSplitter.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "sklearn/tree/_splitter.pyx":809 - * self.random_state), self.__getstate__()) - * - * cdef void init(self, object X, # <<<<<<<<<<<<<< - * np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, - * DOUBLE_t* sample_weight) except *: - */ - -static void __pyx_f_7sklearn_4tree_9_splitter_19PresortBestSplitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight) { - void *__pyx_v_sample_mask; - PyArrayObject *__pyx_v_X_ndarray = 0; - __Pyx_LocalBuf_ND __pyx_pybuffernd_y; - __Pyx_Buffer __pyx_pybuffer_y; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *__pyx_t_3; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_8; - unsigned char *__pyx_t_9; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("init", 0); - __pyx_pybuffer_y.pybuffer.buf = NULL; - __pyx_pybuffer_y.refcount = 0; - __pyx_pybuffernd_y.data = NULL; - __pyx_pybuffernd_y.rcbuffer = &__pyx_pybuffer_y; - { - __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - __pyx_pybuffernd_y.diminfo[0].strides = __pyx_pybuffernd_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_y.diminfo[0].shape = __pyx_pybuffernd_y.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_y.diminfo[1].strides = __pyx_pybuffernd_y.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_y.diminfo[1].shape = __pyx_pybuffernd_y.rcbuffer->pybuffer.shape[1]; - - /* "sklearn/tree/_splitter.pyx":813 - * DOUBLE_t* sample_weight) except *: - * - * cdef void* sample_mask = NULL # <<<<<<<<<<<<<< - * - * # Call parent initializer - */ - __pyx_v_sample_mask = NULL; - - /* "sklearn/tree/_splitter.pyx":816 - * - * # Call parent initializer - * BaseDenseSplitter.init(self, X, y, sample_weight) # <<<<<<<<<<<<<< + * """Deallocate memory.""" + * free(self.index_to_samples) # <<<<<<<<<<<<<< + * free(self.sorted_samples) * - * cdef np.ndarray X_ndarray = X */ - __pyx_f_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *)__pyx_v_self), __pyx_v_X, ((PyArrayObject *)__pyx_v_y), __pyx_v_sample_weight); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + free(__pyx_v_self->index_to_samples); - /* "sklearn/tree/_splitter.pyx":818 - * BaseDenseSplitter.init(self, X, y, sample_weight) - * - * cdef np.ndarray X_ndarray = X # <<<<<<<<<<<<<< - * - * # Pre-sort X - */ - if (!(likely(((__pyx_v_X) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_X, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_1 = __pyx_v_X; - __Pyx_INCREF(__pyx_t_1); - __pyx_v_X_ndarray = ((PyArrayObject *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "sklearn/tree/_splitter.pyx":821 - * - * # Pre-sort X - * if self.X_old != self.X: # <<<<<<<<<<<<<< - * self.X_old = self.X - * self.X_argsorted = np.asfortranarray(np.argsort(X_ndarray, axis=0), - */ - __pyx_t_2 = ((__pyx_v_self->X_old != __pyx_v_self->__pyx_base.X) != 0); - if (__pyx_t_2) { - - /* "sklearn/tree/_splitter.pyx":822 - * # Pre-sort X - * if self.X_old != self.X: - * self.X_old = self.X # <<<<<<<<<<<<<< - * self.X_argsorted = np.asfortranarray(np.argsort(X_ndarray, axis=0), - * dtype=np.int32) - */ - __pyx_t_3 = __pyx_v_self->__pyx_base.X; - __pyx_v_self->X_old = __pyx_t_3; - - /* "sklearn/tree/_splitter.pyx":823 - * if self.X_old != self.X: - * self.X_old = self.X - * self.X_argsorted = np.asfortranarray(np.argsort(X_ndarray, axis=0), # <<<<<<<<<<<<<< - * dtype=np.int32) - * self.X_argsorted_ptr = self.X_argsorted.data - */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_asfortranarray); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_argsort); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(((PyObject *)__pyx_v_X_ndarray)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_X_ndarray)); - PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_X_ndarray)); - __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_6); - if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_axis, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GIVEREF(__pyx_t_7); - PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_7); - __pyx_t_7 = 0; - __pyx_t_7 = PyDict_New(); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_7); - - /* "sklearn/tree/_splitter.pyx":824 - * self.X_old = self.X - * self.X_argsorted = np.asfortranarray(np.argsort(X_ndarray, axis=0), - * dtype=np.int32) # <<<<<<<<<<<<<< - * self.X_argsorted_ptr = self.X_argsorted.data - * self.X_argsorted_stride = ( self.X_argsorted.strides[1] / - */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int32); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - - /* "sklearn/tree/_splitter.pyx":823 - * if self.X_old != self.X: - * self.X_old = self.X - * self.X_argsorted = np.asfortranarray(np.argsort(X_ndarray, axis=0), # <<<<<<<<<<<<<< - * dtype=np.int32) - * self.X_argsorted_ptr = self.X_argsorted.data - */ - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GIVEREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_v_self->X_argsorted); - __Pyx_DECREF(((PyObject *)__pyx_v_self->X_argsorted)); - __pyx_v_self->X_argsorted = ((PyArrayObject *)__pyx_t_5); - __pyx_t_5 = 0; - - /* "sklearn/tree/_splitter.pyx":825 - * self.X_argsorted = np.asfortranarray(np.argsort(X_ndarray, axis=0), - * dtype=np.int32) - * self.X_argsorted_ptr = self.X_argsorted.data # <<<<<<<<<<<<<< - * self.X_argsorted_stride = ( self.X_argsorted.strides[1] / - * self.X_argsorted.itemsize) - */ - __pyx_v_self->X_argsorted_ptr = ((__pyx_t_7sklearn_4tree_9_splitter_INT32_t *)__pyx_v_self->X_argsorted->data); - - /* "sklearn/tree/_splitter.pyx":827 - * self.X_argsorted_ptr = self.X_argsorted.data - * self.X_argsorted_stride = ( self.X_argsorted.strides[1] / - * self.X_argsorted.itemsize) # <<<<<<<<<<<<<< - * - * self.n_total_samples = X.shape[0] - */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->X_argsorted), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_8 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_5); if (unlikely((__pyx_t_8 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - - /* "sklearn/tree/_splitter.pyx":826 - * dtype=np.int32) - * self.X_argsorted_ptr = self.X_argsorted.data - * self.X_argsorted_stride = ( self.X_argsorted.strides[1] / # <<<<<<<<<<<<<< - * self.X_argsorted.itemsize) - * - */ - __pyx_v_self->X_argsorted_stride = (((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)(__pyx_v_self->X_argsorted->strides[1])) / ((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)__pyx_t_8)); - - /* "sklearn/tree/_splitter.pyx":829 - * self.X_argsorted.itemsize) - * - * self.n_total_samples = X.shape[0] # <<<<<<<<<<<<<< - * sample_mask = safe_realloc(&self.sample_mask, self.n_total_samples) - * memset(sample_mask, 0, self.n_total_samples) - */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_8 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_7); if (unlikely((__pyx_t_8 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_v_self->n_total_samples = __pyx_t_8; - - /* "sklearn/tree/_splitter.pyx":830 - * - * self.n_total_samples = X.shape[0] - * sample_mask = safe_realloc(&self.sample_mask, self.n_total_samples) # <<<<<<<<<<<<<< - * memset(sample_mask, 0, self.n_total_samples) - * - */ - __pyx_t_9 = __pyx_fuse_2__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->sample_mask), __pyx_v_self->n_total_samples); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_v_sample_mask = __pyx_t_9; - - /* "sklearn/tree/_splitter.pyx":831 - * self.n_total_samples = X.shape[0] - * sample_mask = safe_realloc(&self.sample_mask, self.n_total_samples) - * memset(sample_mask, 0, self.n_total_samples) # <<<<<<<<<<<<<< - * - * cdef void node_split(self, double impurity, SplitRecord* split, - */ - memset(__pyx_v_sample_mask, 0, __pyx_v_self->n_total_samples); - goto __pyx_L3; - } - __pyx_L3:; - - /* "sklearn/tree/_splitter.pyx":809 - * self.random_state), self.__getstate__()) - * - * cdef void init(self, object X, # <<<<<<<<<<<<<< - * np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, - * DOUBLE_t* sample_weight) except *: - */ - - /* function exit code */ - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; - __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); - __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_y.rcbuffer->pybuffer); - __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} - __Pyx_AddTraceback("sklearn.tree._splitter.PresortBestSplitter.init", __pyx_clineno, __pyx_lineno, __pyx_filename); - goto __pyx_L2; - __pyx_L0:; - __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_y.rcbuffer->pybuffer); - __pyx_L2:; - __Pyx_XDECREF((PyObject *)__pyx_v_X_ndarray); - __Pyx_RefNannyFinishContext(); -} - -/* "sklearn/tree/_splitter.pyx":833 - * memset(sample_mask, 0, self.n_total_samples) - * - * cdef void node_split(self, double impurity, SplitRecord* split, # <<<<<<<<<<<<<< - * SIZE_t* n_constant_features) nogil: - * """Find the best split on node samples[start:end].""" - */ - -static void __pyx_f_7sklearn_4tree_9_splitter_19PresortBestSplitter_node_split(struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *__pyx_v_self, double __pyx_v_impurity, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *__pyx_v_split, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_n_constant_features) { - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_samples; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_start; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_end; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_features; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_constant_features; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_features; - __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *__pyx_v_X; - __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *__pyx_v_Xf; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_X_sample_stride; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_X_fx_stride; - __pyx_t_7sklearn_4tree_9_splitter_INT32_t *__pyx_v_X_argsorted; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_X_argsorted_stride; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_total_samples; - unsigned char *__pyx_v_sample_mask; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf; - double __pyx_v_min_weight_leaf; - __pyx_t_7sklearn_4tree_9_splitter_UINT32_t *__pyx_v_random_state; - struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord __pyx_v_best; - struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord __pyx_v_current; - double __pyx_v_current_proxy_improvement; - double __pyx_v_best_proxy_improvement; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_f_i; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_f_j; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_p; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_found_constants; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_drawn_constants; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_known_constants; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_total_constants; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_visited_features; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_partition_end; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_i; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_j; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_tmp; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_t_1; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_2; - __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *__pyx_t_3; - __pyx_t_7sklearn_4tree_9_splitter_INT32_t *__pyx_t_4; - unsigned char *__pyx_t_5; - double __pyx_t_6; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_7; - int __pyx_t_8; - int __pyx_t_9; - - /* "sklearn/tree/_splitter.pyx":837 - * """Find the best split on node samples[start:end].""" - * # Find the best split - * cdef SIZE_t* samples = self.samples # <<<<<<<<<<<<<< - * cdef SIZE_t start = self.start - * cdef SIZE_t end = self.end - */ - __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.samples; - __pyx_v_samples = __pyx_t_1; - - /* "sklearn/tree/_splitter.pyx":838 - * # Find the best split - * cdef SIZE_t* samples = self.samples - * cdef SIZE_t start = self.start # <<<<<<<<<<<<<< - * cdef SIZE_t end = self.end - * - */ - __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.start; - __pyx_v_start = __pyx_t_2; - - /* "sklearn/tree/_splitter.pyx":839 - * cdef SIZE_t* samples = self.samples - * cdef SIZE_t start = self.start - * cdef SIZE_t end = self.end # <<<<<<<<<<<<<< - * - * cdef SIZE_t* features = self.features - */ - __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.end; - __pyx_v_end = __pyx_t_2; - - /* "sklearn/tree/_splitter.pyx":841 - * cdef SIZE_t end = self.end - * - * cdef SIZE_t* features = self.features # <<<<<<<<<<<<<< - * cdef SIZE_t* constant_features = self.constant_features - * cdef SIZE_t n_features = self.n_features - */ - __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.features; - __pyx_v_features = __pyx_t_1; - - /* "sklearn/tree/_splitter.pyx":842 - * - * cdef SIZE_t* features = self.features - * cdef SIZE_t* constant_features = self.constant_features # <<<<<<<<<<<<<< - * cdef SIZE_t n_features = self.n_features - * - */ - __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.constant_features; - __pyx_v_constant_features = __pyx_t_1; - - /* "sklearn/tree/_splitter.pyx":843 - * cdef SIZE_t* features = self.features - * cdef SIZE_t* constant_features = self.constant_features - * cdef SIZE_t n_features = self.n_features # <<<<<<<<<<<<<< - * - * cdef DTYPE_t* X = self.X - */ - __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.n_features; - __pyx_v_n_features = __pyx_t_2; - - /* "sklearn/tree/_splitter.pyx":845 - * cdef SIZE_t n_features = self.n_features - * - * cdef DTYPE_t* X = self.X # <<<<<<<<<<<<<< - * cdef DTYPE_t* Xf = self.feature_values - * cdef SIZE_t X_sample_stride = self.X_sample_stride - */ - __pyx_t_3 = __pyx_v_self->__pyx_base.X; - __pyx_v_X = __pyx_t_3; - - /* "sklearn/tree/_splitter.pyx":846 - * - * cdef DTYPE_t* X = self.X - * cdef DTYPE_t* Xf = self.feature_values # <<<<<<<<<<<<<< - * cdef SIZE_t X_sample_stride = self.X_sample_stride - * cdef SIZE_t X_fx_stride = self.X_fx_stride - */ - __pyx_t_3 = __pyx_v_self->__pyx_base.__pyx_base.feature_values; - __pyx_v_Xf = __pyx_t_3; - - /* "sklearn/tree/_splitter.pyx":847 - * cdef DTYPE_t* X = self.X - * cdef DTYPE_t* Xf = self.feature_values - * cdef SIZE_t X_sample_stride = self.X_sample_stride # <<<<<<<<<<<<<< - * cdef SIZE_t X_fx_stride = self.X_fx_stride - * cdef INT32_t* X_argsorted = self.X_argsorted_ptr - */ - __pyx_t_2 = __pyx_v_self->__pyx_base.X_sample_stride; - __pyx_v_X_sample_stride = __pyx_t_2; - - /* "sklearn/tree/_splitter.pyx":848 - * cdef DTYPE_t* Xf = self.feature_values - * cdef SIZE_t X_sample_stride = self.X_sample_stride - * cdef SIZE_t X_fx_stride = self.X_fx_stride # <<<<<<<<<<<<<< - * cdef INT32_t* X_argsorted = self.X_argsorted_ptr - * cdef SIZE_t X_argsorted_stride = self.X_argsorted_stride - */ - __pyx_t_2 = __pyx_v_self->__pyx_base.X_fx_stride; - __pyx_v_X_fx_stride = __pyx_t_2; - - /* "sklearn/tree/_splitter.pyx":849 - * cdef SIZE_t X_sample_stride = self.X_sample_stride - * cdef SIZE_t X_fx_stride = self.X_fx_stride - * cdef INT32_t* X_argsorted = self.X_argsorted_ptr # <<<<<<<<<<<<<< - * cdef SIZE_t X_argsorted_stride = self.X_argsorted_stride - * cdef SIZE_t n_total_samples = self.n_total_samples - */ - __pyx_t_4 = __pyx_v_self->X_argsorted_ptr; - __pyx_v_X_argsorted = __pyx_t_4; - - /* "sklearn/tree/_splitter.pyx":850 - * cdef SIZE_t X_fx_stride = self.X_fx_stride - * cdef INT32_t* X_argsorted = self.X_argsorted_ptr - * cdef SIZE_t X_argsorted_stride = self.X_argsorted_stride # <<<<<<<<<<<<<< - * cdef SIZE_t n_total_samples = self.n_total_samples - * cdef unsigned char* sample_mask = self.sample_mask - */ - __pyx_t_2 = __pyx_v_self->X_argsorted_stride; - __pyx_v_X_argsorted_stride = __pyx_t_2; - - /* "sklearn/tree/_splitter.pyx":851 - * cdef INT32_t* X_argsorted = self.X_argsorted_ptr - * cdef SIZE_t X_argsorted_stride = self.X_argsorted_stride - * cdef SIZE_t n_total_samples = self.n_total_samples # <<<<<<<<<<<<<< - * cdef unsigned char* sample_mask = self.sample_mask - * - */ - __pyx_t_2 = __pyx_v_self->n_total_samples; - __pyx_v_n_total_samples = __pyx_t_2; - - /* "sklearn/tree/_splitter.pyx":852 - * cdef SIZE_t X_argsorted_stride = self.X_argsorted_stride - * cdef SIZE_t n_total_samples = self.n_total_samples - * cdef unsigned char* sample_mask = self.sample_mask # <<<<<<<<<<<<<< - * - * cdef SIZE_t max_features = self.max_features - */ - __pyx_t_5 = __pyx_v_self->sample_mask; - __pyx_v_sample_mask = __pyx_t_5; - - /* "sklearn/tree/_splitter.pyx":854 - * cdef unsigned char* sample_mask = self.sample_mask - * - * cdef SIZE_t max_features = self.max_features # <<<<<<<<<<<<<< - * cdef SIZE_t min_samples_leaf = self.min_samples_leaf - * cdef double min_weight_leaf = self.min_weight_leaf - */ - __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.max_features; - __pyx_v_max_features = __pyx_t_2; - - /* "sklearn/tree/_splitter.pyx":855 - * - * cdef SIZE_t max_features = self.max_features - * cdef SIZE_t min_samples_leaf = self.min_samples_leaf # <<<<<<<<<<<<<< - * cdef double min_weight_leaf = self.min_weight_leaf - * cdef UINT32_t* random_state = &self.rand_r_state - */ - __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf; - __pyx_v_min_samples_leaf = __pyx_t_2; - - /* "sklearn/tree/_splitter.pyx":856 - * cdef SIZE_t max_features = self.max_features - * cdef SIZE_t min_samples_leaf = self.min_samples_leaf - * cdef double min_weight_leaf = self.min_weight_leaf # <<<<<<<<<<<<<< - * cdef UINT32_t* random_state = &self.rand_r_state - * - */ - __pyx_t_6 = __pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf; - __pyx_v_min_weight_leaf = __pyx_t_6; - - /* "sklearn/tree/_splitter.pyx":857 - * cdef SIZE_t min_samples_leaf = self.min_samples_leaf - * cdef double min_weight_leaf = self.min_weight_leaf - * cdef UINT32_t* random_state = &self.rand_r_state # <<<<<<<<<<<<<< - * - * cdef SplitRecord best, current - */ - __pyx_v_random_state = (&__pyx_v_self->__pyx_base.__pyx_base.rand_r_state); - - /* "sklearn/tree/_splitter.pyx":860 - * - * cdef SplitRecord best, current - * cdef double current_proxy_improvement = - INFINITY # <<<<<<<<<<<<<< - * cdef double best_proxy_improvement = - INFINITY - * - */ - __pyx_v_current_proxy_improvement = (-__pyx_v_7sklearn_4tree_9_splitter_INFINITY); - - /* "sklearn/tree/_splitter.pyx":861 - * cdef SplitRecord best, current - * cdef double current_proxy_improvement = - INFINITY - * cdef double best_proxy_improvement = - INFINITY # <<<<<<<<<<<<<< - * - * cdef SIZE_t f_i = n_features - */ - __pyx_v_best_proxy_improvement = (-__pyx_v_7sklearn_4tree_9_splitter_INFINITY); - - /* "sklearn/tree/_splitter.pyx":863 - * cdef double best_proxy_improvement = - INFINITY - * - * cdef SIZE_t f_i = n_features # <<<<<<<<<<<<<< - * cdef SIZE_t f_j, p - * # Number of features discovered to be constant during the split search - */ - __pyx_v_f_i = __pyx_v_n_features; - - /* "sklearn/tree/_splitter.pyx":866 - * cdef SIZE_t f_j, p - * # Number of features discovered to be constant during the split search - * cdef SIZE_t n_found_constants = 0 # <<<<<<<<<<<<<< - * # Number of features known to be constant and drawn without replacement - * cdef SIZE_t n_drawn_constants = 0 - */ - __pyx_v_n_found_constants = 0; - - /* "sklearn/tree/_splitter.pyx":868 - * cdef SIZE_t n_found_constants = 0 - * # Number of features known to be constant and drawn without replacement - * cdef SIZE_t n_drawn_constants = 0 # <<<<<<<<<<<<<< - * cdef SIZE_t n_known_constants = n_constant_features[0] - * # n_total_constants = n_known_constants + n_found_constants - */ - __pyx_v_n_drawn_constants = 0; - - /* "sklearn/tree/_splitter.pyx":869 - * # Number of features known to be constant and drawn without replacement - * cdef SIZE_t n_drawn_constants = 0 - * cdef SIZE_t n_known_constants = n_constant_features[0] # <<<<<<<<<<<<<< - * # n_total_constants = n_known_constants + n_found_constants - * cdef SIZE_t n_total_constants = n_known_constants - */ - __pyx_v_n_known_constants = (__pyx_v_n_constant_features[0]); - - /* "sklearn/tree/_splitter.pyx":871 - * cdef SIZE_t n_known_constants = n_constant_features[0] - * # n_total_constants = n_known_constants + n_found_constants - * cdef SIZE_t n_total_constants = n_known_constants # <<<<<<<<<<<<<< - * cdef SIZE_t n_visited_features = 0 - * cdef SIZE_t partition_end - */ - __pyx_v_n_total_constants = __pyx_v_n_known_constants; - - /* "sklearn/tree/_splitter.pyx":872 - * # n_total_constants = n_known_constants + n_found_constants - * cdef SIZE_t n_total_constants = n_known_constants - * cdef SIZE_t n_visited_features = 0 # <<<<<<<<<<<<<< - * cdef SIZE_t partition_end - * cdef SIZE_t i, j - */ - __pyx_v_n_visited_features = 0; - - /* "sklearn/tree/_splitter.pyx":876 - * cdef SIZE_t i, j - * - * _init_split(&best, end) # <<<<<<<<<<<<<< - * - * # Set sample mask - */ - __pyx_f_7sklearn_4tree_9_splitter__init_split((&__pyx_v_best), __pyx_v_end); - - /* "sklearn/tree/_splitter.pyx":879 - * - * # Set sample mask - * for p in range(start, end): # <<<<<<<<<<<<<< - * sample_mask[samples[p]] = 1 - * - */ - __pyx_t_2 = __pyx_v_end; - for (__pyx_t_7 = __pyx_v_start; __pyx_t_7 < __pyx_t_2; __pyx_t_7+=1) { - __pyx_v_p = __pyx_t_7; - - /* "sklearn/tree/_splitter.pyx":880 - * # Set sample mask - * for p in range(start, end): - * sample_mask[samples[p]] = 1 # <<<<<<<<<<<<<< - * - * # Sample up to max_features without replacement using a - */ - (__pyx_v_sample_mask[(__pyx_v_samples[__pyx_v_p])]) = 1; - } - - /* "sklearn/tree/_splitter.pyx":891 - * # newly discovered constant features to spare computation on descendant - * # nodes. - * while (f_i > n_total_constants and # Stop early if remaining features # <<<<<<<<<<<<<< - * # are constant - * (n_visited_features < max_features or - */ - while (1) { - __pyx_t_9 = ((__pyx_v_f_i > __pyx_v_n_total_constants) != 0); - if (__pyx_t_9) { - } else { - __pyx_t_8 = __pyx_t_9; - goto __pyx_L7_bool_binop_done; - } - - /* "sklearn/tree/_splitter.pyx":893 - * while (f_i > n_total_constants and # Stop early if remaining features - * # are constant - * (n_visited_features < max_features or # <<<<<<<<<<<<<< - * # At least one drawn features must be non constant - * n_visited_features <= n_found_constants + n_drawn_constants)): - */ - __pyx_t_9 = ((__pyx_v_n_visited_features < __pyx_v_max_features) != 0); - if (!__pyx_t_9) { - } else { - __pyx_t_8 = __pyx_t_9; - goto __pyx_L7_bool_binop_done; - } - - /* "sklearn/tree/_splitter.pyx":895 - * (n_visited_features < max_features or - * # At least one drawn features must be non constant - * n_visited_features <= n_found_constants + n_drawn_constants)): # <<<<<<<<<<<<<< - * n_visited_features += 1 - * - */ - __pyx_t_9 = ((__pyx_v_n_visited_features <= (__pyx_v_n_found_constants + __pyx_v_n_drawn_constants)) != 0); - __pyx_t_8 = __pyx_t_9; - __pyx_L7_bool_binop_done:; - if (!__pyx_t_8) break; - - /* "sklearn/tree/_splitter.pyx":896 - * # At least one drawn features must be non constant - * n_visited_features <= n_found_constants + n_drawn_constants)): - * n_visited_features += 1 # <<<<<<<<<<<<<< - * - * # Loop invariant: elements of features in - */ - __pyx_v_n_visited_features = (__pyx_v_n_visited_features + 1); - - /* "sklearn/tree/_splitter.pyx":910 - * - * # Draw a feature at random - * f_j = rand_int(n_drawn_constants, f_i - n_found_constants, # <<<<<<<<<<<<<< - * random_state) - * - */ - __pyx_v_f_j = __pyx_f_7sklearn_4tree_6_utils_rand_int(__pyx_v_n_drawn_constants, (__pyx_v_f_i - __pyx_v_n_found_constants), __pyx_v_random_state); - - /* "sklearn/tree/_splitter.pyx":913 - * random_state) - * - * if f_j < n_known_constants: # <<<<<<<<<<<<<< - * # f_j is in [n_drawn_constants, n_known_constants[ - * tmp = features[f_j] - */ - __pyx_t_8 = ((__pyx_v_f_j < __pyx_v_n_known_constants) != 0); - if (__pyx_t_8) { - - /* "sklearn/tree/_splitter.pyx":915 - * if f_j < n_known_constants: - * # f_j is in [n_drawn_constants, n_known_constants[ - * tmp = features[f_j] # <<<<<<<<<<<<<< - * features[f_j] = features[n_drawn_constants] - * features[n_drawn_constants] = tmp - */ - __pyx_v_tmp = (__pyx_v_features[__pyx_v_f_j]); - - /* "sklearn/tree/_splitter.pyx":916 - * # f_j is in [n_drawn_constants, n_known_constants[ - * tmp = features[f_j] - * features[f_j] = features[n_drawn_constants] # <<<<<<<<<<<<<< - * features[n_drawn_constants] = tmp - * - */ - (__pyx_v_features[__pyx_v_f_j]) = (__pyx_v_features[__pyx_v_n_drawn_constants]); - - /* "sklearn/tree/_splitter.pyx":917 - * tmp = features[f_j] - * features[f_j] = features[n_drawn_constants] - * features[n_drawn_constants] = tmp # <<<<<<<<<<<<<< - * - * n_drawn_constants += 1 - */ - (__pyx_v_features[__pyx_v_n_drawn_constants]) = __pyx_v_tmp; - - /* "sklearn/tree/_splitter.pyx":919 - * features[n_drawn_constants] = tmp - * - * n_drawn_constants += 1 # <<<<<<<<<<<<<< - * - * else: - */ - __pyx_v_n_drawn_constants = (__pyx_v_n_drawn_constants + 1); - goto __pyx_L10; - } - /*else*/ { - - /* "sklearn/tree/_splitter.pyx":923 - * else: - * # f_j in the interval [n_known_constants, f_i - n_found_constants[ - * f_j += n_found_constants # <<<<<<<<<<<<<< - * # f_j in the interval [n_total_constants, f_i[ - * - */ - __pyx_v_f_j = (__pyx_v_f_j + __pyx_v_n_found_constants); - - /* "sklearn/tree/_splitter.pyx":926 - * # f_j in the interval [n_total_constants, f_i[ - * - * current.feature = features[f_j] # <<<<<<<<<<<<<< - * - * # Extract ordering from X_argsorted - */ - __pyx_v_current.feature = (__pyx_v_features[__pyx_v_f_j]); - - /* "sklearn/tree/_splitter.pyx":929 - * - * # Extract ordering from X_argsorted - * p = start # <<<<<<<<<<<<<< - * - * for i in range(n_total_samples): - */ - __pyx_v_p = __pyx_v_start; - - /* "sklearn/tree/_splitter.pyx":931 - * p = start - * - * for i in range(n_total_samples): # <<<<<<<<<<<<<< - * j = X_argsorted[X_argsorted_stride * current.feature + i] - * if sample_mask[j] == 1: - */ - __pyx_t_2 = __pyx_v_n_total_samples; - for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_2; __pyx_t_7+=1) { - __pyx_v_i = __pyx_t_7; - - /* "sklearn/tree/_splitter.pyx":932 - * - * for i in range(n_total_samples): - * j = X_argsorted[X_argsorted_stride * current.feature + i] # <<<<<<<<<<<<<< - * if sample_mask[j] == 1: - * samples[p] = j - */ - __pyx_v_j = (__pyx_v_X_argsorted[((__pyx_v_X_argsorted_stride * __pyx_v_current.feature) + __pyx_v_i)]); - - /* "sklearn/tree/_splitter.pyx":933 - * for i in range(n_total_samples): - * j = X_argsorted[X_argsorted_stride * current.feature + i] - * if sample_mask[j] == 1: # <<<<<<<<<<<<<< - * samples[p] = j - * Xf[p] = X[X_sample_stride * j + - */ - __pyx_t_8 = (((__pyx_v_sample_mask[__pyx_v_j]) == 1) != 0); - if (__pyx_t_8) { - - /* "sklearn/tree/_splitter.pyx":934 - * j = X_argsorted[X_argsorted_stride * current.feature + i] - * if sample_mask[j] == 1: - * samples[p] = j # <<<<<<<<<<<<<< - * Xf[p] = X[X_sample_stride * j + - * X_fx_stride * current.feature] - */ - (__pyx_v_samples[__pyx_v_p]) = __pyx_v_j; - - /* "sklearn/tree/_splitter.pyx":935 - * if sample_mask[j] == 1: - * samples[p] = j - * Xf[p] = X[X_sample_stride * j + # <<<<<<<<<<<<<< - * X_fx_stride * current.feature] - * p += 1 - */ - (__pyx_v_Xf[__pyx_v_p]) = (__pyx_v_X[((__pyx_v_X_sample_stride * __pyx_v_j) + (__pyx_v_X_fx_stride * __pyx_v_current.feature))]); - - /* "sklearn/tree/_splitter.pyx":937 - * Xf[p] = X[X_sample_stride * j + - * X_fx_stride * current.feature] - * p += 1 # <<<<<<<<<<<<<< - * - * # Evaluate all splits - */ - __pyx_v_p = (__pyx_v_p + 1); - goto __pyx_L13; - } - __pyx_L13:; - } - - /* "sklearn/tree/_splitter.pyx":940 - * - * # Evaluate all splits - * if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: # <<<<<<<<<<<<<< - * features[f_j] = features[n_total_constants] - * features[n_total_constants] = current.feature - */ - __pyx_t_8 = (((__pyx_v_Xf[(__pyx_v_end - 1)]) <= ((__pyx_v_Xf[__pyx_v_start]) + __pyx_v_7sklearn_4tree_9_splitter_FEATURE_THRESHOLD)) != 0); - if (__pyx_t_8) { - - /* "sklearn/tree/_splitter.pyx":941 - * # Evaluate all splits - * if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: - * features[f_j] = features[n_total_constants] # <<<<<<<<<<<<<< - * features[n_total_constants] = current.feature - * - */ - (__pyx_v_features[__pyx_v_f_j]) = (__pyx_v_features[__pyx_v_n_total_constants]); - - /* "sklearn/tree/_splitter.pyx":942 - * if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: - * features[f_j] = features[n_total_constants] - * features[n_total_constants] = current.feature # <<<<<<<<<<<<<< - * - * n_found_constants += 1 - */ - __pyx_t_2 = __pyx_v_current.feature; - (__pyx_v_features[__pyx_v_n_total_constants]) = __pyx_t_2; - - /* "sklearn/tree/_splitter.pyx":944 - * features[n_total_constants] = current.feature - * - * n_found_constants += 1 # <<<<<<<<<<<<<< - * n_total_constants += 1 - * - */ - __pyx_v_n_found_constants = (__pyx_v_n_found_constants + 1); - - /* "sklearn/tree/_splitter.pyx":945 - * - * n_found_constants += 1 - * n_total_constants += 1 # <<<<<<<<<<<<<< - * - * else: - */ - __pyx_v_n_total_constants = (__pyx_v_n_total_constants + 1); - goto __pyx_L14; - } - /*else*/ { - - /* "sklearn/tree/_splitter.pyx":948 - * - * else: - * f_i -= 1 # <<<<<<<<<<<<<< - * features[f_i], features[f_j] = features[f_j], features[f_i] - * - */ - __pyx_v_f_i = (__pyx_v_f_i - 1); - - /* "sklearn/tree/_splitter.pyx":949 - * else: - * f_i -= 1 - * features[f_i], features[f_j] = features[f_j], features[f_i] # <<<<<<<<<<<<<< - * - * self.criterion.reset() - */ - __pyx_t_2 = (__pyx_v_features[__pyx_v_f_j]); - __pyx_t_7 = (__pyx_v_features[__pyx_v_f_i]); - (__pyx_v_features[__pyx_v_f_i]) = __pyx_t_2; - (__pyx_v_features[__pyx_v_f_j]) = __pyx_t_7; - - /* "sklearn/tree/_splitter.pyx":951 - * features[f_i], features[f_j] = features[f_j], features[f_i] - * - * self.criterion.reset() # <<<<<<<<<<<<<< - * p = start - * - */ - ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->reset(__pyx_v_self->__pyx_base.__pyx_base.criterion); - - /* "sklearn/tree/_splitter.pyx":952 - * - * self.criterion.reset() - * p = start # <<<<<<<<<<<<<< - * - * while p < end: - */ - __pyx_v_p = __pyx_v_start; - - /* "sklearn/tree/_splitter.pyx":954 - * p = start - * - * while p < end: # <<<<<<<<<<<<<< - * while (p + 1 < end and - * Xf[p + 1] <= Xf[p] + FEATURE_THRESHOLD): - */ - while (1) { - __pyx_t_8 = ((__pyx_v_p < __pyx_v_end) != 0); - if (!__pyx_t_8) break; - - /* "sklearn/tree/_splitter.pyx":955 - * - * while p < end: - * while (p + 1 < end and # <<<<<<<<<<<<<< - * Xf[p + 1] <= Xf[p] + FEATURE_THRESHOLD): - * p += 1 - */ - while (1) { - __pyx_t_9 = (((__pyx_v_p + 1) < __pyx_v_end) != 0); - if (__pyx_t_9) { - } else { - __pyx_t_8 = __pyx_t_9; - goto __pyx_L19_bool_binop_done; - } - - /* "sklearn/tree/_splitter.pyx":956 - * while p < end: - * while (p + 1 < end and - * Xf[p + 1] <= Xf[p] + FEATURE_THRESHOLD): # <<<<<<<<<<<<<< - * p += 1 - * - */ - __pyx_t_9 = (((__pyx_v_Xf[(__pyx_v_p + 1)]) <= ((__pyx_v_Xf[__pyx_v_p]) + __pyx_v_7sklearn_4tree_9_splitter_FEATURE_THRESHOLD)) != 0); - __pyx_t_8 = __pyx_t_9; - __pyx_L19_bool_binop_done:; - if (!__pyx_t_8) break; - - /* "sklearn/tree/_splitter.pyx":957 - * while (p + 1 < end and - * Xf[p + 1] <= Xf[p] + FEATURE_THRESHOLD): - * p += 1 # <<<<<<<<<<<<<< - * - * # (p + 1 >= end) or (X[samples[p + 1], current.feature] > - */ - __pyx_v_p = (__pyx_v_p + 1); - } - - /* "sklearn/tree/_splitter.pyx":961 - * # (p + 1 >= end) or (X[samples[p + 1], current.feature] > - * # X[samples[p], current.feature]) - * p += 1 # <<<<<<<<<<<<<< - * # (p >= end) or (X[samples[p], current.feature] > - * # X[samples[p - 1], current.feature]) - */ - __pyx_v_p = (__pyx_v_p + 1); - - /* "sklearn/tree/_splitter.pyx":965 - * # X[samples[p - 1], current.feature]) - * - * if p < end: # <<<<<<<<<<<<<< - * current.pos = p - * - */ - __pyx_t_8 = ((__pyx_v_p < __pyx_v_end) != 0); - if (__pyx_t_8) { - - /* "sklearn/tree/_splitter.pyx":966 - * - * if p < end: - * current.pos = p # <<<<<<<<<<<<<< - * - * # Reject if min_samples_leaf is not guaranteed - */ - __pyx_v_current.pos = __pyx_v_p; - - /* "sklearn/tree/_splitter.pyx":969 - * - * # Reject if min_samples_leaf is not guaranteed - * if (((current.pos - start) < min_samples_leaf) or # <<<<<<<<<<<<<< - * ((end - current.pos) < min_samples_leaf)): - * continue - */ - __pyx_t_9 = (((__pyx_v_current.pos - __pyx_v_start) < __pyx_v_min_samples_leaf) != 0); - if (!__pyx_t_9) { - } else { - __pyx_t_8 = __pyx_t_9; - goto __pyx_L23_bool_binop_done; - } - - /* "sklearn/tree/_splitter.pyx":970 - * # Reject if min_samples_leaf is not guaranteed - * if (((current.pos - start) < min_samples_leaf) or - * ((end - current.pos) < min_samples_leaf)): # <<<<<<<<<<<<<< - * continue - * - */ - __pyx_t_9 = (((__pyx_v_end - __pyx_v_current.pos) < __pyx_v_min_samples_leaf) != 0); - __pyx_t_8 = __pyx_t_9; - __pyx_L23_bool_binop_done:; - if (__pyx_t_8) { - - /* "sklearn/tree/_splitter.pyx":971 - * if (((current.pos - start) < min_samples_leaf) or - * ((end - current.pos) < min_samples_leaf)): - * continue # <<<<<<<<<<<<<< - * - * self.criterion.update(current.pos) - */ - goto __pyx_L15_continue; - } - - /* "sklearn/tree/_splitter.pyx":973 - * continue - * - * self.criterion.update(current.pos) # <<<<<<<<<<<<<< - * - * # Reject if min_weight_leaf is not satisfied - */ - ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->update(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_current.pos); - - /* "sklearn/tree/_splitter.pyx":976 - * - * # Reject if min_weight_leaf is not satisfied - * if ((self.criterion.weighted_n_left < min_weight_leaf) or # <<<<<<<<<<<<<< - * (self.criterion.weighted_n_right < min_weight_leaf)): - * continue - */ - __pyx_t_9 = ((__pyx_v_self->__pyx_base.__pyx_base.criterion->weighted_n_left < __pyx_v_min_weight_leaf) != 0); - if (!__pyx_t_9) { - } else { - __pyx_t_8 = __pyx_t_9; - goto __pyx_L26_bool_binop_done; - } - - /* "sklearn/tree/_splitter.pyx":977 - * # Reject if min_weight_leaf is not satisfied - * if ((self.criterion.weighted_n_left < min_weight_leaf) or - * (self.criterion.weighted_n_right < min_weight_leaf)): # <<<<<<<<<<<<<< - * continue - * - */ - __pyx_t_9 = ((__pyx_v_self->__pyx_base.__pyx_base.criterion->weighted_n_right < __pyx_v_min_weight_leaf) != 0); - __pyx_t_8 = __pyx_t_9; - __pyx_L26_bool_binop_done:; - if (__pyx_t_8) { - - /* "sklearn/tree/_splitter.pyx":978 - * if ((self.criterion.weighted_n_left < min_weight_leaf) or - * (self.criterion.weighted_n_right < min_weight_leaf)): - * continue # <<<<<<<<<<<<<< - * - * current_proxy_improvement = self.criterion.proxy_impurity_improvement() - */ - goto __pyx_L15_continue; - } - - /* "sklearn/tree/_splitter.pyx":980 - * continue - * - * current_proxy_improvement = self.criterion.proxy_impurity_improvement() # <<<<<<<<<<<<<< - * - * if current_proxy_improvement > best_proxy_improvement: - */ - __pyx_v_current_proxy_improvement = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->proxy_impurity_improvement(__pyx_v_self->__pyx_base.__pyx_base.criterion); - - /* "sklearn/tree/_splitter.pyx":982 - * current_proxy_improvement = self.criterion.proxy_impurity_improvement() - * - * if current_proxy_improvement > best_proxy_improvement: # <<<<<<<<<<<<<< - * best_proxy_improvement = current_proxy_improvement - * - */ - __pyx_t_8 = ((__pyx_v_current_proxy_improvement > __pyx_v_best_proxy_improvement) != 0); - if (__pyx_t_8) { - - /* "sklearn/tree/_splitter.pyx":983 - * - * if current_proxy_improvement > best_proxy_improvement: - * best_proxy_improvement = current_proxy_improvement # <<<<<<<<<<<<<< - * - * current.threshold = (Xf[p - 1] + Xf[p]) / 2.0 - */ - __pyx_v_best_proxy_improvement = __pyx_v_current_proxy_improvement; - - /* "sklearn/tree/_splitter.pyx":985 - * best_proxy_improvement = current_proxy_improvement - * - * current.threshold = (Xf[p - 1] + Xf[p]) / 2.0 # <<<<<<<<<<<<<< - * if current.threshold == Xf[p]: - * current.threshold = Xf[p - 1] - */ - __pyx_v_current.threshold = (((__pyx_v_Xf[(__pyx_v_p - 1)]) + (__pyx_v_Xf[__pyx_v_p])) / 2.0); - - /* "sklearn/tree/_splitter.pyx":986 - * - * current.threshold = (Xf[p - 1] + Xf[p]) / 2.0 - * if current.threshold == Xf[p]: # <<<<<<<<<<<<<< - * current.threshold = Xf[p - 1] - * - */ - __pyx_t_8 = ((__pyx_v_current.threshold == (__pyx_v_Xf[__pyx_v_p])) != 0); - if (__pyx_t_8) { - - /* "sklearn/tree/_splitter.pyx":987 - * current.threshold = (Xf[p - 1] + Xf[p]) / 2.0 - * if current.threshold == Xf[p]: - * current.threshold = Xf[p - 1] # <<<<<<<<<<<<<< - * - * best = current # copy - */ - __pyx_v_current.threshold = (__pyx_v_Xf[(__pyx_v_p - 1)]); - goto __pyx_L29; - } - __pyx_L29:; - - /* "sklearn/tree/_splitter.pyx":989 - * current.threshold = Xf[p - 1] - * - * best = current # copy # <<<<<<<<<<<<<< - * - * # Reorganize into samples[start:best.pos] + samples[best.pos:end] - */ - __pyx_v_best = __pyx_v_current; - goto __pyx_L28; - } - __pyx_L28:; - goto __pyx_L21; - } - __pyx_L21:; - __pyx_L15_continue:; - } - } - __pyx_L14:; - } - __pyx_L10:; - } - - /* "sklearn/tree/_splitter.pyx":992 - * - * # Reorganize into samples[start:best.pos] + samples[best.pos:end] - * if best.pos < end: # <<<<<<<<<<<<<< - * partition_end = end - * p = start - */ - __pyx_t_8 = ((__pyx_v_best.pos < __pyx_v_end) != 0); - if (__pyx_t_8) { - - /* "sklearn/tree/_splitter.pyx":993 - * # Reorganize into samples[start:best.pos] + samples[best.pos:end] - * if best.pos < end: - * partition_end = end # <<<<<<<<<<<<<< - * p = start - * - */ - __pyx_v_partition_end = __pyx_v_end; - - /* "sklearn/tree/_splitter.pyx":994 - * if best.pos < end: - * partition_end = end - * p = start # <<<<<<<<<<<<<< - * - * while p < partition_end: - */ - __pyx_v_p = __pyx_v_start; - - /* "sklearn/tree/_splitter.pyx":996 - * p = start - * - * while p < partition_end: # <<<<<<<<<<<<<< - * if X[X_sample_stride * samples[p] + - * X_fx_stride * best.feature] <= best.threshold: - */ - while (1) { - __pyx_t_8 = ((__pyx_v_p < __pyx_v_partition_end) != 0); - if (!__pyx_t_8) break; - - /* "sklearn/tree/_splitter.pyx":998 - * while p < partition_end: - * if X[X_sample_stride * samples[p] + - * X_fx_stride * best.feature] <= best.threshold: # <<<<<<<<<<<<<< - * p += 1 - * - */ - __pyx_t_8 = (((__pyx_v_X[((__pyx_v_X_sample_stride * (__pyx_v_samples[__pyx_v_p])) + (__pyx_v_X_fx_stride * __pyx_v_best.feature))]) <= __pyx_v_best.threshold) != 0); - if (__pyx_t_8) { - - /* "sklearn/tree/_splitter.pyx":999 - * if X[X_sample_stride * samples[p] + - * X_fx_stride * best.feature] <= best.threshold: - * p += 1 # <<<<<<<<<<<<<< - * - * else: - */ - __pyx_v_p = (__pyx_v_p + 1); - goto __pyx_L33; - } - /*else*/ { - - /* "sklearn/tree/_splitter.pyx":1002 - * - * else: - * partition_end -= 1 # <<<<<<<<<<<<<< - * - * tmp = samples[partition_end] - */ - __pyx_v_partition_end = (__pyx_v_partition_end - 1); - - /* "sklearn/tree/_splitter.pyx":1004 - * partition_end -= 1 - * - * tmp = samples[partition_end] # <<<<<<<<<<<<<< - * samples[partition_end] = samples[p] - * samples[p] = tmp - */ - __pyx_v_tmp = (__pyx_v_samples[__pyx_v_partition_end]); - - /* "sklearn/tree/_splitter.pyx":1005 - * - * tmp = samples[partition_end] - * samples[partition_end] = samples[p] # <<<<<<<<<<<<<< - * samples[p] = tmp - * - */ - (__pyx_v_samples[__pyx_v_partition_end]) = (__pyx_v_samples[__pyx_v_p]); - - /* "sklearn/tree/_splitter.pyx":1006 - * tmp = samples[partition_end] - * samples[partition_end] = samples[p] - * samples[p] = tmp # <<<<<<<<<<<<<< - * - * self.criterion.reset() - */ - (__pyx_v_samples[__pyx_v_p]) = __pyx_v_tmp; - } - __pyx_L33:; - } - - /* "sklearn/tree/_splitter.pyx":1008 - * samples[p] = tmp - * - * self.criterion.reset() # <<<<<<<<<<<<<< - * self.criterion.update(best.pos) - * best.improvement = self.criterion.impurity_improvement(impurity) - */ - ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->reset(__pyx_v_self->__pyx_base.__pyx_base.criterion); - - /* "sklearn/tree/_splitter.pyx":1009 - * - * self.criterion.reset() - * self.criterion.update(best.pos) # <<<<<<<<<<<<<< - * best.improvement = self.criterion.impurity_improvement(impurity) - * self.criterion.children_impurity(&best.impurity_left, - */ - ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->update(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_best.pos); - - /* "sklearn/tree/_splitter.pyx":1010 - * self.criterion.reset() - * self.criterion.update(best.pos) - * best.improvement = self.criterion.impurity_improvement(impurity) # <<<<<<<<<<<<<< - * self.criterion.children_impurity(&best.impurity_left, - * &best.impurity_right) - */ - __pyx_v_best.improvement = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->impurity_improvement(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_impurity); - - /* "sklearn/tree/_splitter.pyx":1011 - * self.criterion.update(best.pos) - * best.improvement = self.criterion.impurity_improvement(impurity) - * self.criterion.children_impurity(&best.impurity_left, # <<<<<<<<<<<<<< - * &best.impurity_right) - * - */ - ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->children_impurity(__pyx_v_self->__pyx_base.__pyx_base.criterion, (&__pyx_v_best.impurity_left), (&__pyx_v_best.impurity_right)); - goto __pyx_L30; - } - __pyx_L30:; - - /* "sklearn/tree/_splitter.pyx":1015 - * - * # Reset sample mask - * for p in range(start, end): # <<<<<<<<<<<<<< - * sample_mask[samples[p]] = 0 - * - */ - __pyx_t_7 = __pyx_v_end; - for (__pyx_t_2 = __pyx_v_start; __pyx_t_2 < __pyx_t_7; __pyx_t_2+=1) { - __pyx_v_p = __pyx_t_2; - - /* "sklearn/tree/_splitter.pyx":1016 - * # Reset sample mask - * for p in range(start, end): - * sample_mask[samples[p]] = 0 # <<<<<<<<<<<<<< - * - * # Respect invariant for constant features: the original order of - */ - (__pyx_v_sample_mask[(__pyx_v_samples[__pyx_v_p])]) = 0; - } - - /* "sklearn/tree/_splitter.pyx":1021 - * # element in features[:n_known_constants] must be preserved for sibling - * # and child nodes - * memcpy(features, constant_features, sizeof(SIZE_t) * n_known_constants) # <<<<<<<<<<<<<< - * - * # Copy newly found constant features - */ - memcpy(__pyx_v_features, __pyx_v_constant_features, ((sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)) * __pyx_v_n_known_constants)); - - /* "sklearn/tree/_splitter.pyx":1024 - * - * # Copy newly found constant features - * memcpy(constant_features + n_known_constants, # <<<<<<<<<<<<<< - * features + n_known_constants, - * sizeof(SIZE_t) * n_found_constants) - */ - memcpy((__pyx_v_constant_features + __pyx_v_n_known_constants), (__pyx_v_features + __pyx_v_n_known_constants), ((sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)) * __pyx_v_n_found_constants)); - - /* "sklearn/tree/_splitter.pyx":1029 - * - * # Return values - * split[0] = best # <<<<<<<<<<<<<< - * n_constant_features[0] = n_total_constants - * - */ - (__pyx_v_split[0]) = __pyx_v_best; - - /* "sklearn/tree/_splitter.pyx":1030 - * # Return values - * split[0] = best - * n_constant_features[0] = n_total_constants # <<<<<<<<<<<<<< - * - * cdef class BaseSparseSplitter(Splitter): - */ - (__pyx_v_n_constant_features[0]) = __pyx_v_n_total_constants; - - /* "sklearn/tree/_splitter.pyx":833 - * memset(sample_mask, 0, self.n_total_samples) - * - * cdef void node_split(self, double impurity, SplitRecord* split, # <<<<<<<<<<<<<< - * SIZE_t* n_constant_features) nogil: - * """Find the best split on node samples[start:end].""" - */ - - /* function exit code */ -} - -/* "sklearn/tree/_splitter.pyx":1043 - * cdef SIZE_t* sorted_samples - * - * def __cinit__(self, Criterion criterion, SIZE_t max_features, # <<<<<<<<<<<<<< - * SIZE_t min_samples_leaf, double min_weight_leaf, - * object random_state): - */ - -/* Python wrapper */ -static int __pyx_pw_7sklearn_4tree_9_splitter_18BaseSparseSplitter_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7sklearn_4tree_9_splitter_18BaseSparseSplitter_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion = 0; - CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features; - CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf; - CYTHON_UNUSED double __pyx_v_min_weight_leaf; - CYTHON_UNUSED PyObject *__pyx_v_random_state = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_criterion,&__pyx_n_s_max_features,&__pyx_n_s_min_samples_leaf,&__pyx_n_s_min_weight_leaf,&__pyx_n_s_random_state,0}; - PyObject* values[5] = {0,0,0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_criterion)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - case 1: - if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_max_features)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - case 2: - if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_samples_leaf)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - case 3: - if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_weight_leaf)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - case 4: - if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_random_state)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - } - __pyx_v_criterion = ((struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *)values[0]); - __pyx_v_max_features = __Pyx_PyInt_As_Py_intptr_t(values[1]); if (unlikely((__pyx_v_max_features == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_samples_leaf = __Pyx_PyInt_As_Py_intptr_t(values[2]); if (unlikely((__pyx_v_min_samples_leaf == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1044; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_weight_leaf = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_min_weight_leaf == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1044; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_random_state = values[4]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_L3_error:; - __Pyx_AddTraceback("sklearn.tree._splitter.BaseSparseSplitter.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_10_criterion_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_r = __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter___cinit__(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *)__pyx_v_self), __pyx_v_criterion, __pyx_v_max_features, __pyx_v_min_samples_leaf, __pyx_v_min_weight_leaf, __pyx_v_random_state); - - /* function exit code */ - goto __pyx_L0; - __pyx_L1_error:; - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter___cinit__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self, CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_10_criterion_Criterion *__pyx_v_criterion, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_max_features, CYTHON_UNUSED __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_min_samples_leaf, CYTHON_UNUSED double __pyx_v_min_weight_leaf, CYTHON_UNUSED PyObject *__pyx_v_random_state) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__cinit__", 0); - - /* "sklearn/tree/_splitter.pyx":1048 - * # Parent __cinit__ is automatically called - * - * self.X_data = NULL # <<<<<<<<<<<<<< - * self.X_indices = NULL - * self.X_indptr = NULL - */ - __pyx_v_self->X_data = NULL; - - /* "sklearn/tree/_splitter.pyx":1049 - * - * self.X_data = NULL - * self.X_indices = NULL # <<<<<<<<<<<<<< - * self.X_indptr = NULL - * - */ - __pyx_v_self->X_indices = NULL; - - /* "sklearn/tree/_splitter.pyx":1050 - * self.X_data = NULL - * self.X_indices = NULL - * self.X_indptr = NULL # <<<<<<<<<<<<<< - * - * self.n_total_samples = 0 - */ - __pyx_v_self->X_indptr = NULL; - - /* "sklearn/tree/_splitter.pyx":1052 - * self.X_indptr = NULL - * - * self.n_total_samples = 0 # <<<<<<<<<<<<<< - * - * self.index_to_samples = NULL - */ - __pyx_v_self->n_total_samples = 0; - - /* "sklearn/tree/_splitter.pyx":1054 - * self.n_total_samples = 0 - * - * self.index_to_samples = NULL # <<<<<<<<<<<<<< - * self.sorted_samples = NULL - * - */ - __pyx_v_self->index_to_samples = NULL; - - /* "sklearn/tree/_splitter.pyx":1055 - * - * self.index_to_samples = NULL - * self.sorted_samples = NULL # <<<<<<<<<<<<<< - * - * def __dealloc__(self): - */ - __pyx_v_self->sorted_samples = NULL; - - /* "sklearn/tree/_splitter.pyx":1043 - * cdef SIZE_t* sorted_samples - * - * def __cinit__(self, Criterion criterion, SIZE_t max_features, # <<<<<<<<<<<<<< - * SIZE_t min_samples_leaf, double min_weight_leaf, - * object random_state): - */ - - /* function exit code */ - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "sklearn/tree/_splitter.pyx":1057 - * self.sorted_samples = NULL - * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * """Deallocate memory.""" - * free(self.index_to_samples) - */ - -/* Python wrapper */ -static void __pyx_pw_7sklearn_4tree_9_splitter_18BaseSparseSplitter_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_pw_7sklearn_4tree_9_splitter_18BaseSparseSplitter_3__dealloc__(PyObject *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter_2__dealloc__(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -static void __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter_2__dealloc__(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__", 0); - - /* "sklearn/tree/_splitter.pyx":1059 - * def __dealloc__(self): - * """Deallocate memory.""" - * free(self.index_to_samples) # <<<<<<<<<<<<<< - * free(self.sorted_samples) - * - */ - free(__pyx_v_self->index_to_samples); - - /* "sklearn/tree/_splitter.pyx":1060 + /* "sklearn/tree/_splitter.pyx":866 * """Deallocate memory.""" * free(self.index_to_samples) * free(self.sorted_samples) # <<<<<<<<<<<<<< @@ -8541,7 +7342,7 @@ static void __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter_2__dealloc__ */ free(__pyx_v_self->sorted_samples); - /* "sklearn/tree/_splitter.pyx":1057 + /* "sklearn/tree/_splitter.pyx":863 * self.sorted_samples = NULL * * def __dealloc__(self): # <<<<<<<<<<<<<< @@ -8553,7 +7354,7 @@ static void __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter_2__dealloc__ __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_splitter.pyx":1062 +/* "sklearn/tree/_splitter.pyx":868 * free(self.sorted_samples) * * cdef void init(self, # <<<<<<<<<<<<<< @@ -8561,7 +7362,7 @@ static void __pyx_pf_7sklearn_4tree_9_splitter_18BaseSparseSplitter_2__dealloc__ * np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, */ -static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight) { +static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *__pyx_v_self, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *__pyx_v_sample_weight, struct __pyx_opt_args_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init *__pyx_optional_args) { __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *__pyx_v_samples; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_samples; PyArrayObject *__pyx_v_data = 0; @@ -8593,6 +7394,8 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("init", 0); + if (__pyx_optional_args) { + } __pyx_pybuffer_data.pybuffer.buf = NULL; __pyx_pybuffer_data.refcount = 0; __pyx_pybuffernd_data.data = NULL; @@ -8611,48 +7414,48 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ __pyx_pybuffernd_y.rcbuffer = &__pyx_pybuffer_y; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1062; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_y.rcbuffer->pybuffer, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_y.diminfo[0].strides = __pyx_pybuffernd_y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_y.diminfo[0].shape = __pyx_pybuffernd_y.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_y.diminfo[1].strides = __pyx_pybuffernd_y.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_y.diminfo[1].shape = __pyx_pybuffernd_y.rcbuffer->pybuffer.shape[1]; - /* "sklearn/tree/_splitter.pyx":1069 + /* "sklearn/tree/_splitter.pyx":876 * * # Call parent init * Splitter.init(self, X, y, sample_weight) # <<<<<<<<<<<<<< * * if not isinstance(X, csc_matrix): */ - __pyx_f_7sklearn_4tree_9_splitter_8Splitter_init(((struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_self), __pyx_v_X, ((PyArrayObject *)__pyx_v_y), __pyx_v_sample_weight); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_vtabptr_7sklearn_4tree_9_splitter_Splitter->init(((struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_self), __pyx_v_X, ((PyArrayObject *)__pyx_v_y), __pyx_v_sample_weight, NULL); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_splitter.pyx":1071 + /* "sklearn/tree/_splitter.pyx":878 * Splitter.init(self, X, y, sample_weight) * * if not isinstance(X, csc_matrix): # <<<<<<<<<<<<<< * raise ValueError("X should be in csc format") * */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_csc_matrix); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_csc_matrix); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_IsInstance(__pyx_v_X, __pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyObject_IsInstance(__pyx_v_X, __pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_3 = ((!(__pyx_t_2 != 0)) != 0); if (__pyx_t_3) { - /* "sklearn/tree/_splitter.pyx":1072 + /* "sklearn/tree/_splitter.pyx":879 * * if not isinstance(X, csc_matrix): * raise ValueError("X should be in csc format") # <<<<<<<<<<<<<< * * cdef SIZE_t* samples = self.samples */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_splitter.pyx":1074 + /* "sklearn/tree/_splitter.pyx":881 * raise ValueError("X should be in csc format") * * cdef SIZE_t* samples = self.samples # <<<<<<<<<<<<<< @@ -8662,7 +7465,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ __pyx_t_4 = __pyx_v_self->__pyx_base.samples; __pyx_v_samples = __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":1075 + /* "sklearn/tree/_splitter.pyx":882 * * cdef SIZE_t* samples = self.samples * cdef SIZE_t n_samples = self.n_samples # <<<<<<<<<<<<<< @@ -8672,22 +7475,22 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ __pyx_t_5 = __pyx_v_self->__pyx_base.n_samples; __pyx_v_n_samples = __pyx_t_5; - /* "sklearn/tree/_splitter.pyx":1078 + /* "sklearn/tree/_splitter.pyx":885 * * # Initialize X * cdef np.ndarray[dtype=DTYPE_t, ndim=1] data = X.data # <<<<<<<<<<<<<< * cdef np.ndarray[dtype=INT32_t, ndim=1] indices = X.indices * cdef np.ndarray[dtype=INT32_t, ndim=1] indptr = X.indptr */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_6 = ((PyArrayObject *)__pyx_t_1); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_data.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_9_splitter_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_data = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_data.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_data.diminfo[0].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_data.diminfo[0].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[0]; } } @@ -8695,22 +7498,22 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ __pyx_v_data = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_splitter.pyx":1079 + /* "sklearn/tree/_splitter.pyx":886 * # Initialize X * cdef np.ndarray[dtype=DTYPE_t, ndim=1] data = X.data * cdef np.ndarray[dtype=INT32_t, ndim=1] indices = X.indices # <<<<<<<<<<<<<< * cdef np.ndarray[dtype=INT32_t, ndim=1] indptr = X.indptr * cdef SIZE_t n_total_samples = X.shape[0] */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indices); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1079; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indices); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1079; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = ((PyArrayObject *)__pyx_t_1); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_indices.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_9_splitter_INT32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_indices = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_indices.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1079; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_indices.diminfo[0].strides = __pyx_pybuffernd_indices.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_indices.diminfo[0].shape = __pyx_pybuffernd_indices.rcbuffer->pybuffer.shape[0]; } } @@ -8718,22 +7521,22 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ __pyx_v_indices = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_splitter.pyx":1080 + /* "sklearn/tree/_splitter.pyx":887 * cdef np.ndarray[dtype=DTYPE_t, ndim=1] data = X.data * cdef np.ndarray[dtype=INT32_t, ndim=1] indices = X.indices * cdef np.ndarray[dtype=INT32_t, ndim=1] indptr = X.indptr # <<<<<<<<<<<<<< * cdef SIZE_t n_total_samples = X.shape[0] * */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indptr); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indptr); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_8 = ((PyArrayObject *)__pyx_t_1); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_indptr.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_9_splitter_INT32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_indptr = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_indptr.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_indptr.diminfo[0].strides = __pyx_pybuffernd_indptr.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_indptr.diminfo[0].shape = __pyx_pybuffernd_indptr.rcbuffer->pybuffer.shape[0]; } } @@ -8741,23 +7544,23 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ __pyx_v_indptr = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_splitter.pyx":1081 + /* "sklearn/tree/_splitter.pyx":888 * cdef np.ndarray[dtype=INT32_t, ndim=1] indices = X.indices * cdef np.ndarray[dtype=INT32_t, ndim=1] indptr = X.indptr * cdef SIZE_t n_total_samples = X.shape[0] # <<<<<<<<<<<<<< * * self.X_data = data.data */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1081; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_5 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_9); if (unlikely((__pyx_t_5 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1081; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_9); if (unlikely((__pyx_t_5 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_v_n_total_samples = __pyx_t_5; - /* "sklearn/tree/_splitter.pyx":1083 + /* "sklearn/tree/_splitter.pyx":890 * cdef SIZE_t n_total_samples = X.shape[0] * * self.X_data = data.data # <<<<<<<<<<<<<< @@ -8766,7 +7569,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ */ __pyx_v_self->X_data = ((__pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *)__pyx_v_data->data); - /* "sklearn/tree/_splitter.pyx":1084 + /* "sklearn/tree/_splitter.pyx":891 * * self.X_data = data.data * self.X_indices = indices.data # <<<<<<<<<<<<<< @@ -8775,7 +7578,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ */ __pyx_v_self->X_indices = ((__pyx_t_7sklearn_4tree_9_splitter_INT32_t *)__pyx_v_indices->data); - /* "sklearn/tree/_splitter.pyx":1085 + /* "sklearn/tree/_splitter.pyx":892 * self.X_data = data.data * self.X_indices = indices.data * self.X_indptr = indptr.data # <<<<<<<<<<<<<< @@ -8784,7 +7587,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ */ __pyx_v_self->X_indptr = ((__pyx_t_7sklearn_4tree_9_splitter_INT32_t *)__pyx_v_indptr->data); - /* "sklearn/tree/_splitter.pyx":1086 + /* "sklearn/tree/_splitter.pyx":893 * self.X_indices = indices.data * self.X_indptr = indptr.data * self.n_total_samples = n_total_samples # <<<<<<<<<<<<<< @@ -8793,26 +7596,26 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ */ __pyx_v_self->n_total_samples = __pyx_v_n_total_samples; - /* "sklearn/tree/_splitter.pyx":1089 + /* "sklearn/tree/_splitter.pyx":896 * * # Initialize auxiliary array used to perform split - * safe_realloc(&self.index_to_samples, n_total_samples * sizeof(SIZE_t)) # <<<<<<<<<<<<<< - * safe_realloc(&self.sorted_samples, n_samples * sizeof(SIZE_t)) + * safe_realloc(&self.index_to_samples, n_total_samples) # <<<<<<<<<<<<<< + * safe_realloc(&self.sorted_samples, n_samples) * */ - __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->index_to_samples), (__pyx_v_n_total_samples * (sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)))); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->index_to_samples), __pyx_v_n_total_samples); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_splitter.pyx":1090 + /* "sklearn/tree/_splitter.pyx":897 * # Initialize auxiliary array used to perform split - * safe_realloc(&self.index_to_samples, n_total_samples * sizeof(SIZE_t)) - * safe_realloc(&self.sorted_samples, n_samples * sizeof(SIZE_t)) # <<<<<<<<<<<<<< + * safe_realloc(&self.index_to_samples, n_total_samples) + * safe_realloc(&self.sorted_samples, n_samples) # <<<<<<<<<<<<<< * * cdef SIZE_t* index_to_samples = self.index_to_samples */ - __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->sorted_samples), (__pyx_v_n_samples * (sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)))); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->sorted_samples), __pyx_v_n_samples); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_splitter.pyx":1092 - * safe_realloc(&self.sorted_samples, n_samples * sizeof(SIZE_t)) + /* "sklearn/tree/_splitter.pyx":899 + * safe_realloc(&self.sorted_samples, n_samples) * * cdef SIZE_t* index_to_samples = self.index_to_samples # <<<<<<<<<<<<<< * cdef SIZE_t p @@ -8821,7 +7624,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ __pyx_t_4 = __pyx_v_self->index_to_samples; __pyx_v_index_to_samples = __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":1094 + /* "sklearn/tree/_splitter.pyx":901 * cdef SIZE_t* index_to_samples = self.index_to_samples * cdef SIZE_t p * for p in range(n_total_samples): # <<<<<<<<<<<<<< @@ -8832,7 +7635,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_5; __pyx_t_10+=1) { __pyx_v_p = __pyx_t_10; - /* "sklearn/tree/_splitter.pyx":1095 + /* "sklearn/tree/_splitter.pyx":902 * cdef SIZE_t p * for p in range(n_total_samples): * index_to_samples[p] = -1 # <<<<<<<<<<<<<< @@ -8842,7 +7645,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ (__pyx_v_index_to_samples[__pyx_v_p]) = -1; } - /* "sklearn/tree/_splitter.pyx":1097 + /* "sklearn/tree/_splitter.pyx":904 * index_to_samples[p] = -1 * * for p in range(n_samples): # <<<<<<<<<<<<<< @@ -8853,7 +7656,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_5; __pyx_t_10+=1) { __pyx_v_p = __pyx_t_10; - /* "sklearn/tree/_splitter.pyx":1098 + /* "sklearn/tree/_splitter.pyx":905 * * for p in range(n_samples): * index_to_samples[samples[p]] = p # <<<<<<<<<<<<<< @@ -8863,7 +7666,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ (__pyx_v_index_to_samples[(__pyx_v_samples[__pyx_v_p])]) = __pyx_v_p; } - /* "sklearn/tree/_splitter.pyx":1062 + /* "sklearn/tree/_splitter.pyx":868 * free(self.sorted_samples) * * cdef void init(self, # <<<<<<<<<<<<<< @@ -8897,7 +7700,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init(struct _ __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_splitter.pyx":1100 +/* "sklearn/tree/_splitter.pyx":907 * index_to_samples[samples[p]] = p * * cdef inline SIZE_t _partition(self, double threshold, # <<<<<<<<<<<<<< @@ -8918,7 +7721,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 int __pyx_t_3; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":1109 + /* "sklearn/tree/_splitter.pyx":916 * cdef SIZE_t p * * cdef DTYPE_t* Xf = self.feature_values # <<<<<<<<<<<<<< @@ -8928,7 +7731,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 __pyx_t_1 = __pyx_v_self->__pyx_base.feature_values; __pyx_v_Xf = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1110 + /* "sklearn/tree/_splitter.pyx":917 * * cdef DTYPE_t* Xf = self.feature_values * cdef SIZE_t* samples = self.samples # <<<<<<<<<<<<<< @@ -8938,7 +7741,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 __pyx_t_2 = __pyx_v_self->__pyx_base.samples; __pyx_v_samples = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1111 + /* "sklearn/tree/_splitter.pyx":918 * cdef DTYPE_t* Xf = self.feature_values * cdef SIZE_t* samples = self.samples * cdef SIZE_t* index_to_samples = self.index_to_samples # <<<<<<<<<<<<<< @@ -8948,7 +7751,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 __pyx_t_2 = __pyx_v_self->index_to_samples; __pyx_v_index_to_samples = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1113 + /* "sklearn/tree/_splitter.pyx":920 * cdef SIZE_t* index_to_samples = self.index_to_samples * * if threshold < 0.: # <<<<<<<<<<<<<< @@ -8958,7 +7761,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 __pyx_t_3 = ((__pyx_v_threshold < 0.) != 0); if (__pyx_t_3) { - /* "sklearn/tree/_splitter.pyx":1114 + /* "sklearn/tree/_splitter.pyx":921 * * if threshold < 0.: * p = self.start # <<<<<<<<<<<<<< @@ -8968,7 +7771,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 __pyx_t_4 = __pyx_v_self->__pyx_base.start; __pyx_v_p = __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":1115 + /* "sklearn/tree/_splitter.pyx":922 * if threshold < 0.: * p = self.start * partition_end = end_negative # <<<<<<<<<<<<<< @@ -8979,7 +7782,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 goto __pyx_L3; } - /* "sklearn/tree/_splitter.pyx":1116 + /* "sklearn/tree/_splitter.pyx":923 * p = self.start * partition_end = end_negative * elif threshold > 0.: # <<<<<<<<<<<<<< @@ -8989,7 +7792,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 __pyx_t_3 = ((__pyx_v_threshold > 0.) != 0); if (__pyx_t_3) { - /* "sklearn/tree/_splitter.pyx":1117 + /* "sklearn/tree/_splitter.pyx":924 * partition_end = end_negative * elif threshold > 0.: * p = start_positive # <<<<<<<<<<<<<< @@ -8998,7 +7801,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 */ __pyx_v_p = __pyx_v_start_positive; - /* "sklearn/tree/_splitter.pyx":1118 + /* "sklearn/tree/_splitter.pyx":925 * elif threshold > 0.: * p = start_positive * partition_end = self.end # <<<<<<<<<<<<<< @@ -9011,7 +7814,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 } /*else*/ { - /* "sklearn/tree/_splitter.pyx":1121 + /* "sklearn/tree/_splitter.pyx":928 * else: * # Data are already split * return zero_pos # <<<<<<<<<<<<<< @@ -9023,7 +7826,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 } __pyx_L3:; - /* "sklearn/tree/_splitter.pyx":1123 + /* "sklearn/tree/_splitter.pyx":930 * return zero_pos * * while p < partition_end: # <<<<<<<<<<<<<< @@ -9034,7 +7837,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 __pyx_t_3 = ((__pyx_v_p < __pyx_v_partition_end) != 0); if (!__pyx_t_3) break; - /* "sklearn/tree/_splitter.pyx":1124 + /* "sklearn/tree/_splitter.pyx":931 * * while p < partition_end: * value = Xf[p] # <<<<<<<<<<<<<< @@ -9043,7 +7846,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 */ __pyx_v_value = (__pyx_v_Xf[__pyx_v_p]); - /* "sklearn/tree/_splitter.pyx":1126 + /* "sklearn/tree/_splitter.pyx":933 * value = Xf[p] * * if value <= threshold: # <<<<<<<<<<<<<< @@ -9053,7 +7856,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 __pyx_t_3 = ((__pyx_v_value <= __pyx_v_threshold) != 0); if (__pyx_t_3) { - /* "sklearn/tree/_splitter.pyx":1127 + /* "sklearn/tree/_splitter.pyx":934 * * if value <= threshold: * p += 1 # <<<<<<<<<<<<<< @@ -9065,7 +7868,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 } /*else*/ { - /* "sklearn/tree/_splitter.pyx":1130 + /* "sklearn/tree/_splitter.pyx":937 * * else: * partition_end -= 1 # <<<<<<<<<<<<<< @@ -9074,7 +7877,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 */ __pyx_v_partition_end = (__pyx_v_partition_end - 1); - /* "sklearn/tree/_splitter.pyx":1132 + /* "sklearn/tree/_splitter.pyx":939 * partition_end -= 1 * * Xf[p] = Xf[partition_end] # <<<<<<<<<<<<<< @@ -9083,7 +7886,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 */ (__pyx_v_Xf[__pyx_v_p]) = (__pyx_v_Xf[__pyx_v_partition_end]); - /* "sklearn/tree/_splitter.pyx":1133 + /* "sklearn/tree/_splitter.pyx":940 * * Xf[p] = Xf[partition_end] * Xf[partition_end] = value # <<<<<<<<<<<<<< @@ -9092,7 +7895,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 */ (__pyx_v_Xf[__pyx_v_partition_end]) = __pyx_v_value; - /* "sklearn/tree/_splitter.pyx":1134 + /* "sklearn/tree/_splitter.pyx":941 * Xf[p] = Xf[partition_end] * Xf[partition_end] = value * sparse_swap(index_to_samples, samples, p, partition_end) # <<<<<<<<<<<<<< @@ -9104,7 +7907,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 __pyx_L6:; } - /* "sklearn/tree/_splitter.pyx":1136 + /* "sklearn/tree/_splitter.pyx":943 * sparse_swap(index_to_samples, samples, p, partition_end) * * return partition_end # <<<<<<<<<<<<<< @@ -9114,7 +7917,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 __pyx_r = __pyx_v_partition_end; goto __pyx_L0; - /* "sklearn/tree/_splitter.pyx":1100 + /* "sklearn/tree/_splitter.pyx":907 * index_to_samples[samples[p]] = p * * cdef inline SIZE_t _partition(self, double threshold, # <<<<<<<<<<<<<< @@ -9127,7 +7930,7 @@ static CYTHON_INLINE __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_f_7sklearn_4 return __pyx_r; } -/* "sklearn/tree/_splitter.pyx":1138 +/* "sklearn/tree/_splitter.pyx":945 * return partition_end * * cdef inline void extract_nnz(self, SIZE_t feature, # <<<<<<<<<<<<<< @@ -9142,7 +7945,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_v_n_samples; int __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1170 + /* "sklearn/tree/_splitter.pyx":977 * * """ * cdef SIZE_t indptr_start = self.X_indptr[feature], # <<<<<<<<<<<<<< @@ -9151,7 +7954,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter */ __pyx_v_indptr_start = (__pyx_v_self->X_indptr[__pyx_v_feature]); - /* "sklearn/tree/_splitter.pyx":1171 + /* "sklearn/tree/_splitter.pyx":978 * """ * cdef SIZE_t indptr_start = self.X_indptr[feature], * cdef SIZE_t indptr_end = self.X_indptr[feature + 1] # <<<<<<<<<<<<<< @@ -9160,7 +7963,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter */ __pyx_v_indptr_end = (__pyx_v_self->X_indptr[(__pyx_v_feature + 1)]); - /* "sklearn/tree/_splitter.pyx":1172 + /* "sklearn/tree/_splitter.pyx":979 * cdef SIZE_t indptr_start = self.X_indptr[feature], * cdef SIZE_t indptr_end = self.X_indptr[feature + 1] * cdef SIZE_t n_indices = (indptr_end - indptr_start) # <<<<<<<<<<<<<< @@ -9169,7 +7972,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter */ __pyx_v_n_indices = ((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)(__pyx_v_indptr_end - __pyx_v_indptr_start)); - /* "sklearn/tree/_splitter.pyx":1173 + /* "sklearn/tree/_splitter.pyx":980 * cdef SIZE_t indptr_end = self.X_indptr[feature + 1] * cdef SIZE_t n_indices = (indptr_end - indptr_start) * cdef SIZE_t n_samples = self.end - self.start # <<<<<<<<<<<<<< @@ -9178,7 +7981,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter */ __pyx_v_n_samples = (__pyx_v_self->__pyx_base.end - __pyx_v_self->__pyx_base.start); - /* "sklearn/tree/_splitter.pyx":1181 + /* "sklearn/tree/_splitter.pyx":988 * # approach. * if ((1 - is_samples_sorted[0]) * n_samples * log(n_samples) + * n_samples * log(n_indices) < EXTRACT_NNZ_SWITCH * n_indices): # <<<<<<<<<<<<<< @@ -9188,7 +7991,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter __pyx_t_1 = ((((((1 - (__pyx_v_is_samples_sorted[0])) * __pyx_v_n_samples) * __pyx_f_7sklearn_4tree_6_utils_log(__pyx_v_n_samples)) + (__pyx_v_n_samples * __pyx_f_7sklearn_4tree_6_utils_log(__pyx_v_n_indices))) < (__pyx_v_7sklearn_4tree_9_splitter_EXTRACT_NNZ_SWITCH * __pyx_v_n_indices)) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":1182 + /* "sklearn/tree/_splitter.pyx":989 * if ((1 - is_samples_sorted[0]) * n_samples * log(n_samples) + * n_samples * log(n_indices) < EXTRACT_NNZ_SWITCH * n_indices): * extract_nnz_binary_search(self.X_indices, self.X_data, # <<<<<<<<<<<<<< @@ -9200,7 +8003,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter } /*else*/ { - /* "sklearn/tree/_splitter.pyx":1193 + /* "sklearn/tree/_splitter.pyx":1000 * # index_to_samples is a mapping from X_indices to samples * else: * extract_nnz_index_to_samples(self.X_indices, self.X_data, # <<<<<<<<<<<<<< @@ -9211,7 +8014,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter } __pyx_L3:; - /* "sklearn/tree/_splitter.pyx":1138 + /* "sklearn/tree/_splitter.pyx":945 * return partition_end * * cdef inline void extract_nnz(self, SIZE_t feature, # <<<<<<<<<<<<<< @@ -9222,7 +8025,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":1201 +/* "sklearn/tree/_splitter.pyx":1008 * * * cdef int compare_SIZE_t(const void* a, const void* b) nogil: # <<<<<<<<<<<<<< @@ -9233,7 +8036,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter static int __pyx_f_7sklearn_4tree_9_splitter_compare_SIZE_t(void const *__pyx_v_a, void const *__pyx_v_b) { int __pyx_r; - /* "sklearn/tree/_splitter.pyx":1203 + /* "sklearn/tree/_splitter.pyx":1010 * cdef int compare_SIZE_t(const void* a, const void* b) nogil: * """Comparison function for sort.""" * return ((a)[0] - (b)[0]) # <<<<<<<<<<<<<< @@ -9243,7 +8046,7 @@ static int __pyx_f_7sklearn_4tree_9_splitter_compare_SIZE_t(void const *__pyx_v_ __pyx_r = ((int)((((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t *)__pyx_v_a)[0]) - (((__pyx_t_7sklearn_4tree_9_splitter_SIZE_t *)__pyx_v_b)[0]))); goto __pyx_L0; - /* "sklearn/tree/_splitter.pyx":1201 + /* "sklearn/tree/_splitter.pyx":1008 * * * cdef int compare_SIZE_t(const void* a, const void* b) nogil: # <<<<<<<<<<<<<< @@ -9256,7 +8059,7 @@ static int __pyx_f_7sklearn_4tree_9_splitter_compare_SIZE_t(void const *__pyx_v_ return __pyx_r; } -/* "sklearn/tree/_splitter.pyx":1206 +/* "sklearn/tree/_splitter.pyx":1013 * * * cdef inline void binary_search(INT32_t* sorted_array, # <<<<<<<<<<<<<< @@ -9268,7 +8071,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ __pyx_t_7sklearn_4tree_9_splitter_INT32_t __pyx_v_pivot; int __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1215 + /* "sklearn/tree/_splitter.pyx":1022 * """ * cdef INT32_t pivot * index[0] = -1 # <<<<<<<<<<<<<< @@ -9277,7 +8080,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ */ (__pyx_v_index[0]) = -1; - /* "sklearn/tree/_splitter.pyx":1216 + /* "sklearn/tree/_splitter.pyx":1023 * cdef INT32_t pivot * index[0] = -1 * while start < end: # <<<<<<<<<<<<<< @@ -9288,7 +8091,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ __pyx_t_1 = ((__pyx_v_start < __pyx_v_end) != 0); if (!__pyx_t_1) break; - /* "sklearn/tree/_splitter.pyx":1217 + /* "sklearn/tree/_splitter.pyx":1024 * index[0] = -1 * while start < end: * pivot = start + (end - start) / 2 # <<<<<<<<<<<<<< @@ -9297,7 +8100,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ */ __pyx_v_pivot = (__pyx_v_start + ((__pyx_v_end - __pyx_v_start) / 2)); - /* "sklearn/tree/_splitter.pyx":1219 + /* "sklearn/tree/_splitter.pyx":1026 * pivot = start + (end - start) / 2 * * if sorted_array[pivot] == value: # <<<<<<<<<<<<<< @@ -9307,7 +8110,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ __pyx_t_1 = (((__pyx_v_sorted_array[__pyx_v_pivot]) == __pyx_v_value) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":1220 + /* "sklearn/tree/_splitter.pyx":1027 * * if sorted_array[pivot] == value: * index[0] = pivot # <<<<<<<<<<<<<< @@ -9316,7 +8119,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ */ (__pyx_v_index[0]) = __pyx_v_pivot; - /* "sklearn/tree/_splitter.pyx":1221 + /* "sklearn/tree/_splitter.pyx":1028 * if sorted_array[pivot] == value: * index[0] = pivot * start = pivot + 1 # <<<<<<<<<<<<<< @@ -9325,7 +8128,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ */ __pyx_v_start = (__pyx_v_pivot + 1); - /* "sklearn/tree/_splitter.pyx":1222 + /* "sklearn/tree/_splitter.pyx":1029 * index[0] = pivot * start = pivot + 1 * break # <<<<<<<<<<<<<< @@ -9335,7 +8138,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ goto __pyx_L4_break; } - /* "sklearn/tree/_splitter.pyx":1224 + /* "sklearn/tree/_splitter.pyx":1031 * break * * if sorted_array[pivot] < value: # <<<<<<<<<<<<<< @@ -9345,7 +8148,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ __pyx_t_1 = (((__pyx_v_sorted_array[__pyx_v_pivot]) < __pyx_v_value) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":1225 + /* "sklearn/tree/_splitter.pyx":1032 * * if sorted_array[pivot] < value: * start = pivot + 1 # <<<<<<<<<<<<<< @@ -9357,7 +8160,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ } /*else*/ { - /* "sklearn/tree/_splitter.pyx":1227 + /* "sklearn/tree/_splitter.pyx":1034 * start = pivot + 1 * else: * end = pivot # <<<<<<<<<<<<<< @@ -9370,7 +8173,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ } __pyx_L4_break:; - /* "sklearn/tree/_splitter.pyx":1228 + /* "sklearn/tree/_splitter.pyx":1035 * else: * end = pivot * new_start[0] = start # <<<<<<<<<<<<<< @@ -9379,7 +8182,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ */ (__pyx_v_new_start[0]) = __pyx_v_start; - /* "sklearn/tree/_splitter.pyx":1206 + /* "sklearn/tree/_splitter.pyx":1013 * * * cdef inline void binary_search(INT32_t* sorted_array, # <<<<<<<<<<<<<< @@ -9390,7 +8193,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_ /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":1231 +/* "sklearn/tree/_splitter.pyx":1038 * * * cdef inline void extract_nnz_index_to_samples(INT32_t* X_indices, # <<<<<<<<<<<<<< @@ -9408,7 +8211,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to int __pyx_t_3; int __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":1248 + /* "sklearn/tree/_splitter.pyx":1055 * cdef INT32_t k * cdef SIZE_t index * cdef SIZE_t end_negative_ = start # <<<<<<<<<<<<<< @@ -9417,7 +8220,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to */ __pyx_v_end_negative_ = __pyx_v_start; - /* "sklearn/tree/_splitter.pyx":1249 + /* "sklearn/tree/_splitter.pyx":1056 * cdef SIZE_t index * cdef SIZE_t end_negative_ = start * cdef SIZE_t start_positive_ = end # <<<<<<<<<<<<<< @@ -9426,7 +8229,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to */ __pyx_v_start_positive_ = __pyx_v_end; - /* "sklearn/tree/_splitter.pyx":1251 + /* "sklearn/tree/_splitter.pyx":1058 * cdef SIZE_t start_positive_ = end * * for k in range(indptr_start, indptr_end): # <<<<<<<<<<<<<< @@ -9437,7 +8240,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to for (__pyx_t_2 = __pyx_v_indptr_start; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { __pyx_v_k = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1252 + /* "sklearn/tree/_splitter.pyx":1059 * * for k in range(indptr_start, indptr_end): * if start <= index_to_samples[X_indices[k]] < end: # <<<<<<<<<<<<<< @@ -9451,7 +8254,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to __pyx_t_4 = (__pyx_t_3 != 0); if (__pyx_t_4) { - /* "sklearn/tree/_splitter.pyx":1253 + /* "sklearn/tree/_splitter.pyx":1060 * for k in range(indptr_start, indptr_end): * if start <= index_to_samples[X_indices[k]] < end: * if X_data[k] > 0: # <<<<<<<<<<<<<< @@ -9461,7 +8264,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to __pyx_t_4 = (((__pyx_v_X_data[__pyx_v_k]) > 0.0) != 0); if (__pyx_t_4) { - /* "sklearn/tree/_splitter.pyx":1254 + /* "sklearn/tree/_splitter.pyx":1061 * if start <= index_to_samples[X_indices[k]] < end: * if X_data[k] > 0: * start_positive_ -= 1 # <<<<<<<<<<<<<< @@ -9470,7 +8273,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to */ __pyx_v_start_positive_ = (__pyx_v_start_positive_ - 1); - /* "sklearn/tree/_splitter.pyx":1255 + /* "sklearn/tree/_splitter.pyx":1062 * if X_data[k] > 0: * start_positive_ -= 1 * Xf[start_positive_] = X_data[k] # <<<<<<<<<<<<<< @@ -9479,7 +8282,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to */ (__pyx_v_Xf[__pyx_v_start_positive_]) = (__pyx_v_X_data[__pyx_v_k]); - /* "sklearn/tree/_splitter.pyx":1256 + /* "sklearn/tree/_splitter.pyx":1063 * start_positive_ -= 1 * Xf[start_positive_] = X_data[k] * index = index_to_samples[X_indices[k]] # <<<<<<<<<<<<<< @@ -9488,7 +8291,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to */ __pyx_v_index = (__pyx_v_index_to_samples[(__pyx_v_X_indices[__pyx_v_k])]); - /* "sklearn/tree/_splitter.pyx":1257 + /* "sklearn/tree/_splitter.pyx":1064 * Xf[start_positive_] = X_data[k] * index = index_to_samples[X_indices[k]] * sparse_swap(index_to_samples, samples, index, start_positive_) # <<<<<<<<<<<<<< @@ -9499,7 +8302,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to goto __pyx_L6; } - /* "sklearn/tree/_splitter.pyx":1260 + /* "sklearn/tree/_splitter.pyx":1067 * * * elif X_data[k] < 0: # <<<<<<<<<<<<<< @@ -9509,7 +8312,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to __pyx_t_4 = (((__pyx_v_X_data[__pyx_v_k]) < 0.0) != 0); if (__pyx_t_4) { - /* "sklearn/tree/_splitter.pyx":1261 + /* "sklearn/tree/_splitter.pyx":1068 * * elif X_data[k] < 0: * Xf[end_negative_] = X_data[k] # <<<<<<<<<<<<<< @@ -9518,7 +8321,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to */ (__pyx_v_Xf[__pyx_v_end_negative_]) = (__pyx_v_X_data[__pyx_v_k]); - /* "sklearn/tree/_splitter.pyx":1262 + /* "sklearn/tree/_splitter.pyx":1069 * elif X_data[k] < 0: * Xf[end_negative_] = X_data[k] * index = index_to_samples[X_indices[k]] # <<<<<<<<<<<<<< @@ -9527,7 +8330,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to */ __pyx_v_index = (__pyx_v_index_to_samples[(__pyx_v_X_indices[__pyx_v_k])]); - /* "sklearn/tree/_splitter.pyx":1263 + /* "sklearn/tree/_splitter.pyx":1070 * Xf[end_negative_] = X_data[k] * index = index_to_samples[X_indices[k]] * sparse_swap(index_to_samples, samples, index, end_negative_) # <<<<<<<<<<<<<< @@ -9536,7 +8339,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to */ __pyx_f_7sklearn_4tree_9_splitter_sparse_swap(__pyx_v_index_to_samples, __pyx_v_samples, __pyx_v_index, __pyx_v_end_negative_); - /* "sklearn/tree/_splitter.pyx":1264 + /* "sklearn/tree/_splitter.pyx":1071 * index = index_to_samples[X_indices[k]] * sparse_swap(index_to_samples, samples, index, end_negative_) * end_negative_ += 1 # <<<<<<<<<<<<<< @@ -9552,7 +8355,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to __pyx_L5:; } - /* "sklearn/tree/_splitter.pyx":1267 + /* "sklearn/tree/_splitter.pyx":1074 * * # Returned values * end_negative[0] = end_negative_ # <<<<<<<<<<<<<< @@ -9561,7 +8364,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to */ (__pyx_v_end_negative[0]) = __pyx_v_end_negative_; - /* "sklearn/tree/_splitter.pyx":1268 + /* "sklearn/tree/_splitter.pyx":1075 * # Returned values * end_negative[0] = end_negative_ * start_positive[0] = start_positive_ # <<<<<<<<<<<<<< @@ -9570,7 +8373,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to */ (__pyx_v_start_positive[0]) = __pyx_v_start_positive_; - /* "sklearn/tree/_splitter.pyx":1231 + /* "sklearn/tree/_splitter.pyx":1038 * * * cdef inline void extract_nnz_index_to_samples(INT32_t* X_indices, # <<<<<<<<<<<<<< @@ -9581,7 +8384,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_index_to /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":1271 +/* "sklearn/tree/_splitter.pyx":1078 * * * cdef inline void extract_nnz_binary_search(INT32_t* X_indices, # <<<<<<<<<<<<<< @@ -9599,7 +8402,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s int __pyx_t_1; int __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1294 + /* "sklearn/tree/_splitter.pyx":1101 * cdef SIZE_t n_samples * * if not is_samples_sorted[0]: # <<<<<<<<<<<<<< @@ -9609,7 +8412,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s __pyx_t_1 = ((!((__pyx_v_is_samples_sorted[0]) != 0)) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":1295 + /* "sklearn/tree/_splitter.pyx":1102 * * if not is_samples_sorted[0]: * n_samples = end - start # <<<<<<<<<<<<<< @@ -9618,7 +8421,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ __pyx_v_n_samples = (__pyx_v_end - __pyx_v_start); - /* "sklearn/tree/_splitter.pyx":1296 + /* "sklearn/tree/_splitter.pyx":1103 * if not is_samples_sorted[0]: * n_samples = end - start * memcpy(sorted_samples + start, samples + start, # <<<<<<<<<<<<<< @@ -9627,7 +8430,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ memcpy((__pyx_v_sorted_samples + __pyx_v_start), (__pyx_v_samples + __pyx_v_start), (__pyx_v_n_samples * (sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)))); - /* "sklearn/tree/_splitter.pyx":1298 + /* "sklearn/tree/_splitter.pyx":1105 * memcpy(sorted_samples + start, samples + start, * n_samples * sizeof(SIZE_t)) * qsort(sorted_samples + start, n_samples, sizeof(SIZE_t), # <<<<<<<<<<<<<< @@ -9636,7 +8439,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ qsort((__pyx_v_sorted_samples + __pyx_v_start), __pyx_v_n_samples, (sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)), __pyx_f_7sklearn_4tree_9_splitter_compare_SIZE_t); - /* "sklearn/tree/_splitter.pyx":1300 + /* "sklearn/tree/_splitter.pyx":1107 * qsort(sorted_samples + start, n_samples, sizeof(SIZE_t), * compare_SIZE_t) * is_samples_sorted[0] = 1 # <<<<<<<<<<<<<< @@ -9648,7 +8451,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s } __pyx_L3:; - /* "sklearn/tree/_splitter.pyx":1302 + /* "sklearn/tree/_splitter.pyx":1109 * is_samples_sorted[0] = 1 * * while (indptr_start < indptr_end and # <<<<<<<<<<<<<< @@ -9663,7 +8466,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s goto __pyx_L6_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":1303 + /* "sklearn/tree/_splitter.pyx":1110 * * while (indptr_start < indptr_end and * sorted_samples[start] > X_indices[indptr_start]): # <<<<<<<<<<<<<< @@ -9675,7 +8478,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s __pyx_L6_bool_binop_done:; if (!__pyx_t_1) break; - /* "sklearn/tree/_splitter.pyx":1304 + /* "sklearn/tree/_splitter.pyx":1111 * while (indptr_start < indptr_end and * sorted_samples[start] > X_indices[indptr_start]): * indptr_start += 1 # <<<<<<<<<<<<<< @@ -9685,7 +8488,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s __pyx_v_indptr_start = (__pyx_v_indptr_start + 1); } - /* "sklearn/tree/_splitter.pyx":1306 + /* "sklearn/tree/_splitter.pyx":1113 * indptr_start += 1 * * while (indptr_start < indptr_end and # <<<<<<<<<<<<<< @@ -9700,7 +8503,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s goto __pyx_L10_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":1307 + /* "sklearn/tree/_splitter.pyx":1114 * * while (indptr_start < indptr_end and * sorted_samples[end - 1] < X_indices[indptr_end - 1]): # <<<<<<<<<<<<<< @@ -9712,7 +8515,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s __pyx_L10_bool_binop_done:; if (!__pyx_t_1) break; - /* "sklearn/tree/_splitter.pyx":1308 + /* "sklearn/tree/_splitter.pyx":1115 * while (indptr_start < indptr_end and * sorted_samples[end - 1] < X_indices[indptr_end - 1]): * indptr_end -= 1 # <<<<<<<<<<<<<< @@ -9722,7 +8525,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s __pyx_v_indptr_end = (__pyx_v_indptr_end - 1); } - /* "sklearn/tree/_splitter.pyx":1310 + /* "sklearn/tree/_splitter.pyx":1117 * indptr_end -= 1 * * cdef SIZE_t p = start # <<<<<<<<<<<<<< @@ -9731,7 +8534,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ __pyx_v_p = __pyx_v_start; - /* "sklearn/tree/_splitter.pyx":1313 + /* "sklearn/tree/_splitter.pyx":1120 * cdef SIZE_t index * cdef SIZE_t k * cdef SIZE_t end_negative_ = start # <<<<<<<<<<<<<< @@ -9740,7 +8543,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ __pyx_v_end_negative_ = __pyx_v_start; - /* "sklearn/tree/_splitter.pyx":1314 + /* "sklearn/tree/_splitter.pyx":1121 * cdef SIZE_t k * cdef SIZE_t end_negative_ = start * cdef SIZE_t start_positive_ = end # <<<<<<<<<<<<<< @@ -9749,7 +8552,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ __pyx_v_start_positive_ = __pyx_v_end; - /* "sklearn/tree/_splitter.pyx":1316 + /* "sklearn/tree/_splitter.pyx":1123 * cdef SIZE_t start_positive_ = end * * while (p < end and indptr_start < indptr_end): # <<<<<<<<<<<<<< @@ -9768,7 +8571,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s __pyx_L14_bool_binop_done:; if (!__pyx_t_1) break; - /* "sklearn/tree/_splitter.pyx":1318 + /* "sklearn/tree/_splitter.pyx":1125 * while (p < end and indptr_start < indptr_end): * # Find index of sorted_samples[p] in X_indices * binary_search(X_indices, indptr_start, indptr_end, # <<<<<<<<<<<<<< @@ -9777,7 +8580,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ __pyx_f_7sklearn_4tree_9_splitter_binary_search(__pyx_v_X_indices, __pyx_v_indptr_start, __pyx_v_indptr_end, (__pyx_v_sorted_samples[__pyx_v_p]), (&__pyx_v_k), (&__pyx_v_indptr_start)); - /* "sklearn/tree/_splitter.pyx":1321 + /* "sklearn/tree/_splitter.pyx":1128 * sorted_samples[p], &k, &indptr_start) * * if k != -1: # <<<<<<<<<<<<<< @@ -9787,7 +8590,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s __pyx_t_1 = ((__pyx_v_k != -1) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":1324 + /* "sklearn/tree/_splitter.pyx":1131 * # If k != -1, we have found a non zero value * * if X_data[k] > 0: # <<<<<<<<<<<<<< @@ -9797,7 +8600,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s __pyx_t_1 = (((__pyx_v_X_data[__pyx_v_k]) > 0.0) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":1325 + /* "sklearn/tree/_splitter.pyx":1132 * * if X_data[k] > 0: * start_positive_ -= 1 # <<<<<<<<<<<<<< @@ -9806,7 +8609,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ __pyx_v_start_positive_ = (__pyx_v_start_positive_ - 1); - /* "sklearn/tree/_splitter.pyx":1326 + /* "sklearn/tree/_splitter.pyx":1133 * if X_data[k] > 0: * start_positive_ -= 1 * Xf[start_positive_] = X_data[k] # <<<<<<<<<<<<<< @@ -9815,7 +8618,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ (__pyx_v_Xf[__pyx_v_start_positive_]) = (__pyx_v_X_data[__pyx_v_k]); - /* "sklearn/tree/_splitter.pyx":1327 + /* "sklearn/tree/_splitter.pyx":1134 * start_positive_ -= 1 * Xf[start_positive_] = X_data[k] * index = index_to_samples[X_indices[k]] # <<<<<<<<<<<<<< @@ -9824,7 +8627,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ __pyx_v_index = (__pyx_v_index_to_samples[(__pyx_v_X_indices[__pyx_v_k])]); - /* "sklearn/tree/_splitter.pyx":1328 + /* "sklearn/tree/_splitter.pyx":1135 * Xf[start_positive_] = X_data[k] * index = index_to_samples[X_indices[k]] * sparse_swap(index_to_samples, samples, index, start_positive_) # <<<<<<<<<<<<<< @@ -9835,7 +8638,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s goto __pyx_L17; } - /* "sklearn/tree/_splitter.pyx":1331 + /* "sklearn/tree/_splitter.pyx":1138 * * * elif X_data[k] < 0: # <<<<<<<<<<<<<< @@ -9845,7 +8648,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s __pyx_t_1 = (((__pyx_v_X_data[__pyx_v_k]) < 0.0) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_splitter.pyx":1332 + /* "sklearn/tree/_splitter.pyx":1139 * * elif X_data[k] < 0: * Xf[end_negative_] = X_data[k] # <<<<<<<<<<<<<< @@ -9854,7 +8657,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ (__pyx_v_Xf[__pyx_v_end_negative_]) = (__pyx_v_X_data[__pyx_v_k]); - /* "sklearn/tree/_splitter.pyx":1333 + /* "sklearn/tree/_splitter.pyx":1140 * elif X_data[k] < 0: * Xf[end_negative_] = X_data[k] * index = index_to_samples[X_indices[k]] # <<<<<<<<<<<<<< @@ -9863,7 +8666,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ __pyx_v_index = (__pyx_v_index_to_samples[(__pyx_v_X_indices[__pyx_v_k])]); - /* "sklearn/tree/_splitter.pyx":1334 + /* "sklearn/tree/_splitter.pyx":1141 * Xf[end_negative_] = X_data[k] * index = index_to_samples[X_indices[k]] * sparse_swap(index_to_samples, samples, index, end_negative_) # <<<<<<<<<<<<<< @@ -9872,7 +8675,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ __pyx_f_7sklearn_4tree_9_splitter_sparse_swap(__pyx_v_index_to_samples, __pyx_v_samples, __pyx_v_index, __pyx_v_end_negative_); - /* "sklearn/tree/_splitter.pyx":1335 + /* "sklearn/tree/_splitter.pyx":1142 * index = index_to_samples[X_indices[k]] * sparse_swap(index_to_samples, samples, index, end_negative_) * end_negative_ += 1 # <<<<<<<<<<<<<< @@ -9887,7 +8690,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s } __pyx_L16:; - /* "sklearn/tree/_splitter.pyx":1336 + /* "sklearn/tree/_splitter.pyx":1143 * sparse_swap(index_to_samples, samples, index, end_negative_) * end_negative_ += 1 * p += 1 # <<<<<<<<<<<<<< @@ -9897,7 +8700,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s __pyx_v_p = (__pyx_v_p + 1); } - /* "sklearn/tree/_splitter.pyx":1339 + /* "sklearn/tree/_splitter.pyx":1146 * * # Returned values * end_negative[0] = end_negative_ # <<<<<<<<<<<<<< @@ -9906,7 +8709,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ (__pyx_v_end_negative[0]) = __pyx_v_end_negative_; - /* "sklearn/tree/_splitter.pyx":1340 + /* "sklearn/tree/_splitter.pyx":1147 * # Returned values * end_negative[0] = end_negative_ * start_positive[0] = start_positive_ # <<<<<<<<<<<<<< @@ -9915,7 +8718,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s */ (__pyx_v_start_positive[0]) = __pyx_v_start_positive_; - /* "sklearn/tree/_splitter.pyx":1271 + /* "sklearn/tree/_splitter.pyx":1078 * * * cdef inline void extract_nnz_binary_search(INT32_t* X_indices, # <<<<<<<<<<<<<< @@ -9926,7 +8729,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_extract_nnz_binary_s /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":1343 +/* "sklearn/tree/_splitter.pyx":1150 * * * cdef inline void sparse_swap(SIZE_t* index_to_samples, SIZE_t* samples, # <<<<<<<<<<<<<< @@ -9938,7 +8741,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sparse_swap(__pyx_t_ __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_1; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1346 + /* "sklearn/tree/_splitter.pyx":1153 * SIZE_t pos_1, SIZE_t pos_2) nogil : * """Swap sample pos_1 and pos_2 preserving sparse invariant.""" * samples[pos_1], samples[pos_2] = samples[pos_2], samples[pos_1] # <<<<<<<<<<<<<< @@ -9950,7 +8753,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sparse_swap(__pyx_t_ (__pyx_v_samples[__pyx_v_pos_1]) = __pyx_t_1; (__pyx_v_samples[__pyx_v_pos_2]) = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1347 + /* "sklearn/tree/_splitter.pyx":1154 * """Swap sample pos_1 and pos_2 preserving sparse invariant.""" * samples[pos_1], samples[pos_2] = samples[pos_2], samples[pos_1] * index_to_samples[samples[pos_1]] = pos_1 # <<<<<<<<<<<<<< @@ -9959,7 +8762,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sparse_swap(__pyx_t_ */ (__pyx_v_index_to_samples[(__pyx_v_samples[__pyx_v_pos_1])]) = __pyx_v_pos_1; - /* "sklearn/tree/_splitter.pyx":1348 + /* "sklearn/tree/_splitter.pyx":1155 * samples[pos_1], samples[pos_2] = samples[pos_2], samples[pos_1] * index_to_samples[samples[pos_1]] = pos_1 * index_to_samples[samples[pos_2]] = pos_2 # <<<<<<<<<<<<<< @@ -9968,7 +8771,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sparse_swap(__pyx_t_ */ (__pyx_v_index_to_samples[(__pyx_v_samples[__pyx_v_pos_2])]) = __pyx_v_pos_2; - /* "sklearn/tree/_splitter.pyx":1343 + /* "sklearn/tree/_splitter.pyx":1150 * * * cdef inline void sparse_swap(SIZE_t* index_to_samples, SIZE_t* samples, # <<<<<<<<<<<<<< @@ -9979,7 +8782,7 @@ static CYTHON_INLINE void __pyx_f_7sklearn_4tree_9_splitter_sparse_swap(__pyx_t_ /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":1354 +/* "sklearn/tree/_splitter.pyx":1161 * """Splitter for finding the best split, using the sparse data.""" * * def __reduce__(self): # <<<<<<<<<<<<<< @@ -10007,12 +8810,13 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_18BestSparseSplitter___reduc PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); - /* "sklearn/tree/_splitter.pyx":1355 + /* "sklearn/tree/_splitter.pyx":1162 * * def __reduce__(self): * return (BestSparseSplitter, (self.criterion, # <<<<<<<<<<<<<< @@ -10021,112 +8825,125 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_18BestSparseSplitter___reduc */ __Pyx_XDECREF(__pyx_r); - /* "sklearn/tree/_splitter.pyx":1356 + /* "sklearn/tree/_splitter.pyx":1163 * def __reduce__(self): * return (BestSparseSplitter, (self.criterion, * self.max_features, # <<<<<<<<<<<<<< * self.min_samples_leaf, * self.min_weight_leaf, */ - __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.max_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1356; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.max_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - /* "sklearn/tree/_splitter.pyx":1357 + /* "sklearn/tree/_splitter.pyx":1164 * return (BestSparseSplitter, (self.criterion, * self.max_features, * self.min_samples_leaf, # <<<<<<<<<<<<<< * self.min_weight_leaf, - * self.random_state), self.__getstate__()) + * self.random_state, */ - __pyx_t_2 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1357; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - /* "sklearn/tree/_splitter.pyx":1358 + /* "sklearn/tree/_splitter.pyx":1165 * self.max_features, * self.min_samples_leaf, * self.min_weight_leaf, # <<<<<<<<<<<<<< - * self.random_state), self.__getstate__()) - * + * self.random_state, + * self.presort), self.__getstate__()) */ - __pyx_t_3 = PyFloat_FromDouble(__pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1358; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - /* "sklearn/tree/_splitter.pyx":1355 + /* "sklearn/tree/_splitter.pyx":1167 + * self.min_weight_leaf, + * self.random_state, + * self.presort), self.__getstate__()) # <<<<<<<<<<<<<< + * + * cdef void node_split(self, double impurity, SplitRecord* split, + */ + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_self->__pyx_base.__pyx_base.presort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1167; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "sklearn/tree/_splitter.pyx":1162 * * def __reduce__(self): * return (BestSparseSplitter, (self.criterion, # <<<<<<<<<<<<<< * self.max_features, * self.min_samples_leaf, */ - __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1355; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1162; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); __Pyx_GIVEREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); - PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); + PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_3); __Pyx_INCREF(__pyx_v_self->__pyx_base.__pyx_base.random_state); __Pyx_GIVEREF(__pyx_v_self->__pyx_base.__pyx_base.random_state); - PyTuple_SET_ITEM(__pyx_t_4, 4, __pyx_v_self->__pyx_base.__pyx_base.random_state); + PyTuple_SET_ITEM(__pyx_t_5, 4, __pyx_v_self->__pyx_base.__pyx_base.random_state); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 5, __pyx_t_4); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; + __pyx_t_4 = 0; - /* "sklearn/tree/_splitter.pyx":1359 - * self.min_samples_leaf, + /* "sklearn/tree/_splitter.pyx":1167 * self.min_weight_leaf, - * self.random_state), self.__getstate__()) # <<<<<<<<<<<<<< + * self.random_state, + * self.presort), self.__getstate__()) # <<<<<<<<<<<<<< * * cdef void node_split(self, double impurity, SplitRecord* split, */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_getstate); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1359; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = NULL; - if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_1)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_getstate); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1167; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); + __Pyx_DECREF_SET(__pyx_t_3, function); } } - if (__pyx_t_1) { - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1359; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1167; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else { - __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1359; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1167; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "sklearn/tree/_splitter.pyx":1355 + /* "sklearn/tree/_splitter.pyx":1162 * * def __reduce__(self): * return (BestSparseSplitter, (self.criterion, # <<<<<<<<<<<<<< * self.max_features, * self.min_samples_leaf, */ - __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1355; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1162; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_BestSparseSplitter))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_BestSparseSplitter))); - PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_BestSparseSplitter))); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_BestSparseSplitter))); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_4); + __pyx_t_5 = 0; __pyx_t_4 = 0; + __pyx_r = __pyx_t_3; __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; goto __pyx_L0; - /* "sklearn/tree/_splitter.pyx":1354 + /* "sklearn/tree/_splitter.pyx":1161 * """Splitter for finding the best split, using the sparse data.""" * * def __reduce__(self): # <<<<<<<<<<<<<< @@ -10140,6 +8957,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_18BestSparseSplitter___reduc __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("sklearn.tree._splitter.BestSparseSplitter.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; @@ -10148,8 +8966,8 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_18BestSparseSplitter___reduc return __pyx_r; } -/* "sklearn/tree/_splitter.pyx":1361 - * self.random_state), self.__getstate__()) +/* "sklearn/tree/_splitter.pyx":1169 + * self.presort), self.__getstate__()) * * cdef void node_split(self, double impurity, SplitRecord* split, # <<<<<<<<<<<<<< * SIZE_t* n_constant_features) nogil: @@ -10200,7 +9018,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st int __pyx_t_7; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_8; - /* "sklearn/tree/_splitter.pyx":1367 + /* "sklearn/tree/_splitter.pyx":1175 * """ * # Find the best split * cdef SIZE_t* samples = self.samples # <<<<<<<<<<<<<< @@ -10210,7 +9028,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.samples; __pyx_v_samples = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1368 + /* "sklearn/tree/_splitter.pyx":1176 * # Find the best split * cdef SIZE_t* samples = self.samples * cdef SIZE_t start = self.start # <<<<<<<<<<<<<< @@ -10220,7 +9038,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.start; __pyx_v_start = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1369 + /* "sklearn/tree/_splitter.pyx":1177 * cdef SIZE_t* samples = self.samples * cdef SIZE_t start = self.start * cdef SIZE_t end = self.end # <<<<<<<<<<<<<< @@ -10230,7 +9048,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.end; __pyx_v_end = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1371 + /* "sklearn/tree/_splitter.pyx":1179 * cdef SIZE_t end = self.end * * cdef INT32_t* X_indices = self.X_indices # <<<<<<<<<<<<<< @@ -10240,7 +9058,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_3 = __pyx_v_self->__pyx_base.X_indices; __pyx_v_X_indices = __pyx_t_3; - /* "sklearn/tree/_splitter.pyx":1372 + /* "sklearn/tree/_splitter.pyx":1180 * * cdef INT32_t* X_indices = self.X_indices * cdef INT32_t* X_indptr = self.X_indptr # <<<<<<<<<<<<<< @@ -10250,7 +9068,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_3 = __pyx_v_self->__pyx_base.X_indptr; __pyx_v_X_indptr = __pyx_t_3; - /* "sklearn/tree/_splitter.pyx":1373 + /* "sklearn/tree/_splitter.pyx":1181 * cdef INT32_t* X_indices = self.X_indices * cdef INT32_t* X_indptr = self.X_indptr * cdef DTYPE_t* X_data = self.X_data # <<<<<<<<<<<<<< @@ -10260,7 +9078,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_4 = __pyx_v_self->__pyx_base.X_data; __pyx_v_X_data = __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":1375 + /* "sklearn/tree/_splitter.pyx":1183 * cdef DTYPE_t* X_data = self.X_data * * cdef SIZE_t* features = self.features # <<<<<<<<<<<<<< @@ -10270,7 +9088,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.features; __pyx_v_features = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1376 + /* "sklearn/tree/_splitter.pyx":1184 * * cdef SIZE_t* features = self.features * cdef SIZE_t* constant_features = self.constant_features # <<<<<<<<<<<<<< @@ -10280,7 +9098,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.constant_features; __pyx_v_constant_features = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1377 + /* "sklearn/tree/_splitter.pyx":1185 * cdef SIZE_t* features = self.features * cdef SIZE_t* constant_features = self.constant_features * cdef SIZE_t n_features = self.n_features # <<<<<<<<<<<<<< @@ -10290,7 +9108,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.n_features; __pyx_v_n_features = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1379 + /* "sklearn/tree/_splitter.pyx":1187 * cdef SIZE_t n_features = self.n_features * * cdef DTYPE_t* Xf = self.feature_values # <<<<<<<<<<<<<< @@ -10300,7 +9118,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_4 = __pyx_v_self->__pyx_base.__pyx_base.feature_values; __pyx_v_Xf = __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":1380 + /* "sklearn/tree/_splitter.pyx":1188 * * cdef DTYPE_t* Xf = self.feature_values * cdef SIZE_t* sorted_samples = self.sorted_samples # <<<<<<<<<<<<<< @@ -10310,7 +9128,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_1 = __pyx_v_self->__pyx_base.sorted_samples; __pyx_v_sorted_samples = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1381 + /* "sklearn/tree/_splitter.pyx":1189 * cdef DTYPE_t* Xf = self.feature_values * cdef SIZE_t* sorted_samples = self.sorted_samples * cdef SIZE_t* index_to_samples = self.index_to_samples # <<<<<<<<<<<<<< @@ -10320,7 +9138,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_1 = __pyx_v_self->__pyx_base.index_to_samples; __pyx_v_index_to_samples = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1382 + /* "sklearn/tree/_splitter.pyx":1190 * cdef SIZE_t* sorted_samples = self.sorted_samples * cdef SIZE_t* index_to_samples = self.index_to_samples * cdef SIZE_t max_features = self.max_features # <<<<<<<<<<<<<< @@ -10330,7 +9148,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.max_features; __pyx_v_max_features = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1383 + /* "sklearn/tree/_splitter.pyx":1191 * cdef SIZE_t* index_to_samples = self.index_to_samples * cdef SIZE_t max_features = self.max_features * cdef SIZE_t min_samples_leaf = self.min_samples_leaf # <<<<<<<<<<<<<< @@ -10340,7 +9158,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf; __pyx_v_min_samples_leaf = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1384 + /* "sklearn/tree/_splitter.pyx":1192 * cdef SIZE_t max_features = self.max_features * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf # <<<<<<<<<<<<<< @@ -10350,7 +9168,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_5 = __pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf; __pyx_v_min_weight_leaf = __pyx_t_5; - /* "sklearn/tree/_splitter.pyx":1385 + /* "sklearn/tree/_splitter.pyx":1193 * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf * cdef UINT32_t* random_state = &self.rand_r_state # <<<<<<<<<<<<<< @@ -10359,7 +9177,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_random_state = (&__pyx_v_self->__pyx_base.__pyx_base.rand_r_state); - /* "sklearn/tree/_splitter.pyx":1388 + /* "sklearn/tree/_splitter.pyx":1196 * * cdef SplitRecord best, current * _init_split(&best, end) # <<<<<<<<<<<<<< @@ -10368,7 +9186,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_f_7sklearn_4tree_9_splitter__init_split((&__pyx_v_best), __pyx_v_end); - /* "sklearn/tree/_splitter.pyx":1389 + /* "sklearn/tree/_splitter.pyx":1197 * cdef SplitRecord best, current * _init_split(&best, end) * cdef double current_proxy_improvement = - INFINITY # <<<<<<<<<<<<<< @@ -10377,7 +9195,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_current_proxy_improvement = (-__pyx_v_7sklearn_4tree_9_splitter_INFINITY); - /* "sklearn/tree/_splitter.pyx":1390 + /* "sklearn/tree/_splitter.pyx":1198 * _init_split(&best, end) * cdef double current_proxy_improvement = - INFINITY * cdef double best_proxy_improvement = - INFINITY # <<<<<<<<<<<<<< @@ -10386,7 +9204,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_best_proxy_improvement = (-__pyx_v_7sklearn_4tree_9_splitter_INFINITY); - /* "sklearn/tree/_splitter.pyx":1392 + /* "sklearn/tree/_splitter.pyx":1200 * cdef double best_proxy_improvement = - INFINITY * * cdef SIZE_t f_i = n_features # <<<<<<<<<<<<<< @@ -10395,7 +9213,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_f_i = __pyx_v_n_features; - /* "sklearn/tree/_splitter.pyx":1394 + /* "sklearn/tree/_splitter.pyx":1202 * cdef SIZE_t f_i = n_features * cdef SIZE_t f_j, p, tmp * cdef SIZE_t n_visited_features = 0 # <<<<<<<<<<<<<< @@ -10404,7 +9222,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_n_visited_features = 0; - /* "sklearn/tree/_splitter.pyx":1396 + /* "sklearn/tree/_splitter.pyx":1204 * cdef SIZE_t n_visited_features = 0 * # Number of features discovered to be constant during the split search * cdef SIZE_t n_found_constants = 0 # <<<<<<<<<<<<<< @@ -10413,7 +9231,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_n_found_constants = 0; - /* "sklearn/tree/_splitter.pyx":1398 + /* "sklearn/tree/_splitter.pyx":1206 * cdef SIZE_t n_found_constants = 0 * # Number of features known to be constant and drawn without replacement * cdef SIZE_t n_drawn_constants = 0 # <<<<<<<<<<<<<< @@ -10422,7 +9240,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_n_drawn_constants = 0; - /* "sklearn/tree/_splitter.pyx":1399 + /* "sklearn/tree/_splitter.pyx":1207 * # Number of features known to be constant and drawn without replacement * cdef SIZE_t n_drawn_constants = 0 * cdef SIZE_t n_known_constants = n_constant_features[0] # <<<<<<<<<<<<<< @@ -10431,7 +9249,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_n_known_constants = (__pyx_v_n_constant_features[0]); - /* "sklearn/tree/_splitter.pyx":1401 + /* "sklearn/tree/_splitter.pyx":1209 * cdef SIZE_t n_known_constants = n_constant_features[0] * # n_total_constants = n_known_constants + n_found_constants * cdef SIZE_t n_total_constants = n_known_constants # <<<<<<<<<<<<<< @@ -10440,7 +9258,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_n_total_constants = __pyx_v_n_known_constants; - /* "sklearn/tree/_splitter.pyx":1406 + /* "sklearn/tree/_splitter.pyx":1214 * cdef SIZE_t p_next * cdef SIZE_t p_prev * cdef bint is_samples_sorted = 0 # indicate is sorted_samples is # <<<<<<<<<<<<<< @@ -10449,7 +9267,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_is_samples_sorted = 0; - /* "sklearn/tree/_splitter.pyx":1423 + /* "sklearn/tree/_splitter.pyx":1231 * # newly discovered constant features to spare computation on descendant * # nodes. * while (f_i > n_total_constants and # Stop early if remaining features # <<<<<<<<<<<<<< @@ -10464,7 +9282,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st goto __pyx_L5_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":1425 + /* "sklearn/tree/_splitter.pyx":1233 * while (f_i > n_total_constants and # Stop early if remaining features * # are constant * (n_visited_features < max_features or # <<<<<<<<<<<<<< @@ -10478,7 +9296,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st goto __pyx_L5_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":1427 + /* "sklearn/tree/_splitter.pyx":1235 * (n_visited_features < max_features or * # At least one drawn features must be non constant * n_visited_features <= n_found_constants + n_drawn_constants)): # <<<<<<<<<<<<<< @@ -10490,7 +9308,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_L5_bool_binop_done:; if (!__pyx_t_6) break; - /* "sklearn/tree/_splitter.pyx":1429 + /* "sklearn/tree/_splitter.pyx":1237 * n_visited_features <= n_found_constants + n_drawn_constants)): * * n_visited_features += 1 # <<<<<<<<<<<<<< @@ -10499,7 +9317,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_n_visited_features = (__pyx_v_n_visited_features + 1); - /* "sklearn/tree/_splitter.pyx":1443 + /* "sklearn/tree/_splitter.pyx":1251 * * # Draw a feature at random * f_j = rand_int(n_drawn_constants, f_i - n_found_constants, # <<<<<<<<<<<<<< @@ -10508,7 +9326,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_f_j = __pyx_f_7sklearn_4tree_6_utils_rand_int(__pyx_v_n_drawn_constants, (__pyx_v_f_i - __pyx_v_n_found_constants), __pyx_v_random_state); - /* "sklearn/tree/_splitter.pyx":1446 + /* "sklearn/tree/_splitter.pyx":1254 * random_state) * * if f_j < n_known_constants: # <<<<<<<<<<<<<< @@ -10518,7 +9336,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_6 = ((__pyx_v_f_j < __pyx_v_n_known_constants) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1448 + /* "sklearn/tree/_splitter.pyx":1256 * if f_j < n_known_constants: * # f_j in the interval [n_drawn_constants, n_known_constants[ * tmp = features[f_j] # <<<<<<<<<<<<<< @@ -10527,7 +9345,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_tmp = (__pyx_v_features[__pyx_v_f_j]); - /* "sklearn/tree/_splitter.pyx":1449 + /* "sklearn/tree/_splitter.pyx":1257 * # f_j in the interval [n_drawn_constants, n_known_constants[ * tmp = features[f_j] * features[f_j] = features[n_drawn_constants] # <<<<<<<<<<<<<< @@ -10536,7 +9354,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ (__pyx_v_features[__pyx_v_f_j]) = (__pyx_v_features[__pyx_v_n_drawn_constants]); - /* "sklearn/tree/_splitter.pyx":1450 + /* "sklearn/tree/_splitter.pyx":1258 * tmp = features[f_j] * features[f_j] = features[n_drawn_constants] * features[n_drawn_constants] = tmp # <<<<<<<<<<<<<< @@ -10545,7 +9363,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ (__pyx_v_features[__pyx_v_n_drawn_constants]) = __pyx_v_tmp; - /* "sklearn/tree/_splitter.pyx":1452 + /* "sklearn/tree/_splitter.pyx":1260 * features[n_drawn_constants] = tmp * * n_drawn_constants += 1 # <<<<<<<<<<<<<< @@ -10557,7 +9375,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st } /*else*/ { - /* "sklearn/tree/_splitter.pyx":1456 + /* "sklearn/tree/_splitter.pyx":1264 * else: * # f_j in the interval [n_known_constants, f_i - n_found_constants[ * f_j += n_found_constants # <<<<<<<<<<<<<< @@ -10566,7 +9384,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_f_j = (__pyx_v_f_j + __pyx_v_n_found_constants); - /* "sklearn/tree/_splitter.pyx":1459 + /* "sklearn/tree/_splitter.pyx":1267 * # f_j in the interval [n_total_constants, f_i[ * * current.feature = features[f_j] # <<<<<<<<<<<<<< @@ -10575,7 +9393,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_current.feature = (__pyx_v_features[__pyx_v_f_j]); - /* "sklearn/tree/_splitter.pyx":1460 + /* "sklearn/tree/_splitter.pyx":1268 * * current.feature = features[f_j] * self.extract_nnz(current.feature, # <<<<<<<<<<<<<< @@ -10584,7 +9402,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_extract_nnz(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *)__pyx_v_self), __pyx_v_current.feature, (&__pyx_v_end_negative), (&__pyx_v_start_positive), (&__pyx_v_is_samples_sorted)); - /* "sklearn/tree/_splitter.pyx":1465 + /* "sklearn/tree/_splitter.pyx":1273 * * # Sort the positive and negative parts of `Xf` * sort(Xf + start, samples + start, end_negative - start) # <<<<<<<<<<<<<< @@ -10593,7 +9411,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_f_7sklearn_4tree_9_splitter_sort((__pyx_v_Xf + __pyx_v_start), (__pyx_v_samples + __pyx_v_start), (__pyx_v_end_negative - __pyx_v_start)); - /* "sklearn/tree/_splitter.pyx":1466 + /* "sklearn/tree/_splitter.pyx":1274 * # Sort the positive and negative parts of `Xf` * sort(Xf + start, samples + start, end_negative - start) * sort(Xf + start_positive, samples + start_positive, # <<<<<<<<<<<<<< @@ -10602,7 +9420,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_f_7sklearn_4tree_9_splitter_sort((__pyx_v_Xf + __pyx_v_start_positive), (__pyx_v_samples + __pyx_v_start_positive), (__pyx_v_end - __pyx_v_start_positive)); - /* "sklearn/tree/_splitter.pyx":1470 + /* "sklearn/tree/_splitter.pyx":1278 * * # Update index_to_samples to take into account the sort * for p in range(start, end_negative): # <<<<<<<<<<<<<< @@ -10613,7 +9431,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st for (__pyx_t_8 = __pyx_v_start; __pyx_t_8 < __pyx_t_2; __pyx_t_8+=1) { __pyx_v_p = __pyx_t_8; - /* "sklearn/tree/_splitter.pyx":1471 + /* "sklearn/tree/_splitter.pyx":1279 * # Update index_to_samples to take into account the sort * for p in range(start, end_negative): * index_to_samples[samples[p]] = p # <<<<<<<<<<<<<< @@ -10623,7 +9441,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st (__pyx_v_index_to_samples[(__pyx_v_samples[__pyx_v_p])]) = __pyx_v_p; } - /* "sklearn/tree/_splitter.pyx":1472 + /* "sklearn/tree/_splitter.pyx":1280 * for p in range(start, end_negative): * index_to_samples[samples[p]] = p * for p in range(start_positive, end): # <<<<<<<<<<<<<< @@ -10634,7 +9452,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st for (__pyx_t_8 = __pyx_v_start_positive; __pyx_t_8 < __pyx_t_2; __pyx_t_8+=1) { __pyx_v_p = __pyx_t_8; - /* "sklearn/tree/_splitter.pyx":1473 + /* "sklearn/tree/_splitter.pyx":1281 * index_to_samples[samples[p]] = p * for p in range(start_positive, end): * index_to_samples[samples[p]] = p # <<<<<<<<<<<<<< @@ -10644,7 +9462,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st (__pyx_v_index_to_samples[(__pyx_v_samples[__pyx_v_p])]) = __pyx_v_p; } - /* "sklearn/tree/_splitter.pyx":1476 + /* "sklearn/tree/_splitter.pyx":1284 * * # Add one or two zeros in Xf, if there is any * if end_negative < start_positive: # <<<<<<<<<<<<<< @@ -10654,7 +9472,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_6 = ((__pyx_v_end_negative < __pyx_v_start_positive) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1477 + /* "sklearn/tree/_splitter.pyx":1285 * # Add one or two zeros in Xf, if there is any * if end_negative < start_positive: * start_positive -= 1 # <<<<<<<<<<<<<< @@ -10663,7 +9481,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_start_positive = (__pyx_v_start_positive - 1); - /* "sklearn/tree/_splitter.pyx":1478 + /* "sklearn/tree/_splitter.pyx":1286 * if end_negative < start_positive: * start_positive -= 1 * Xf[start_positive] = 0. # <<<<<<<<<<<<<< @@ -10672,7 +9490,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ (__pyx_v_Xf[__pyx_v_start_positive]) = 0.; - /* "sklearn/tree/_splitter.pyx":1480 + /* "sklearn/tree/_splitter.pyx":1288 * Xf[start_positive] = 0. * * if end_negative != start_positive: # <<<<<<<<<<<<<< @@ -10682,7 +9500,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_6 = ((__pyx_v_end_negative != __pyx_v_start_positive) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1481 + /* "sklearn/tree/_splitter.pyx":1289 * * if end_negative != start_positive: * Xf[end_negative] = 0. # <<<<<<<<<<<<<< @@ -10691,7 +9509,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ (__pyx_v_Xf[__pyx_v_end_negative]) = 0.; - /* "sklearn/tree/_splitter.pyx":1482 + /* "sklearn/tree/_splitter.pyx":1290 * if end_negative != start_positive: * Xf[end_negative] = 0. * end_negative += 1 # <<<<<<<<<<<<<< @@ -10706,7 +9524,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st } __pyx_L13:; - /* "sklearn/tree/_splitter.pyx":1484 + /* "sklearn/tree/_splitter.pyx":1292 * end_negative += 1 * * if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: # <<<<<<<<<<<<<< @@ -10716,7 +9534,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_6 = (((__pyx_v_Xf[(__pyx_v_end - 1)]) <= ((__pyx_v_Xf[__pyx_v_start]) + __pyx_v_7sklearn_4tree_9_splitter_FEATURE_THRESHOLD)) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1485 + /* "sklearn/tree/_splitter.pyx":1293 * * if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: * features[f_j] = features[n_total_constants] # <<<<<<<<<<<<<< @@ -10725,7 +9543,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ (__pyx_v_features[__pyx_v_f_j]) = (__pyx_v_features[__pyx_v_n_total_constants]); - /* "sklearn/tree/_splitter.pyx":1486 + /* "sklearn/tree/_splitter.pyx":1294 * if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: * features[f_j] = features[n_total_constants] * features[n_total_constants] = current.feature # <<<<<<<<<<<<<< @@ -10735,7 +9553,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_2 = __pyx_v_current.feature; (__pyx_v_features[__pyx_v_n_total_constants]) = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1488 + /* "sklearn/tree/_splitter.pyx":1296 * features[n_total_constants] = current.feature * * n_found_constants += 1 # <<<<<<<<<<<<<< @@ -10744,7 +9562,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_n_found_constants = (__pyx_v_n_found_constants + 1); - /* "sklearn/tree/_splitter.pyx":1489 + /* "sklearn/tree/_splitter.pyx":1297 * * n_found_constants += 1 * n_total_constants += 1 # <<<<<<<<<<<<<< @@ -10756,7 +9574,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st } /*else*/ { - /* "sklearn/tree/_splitter.pyx":1492 + /* "sklearn/tree/_splitter.pyx":1300 * * else: * f_i -= 1 # <<<<<<<<<<<<<< @@ -10765,7 +9583,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_f_i = (__pyx_v_f_i - 1); - /* "sklearn/tree/_splitter.pyx":1493 + /* "sklearn/tree/_splitter.pyx":1301 * else: * f_i -= 1 * features[f_i], features[f_j] = features[f_j], features[f_i] # <<<<<<<<<<<<<< @@ -10777,7 +9595,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st (__pyx_v_features[__pyx_v_f_i]) = __pyx_t_2; (__pyx_v_features[__pyx_v_f_j]) = __pyx_t_8; - /* "sklearn/tree/_splitter.pyx":1496 + /* "sklearn/tree/_splitter.pyx":1304 * * # Evaluate all splits * self.criterion.reset() # <<<<<<<<<<<<<< @@ -10786,7 +9604,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->reset(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":1497 + /* "sklearn/tree/_splitter.pyx":1305 * # Evaluate all splits * self.criterion.reset() * p = start # <<<<<<<<<<<<<< @@ -10795,7 +9613,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_p = __pyx_v_start; - /* "sklearn/tree/_splitter.pyx":1499 + /* "sklearn/tree/_splitter.pyx":1307 * p = start * * while p < end: # <<<<<<<<<<<<<< @@ -10806,7 +9624,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_6 = ((__pyx_v_p < __pyx_v_end) != 0); if (!__pyx_t_6) break; - /* "sklearn/tree/_splitter.pyx":1500 + /* "sklearn/tree/_splitter.pyx":1308 * * while p < end: * if p + 1 != end_negative: # <<<<<<<<<<<<<< @@ -10816,7 +9634,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_6 = (((__pyx_v_p + 1) != __pyx_v_end_negative) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1501 + /* "sklearn/tree/_splitter.pyx":1309 * while p < end: * if p + 1 != end_negative: * p_next = p + 1 # <<<<<<<<<<<<<< @@ -10828,7 +9646,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st } /*else*/ { - /* "sklearn/tree/_splitter.pyx":1503 + /* "sklearn/tree/_splitter.pyx":1311 * p_next = p + 1 * else: * p_next = start_positive # <<<<<<<<<<<<<< @@ -10839,7 +9657,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st } __pyx_L18:; - /* "sklearn/tree/_splitter.pyx":1505 + /* "sklearn/tree/_splitter.pyx":1313 * p_next = start_positive * * while (p_next < end and # <<<<<<<<<<<<<< @@ -10854,7 +9672,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st goto __pyx_L21_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":1506 + /* "sklearn/tree/_splitter.pyx":1314 * * while (p_next < end and * Xf[p_next] <= Xf[p] + FEATURE_THRESHOLD): # <<<<<<<<<<<<<< @@ -10866,7 +9684,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_L21_bool_binop_done:; if (!__pyx_t_6) break; - /* "sklearn/tree/_splitter.pyx":1507 + /* "sklearn/tree/_splitter.pyx":1315 * while (p_next < end and * Xf[p_next] <= Xf[p] + FEATURE_THRESHOLD): * p = p_next # <<<<<<<<<<<<<< @@ -10875,7 +9693,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_p = __pyx_v_p_next; - /* "sklearn/tree/_splitter.pyx":1508 + /* "sklearn/tree/_splitter.pyx":1316 * Xf[p_next] <= Xf[p] + FEATURE_THRESHOLD): * p = p_next * if p + 1 != end_negative: # <<<<<<<<<<<<<< @@ -10885,7 +9703,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_6 = (((__pyx_v_p + 1) != __pyx_v_end_negative) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1509 + /* "sklearn/tree/_splitter.pyx":1317 * p = p_next * if p + 1 != end_negative: * p_next = p + 1 # <<<<<<<<<<<<<< @@ -10897,7 +9715,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st } /*else*/ { - /* "sklearn/tree/_splitter.pyx":1511 + /* "sklearn/tree/_splitter.pyx":1319 * p_next = p + 1 * else: * p_next = start_positive # <<<<<<<<<<<<<< @@ -10909,7 +9727,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_L23:; } - /* "sklearn/tree/_splitter.pyx":1516 + /* "sklearn/tree/_splitter.pyx":1324 * # (p_next >= end) or (X[samples[p_next], current.feature] > * # X[samples[p], current.feature]) * p_prev = p # <<<<<<<<<<<<<< @@ -10918,7 +9736,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_p_prev = __pyx_v_p; - /* "sklearn/tree/_splitter.pyx":1517 + /* "sklearn/tree/_splitter.pyx":1325 * # X[samples[p], current.feature]) * p_prev = p * p = p_next # <<<<<<<<<<<<<< @@ -10927,7 +9745,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_p = __pyx_v_p_next; - /* "sklearn/tree/_splitter.pyx":1522 + /* "sklearn/tree/_splitter.pyx":1330 * * * if p < end: # <<<<<<<<<<<<<< @@ -10937,7 +9755,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_6 = ((__pyx_v_p < __pyx_v_end) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1523 + /* "sklearn/tree/_splitter.pyx":1331 * * if p < end: * current.pos = p # <<<<<<<<<<<<<< @@ -10946,7 +9764,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_current.pos = __pyx_v_p; - /* "sklearn/tree/_splitter.pyx":1526 + /* "sklearn/tree/_splitter.pyx":1334 * * # Reject if min_samples_leaf is not guaranteed * if (((current.pos - start) < min_samples_leaf) or # <<<<<<<<<<<<<< @@ -10960,7 +9778,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st goto __pyx_L26_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":1527 + /* "sklearn/tree/_splitter.pyx":1335 * # Reject if min_samples_leaf is not guaranteed * if (((current.pos - start) < min_samples_leaf) or * ((end - current.pos) < min_samples_leaf)): # <<<<<<<<<<<<<< @@ -10972,7 +9790,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_L26_bool_binop_done:; if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1528 + /* "sklearn/tree/_splitter.pyx":1336 * if (((current.pos - start) < min_samples_leaf) or * ((end - current.pos) < min_samples_leaf)): * continue # <<<<<<<<<<<<<< @@ -10982,7 +9800,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st goto __pyx_L16_continue; } - /* "sklearn/tree/_splitter.pyx":1530 + /* "sklearn/tree/_splitter.pyx":1338 * continue * * self.criterion.update(current.pos) # <<<<<<<<<<<<<< @@ -10991,7 +9809,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->update(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_current.pos); - /* "sklearn/tree/_splitter.pyx":1533 + /* "sklearn/tree/_splitter.pyx":1341 * * # Reject if min_weight_leaf is not satisfied * if ((self.criterion.weighted_n_left < min_weight_leaf) or # <<<<<<<<<<<<<< @@ -11005,7 +9823,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st goto __pyx_L29_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":1534 + /* "sklearn/tree/_splitter.pyx":1342 * # Reject if min_weight_leaf is not satisfied * if ((self.criterion.weighted_n_left < min_weight_leaf) or * (self.criterion.weighted_n_right < min_weight_leaf)): # <<<<<<<<<<<<<< @@ -11017,7 +9835,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_L29_bool_binop_done:; if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1535 + /* "sklearn/tree/_splitter.pyx":1343 * if ((self.criterion.weighted_n_left < min_weight_leaf) or * (self.criterion.weighted_n_right < min_weight_leaf)): * continue # <<<<<<<<<<<<<< @@ -11027,7 +9845,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st goto __pyx_L16_continue; } - /* "sklearn/tree/_splitter.pyx":1537 + /* "sklearn/tree/_splitter.pyx":1345 * continue * * current_proxy_improvement = self.criterion.proxy_impurity_improvement() # <<<<<<<<<<<<<< @@ -11036,7 +9854,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_current_proxy_improvement = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->proxy_impurity_improvement(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":1539 + /* "sklearn/tree/_splitter.pyx":1347 * current_proxy_improvement = self.criterion.proxy_impurity_improvement() * * if current_proxy_improvement > best_proxy_improvement: # <<<<<<<<<<<<<< @@ -11046,7 +9864,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_6 = ((__pyx_v_current_proxy_improvement > __pyx_v_best_proxy_improvement) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1540 + /* "sklearn/tree/_splitter.pyx":1348 * * if current_proxy_improvement > best_proxy_improvement: * best_proxy_improvement = current_proxy_improvement # <<<<<<<<<<<<<< @@ -11055,7 +9873,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_best_proxy_improvement = __pyx_v_current_proxy_improvement; - /* "sklearn/tree/_splitter.pyx":1542 + /* "sklearn/tree/_splitter.pyx":1350 * best_proxy_improvement = current_proxy_improvement * * current.threshold = (Xf[p_prev] + Xf[p]) / 2.0 # <<<<<<<<<<<<<< @@ -11064,7 +9882,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_current.threshold = (((__pyx_v_Xf[__pyx_v_p_prev]) + (__pyx_v_Xf[__pyx_v_p])) / 2.0); - /* "sklearn/tree/_splitter.pyx":1543 + /* "sklearn/tree/_splitter.pyx":1351 * * current.threshold = (Xf[p_prev] + Xf[p]) / 2.0 * if current.threshold == Xf[p]: # <<<<<<<<<<<<<< @@ -11074,7 +9892,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_6 = ((__pyx_v_current.threshold == (__pyx_v_Xf[__pyx_v_p])) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1544 + /* "sklearn/tree/_splitter.pyx":1352 * current.threshold = (Xf[p_prev] + Xf[p]) / 2.0 * if current.threshold == Xf[p]: * current.threshold = Xf[p_prev] # <<<<<<<<<<<<<< @@ -11086,7 +9904,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st } __pyx_L32:; - /* "sklearn/tree/_splitter.pyx":1546 + /* "sklearn/tree/_splitter.pyx":1354 * current.threshold = Xf[p_prev] * * best = current # <<<<<<<<<<<<<< @@ -11108,7 +9926,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_L8:; } - /* "sklearn/tree/_splitter.pyx":1549 + /* "sklearn/tree/_splitter.pyx":1357 * * # Reorganize into samples[start:best.pos] + samples[best.pos:end] * if best.pos < end: # <<<<<<<<<<<<<< @@ -11118,7 +9936,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st __pyx_t_6 = ((__pyx_v_best.pos < __pyx_v_end) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1550 + /* "sklearn/tree/_splitter.pyx":1358 * # Reorganize into samples[start:best.pos] + samples[best.pos:end] * if best.pos < end: * self.extract_nnz(best.feature, &end_negative, &start_positive, # <<<<<<<<<<<<<< @@ -11127,7 +9945,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_extract_nnz(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *)__pyx_v_self), __pyx_v_best.feature, (&__pyx_v_end_negative), (&__pyx_v_start_positive), (&__pyx_v_is_samples_sorted)); - /* "sklearn/tree/_splitter.pyx":1553 + /* "sklearn/tree/_splitter.pyx":1361 * &is_samples_sorted) * * self._partition(best.threshold, end_negative, start_positive, # <<<<<<<<<<<<<< @@ -11136,7 +9954,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter__partition(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *)__pyx_v_self), __pyx_v_best.threshold, __pyx_v_end_negative, __pyx_v_start_positive, __pyx_v_best.pos); - /* "sklearn/tree/_splitter.pyx":1556 + /* "sklearn/tree/_splitter.pyx":1364 * best.pos) * * self.criterion.reset() # <<<<<<<<<<<<<< @@ -11145,7 +9963,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->reset(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":1557 + /* "sklearn/tree/_splitter.pyx":1365 * * self.criterion.reset() * self.criterion.update(best.pos) # <<<<<<<<<<<<<< @@ -11154,7 +9972,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->update(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_best.pos); - /* "sklearn/tree/_splitter.pyx":1558 + /* "sklearn/tree/_splitter.pyx":1366 * self.criterion.reset() * self.criterion.update(best.pos) * best.improvement = self.criterion.impurity_improvement(impurity) # <<<<<<<<<<<<<< @@ -11163,7 +9981,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ __pyx_v_best.improvement = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->impurity_improvement(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_impurity); - /* "sklearn/tree/_splitter.pyx":1559 + /* "sklearn/tree/_splitter.pyx":1367 * self.criterion.update(best.pos) * best.improvement = self.criterion.impurity_improvement(impurity) * self.criterion.children_impurity(&best.impurity_left, # <<<<<<<<<<<<<< @@ -11175,7 +9993,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st } __pyx_L33:; - /* "sklearn/tree/_splitter.pyx":1565 + /* "sklearn/tree/_splitter.pyx":1373 * # element in features[:n_known_constants] must be preserved for sibling * # and child nodes * memcpy(features, constant_features, sizeof(SIZE_t) * n_known_constants) # <<<<<<<<<<<<<< @@ -11184,7 +10002,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ memcpy(__pyx_v_features, __pyx_v_constant_features, ((sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)) * __pyx_v_n_known_constants)); - /* "sklearn/tree/_splitter.pyx":1568 + /* "sklearn/tree/_splitter.pyx":1376 * * # Copy newly found constant features * memcpy(constant_features + n_known_constants, # <<<<<<<<<<<<<< @@ -11193,7 +10011,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ memcpy((__pyx_v_constant_features + __pyx_v_n_known_constants), (__pyx_v_features + __pyx_v_n_known_constants), ((sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)) * __pyx_v_n_found_constants)); - /* "sklearn/tree/_splitter.pyx":1573 + /* "sklearn/tree/_splitter.pyx":1381 * * # Return values * split[0] = best # <<<<<<<<<<<<<< @@ -11202,7 +10020,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ (__pyx_v_split[0]) = __pyx_v_best; - /* "sklearn/tree/_splitter.pyx":1574 + /* "sklearn/tree/_splitter.pyx":1382 * # Return values * split[0] = best * n_constant_features[0] = n_total_constants # <<<<<<<<<<<<<< @@ -11211,8 +10029,8 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st */ (__pyx_v_n_constant_features[0]) = __pyx_v_n_total_constants; - /* "sklearn/tree/_splitter.pyx":1361 - * self.random_state), self.__getstate__()) + /* "sklearn/tree/_splitter.pyx":1169 + * self.presort), self.__getstate__()) * * cdef void node_split(self, double impurity, SplitRecord* split, # <<<<<<<<<<<<<< * SIZE_t* n_constant_features) nogil: @@ -11222,7 +10040,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split(st /* function exit code */ } -/* "sklearn/tree/_splitter.pyx":1580 +/* "sklearn/tree/_splitter.pyx":1388 * """Splitter for finding a random split, using the sparse data.""" * * def __reduce__(self): # <<<<<<<<<<<<<< @@ -11250,12 +10068,13 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_20RandomSparseSplitter___red PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); - /* "sklearn/tree/_splitter.pyx":1581 + /* "sklearn/tree/_splitter.pyx":1389 * * def __reduce__(self): * return (RandomSparseSplitter, (self.criterion, # <<<<<<<<<<<<<< @@ -11264,112 +10083,125 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_20RandomSparseSplitter___red */ __Pyx_XDECREF(__pyx_r); - /* "sklearn/tree/_splitter.pyx":1582 + /* "sklearn/tree/_splitter.pyx":1390 * def __reduce__(self): * return (RandomSparseSplitter, (self.criterion, * self.max_features, # <<<<<<<<<<<<<< * self.min_samples_leaf, * self.min_weight_leaf, */ - __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.max_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1582; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.max_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1390; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - /* "sklearn/tree/_splitter.pyx":1583 + /* "sklearn/tree/_splitter.pyx":1391 * return (RandomSparseSplitter, (self.criterion, * self.max_features, * self.min_samples_leaf, # <<<<<<<<<<<<<< * self.min_weight_leaf, - * self.random_state), self.__getstate__()) + * self.random_state, */ - __pyx_t_2 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1391; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - /* "sklearn/tree/_splitter.pyx":1584 + /* "sklearn/tree/_splitter.pyx":1392 * self.max_features, * self.min_samples_leaf, * self.min_weight_leaf, # <<<<<<<<<<<<<< - * self.random_state), self.__getstate__()) - * + * self.random_state, + * self.presort), self.__getstate__()) */ - __pyx_t_3 = PyFloat_FromDouble(__pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1584; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1392; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - /* "sklearn/tree/_splitter.pyx":1581 + /* "sklearn/tree/_splitter.pyx":1394 + * self.min_weight_leaf, + * self.random_state, + * self.presort), self.__getstate__()) # <<<<<<<<<<<<<< + * + * cdef void node_split(self, double impurity, SplitRecord* split, + */ + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_self->__pyx_base.__pyx_base.presort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "sklearn/tree/_splitter.pyx":1389 * * def __reduce__(self): * return (RandomSparseSplitter, (self.criterion, # <<<<<<<<<<<<<< * self.max_features, * self.min_samples_leaf, */ - __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1581; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1389; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); __Pyx_GIVEREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); - PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); + PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.criterion)); __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_3); __Pyx_INCREF(__pyx_v_self->__pyx_base.__pyx_base.random_state); __Pyx_GIVEREF(__pyx_v_self->__pyx_base.__pyx_base.random_state); - PyTuple_SET_ITEM(__pyx_t_4, 4, __pyx_v_self->__pyx_base.__pyx_base.random_state); + PyTuple_SET_ITEM(__pyx_t_5, 4, __pyx_v_self->__pyx_base.__pyx_base.random_state); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 5, __pyx_t_4); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; + __pyx_t_4 = 0; - /* "sklearn/tree/_splitter.pyx":1585 - * self.min_samples_leaf, + /* "sklearn/tree/_splitter.pyx":1394 * self.min_weight_leaf, - * self.random_state), self.__getstate__()) # <<<<<<<<<<<<<< + * self.random_state, + * self.presort), self.__getstate__()) # <<<<<<<<<<<<<< * * cdef void node_split(self, double impurity, SplitRecord* split, */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_getstate); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = NULL; - if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_1)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_getstate); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); + __Pyx_DECREF_SET(__pyx_t_3, function); } } - if (__pyx_t_1) { - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else { - __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "sklearn/tree/_splitter.pyx":1581 + /* "sklearn/tree/_splitter.pyx":1389 * * def __reduce__(self): * return (RandomSparseSplitter, (self.criterion, # <<<<<<<<<<<<<< * self.max_features, * self.min_samples_leaf, */ - __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1581; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1389; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_RandomSparseSplitter))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_RandomSparseSplitter))); - PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_RandomSparseSplitter))); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_9_splitter_RandomSparseSplitter))); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_4); + __pyx_t_5 = 0; __pyx_t_4 = 0; + __pyx_r = __pyx_t_3; __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; goto __pyx_L0; - /* "sklearn/tree/_splitter.pyx":1580 + /* "sklearn/tree/_splitter.pyx":1388 * """Splitter for finding a random split, using the sparse data.""" * * def __reduce__(self): # <<<<<<<<<<<<<< @@ -11383,6 +10215,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_20RandomSparseSplitter___red __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("sklearn.tree._splitter.RandomSparseSplitter.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; @@ -11391,8 +10224,8 @@ static PyObject *__pyx_pf_7sklearn_4tree_9_splitter_20RandomSparseSplitter___red return __pyx_r; } -/* "sklearn/tree/_splitter.pyx":1587 - * self.random_state), self.__getstate__()) +/* "sklearn/tree/_splitter.pyx":1396 + * self.presort), self.__getstate__()) * * cdef void node_split(self, double impurity, SplitRecord* split, # <<<<<<<<<<<<<< * SIZE_t* n_constant_features) nogil: @@ -11444,7 +10277,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( int __pyx_t_7; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_8; - /* "sklearn/tree/_splitter.pyx":1593 + /* "sklearn/tree/_splitter.pyx":1402 * """ * # Find the best split * cdef SIZE_t* samples = self.samples # <<<<<<<<<<<<<< @@ -11454,7 +10287,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.samples; __pyx_v_samples = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1594 + /* "sklearn/tree/_splitter.pyx":1403 * # Find the best split * cdef SIZE_t* samples = self.samples * cdef SIZE_t start = self.start # <<<<<<<<<<<<<< @@ -11464,7 +10297,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.start; __pyx_v_start = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1595 + /* "sklearn/tree/_splitter.pyx":1404 * cdef SIZE_t* samples = self.samples * cdef SIZE_t start = self.start * cdef SIZE_t end = self.end # <<<<<<<<<<<<<< @@ -11474,7 +10307,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.end; __pyx_v_end = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1597 + /* "sklearn/tree/_splitter.pyx":1406 * cdef SIZE_t end = self.end * * cdef INT32_t* X_indices = self.X_indices # <<<<<<<<<<<<<< @@ -11484,7 +10317,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_3 = __pyx_v_self->__pyx_base.X_indices; __pyx_v_X_indices = __pyx_t_3; - /* "sklearn/tree/_splitter.pyx":1598 + /* "sklearn/tree/_splitter.pyx":1407 * * cdef INT32_t* X_indices = self.X_indices * cdef INT32_t* X_indptr = self.X_indptr # <<<<<<<<<<<<<< @@ -11494,7 +10327,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_3 = __pyx_v_self->__pyx_base.X_indptr; __pyx_v_X_indptr = __pyx_t_3; - /* "sklearn/tree/_splitter.pyx":1599 + /* "sklearn/tree/_splitter.pyx":1408 * cdef INT32_t* X_indices = self.X_indices * cdef INT32_t* X_indptr = self.X_indptr * cdef DTYPE_t* X_data = self.X_data # <<<<<<<<<<<<<< @@ -11504,7 +10337,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_4 = __pyx_v_self->__pyx_base.X_data; __pyx_v_X_data = __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":1601 + /* "sklearn/tree/_splitter.pyx":1410 * cdef DTYPE_t* X_data = self.X_data * * cdef SIZE_t* features = self.features # <<<<<<<<<<<<<< @@ -11514,7 +10347,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.features; __pyx_v_features = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1602 + /* "sklearn/tree/_splitter.pyx":1411 * * cdef SIZE_t* features = self.features * cdef SIZE_t* constant_features = self.constant_features # <<<<<<<<<<<<<< @@ -11524,7 +10357,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.constant_features; __pyx_v_constant_features = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1603 + /* "sklearn/tree/_splitter.pyx":1412 * cdef SIZE_t* features = self.features * cdef SIZE_t* constant_features = self.constant_features * cdef SIZE_t n_features = self.n_features # <<<<<<<<<<<<<< @@ -11534,7 +10367,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.n_features; __pyx_v_n_features = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1605 + /* "sklearn/tree/_splitter.pyx":1414 * cdef SIZE_t n_features = self.n_features * * cdef DTYPE_t* Xf = self.feature_values # <<<<<<<<<<<<<< @@ -11544,7 +10377,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_4 = __pyx_v_self->__pyx_base.__pyx_base.feature_values; __pyx_v_Xf = __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":1606 + /* "sklearn/tree/_splitter.pyx":1415 * * cdef DTYPE_t* Xf = self.feature_values * cdef SIZE_t* sorted_samples = self.sorted_samples # <<<<<<<<<<<<<< @@ -11554,7 +10387,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_1 = __pyx_v_self->__pyx_base.sorted_samples; __pyx_v_sorted_samples = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1607 + /* "sklearn/tree/_splitter.pyx":1416 * cdef DTYPE_t* Xf = self.feature_values * cdef SIZE_t* sorted_samples = self.sorted_samples * cdef SIZE_t* index_to_samples = self.index_to_samples # <<<<<<<<<<<<<< @@ -11564,7 +10397,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_1 = __pyx_v_self->__pyx_base.index_to_samples; __pyx_v_index_to_samples = __pyx_t_1; - /* "sklearn/tree/_splitter.pyx":1608 + /* "sklearn/tree/_splitter.pyx":1417 * cdef SIZE_t* sorted_samples = self.sorted_samples * cdef SIZE_t* index_to_samples = self.index_to_samples * cdef SIZE_t max_features = self.max_features # <<<<<<<<<<<<<< @@ -11574,7 +10407,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.max_features; __pyx_v_max_features = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1609 + /* "sklearn/tree/_splitter.pyx":1418 * cdef SIZE_t* index_to_samples = self.index_to_samples * cdef SIZE_t max_features = self.max_features * cdef SIZE_t min_samples_leaf = self.min_samples_leaf # <<<<<<<<<<<<<< @@ -11584,7 +10417,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.min_samples_leaf; __pyx_v_min_samples_leaf = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1610 + /* "sklearn/tree/_splitter.pyx":1419 * cdef SIZE_t max_features = self.max_features * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf # <<<<<<<<<<<<<< @@ -11594,7 +10427,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_5 = __pyx_v_self->__pyx_base.__pyx_base.min_weight_leaf; __pyx_v_min_weight_leaf = __pyx_t_5; - /* "sklearn/tree/_splitter.pyx":1611 + /* "sklearn/tree/_splitter.pyx":1420 * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf * cdef UINT32_t* random_state = &self.rand_r_state # <<<<<<<<<<<<<< @@ -11603,7 +10436,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_random_state = (&__pyx_v_self->__pyx_base.__pyx_base.rand_r_state); - /* "sklearn/tree/_splitter.pyx":1614 + /* "sklearn/tree/_splitter.pyx":1423 * * cdef SplitRecord best, current * _init_split(&best, end) # <<<<<<<<<<<<<< @@ -11612,7 +10445,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_f_7sklearn_4tree_9_splitter__init_split((&__pyx_v_best), __pyx_v_end); - /* "sklearn/tree/_splitter.pyx":1615 + /* "sklearn/tree/_splitter.pyx":1424 * cdef SplitRecord best, current * _init_split(&best, end) * cdef double current_proxy_improvement = - INFINITY # <<<<<<<<<<<<<< @@ -11621,7 +10454,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_current_proxy_improvement = (-__pyx_v_7sklearn_4tree_9_splitter_INFINITY); - /* "sklearn/tree/_splitter.pyx":1616 + /* "sklearn/tree/_splitter.pyx":1425 * _init_split(&best, end) * cdef double current_proxy_improvement = - INFINITY * cdef double best_proxy_improvement = - INFINITY # <<<<<<<<<<<<<< @@ -11630,7 +10463,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_best_proxy_improvement = (-__pyx_v_7sklearn_4tree_9_splitter_INFINITY); - /* "sklearn/tree/_splitter.pyx":1620 + /* "sklearn/tree/_splitter.pyx":1429 * cdef DTYPE_t current_feature_value * * cdef SIZE_t f_i = n_features # <<<<<<<<<<<<<< @@ -11639,7 +10472,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_f_i = __pyx_v_n_features; - /* "sklearn/tree/_splitter.pyx":1622 + /* "sklearn/tree/_splitter.pyx":1431 * cdef SIZE_t f_i = n_features * cdef SIZE_t f_j, p, tmp * cdef SIZE_t n_visited_features = 0 # <<<<<<<<<<<<<< @@ -11648,7 +10481,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_n_visited_features = 0; - /* "sklearn/tree/_splitter.pyx":1624 + /* "sklearn/tree/_splitter.pyx":1433 * cdef SIZE_t n_visited_features = 0 * # Number of features discovered to be constant during the split search * cdef SIZE_t n_found_constants = 0 # <<<<<<<<<<<<<< @@ -11657,7 +10490,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_n_found_constants = 0; - /* "sklearn/tree/_splitter.pyx":1626 + /* "sklearn/tree/_splitter.pyx":1435 * cdef SIZE_t n_found_constants = 0 * # Number of features known to be constant and drawn without replacement * cdef SIZE_t n_drawn_constants = 0 # <<<<<<<<<<<<<< @@ -11666,7 +10499,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_n_drawn_constants = 0; - /* "sklearn/tree/_splitter.pyx":1627 + /* "sklearn/tree/_splitter.pyx":1436 * # Number of features known to be constant and drawn without replacement * cdef SIZE_t n_drawn_constants = 0 * cdef SIZE_t n_known_constants = n_constant_features[0] # <<<<<<<<<<<<<< @@ -11675,7 +10508,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_n_known_constants = (__pyx_v_n_constant_features[0]); - /* "sklearn/tree/_splitter.pyx":1629 + /* "sklearn/tree/_splitter.pyx":1438 * cdef SIZE_t n_known_constants = n_constant_features[0] * # n_total_constants = n_known_constants + n_found_constants * cdef SIZE_t n_total_constants = n_known_constants # <<<<<<<<<<<<<< @@ -11684,7 +10517,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_n_total_constants = __pyx_v_n_known_constants; - /* "sklearn/tree/_splitter.pyx":1635 + /* "sklearn/tree/_splitter.pyx":1444 * cdef DTYPE_t max_feature_value * * cdef bint is_samples_sorted = 0 # indicate that sorted_samples is # <<<<<<<<<<<<<< @@ -11693,7 +10526,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_is_samples_sorted = 0; - /* "sklearn/tree/_splitter.pyx":1652 + /* "sklearn/tree/_splitter.pyx":1461 * # newly discovered constant features to spare computation on descendant * # nodes. * while (f_i > n_total_constants and # Stop early if remaining features # <<<<<<<<<<<<<< @@ -11708,7 +10541,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( goto __pyx_L5_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":1654 + /* "sklearn/tree/_splitter.pyx":1463 * while (f_i > n_total_constants and # Stop early if remaining features * # are constant * (n_visited_features < max_features or # <<<<<<<<<<<<<< @@ -11722,7 +10555,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( goto __pyx_L5_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":1656 + /* "sklearn/tree/_splitter.pyx":1465 * (n_visited_features < max_features or * # At least one drawn features must be non constant * n_visited_features <= n_found_constants + n_drawn_constants)): # <<<<<<<<<<<<<< @@ -11734,7 +10567,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_L5_bool_binop_done:; if (!__pyx_t_6) break; - /* "sklearn/tree/_splitter.pyx":1658 + /* "sklearn/tree/_splitter.pyx":1467 * n_visited_features <= n_found_constants + n_drawn_constants)): * * n_visited_features += 1 # <<<<<<<<<<<<<< @@ -11743,7 +10576,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_n_visited_features = (__pyx_v_n_visited_features + 1); - /* "sklearn/tree/_splitter.pyx":1672 + /* "sklearn/tree/_splitter.pyx":1481 * * # Draw a feature at random * f_j = rand_int(n_drawn_constants, f_i - n_found_constants, # <<<<<<<<<<<<<< @@ -11752,7 +10585,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_f_j = __pyx_f_7sklearn_4tree_6_utils_rand_int(__pyx_v_n_drawn_constants, (__pyx_v_f_i - __pyx_v_n_found_constants), __pyx_v_random_state); - /* "sklearn/tree/_splitter.pyx":1675 + /* "sklearn/tree/_splitter.pyx":1484 * random_state) * * if f_j < n_known_constants: # <<<<<<<<<<<<<< @@ -11762,7 +10595,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_f_j < __pyx_v_n_known_constants) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1677 + /* "sklearn/tree/_splitter.pyx":1486 * if f_j < n_known_constants: * # f_j in the interval [n_drawn_constants, n_known_constants[ * tmp = features[f_j] # <<<<<<<<<<<<<< @@ -11771,7 +10604,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_tmp = (__pyx_v_features[__pyx_v_f_j]); - /* "sklearn/tree/_splitter.pyx":1678 + /* "sklearn/tree/_splitter.pyx":1487 * # f_j in the interval [n_drawn_constants, n_known_constants[ * tmp = features[f_j] * features[f_j] = features[n_drawn_constants] # <<<<<<<<<<<<<< @@ -11780,7 +10613,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ (__pyx_v_features[__pyx_v_f_j]) = (__pyx_v_features[__pyx_v_n_drawn_constants]); - /* "sklearn/tree/_splitter.pyx":1679 + /* "sklearn/tree/_splitter.pyx":1488 * tmp = features[f_j] * features[f_j] = features[n_drawn_constants] * features[n_drawn_constants] = tmp # <<<<<<<<<<<<<< @@ -11789,7 +10622,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ (__pyx_v_features[__pyx_v_n_drawn_constants]) = __pyx_v_tmp; - /* "sklearn/tree/_splitter.pyx":1681 + /* "sklearn/tree/_splitter.pyx":1490 * features[n_drawn_constants] = tmp * * n_drawn_constants += 1 # <<<<<<<<<<<<<< @@ -11801,7 +10634,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( } /*else*/ { - /* "sklearn/tree/_splitter.pyx":1685 + /* "sklearn/tree/_splitter.pyx":1494 * else: * # f_j in the interval [n_known_constants, f_i - n_found_constants[ * f_j += n_found_constants # <<<<<<<<<<<<<< @@ -11810,7 +10643,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_f_j = (__pyx_v_f_j + __pyx_v_n_found_constants); - /* "sklearn/tree/_splitter.pyx":1688 + /* "sklearn/tree/_splitter.pyx":1497 * # f_j in the interval [n_total_constants, f_i[ * * current.feature = features[f_j] # <<<<<<<<<<<<<< @@ -11819,7 +10652,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_current.feature = (__pyx_v_features[__pyx_v_f_j]); - /* "sklearn/tree/_splitter.pyx":1690 + /* "sklearn/tree/_splitter.pyx":1499 * current.feature = features[f_j] * * self.extract_nnz(current.feature, # <<<<<<<<<<<<<< @@ -11828,7 +10661,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_extract_nnz(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *)__pyx_v_self), __pyx_v_current.feature, (&__pyx_v_end_negative), (&__pyx_v_start_positive), (&__pyx_v_is_samples_sorted)); - /* "sklearn/tree/_splitter.pyx":1695 + /* "sklearn/tree/_splitter.pyx":1504 * * # Add one or two zeros in Xf, if there is any * if end_negative < start_positive: # <<<<<<<<<<<<<< @@ -11838,7 +10671,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_end_negative < __pyx_v_start_positive) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1696 + /* "sklearn/tree/_splitter.pyx":1505 * # Add one or two zeros in Xf, if there is any * if end_negative < start_positive: * start_positive -= 1 # <<<<<<<<<<<<<< @@ -11847,7 +10680,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_start_positive = (__pyx_v_start_positive - 1); - /* "sklearn/tree/_splitter.pyx":1697 + /* "sklearn/tree/_splitter.pyx":1506 * if end_negative < start_positive: * start_positive -= 1 * Xf[start_positive] = 0. # <<<<<<<<<<<<<< @@ -11856,7 +10689,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ (__pyx_v_Xf[__pyx_v_start_positive]) = 0.; - /* "sklearn/tree/_splitter.pyx":1699 + /* "sklearn/tree/_splitter.pyx":1508 * Xf[start_positive] = 0. * * if end_negative != start_positive: # <<<<<<<<<<<<<< @@ -11866,7 +10699,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_end_negative != __pyx_v_start_positive) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1700 + /* "sklearn/tree/_splitter.pyx":1509 * * if end_negative != start_positive: * Xf[end_negative] = 0. # <<<<<<<<<<<<<< @@ -11875,7 +10708,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ (__pyx_v_Xf[__pyx_v_end_negative]) = 0.; - /* "sklearn/tree/_splitter.pyx":1701 + /* "sklearn/tree/_splitter.pyx":1510 * if end_negative != start_positive: * Xf[end_negative] = 0. * end_negative += 1 # <<<<<<<<<<<<<< @@ -11890,7 +10723,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( } __pyx_L9:; - /* "sklearn/tree/_splitter.pyx":1704 + /* "sklearn/tree/_splitter.pyx":1513 * * # Find min, max in Xf[start:end_negative] * min_feature_value = Xf[start] # <<<<<<<<<<<<<< @@ -11899,7 +10732,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_min_feature_value = (__pyx_v_Xf[__pyx_v_start]); - /* "sklearn/tree/_splitter.pyx":1705 + /* "sklearn/tree/_splitter.pyx":1514 * # Find min, max in Xf[start:end_negative] * min_feature_value = Xf[start] * max_feature_value = min_feature_value # <<<<<<<<<<<<<< @@ -11908,7 +10741,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_max_feature_value = __pyx_v_min_feature_value; - /* "sklearn/tree/_splitter.pyx":1707 + /* "sklearn/tree/_splitter.pyx":1516 * max_feature_value = min_feature_value * * for p in range(start, end_negative): # <<<<<<<<<<<<<< @@ -11919,7 +10752,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( for (__pyx_t_8 = __pyx_v_start; __pyx_t_8 < __pyx_t_2; __pyx_t_8+=1) { __pyx_v_p = __pyx_t_8; - /* "sklearn/tree/_splitter.pyx":1708 + /* "sklearn/tree/_splitter.pyx":1517 * * for p in range(start, end_negative): * current_feature_value = Xf[p] # <<<<<<<<<<<<<< @@ -11928,7 +10761,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_current_feature_value = (__pyx_v_Xf[__pyx_v_p]); - /* "sklearn/tree/_splitter.pyx":1710 + /* "sklearn/tree/_splitter.pyx":1519 * current_feature_value = Xf[p] * * if current_feature_value < min_feature_value: # <<<<<<<<<<<<<< @@ -11938,7 +10771,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_current_feature_value < __pyx_v_min_feature_value) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1711 + /* "sklearn/tree/_splitter.pyx":1520 * * if current_feature_value < min_feature_value: * min_feature_value = current_feature_value # <<<<<<<<<<<<<< @@ -11949,7 +10782,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( goto __pyx_L13; } - /* "sklearn/tree/_splitter.pyx":1712 + /* "sklearn/tree/_splitter.pyx":1521 * if current_feature_value < min_feature_value: * min_feature_value = current_feature_value * elif current_feature_value > max_feature_value: # <<<<<<<<<<<<<< @@ -11959,7 +10792,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_current_feature_value > __pyx_v_max_feature_value) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1713 + /* "sklearn/tree/_splitter.pyx":1522 * min_feature_value = current_feature_value * elif current_feature_value > max_feature_value: * max_feature_value = current_feature_value # <<<<<<<<<<<<<< @@ -11972,7 +10805,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_L13:; } - /* "sklearn/tree/_splitter.pyx":1716 + /* "sklearn/tree/_splitter.pyx":1525 * * # Update min, max given Xf[start_positive:end] * for p in range(start_positive, end): # <<<<<<<<<<<<<< @@ -11983,7 +10816,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( for (__pyx_t_8 = __pyx_v_start_positive; __pyx_t_8 < __pyx_t_2; __pyx_t_8+=1) { __pyx_v_p = __pyx_t_8; - /* "sklearn/tree/_splitter.pyx":1717 + /* "sklearn/tree/_splitter.pyx":1526 * # Update min, max given Xf[start_positive:end] * for p in range(start_positive, end): * current_feature_value = Xf[p] # <<<<<<<<<<<<<< @@ -11992,7 +10825,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_current_feature_value = (__pyx_v_Xf[__pyx_v_p]); - /* "sklearn/tree/_splitter.pyx":1719 + /* "sklearn/tree/_splitter.pyx":1528 * current_feature_value = Xf[p] * * if current_feature_value < min_feature_value: # <<<<<<<<<<<<<< @@ -12002,7 +10835,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_current_feature_value < __pyx_v_min_feature_value) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1720 + /* "sklearn/tree/_splitter.pyx":1529 * * if current_feature_value < min_feature_value: * min_feature_value = current_feature_value # <<<<<<<<<<<<<< @@ -12013,7 +10846,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( goto __pyx_L16; } - /* "sklearn/tree/_splitter.pyx":1721 + /* "sklearn/tree/_splitter.pyx":1530 * if current_feature_value < min_feature_value: * min_feature_value = current_feature_value * elif current_feature_value > max_feature_value: # <<<<<<<<<<<<<< @@ -12023,7 +10856,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_current_feature_value > __pyx_v_max_feature_value) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1722 + /* "sklearn/tree/_splitter.pyx":1531 * min_feature_value = current_feature_value * elif current_feature_value > max_feature_value: * max_feature_value = current_feature_value # <<<<<<<<<<<<<< @@ -12036,7 +10869,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_L16:; } - /* "sklearn/tree/_splitter.pyx":1724 + /* "sklearn/tree/_splitter.pyx":1533 * max_feature_value = current_feature_value * * if max_feature_value <= min_feature_value + FEATURE_THRESHOLD: # <<<<<<<<<<<<<< @@ -12046,7 +10879,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_max_feature_value <= (__pyx_v_min_feature_value + __pyx_v_7sklearn_4tree_9_splitter_FEATURE_THRESHOLD)) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1725 + /* "sklearn/tree/_splitter.pyx":1534 * * if max_feature_value <= min_feature_value + FEATURE_THRESHOLD: * features[f_j] = features[n_total_constants] # <<<<<<<<<<<<<< @@ -12055,7 +10888,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ (__pyx_v_features[__pyx_v_f_j]) = (__pyx_v_features[__pyx_v_n_total_constants]); - /* "sklearn/tree/_splitter.pyx":1726 + /* "sklearn/tree/_splitter.pyx":1535 * if max_feature_value <= min_feature_value + FEATURE_THRESHOLD: * features[f_j] = features[n_total_constants] * features[n_total_constants] = current.feature # <<<<<<<<<<<<<< @@ -12065,7 +10898,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_2 = __pyx_v_current.feature; (__pyx_v_features[__pyx_v_n_total_constants]) = __pyx_t_2; - /* "sklearn/tree/_splitter.pyx":1728 + /* "sklearn/tree/_splitter.pyx":1537 * features[n_total_constants] = current.feature * * n_found_constants += 1 # <<<<<<<<<<<<<< @@ -12074,7 +10907,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_n_found_constants = (__pyx_v_n_found_constants + 1); - /* "sklearn/tree/_splitter.pyx":1729 + /* "sklearn/tree/_splitter.pyx":1538 * * n_found_constants += 1 * n_total_constants += 1 # <<<<<<<<<<<<<< @@ -12086,7 +10919,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( } /*else*/ { - /* "sklearn/tree/_splitter.pyx":1732 + /* "sklearn/tree/_splitter.pyx":1541 * * else: * f_i -= 1 # <<<<<<<<<<<<<< @@ -12095,7 +10928,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_f_i = (__pyx_v_f_i - 1); - /* "sklearn/tree/_splitter.pyx":1733 + /* "sklearn/tree/_splitter.pyx":1542 * else: * f_i -= 1 * features[f_i], features[f_j] = features[f_j], features[f_i] # <<<<<<<<<<<<<< @@ -12107,7 +10940,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( (__pyx_v_features[__pyx_v_f_i]) = __pyx_t_2; (__pyx_v_features[__pyx_v_f_j]) = __pyx_t_8; - /* "sklearn/tree/_splitter.pyx":1736 + /* "sklearn/tree/_splitter.pyx":1545 * * # Draw a random threshold * current.threshold = rand_uniform(min_feature_value, # <<<<<<<<<<<<<< @@ -12116,7 +10949,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_current.threshold = __pyx_f_7sklearn_4tree_6_utils_rand_uniform(__pyx_v_min_feature_value, __pyx_v_max_feature_value, __pyx_v_random_state); - /* "sklearn/tree/_splitter.pyx":1740 + /* "sklearn/tree/_splitter.pyx":1549 * random_state) * * if current.threshold == max_feature_value: # <<<<<<<<<<<<<< @@ -12126,7 +10959,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_current.threshold == __pyx_v_max_feature_value) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1741 + /* "sklearn/tree/_splitter.pyx":1550 * * if current.threshold == max_feature_value: * current.threshold = min_feature_value # <<<<<<<<<<<<<< @@ -12138,7 +10971,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( } __pyx_L18:; - /* "sklearn/tree/_splitter.pyx":1744 + /* "sklearn/tree/_splitter.pyx":1553 * * # Partition * current.pos = self._partition(current.threshold, # <<<<<<<<<<<<<< @@ -12147,7 +10980,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_current.pos = __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter__partition(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *)__pyx_v_self), __pyx_v_current.threshold, __pyx_v_end_negative, __pyx_v_start_positive, (__pyx_v_start_positive + ((__pyx_v_Xf[__pyx_v_start_positive]) == 0.))); - /* "sklearn/tree/_splitter.pyx":1751 + /* "sklearn/tree/_splitter.pyx":1560 * * # Reject if min_samples_leaf is not guaranteed * if (((current.pos - start) < min_samples_leaf) or # <<<<<<<<<<<<<< @@ -12161,7 +10994,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( goto __pyx_L20_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":1752 + /* "sklearn/tree/_splitter.pyx":1561 * # Reject if min_samples_leaf is not guaranteed * if (((current.pos - start) < min_samples_leaf) or * ((end - current.pos) < min_samples_leaf)): # <<<<<<<<<<<<<< @@ -12173,7 +11006,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_L20_bool_binop_done:; if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1753 + /* "sklearn/tree/_splitter.pyx":1562 * if (((current.pos - start) < min_samples_leaf) or * ((end - current.pos) < min_samples_leaf)): * continue # <<<<<<<<<<<<<< @@ -12183,7 +11016,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( goto __pyx_L3_continue; } - /* "sklearn/tree/_splitter.pyx":1756 + /* "sklearn/tree/_splitter.pyx":1565 * * # Evaluate split * self.criterion.reset() # <<<<<<<<<<<<<< @@ -12192,7 +11025,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->reset(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":1757 + /* "sklearn/tree/_splitter.pyx":1566 * # Evaluate split * self.criterion.reset() * self.criterion.update(current.pos) # <<<<<<<<<<<<<< @@ -12201,7 +11034,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->update(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_current.pos); - /* "sklearn/tree/_splitter.pyx":1760 + /* "sklearn/tree/_splitter.pyx":1569 * * # Reject if min_weight_leaf is not satisfied * if ((self.criterion.weighted_n_left < min_weight_leaf) or # <<<<<<<<<<<<<< @@ -12215,7 +11048,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( goto __pyx_L23_bool_binop_done; } - /* "sklearn/tree/_splitter.pyx":1761 + /* "sklearn/tree/_splitter.pyx":1570 * # Reject if min_weight_leaf is not satisfied * if ((self.criterion.weighted_n_left < min_weight_leaf) or * (self.criterion.weighted_n_right < min_weight_leaf)): # <<<<<<<<<<<<<< @@ -12227,7 +11060,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_L23_bool_binop_done:; if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1762 + /* "sklearn/tree/_splitter.pyx":1571 * if ((self.criterion.weighted_n_left < min_weight_leaf) or * (self.criterion.weighted_n_right < min_weight_leaf)): * continue # <<<<<<<<<<<<<< @@ -12237,7 +11070,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( goto __pyx_L3_continue; } - /* "sklearn/tree/_splitter.pyx":1764 + /* "sklearn/tree/_splitter.pyx":1573 * continue * * current_proxy_improvement = self.criterion.proxy_impurity_improvement() # <<<<<<<<<<<<<< @@ -12246,7 +11079,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_current_proxy_improvement = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->proxy_impurity_improvement(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":1766 + /* "sklearn/tree/_splitter.pyx":1575 * current_proxy_improvement = self.criterion.proxy_impurity_improvement() * * if current_proxy_improvement > best_proxy_improvement: # <<<<<<<<<<<<<< @@ -12256,7 +11089,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_current_proxy_improvement > __pyx_v_best_proxy_improvement) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1767 + /* "sklearn/tree/_splitter.pyx":1576 * * if current_proxy_improvement > best_proxy_improvement: * best_proxy_improvement = current_proxy_improvement # <<<<<<<<<<<<<< @@ -12265,7 +11098,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_best_proxy_improvement = __pyx_v_current_proxy_improvement; - /* "sklearn/tree/_splitter.pyx":1768 + /* "sklearn/tree/_splitter.pyx":1577 * if current_proxy_improvement > best_proxy_improvement: * best_proxy_improvement = current_proxy_improvement * current.improvement = self.criterion.impurity_improvement(impurity) # <<<<<<<<<<<<<< @@ -12274,7 +11107,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_current.improvement = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->impurity_improvement(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_impurity); - /* "sklearn/tree/_splitter.pyx":1770 + /* "sklearn/tree/_splitter.pyx":1579 * current.improvement = self.criterion.impurity_improvement(impurity) * * self.criterion.children_impurity(¤t.impurity_left, # <<<<<<<<<<<<<< @@ -12283,7 +11116,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->children_impurity(__pyx_v_self->__pyx_base.__pyx_base.criterion, (&__pyx_v_current.impurity_left), (&__pyx_v_current.impurity_right)); - /* "sklearn/tree/_splitter.pyx":1772 + /* "sklearn/tree/_splitter.pyx":1581 * self.criterion.children_impurity(¤t.impurity_left, * ¤t.impurity_right) * best = current # <<<<<<<<<<<<<< @@ -12301,7 +11134,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_L3_continue:; } - /* "sklearn/tree/_splitter.pyx":1775 + /* "sklearn/tree/_splitter.pyx":1584 * * # Reorganize into samples[start:best.pos] + samples[best.pos:end] * if best.pos < end: # <<<<<<<<<<<<<< @@ -12311,7 +11144,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_best.pos < __pyx_v_end) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1776 + /* "sklearn/tree/_splitter.pyx":1585 * # Reorganize into samples[start:best.pos] + samples[best.pos:end] * if best.pos < end: * if current.feature != best.feature: # <<<<<<<<<<<<<< @@ -12321,7 +11154,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( __pyx_t_6 = ((__pyx_v_current.feature != __pyx_v_best.feature) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_splitter.pyx":1777 + /* "sklearn/tree/_splitter.pyx":1586 * if best.pos < end: * if current.feature != best.feature: * self.extract_nnz(best.feature, &end_negative, &start_positive, # <<<<<<<<<<<<<< @@ -12330,7 +11163,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_extract_nnz(((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *)__pyx_v_self), __pyx_v_best.feature, (&__pyx_v_end_negative), (&__pyx_v_start_positive), (&__pyx_v_is_samples_sorted)); - /* "sklearn/tree/_splitter.pyx":1780 + /* "sklearn/tree/_splitter.pyx":1589 * &is_samples_sorted) * * self._partition(best.threshold, end_negative, start_positive, # <<<<<<<<<<<<<< @@ -12342,7 +11175,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( } __pyx_L27:; - /* "sklearn/tree/_splitter.pyx":1783 + /* "sklearn/tree/_splitter.pyx":1592 * best.pos) * * self.criterion.reset() # <<<<<<<<<<<<<< @@ -12351,7 +11184,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->reset(__pyx_v_self->__pyx_base.__pyx_base.criterion); - /* "sklearn/tree/_splitter.pyx":1784 + /* "sklearn/tree/_splitter.pyx":1593 * * self.criterion.reset() * self.criterion.update(best.pos) # <<<<<<<<<<<<<< @@ -12360,7 +11193,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->update(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_best.pos); - /* "sklearn/tree/_splitter.pyx":1785 + /* "sklearn/tree/_splitter.pyx":1594 * self.criterion.reset() * self.criterion.update(best.pos) * best.improvement = self.criterion.impurity_improvement(impurity) # <<<<<<<<<<<<<< @@ -12369,7 +11202,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ __pyx_v_best.improvement = ((struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *)__pyx_v_self->__pyx_base.__pyx_base.criterion->__pyx_vtab)->impurity_improvement(__pyx_v_self->__pyx_base.__pyx_base.criterion, __pyx_v_impurity); - /* "sklearn/tree/_splitter.pyx":1786 + /* "sklearn/tree/_splitter.pyx":1595 * self.criterion.update(best.pos) * best.improvement = self.criterion.impurity_improvement(impurity) * self.criterion.children_impurity(&best.impurity_left, # <<<<<<<<<<<<<< @@ -12381,7 +11214,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( } __pyx_L26:; - /* "sklearn/tree/_splitter.pyx":1792 + /* "sklearn/tree/_splitter.pyx":1601 * # element in features[:n_known_constants] must be preserved for sibling * # and child nodes * memcpy(features, constant_features, sizeof(SIZE_t) * n_known_constants) # <<<<<<<<<<<<<< @@ -12390,7 +11223,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ memcpy(__pyx_v_features, __pyx_v_constant_features, ((sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)) * __pyx_v_n_known_constants)); - /* "sklearn/tree/_splitter.pyx":1795 + /* "sklearn/tree/_splitter.pyx":1604 * * # Copy newly found constant features * memcpy(constant_features + n_known_constants, # <<<<<<<<<<<<<< @@ -12399,7 +11232,7 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ memcpy((__pyx_v_constant_features + __pyx_v_n_known_constants), (__pyx_v_features + __pyx_v_n_known_constants), ((sizeof(__pyx_t_7sklearn_4tree_9_splitter_SIZE_t)) * __pyx_v_n_found_constants)); - /* "sklearn/tree/_splitter.pyx":1800 + /* "sklearn/tree/_splitter.pyx":1609 * * # Return values * split[0] = best # <<<<<<<<<<<<<< @@ -12407,15 +11240,15 @@ static void __pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split( */ (__pyx_v_split[0]) = __pyx_v_best; - /* "sklearn/tree/_splitter.pyx":1801 + /* "sklearn/tree/_splitter.pyx":1610 * # Return values * split[0] = best * n_constant_features[0] = n_total_constants # <<<<<<<<<<<<<< */ (__pyx_v_n_constant_features[0]) = __pyx_v_n_total_constants; - /* "sklearn/tree/_splitter.pyx":1587 - * self.random_state), self.__getstate__()) + /* "sklearn/tree/_splitter.pyx":1396 + * self.presort), self.__getstate__()) * * cdef void node_split(self, double impurity, SplitRecord* split, # <<<<<<<<<<<<<< * SIZE_t* n_constant_features) nogil: @@ -14626,12 +13459,54 @@ static PyObject *__pyx_tp_new_7sklearn_4tree_9_splitter_BaseDenseSplitter(PyType if (unlikely(!o)) return 0; p = ((struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *)o); p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter*)__pyx_vtabptr_7sklearn_4tree_9_splitter_BaseDenseSplitter; + p->X_idx_sorted = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); if (unlikely(__pyx_pw_7sklearn_4tree_9_splitter_17BaseDenseSplitter_1__cinit__(o, a, k) < 0)) { Py_DECREF(o); o = 0; } return o; } +static void __pyx_tp_dealloc_7sklearn_4tree_9_splitter_BaseDenseSplitter(PyObject *o) { + struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *p = (struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *)o; + #if PY_VERSION_HEX >= 0x030400a1 + if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_pw_7sklearn_4tree_9_splitter_17BaseDenseSplitter_3__dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->X_idx_sorted); + PyObject_GC_Track(o); + __pyx_tp_dealloc_7sklearn_4tree_9_splitter_Splitter(o); +} + +static int __pyx_tp_traverse_7sklearn_4tree_9_splitter_BaseDenseSplitter(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *p = (struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *)o; + e = __pyx_tp_traverse_7sklearn_4tree_9_splitter_Splitter(o, v, a); if (e) return e; + if (p->X_idx_sorted) { + e = (*v)(((PyObject*)p->X_idx_sorted), a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_7sklearn_4tree_9_splitter_BaseDenseSplitter(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *p = (struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter *)o; + __pyx_tp_clear_7sklearn_4tree_9_splitter_Splitter(o); + tmp = ((PyObject*)p->X_idx_sorted); + p->X_idx_sorted = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + static PyMethodDef __pyx_methods_7sklearn_4tree_9_splitter_BaseDenseSplitter[] = { {0, 0, 0, 0} }; @@ -14641,7 +13516,7 @@ static PyTypeObject __pyx_type_7sklearn_4tree_9_splitter_BaseDenseSplitter = { "sklearn.tree._splitter.BaseDenseSplitter", /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseDenseSplitter), /*tp_basicsize*/ 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7sklearn_4tree_9_splitter_Splitter, /*tp_dealloc*/ + __pyx_tp_dealloc_7sklearn_4tree_9_splitter_BaseDenseSplitter, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -14662,8 +13537,8 @@ static PyTypeObject __pyx_type_7sklearn_4tree_9_splitter_BaseDenseSplitter = { 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ - __pyx_tp_traverse_7sklearn_4tree_9_splitter_Splitter, /*tp_traverse*/ - __pyx_tp_clear_7sklearn_4tree_9_splitter_Splitter, /*tp_clear*/ + __pyx_tp_traverse_7sklearn_4tree_9_splitter_BaseDenseSplitter, /*tp_traverse*/ + __pyx_tp_clear_7sklearn_4tree_9_splitter_BaseDenseSplitter, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ @@ -14713,7 +13588,7 @@ static PyTypeObject __pyx_type_7sklearn_4tree_9_splitter_BestSplitter = { "sklearn.tree._splitter.BestSplitter", /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_4tree_9_splitter_BestSplitter), /*tp_basicsize*/ 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7sklearn_4tree_9_splitter_Splitter, /*tp_dealloc*/ + __pyx_tp_dealloc_7sklearn_4tree_9_splitter_BaseDenseSplitter, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -14734,8 +13609,8 @@ static PyTypeObject __pyx_type_7sklearn_4tree_9_splitter_BestSplitter = { 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ "Splitter for finding the best split.", /*tp_doc*/ - __pyx_tp_traverse_7sklearn_4tree_9_splitter_Splitter, /*tp_traverse*/ - __pyx_tp_clear_7sklearn_4tree_9_splitter_Splitter, /*tp_clear*/ + __pyx_tp_traverse_7sklearn_4tree_9_splitter_BaseDenseSplitter, /*tp_traverse*/ + __pyx_tp_clear_7sklearn_4tree_9_splitter_BaseDenseSplitter, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ @@ -14785,7 +13660,7 @@ static PyTypeObject __pyx_type_7sklearn_4tree_9_splitter_RandomSplitter = { "sklearn.tree._splitter.RandomSplitter", /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_4tree_9_splitter_RandomSplitter), /*tp_basicsize*/ 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7sklearn_4tree_9_splitter_Splitter, /*tp_dealloc*/ + __pyx_tp_dealloc_7sklearn_4tree_9_splitter_BaseDenseSplitter, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -14806,8 +13681,8 @@ static PyTypeObject __pyx_type_7sklearn_4tree_9_splitter_RandomSplitter = { 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ "Splitter for finding the best random split.", /*tp_doc*/ - __pyx_tp_traverse_7sklearn_4tree_9_splitter_Splitter, /*tp_traverse*/ - __pyx_tp_clear_7sklearn_4tree_9_splitter_Splitter, /*tp_clear*/ + __pyx_tp_traverse_7sklearn_4tree_9_splitter_BaseDenseSplitter, /*tp_traverse*/ + __pyx_tp_clear_7sklearn_4tree_9_splitter_BaseDenseSplitter, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ @@ -14836,123 +13711,6 @@ static PyTypeObject __pyx_type_7sklearn_4tree_9_splitter_RandomSplitter = { 0, /*tp_finalize*/ #endif }; -static struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_PresortBestSplitter __pyx_vtable_7sklearn_4tree_9_splitter_PresortBestSplitter; - -static PyObject *__pyx_tp_new_7sklearn_4tree_9_splitter_PresortBestSplitter(PyTypeObject *t, PyObject *a, PyObject *k) { - struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *p; - PyObject *o = __pyx_tp_new_7sklearn_4tree_9_splitter_BaseDenseSplitter(t, a, k); - if (unlikely(!o)) return 0; - p = ((struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *)o); - p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter*)__pyx_vtabptr_7sklearn_4tree_9_splitter_PresortBestSplitter; - p->X_argsorted = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); - if (unlikely(__pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_1__cinit__(o, a, k) < 0)) { - Py_DECREF(o); o = 0; - } - return o; -} - -static void __pyx_tp_dealloc_7sklearn_4tree_9_splitter_PresortBestSplitter(PyObject *o) { - struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *p = (struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *)o; - #if PY_VERSION_HEX >= 0x030400a1 - if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - #endif - PyObject_GC_UnTrack(o); - { - PyObject *etype, *eval, *etb; - PyErr_Fetch(&etype, &eval, &etb); - ++Py_REFCNT(o); - __pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_3__dealloc__(o); - --Py_REFCNT(o); - PyErr_Restore(etype, eval, etb); - } - Py_CLEAR(p->X_argsorted); - PyObject_GC_Track(o); - __pyx_tp_dealloc_7sklearn_4tree_9_splitter_Splitter(o); -} - -static int __pyx_tp_traverse_7sklearn_4tree_9_splitter_PresortBestSplitter(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *p = (struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *)o; - e = __pyx_tp_traverse_7sklearn_4tree_9_splitter_Splitter(o, v, a); if (e) return e; - if (p->X_argsorted) { - e = (*v)(((PyObject*)p->X_argsorted), a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7sklearn_4tree_9_splitter_PresortBestSplitter(PyObject *o) { - PyObject* tmp; - struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *p = (struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter *)o; - __pyx_tp_clear_7sklearn_4tree_9_splitter_Splitter(o); - tmp = ((PyObject*)p->X_argsorted); - p->X_argsorted = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyMethodDef __pyx_methods_7sklearn_4tree_9_splitter_PresortBestSplitter[] = { - {"__reduce__", (PyCFunction)__pyx_pw_7sklearn_4tree_9_splitter_19PresortBestSplitter_5__reduce__, METH_NOARGS, 0}, - {0, 0, 0, 0} -}; - -static PyTypeObject __pyx_type_7sklearn_4tree_9_splitter_PresortBestSplitter = { - PyVarObject_HEAD_INIT(0, 0) - "sklearn.tree._splitter.PresortBestSplitter", /*tp_name*/ - sizeof(struct __pyx_obj_7sklearn_4tree_9_splitter_PresortBestSplitter), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7sklearn_4tree_9_splitter_PresortBestSplitter, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #else - 0, /*reserved*/ - #endif - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - "Splitter for finding the best split, using presorting.", /*tp_doc*/ - __pyx_tp_traverse_7sklearn_4tree_9_splitter_PresortBestSplitter, /*tp_traverse*/ - __pyx_tp_clear_7sklearn_4tree_9_splitter_PresortBestSplitter, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_7sklearn_4tree_9_splitter_PresortBestSplitter, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7sklearn_4tree_9_splitter_PresortBestSplitter, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif -}; static struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_BaseSparseSplitter __pyx_vtable_7sklearn_4tree_9_splitter_BaseSparseSplitter; static PyObject *__pyx_tp_new_7sklearn_4tree_9_splitter_BaseSparseSplitter(PyTypeObject *t, PyObject *a, PyObject *k) { @@ -15220,19 +13978,14 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, {&__pyx_kp_s_X_should_be_in_csc_format, __pyx_k_X_should_be_in_csc_format, sizeof(__pyx_k_X_should_be_in_csc_format), 0, 0, 1, 0}, - {&__pyx_n_s_argsort, __pyx_k_argsort, sizeof(__pyx_k_argsort), 0, 0, 1, 1}, - {&__pyx_n_s_asfortranarray, __pyx_k_asfortranarray, sizeof(__pyx_k_asfortranarray), 0, 0, 1, 1}, - {&__pyx_n_s_axis, __pyx_k_axis, sizeof(__pyx_k_axis), 0, 0, 1, 1}, {&__pyx_n_s_criterion, __pyx_k_criterion, sizeof(__pyx_k_criterion), 0, 0, 1, 1}, {&__pyx_n_s_csc_matrix, __pyx_k_csc_matrix, sizeof(__pyx_k_csc_matrix), 0, 0, 1, 1}, {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, - {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_n_s_indices, __pyx_k_indices, sizeof(__pyx_k_indices), 0, 0, 1, 1}, {&__pyx_n_s_indptr, __pyx_k_indptr, sizeof(__pyx_k_indptr), 0, 0, 1, 1}, {&__pyx_n_s_inf, __pyx_k_inf, sizeof(__pyx_k_inf), 0, 0, 1, 1}, - {&__pyx_n_s_int32, __pyx_k_int32, sizeof(__pyx_k_int32), 0, 0, 1, 1}, {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_max_features, __pyx_k_max_features, sizeof(__pyx_k_max_features), 0, 0, 1, 1}, @@ -15242,6 +13995,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_u_ndarray_is_not_Fortran_contiguou, __pyx_k_ndarray_is_not_Fortran_contiguou, sizeof(__pyx_k_ndarray_is_not_Fortran_contiguou), 0, 1, 0, 0}, {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_n_s_presort, __pyx_k_presort, sizeof(__pyx_k_presort), 0, 0, 1, 1}, {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, {&__pyx_n_s_randint, __pyx_k_randint, sizeof(__pyx_k_randint), 0, 0, 1, 1}, {&__pyx_n_s_random_state, __pyx_k_random_state, sizeof(__pyx_k_random_state), 0, 0, 1, 1}, @@ -15254,8 +14008,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; @@ -15266,14 +14020,14 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - /* "sklearn/tree/_splitter.pyx":1072 + /* "sklearn/tree/_splitter.pyx":879 * * if not isinstance(X, csc_matrix): * raise ValueError("X should be in csc format") # <<<<<<<<<<<<<< * * cdef SIZE_t* samples = self.samples */ - __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_X_should_be_in_csc_format); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_X_should_be_in_csc_format); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); @@ -15441,81 +14195,71 @@ PyMODINIT_FUNC PyInit__splitter(void) /*--- Function export code ---*/ /*--- Type init code ---*/ __pyx_vtabptr_7sklearn_4tree_9_splitter_Splitter = &__pyx_vtable_7sklearn_4tree_9_splitter_Splitter; - __pyx_vtable_7sklearn_4tree_9_splitter_Splitter.init = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *))__pyx_f_7sklearn_4tree_9_splitter_8Splitter_init; + __pyx_vtable_7sklearn_4tree_9_splitter_Splitter.init = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *, struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init *__pyx_optional_args))__pyx_f_7sklearn_4tree_9_splitter_8Splitter_init; __pyx_vtable_7sklearn_4tree_9_splitter_Splitter.node_reset = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, double *))__pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_reset; __pyx_vtable_7sklearn_4tree_9_splitter_Splitter.node_split = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *))__pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_split; __pyx_vtable_7sklearn_4tree_9_splitter_Splitter.node_value = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double *))__pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_value; __pyx_vtable_7sklearn_4tree_9_splitter_Splitter.node_impurity = (double (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *))__pyx_f_7sklearn_4tree_9_splitter_8Splitter_node_impurity; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_Splitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_Splitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_type_7sklearn_4tree_9_splitter_Splitter.tp_print = 0; - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_Splitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_Splitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyObject_SetAttrString(__pyx_m, "Splitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_Splitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_Splitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_Splitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyObject_SetAttrString(__pyx_m, "Splitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_Splitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_9_splitter_Splitter = &__pyx_type_7sklearn_4tree_9_splitter_Splitter; __pyx_vtabptr_7sklearn_4tree_9_splitter_BaseDenseSplitter = &__pyx_vtable_7sklearn_4tree_9_splitter_BaseDenseSplitter; __pyx_vtable_7sklearn_4tree_9_splitter_BaseDenseSplitter.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_9_splitter_Splitter; - __pyx_vtable_7sklearn_4tree_9_splitter_BaseDenseSplitter.__pyx_base.init = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *))__pyx_f_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init; + __pyx_vtable_7sklearn_4tree_9_splitter_BaseDenseSplitter.__pyx_base.init = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *, struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init *__pyx_optional_args))__pyx_f_7sklearn_4tree_9_splitter_17BaseDenseSplitter_init; __pyx_type_7sklearn_4tree_9_splitter_BaseDenseSplitter.tp_base = __pyx_ptype_7sklearn_4tree_9_splitter_Splitter; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_BaseDenseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_BaseDenseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_type_7sklearn_4tree_9_splitter_BaseDenseSplitter.tp_print = 0; - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_BaseDenseSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_BaseDenseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyObject_SetAttrString(__pyx_m, "BaseDenseSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_BaseDenseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_BaseDenseSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_BaseDenseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyObject_SetAttrString(__pyx_m, "BaseDenseSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_BaseDenseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_9_splitter_BaseDenseSplitter = &__pyx_type_7sklearn_4tree_9_splitter_BaseDenseSplitter; __pyx_vtabptr_7sklearn_4tree_9_splitter_BestSplitter = &__pyx_vtable_7sklearn_4tree_9_splitter_BestSplitter; __pyx_vtable_7sklearn_4tree_9_splitter_BestSplitter.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_9_splitter_BaseDenseSplitter; __pyx_vtable_7sklearn_4tree_9_splitter_BestSplitter.__pyx_base.__pyx_base.node_split = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *))__pyx_f_7sklearn_4tree_9_splitter_12BestSplitter_node_split; __pyx_type_7sklearn_4tree_9_splitter_BestSplitter.tp_base = __pyx_ptype_7sklearn_4tree_9_splitter_BaseDenseSplitter; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_BestSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_BestSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_type_7sklearn_4tree_9_splitter_BestSplitter.tp_print = 0; - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_BestSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_BestSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyObject_SetAttrString(__pyx_m, "BestSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_BestSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_BestSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_BestSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyObject_SetAttrString(__pyx_m, "BestSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_BestSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_9_splitter_BestSplitter = &__pyx_type_7sklearn_4tree_9_splitter_BestSplitter; __pyx_vtabptr_7sklearn_4tree_9_splitter_RandomSplitter = &__pyx_vtable_7sklearn_4tree_9_splitter_RandomSplitter; __pyx_vtable_7sklearn_4tree_9_splitter_RandomSplitter.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_9_splitter_BaseDenseSplitter; __pyx_vtable_7sklearn_4tree_9_splitter_RandomSplitter.__pyx_base.__pyx_base.node_split = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *))__pyx_f_7sklearn_4tree_9_splitter_14RandomSplitter_node_split; __pyx_type_7sklearn_4tree_9_splitter_RandomSplitter.tp_base = __pyx_ptype_7sklearn_4tree_9_splitter_BaseDenseSplitter; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_RandomSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_RandomSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_type_7sklearn_4tree_9_splitter_RandomSplitter.tp_print = 0; - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_RandomSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_RandomSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyObject_SetAttrString(__pyx_m, "RandomSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_RandomSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_RandomSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_RandomSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyObject_SetAttrString(__pyx_m, "RandomSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_RandomSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_9_splitter_RandomSplitter = &__pyx_type_7sklearn_4tree_9_splitter_RandomSplitter; - __pyx_vtabptr_7sklearn_4tree_9_splitter_PresortBestSplitter = &__pyx_vtable_7sklearn_4tree_9_splitter_PresortBestSplitter; - __pyx_vtable_7sklearn_4tree_9_splitter_PresortBestSplitter.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_9_splitter_BaseDenseSplitter; - __pyx_vtable_7sklearn_4tree_9_splitter_PresortBestSplitter.__pyx_base.__pyx_base.init = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *))__pyx_f_7sklearn_4tree_9_splitter_19PresortBestSplitter_init; - __pyx_vtable_7sklearn_4tree_9_splitter_PresortBestSplitter.__pyx_base.__pyx_base.node_split = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *))__pyx_f_7sklearn_4tree_9_splitter_19PresortBestSplitter_node_split; - __pyx_type_7sklearn_4tree_9_splitter_PresortBestSplitter.tp_base = __pyx_ptype_7sklearn_4tree_9_splitter_BaseDenseSplitter; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_PresortBestSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_type_7sklearn_4tree_9_splitter_PresortBestSplitter.tp_print = 0; - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_PresortBestSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_PresortBestSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyObject_SetAttrString(__pyx_m, "PresortBestSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_PresortBestSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_ptype_7sklearn_4tree_9_splitter_PresortBestSplitter = &__pyx_type_7sklearn_4tree_9_splitter_PresortBestSplitter; __pyx_vtabptr_7sklearn_4tree_9_splitter_BaseSparseSplitter = &__pyx_vtable_7sklearn_4tree_9_splitter_BaseSparseSplitter; __pyx_vtable_7sklearn_4tree_9_splitter_BaseSparseSplitter.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_9_splitter_Splitter; - __pyx_vtable_7sklearn_4tree_9_splitter_BaseSparseSplitter.__pyx_base.init = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *))__pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init; + __pyx_vtable_7sklearn_4tree_9_splitter_BaseSparseSplitter.__pyx_base.init = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *, struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init *__pyx_optional_args))__pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_init; __pyx_vtable_7sklearn_4tree_9_splitter_BaseSparseSplitter._partition = (__pyx_t_7sklearn_4tree_9_splitter_SIZE_t (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *, double, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t))__pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter__partition; __pyx_vtable_7sklearn_4tree_9_splitter_BaseSparseSplitter.extract_nnz = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_BaseSparseSplitter *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *, int *))__pyx_f_7sklearn_4tree_9_splitter_18BaseSparseSplitter_extract_nnz; __pyx_type_7sklearn_4tree_9_splitter_BaseSparseSplitter.tp_base = __pyx_ptype_7sklearn_4tree_9_splitter_Splitter; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_BaseSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_BaseSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_type_7sklearn_4tree_9_splitter_BaseSparseSplitter.tp_print = 0; - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_BaseSparseSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_BaseSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyObject_SetAttrString(__pyx_m, "BaseSparseSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_BaseSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_BaseSparseSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_BaseSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyObject_SetAttrString(__pyx_m, "BaseSparseSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_BaseSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_9_splitter_BaseSparseSplitter = &__pyx_type_7sklearn_4tree_9_splitter_BaseSparseSplitter; __pyx_vtabptr_7sklearn_4tree_9_splitter_BestSparseSplitter = &__pyx_vtable_7sklearn_4tree_9_splitter_BestSparseSplitter; __pyx_vtable_7sklearn_4tree_9_splitter_BestSparseSplitter.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_9_splitter_BaseSparseSplitter; __pyx_vtable_7sklearn_4tree_9_splitter_BestSparseSplitter.__pyx_base.__pyx_base.node_split = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *))__pyx_f_7sklearn_4tree_9_splitter_18BestSparseSplitter_node_split; __pyx_type_7sklearn_4tree_9_splitter_BestSparseSplitter.tp_base = __pyx_ptype_7sklearn_4tree_9_splitter_BaseSparseSplitter; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_BestSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_BestSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1158; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_type_7sklearn_4tree_9_splitter_BestSparseSplitter.tp_print = 0; - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_BestSparseSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_BestSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyObject_SetAttrString(__pyx_m, "BestSparseSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_BestSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_BestSparseSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_BestSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1158; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyObject_SetAttrString(__pyx_m, "BestSparseSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_BestSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1158; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_9_splitter_BestSparseSplitter = &__pyx_type_7sklearn_4tree_9_splitter_BestSparseSplitter; __pyx_vtabptr_7sklearn_4tree_9_splitter_RandomSparseSplitter = &__pyx_vtable_7sklearn_4tree_9_splitter_RandomSparseSplitter; __pyx_vtable_7sklearn_4tree_9_splitter_RandomSparseSplitter.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_9_splitter_BaseSparseSplitter; __pyx_vtable_7sklearn_4tree_9_splitter_RandomSparseSplitter.__pyx_base.__pyx_base.node_split = (void (*)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *))__pyx_f_7sklearn_4tree_9_splitter_20RandomSparseSplitter_node_split; __pyx_type_7sklearn_4tree_9_splitter_RandomSparseSplitter.tp_base = __pyx_ptype_7sklearn_4tree_9_splitter_BaseSparseSplitter; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_RandomSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1577; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_9_splitter_RandomSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_type_7sklearn_4tree_9_splitter_RandomSparseSplitter.tp_print = 0; - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_RandomSparseSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_RandomSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1577; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyObject_SetAttrString(__pyx_m, "RandomSparseSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_RandomSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1577; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_9_splitter_RandomSparseSplitter.tp_dict, __pyx_vtabptr_7sklearn_4tree_9_splitter_RandomSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyObject_SetAttrString(__pyx_m, "RandomSparseSplitter", (PyObject *)&__pyx_type_7sklearn_4tree_9_splitter_RandomSparseSplitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_9_splitter_RandomSparseSplitter = &__pyx_type_7sklearn_4tree_9_splitter_RandomSparseSplitter; /*--- Type import code ---*/ __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", @@ -15548,19 +14292,19 @@ PyMODINIT_FUNC PyInit__splitter(void) Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; /*--- Execution code ---*/ - /* "sklearn/tree/_splitter.pyx":26 + /* "sklearn/tree/_splitter.pyx":25 * from libc.string cimport memset * * import numpy as np # <<<<<<<<<<<<<< * cimport numpy as np * np.import_array() */ - __pyx_t_2 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "sklearn/tree/_splitter.pyx":28 + /* "sklearn/tree/_splitter.pyx":27 * import numpy as np * cimport numpy as np * np.import_array() # <<<<<<<<<<<<<< @@ -15569,44 +14313,44 @@ PyMODINIT_FUNC PyInit__splitter(void) */ import_array(); - /* "sklearn/tree/_splitter.pyx":30 + /* "sklearn/tree/_splitter.pyx":29 * np.import_array() * * from scipy.sparse import csc_matrix # <<<<<<<<<<<<<< * * from ._utils cimport log */ - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_csc_matrix); __Pyx_GIVEREF(__pyx_n_s_csc_matrix); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_csc_matrix); - __pyx_t_3 = __Pyx_Import(__pyx_n_s_scipy_sparse, __pyx_t_2, -1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_Import(__pyx_n_s_scipy_sparse, __pyx_t_2, -1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_csc_matrix); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_csc_matrix); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_csc_matrix, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_d, __pyx_n_s_csc_matrix, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "sklearn/tree/_splitter.pyx":38 + /* "sklearn/tree/_splitter.pyx":37 * from ._utils cimport safe_realloc * * cdef double INFINITY = np.inf # <<<<<<<<<<<<<< * * # Mitigate precision differences between 32 bit and 64 bit */ - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_inf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_inf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_4 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_4 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_7sklearn_4tree_9_splitter_INFINITY = __pyx_t_4; - /* "sklearn/tree/_splitter.pyx":41 + /* "sklearn/tree/_splitter.pyx":40 * * # Mitigate precision differences between 32 bit and 64 bit * cdef DTYPE_t FEATURE_THRESHOLD = 1e-7 # <<<<<<<<<<<<<< @@ -15615,7 +14359,7 @@ PyMODINIT_FUNC PyInit__splitter(void) */ __pyx_v_7sklearn_4tree_9_splitter_FEATURE_THRESHOLD = 1e-7; - /* "sklearn/tree/_splitter.pyx":45 + /* "sklearn/tree/_splitter.pyx":44 * # Constant to switch between algorithm non zero value extract algorithm * # in SparseSplitter * cdef DTYPE_t EXTRACT_NNZ_SWITCH = 0.1 # <<<<<<<<<<<<<< diff --git a/sklearn/tree/_splitter.pxd b/sklearn/tree/_splitter.pxd index aa17f26123374..0971e3092a97d 100644 --- a/sklearn/tree/_splitter.pxd +++ b/sklearn/tree/_splitter.pxd @@ -57,6 +57,9 @@ cdef class Splitter: cdef SIZE_t start # Start position for the current node cdef SIZE_t end # End position for the current node + cdef bint presort # Whether to use presorting, only + # allowed on dense data + cdef DOUBLE_t* y cdef SIZE_t y_stride cdef DOUBLE_t* sample_weight @@ -79,7 +82,8 @@ cdef class Splitter: # Methods cdef void init(self, object X, np.ndarray y, - DOUBLE_t* sample_weight) except * + DOUBLE_t* sample_weight, + np.ndarray X_idx_sorted=*) except * cdef void node_reset(self, SIZE_t start, SIZE_t end, double* weighted_n_node_samples) nogil diff --git a/sklearn/tree/_splitter.pyx b/sklearn/tree/_splitter.pyx index f248feb1ccebc..424938018684a 100644 --- a/sklearn/tree/_splitter.pyx +++ b/sklearn/tree/_splitter.pyx @@ -18,7 +18,6 @@ from ._criterion cimport Criterion from libc.stdlib cimport free -from libc.stdlib cimport realloc from libc.stdlib cimport qsort from libc.string cimport memcpy from libc.string cimport memset @@ -61,7 +60,7 @@ cdef class Splitter: def __cinit__(self, Criterion criterion, SIZE_t max_features, SIZE_t min_samples_leaf, double min_weight_leaf, - object random_state): + object random_state, bint presort): """ Parameters ---------- @@ -101,6 +100,7 @@ cdef class Splitter: self.min_samples_leaf = min_samples_leaf self.min_weight_leaf = min_weight_leaf self.random_state = random_state + self.presort = presort def __dealloc__(self): """Destructor.""" @@ -119,7 +119,8 @@ cdef class Splitter: cdef void init(self, object X, np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, - DOUBLE_t* sample_weight) except *: + DOUBLE_t* sample_weight, + np.ndarray X_idx_sorted=None) except *: """Initialize the splitter. Take in the input data X, the target Y, and optional sample weights. @@ -231,20 +232,36 @@ cdef class Splitter: cdef class BaseDenseSplitter(Splitter): cdef DTYPE_t* X cdef SIZE_t X_sample_stride - cdef SIZE_t X_fx_stride + cdef SIZE_t X_feature_stride + + cdef np.ndarray X_idx_sorted + cdef INT32_t* X_idx_sorted_ptr + cdef SIZE_t X_idx_sorted_stride + cdef SIZE_t n_total_samples + cdef SIZE_t* sample_mask def __cinit__(self, Criterion criterion, SIZE_t max_features, SIZE_t min_samples_leaf, double min_weight_leaf, - object random_state): + object random_state, bint presort): self.X = NULL self.X_sample_stride = 0 - self.X_fx_stride = 0 + self.X_feature_stride = 0 + self.X_idx_sorted_ptr = NULL + self.X_idx_sorted_stride = 0 + self.sample_mask = NULL + self.presort = presort + + def __dealloc__(self): + """Destructor.""" + if self.presort == 1: + free(self.sample_mask) cdef void init(self, object X, np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, - DOUBLE_t* sample_weight) except *: + DOUBLE_t* sample_weight, + np.ndarray X_idx_sorted=None) except *: """Initialize the splitter.""" # Call parent init @@ -255,7 +272,17 @@ cdef class BaseDenseSplitter(Splitter): self.X = X_ndarray.data self.X_sample_stride = X.strides[0] / X.itemsize - self.X_fx_stride = X.strides[1] / X.itemsize + self.X_feature_stride = X.strides[1] / X.itemsize + + if self.presort == 1: + self.X_idx_sorted = X_idx_sorted + self.X_idx_sorted_ptr = self.X_idx_sorted.data + self.X_idx_sorted_stride = ( self.X_idx_sorted.strides[1] / + self.X_idx_sorted.itemsize) + + self.n_total_samples = X.shape[0] + safe_realloc(&self.sample_mask, self.n_total_samples) + memset(self.sample_mask, 0, self.n_total_samples*sizeof(SIZE_t)) cdef class BestSplitter(BaseDenseSplitter): @@ -265,7 +292,8 @@ cdef class BestSplitter(BaseDenseSplitter): self.max_features, self.min_samples_leaf, self.min_weight_leaf, - self.random_state), self.__getstate__()) + self.random_state, + self.presort), self.__getstate__()) cdef void node_split(self, double impurity, SplitRecord* split, SIZE_t* n_constant_features) nogil: @@ -282,18 +310,28 @@ cdef class BestSplitter(BaseDenseSplitter): cdef DTYPE_t* X = self.X cdef DTYPE_t* Xf = self.feature_values cdef SIZE_t X_sample_stride = self.X_sample_stride - cdef SIZE_t X_fx_stride = self.X_fx_stride + cdef SIZE_t X_feature_stride = self.X_feature_stride cdef SIZE_t max_features = self.max_features cdef SIZE_t min_samples_leaf = self.min_samples_leaf cdef double min_weight_leaf = self.min_weight_leaf cdef UINT32_t* random_state = &self.rand_r_state + cdef INT32_t* X_idx_sorted = self.X_idx_sorted_ptr + cdef SIZE_t* sample_mask = self.sample_mask + cdef SplitRecord best, current - cdef double current_proxy_improvement = - INFINITY - cdef double best_proxy_improvement = - INFINITY + cdef double current_proxy_improvement = -INFINITY + cdef double best_proxy_improvement = -INFINITY cdef SIZE_t f_i = n_features - cdef SIZE_t f_j, p, tmp + cdef SIZE_t f_j + cdef SIZE_t tmp + cdef SIZE_t p + cdef SIZE_t feature_idx_offset + cdef SIZE_t feature_offset + cdef SIZE_t i + cdef SIZE_t j + cdef SIZE_t n_visited_features = 0 # Number of features discovered to be constant during the split search cdef SIZE_t n_found_constants = 0 @@ -307,6 +345,10 @@ cdef class BestSplitter(BaseDenseSplitter): _init_split(&best, end) + if self.presort == 1: + for p in range(start, end): + sample_mask[samples[p]] = 1 + # Sample up to max_features without replacement using a # Fisher-Yates-based algorithm (using the local variables `f_i` and # `f_j` to compute a permutation of the `features` array). @@ -351,18 +393,28 @@ cdef class BestSplitter(BaseDenseSplitter): # f_j in the interval [n_known_constants, f_i - n_found_constants[ f_j += n_found_constants # f_j in the interval [n_total_constants, f_i[ - current.feature = features[f_j] + feature_offset = self.X_feature_stride * current.feature - # Sort samples along that feature; first copy the feature - # values for the active samples into Xf, s.t. - # Xf[i] == X[samples[i], j], so the sort uses the cache more + # Sort samples along that feature; either by utilizing + # presorting, or by copying the values into an array and + # sorting the array in a manner which utilizes the cache more # effectively. - for p in range(start, end): - Xf[p] = X[X_sample_stride * samples[p] + - X_fx_stride * current.feature] + if self.presort == 1: + p = start + feature_idx_offset = self.X_idx_sorted_stride * current.feature + + for i in range(self.n_total_samples): + j = X_idx_sorted[i + feature_idx_offset] + if sample_mask[j] == 1: + samples[p] = j + Xf[p] = X[self.X_sample_stride * j + feature_offset] + p += 1 + else: + for i in range(start, end): + Xf[i] = X[self.X_sample_stride * samples[i] + feature_offset] - sort(Xf + start, samples + start, end - start) + sort(Xf + start, samples + start, end - start) if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: features[f_j] = features[n_total_constants] @@ -418,12 +470,12 @@ cdef class BestSplitter(BaseDenseSplitter): # Reorganize into samples[start:best.pos] + samples[best.pos:end] if best.pos < end: + feature_offset = X_feature_stride * best.feature partition_end = end p = start while p < partition_end: - if X[X_sample_stride * samples[p] + - X_fx_stride * best.feature] <= best.threshold: + if X[X_sample_stride * samples[p] + feature_offset] <= best.threshold: p += 1 else: @@ -439,6 +491,11 @@ cdef class BestSplitter(BaseDenseSplitter): self.criterion.children_impurity(&best.impurity_left, &best.impurity_right) + # Reset sample mask + if self.presort == 1: + for p in range(start, end): + sample_mask[samples[p]] = 0 + # Respect invariant for constant features: the original order of # element in features[:n_known_constants] must be preserved for sibling # and child nodes @@ -571,7 +628,8 @@ cdef class RandomSplitter(BaseDenseSplitter): self.max_features, self.min_samples_leaf, self.min_weight_leaf, - self.random_state), self.__getstate__()) + self.random_state, + self.presort), self.__getstate__()) cdef void node_split(self, double impurity, SplitRecord* split, SIZE_t* n_constant_features) nogil: @@ -588,7 +646,7 @@ cdef class RandomSplitter(BaseDenseSplitter): cdef DTYPE_t* X = self.X cdef DTYPE_t* Xf = self.feature_values cdef SIZE_t X_sample_stride = self.X_sample_stride - cdef SIZE_t X_fx_stride = self.X_fx_stride + cdef SIZE_t X_feature_stride = self.X_feature_stride cdef SIZE_t max_features = self.max_features cdef SIZE_t min_samples_leaf = self.min_samples_leaf cdef double min_weight_leaf = self.min_weight_leaf @@ -599,7 +657,10 @@ cdef class RandomSplitter(BaseDenseSplitter): cdef double best_proxy_improvement = - INFINITY cdef SIZE_t f_i = n_features - cdef SIZE_t f_j, p, tmp + cdef SIZE_t f_j + cdef SIZE_t p + cdef SIZE_t tmp + cdef SIZE_t feature_stride # Number of features discovered to be constant during the split search cdef SIZE_t n_found_constants = 0 # Number of features known to be constant and drawn without replacement @@ -660,16 +721,15 @@ cdef class RandomSplitter(BaseDenseSplitter): # f_j in the interval [n_total_constants, f_i[ current.feature = features[f_j] + feature_stride = X_feature_stride * current.feature # Find min, max - min_feature_value = X[X_sample_stride * samples[start] + - X_fx_stride * current.feature] + min_feature_value = X[X_sample_stride * samples[start] + feature_stride] max_feature_value = min_feature_value Xf[start] = min_feature_value for p in range(start + 1, end): - current_feature_value = X[X_sample_stride * samples[p] + - X_fx_stride * current.feature] + current_feature_value = X[X_sample_stride * samples[p] + feature_stride] Xf[p] = current_feature_value if current_feature_value < min_feature_value: @@ -736,14 +796,14 @@ cdef class RandomSplitter(BaseDenseSplitter): best = current # copy # Reorganize into samples[start:best.pos] + samples[best.pos:end] + feature_stride = X_feature_stride * best.feature if best.pos < end: if current.feature != best.feature: partition_end = end p = start while p < partition_end: - if X[X_sample_stride * samples[p] + - X_fx_stride * best.feature] <= best.threshold: + if X[X_sample_stride * samples[p] + feature_stride] <= best.threshold: p += 1 else: @@ -775,260 +835,6 @@ cdef class RandomSplitter(BaseDenseSplitter): n_constant_features[0] = n_total_constants -cdef class PresortBestSplitter(BaseDenseSplitter): - """Splitter for finding the best split, using presorting.""" - cdef DTYPE_t* X_old - cdef np.ndarray X_argsorted - cdef INT32_t* X_argsorted_ptr - cdef SIZE_t X_argsorted_stride - - cdef SIZE_t n_total_samples - cdef unsigned char* sample_mask - - def __cinit__(self, Criterion criterion, SIZE_t max_features, - SIZE_t min_samples_leaf, - double min_weight_leaf, - object random_state): - # Initialize pointers - self.X_old = NULL - self.X_argsorted_ptr = NULL - self.X_argsorted_stride = 0 - self.sample_mask = NULL - - def __dealloc__(self): - """Destructor.""" - free(self.sample_mask) - - def __reduce__(self): - return (PresortBestSplitter, (self.criterion, - self.max_features, - self.min_samples_leaf, - self.min_weight_leaf, - self.random_state), self.__getstate__()) - - cdef void init(self, object X, - np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, - DOUBLE_t* sample_weight) except *: - - cdef void* sample_mask = NULL - - # Call parent initializer - BaseDenseSplitter.init(self, X, y, sample_weight) - - cdef np.ndarray X_ndarray = X - - # Pre-sort X - if self.X_old != self.X: - self.X_old = self.X - self.X_argsorted = np.asfortranarray(np.argsort(X_ndarray, axis=0), - dtype=np.int32) - self.X_argsorted_ptr = self.X_argsorted.data - self.X_argsorted_stride = ( self.X_argsorted.strides[1] / - self.X_argsorted.itemsize) - - self.n_total_samples = X.shape[0] - sample_mask = safe_realloc(&self.sample_mask, self.n_total_samples) - memset(sample_mask, 0, self.n_total_samples) - - cdef void node_split(self, double impurity, SplitRecord* split, - SIZE_t* n_constant_features) nogil: - """Find the best split on node samples[start:end].""" - # Find the best split - cdef SIZE_t* samples = self.samples - cdef SIZE_t start = self.start - cdef SIZE_t end = self.end - - cdef SIZE_t* features = self.features - cdef SIZE_t* constant_features = self.constant_features - cdef SIZE_t n_features = self.n_features - - cdef DTYPE_t* X = self.X - cdef DTYPE_t* Xf = self.feature_values - cdef SIZE_t X_sample_stride = self.X_sample_stride - cdef SIZE_t X_fx_stride = self.X_fx_stride - cdef INT32_t* X_argsorted = self.X_argsorted_ptr - cdef SIZE_t X_argsorted_stride = self.X_argsorted_stride - cdef SIZE_t n_total_samples = self.n_total_samples - cdef unsigned char* sample_mask = self.sample_mask - - cdef SIZE_t max_features = self.max_features - cdef SIZE_t min_samples_leaf = self.min_samples_leaf - cdef double min_weight_leaf = self.min_weight_leaf - cdef UINT32_t* random_state = &self.rand_r_state - - cdef SplitRecord best, current - cdef double current_proxy_improvement = - INFINITY - cdef double best_proxy_improvement = - INFINITY - - cdef SIZE_t f_i = n_features - cdef SIZE_t f_j, p - # Number of features discovered to be constant during the split search - cdef SIZE_t n_found_constants = 0 - # Number of features known to be constant and drawn without replacement - cdef SIZE_t n_drawn_constants = 0 - cdef SIZE_t n_known_constants = n_constant_features[0] - # n_total_constants = n_known_constants + n_found_constants - cdef SIZE_t n_total_constants = n_known_constants - cdef SIZE_t n_visited_features = 0 - cdef SIZE_t partition_end - cdef SIZE_t i, j - - _init_split(&best, end) - - # Set sample mask - for p in range(start, end): - sample_mask[samples[p]] = 1 - - # Sample up to max_features without replacement using a - # Fisher-Yates-based algorithm (using the local variables `f_i` and - # `f_j` to compute a permutation of the `features` array). - # - # Skip the CPU intensive evaluation of the impurity criterion for - # features that were already detected as constant (hence not suitable - # for good splitting) by ancestor nodes and save the information on - # newly discovered constant features to spare computation on descendant - # nodes. - while (f_i > n_total_constants and # Stop early if remaining features - # are constant - (n_visited_features < max_features or - # At least one drawn features must be non constant - n_visited_features <= n_found_constants + n_drawn_constants)): - n_visited_features += 1 - - # Loop invariant: elements of features in - # - [:n_drawn_constant[ holds drawn and known constant features; - # - [n_drawn_constant:n_known_constant[ holds known constant - # features that haven't been drawn yet; - # - [n_known_constant:n_total_constant[ holds newly found constant - # features; - # - [n_total_constant:f_i[ holds features that haven't been drawn - # yet and aren't constant apriori. - # - [f_i:n_features[ holds features that have been drawn - # and aren't constant. - - # Draw a feature at random - f_j = rand_int(n_drawn_constants, f_i - n_found_constants, - random_state) - - if f_j < n_known_constants: - # f_j is in [n_drawn_constants, n_known_constants[ - tmp = features[f_j] - features[f_j] = features[n_drawn_constants] - features[n_drawn_constants] = tmp - - n_drawn_constants += 1 - - else: - # f_j in the interval [n_known_constants, f_i - n_found_constants[ - f_j += n_found_constants - # f_j in the interval [n_total_constants, f_i[ - - current.feature = features[f_j] - - # Extract ordering from X_argsorted - p = start - - for i in range(n_total_samples): - j = X_argsorted[X_argsorted_stride * current.feature + i] - if sample_mask[j] == 1: - samples[p] = j - Xf[p] = X[X_sample_stride * j + - X_fx_stride * current.feature] - p += 1 - - # Evaluate all splits - if Xf[end - 1] <= Xf[start] + FEATURE_THRESHOLD: - features[f_j] = features[n_total_constants] - features[n_total_constants] = current.feature - - n_found_constants += 1 - n_total_constants += 1 - - else: - f_i -= 1 - features[f_i], features[f_j] = features[f_j], features[f_i] - - self.criterion.reset() - p = start - - while p < end: - while (p + 1 < end and - Xf[p + 1] <= Xf[p] + FEATURE_THRESHOLD): - p += 1 - - # (p + 1 >= end) or (X[samples[p + 1], current.feature] > - # X[samples[p], current.feature]) - p += 1 - # (p >= end) or (X[samples[p], current.feature] > - # X[samples[p - 1], current.feature]) - - if p < end: - current.pos = p - - # Reject if min_samples_leaf is not guaranteed - if (((current.pos - start) < min_samples_leaf) or - ((end - current.pos) < min_samples_leaf)): - continue - - self.criterion.update(current.pos) - - # Reject if min_weight_leaf is not satisfied - if ((self.criterion.weighted_n_left < min_weight_leaf) or - (self.criterion.weighted_n_right < min_weight_leaf)): - continue - - current_proxy_improvement = self.criterion.proxy_impurity_improvement() - - if current_proxy_improvement > best_proxy_improvement: - best_proxy_improvement = current_proxy_improvement - - current.threshold = (Xf[p - 1] + Xf[p]) / 2.0 - if current.threshold == Xf[p]: - current.threshold = Xf[p - 1] - - best = current # copy - - # Reorganize into samples[start:best.pos] + samples[best.pos:end] - if best.pos < end: - partition_end = end - p = start - - while p < partition_end: - if X[X_sample_stride * samples[p] + - X_fx_stride * best.feature] <= best.threshold: - p += 1 - - else: - partition_end -= 1 - - tmp = samples[partition_end] - samples[partition_end] = samples[p] - samples[p] = tmp - - self.criterion.reset() - self.criterion.update(best.pos) - best.improvement = self.criterion.impurity_improvement(impurity) - self.criterion.children_impurity(&best.impurity_left, - &best.impurity_right) - - # Reset sample mask - for p in range(start, end): - sample_mask[samples[p]] = 0 - - # Respect invariant for constant features: the original order of - # element in features[:n_known_constants] must be preserved for sibling - # and child nodes - memcpy(features, constant_features, sizeof(SIZE_t) * n_known_constants) - - # Copy newly found constant features - memcpy(constant_features + n_known_constants, - features + n_known_constants, - sizeof(SIZE_t) * n_found_constants) - - # Return values - split[0] = best - n_constant_features[0] = n_total_constants - cdef class BaseSparseSplitter(Splitter): # The sparse splitter works only with csc sparse matrix format cdef DTYPE_t* X_data @@ -1042,7 +848,7 @@ cdef class BaseSparseSplitter(Splitter): def __cinit__(self, Criterion criterion, SIZE_t max_features, SIZE_t min_samples_leaf, double min_weight_leaf, - object random_state): + object random_state, bint presort): # Parent __cinit__ is automatically called self.X_data = NULL @@ -1062,7 +868,8 @@ cdef class BaseSparseSplitter(Splitter): cdef void init(self, object X, np.ndarray[DOUBLE_t, ndim=2, mode="c"] y, - DOUBLE_t* sample_weight) except *: + DOUBLE_t* sample_weight, + np.ndarray X_idx_sorted=None) except *: """Initialize the splitter.""" # Call parent init @@ -1086,8 +893,8 @@ cdef class BaseSparseSplitter(Splitter): self.n_total_samples = n_total_samples # Initialize auxiliary array used to perform split - safe_realloc(&self.index_to_samples, n_total_samples * sizeof(SIZE_t)) - safe_realloc(&self.sorted_samples, n_samples * sizeof(SIZE_t)) + safe_realloc(&self.index_to_samples, n_total_samples) + safe_realloc(&self.sorted_samples, n_samples) cdef SIZE_t* index_to_samples = self.index_to_samples cdef SIZE_t p @@ -1356,7 +1163,8 @@ cdef class BestSparseSplitter(BaseSparseSplitter): self.max_features, self.min_samples_leaf, self.min_weight_leaf, - self.random_state), self.__getstate__()) + self.random_state, + self.presort), self.__getstate__()) cdef void node_split(self, double impurity, SplitRecord* split, SIZE_t* n_constant_features) nogil: @@ -1582,7 +1390,8 @@ cdef class RandomSparseSplitter(BaseSparseSplitter): self.max_features, self.min_samples_leaf, self.min_weight_leaf, - self.random_state), self.__getstate__()) + self.random_state, + self.presort), self.__getstate__()) cdef void node_split(self, double impurity, SplitRecord* split, SIZE_t* n_constant_features) nogil: @@ -1798,4 +1607,4 @@ cdef class RandomSparseSplitter(BaseSparseSplitter): # Return values split[0] = best - n_constant_features[0] = n_total_constants \ No newline at end of file + n_constant_features[0] = n_total_constants diff --git a/sklearn/tree/_tree.c b/sklearn/tree/_tree.c index b7b04385016f8..c0a2afa2c4a6d 100644 --- a/sklearn/tree/_tree.c +++ b/sklearn/tree/_tree.c @@ -948,6 +948,7 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; */ typedef npy_cdouble __pyx_t_5numpy_complex_t; struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord; +struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init; /* "sklearn/tree/_splitter.pxd":23 * ctypedef np.npy_uint32 UINT32_t # Unsigned 32 bit integer @@ -964,6 +965,18 @@ struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord { double impurity_left; double impurity_right; }; + +/* "sklearn/tree/_splitter.pxd":84 + * + * # Methods + * cdef void init(self, object X, np.ndarray y, # <<<<<<<<<<<<<< + * DOUBLE_t* sample_weight, + * np.ndarray X_idx_sorted=*) except * + */ +struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init { + int __pyx_n; + PyArrayObject *X_idx_sorted; +}; struct __pyx_t_7sklearn_4tree_6_utils_StackRecord; struct __pyx_t_7sklearn_4tree_6_utils_PriorityHeapRecord; @@ -1066,36 +1079,39 @@ struct __pyx_opt_args_7sklearn_4tree_5_tree_4Tree_compute_feature_importances { * cdef SIZE_t max_depth # Maximal tree depth * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=*) - * cdef _check_input(self, object X, np.ndarray y, np.ndarray sample_weight) + * np.ndarray sample_weight=*, + * np.ndarray X_idx_sorted=*) */ struct __pyx_opt_args_7sklearn_4tree_5_tree_11TreeBuilder_build { int __pyx_n; PyArrayObject *sample_weight; + PyArrayObject *X_idx_sorted; }; -/* "sklearn/tree/_tree.pyx":140 +/* "sklearn/tree/_tree.pyx":141 * self.max_depth = max_depth * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ struct __pyx_opt_args_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build { int __pyx_n; PyArrayObject *sample_weight; + PyArrayObject *X_idx_sorted; }; -/* "sklearn/tree/_tree.pyx":297 +/* "sklearn/tree/_tree.pyx":299 * self.max_leaf_nodes = max_leaf_nodes * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ struct __pyx_opt_args_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build { int __pyx_n; PyArrayObject *sample_weight; + PyArrayObject *X_idx_sorted; }; /* "sklearn/tree/_criterion.pxd":21 @@ -1152,6 +1168,7 @@ struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter { __pyx_t_7sklearn_4tree_9_splitter_DTYPE_t *feature_values; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t start; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t end; + int presort; __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *y; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t y_stride; __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *sample_weight; @@ -1231,7 +1248,7 @@ struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder { }; -/* "sklearn/tree/_tree.pyx":128 +/* "sklearn/tree/_tree.pyx":129 * # Depth first builder --------------------------------------------------------- * * cdef class DepthFirstTreeBuilder(TreeBuilder): # <<<<<<<<<<<<<< @@ -1243,7 +1260,7 @@ struct __pyx_obj_7sklearn_4tree_5_tree_DepthFirstTreeBuilder { }; -/* "sklearn/tree/_tree.pyx":277 +/* "sklearn/tree/_tree.pyx":279 * * * cdef class BestFirstTreeBuilder(TreeBuilder): # <<<<<<<<<<<<<< @@ -1288,7 +1305,7 @@ static struct __pyx_vtabstruct_7sklearn_4tree_10_criterion_Criterion *__pyx_vtab */ struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter { - void (*init)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *); + void (*init)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, PyObject *, PyArrayObject *, __pyx_t_7sklearn_4tree_9_splitter_DOUBLE_t *, struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init *__pyx_optional_args); void (*node_reset)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t, double *); void (*node_split)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double, struct __pyx_t_7sklearn_4tree_9_splitter_SplitRecord *, __pyx_t_7sklearn_4tree_9_splitter_SIZE_t *); void (*node_value)(struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, double *); @@ -1329,7 +1346,7 @@ struct __pyx_vtabstruct_7sklearn_4tree_6_utils_PriorityHeap { static struct __pyx_vtabstruct_7sklearn_4tree_6_utils_PriorityHeap *__pyx_vtabptr_7sklearn_4tree_6_utils_PriorityHeap; -/* "sklearn/tree/_tree.pyx":481 +/* "sklearn/tree/_tree.pyx":484 * # ============================================================================= * * cdef class Tree: # <<<<<<<<<<<<<< @@ -1370,7 +1387,7 @@ static struct __pyx_vtabstruct_7sklearn_4tree_5_tree_TreeBuilder *__pyx_vtabptr_ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *, PyObject *, PyArrayObject *, PyArrayObject *); -/* "sklearn/tree/_tree.pyx":128 +/* "sklearn/tree/_tree.pyx":129 * # Depth first builder --------------------------------------------------------- * * cdef class DepthFirstTreeBuilder(TreeBuilder): # <<<<<<<<<<<<<< @@ -1384,7 +1401,7 @@ struct __pyx_vtabstruct_7sklearn_4tree_5_tree_DepthFirstTreeBuilder { static struct __pyx_vtabstruct_7sklearn_4tree_5_tree_DepthFirstTreeBuilder *__pyx_vtabptr_7sklearn_4tree_5_tree_DepthFirstTreeBuilder; -/* "sklearn/tree/_tree.pyx":277 +/* "sklearn/tree/_tree.pyx":279 * * * cdef class BestFirstTreeBuilder(TreeBuilder): # <<<<<<<<<<<<<< @@ -1943,11 +1960,11 @@ static PyObject *__pyx_builtin_ValueError; static PyObject *__pyx_builtin_MemoryError; static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_RuntimeError; -static PyObject *__pyx_pf_7sklearn_4tree_5_tree_11TreeBuilder_build(struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight); /* proto */ +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_11TreeBuilder_build(struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight, PyArrayObject *__pyx_v_X_idx_sorted); /* proto */ static int __pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder___cinit__(struct __pyx_obj_7sklearn_4tree_5_tree_DepthFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_splitter, __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_v_min_samples_split, __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_v_min_samples_leaf, double __pyx_v_min_weight_leaf, __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_v_max_depth); /* proto */ -static PyObject *__pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_2build(struct __pyx_obj_7sklearn_4tree_5_tree_DepthFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight); /* proto */ +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_2build(struct __pyx_obj_7sklearn_4tree_5_tree_DepthFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight, PyArrayObject *__pyx_v_X_idx_sorted); /* proto */ static int __pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder___cinit__(struct __pyx_obj_7sklearn_4tree_5_tree_BestFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_splitter, __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_v_min_samples_split, __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_v_min_samples_leaf, PyObject *__pyx_v_min_weight_leaf, __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_v_max_depth, __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_v_max_leaf_nodes); /* proto */ -static PyObject *__pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_2build(struct __pyx_obj_7sklearn_4tree_5_tree_BestFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight); /* proto */ +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_2build(struct __pyx_obj_7sklearn_4tree_5_tree_BestFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight, PyArrayObject *__pyx_v_X_idx_sorted); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_9n_classes___get__(struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_13children_left___get__(struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_14children_right___get__(struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_self); /* proto */ @@ -2069,6 +2086,7 @@ static char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; static char __pyx_k_MemoryError[] = "MemoryError"; static char __pyx_k_right_child[] = "right_child"; static char __pyx_k_RuntimeError[] = "RuntimeError"; +static char __pyx_k_X_idx_sorted[] = "X_idx_sorted"; static char __pyx_k_c_contiguous[] = "c_contiguous"; static char __pyx_k_scipy_sparse[] = "scipy.sparse"; static char __pyx_k_sort_indices[] = "sort_indices"; @@ -2112,6 +2130,7 @@ static PyObject *__pyx_n_s_TREE_UNDEFINED; static PyObject *__pyx_n_s_ValueError; static PyObject *__pyx_n_s_X; static PyObject *__pyx_kp_s_X_dtype_should_be_np_float32_got; +static PyObject *__pyx_n_s_X_idx_sorted; static PyObject *__pyx_kp_s_X_should_be_in_csr_matrix_format; static PyObject *__pyx_kp_s_X_should_be_in_np_ndarray_format; static PyObject *__pyx_kp_s_You_have_loaded_Tree_version_whi; @@ -2211,8 +2230,8 @@ static PyObject *__pyx_tuple__10; * """Interface for different tree building strategies.""" * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_11TreeBuilder_1build(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ @@ -2221,11 +2240,20 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder_build(CYTHON_UNUSED /* "sklearn/tree/_tree.pyx":93 * * cpdef build(self, Tree tree, object X, np.ndarray y, - * np.ndarray sample_weight=None): # <<<<<<<<<<<<<< + * np.ndarray sample_weight=None, # <<<<<<<<<<<<<< + * np.ndarray X_idx_sorted=None): * """Build a decision tree from the training set (X, y).""" - * pass */ PyArrayObject *__pyx_v_sample_weight = ((PyArrayObject *)Py_None); + + /* "sklearn/tree/_tree.pyx":94 + * cpdef build(self, Tree tree, object X, np.ndarray y, + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): # <<<<<<<<<<<<<< + * """Build a decision tree from the training set (X, y).""" + * pass + */ + PyArrayObject *__pyx_v_X_idx_sorted = ((PyArrayObject *)Py_None); PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; @@ -2241,6 +2269,9 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder_build(CYTHON_UNUSED if (__pyx_optional_args) { if (__pyx_optional_args->__pyx_n > 0) { __pyx_v_sample_weight = __pyx_optional_args->sample_weight; + if (__pyx_optional_args->__pyx_n > 1) { + __pyx_v_X_idx_sorted = __pyx_optional_args->X_idx_sorted; + } } } @@ -2248,8 +2279,8 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder_build(CYTHON_UNUSED * """Interface for different tree building strategies.""" * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; @@ -2272,7 +2303,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder_build(CYTHON_UNUSED __pyx_t_5 = 1; } } - __pyx_t_6 = PyTuple_New(4+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyTuple_New(5+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); if (__pyx_t_4) { __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; @@ -2289,6 +2320,9 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder_build(CYTHON_UNUSED __Pyx_INCREF(((PyObject *)__pyx_v_sample_weight)); __Pyx_GIVEREF(((PyObject *)__pyx_v_sample_weight)); PyTuple_SET_ITEM(__pyx_t_6, 3+__pyx_t_5, ((PyObject *)__pyx_v_sample_weight)); + __Pyx_INCREF(((PyObject *)__pyx_v_X_idx_sorted)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_X_idx_sorted)); + PyTuple_SET_ITEM(__pyx_t_6, 4+__pyx_t_5, ((PyObject *)__pyx_v_X_idx_sorted)); __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; @@ -2301,9 +2335,9 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder_build(CYTHON_UNUSED __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } - /* "sklearn/tree/_tree.pyx":94 - * cpdef build(self, Tree tree, object X, np.ndarray y, - * np.ndarray sample_weight=None): + /* "sklearn/tree/_tree.pyx":95 + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): * """Build a decision tree from the training set (X, y).""" # <<<<<<<<<<<<<< * pass * @@ -2330,8 +2364,8 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder_build(CYTHON_UNUSED * """Interface for different tree building strategies.""" * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ /* Python wrapper */ @@ -2342,6 +2376,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_11TreeBuilder_1build(PyObject *_ PyObject *__pyx_v_X = 0; PyArrayObject *__pyx_v_y = 0; PyArrayObject *__pyx_v_sample_weight = 0; + PyArrayObject *__pyx_v_X_idx_sorted = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -2349,21 +2384,31 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_11TreeBuilder_1build(PyObject *_ __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("build (wrapper)", 0); { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_tree,&__pyx_n_s_X,&__pyx_n_s_y,&__pyx_n_s_sample_weight,0}; - PyObject* values[4] = {0,0,0,0}; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_tree,&__pyx_n_s_X,&__pyx_n_s_y,&__pyx_n_s_sample_weight,&__pyx_n_s_X_idx_sorted,0}; + PyObject* values[5] = {0,0,0,0,0}; /* "sklearn/tree/_tree.pyx":93 * * cpdef build(self, Tree tree, object X, np.ndarray y, - * np.ndarray sample_weight=None): # <<<<<<<<<<<<<< + * np.ndarray sample_weight=None, # <<<<<<<<<<<<<< + * np.ndarray X_idx_sorted=None): * """Build a decision tree from the training set (X, y).""" - * pass */ values[3] = (PyObject *)((PyArrayObject *)Py_None); + + /* "sklearn/tree/_tree.pyx":94 + * cpdef build(self, Tree tree, object X, np.ndarray y, + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): # <<<<<<<<<<<<<< + * """Build a decision tree from the training set (X, y).""" + * pass + */ + values[4] = (PyObject *)((PyArrayObject *)Py_None); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); @@ -2379,24 +2424,30 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_11TreeBuilder_1build(PyObject *_ case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_X)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("build", 0, 3, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("build", 0, 3, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("build", 0, 3, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("build", 0, 3, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sample_weight); if (value) { values[3] = value; kw_args--; } } + case 4: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_X_idx_sorted); + if (value) { values[4] = value; kw_args--; } + } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "build") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); @@ -2409,10 +2460,11 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_11TreeBuilder_1build(PyObject *_ __pyx_v_X = values[1]; __pyx_v_y = ((PyArrayObject *)values[2]); __pyx_v_sample_weight = ((PyArrayObject *)values[3]); + __pyx_v_X_idx_sorted = ((PyArrayObject *)values[4]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("build", 0, 3, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("build", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree.TreeBuilder.build", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -2421,14 +2473,15 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_11TreeBuilder_1build(PyObject *_ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_tree), __pyx_ptype_7sklearn_4tree_5_tree_Tree, 1, "tree", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_y), __pyx_ptype_5numpy_ndarray, 1, "y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_weight), __pyx_ptype_5numpy_ndarray, 1, "sample_weight", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_11TreeBuilder_build(((struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *)__pyx_v_self), __pyx_v_tree, __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_idx_sorted), __pyx_ptype_5numpy_ndarray, 1, "X_idx_sorted", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_11TreeBuilder_build(((struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *)__pyx_v_self), __pyx_v_tree, __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight, __pyx_v_X_idx_sorted); /* "sklearn/tree/_tree.pyx":92 * """Interface for different tree building strategies.""" * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ /* function exit code */ @@ -2440,7 +2493,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_11TreeBuilder_1build(PyObject *_ return __pyx_r; } -static PyObject *__pyx_pf_7sklearn_4tree_5_tree_11TreeBuilder_build(struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight) { +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_11TreeBuilder_build(struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight, PyArrayObject *__pyx_v_X_idx_sorted) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; @@ -2450,8 +2503,9 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_11TreeBuilder_build(struct __pyx int __pyx_clineno = 0; __Pyx_RefNannySetupContext("build", 0); __Pyx_XDECREF(__pyx_r); - __pyx_t_2.__pyx_n = 1; + __pyx_t_2.__pyx_n = 2; __pyx_t_2.sample_weight = __pyx_v_sample_weight; + __pyx_t_2.X_idx_sorted = __pyx_v_X_idx_sorted; __pyx_t_1 = __pyx_vtabptr_7sklearn_4tree_5_tree_TreeBuilder->build(__pyx_v_self, __pyx_v_tree, __pyx_v_X, __pyx_v_y, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; @@ -2469,7 +2523,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_11TreeBuilder_build(struct __pyx return __pyx_r; } -/* "sklearn/tree/_tree.pyx":97 +/* "sklearn/tree/_tree.pyx":98 * pass * * cdef inline _check_input(self, object X, np.ndarray y, # <<<<<<<<<<<<<< @@ -2495,14 +2549,14 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(CYTHON __Pyx_INCREF((PyObject *)__pyx_v_y); __Pyx_INCREF((PyObject *)__pyx_v_sample_weight); - /* "sklearn/tree/_tree.pyx":100 + /* "sklearn/tree/_tree.pyx":101 * np.ndarray sample_weight): * """Check input dtype, layout and format""" * if issparse(X): # <<<<<<<<<<<<<< * X = X.tocsc() * X.sort_indices() */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_issparse); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_issparse); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -2515,32 +2569,32 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(CYTHON } } if (!__pyx_t_3) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_X); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_X); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); } else { - __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; __Pyx_INCREF(__pyx_v_X); __Pyx_GIVEREF(__pyx_v_X); PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_X); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_5) { - /* "sklearn/tree/_tree.pyx":101 + /* "sklearn/tree/_tree.pyx":102 * """Check input dtype, layout and format""" * if issparse(X): * X = X.tocsc() # <<<<<<<<<<<<<< * X.sort_indices() * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_tocsc); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_tocsc); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = NULL; if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) { @@ -2553,24 +2607,24 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(CYTHON } } if (__pyx_t_4) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } else { - __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF_SET(__pyx_v_X, __pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":102 + /* "sklearn/tree/_tree.pyx":103 * if issparse(X): * X = X.tocsc() * X.sort_indices() # <<<<<<<<<<<<<< * * if X.data.dtype != DTYPE: */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_sort_indices); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_sort_indices); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = NULL; if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) { @@ -2583,176 +2637,176 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(CYTHON } } if (__pyx_t_4) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } else { - __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":104 + /* "sklearn/tree/_tree.pyx":105 * X.sort_indices() * * if X.data.dtype != DTYPE: # <<<<<<<<<<<<<< * X.data = np.ascontiguousarray(X.data, dtype=DTYPE) * */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_dtype); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_dtype); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_NE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_NE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_5) { - /* "sklearn/tree/_tree.pyx":105 + /* "sklearn/tree/_tree.pyx":106 * * if X.data.dtype != DTYPE: * X.data = np.ascontiguousarray(X.data, dtype=DTYPE) # <<<<<<<<<<<<<< * * if X.indices.dtype != np.int32 or X.indptr.dtype != np.int32: */ - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_ascontiguousarray); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_ascontiguousarray); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_data); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_data); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__Pyx_PyObject_SetAttrStr(__pyx_v_X, __pyx_n_s_data, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_PyObject_SetAttrStr(__pyx_v_X, __pyx_n_s_data, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L4; } __pyx_L4:; - /* "sklearn/tree/_tree.pyx":107 + /* "sklearn/tree/_tree.pyx":108 * X.data = np.ascontiguousarray(X.data, dtype=DTYPE) * * if X.indices.dtype != np.int32 or X.indptr.dtype != np.int32: # <<<<<<<<<<<<<< * raise ValueError("No support for np.int64 index based " * "sparse matrices") */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indices); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indices); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_dtype); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_dtype); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_int32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_int32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyObject_RichCompare(__pyx_t_4, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyObject_RichCompare(__pyx_t_4, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (!__pyx_t_6) { } else { __pyx_t_5 = __pyx_t_6; goto __pyx_L6_bool_binop_done; } - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indptr); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indptr); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_dtype); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_dtype); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_int32); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_int32); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_5 = __pyx_t_6; __pyx_L6_bool_binop_done:; if (__pyx_t_5) { - /* "sklearn/tree/_tree.pyx":108 + /* "sklearn/tree/_tree.pyx":109 * * if X.indices.dtype != np.int32 or X.indptr.dtype != np.int32: * raise ValueError("No support for np.int64 index based " # <<<<<<<<<<<<<< * "sparse matrices") * */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } goto __pyx_L3; } - /* "sklearn/tree/_tree.pyx":111 + /* "sklearn/tree/_tree.pyx":112 * "sparse matrices") * * elif X.dtype != DTYPE: # <<<<<<<<<<<<<< * # since we have to copy we will make it fortran for efficiency * X = np.asfortranarray(X, dtype=DTYPE) */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_dtype); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_dtype); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_5) { - /* "sklearn/tree/_tree.pyx":113 + /* "sklearn/tree/_tree.pyx":114 * elif X.dtype != DTYPE: * # since we have to copy we will make it fortran for efficiency * X = np.asfortranarray(X, dtype=DTYPE) # <<<<<<<<<<<<<< * * if y.dtype != DOUBLE or not y.flags.contiguous: */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asfortranarray); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asfortranarray); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_X); __Pyx_GIVEREF(__pyx_v_X); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_X); - __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; @@ -2763,75 +2817,75 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(CYTHON } __pyx_L3:; - /* "sklearn/tree/_tree.pyx":115 + /* "sklearn/tree/_tree.pyx":116 * X = np.asfortranarray(X, dtype=DTYPE) * * if y.dtype != DOUBLE or not y.flags.contiguous: # <<<<<<<<<<<<<< * y = np.ascontiguousarray(y, dtype=DOUBLE) * */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_y), __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_y), __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_t_3, Py_NE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_t_3, Py_NE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (!__pyx_t_6) { } else { __pyx_t_5 = __pyx_t_6; goto __pyx_L9_bool_binop_done; } - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_y), __pyx_n_s_flags); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_y), __pyx_n_s_flags); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = ((!__pyx_t_6) != 0); __pyx_t_5 = __pyx_t_7; __pyx_L9_bool_binop_done:; if (__pyx_t_5) { - /* "sklearn/tree/_tree.pyx":116 + /* "sklearn/tree/_tree.pyx":117 * * if y.dtype != DOUBLE or not y.flags.contiguous: * y = np.ascontiguousarray(y, dtype=DOUBLE) # <<<<<<<<<<<<<< * * if (sample_weight is not None and */ - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ascontiguousarray); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ascontiguousarray); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)__pyx_v_y)); __Pyx_GIVEREF(((PyObject *)__pyx_v_y)); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_y)); - __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF_SET(__pyx_v_y, ((PyArrayObject *)__pyx_t_4)); __pyx_t_4 = 0; goto __pyx_L8; } __pyx_L8:; - /* "sklearn/tree/_tree.pyx":118 + /* "sklearn/tree/_tree.pyx":119 * y = np.ascontiguousarray(y, dtype=DOUBLE) * * if (sample_weight is not None and # <<<<<<<<<<<<<< @@ -2846,21 +2900,21 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(CYTHON goto __pyx_L12_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":119 + /* "sklearn/tree/_tree.pyx":120 * * if (sample_weight is not None and * (sample_weight.dtype != DOUBLE or # <<<<<<<<<<<<<< * not sample_weight.flags.contiguous)): * sample_weight = np.asarray(sample_weight, dtype=DOUBLE, */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_sample_weight), __pyx_n_s_dtype); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_sample_weight), __pyx_n_s_dtype); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = PyObject_RichCompare(__pyx_t_4, __pyx_t_1, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyObject_RichCompare(__pyx_t_4, __pyx_t_1, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (!__pyx_t_6) { } else { @@ -2868,62 +2922,62 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(CYTHON goto __pyx_L12_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":120 + /* "sklearn/tree/_tree.pyx":121 * if (sample_weight is not None and * (sample_weight.dtype != DOUBLE or * not sample_weight.flags.contiguous)): # <<<<<<<<<<<<<< * sample_weight = np.asarray(sample_weight, dtype=DOUBLE, * order="C") */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_sample_weight), __pyx_n_s_flags); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_sample_weight), __pyx_n_s_flags); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_7 = ((!__pyx_t_6) != 0); __pyx_t_5 = __pyx_t_7; __pyx_L12_bool_binop_done:; if (__pyx_t_5) { - /* "sklearn/tree/_tree.pyx":121 + /* "sklearn/tree/_tree.pyx":122 * (sample_weight.dtype != DOUBLE or * not sample_weight.flags.contiguous)): * sample_weight = np.asarray(sample_weight, dtype=DOUBLE, # <<<<<<<<<<<<<< * order="C") * */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_asarray); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_asarray); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)__pyx_v_sample_weight)); __Pyx_GIVEREF(((PyObject *)__pyx_v_sample_weight)); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_sample_weight)); - __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_order, __pyx_n_s_C) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_order, __pyx_n_s_C) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF_SET(__pyx_v_sample_weight, ((PyArrayObject *)__pyx_t_2)); __pyx_t_2 = 0; goto __pyx_L11; } __pyx_L11:; - /* "sklearn/tree/_tree.pyx":124 + /* "sklearn/tree/_tree.pyx":125 * order="C") * * return X, y, sample_weight # <<<<<<<<<<<<<< @@ -2931,7 +2985,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(CYTHON * # Depth first builder --------------------------------------------------------- */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_X); __Pyx_GIVEREF(__pyx_v_X); @@ -2946,7 +3000,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(CYTHON __pyx_t_2 = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":97 + /* "sklearn/tree/_tree.pyx":98 * pass * * cdef inline _check_input(self, object X, np.ndarray y, # <<<<<<<<<<<<<< @@ -2971,7 +3025,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(CYTHON return __pyx_r; } -/* "sklearn/tree/_tree.pyx":131 +/* "sklearn/tree/_tree.pyx":132 * """Build a decision tree in depth-first fashion.""" * * def __cinit__(self, Splitter splitter, SIZE_t min_samples_split, # <<<<<<<<<<<<<< @@ -3016,26 +3070,26 @@ static int __pyx_pw_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_1__cinit__(PyO case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_samples_split)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_samples_leaf)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_weight_leaf)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_max_depth)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { goto __pyx_L5_argtuple_error; @@ -3047,20 +3101,20 @@ static int __pyx_pw_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_1__cinit__(PyO values[4] = PyTuple_GET_ITEM(__pyx_args, 4); } __pyx_v_splitter = ((struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *)values[0]); - __pyx_v_min_samples_split = __Pyx_PyInt_As_Py_intptr_t(values[1]); if (unlikely((__pyx_v_min_samples_split == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_samples_leaf = __Pyx_PyInt_As_Py_intptr_t(values[2]); if (unlikely((__pyx_v_min_samples_leaf == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_weight_leaf = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_min_weight_leaf == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_max_depth = __Pyx_PyInt_As_Py_intptr_t(values[4]); if (unlikely((__pyx_v_max_depth == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_samples_split = __Pyx_PyInt_As_Py_intptr_t(values[1]); if (unlikely((__pyx_v_min_samples_split == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_samples_leaf = __Pyx_PyInt_As_Py_intptr_t(values[2]); if (unlikely((__pyx_v_min_samples_leaf == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_weight_leaf = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_min_weight_leaf == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_max_depth = __Pyx_PyInt_As_Py_intptr_t(values[4]); if (unlikely((__pyx_v_max_depth == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree.DepthFirstTreeBuilder.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_splitter), __pyx_ptype_7sklearn_4tree_9_splitter_Splitter, 1, "splitter", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_splitter), __pyx_ptype_7sklearn_4tree_9_splitter_Splitter, 1, "splitter", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder___cinit__(((struct __pyx_obj_7sklearn_4tree_5_tree_DepthFirstTreeBuilder *)__pyx_v_self), __pyx_v_splitter, __pyx_v_min_samples_split, __pyx_v_min_samples_leaf, __pyx_v_min_weight_leaf, __pyx_v_max_depth); /* function exit code */ @@ -3077,7 +3131,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder___cinit__(stru __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__", 0); - /* "sklearn/tree/_tree.pyx":134 + /* "sklearn/tree/_tree.pyx":135 * SIZE_t min_samples_leaf, double min_weight_leaf, * SIZE_t max_depth): * self.splitter = splitter # <<<<<<<<<<<<<< @@ -3090,7 +3144,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder___cinit__(stru __Pyx_DECREF(((PyObject *)__pyx_v_self->__pyx_base.splitter)); __pyx_v_self->__pyx_base.splitter = __pyx_v_splitter; - /* "sklearn/tree/_tree.pyx":135 + /* "sklearn/tree/_tree.pyx":136 * SIZE_t max_depth): * self.splitter = splitter * self.min_samples_split = min_samples_split # <<<<<<<<<<<<<< @@ -3099,7 +3153,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder___cinit__(stru */ __pyx_v_self->__pyx_base.min_samples_split = __pyx_v_min_samples_split; - /* "sklearn/tree/_tree.pyx":136 + /* "sklearn/tree/_tree.pyx":137 * self.splitter = splitter * self.min_samples_split = min_samples_split * self.min_samples_leaf = min_samples_leaf # <<<<<<<<<<<<<< @@ -3108,7 +3162,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder___cinit__(stru */ __pyx_v_self->__pyx_base.min_samples_leaf = __pyx_v_min_samples_leaf; - /* "sklearn/tree/_tree.pyx":137 + /* "sklearn/tree/_tree.pyx":138 * self.min_samples_split = min_samples_split * self.min_samples_leaf = min_samples_leaf * self.min_weight_leaf = min_weight_leaf # <<<<<<<<<<<<<< @@ -3117,7 +3171,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder___cinit__(stru */ __pyx_v_self->__pyx_base.min_weight_leaf = __pyx_v_min_weight_leaf; - /* "sklearn/tree/_tree.pyx":138 + /* "sklearn/tree/_tree.pyx":139 * self.min_samples_leaf = min_samples_leaf * self.min_weight_leaf = min_weight_leaf * self.max_depth = max_depth # <<<<<<<<<<<<<< @@ -3126,7 +3180,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder___cinit__(stru */ __pyx_v_self->__pyx_base.max_depth = __pyx_v_max_depth; - /* "sklearn/tree/_tree.pyx":131 + /* "sklearn/tree/_tree.pyx":132 * """Build a decision tree in depth-first fashion.""" * * def __cinit__(self, Splitter splitter, SIZE_t min_samples_split, # <<<<<<<<<<<<<< @@ -3140,25 +3194,34 @@ static int __pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder___cinit__(stru return __pyx_r; } -/* "sklearn/tree/_tree.pyx":140 +/* "sklearn/tree/_tree.pyx":141 * self.max_depth = max_depth * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_3build(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(struct __pyx_obj_7sklearn_4tree_5_tree_DepthFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, int __pyx_skip_dispatch, struct __pyx_opt_args_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build *__pyx_optional_args) { - /* "sklearn/tree/_tree.pyx":141 + /* "sklearn/tree/_tree.pyx":142 * * cpdef build(self, Tree tree, object X, np.ndarray y, - * np.ndarray sample_weight=None): # <<<<<<<<<<<<<< + * np.ndarray sample_weight=None, # <<<<<<<<<<<<<< + * np.ndarray X_idx_sorted=None): * """Build a decision tree from the training set (X, y).""" - * */ PyArrayObject *__pyx_v_sample_weight = ((PyArrayObject *)Py_None); + + /* "sklearn/tree/_tree.pyx":143 + * cpdef build(self, Tree tree, object X, np.ndarray y, + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): # <<<<<<<<<<<<<< + * """Build a decision tree from the training set (X, y).""" + * + */ + PyArrayObject *__pyx_v_X_idx_sorted = ((PyArrayObject *)Py_None); __pyx_t_7sklearn_4tree_5_tree_DOUBLE_t *__pyx_v_sample_weight_ptr; int __pyx_v_init_capacity; struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_splitter = 0; @@ -3197,10 +3260,11 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str int __pyx_t_9; __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_t_10; double __pyx_t_11; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_12; - __pyx_t_7sklearn_4tree_6_utils_SIZE_t __pyx_t_13; - int __pyx_t_14; - struct __pyx_opt_args_7sklearn_4tree_5_tree_4Tree__resize_c __pyx_t_15; + struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init __pyx_t_12; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_13; + __pyx_t_7sklearn_4tree_6_utils_SIZE_t __pyx_t_14; + int __pyx_t_15; + struct __pyx_opt_args_7sklearn_4tree_5_tree_4Tree__resize_c __pyx_t_16; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -3208,24 +3272,27 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str if (__pyx_optional_args) { if (__pyx_optional_args->__pyx_n > 0) { __pyx_v_sample_weight = __pyx_optional_args->sample_weight; + if (__pyx_optional_args->__pyx_n > 1) { + __pyx_v_X_idx_sorted = __pyx_optional_args->X_idx_sorted; + } } } __Pyx_INCREF(__pyx_v_X); __Pyx_INCREF((PyObject *)__pyx_v_y); __Pyx_INCREF((PyObject *)__pyx_v_sample_weight); - /* "sklearn/tree/_tree.pyx":140 + /* "sklearn/tree/_tree.pyx":141 * self.max_depth = max_depth * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overridden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_build); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_build); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_3build)) { __Pyx_XDECREF(__pyx_r); @@ -3242,7 +3309,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_5 = 1; } } - __pyx_t_6 = PyTuple_New(4+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyTuple_New(5+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); if (__pyx_t_4) { __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; @@ -3259,7 +3326,10 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __Pyx_INCREF(((PyObject *)__pyx_v_sample_weight)); __Pyx_GIVEREF(((PyObject *)__pyx_v_sample_weight)); PyTuple_SET_ITEM(__pyx_t_6, 3+__pyx_t_5, ((PyObject *)__pyx_v_sample_weight)); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_INCREF(((PyObject *)__pyx_v_X_idx_sorted)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_X_idx_sorted)); + PyTuple_SET_ITEM(__pyx_t_6, 4+__pyx_t_5, ((PyObject *)__pyx_v_X_idx_sorted)); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -3271,14 +3341,14 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } - /* "sklearn/tree/_tree.pyx":145 + /* "sklearn/tree/_tree.pyx":147 * * # check input * X, y, sample_weight = self._check_input(X, y, sample_weight) # <<<<<<<<<<<<<< * * cdef DOUBLE_t* sample_weight_ptr = NULL */ - __pyx_t_1 = __pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(((struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *)__pyx_v_self), __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(((struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *)__pyx_v_self), __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { PyObject* sequence = __pyx_t_1; @@ -3290,7 +3360,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str if (unlikely(size != 3)) { if (size > 3) __Pyx_RaiseTooManyValuesError(3); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { @@ -3306,17 +3376,17 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_6); #else - __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_6 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); #endif __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } else { Py_ssize_t index = -1; - __pyx_t_4 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_7 = Py_TYPE(__pyx_t_4)->tp_iternext; @@ -3326,7 +3396,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __Pyx_GOTREF(__pyx_t_3); index = 2; __pyx_t_6 = __pyx_t_7(__pyx_t_4); if (unlikely(!__pyx_t_6)) goto __pyx_L3_unpacking_failed; __Pyx_GOTREF(__pyx_t_6); - if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_4), 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_4), 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = NULL; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; goto __pyx_L4_unpacking_done; @@ -3334,11 +3404,11 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_7 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L4_unpacking_done:; } - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF_SET(__pyx_v_X, __pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF_SET(__pyx_v_y, ((PyArrayObject *)__pyx_t_3)); @@ -3346,7 +3416,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __Pyx_DECREF_SET(__pyx_v_sample_weight, ((PyArrayObject *)__pyx_t_6)); __pyx_t_6 = 0; - /* "sklearn/tree/_tree.pyx":147 + /* "sklearn/tree/_tree.pyx":149 * X, y, sample_weight = self._check_input(X, y, sample_weight) * * cdef DOUBLE_t* sample_weight_ptr = NULL # <<<<<<<<<<<<<< @@ -3355,7 +3425,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_sample_weight_ptr = NULL; - /* "sklearn/tree/_tree.pyx":148 + /* "sklearn/tree/_tree.pyx":150 * * cdef DOUBLE_t* sample_weight_ptr = NULL * if sample_weight is not None: # <<<<<<<<<<<<<< @@ -3366,7 +3436,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = (__pyx_t_8 != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":149 + /* "sklearn/tree/_tree.pyx":151 * cdef DOUBLE_t* sample_weight_ptr = NULL * if sample_weight is not None: * sample_weight_ptr = sample_weight.data # <<<<<<<<<<<<<< @@ -3378,7 +3448,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str } __pyx_L5:; - /* "sklearn/tree/_tree.pyx":154 + /* "sklearn/tree/_tree.pyx":156 * cdef int init_capacity * * if tree.max_depth <= 10: # <<<<<<<<<<<<<< @@ -3388,7 +3458,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((__pyx_v_tree->max_depth <= 10) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":155 + /* "sklearn/tree/_tree.pyx":157 * * if tree.max_depth <= 10: * init_capacity = (2 ** (tree.max_depth + 1)) - 1 # <<<<<<<<<<<<<< @@ -3400,7 +3470,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str } /*else*/ { - /* "sklearn/tree/_tree.pyx":157 + /* "sklearn/tree/_tree.pyx":159 * init_capacity = (2 ** (tree.max_depth + 1)) - 1 * else: * init_capacity = 2047 # <<<<<<<<<<<<<< @@ -3411,16 +3481,16 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str } __pyx_L6:; - /* "sklearn/tree/_tree.pyx":159 + /* "sklearn/tree/_tree.pyx":161 * init_capacity = 2047 * * tree._resize(init_capacity) # <<<<<<<<<<<<<< * * # Parameters */ - ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_tree->__pyx_vtab)->_resize(__pyx_v_tree, __pyx_v_init_capacity); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_tree->__pyx_vtab)->_resize(__pyx_v_tree, __pyx_v_init_capacity); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":162 + /* "sklearn/tree/_tree.pyx":164 * * # Parameters * cdef Splitter splitter = self.splitter # <<<<<<<<<<<<<< @@ -3432,7 +3502,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_v_splitter = ((struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *)__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":163 + /* "sklearn/tree/_tree.pyx":165 * # Parameters * cdef Splitter splitter = self.splitter * cdef SIZE_t max_depth = self.max_depth # <<<<<<<<<<<<<< @@ -3442,7 +3512,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_10 = __pyx_v_self->__pyx_base.max_depth; __pyx_v_max_depth = __pyx_t_10; - /* "sklearn/tree/_tree.pyx":164 + /* "sklearn/tree/_tree.pyx":166 * cdef Splitter splitter = self.splitter * cdef SIZE_t max_depth = self.max_depth * cdef SIZE_t min_samples_leaf = self.min_samples_leaf # <<<<<<<<<<<<<< @@ -3452,7 +3522,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_10 = __pyx_v_self->__pyx_base.min_samples_leaf; __pyx_v_min_samples_leaf = __pyx_t_10; - /* "sklearn/tree/_tree.pyx":165 + /* "sklearn/tree/_tree.pyx":167 * cdef SIZE_t max_depth = self.max_depth * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf # <<<<<<<<<<<<<< @@ -3462,7 +3532,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_11 = __pyx_v_self->__pyx_base.min_weight_leaf; __pyx_v_min_weight_leaf = __pyx_t_11; - /* "sklearn/tree/_tree.pyx":166 + /* "sklearn/tree/_tree.pyx":168 * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf * cdef SIZE_t min_samples_split = self.min_samples_split # <<<<<<<<<<<<<< @@ -3472,26 +3542,28 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_10 = __pyx_v_self->__pyx_base.min_samples_split; __pyx_v_min_samples_split = __pyx_t_10; - /* "sklearn/tree/_tree.pyx":169 + /* "sklearn/tree/_tree.pyx":171 * * # Recursive partition (without actual recursion) - * splitter.init(X, y, sample_weight_ptr) # <<<<<<<<<<<<<< + * splitter.init(X, y, sample_weight_ptr, X_idx_sorted) # <<<<<<<<<<<<<< * * cdef SIZE_t start */ - ((struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_splitter->__pyx_vtab)->init(__pyx_v_splitter, __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight_ptr); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_12.__pyx_n = 1; + __pyx_t_12.X_idx_sorted = __pyx_v_X_idx_sorted; + ((struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_splitter->__pyx_vtab)->init(__pyx_v_splitter, __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight_ptr, &__pyx_t_12); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":176 + /* "sklearn/tree/_tree.pyx":178 * cdef SIZE_t parent * cdef bint is_left * cdef SIZE_t n_node_samples = splitter.n_samples # <<<<<<<<<<<<<< * cdef double weighted_n_samples = splitter.weighted_n_samples * cdef double weighted_n_node_samples */ - __pyx_t_12 = __pyx_v_splitter->n_samples; - __pyx_v_n_node_samples = __pyx_t_12; + __pyx_t_13 = __pyx_v_splitter->n_samples; + __pyx_v_n_node_samples = __pyx_t_13; - /* "sklearn/tree/_tree.pyx":177 + /* "sklearn/tree/_tree.pyx":179 * cdef bint is_left * cdef SIZE_t n_node_samples = splitter.n_samples * cdef double weighted_n_samples = splitter.weighted_n_samples # <<<<<<<<<<<<<< @@ -3501,7 +3573,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_11 = __pyx_v_splitter->weighted_n_samples; __pyx_v_weighted_n_samples = __pyx_t_11; - /* "sklearn/tree/_tree.pyx":183 + /* "sklearn/tree/_tree.pyx":185 * * cdef double threshold * cdef double impurity = INFINITY # <<<<<<<<<<<<<< @@ -3510,7 +3582,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_impurity = __pyx_v_7sklearn_4tree_5_tree_INFINITY; - /* "sklearn/tree/_tree.pyx":186 + /* "sklearn/tree/_tree.pyx":188 * cdef SIZE_t n_constant_features * cdef bint is_leaf * cdef bint first = 1 # <<<<<<<<<<<<<< @@ -3519,7 +3591,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_first = 1; - /* "sklearn/tree/_tree.pyx":187 + /* "sklearn/tree/_tree.pyx":189 * cdef bint is_leaf * cdef bint first = 1 * cdef SIZE_t max_depth_seen = -1 # <<<<<<<<<<<<<< @@ -3528,7 +3600,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_max_depth_seen = -1; - /* "sklearn/tree/_tree.pyx":188 + /* "sklearn/tree/_tree.pyx":190 * cdef bint first = 1 * cdef SIZE_t max_depth_seen = -1 * cdef int rc = 0 # <<<<<<<<<<<<<< @@ -3537,27 +3609,27 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_rc = 0; - /* "sklearn/tree/_tree.pyx":190 + /* "sklearn/tree/_tree.pyx":192 * cdef int rc = 0 * * cdef Stack stack = Stack(INITIAL_STACK_SIZE) # <<<<<<<<<<<<<< * cdef StackRecord stack_record * */ - __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_7sklearn_4tree_5_tree_INITIAL_STACK_SIZE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_7sklearn_4tree_5_tree_INITIAL_STACK_SIZE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_6_utils_Stack)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_6_utils_Stack)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_v_stack = ((struct __pyx_obj_7sklearn_4tree_6_utils_Stack *)__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":194 + /* "sklearn/tree/_tree.pyx":196 * * # push root node onto stack * rc = stack.push(0, n_node_samples, 0, _TREE_UNDEFINED, 0, INFINITY, 0) # <<<<<<<<<<<<<< @@ -3566,7 +3638,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_rc = ((struct __pyx_vtabstruct_7sklearn_4tree_6_utils_Stack *)__pyx_v_stack->__pyx_vtab)->push(__pyx_v_stack, 0, __pyx_v_n_node_samples, 0, __pyx_v_7sklearn_4tree_5_tree__TREE_UNDEFINED, 0, __pyx_v_7sklearn_4tree_5_tree_INFINITY, 0); - /* "sklearn/tree/_tree.pyx":195 + /* "sklearn/tree/_tree.pyx":197 * # push root node onto stack * rc = stack.push(0, n_node_samples, 0, _TREE_UNDEFINED, 0, INFINITY, 0) * if rc == -1: # <<<<<<<<<<<<<< @@ -3576,17 +3648,17 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((__pyx_v_rc == -1) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":197 + /* "sklearn/tree/_tree.pyx":199 * if rc == -1: * # got return code -1 - out-of-memory * raise MemoryError() # <<<<<<<<<<<<<< * * with nogil: */ - PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":199 + /* "sklearn/tree/_tree.pyx":201 * raise MemoryError() * * with nogil: # <<<<<<<<<<<<<< @@ -3600,7 +3672,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str #endif /*try:*/ { - /* "sklearn/tree/_tree.pyx":200 + /* "sklearn/tree/_tree.pyx":202 * * with nogil: * while not stack.is_empty(): # <<<<<<<<<<<<<< @@ -3611,7 +3683,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((!(((struct __pyx_vtabstruct_7sklearn_4tree_6_utils_Stack *)__pyx_v_stack->__pyx_vtab)->is_empty(__pyx_v_stack) != 0)) != 0); if (!__pyx_t_9) break; - /* "sklearn/tree/_tree.pyx":201 + /* "sklearn/tree/_tree.pyx":203 * with nogil: * while not stack.is_empty(): * stack.pop(&stack_record) # <<<<<<<<<<<<<< @@ -3620,47 +3692,47 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ ((struct __pyx_vtabstruct_7sklearn_4tree_6_utils_Stack *)__pyx_v_stack->__pyx_vtab)->pop(__pyx_v_stack, (&__pyx_v_stack_record)); - /* "sklearn/tree/_tree.pyx":203 + /* "sklearn/tree/_tree.pyx":205 * stack.pop(&stack_record) * * start = stack_record.start # <<<<<<<<<<<<<< * end = stack_record.end * depth = stack_record.depth */ - __pyx_t_13 = __pyx_v_stack_record.start; - __pyx_v_start = __pyx_t_13; + __pyx_t_14 = __pyx_v_stack_record.start; + __pyx_v_start = __pyx_t_14; - /* "sklearn/tree/_tree.pyx":204 + /* "sklearn/tree/_tree.pyx":206 * * start = stack_record.start * end = stack_record.end # <<<<<<<<<<<<<< * depth = stack_record.depth * parent = stack_record.parent */ - __pyx_t_13 = __pyx_v_stack_record.end; - __pyx_v_end = __pyx_t_13; + __pyx_t_14 = __pyx_v_stack_record.end; + __pyx_v_end = __pyx_t_14; - /* "sklearn/tree/_tree.pyx":205 + /* "sklearn/tree/_tree.pyx":207 * start = stack_record.start * end = stack_record.end * depth = stack_record.depth # <<<<<<<<<<<<<< * parent = stack_record.parent * is_left = stack_record.is_left */ - __pyx_t_13 = __pyx_v_stack_record.depth; - __pyx_v_depth = __pyx_t_13; + __pyx_t_14 = __pyx_v_stack_record.depth; + __pyx_v_depth = __pyx_t_14; - /* "sklearn/tree/_tree.pyx":206 + /* "sklearn/tree/_tree.pyx":208 * end = stack_record.end * depth = stack_record.depth * parent = stack_record.parent # <<<<<<<<<<<<<< * is_left = stack_record.is_left * impurity = stack_record.impurity */ - __pyx_t_13 = __pyx_v_stack_record.parent; - __pyx_v_parent = __pyx_t_13; + __pyx_t_14 = __pyx_v_stack_record.parent; + __pyx_v_parent = __pyx_t_14; - /* "sklearn/tree/_tree.pyx":207 + /* "sklearn/tree/_tree.pyx":209 * depth = stack_record.depth * parent = stack_record.parent * is_left = stack_record.is_left # <<<<<<<<<<<<<< @@ -3670,7 +3742,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = __pyx_v_stack_record.is_left; __pyx_v_is_left = __pyx_t_9; - /* "sklearn/tree/_tree.pyx":208 + /* "sklearn/tree/_tree.pyx":210 * parent = stack_record.parent * is_left = stack_record.is_left * impurity = stack_record.impurity # <<<<<<<<<<<<<< @@ -3680,17 +3752,17 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_11 = __pyx_v_stack_record.impurity; __pyx_v_impurity = __pyx_t_11; - /* "sklearn/tree/_tree.pyx":209 + /* "sklearn/tree/_tree.pyx":211 * is_left = stack_record.is_left * impurity = stack_record.impurity * n_constant_features = stack_record.n_constant_features # <<<<<<<<<<<<<< * * n_node_samples = end - start */ - __pyx_t_13 = __pyx_v_stack_record.n_constant_features; - __pyx_v_n_constant_features = __pyx_t_13; + __pyx_t_14 = __pyx_v_stack_record.n_constant_features; + __pyx_v_n_constant_features = __pyx_t_14; - /* "sklearn/tree/_tree.pyx":211 + /* "sklearn/tree/_tree.pyx":213 * n_constant_features = stack_record.n_constant_features * * n_node_samples = end - start # <<<<<<<<<<<<<< @@ -3699,7 +3771,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_n_node_samples = (__pyx_v_end - __pyx_v_start); - /* "sklearn/tree/_tree.pyx":212 + /* "sklearn/tree/_tree.pyx":214 * * n_node_samples = end - start * splitter.node_reset(start, end, &weighted_n_node_samples) # <<<<<<<<<<<<<< @@ -3708,7 +3780,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ ((struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_splitter->__pyx_vtab)->node_reset(__pyx_v_splitter, __pyx_v_start, __pyx_v_end, (&__pyx_v_weighted_n_node_samples)); - /* "sklearn/tree/_tree.pyx":214 + /* "sklearn/tree/_tree.pyx":216 * splitter.node_reset(start, end, &weighted_n_node_samples) * * is_leaf = ((depth >= max_depth) or # <<<<<<<<<<<<<< @@ -3722,7 +3794,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str goto __pyx_L13_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":215 + /* "sklearn/tree/_tree.pyx":217 * * is_leaf = ((depth >= max_depth) or * (n_node_samples < min_samples_split) or # <<<<<<<<<<<<<< @@ -3736,7 +3808,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str goto __pyx_L13_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":216 + /* "sklearn/tree/_tree.pyx":218 * is_leaf = ((depth >= max_depth) or * (n_node_samples < min_samples_split) or * (n_node_samples < 2 * min_samples_leaf) or # <<<<<<<<<<<<<< @@ -3750,7 +3822,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str goto __pyx_L13_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":217 + /* "sklearn/tree/_tree.pyx":219 * (n_node_samples < min_samples_split) or * (n_node_samples < 2 * min_samples_leaf) or * (weighted_n_node_samples < min_weight_leaf)) # <<<<<<<<<<<<<< @@ -3762,7 +3834,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_L13_bool_binop_done:; __pyx_v_is_leaf = __pyx_t_9; - /* "sklearn/tree/_tree.pyx":219 + /* "sklearn/tree/_tree.pyx":221 * (weighted_n_node_samples < min_weight_leaf)) * * if first: # <<<<<<<<<<<<<< @@ -3772,7 +3844,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = (__pyx_v_first != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":220 + /* "sklearn/tree/_tree.pyx":222 * * if first: * impurity = splitter.node_impurity() # <<<<<<<<<<<<<< @@ -3781,7 +3853,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_impurity = ((struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_splitter->__pyx_vtab)->node_impurity(__pyx_v_splitter); - /* "sklearn/tree/_tree.pyx":221 + /* "sklearn/tree/_tree.pyx":223 * if first: * impurity = splitter.node_impurity() * first = 0 # <<<<<<<<<<<<<< @@ -3793,7 +3865,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str } __pyx_L17:; - /* "sklearn/tree/_tree.pyx":223 + /* "sklearn/tree/_tree.pyx":225 * first = 0 * * is_leaf = is_leaf or (impurity <= MIN_IMPURITY_SPLIT) # <<<<<<<<<<<<<< @@ -3811,7 +3883,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_L18_bool_binop_done:; __pyx_v_is_leaf = __pyx_t_9; - /* "sklearn/tree/_tree.pyx":225 + /* "sklearn/tree/_tree.pyx":227 * is_leaf = is_leaf or (impurity <= MIN_IMPURITY_SPLIT) * * if not is_leaf: # <<<<<<<<<<<<<< @@ -3821,7 +3893,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((!(__pyx_v_is_leaf != 0)) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":226 + /* "sklearn/tree/_tree.pyx":228 * * if not is_leaf: * splitter.node_split(impurity, &split, &n_constant_features) # <<<<<<<<<<<<<< @@ -3830,7 +3902,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ ((struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_splitter->__pyx_vtab)->node_split(__pyx_v_splitter, __pyx_v_impurity, (&__pyx_v_split), (&__pyx_v_n_constant_features)); - /* "sklearn/tree/_tree.pyx":227 + /* "sklearn/tree/_tree.pyx":229 * if not is_leaf: * splitter.node_split(impurity, &split, &n_constant_features) * is_leaf = is_leaf or (split.pos >= end) # <<<<<<<<<<<<<< @@ -3851,7 +3923,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str } __pyx_L20:; - /* "sklearn/tree/_tree.pyx":229 + /* "sklearn/tree/_tree.pyx":231 * is_leaf = is_leaf or (split.pos >= end) * * node_id = tree._add_node(parent, is_left, is_leaf, split.feature, # <<<<<<<<<<<<<< @@ -3860,7 +3932,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_node_id = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_tree->__pyx_vtab)->_add_node(__pyx_v_tree, __pyx_v_parent, __pyx_v_is_left, __pyx_v_is_leaf, __pyx_v_split.feature, __pyx_v_split.threshold, __pyx_v_impurity, __pyx_v_n_node_samples, __pyx_v_weighted_n_node_samples); - /* "sklearn/tree/_tree.pyx":233 + /* "sklearn/tree/_tree.pyx":235 * weighted_n_node_samples) * * if node_id == (-1): # <<<<<<<<<<<<<< @@ -3870,7 +3942,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((__pyx_v_node_id == ((__pyx_t_7sklearn_4tree_5_tree_SIZE_t)-1)) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":234 + /* "sklearn/tree/_tree.pyx":236 * * if node_id == (-1): * rc = -1 # <<<<<<<<<<<<<< @@ -3879,7 +3951,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_rc = -1; - /* "sklearn/tree/_tree.pyx":235 + /* "sklearn/tree/_tree.pyx":237 * if node_id == (-1): * rc = -1 * break # <<<<<<<<<<<<<< @@ -3889,7 +3961,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str goto __pyx_L12_break; } - /* "sklearn/tree/_tree.pyx":239 + /* "sklearn/tree/_tree.pyx":241 * # Store value for all nodes, to facilitate tree/model * # inspection and interpretation * splitter.node_value(tree.value + node_id * tree.value_stride) # <<<<<<<<<<<<<< @@ -3898,7 +3970,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ ((struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_splitter->__pyx_vtab)->node_value(__pyx_v_splitter, (__pyx_v_tree->value + (__pyx_v_node_id * __pyx_v_tree->value_stride))); - /* "sklearn/tree/_tree.pyx":241 + /* "sklearn/tree/_tree.pyx":243 * splitter.node_value(tree.value + node_id * tree.value_stride) * * if not is_leaf: # <<<<<<<<<<<<<< @@ -3908,7 +3980,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((!(__pyx_v_is_leaf != 0)) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":243 + /* "sklearn/tree/_tree.pyx":245 * if not is_leaf: * # Push right child on stack * rc = stack.push(split.pos, end, depth + 1, node_id, 0, # <<<<<<<<<<<<<< @@ -3917,7 +3989,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_rc = ((struct __pyx_vtabstruct_7sklearn_4tree_6_utils_Stack *)__pyx_v_stack->__pyx_vtab)->push(__pyx_v_stack, __pyx_v_split.pos, __pyx_v_end, (__pyx_v_depth + 1), __pyx_v_node_id, 0, __pyx_v_split.impurity_right, __pyx_v_n_constant_features); - /* "sklearn/tree/_tree.pyx":245 + /* "sklearn/tree/_tree.pyx":247 * rc = stack.push(split.pos, end, depth + 1, node_id, 0, * split.impurity_right, n_constant_features) * if rc == -1: # <<<<<<<<<<<<<< @@ -3927,7 +3999,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((__pyx_v_rc == -1) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":246 + /* "sklearn/tree/_tree.pyx":248 * split.impurity_right, n_constant_features) * if rc == -1: * break # <<<<<<<<<<<<<< @@ -3937,7 +4009,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str goto __pyx_L12_break; } - /* "sklearn/tree/_tree.pyx":249 + /* "sklearn/tree/_tree.pyx":251 * * # Push left child on stack * rc = stack.push(start, split.pos, depth + 1, node_id, 1, # <<<<<<<<<<<<<< @@ -3946,7 +4018,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str */ __pyx_v_rc = ((struct __pyx_vtabstruct_7sklearn_4tree_6_utils_Stack *)__pyx_v_stack->__pyx_vtab)->push(__pyx_v_stack, __pyx_v_start, __pyx_v_split.pos, (__pyx_v_depth + 1), __pyx_v_node_id, 1, __pyx_v_split.impurity_left, __pyx_v_n_constant_features); - /* "sklearn/tree/_tree.pyx":251 + /* "sklearn/tree/_tree.pyx":253 * rc = stack.push(start, split.pos, depth + 1, node_id, 1, * split.impurity_left, n_constant_features) * if rc == -1: # <<<<<<<<<<<<<< @@ -3956,7 +4028,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((__pyx_v_rc == -1) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":252 + /* "sklearn/tree/_tree.pyx":254 * split.impurity_left, n_constant_features) * if rc == -1: * break # <<<<<<<<<<<<<< @@ -3969,7 +4041,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str } __pyx_L24:; - /* "sklearn/tree/_tree.pyx":254 + /* "sklearn/tree/_tree.pyx":256 * break * * if depth > max_depth_seen: # <<<<<<<<<<<<<< @@ -3979,7 +4051,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((__pyx_v_depth > __pyx_v_max_depth_seen) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":255 + /* "sklearn/tree/_tree.pyx":257 * * if depth > max_depth_seen: * max_depth_seen = depth # <<<<<<<<<<<<<< @@ -3993,7 +4065,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str } __pyx_L12_break:; - /* "sklearn/tree/_tree.pyx":257 + /* "sklearn/tree/_tree.pyx":259 * max_depth_seen = depth * * if rc >= 0: # <<<<<<<<<<<<<< @@ -4003,22 +4075,22 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((__pyx_v_rc >= 0) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":258 + /* "sklearn/tree/_tree.pyx":260 * * if rc >= 0: * rc = tree._resize_c(tree.node_count) # <<<<<<<<<<<<<< * * if rc >= 0: */ - __pyx_t_15.__pyx_n = 1; - __pyx_t_15.capacity = __pyx_v_tree->node_count; - __pyx_t_14 = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_tree->__pyx_vtab)->_resize_c(__pyx_v_tree, &__pyx_t_15); - __pyx_v_rc = __pyx_t_14; + __pyx_t_16.__pyx_n = 1; + __pyx_t_16.capacity = __pyx_v_tree->node_count; + __pyx_t_15 = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_tree->__pyx_vtab)->_resize_c(__pyx_v_tree, &__pyx_t_16); + __pyx_v_rc = __pyx_t_15; goto __pyx_L28; } __pyx_L28:; - /* "sklearn/tree/_tree.pyx":260 + /* "sklearn/tree/_tree.pyx":262 * rc = tree._resize_c(tree.node_count) * * if rc >= 0: # <<<<<<<<<<<<<< @@ -4028,7 +4100,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((__pyx_v_rc >= 0) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":261 + /* "sklearn/tree/_tree.pyx":263 * * if rc >= 0: * tree.max_depth = max_depth_seen # <<<<<<<<<<<<<< @@ -4041,7 +4113,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_L29:; } - /* "sklearn/tree/_tree.pyx":199 + /* "sklearn/tree/_tree.pyx":201 * raise MemoryError() * * with nogil: # <<<<<<<<<<<<<< @@ -4059,7 +4131,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str } } - /* "sklearn/tree/_tree.pyx":262 + /* "sklearn/tree/_tree.pyx":264 * if rc >= 0: * tree.max_depth = max_depth_seen * if rc == -1: # <<<<<<<<<<<<<< @@ -4069,22 +4141,22 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build(str __pyx_t_9 = ((__pyx_v_rc == -1) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":263 + /* "sklearn/tree/_tree.pyx":265 * tree.max_depth = max_depth_seen * if rc == -1: * raise MemoryError() # <<<<<<<<<<<<<< * * */ - PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":140 + /* "sklearn/tree/_tree.pyx":141 * self.max_depth = max_depth * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ /* function exit code */ @@ -4117,6 +4189,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_3build(P PyObject *__pyx_v_X = 0; PyArrayObject *__pyx_v_y = 0; PyArrayObject *__pyx_v_sample_weight = 0; + PyArrayObject *__pyx_v_X_idx_sorted = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -4124,21 +4197,31 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_3build(P __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("build (wrapper)", 0); { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_tree,&__pyx_n_s_X,&__pyx_n_s_y,&__pyx_n_s_sample_weight,0}; - PyObject* values[4] = {0,0,0,0}; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_tree,&__pyx_n_s_X,&__pyx_n_s_y,&__pyx_n_s_sample_weight,&__pyx_n_s_X_idx_sorted,0}; + PyObject* values[5] = {0,0,0,0,0}; - /* "sklearn/tree/_tree.pyx":141 + /* "sklearn/tree/_tree.pyx":142 * * cpdef build(self, Tree tree, object X, np.ndarray y, - * np.ndarray sample_weight=None): # <<<<<<<<<<<<<< + * np.ndarray sample_weight=None, # <<<<<<<<<<<<<< + * np.ndarray X_idx_sorted=None): * """Build a decision tree from the training set (X, y).""" - * */ values[3] = (PyObject *)((PyArrayObject *)Py_None); + + /* "sklearn/tree/_tree.pyx":143 + * cpdef build(self, Tree tree, object X, np.ndarray y, + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): # <<<<<<<<<<<<<< + * """Build a decision tree from the training set (X, y).""" + * + */ + values[4] = (PyObject *)((PyArrayObject *)Py_None); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); @@ -4154,24 +4237,30 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_3build(P case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_X)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("build", 0, 3, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("build", 0, 3, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("build", 0, 3, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("build", 0, 3, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sample_weight); if (value) { values[3] = value; kw_args--; } } + case 4: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_X_idx_sorted); + if (value) { values[4] = value; kw_args--; } + } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "build") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "build") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); @@ -4184,26 +4273,28 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_3build(P __pyx_v_X = values[1]; __pyx_v_y = ((PyArrayObject *)values[2]); __pyx_v_sample_weight = ((PyArrayObject *)values[3]); + __pyx_v_X_idx_sorted = ((PyArrayObject *)values[4]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("build", 0, 3, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("build", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree.DepthFirstTreeBuilder.build", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_tree), __pyx_ptype_7sklearn_4tree_5_tree_Tree, 1, "tree", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_y), __pyx_ptype_5numpy_ndarray, 1, "y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_weight), __pyx_ptype_5numpy_ndarray, 1, "sample_weight", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_2build(((struct __pyx_obj_7sklearn_4tree_5_tree_DepthFirstTreeBuilder *)__pyx_v_self), __pyx_v_tree, __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_tree), __pyx_ptype_7sklearn_4tree_5_tree_Tree, 1, "tree", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_y), __pyx_ptype_5numpy_ndarray, 1, "y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_weight), __pyx_ptype_5numpy_ndarray, 1, "sample_weight", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_idx_sorted), __pyx_ptype_5numpy_ndarray, 1, "X_idx_sorted", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_2build(((struct __pyx_obj_7sklearn_4tree_5_tree_DepthFirstTreeBuilder *)__pyx_v_self), __pyx_v_tree, __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight, __pyx_v_X_idx_sorted); - /* "sklearn/tree/_tree.pyx":140 + /* "sklearn/tree/_tree.pyx":141 * self.max_depth = max_depth * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ /* function exit code */ @@ -4215,7 +4306,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_3build(P return __pyx_r; } -static PyObject *__pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_2build(struct __pyx_obj_7sklearn_4tree_5_tree_DepthFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight) { +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_2build(struct __pyx_obj_7sklearn_4tree_5_tree_DepthFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight, PyArrayObject *__pyx_v_X_idx_sorted) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; @@ -4225,9 +4316,10 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_2build(s int __pyx_clineno = 0; __Pyx_RefNannySetupContext("build", 0); __Pyx_XDECREF(__pyx_r); - __pyx_t_2.__pyx_n = 1; + __pyx_t_2.__pyx_n = 2; __pyx_t_2.sample_weight = __pyx_v_sample_weight; - __pyx_t_1 = __pyx_vtabptr_7sklearn_4tree_5_tree_DepthFirstTreeBuilder->__pyx_base.build(((struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *)__pyx_v_self), __pyx_v_tree, __pyx_v_X, __pyx_v_y, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2.X_idx_sorted = __pyx_v_X_idx_sorted; + __pyx_t_1 = __pyx_vtabptr_7sklearn_4tree_5_tree_DepthFirstTreeBuilder->__pyx_base.build(((struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *)__pyx_v_self), __pyx_v_tree, __pyx_v_X, __pyx_v_y, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -4244,7 +4336,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_2build(s return __pyx_r; } -/* "sklearn/tree/_tree.pyx":268 +/* "sklearn/tree/_tree.pyx":270 * # Best first builder ---------------------------------------------------------- * * cdef inline int _add_to_frontier(PriorityHeapRecord* rec, # <<<<<<<<<<<<<< @@ -4255,7 +4347,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_2build(s static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree__add_to_frontier(struct __pyx_t_7sklearn_4tree_6_utils_PriorityHeapRecord *__pyx_v_rec, struct __pyx_obj_7sklearn_4tree_6_utils_PriorityHeap *__pyx_v_frontier) { int __pyx_r; - /* "sklearn/tree/_tree.pyx":272 + /* "sklearn/tree/_tree.pyx":274 * """Adds record ``rec`` to the priority queue ``frontier``; returns -1 * on memory-error. """ * return frontier.push(rec.node_id, rec.start, rec.end, rec.pos, rec.depth, # <<<<<<<<<<<<<< @@ -4265,7 +4357,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree__add_to_frontier(struct _ __pyx_r = ((struct __pyx_vtabstruct_7sklearn_4tree_6_utils_PriorityHeap *)__pyx_v_frontier->__pyx_vtab)->push(__pyx_v_frontier, __pyx_v_rec->node_id, __pyx_v_rec->start, __pyx_v_rec->end, __pyx_v_rec->pos, __pyx_v_rec->depth, __pyx_v_rec->is_leaf, __pyx_v_rec->improvement, __pyx_v_rec->impurity, __pyx_v_rec->impurity_left, __pyx_v_rec->impurity_right); goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":268 + /* "sklearn/tree/_tree.pyx":270 * # Best first builder ---------------------------------------------------------- * * cdef inline int _add_to_frontier(PriorityHeapRecord* rec, # <<<<<<<<<<<<<< @@ -4278,7 +4370,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree__add_to_frontier(struct _ return __pyx_r; } -/* "sklearn/tree/_tree.pyx":287 +/* "sklearn/tree/_tree.pyx":289 * cdef SIZE_t max_leaf_nodes * * def __cinit__(self, Splitter splitter, SIZE_t min_samples_split, # <<<<<<<<<<<<<< @@ -4325,31 +4417,31 @@ static int __pyx_pw_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_1__cinit__(PyOb case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_samples_split)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_samples_leaf)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_min_weight_leaf)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_max_depth)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 5: if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_max_leaf_nodes)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { goto __pyx_L5_argtuple_error; @@ -4362,21 +4454,21 @@ static int __pyx_pw_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_1__cinit__(PyOb values[5] = PyTuple_GET_ITEM(__pyx_args, 5); } __pyx_v_splitter = ((struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *)values[0]); - __pyx_v_min_samples_split = __Pyx_PyInt_As_Py_intptr_t(values[1]); if (unlikely((__pyx_v_min_samples_split == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_samples_leaf = __Pyx_PyInt_As_Py_intptr_t(values[2]); if (unlikely((__pyx_v_min_samples_leaf == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_samples_split = __Pyx_PyInt_As_Py_intptr_t(values[1]); if (unlikely((__pyx_v_min_samples_split == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_samples_leaf = __Pyx_PyInt_As_Py_intptr_t(values[2]); if (unlikely((__pyx_v_min_samples_leaf == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_min_weight_leaf = values[3]; - __pyx_v_max_depth = __Pyx_PyInt_As_Py_intptr_t(values[4]); if (unlikely((__pyx_v_max_depth == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_max_leaf_nodes = __Pyx_PyInt_As_Py_intptr_t(values[5]); if (unlikely((__pyx_v_max_leaf_nodes == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_max_depth = __Pyx_PyInt_As_Py_intptr_t(values[4]); if (unlikely((__pyx_v_max_depth == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_max_leaf_nodes = __Pyx_PyInt_As_Py_intptr_t(values[5]); if (unlikely((__pyx_v_max_leaf_nodes == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree.BestFirstTreeBuilder.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_splitter), __pyx_ptype_7sklearn_4tree_9_splitter_Splitter, 1, "splitter", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_splitter), __pyx_ptype_7sklearn_4tree_9_splitter_Splitter, 1, "splitter", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder___cinit__(((struct __pyx_obj_7sklearn_4tree_5_tree_BestFirstTreeBuilder *)__pyx_v_self), __pyx_v_splitter, __pyx_v_min_samples_split, __pyx_v_min_samples_leaf, __pyx_v_min_weight_leaf, __pyx_v_max_depth, __pyx_v_max_leaf_nodes); /* function exit code */ @@ -4397,7 +4489,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder___cinit__(struc int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__cinit__", 0); - /* "sklearn/tree/_tree.pyx":290 + /* "sklearn/tree/_tree.pyx":292 * SIZE_t min_samples_leaf, min_weight_leaf, * SIZE_t max_depth, SIZE_t max_leaf_nodes): * self.splitter = splitter # <<<<<<<<<<<<<< @@ -4410,7 +4502,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder___cinit__(struc __Pyx_DECREF(((PyObject *)__pyx_v_self->__pyx_base.splitter)); __pyx_v_self->__pyx_base.splitter = __pyx_v_splitter; - /* "sklearn/tree/_tree.pyx":291 + /* "sklearn/tree/_tree.pyx":293 * SIZE_t max_depth, SIZE_t max_leaf_nodes): * self.splitter = splitter * self.min_samples_split = min_samples_split # <<<<<<<<<<<<<< @@ -4419,7 +4511,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder___cinit__(struc */ __pyx_v_self->__pyx_base.min_samples_split = __pyx_v_min_samples_split; - /* "sklearn/tree/_tree.pyx":292 + /* "sklearn/tree/_tree.pyx":294 * self.splitter = splitter * self.min_samples_split = min_samples_split * self.min_samples_leaf = min_samples_leaf # <<<<<<<<<<<<<< @@ -4428,17 +4520,17 @@ static int __pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder___cinit__(struc */ __pyx_v_self->__pyx_base.min_samples_leaf = __pyx_v_min_samples_leaf; - /* "sklearn/tree/_tree.pyx":293 + /* "sklearn/tree/_tree.pyx":295 * self.min_samples_split = min_samples_split * self.min_samples_leaf = min_samples_leaf * self.min_weight_leaf = min_weight_leaf # <<<<<<<<<<<<<< * self.max_depth = max_depth * self.max_leaf_nodes = max_leaf_nodes */ - __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_min_weight_leaf); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_min_weight_leaf); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_self->__pyx_base.min_weight_leaf = __pyx_t_1; - /* "sklearn/tree/_tree.pyx":294 + /* "sklearn/tree/_tree.pyx":296 * self.min_samples_leaf = min_samples_leaf * self.min_weight_leaf = min_weight_leaf * self.max_depth = max_depth # <<<<<<<<<<<<<< @@ -4447,7 +4539,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder___cinit__(struc */ __pyx_v_self->__pyx_base.max_depth = __pyx_v_max_depth; - /* "sklearn/tree/_tree.pyx":295 + /* "sklearn/tree/_tree.pyx":297 * self.min_weight_leaf = min_weight_leaf * self.max_depth = max_depth * self.max_leaf_nodes = max_leaf_nodes # <<<<<<<<<<<<<< @@ -4456,7 +4548,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder___cinit__(struc */ __pyx_v_self->max_leaf_nodes = __pyx_v_max_leaf_nodes; - /* "sklearn/tree/_tree.pyx":287 + /* "sklearn/tree/_tree.pyx":289 * cdef SIZE_t max_leaf_nodes * * def __cinit__(self, Splitter splitter, SIZE_t min_samples_split, # <<<<<<<<<<<<<< @@ -4475,25 +4567,34 @@ static int __pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder___cinit__(struc return __pyx_r; } -/* "sklearn/tree/_tree.pyx":297 +/* "sklearn/tree/_tree.pyx":299 * self.max_leaf_nodes = max_leaf_nodes * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_3build(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(struct __pyx_obj_7sklearn_4tree_5_tree_BestFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, int __pyx_skip_dispatch, struct __pyx_opt_args_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build *__pyx_optional_args) { - /* "sklearn/tree/_tree.pyx":298 + /* "sklearn/tree/_tree.pyx":300 * * cpdef build(self, Tree tree, object X, np.ndarray y, - * np.ndarray sample_weight=None): # <<<<<<<<<<<<<< + * np.ndarray sample_weight=None, # <<<<<<<<<<<<<< + * np.ndarray X_idx_sorted=None): * """Build a decision tree from the training set (X, y).""" - * */ PyArrayObject *__pyx_v_sample_weight = ((PyArrayObject *)Py_None); + + /* "sklearn/tree/_tree.pyx":301 + * cpdef build(self, Tree tree, object X, np.ndarray y, + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): # <<<<<<<<<<<<<< + * """Build a decision tree from the training set (X, y).""" + * + */ + PyArrayObject *__pyx_v_X_idx_sorted = ((PyArrayObject *)Py_None); __pyx_t_7sklearn_4tree_5_tree_DOUBLE_t *__pyx_v_sample_weight_ptr; struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *__pyx_v_splitter = 0; __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_v_max_leaf_nodes; @@ -4524,10 +4625,11 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru int __pyx_t_9; __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_t_10; double __pyx_t_11; - __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_12; - __pyx_t_7sklearn_4tree_6_utils_SIZE_t __pyx_t_13; - int __pyx_t_14; - struct __pyx_opt_args_7sklearn_4tree_5_tree_4Tree__resize_c __pyx_t_15; + struct __pyx_opt_args_7sklearn_4tree_9_splitter_8Splitter_init __pyx_t_12; + __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_13; + __pyx_t_7sklearn_4tree_6_utils_SIZE_t __pyx_t_14; + int __pyx_t_15; + struct __pyx_opt_args_7sklearn_4tree_5_tree_4Tree__resize_c __pyx_t_16; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -4535,24 +4637,27 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru if (__pyx_optional_args) { if (__pyx_optional_args->__pyx_n > 0) { __pyx_v_sample_weight = __pyx_optional_args->sample_weight; + if (__pyx_optional_args->__pyx_n > 1) { + __pyx_v_X_idx_sorted = __pyx_optional_args->X_idx_sorted; + } } } __Pyx_INCREF(__pyx_v_X); __Pyx_INCREF((PyObject *)__pyx_v_y); __Pyx_INCREF((PyObject *)__pyx_v_sample_weight); - /* "sklearn/tree/_tree.pyx":297 + /* "sklearn/tree/_tree.pyx":299 * self.max_leaf_nodes = max_leaf_nodes * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overridden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_build); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_build); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_3build)) { __Pyx_XDECREF(__pyx_r); @@ -4569,7 +4674,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_5 = 1; } } - __pyx_t_6 = PyTuple_New(4+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyTuple_New(5+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); if (__pyx_t_4) { __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; @@ -4586,7 +4691,10 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __Pyx_INCREF(((PyObject *)__pyx_v_sample_weight)); __Pyx_GIVEREF(((PyObject *)__pyx_v_sample_weight)); PyTuple_SET_ITEM(__pyx_t_6, 3+__pyx_t_5, ((PyObject *)__pyx_v_sample_weight)); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_INCREF(((PyObject *)__pyx_v_X_idx_sorted)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_X_idx_sorted)); + PyTuple_SET_ITEM(__pyx_t_6, 4+__pyx_t_5, ((PyObject *)__pyx_v_X_idx_sorted)); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -4598,14 +4706,14 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } - /* "sklearn/tree/_tree.pyx":302 + /* "sklearn/tree/_tree.pyx":305 * * # check input * X, y, sample_weight = self._check_input(X, y, sample_weight) # <<<<<<<<<<<<<< * * cdef DOUBLE_t* sample_weight_ptr = NULL */ - __pyx_t_1 = __pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(((struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *)__pyx_v_self), __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __pyx_f_7sklearn_4tree_5_tree_11TreeBuilder__check_input(((struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *)__pyx_v_self), __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { PyObject* sequence = __pyx_t_1; @@ -4617,7 +4725,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru if (unlikely(size != 3)) { if (size > 3) __Pyx_RaiseTooManyValuesError(3); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { @@ -4633,17 +4741,17 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_6); #else - __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_6 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); #endif __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } else { Py_ssize_t index = -1; - __pyx_t_4 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_7 = Py_TYPE(__pyx_t_4)->tp_iternext; @@ -4653,7 +4761,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __Pyx_GOTREF(__pyx_t_3); index = 2; __pyx_t_6 = __pyx_t_7(__pyx_t_4); if (unlikely(!__pyx_t_6)) goto __pyx_L3_unpacking_failed; __Pyx_GOTREF(__pyx_t_6); - if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_4), 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_4), 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = NULL; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; goto __pyx_L4_unpacking_done; @@ -4661,11 +4769,11 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_7 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L4_unpacking_done:; } - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF_SET(__pyx_v_X, __pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF_SET(__pyx_v_y, ((PyArrayObject *)__pyx_t_3)); @@ -4673,7 +4781,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __Pyx_DECREF_SET(__pyx_v_sample_weight, ((PyArrayObject *)__pyx_t_6)); __pyx_t_6 = 0; - /* "sklearn/tree/_tree.pyx":304 + /* "sklearn/tree/_tree.pyx":307 * X, y, sample_weight = self._check_input(X, y, sample_weight) * * cdef DOUBLE_t* sample_weight_ptr = NULL # <<<<<<<<<<<<<< @@ -4682,7 +4790,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_sample_weight_ptr = NULL; - /* "sklearn/tree/_tree.pyx":305 + /* "sklearn/tree/_tree.pyx":308 * * cdef DOUBLE_t* sample_weight_ptr = NULL * if sample_weight is not None: # <<<<<<<<<<<<<< @@ -4693,7 +4801,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = (__pyx_t_8 != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":306 + /* "sklearn/tree/_tree.pyx":309 * cdef DOUBLE_t* sample_weight_ptr = NULL * if sample_weight is not None: * sample_weight_ptr = sample_weight.data # <<<<<<<<<<<<<< @@ -4705,7 +4813,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru } __pyx_L5:; - /* "sklearn/tree/_tree.pyx":309 + /* "sklearn/tree/_tree.pyx":312 * * # Parameters * cdef Splitter splitter = self.splitter # <<<<<<<<<<<<<< @@ -4717,7 +4825,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_v_splitter = ((struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *)__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":310 + /* "sklearn/tree/_tree.pyx":313 * # Parameters * cdef Splitter splitter = self.splitter * cdef SIZE_t max_leaf_nodes = self.max_leaf_nodes # <<<<<<<<<<<<<< @@ -4727,7 +4835,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_10 = __pyx_v_self->max_leaf_nodes; __pyx_v_max_leaf_nodes = __pyx_t_10; - /* "sklearn/tree/_tree.pyx":311 + /* "sklearn/tree/_tree.pyx":314 * cdef Splitter splitter = self.splitter * cdef SIZE_t max_leaf_nodes = self.max_leaf_nodes * cdef SIZE_t min_samples_leaf = self.min_samples_leaf # <<<<<<<<<<<<<< @@ -4737,7 +4845,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_10 = __pyx_v_self->__pyx_base.min_samples_leaf; __pyx_v_min_samples_leaf = __pyx_t_10; - /* "sklearn/tree/_tree.pyx":312 + /* "sklearn/tree/_tree.pyx":315 * cdef SIZE_t max_leaf_nodes = self.max_leaf_nodes * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf # <<<<<<<<<<<<<< @@ -4747,7 +4855,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_11 = __pyx_v_self->__pyx_base.min_weight_leaf; __pyx_v_min_weight_leaf = __pyx_t_11; - /* "sklearn/tree/_tree.pyx":313 + /* "sklearn/tree/_tree.pyx":316 * cdef SIZE_t min_samples_leaf = self.min_samples_leaf * cdef double min_weight_leaf = self.min_weight_leaf * cdef SIZE_t min_samples_split = self.min_samples_split # <<<<<<<<<<<<<< @@ -4757,46 +4865,48 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_10 = __pyx_v_self->__pyx_base.min_samples_split; __pyx_v_min_samples_split = __pyx_t_10; - /* "sklearn/tree/_tree.pyx":316 + /* "sklearn/tree/_tree.pyx":319 * * # Recursive partition (without actual recursion) - * splitter.init(X, y, sample_weight_ptr) # <<<<<<<<<<<<<< + * splitter.init(X, y, sample_weight_ptr, X_idx_sorted) # <<<<<<<<<<<<<< * * cdef PriorityHeap frontier = PriorityHeap(INITIAL_STACK_SIZE) */ - ((struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_splitter->__pyx_vtab)->init(__pyx_v_splitter, __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight_ptr); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_12.__pyx_n = 1; + __pyx_t_12.X_idx_sorted = __pyx_v_X_idx_sorted; + ((struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_splitter->__pyx_vtab)->init(__pyx_v_splitter, __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight_ptr, &__pyx_t_12); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":318 - * splitter.init(X, y, sample_weight_ptr) + /* "sklearn/tree/_tree.pyx":321 + * splitter.init(X, y, sample_weight_ptr, X_idx_sorted) * * cdef PriorityHeap frontier = PriorityHeap(INITIAL_STACK_SIZE) # <<<<<<<<<<<<<< * cdef PriorityHeapRecord record * cdef PriorityHeapRecord split_node_left */ - __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_7sklearn_4tree_5_tree_INITIAL_STACK_SIZE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_7sklearn_4tree_5_tree_INITIAL_STACK_SIZE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_6_utils_PriorityHeap)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_6_utils_PriorityHeap)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_v_frontier = ((struct __pyx_obj_7sklearn_4tree_6_utils_PriorityHeap *)__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":323 + /* "sklearn/tree/_tree.pyx":326 * cdef PriorityHeapRecord split_node_right * * cdef SIZE_t n_node_samples = splitter.n_samples # <<<<<<<<<<<<<< * cdef SIZE_t max_split_nodes = max_leaf_nodes - 1 * cdef bint is_leaf */ - __pyx_t_12 = __pyx_v_splitter->n_samples; - __pyx_v_n_node_samples = __pyx_t_12; + __pyx_t_13 = __pyx_v_splitter->n_samples; + __pyx_v_n_node_samples = __pyx_t_13; - /* "sklearn/tree/_tree.pyx":324 + /* "sklearn/tree/_tree.pyx":327 * * cdef SIZE_t n_node_samples = splitter.n_samples * cdef SIZE_t max_split_nodes = max_leaf_nodes - 1 # <<<<<<<<<<<<<< @@ -4805,7 +4915,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_max_split_nodes = (__pyx_v_max_leaf_nodes - 1); - /* "sklearn/tree/_tree.pyx":326 + /* "sklearn/tree/_tree.pyx":329 * cdef SIZE_t max_split_nodes = max_leaf_nodes - 1 * cdef bint is_leaf * cdef SIZE_t max_depth_seen = -1 # <<<<<<<<<<<<<< @@ -4814,7 +4924,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_max_depth_seen = -1; - /* "sklearn/tree/_tree.pyx":327 + /* "sklearn/tree/_tree.pyx":330 * cdef bint is_leaf * cdef SIZE_t max_depth_seen = -1 * cdef int rc = 0 # <<<<<<<<<<<<<< @@ -4823,7 +4933,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_rc = 0; - /* "sklearn/tree/_tree.pyx":331 + /* "sklearn/tree/_tree.pyx":334 * * # Initial capacity * cdef SIZE_t init_capacity = max_split_nodes + max_leaf_nodes # <<<<<<<<<<<<<< @@ -4832,16 +4942,16 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_init_capacity = (__pyx_v_max_split_nodes + __pyx_v_max_leaf_nodes); - /* "sklearn/tree/_tree.pyx":332 + /* "sklearn/tree/_tree.pyx":335 * # Initial capacity * cdef SIZE_t init_capacity = max_split_nodes + max_leaf_nodes * tree._resize(init_capacity) # <<<<<<<<<<<<<< * * with nogil: */ - ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_tree->__pyx_vtab)->_resize(__pyx_v_tree, __pyx_v_init_capacity); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_tree->__pyx_vtab)->_resize(__pyx_v_tree, __pyx_v_init_capacity); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":334 + /* "sklearn/tree/_tree.pyx":337 * tree._resize(init_capacity) * * with nogil: # <<<<<<<<<<<<<< @@ -4855,7 +4965,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru #endif /*try:*/ { - /* "sklearn/tree/_tree.pyx":336 + /* "sklearn/tree/_tree.pyx":339 * with nogil: * # add root to frontier * rc = self._add_split_node(splitter, tree, 0, n_node_samples, # <<<<<<<<<<<<<< @@ -4864,7 +4974,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_rc = __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__add_split_node(__pyx_v_self, __pyx_v_splitter, __pyx_v_tree, 0, __pyx_v_n_node_samples, __pyx_v_7sklearn_4tree_5_tree_INFINITY, __pyx_v_7sklearn_4tree_5_tree_IS_FIRST, __pyx_v_7sklearn_4tree_5_tree_IS_LEFT, NULL, 0, (&__pyx_v_split_node_left)); - /* "sklearn/tree/_tree.pyx":339 + /* "sklearn/tree/_tree.pyx":342 * INFINITY, IS_FIRST, IS_LEFT, NULL, 0, * &split_node_left) * if rc >= 0: # <<<<<<<<<<<<<< @@ -4874,7 +4984,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = ((__pyx_v_rc >= 0) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":340 + /* "sklearn/tree/_tree.pyx":343 * &split_node_left) * if rc >= 0: * rc = _add_to_frontier(&split_node_left, frontier) # <<<<<<<<<<<<<< @@ -4887,7 +4997,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_L9:; } - /* "sklearn/tree/_tree.pyx":334 + /* "sklearn/tree/_tree.pyx":337 * tree._resize(init_capacity) * * with nogil: # <<<<<<<<<<<<<< @@ -4905,7 +5015,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru } } - /* "sklearn/tree/_tree.pyx":341 + /* "sklearn/tree/_tree.pyx":344 * if rc >= 0: * rc = _add_to_frontier(&split_node_left, frontier) * if rc == -1: # <<<<<<<<<<<<<< @@ -4915,17 +5025,17 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = ((__pyx_v_rc == -1) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":342 + /* "sklearn/tree/_tree.pyx":345 * rc = _add_to_frontier(&split_node_left, frontier) * if rc == -1: * raise MemoryError() # <<<<<<<<<<<<<< * * with nogil: */ - PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 345; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":344 + /* "sklearn/tree/_tree.pyx":347 * raise MemoryError() * * with nogil: # <<<<<<<<<<<<<< @@ -4939,7 +5049,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru #endif /*try:*/ { - /* "sklearn/tree/_tree.pyx":345 + /* "sklearn/tree/_tree.pyx":348 * * with nogil: * while not frontier.is_empty(): # <<<<<<<<<<<<<< @@ -4950,7 +5060,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = ((!(((struct __pyx_vtabstruct_7sklearn_4tree_6_utils_PriorityHeap *)__pyx_v_frontier->__pyx_vtab)->is_empty(__pyx_v_frontier) != 0)) != 0); if (!__pyx_t_9) break; - /* "sklearn/tree/_tree.pyx":346 + /* "sklearn/tree/_tree.pyx":349 * with nogil: * while not frontier.is_empty(): * frontier.pop(&record) # <<<<<<<<<<<<<< @@ -4959,7 +5069,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ ((struct __pyx_vtabstruct_7sklearn_4tree_6_utils_PriorityHeap *)__pyx_v_frontier->__pyx_vtab)->pop(__pyx_v_frontier, (&__pyx_v_record)); - /* "sklearn/tree/_tree.pyx":348 + /* "sklearn/tree/_tree.pyx":351 * frontier.pop(&record) * * node = &tree.nodes[record.node_id] # <<<<<<<<<<<<<< @@ -4968,7 +5078,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_node = (&(__pyx_v_tree->nodes[__pyx_v_record.node_id])); - /* "sklearn/tree/_tree.pyx":349 + /* "sklearn/tree/_tree.pyx":352 * * node = &tree.nodes[record.node_id] * is_leaf = (record.is_leaf or max_split_nodes <= 0) # <<<<<<<<<<<<<< @@ -4986,7 +5096,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_L16_bool_binop_done:; __pyx_v_is_leaf = __pyx_t_9; - /* "sklearn/tree/_tree.pyx":351 + /* "sklearn/tree/_tree.pyx":354 * is_leaf = (record.is_leaf or max_split_nodes <= 0) * * if is_leaf: # <<<<<<<<<<<<<< @@ -4996,7 +5106,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = (__pyx_v_is_leaf != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":353 + /* "sklearn/tree/_tree.pyx":356 * if is_leaf: * # Node is not expandable; set node as leaf * node.left_child = _TREE_LEAF # <<<<<<<<<<<<<< @@ -5005,7 +5115,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_node->left_child = __pyx_v_7sklearn_4tree_5_tree__TREE_LEAF; - /* "sklearn/tree/_tree.pyx":354 + /* "sklearn/tree/_tree.pyx":357 * # Node is not expandable; set node as leaf * node.left_child = _TREE_LEAF * node.right_child = _TREE_LEAF # <<<<<<<<<<<<<< @@ -5014,7 +5124,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_node->right_child = __pyx_v_7sklearn_4tree_5_tree__TREE_LEAF; - /* "sklearn/tree/_tree.pyx":355 + /* "sklearn/tree/_tree.pyx":358 * node.left_child = _TREE_LEAF * node.right_child = _TREE_LEAF * node.feature = _TREE_UNDEFINED # <<<<<<<<<<<<<< @@ -5023,7 +5133,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_node->feature = __pyx_v_7sklearn_4tree_5_tree__TREE_UNDEFINED; - /* "sklearn/tree/_tree.pyx":356 + /* "sklearn/tree/_tree.pyx":359 * node.right_child = _TREE_LEAF * node.feature = _TREE_UNDEFINED * node.threshold = _TREE_UNDEFINED # <<<<<<<<<<<<<< @@ -5035,7 +5145,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru } /*else*/ { - /* "sklearn/tree/_tree.pyx":362 + /* "sklearn/tree/_tree.pyx":365 * * # Decrement number of split nodes available * max_split_nodes -= 1 # <<<<<<<<<<<<<< @@ -5044,7 +5154,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_max_split_nodes = (__pyx_v_max_split_nodes - 1); - /* "sklearn/tree/_tree.pyx":365 + /* "sklearn/tree/_tree.pyx":368 * * # Compute left split node * rc = self._add_split_node(splitter, tree, # <<<<<<<<<<<<<< @@ -5053,7 +5163,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_rc = __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__add_split_node(__pyx_v_self, __pyx_v_splitter, __pyx_v_tree, __pyx_v_record.start, __pyx_v_record.pos, __pyx_v_record.impurity_left, __pyx_v_7sklearn_4tree_5_tree_IS_NOT_FIRST, __pyx_v_7sklearn_4tree_5_tree_IS_LEFT, __pyx_v_node, (__pyx_v_record.depth + 1), (&__pyx_v_split_node_left)); - /* "sklearn/tree/_tree.pyx":371 + /* "sklearn/tree/_tree.pyx":374 * record.depth + 1, * &split_node_left) * if rc == -1: # <<<<<<<<<<<<<< @@ -5063,7 +5173,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = ((__pyx_v_rc == -1) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":372 + /* "sklearn/tree/_tree.pyx":375 * &split_node_left) * if rc == -1: * break # <<<<<<<<<<<<<< @@ -5073,7 +5183,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru goto __pyx_L15_break; } - /* "sklearn/tree/_tree.pyx":375 + /* "sklearn/tree/_tree.pyx":378 * * # tree.nodes may have changed * node = &tree.nodes[record.node_id] # <<<<<<<<<<<<<< @@ -5082,7 +5192,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_node = (&(__pyx_v_tree->nodes[__pyx_v_record.node_id])); - /* "sklearn/tree/_tree.pyx":378 + /* "sklearn/tree/_tree.pyx":381 * * # Compute right split node * rc = self._add_split_node(splitter, tree, record.pos, # <<<<<<<<<<<<<< @@ -5091,7 +5201,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_rc = __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__add_split_node(__pyx_v_self, __pyx_v_splitter, __pyx_v_tree, __pyx_v_record.pos, __pyx_v_record.end, __pyx_v_record.impurity_right, __pyx_v_7sklearn_4tree_5_tree_IS_NOT_FIRST, __pyx_v_7sklearn_4tree_5_tree_IS_NOT_LEFT, __pyx_v_node, (__pyx_v_record.depth + 1), (&__pyx_v_split_node_right)); - /* "sklearn/tree/_tree.pyx":384 + /* "sklearn/tree/_tree.pyx":387 * record.depth + 1, * &split_node_right) * if rc == -1: # <<<<<<<<<<<<<< @@ -5101,7 +5211,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = ((__pyx_v_rc == -1) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":385 + /* "sklearn/tree/_tree.pyx":388 * &split_node_right) * if rc == -1: * break # <<<<<<<<<<<<<< @@ -5111,7 +5221,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru goto __pyx_L15_break; } - /* "sklearn/tree/_tree.pyx":388 + /* "sklearn/tree/_tree.pyx":391 * * # Add nodes to queue * rc = _add_to_frontier(&split_node_left, frontier) # <<<<<<<<<<<<<< @@ -5120,7 +5230,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_rc = __pyx_f_7sklearn_4tree_5_tree__add_to_frontier((&__pyx_v_split_node_left), __pyx_v_frontier); - /* "sklearn/tree/_tree.pyx":389 + /* "sklearn/tree/_tree.pyx":392 * # Add nodes to queue * rc = _add_to_frontier(&split_node_left, frontier) * if rc == -1: # <<<<<<<<<<<<<< @@ -5130,7 +5240,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = ((__pyx_v_rc == -1) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":390 + /* "sklearn/tree/_tree.pyx":393 * rc = _add_to_frontier(&split_node_left, frontier) * if rc == -1: * break # <<<<<<<<<<<<<< @@ -5140,7 +5250,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru goto __pyx_L15_break; } - /* "sklearn/tree/_tree.pyx":392 + /* "sklearn/tree/_tree.pyx":395 * break * * rc = _add_to_frontier(&split_node_right, frontier) # <<<<<<<<<<<<<< @@ -5149,7 +5259,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru */ __pyx_v_rc = __pyx_f_7sklearn_4tree_5_tree__add_to_frontier((&__pyx_v_split_node_right), __pyx_v_frontier); - /* "sklearn/tree/_tree.pyx":393 + /* "sklearn/tree/_tree.pyx":396 * * rc = _add_to_frontier(&split_node_right, frontier) * if rc == -1: # <<<<<<<<<<<<<< @@ -5159,7 +5269,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = ((__pyx_v_rc == -1) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":394 + /* "sklearn/tree/_tree.pyx":397 * rc = _add_to_frontier(&split_node_right, frontier) * if rc == -1: * break # <<<<<<<<<<<<<< @@ -5171,7 +5281,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru } __pyx_L18:; - /* "sklearn/tree/_tree.pyx":396 + /* "sklearn/tree/_tree.pyx":399 * break * * if record.depth > max_depth_seen: # <<<<<<<<<<<<<< @@ -5181,22 +5291,22 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = ((__pyx_v_record.depth > __pyx_v_max_depth_seen) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":397 + /* "sklearn/tree/_tree.pyx":400 * * if record.depth > max_depth_seen: * max_depth_seen = record.depth # <<<<<<<<<<<<<< * * if rc >= 0: */ - __pyx_t_13 = __pyx_v_record.depth; - __pyx_v_max_depth_seen = __pyx_t_13; + __pyx_t_14 = __pyx_v_record.depth; + __pyx_v_max_depth_seen = __pyx_t_14; goto __pyx_L23; } __pyx_L23:; } __pyx_L15_break:; - /* "sklearn/tree/_tree.pyx":399 + /* "sklearn/tree/_tree.pyx":402 * max_depth_seen = record.depth * * if rc >= 0: # <<<<<<<<<<<<<< @@ -5206,22 +5316,22 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = ((__pyx_v_rc >= 0) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":400 + /* "sklearn/tree/_tree.pyx":403 * * if rc >= 0: * rc = tree._resize_c(tree.node_count) # <<<<<<<<<<<<<< * * if rc >= 0: */ - __pyx_t_15.__pyx_n = 1; - __pyx_t_15.capacity = __pyx_v_tree->node_count; - __pyx_t_14 = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_tree->__pyx_vtab)->_resize_c(__pyx_v_tree, &__pyx_t_15); - __pyx_v_rc = __pyx_t_14; + __pyx_t_16.__pyx_n = 1; + __pyx_t_16.capacity = __pyx_v_tree->node_count; + __pyx_t_15 = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_tree->__pyx_vtab)->_resize_c(__pyx_v_tree, &__pyx_t_16); + __pyx_v_rc = __pyx_t_15; goto __pyx_L24; } __pyx_L24:; - /* "sklearn/tree/_tree.pyx":402 + /* "sklearn/tree/_tree.pyx":405 * rc = tree._resize_c(tree.node_count) * * if rc >= 0: # <<<<<<<<<<<<<< @@ -5231,7 +5341,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = ((__pyx_v_rc >= 0) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":403 + /* "sklearn/tree/_tree.pyx":406 * * if rc >= 0: * tree.max_depth = max_depth_seen # <<<<<<<<<<<<<< @@ -5244,7 +5354,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_L25:; } - /* "sklearn/tree/_tree.pyx":344 + /* "sklearn/tree/_tree.pyx":347 * raise MemoryError() * * with nogil: # <<<<<<<<<<<<<< @@ -5262,7 +5372,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru } } - /* "sklearn/tree/_tree.pyx":405 + /* "sklearn/tree/_tree.pyx":408 * tree.max_depth = max_depth_seen * * if rc == -1: # <<<<<<<<<<<<<< @@ -5272,22 +5382,22 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build(stru __pyx_t_9 = ((__pyx_v_rc == -1) != 0); if (__pyx_t_9) { - /* "sklearn/tree/_tree.pyx":406 + /* "sklearn/tree/_tree.pyx":409 * * if rc == -1: * raise MemoryError() # <<<<<<<<<<<<<< * * cdef inline int _add_split_node(self, Splitter splitter, Tree tree, */ - PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":297 + /* "sklearn/tree/_tree.pyx":299 * self.max_leaf_nodes = max_leaf_nodes * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ /* function exit code */ @@ -5320,6 +5430,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_3build(Py PyObject *__pyx_v_X = 0; PyArrayObject *__pyx_v_y = 0; PyArrayObject *__pyx_v_sample_weight = 0; + PyArrayObject *__pyx_v_X_idx_sorted = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -5327,21 +5438,31 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_3build(Py __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("build (wrapper)", 0); { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_tree,&__pyx_n_s_X,&__pyx_n_s_y,&__pyx_n_s_sample_weight,0}; - PyObject* values[4] = {0,0,0,0}; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_tree,&__pyx_n_s_X,&__pyx_n_s_y,&__pyx_n_s_sample_weight,&__pyx_n_s_X_idx_sorted,0}; + PyObject* values[5] = {0,0,0,0,0}; - /* "sklearn/tree/_tree.pyx":298 + /* "sklearn/tree/_tree.pyx":300 * * cpdef build(self, Tree tree, object X, np.ndarray y, - * np.ndarray sample_weight=None): # <<<<<<<<<<<<<< + * np.ndarray sample_weight=None, # <<<<<<<<<<<<<< + * np.ndarray X_idx_sorted=None): * """Build a decision tree from the training set (X, y).""" - * */ values[3] = (PyObject *)((PyArrayObject *)Py_None); + + /* "sklearn/tree/_tree.pyx":301 + * cpdef build(self, Tree tree, object X, np.ndarray y, + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): # <<<<<<<<<<<<<< + * """Build a decision tree from the training set (X, y).""" + * + */ + values[4] = (PyObject *)((PyArrayObject *)Py_None); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); @@ -5357,24 +5478,30 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_3build(Py case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_X)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("build", 0, 3, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("build", 0, 3, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("build", 0, 3, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("build", 0, 3, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sample_weight); if (value) { values[3] = value; kw_args--; } } + case 4: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_X_idx_sorted); + if (value) { values[4] = value; kw_args--; } + } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "build") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "build") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); @@ -5387,26 +5514,28 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_3build(Py __pyx_v_X = values[1]; __pyx_v_y = ((PyArrayObject *)values[2]); __pyx_v_sample_weight = ((PyArrayObject *)values[3]); + __pyx_v_X_idx_sorted = ((PyArrayObject *)values[4]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("build", 0, 3, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("build", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree.BestFirstTreeBuilder.build", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_tree), __pyx_ptype_7sklearn_4tree_5_tree_Tree, 1, "tree", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_y), __pyx_ptype_5numpy_ndarray, 1, "y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_weight), __pyx_ptype_5numpy_ndarray, 1, "sample_weight", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_2build(((struct __pyx_obj_7sklearn_4tree_5_tree_BestFirstTreeBuilder *)__pyx_v_self), __pyx_v_tree, __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_tree), __pyx_ptype_7sklearn_4tree_5_tree_Tree, 1, "tree", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_y), __pyx_ptype_5numpy_ndarray, 1, "y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_weight), __pyx_ptype_5numpy_ndarray, 1, "sample_weight", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_idx_sorted), __pyx_ptype_5numpy_ndarray, 1, "X_idx_sorted", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_2build(((struct __pyx_obj_7sklearn_4tree_5_tree_BestFirstTreeBuilder *)__pyx_v_self), __pyx_v_tree, __pyx_v_X, __pyx_v_y, __pyx_v_sample_weight, __pyx_v_X_idx_sorted); - /* "sklearn/tree/_tree.pyx":297 + /* "sklearn/tree/_tree.pyx":299 * self.max_leaf_nodes = max_leaf_nodes * * cpdef build(self, Tree tree, object X, np.ndarray y, # <<<<<<<<<<<<<< - * np.ndarray sample_weight=None): - * """Build a decision tree from the training set (X, y).""" + * np.ndarray sample_weight=None, + * np.ndarray X_idx_sorted=None): */ /* function exit code */ @@ -5418,7 +5547,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_3build(Py return __pyx_r; } -static PyObject *__pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_2build(struct __pyx_obj_7sklearn_4tree_5_tree_BestFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight) { +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_2build(struct __pyx_obj_7sklearn_4tree_5_tree_BestFirstTreeBuilder *__pyx_v_self, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *__pyx_v_tree, PyObject *__pyx_v_X, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_weight, PyArrayObject *__pyx_v_X_idx_sorted) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; @@ -5428,9 +5557,10 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_2build(st int __pyx_clineno = 0; __Pyx_RefNannySetupContext("build", 0); __Pyx_XDECREF(__pyx_r); - __pyx_t_2.__pyx_n = 1; + __pyx_t_2.__pyx_n = 2; __pyx_t_2.sample_weight = __pyx_v_sample_weight; - __pyx_t_1 = __pyx_vtabptr_7sklearn_4tree_5_tree_BestFirstTreeBuilder->__pyx_base.build(((struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *)__pyx_v_self), __pyx_v_tree, __pyx_v_X, __pyx_v_y, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2.X_idx_sorted = __pyx_v_X_idx_sorted; + __pyx_t_1 = __pyx_vtabptr_7sklearn_4tree_5_tree_BestFirstTreeBuilder->__pyx_base.build(((struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *)__pyx_v_self), __pyx_v_tree, __pyx_v_X, __pyx_v_y, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -5447,7 +5577,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_2build(st return __pyx_r; } -/* "sklearn/tree/_tree.pyx":408 +/* "sklearn/tree/_tree.pyx":411 * raise MemoryError() * * cdef inline int _add_split_node(self, Splitter splitter, Tree tree, # <<<<<<<<<<<<<< @@ -5470,7 +5600,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a ptrdiff_t __pyx_t_4; __pyx_t_7sklearn_4tree_9_splitter_SIZE_t __pyx_t_5; - /* "sklearn/tree/_tree.pyx":417 + /* "sklearn/tree/_tree.pyx":420 * cdef SIZE_t node_id * cdef SIZE_t n_node_samples * cdef SIZE_t n_constant_features = 0 # <<<<<<<<<<<<<< @@ -5479,7 +5609,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_n_constant_features = 0; - /* "sklearn/tree/_tree.pyx":418 + /* "sklearn/tree/_tree.pyx":421 * cdef SIZE_t n_node_samples * cdef SIZE_t n_constant_features = 0 * cdef double weighted_n_samples = splitter.weighted_n_samples # <<<<<<<<<<<<<< @@ -5489,7 +5619,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_t_1 = __pyx_v_splitter->weighted_n_samples; __pyx_v_weighted_n_samples = __pyx_t_1; - /* "sklearn/tree/_tree.pyx":424 + /* "sklearn/tree/_tree.pyx":427 * cdef double imp_diff * * splitter.node_reset(start, end, &weighted_n_node_samples) # <<<<<<<<<<<<<< @@ -5498,7 +5628,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ ((struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_splitter->__pyx_vtab)->node_reset(__pyx_v_splitter, __pyx_v_start, __pyx_v_end, (&__pyx_v_weighted_n_node_samples)); - /* "sklearn/tree/_tree.pyx":426 + /* "sklearn/tree/_tree.pyx":429 * splitter.node_reset(start, end, &weighted_n_node_samples) * * if is_first: # <<<<<<<<<<<<<< @@ -5508,7 +5638,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_t_2 = (__pyx_v_is_first != 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":427 + /* "sklearn/tree/_tree.pyx":430 * * if is_first: * impurity = splitter.node_impurity() # <<<<<<<<<<<<<< @@ -5520,7 +5650,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a } __pyx_L3:; - /* "sklearn/tree/_tree.pyx":429 + /* "sklearn/tree/_tree.pyx":432 * impurity = splitter.node_impurity() * * n_node_samples = end - start # <<<<<<<<<<<<<< @@ -5529,7 +5659,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_n_node_samples = (__pyx_v_end - __pyx_v_start); - /* "sklearn/tree/_tree.pyx":430 + /* "sklearn/tree/_tree.pyx":433 * * n_node_samples = end - start * is_leaf = ((depth > self.max_depth) or # <<<<<<<<<<<<<< @@ -5543,7 +5673,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a goto __pyx_L4_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":431 + /* "sklearn/tree/_tree.pyx":434 * n_node_samples = end - start * is_leaf = ((depth > self.max_depth) or * (n_node_samples < self.min_samples_split) or # <<<<<<<<<<<<<< @@ -5557,7 +5687,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a goto __pyx_L4_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":432 + /* "sklearn/tree/_tree.pyx":435 * is_leaf = ((depth > self.max_depth) or * (n_node_samples < self.min_samples_split) or * (n_node_samples < 2 * self.min_samples_leaf) or # <<<<<<<<<<<<<< @@ -5571,7 +5701,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a goto __pyx_L4_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":433 + /* "sklearn/tree/_tree.pyx":436 * (n_node_samples < self.min_samples_split) or * (n_node_samples < 2 * self.min_samples_leaf) or * (weighted_n_node_samples < self.min_weight_leaf) or # <<<<<<<<<<<<<< @@ -5585,7 +5715,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a goto __pyx_L4_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":434 + /* "sklearn/tree/_tree.pyx":437 * (n_node_samples < 2 * self.min_samples_leaf) or * (weighted_n_node_samples < self.min_weight_leaf) or * (impurity <= MIN_IMPURITY_SPLIT)) # <<<<<<<<<<<<<< @@ -5597,7 +5727,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_L4_bool_binop_done:; __pyx_v_is_leaf = __pyx_t_2; - /* "sklearn/tree/_tree.pyx":436 + /* "sklearn/tree/_tree.pyx":439 * (impurity <= MIN_IMPURITY_SPLIT)) * * if not is_leaf: # <<<<<<<<<<<<<< @@ -5607,7 +5737,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_t_2 = ((!(__pyx_v_is_leaf != 0)) != 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":437 + /* "sklearn/tree/_tree.pyx":440 * * if not is_leaf: * splitter.node_split(impurity, &split, &n_constant_features) # <<<<<<<<<<<<<< @@ -5616,7 +5746,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ ((struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_splitter->__pyx_vtab)->node_split(__pyx_v_splitter, __pyx_v_impurity, (&__pyx_v_split), (&__pyx_v_n_constant_features)); - /* "sklearn/tree/_tree.pyx":438 + /* "sklearn/tree/_tree.pyx":441 * if not is_leaf: * splitter.node_split(impurity, &split, &n_constant_features) * is_leaf = is_leaf or (split.pos >= end) # <<<<<<<<<<<<<< @@ -5637,7 +5767,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a } __pyx_L9:; - /* "sklearn/tree/_tree.pyx":441 + /* "sklearn/tree/_tree.pyx":444 * * node_id = tree._add_node(parent - tree.nodes * if parent != NULL # <<<<<<<<<<<<<< @@ -5646,7 +5776,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ if (((__pyx_v_parent != NULL) != 0)) { - /* "sklearn/tree/_tree.pyx":440 + /* "sklearn/tree/_tree.pyx":443 * is_leaf = is_leaf or (split.pos >= end) * * node_id = tree._add_node(parent - tree.nodes # <<<<<<<<<<<<<< @@ -5656,7 +5786,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_t_4 = (__pyx_v_parent - __pyx_v_tree->nodes); } else { - /* "sklearn/tree/_tree.pyx":442 + /* "sklearn/tree/_tree.pyx":445 * node_id = tree._add_node(parent - tree.nodes * if parent != NULL * else _TREE_UNDEFINED, # <<<<<<<<<<<<<< @@ -5666,7 +5796,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_t_4 = __pyx_v_7sklearn_4tree_5_tree__TREE_UNDEFINED; } - /* "sklearn/tree/_tree.pyx":440 + /* "sklearn/tree/_tree.pyx":443 * is_leaf = is_leaf or (split.pos >= end) * * node_id = tree._add_node(parent - tree.nodes # <<<<<<<<<<<<<< @@ -5675,7 +5805,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_node_id = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_tree->__pyx_vtab)->_add_node(__pyx_v_tree, __pyx_t_4, __pyx_v_is_left, __pyx_v_is_leaf, __pyx_v_split.feature, __pyx_v_split.threshold, __pyx_v_impurity, __pyx_v_n_node_samples, __pyx_v_weighted_n_node_samples); - /* "sklearn/tree/_tree.pyx":446 + /* "sklearn/tree/_tree.pyx":449 * split.feature, split.threshold, impurity, n_node_samples, * weighted_n_node_samples) * if node_id == (-1): # <<<<<<<<<<<<<< @@ -5685,7 +5815,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_t_2 = ((__pyx_v_node_id == ((__pyx_t_7sklearn_4tree_5_tree_SIZE_t)-1)) != 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":447 + /* "sklearn/tree/_tree.pyx":450 * weighted_n_node_samples) * if node_id == (-1): * return -1 # <<<<<<<<<<<<<< @@ -5696,7 +5826,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a goto __pyx_L0; } - /* "sklearn/tree/_tree.pyx":450 + /* "sklearn/tree/_tree.pyx":453 * * # compute values also for split nodes (might become leafs later). * splitter.node_value(tree.value + node_id * tree.value_stride) # <<<<<<<<<<<<<< @@ -5705,7 +5835,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ ((struct __pyx_vtabstruct_7sklearn_4tree_9_splitter_Splitter *)__pyx_v_splitter->__pyx_vtab)->node_value(__pyx_v_splitter, (__pyx_v_tree->value + (__pyx_v_node_id * __pyx_v_tree->value_stride))); - /* "sklearn/tree/_tree.pyx":452 + /* "sklearn/tree/_tree.pyx":455 * splitter.node_value(tree.value + node_id * tree.value_stride) * * res.node_id = node_id # <<<<<<<<<<<<<< @@ -5714,7 +5844,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_res->node_id = __pyx_v_node_id; - /* "sklearn/tree/_tree.pyx":453 + /* "sklearn/tree/_tree.pyx":456 * * res.node_id = node_id * res.start = start # <<<<<<<<<<<<<< @@ -5723,7 +5853,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_res->start = __pyx_v_start; - /* "sklearn/tree/_tree.pyx":454 + /* "sklearn/tree/_tree.pyx":457 * res.node_id = node_id * res.start = start * res.end = end # <<<<<<<<<<<<<< @@ -5732,7 +5862,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_res->end = __pyx_v_end; - /* "sklearn/tree/_tree.pyx":455 + /* "sklearn/tree/_tree.pyx":458 * res.start = start * res.end = end * res.depth = depth # <<<<<<<<<<<<<< @@ -5741,7 +5871,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_res->depth = __pyx_v_depth; - /* "sklearn/tree/_tree.pyx":456 + /* "sklearn/tree/_tree.pyx":459 * res.end = end * res.depth = depth * res.impurity = impurity # <<<<<<<<<<<<<< @@ -5750,7 +5880,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_res->impurity = __pyx_v_impurity; - /* "sklearn/tree/_tree.pyx":458 + /* "sklearn/tree/_tree.pyx":461 * res.impurity = impurity * * if not is_leaf: # <<<<<<<<<<<<<< @@ -5760,7 +5890,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_t_2 = ((!(__pyx_v_is_leaf != 0)) != 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":460 + /* "sklearn/tree/_tree.pyx":463 * if not is_leaf: * # is split node * res.pos = split.pos # <<<<<<<<<<<<<< @@ -5770,7 +5900,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_t_5 = __pyx_v_split.pos; __pyx_v_res->pos = __pyx_t_5; - /* "sklearn/tree/_tree.pyx":461 + /* "sklearn/tree/_tree.pyx":464 * # is split node * res.pos = split.pos * res.is_leaf = 0 # <<<<<<<<<<<<<< @@ -5779,7 +5909,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_res->is_leaf = 0; - /* "sklearn/tree/_tree.pyx":462 + /* "sklearn/tree/_tree.pyx":465 * res.pos = split.pos * res.is_leaf = 0 * res.improvement = split.improvement # <<<<<<<<<<<<<< @@ -5789,7 +5919,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_t_1 = __pyx_v_split.improvement; __pyx_v_res->improvement = __pyx_t_1; - /* "sklearn/tree/_tree.pyx":463 + /* "sklearn/tree/_tree.pyx":466 * res.is_leaf = 0 * res.improvement = split.improvement * res.impurity_left = split.impurity_left # <<<<<<<<<<<<<< @@ -5799,7 +5929,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_t_1 = __pyx_v_split.impurity_left; __pyx_v_res->impurity_left = __pyx_t_1; - /* "sklearn/tree/_tree.pyx":464 + /* "sklearn/tree/_tree.pyx":467 * res.improvement = split.improvement * res.impurity_left = split.impurity_left * res.impurity_right = split.impurity_right # <<<<<<<<<<<<<< @@ -5812,7 +5942,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a } /*else*/ { - /* "sklearn/tree/_tree.pyx":468 + /* "sklearn/tree/_tree.pyx":471 * else: * # is leaf => 0 improvement * res.pos = end # <<<<<<<<<<<<<< @@ -5821,7 +5951,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_res->pos = __pyx_v_end; - /* "sklearn/tree/_tree.pyx":469 + /* "sklearn/tree/_tree.pyx":472 * # is leaf => 0 improvement * res.pos = end * res.is_leaf = 1 # <<<<<<<<<<<<<< @@ -5830,7 +5960,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_res->is_leaf = 1; - /* "sklearn/tree/_tree.pyx":470 + /* "sklearn/tree/_tree.pyx":473 * res.pos = end * res.is_leaf = 1 * res.improvement = 0.0 # <<<<<<<<<<<<<< @@ -5839,7 +5969,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_res->improvement = 0.0; - /* "sklearn/tree/_tree.pyx":471 + /* "sklearn/tree/_tree.pyx":474 * res.is_leaf = 1 * res.improvement = 0.0 * res.impurity_left = impurity # <<<<<<<<<<<<<< @@ -5848,7 +5978,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a */ __pyx_v_res->impurity_left = __pyx_v_impurity; - /* "sklearn/tree/_tree.pyx":472 + /* "sklearn/tree/_tree.pyx":475 * res.improvement = 0.0 * res.impurity_left = impurity * res.impurity_right = impurity # <<<<<<<<<<<<<< @@ -5859,7 +5989,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a } __pyx_L13:; - /* "sklearn/tree/_tree.pyx":474 + /* "sklearn/tree/_tree.pyx":477 * res.impurity_right = impurity * * return 0 # <<<<<<<<<<<<<< @@ -5869,7 +5999,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a __pyx_r = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":408 + /* "sklearn/tree/_tree.pyx":411 * raise MemoryError() * * cdef inline int _add_split_node(self, Splitter splitter, Tree tree, # <<<<<<<<<<<<<< @@ -5882,7 +6012,7 @@ static CYTHON_INLINE int __pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__a return __pyx_r; } -/* "sklearn/tree/_tree.pyx":540 +/* "sklearn/tree/_tree.pyx":543 * # (i.e. through `_resize` or `__setstate__`) * property n_classes: * def __get__(self): # <<<<<<<<<<<<<< @@ -5914,7 +6044,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_9n_classes___get__(struct int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "sklearn/tree/_tree.pyx":542 + /* "sklearn/tree/_tree.pyx":545 * def __get__(self): * # it's small; copy for memory safety * return sizet_ptr_to_ndarray(self.n_classes, self.n_outputs).copy() # <<<<<<<<<<<<<< @@ -5922,9 +6052,9 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_9n_classes___get__(struct * property children_left: */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = ((PyObject *)__pyx_f_7sklearn_4tree_6_utils_sizet_ptr_to_ndarray(__pyx_v_self->n_classes, __pyx_v_self->n_outputs)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = ((PyObject *)__pyx_f_7sklearn_4tree_6_utils_sizet_ptr_to_ndarray(__pyx_v_self->n_classes, __pyx_v_self->n_outputs)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_copy); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_copy); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = NULL; @@ -5938,10 +6068,10 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_9n_classes___get__(struct } } if (__pyx_t_2) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else { - __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -5949,7 +6079,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_9n_classes___get__(struct __pyx_t_1 = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":540 + /* "sklearn/tree/_tree.pyx":543 * # (i.e. through `_resize` or `__setstate__`) * property n_classes: * def __get__(self): # <<<<<<<<<<<<<< @@ -5970,7 +6100,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_9n_classes___get__(struct return __pyx_r; } -/* "sklearn/tree/_tree.pyx":545 +/* "sklearn/tree/_tree.pyx":548 * * property children_left: * def __get__(self): # <<<<<<<<<<<<<< @@ -6001,7 +6131,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_13children_left___get__(st int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "sklearn/tree/_tree.pyx":546 + /* "sklearn/tree/_tree.pyx":549 * property children_left: * def __get__(self): * return self._get_node_ndarray()['left_child'][:self.node_count] # <<<<<<<<<<<<<< @@ -6009,19 +6139,19 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_13children_left___get__(st * property children_right: */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_left_child); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_left_child); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":545 + /* "sklearn/tree/_tree.pyx":548 * * property children_left: * def __get__(self): # <<<<<<<<<<<<<< @@ -6041,7 +6171,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_13children_left___get__(st return __pyx_r; } -/* "sklearn/tree/_tree.pyx":549 +/* "sklearn/tree/_tree.pyx":552 * * property children_right: * def __get__(self): # <<<<<<<<<<<<<< @@ -6072,7 +6202,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_14children_right___get__(s int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "sklearn/tree/_tree.pyx":550 + /* "sklearn/tree/_tree.pyx":553 * property children_right: * def __get__(self): * return self._get_node_ndarray()['right_child'][:self.node_count] # <<<<<<<<<<<<<< @@ -6080,19 +6210,19 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_14children_right___get__(s * property feature: */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_right_child); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_right_child); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":549 + /* "sklearn/tree/_tree.pyx":552 * * property children_right: * def __get__(self): # <<<<<<<<<<<<<< @@ -6112,7 +6242,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_14children_right___get__(s return __pyx_r; } -/* "sklearn/tree/_tree.pyx":553 +/* "sklearn/tree/_tree.pyx":556 * * property feature: * def __get__(self): # <<<<<<<<<<<<<< @@ -6143,7 +6273,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_7feature___get__(struct __ int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "sklearn/tree/_tree.pyx":554 + /* "sklearn/tree/_tree.pyx":557 * property feature: * def __get__(self): * return self._get_node_ndarray()['feature'][:self.node_count] # <<<<<<<<<<<<<< @@ -6151,19 +6281,19 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_7feature___get__(struct __ * property threshold: */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_feature); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_feature); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":553 + /* "sklearn/tree/_tree.pyx":556 * * property feature: * def __get__(self): # <<<<<<<<<<<<<< @@ -6183,7 +6313,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_7feature___get__(struct __ return __pyx_r; } -/* "sklearn/tree/_tree.pyx":557 +/* "sklearn/tree/_tree.pyx":560 * * property threshold: * def __get__(self): # <<<<<<<<<<<<<< @@ -6214,7 +6344,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_9threshold___get__(struct int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "sklearn/tree/_tree.pyx":558 + /* "sklearn/tree/_tree.pyx":561 * property threshold: * def __get__(self): * return self._get_node_ndarray()['threshold'][:self.node_count] # <<<<<<<<<<<<<< @@ -6222,19 +6352,19 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_9threshold___get__(struct * property impurity: */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_threshold); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_threshold); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":557 + /* "sklearn/tree/_tree.pyx":560 * * property threshold: * def __get__(self): # <<<<<<<<<<<<<< @@ -6254,7 +6384,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_9threshold___get__(struct return __pyx_r; } -/* "sklearn/tree/_tree.pyx":561 +/* "sklearn/tree/_tree.pyx":564 * * property impurity: * def __get__(self): # <<<<<<<<<<<<<< @@ -6285,7 +6415,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8impurity___get__(struct _ int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "sklearn/tree/_tree.pyx":562 + /* "sklearn/tree/_tree.pyx":565 * property impurity: * def __get__(self): * return self._get_node_ndarray()['impurity'][:self.node_count] # <<<<<<<<<<<<<< @@ -6293,19 +6423,19 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8impurity___get__(struct _ * property n_node_samples: */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_impurity); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_impurity); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":561 + /* "sklearn/tree/_tree.pyx":564 * * property impurity: * def __get__(self): # <<<<<<<<<<<<<< @@ -6325,7 +6455,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8impurity___get__(struct _ return __pyx_r; } -/* "sklearn/tree/_tree.pyx":565 +/* "sklearn/tree/_tree.pyx":568 * * property n_node_samples: * def __get__(self): # <<<<<<<<<<<<<< @@ -6356,7 +6486,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_14n_node_samples___get__(s int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "sklearn/tree/_tree.pyx":566 + /* "sklearn/tree/_tree.pyx":569 * property n_node_samples: * def __get__(self): * return self._get_node_ndarray()['n_node_samples'][:self.node_count] # <<<<<<<<<<<<<< @@ -6364,19 +6494,19 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_14n_node_samples___get__(s * property weighted_n_node_samples: */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_n_node_samples); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_n_node_samples); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":565 + /* "sklearn/tree/_tree.pyx":568 * * property n_node_samples: * def __get__(self): # <<<<<<<<<<<<<< @@ -6396,7 +6526,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_14n_node_samples___get__(s return __pyx_r; } -/* "sklearn/tree/_tree.pyx":569 +/* "sklearn/tree/_tree.pyx":572 * * property weighted_n_node_samples: * def __get__(self): # <<<<<<<<<<<<<< @@ -6427,7 +6557,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_23weighted_n_node_samples_ int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "sklearn/tree/_tree.pyx":570 + /* "sklearn/tree/_tree.pyx":573 * property weighted_n_node_samples: * def __get__(self): * return self._get_node_ndarray()['weighted_n_node_samples'][:self.node_count] # <<<<<<<<<<<<<< @@ -6435,19 +6565,19 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_23weighted_n_node_samples_ * property value: */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_weighted_n_node_samples); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_weighted_n_node_samples); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_t_2, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":569 + /* "sklearn/tree/_tree.pyx":572 * * property weighted_n_node_samples: * def __get__(self): # <<<<<<<<<<<<<< @@ -6467,7 +6597,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_23weighted_n_node_samples_ return __pyx_r; } -/* "sklearn/tree/_tree.pyx":573 +/* "sklearn/tree/_tree.pyx":576 * * property value: * def __get__(self): # <<<<<<<<<<<<<< @@ -6498,7 +6628,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_5value___get__(struct __py int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "sklearn/tree/_tree.pyx":574 + /* "sklearn/tree/_tree.pyx":577 * property value: * def __get__(self): * return self._get_value_ndarray()[:self.node_count] # <<<<<<<<<<<<<< @@ -6506,16 +6636,16 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_5value___get__(struct __py * def __cinit__(self, int n_features, np.ndarray[SIZE_t, ndim=1] n_classes, */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_value_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_value_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetSlice(__pyx_t_1, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetSlice(__pyx_t_1, 0, __pyx_v_self->node_count, NULL, NULL, NULL, 0, 1, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":573 + /* "sklearn/tree/_tree.pyx":576 * * property value: * def __get__(self): # <<<<<<<<<<<<<< @@ -6535,7 +6665,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_5value___get__(struct __py return __pyx_r; } -/* "sklearn/tree/_tree.pyx":576 +/* "sklearn/tree/_tree.pyx":579 * return self._get_value_ndarray()[:self.node_count] * * def __cinit__(self, int n_features, np.ndarray[SIZE_t, ndim=1] n_classes, # <<<<<<<<<<<<<< @@ -6576,16 +6706,16 @@ static int __pyx_pw_7sklearn_4tree_5_tree_4Tree_1__cinit__(PyObject *__pyx_v_sel case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_n_classes)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_n_outputs)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -6594,19 +6724,19 @@ static int __pyx_pw_7sklearn_4tree_5_tree_4Tree_1__cinit__(PyObject *__pyx_v_sel values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } - __pyx_v_n_features = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_n_features == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_n_features = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_n_features == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_n_classes = ((PyArrayObject *)values[1]); - __pyx_v_n_outputs = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_n_outputs == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_n_outputs = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_n_outputs == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 580; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree.Tree.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_n_classes), __pyx_ptype_5numpy_ndarray, 1, "n_classes", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_n_classes), __pyx_ptype_5numpy_ndarray, 1, "n_classes", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(((struct __pyx_obj_7sklearn_4tree_5_tree_Tree *)__pyx_v_self), __pyx_v_n_features, __pyx_v_n_classes, __pyx_v_n_outputs); /* function exit code */ @@ -6641,11 +6771,11 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle __pyx_pybuffernd_n_classes.rcbuffer = &__pyx_pybuffer_n_classes; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_n_classes.rcbuffer->pybuffer, (PyObject*)__pyx_v_n_classes, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_SIZE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_n_classes.rcbuffer->pybuffer, (PyObject*)__pyx_v_n_classes, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_SIZE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_n_classes.diminfo[0].strides = __pyx_pybuffernd_n_classes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_n_classes.diminfo[0].shape = __pyx_pybuffernd_n_classes.rcbuffer->pybuffer.shape[0]; - /* "sklearn/tree/_tree.pyx":580 + /* "sklearn/tree/_tree.pyx":583 * """Constructor.""" * # Input/Output layout * self.n_features = n_features # <<<<<<<<<<<<<< @@ -6654,7 +6784,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle */ __pyx_v_self->n_features = __pyx_v_n_features; - /* "sklearn/tree/_tree.pyx":581 + /* "sklearn/tree/_tree.pyx":584 * # Input/Output layout * self.n_features = n_features * self.n_outputs = n_outputs # <<<<<<<<<<<<<< @@ -6663,7 +6793,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle */ __pyx_v_self->n_outputs = __pyx_v_n_outputs; - /* "sklearn/tree/_tree.pyx":582 + /* "sklearn/tree/_tree.pyx":585 * self.n_features = n_features * self.n_outputs = n_outputs * self.n_classes = NULL # <<<<<<<<<<<<<< @@ -6672,25 +6802,25 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle */ __pyx_v_self->n_classes = NULL; - /* "sklearn/tree/_tree.pyx":583 + /* "sklearn/tree/_tree.pyx":586 * self.n_outputs = n_outputs * self.n_classes = NULL * safe_realloc(&self.n_classes, n_outputs) # <<<<<<<<<<<<<< * * self.max_n_classes = np.max(n_classes) */ - __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->n_classes), __pyx_v_n_outputs); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 583; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_self->n_classes), __pyx_v_n_outputs); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 586; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":585 + /* "sklearn/tree/_tree.pyx":588 * safe_realloc(&self.n_classes, n_outputs) * * self.max_n_classes = np.max(n_classes) # <<<<<<<<<<<<<< * self.value_stride = n_outputs * self.max_n_classes * */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 588; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_max); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_max); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 588; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = NULL; @@ -6704,25 +6834,25 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle } } if (!__pyx_t_2) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, ((PyObject *)__pyx_v_n_classes)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, ((PyObject *)__pyx_v_n_classes)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 588; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); } else { - __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 588; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __pyx_t_2 = NULL; __Pyx_INCREF(((PyObject *)__pyx_v_n_classes)); __Pyx_GIVEREF(((PyObject *)__pyx_v_n_classes)); PyTuple_SET_ITEM(__pyx_t_4, 0+1, ((PyObject *)__pyx_v_n_classes)); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 588; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_5 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 588; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_self->max_n_classes = __pyx_t_5; - /* "sklearn/tree/_tree.pyx":586 + /* "sklearn/tree/_tree.pyx":589 * * self.max_n_classes = np.max(n_classes) * self.value_stride = n_outputs * self.max_n_classes # <<<<<<<<<<<<<< @@ -6731,7 +6861,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle */ __pyx_v_self->value_stride = (__pyx_v_n_outputs * __pyx_v_self->max_n_classes); - /* "sklearn/tree/_tree.pyx":589 + /* "sklearn/tree/_tree.pyx":592 * * cdef SIZE_t k * for k in range(n_outputs): # <<<<<<<<<<<<<< @@ -6742,7 +6872,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_6; __pyx_t_5+=1) { __pyx_v_k = __pyx_t_5; - /* "sklearn/tree/_tree.pyx":590 + /* "sklearn/tree/_tree.pyx":593 * cdef SIZE_t k * for k in range(n_outputs): * self.n_classes[k] = n_classes[k] # <<<<<<<<<<<<<< @@ -6753,7 +6883,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle (__pyx_v_self->n_classes[__pyx_v_k]) = (*__Pyx_BufPtrStrided1d(__pyx_t_7sklearn_4tree_5_tree_SIZE_t *, __pyx_pybuffernd_n_classes.rcbuffer->pybuffer.buf, __pyx_t_7, __pyx_pybuffernd_n_classes.diminfo[0].strides)); } - /* "sklearn/tree/_tree.pyx":593 + /* "sklearn/tree/_tree.pyx":596 * * # Inner structures * self.max_depth = 0 # <<<<<<<<<<<<<< @@ -6762,7 +6892,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle */ __pyx_v_self->max_depth = 0; - /* "sklearn/tree/_tree.pyx":594 + /* "sklearn/tree/_tree.pyx":597 * # Inner structures * self.max_depth = 0 * self.node_count = 0 # <<<<<<<<<<<<<< @@ -6771,7 +6901,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle */ __pyx_v_self->node_count = 0; - /* "sklearn/tree/_tree.pyx":595 + /* "sklearn/tree/_tree.pyx":598 * self.max_depth = 0 * self.node_count = 0 * self.capacity = 0 # <<<<<<<<<<<<<< @@ -6780,7 +6910,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle */ __pyx_v_self->capacity = 0; - /* "sklearn/tree/_tree.pyx":596 + /* "sklearn/tree/_tree.pyx":599 * self.node_count = 0 * self.capacity = 0 * self.value = NULL # <<<<<<<<<<<<<< @@ -6789,7 +6919,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle */ __pyx_v_self->value = NULL; - /* "sklearn/tree/_tree.pyx":597 + /* "sklearn/tree/_tree.pyx":600 * self.capacity = 0 * self.value = NULL * self.nodes = NULL # <<<<<<<<<<<<<< @@ -6798,7 +6928,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle */ __pyx_v_self->nodes = NULL; - /* "sklearn/tree/_tree.pyx":576 + /* "sklearn/tree/_tree.pyx":579 * return self._get_value_ndarray()[:self.node_count] * * def __cinit__(self, int n_features, np.ndarray[SIZE_t, ndim=1] n_classes, # <<<<<<<<<<<<<< @@ -6828,7 +6958,7 @@ static int __pyx_pf_7sklearn_4tree_5_tree_4Tree___cinit__(struct __pyx_obj_7skle return __pyx_r; } -/* "sklearn/tree/_tree.pyx":599 +/* "sklearn/tree/_tree.pyx":602 * self.nodes = NULL * * def __dealloc__(self): # <<<<<<<<<<<<<< @@ -6851,7 +6981,7 @@ static void __pyx_pf_7sklearn_4tree_5_tree_4Tree_2__dealloc__(struct __pyx_obj_7 __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__dealloc__", 0); - /* "sklearn/tree/_tree.pyx":602 + /* "sklearn/tree/_tree.pyx":605 * """Destructor.""" * # Free all inner structures * free(self.n_classes) # <<<<<<<<<<<<<< @@ -6860,7 +6990,7 @@ static void __pyx_pf_7sklearn_4tree_5_tree_4Tree_2__dealloc__(struct __pyx_obj_7 */ free(__pyx_v_self->n_classes); - /* "sklearn/tree/_tree.pyx":603 + /* "sklearn/tree/_tree.pyx":606 * # Free all inner structures * free(self.n_classes) * free(self.value) # <<<<<<<<<<<<<< @@ -6869,7 +6999,7 @@ static void __pyx_pf_7sklearn_4tree_5_tree_4Tree_2__dealloc__(struct __pyx_obj_7 */ free(__pyx_v_self->value); - /* "sklearn/tree/_tree.pyx":604 + /* "sklearn/tree/_tree.pyx":607 * free(self.n_classes) * free(self.value) * free(self.nodes) # <<<<<<<<<<<<<< @@ -6878,7 +7008,7 @@ static void __pyx_pf_7sklearn_4tree_5_tree_4Tree_2__dealloc__(struct __pyx_obj_7 */ free(__pyx_v_self->nodes); - /* "sklearn/tree/_tree.pyx":599 + /* "sklearn/tree/_tree.pyx":602 * self.nodes = NULL * * def __dealloc__(self): # <<<<<<<<<<<<<< @@ -6890,7 +7020,7 @@ static void __pyx_pf_7sklearn_4tree_5_tree_4Tree_2__dealloc__(struct __pyx_obj_7 __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_tree.pyx":606 +/* "sklearn/tree/_tree.pyx":609 * free(self.nodes) * * def __reduce__(self): # <<<<<<<<<<<<<< @@ -6924,7 +7054,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_4__reduce__(struct __pyx_o int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); - /* "sklearn/tree/_tree.pyx":608 + /* "sklearn/tree/_tree.pyx":611 * def __reduce__(self): * """Reduce re-implementation, for pickling.""" * return (Tree, (self.n_features, # <<<<<<<<<<<<<< @@ -6932,37 +7062,37 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_4__reduce__(struct __pyx_o * self.n_outputs), self.__getstate__()) */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->n_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->n_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - /* "sklearn/tree/_tree.pyx":609 + /* "sklearn/tree/_tree.pyx":612 * """Reduce re-implementation, for pickling.""" * return (Tree, (self.n_features, * sizet_ptr_to_ndarray(self.n_classes, self.n_outputs), # <<<<<<<<<<<<<< * self.n_outputs), self.__getstate__()) * */ - __pyx_t_2 = ((PyObject *)__pyx_f_7sklearn_4tree_6_utils_sizet_ptr_to_ndarray(__pyx_v_self->n_classes, __pyx_v_self->n_outputs)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = ((PyObject *)__pyx_f_7sklearn_4tree_6_utils_sizet_ptr_to_ndarray(__pyx_v_self->n_classes, __pyx_v_self->n_outputs)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - /* "sklearn/tree/_tree.pyx":610 + /* "sklearn/tree/_tree.pyx":613 * return (Tree, (self.n_features, * sizet_ptr_to_ndarray(self.n_classes, self.n_outputs), * self.n_outputs), self.__getstate__()) # <<<<<<<<<<<<<< * * def __getstate__(self): */ - __pyx_t_3 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->n_outputs); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->n_outputs); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - /* "sklearn/tree/_tree.pyx":608 + /* "sklearn/tree/_tree.pyx":611 * def __reduce__(self): * """Reduce re-implementation, for pickling.""" * return (Tree, (self.n_features, # <<<<<<<<<<<<<< * sizet_ptr_to_ndarray(self.n_classes, self.n_outputs), * self.n_outputs), self.__getstate__()) */ - __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); @@ -6974,14 +7104,14 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_4__reduce__(struct __pyx_o __pyx_t_2 = 0; __pyx_t_3 = 0; - /* "sklearn/tree/_tree.pyx":610 + /* "sklearn/tree/_tree.pyx":613 * return (Tree, (self.n_features, * sizet_ptr_to_ndarray(self.n_classes, self.n_outputs), * self.n_outputs), self.__getstate__()) # <<<<<<<<<<<<<< * * def __getstate__(self): */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_getstate); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_getstate); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = NULL; if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) { @@ -6994,22 +7124,22 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_4__reduce__(struct __pyx_o } } if (__pyx_t_1) { - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } else { - __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "sklearn/tree/_tree.pyx":608 + /* "sklearn/tree/_tree.pyx":611 * def __reduce__(self): * """Reduce re-implementation, for pickling.""" * return (Tree, (self.n_features, # <<<<<<<<<<<<<< * sizet_ptr_to_ndarray(self.n_classes, self.n_outputs), * self.n_outputs), self.__getstate__()) */ - __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_5_tree_Tree))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_4tree_5_tree_Tree))); @@ -7024,7 +7154,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_4__reduce__(struct __pyx_o __pyx_t_2 = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":606 + /* "sklearn/tree/_tree.pyx":609 * free(self.nodes) * * def __reduce__(self): # <<<<<<<<<<<<<< @@ -7046,7 +7176,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_4__reduce__(struct __pyx_o return __pyx_r; } -/* "sklearn/tree/_tree.pyx":612 +/* "sklearn/tree/_tree.pyx":615 * self.n_outputs), self.__getstate__()) * * def __getstate__(self): # <<<<<<<<<<<<<< @@ -7078,55 +7208,55 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_6__getstate__(struct __pyx int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__getstate__", 0); - /* "sklearn/tree/_tree.pyx":614 + /* "sklearn/tree/_tree.pyx":617 * def __getstate__(self): * """Getstate re-implementation, for pickling.""" * d = {} # <<<<<<<<<<<<<< * d["node_count"] = self.node_count * d["nodes"] = self._get_node_ndarray() */ - __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_v_d = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":615 + /* "sklearn/tree/_tree.pyx":618 * """Getstate re-implementation, for pickling.""" * d = {} * d["node_count"] = self.node_count # <<<<<<<<<<<<<< * d["nodes"] = self._get_node_ndarray() * d["values"] = self._get_value_ndarray() */ - __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->node_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->node_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 618; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (unlikely(PyDict_SetItem(__pyx_v_d, __pyx_n_s_node_count, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(PyDict_SetItem(__pyx_v_d, __pyx_n_s_node_count, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 618; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":616 + /* "sklearn/tree/_tree.pyx":619 * d = {} * d["node_count"] = self.node_count * d["nodes"] = self._get_node_ndarray() # <<<<<<<<<<<<<< * d["values"] = self._get_value_ndarray() * return d */ - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_node_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (unlikely(PyDict_SetItem(__pyx_v_d, __pyx_n_s_nodes, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(PyDict_SetItem(__pyx_v_d, __pyx_n_s_nodes, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":617 + /* "sklearn/tree/_tree.pyx":620 * d["node_count"] = self.node_count * d["nodes"] = self._get_node_ndarray() * d["values"] = self._get_value_ndarray() # <<<<<<<<<<<<<< * return d * */ - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_value_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_value_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (unlikely(PyDict_SetItem(__pyx_v_d, __pyx_n_s_values, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(PyDict_SetItem(__pyx_v_d, __pyx_n_s_values, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":618 + /* "sklearn/tree/_tree.pyx":621 * d["nodes"] = self._get_node_ndarray() * d["values"] = self._get_value_ndarray() * return d # <<<<<<<<<<<<<< @@ -7138,7 +7268,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_6__getstate__(struct __pyx __pyx_r = __pyx_v_d; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":612 + /* "sklearn/tree/_tree.pyx":615 * self.n_outputs), self.__getstate__()) * * def __getstate__(self): # <<<<<<<<<<<<<< @@ -7158,7 +7288,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_6__getstate__(struct __pyx return __pyx_r; } -/* "sklearn/tree/_tree.pyx":620 +/* "sklearn/tree/_tree.pyx":623 * return d * * def __setstate__(self, d): # <<<<<<<<<<<<<< @@ -7203,101 +7333,101 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8__setstate__(struct __pyx int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate__", 0); - /* "sklearn/tree/_tree.pyx":622 + /* "sklearn/tree/_tree.pyx":625 * def __setstate__(self, d): * """Setstate re-implementation, for unpickling.""" * self.node_count = d["node_count"] # <<<<<<<<<<<<<< * * if 'nodes' not in d: */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_d, __pyx_n_s_node_count); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_1 = PyObject_GetItem(__pyx_v_d, __pyx_n_s_node_count); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_self->node_count = __pyx_t_2; - /* "sklearn/tree/_tree.pyx":624 + /* "sklearn/tree/_tree.pyx":627 * self.node_count = d["node_count"] * * if 'nodes' not in d: # <<<<<<<<<<<<<< * raise ValueError('You have loaded Tree version which ' * 'cannot be imported') */ - __pyx_t_3 = (__Pyx_PySequence_Contains(__pyx_n_s_nodes, __pyx_v_d, Py_NE)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = (__Pyx_PySequence_Contains(__pyx_n_s_nodes, __pyx_v_d, Py_NE)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = (__pyx_t_3 != 0); if (__pyx_t_4) { - /* "sklearn/tree/_tree.pyx":625 + /* "sklearn/tree/_tree.pyx":628 * * if 'nodes' not in d: * raise ValueError('You have loaded Tree version which ' # <<<<<<<<<<<<<< * 'cannot be imported') * */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":628 + /* "sklearn/tree/_tree.pyx":631 * 'cannot be imported') * * node_ndarray = d['nodes'] # <<<<<<<<<<<<<< * value_ndarray = d['values'] * */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_d, __pyx_n_s_nodes); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_1 = PyObject_GetItem(__pyx_v_d, __pyx_n_s_nodes); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 631; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); __pyx_v_node_ndarray = __pyx_t_1; __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":629 + /* "sklearn/tree/_tree.pyx":632 * * node_ndarray = d['nodes'] * value_ndarray = d['values'] # <<<<<<<<<<<<<< * * value_shape = (node_ndarray.shape[0], self.n_outputs, */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_d, __pyx_n_s_values); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_1 = PyObject_GetItem(__pyx_v_d, __pyx_n_s_values); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); __pyx_v_value_ndarray = __pyx_t_1; __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":631 + /* "sklearn/tree/_tree.pyx":634 * value_ndarray = d['values'] * * value_shape = (node_ndarray.shape[0], self.n_outputs, # <<<<<<<<<<<<<< * self.max_n_classes) * if (node_ndarray.ndim != 1 or */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_ndarray, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 631; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_ndarray, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 631; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->n_outputs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 631; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->n_outputs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - /* "sklearn/tree/_tree.pyx":632 + /* "sklearn/tree/_tree.pyx":635 * * value_shape = (node_ndarray.shape[0], self.n_outputs, * self.max_n_classes) # <<<<<<<<<<<<<< * if (node_ndarray.ndim != 1 or * node_ndarray.dtype != NODE_DTYPE or */ - __pyx_t_6 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->max_n_classes); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->max_n_classes); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - /* "sklearn/tree/_tree.pyx":631 + /* "sklearn/tree/_tree.pyx":634 * value_ndarray = d['values'] * * value_shape = (node_ndarray.shape[0], self.n_outputs, # <<<<<<<<<<<<<< * self.max_n_classes) * if (node_ndarray.ndim != 1 or */ - __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 631; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); @@ -7311,18 +7441,18 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8__setstate__(struct __pyx __pyx_v_value_shape = ((PyObject*)__pyx_t_7); __pyx_t_7 = 0; - /* "sklearn/tree/_tree.pyx":633 + /* "sklearn/tree/_tree.pyx":636 * value_shape = (node_ndarray.shape[0], self.n_outputs, * self.max_n_classes) * if (node_ndarray.ndim != 1 or # <<<<<<<<<<<<<< * node_ndarray.dtype != NODE_DTYPE or * not node_ndarray.flags.c_contiguous or */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_ndarray, __pyx_n_s_ndim); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_ndarray, __pyx_n_s_ndim); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __pyx_t_6 = PyObject_RichCompare(__pyx_t_7, __pyx_int_1, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyObject_RichCompare(__pyx_t_7, __pyx_int_1, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (!__pyx_t_3) { } else { @@ -7330,21 +7460,21 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8__setstate__(struct __pyx goto __pyx_L5_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":634 + /* "sklearn/tree/_tree.pyx":637 * self.max_n_classes) * if (node_ndarray.ndim != 1 or * node_ndarray.dtype != NODE_DTYPE or # <<<<<<<<<<<<<< * not node_ndarray.flags.c_contiguous or * value_ndarray.shape != value_shape or */ - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_ndarray, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_ndarray, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_NODE_DTYPE); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_NODE_DTYPE); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_7, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_7, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (!__pyx_t_3) { } else { @@ -7352,19 +7482,19 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8__setstate__(struct __pyx goto __pyx_L5_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":635 + /* "sklearn/tree/_tree.pyx":638 * if (node_ndarray.ndim != 1 or * node_ndarray.dtype != NODE_DTYPE or * not node_ndarray.flags.c_contiguous or # <<<<<<<<<<<<<< * value_ndarray.shape != value_shape or * not value_ndarray.flags.c_contiguous or */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_ndarray, __pyx_n_s_flags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_ndarray, __pyx_n_s_flags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_c_contiguous); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_c_contiguous); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_8 = ((!__pyx_t_3) != 0); if (!__pyx_t_8) { @@ -7373,18 +7503,18 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8__setstate__(struct __pyx goto __pyx_L5_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":636 + /* "sklearn/tree/_tree.pyx":639 * node_ndarray.dtype != NODE_DTYPE or * not node_ndarray.flags.c_contiguous or * value_ndarray.shape != value_shape or # <<<<<<<<<<<<<< * not value_ndarray.flags.c_contiguous or * value_ndarray.dtype != np.float64): */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_value_ndarray, __pyx_n_s_shape); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_value_ndarray, __pyx_n_s_shape); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __pyx_t_1 = PyObject_RichCompare(__pyx_t_7, __pyx_v_value_shape, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyObject_RichCompare(__pyx_t_7, __pyx_v_value_shape, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (!__pyx_t_8) { } else { @@ -7392,19 +7522,19 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8__setstate__(struct __pyx goto __pyx_L5_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":637 + /* "sklearn/tree/_tree.pyx":640 * not node_ndarray.flags.c_contiguous or * value_ndarray.shape != value_shape or * not value_ndarray.flags.c_contiguous or # <<<<<<<<<<<<<< * value_ndarray.dtype != np.float64): * raise ValueError('Did not recognise loaded array layout') */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_value_ndarray, __pyx_n_s_flags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_value_ndarray, __pyx_n_s_flags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_c_contiguous); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_c_contiguous); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_3 = ((!__pyx_t_8) != 0); if (!__pyx_t_3) { @@ -7413,60 +7543,60 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8__setstate__(struct __pyx goto __pyx_L5_bool_binop_done; } - /* "sklearn/tree/_tree.pyx":638 + /* "sklearn/tree/_tree.pyx":641 * value_ndarray.shape != value_shape or * not value_ndarray.flags.c_contiguous or * value_ndarray.dtype != np.float64): # <<<<<<<<<<<<<< * raise ValueError('Did not recognise loaded array layout') * */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_value_ndarray, __pyx_n_s_dtype); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_value_ndarray, __pyx_n_s_dtype); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float64); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float64); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyObject_RichCompare(__pyx_t_7, __pyx_t_6, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyObject_RichCompare(__pyx_t_7, __pyx_t_6, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_4 = __pyx_t_3; __pyx_L5_bool_binop_done:; if (__pyx_t_4) { - /* "sklearn/tree/_tree.pyx":639 + /* "sklearn/tree/_tree.pyx":642 * not value_ndarray.flags.c_contiguous or * value_ndarray.dtype != np.float64): * raise ValueError('Did not recognise loaded array layout') # <<<<<<<<<<<<<< * * self.capacity = node_ndarray.shape[0] */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 642; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 642; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":641 + /* "sklearn/tree/_tree.pyx":644 * raise ValueError('Did not recognise loaded array layout') * * self.capacity = node_ndarray.shape[0] # <<<<<<<<<<<<<< * if self._resize_c(self.capacity) != 0: * raise MemoryError("resizing tree to %d" % self.capacity) */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_ndarray, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_ndarray, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_2 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_6); if (unlikely((__pyx_t_2 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_6); if (unlikely((__pyx_t_2 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_v_self->capacity = __pyx_t_2; - /* "sklearn/tree/_tree.pyx":642 + /* "sklearn/tree/_tree.pyx":645 * * self.capacity = node_ndarray.shape[0] * if self._resize_c(self.capacity) != 0: # <<<<<<<<<<<<<< @@ -7479,32 +7609,32 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8__setstate__(struct __pyx __pyx_t_4 = ((__pyx_t_9 != 0) != 0); if (__pyx_t_4) { - /* "sklearn/tree/_tree.pyx":643 + /* "sklearn/tree/_tree.pyx":646 * self.capacity = node_ndarray.shape[0] * if self._resize_c(self.capacity) != 0: * raise MemoryError("resizing tree to %d" % self.capacity) # <<<<<<<<<<<<<< * nodes = memcpy(self.nodes, ( node_ndarray).data, * self.capacity * sizeof(Node)) */ - __pyx_t_6 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->capacity); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->capacity); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 646; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_resizing_tree_to_d, __pyx_t_6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_resizing_tree_to_d, __pyx_t_6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 646; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 646; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 646; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 646; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":644 + /* "sklearn/tree/_tree.pyx":647 * if self._resize_c(self.capacity) != 0: * raise MemoryError("resizing tree to %d" % self.capacity) * nodes = memcpy(self.nodes, ( node_ndarray).data, # <<<<<<<<<<<<<< @@ -7513,7 +7643,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8__setstate__(struct __pyx */ __pyx_v_nodes = memcpy(__pyx_v_self->nodes, ((PyArrayObject *)__pyx_v_node_ndarray)->data, (__pyx_v_self->capacity * (sizeof(struct __pyx_t_7sklearn_4tree_5_tree_Node)))); - /* "sklearn/tree/_tree.pyx":646 + /* "sklearn/tree/_tree.pyx":649 * nodes = memcpy(self.nodes, ( node_ndarray).data, * self.capacity * sizeof(Node)) * value = memcpy(self.value, ( value_ndarray).data, # <<<<<<<<<<<<<< @@ -7522,7 +7652,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8__setstate__(struct __pyx */ __pyx_v_value = memcpy(__pyx_v_self->value, ((PyArrayObject *)__pyx_v_value_ndarray)->data, ((__pyx_v_self->capacity * __pyx_v_self->value_stride) * (sizeof(double)))); - /* "sklearn/tree/_tree.pyx":620 + /* "sklearn/tree/_tree.pyx":623 * return d * * def __setstate__(self, d): # <<<<<<<<<<<<<< @@ -7549,7 +7679,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_8__setstate__(struct __pyx return __pyx_r; } -/* "sklearn/tree/_tree.pyx":649 +/* "sklearn/tree/_tree.pyx":652 * self.capacity * self.value_stride * sizeof(double)) * * cdef void _resize(self, SIZE_t capacity) except *: # <<<<<<<<<<<<<< @@ -7567,7 +7697,7 @@ static void __pyx_f_7sklearn_4tree_5_tree_4Tree__resize(struct __pyx_obj_7sklear int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_resize", 0); - /* "sklearn/tree/_tree.pyx":652 + /* "sklearn/tree/_tree.pyx":655 * """Resize all inner arrays to `capacity`, if `capacity` == -1, then * double the size of the inner arrays.""" * if self._resize_c(capacity) != 0: # <<<<<<<<<<<<<< @@ -7580,17 +7710,17 @@ static void __pyx_f_7sklearn_4tree_5_tree_4Tree__resize(struct __pyx_obj_7sklear __pyx_t_3 = ((__pyx_t_1 != 0) != 0); if (__pyx_t_3) { - /* "sklearn/tree/_tree.pyx":653 + /* "sklearn/tree/_tree.pyx":656 * double the size of the inner arrays.""" * if self._resize_c(capacity) != 0: * raise MemoryError() # <<<<<<<<<<<<<< * * # XXX using (size_t)(-1) is ugly, but SIZE_MAX is not available in C89 */ - PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 656; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":649 + /* "sklearn/tree/_tree.pyx":652 * self.capacity * self.value_stride * sizeof(double)) * * cdef void _resize(self, SIZE_t capacity) except *: # <<<<<<<<<<<<<< @@ -7606,7 +7736,7 @@ static void __pyx_f_7sklearn_4tree_5_tree_4Tree__resize(struct __pyx_obj_7sklear __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_tree.pyx":657 +/* "sklearn/tree/_tree.pyx":660 * # XXX using (size_t)(-1) is ugly, but SIZE_MAX is not available in C89 * # (i.e., older MSVC). * cdef int _resize_c(self, SIZE_t capacity=(-1)) nogil: # <<<<<<<<<<<<<< @@ -7626,7 +7756,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea } } - /* "sklearn/tree/_tree.pyx":659 + /* "sklearn/tree/_tree.pyx":662 * cdef int _resize_c(self, SIZE_t capacity=(-1)) nogil: * """Guts of _resize. Returns 0 for success, -1 for error.""" * if capacity == self.capacity and self.nodes != NULL: # <<<<<<<<<<<<<< @@ -7644,7 +7774,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea __pyx_L4_bool_binop_done:; if (__pyx_t_1) { - /* "sklearn/tree/_tree.pyx":660 + /* "sklearn/tree/_tree.pyx":663 * """Guts of _resize. Returns 0 for success, -1 for error.""" * if capacity == self.capacity and self.nodes != NULL: * return 0 # <<<<<<<<<<<<<< @@ -7655,7 +7785,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea goto __pyx_L0; } - /* "sklearn/tree/_tree.pyx":662 + /* "sklearn/tree/_tree.pyx":665 * return 0 * * if capacity == (-1): # <<<<<<<<<<<<<< @@ -7665,7 +7795,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea __pyx_t_1 = ((__pyx_v_capacity == ((__pyx_t_7sklearn_4tree_5_tree_SIZE_t)-1)) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_tree.pyx":663 + /* "sklearn/tree/_tree.pyx":666 * * if capacity == (-1): * if self.capacity == 0: # <<<<<<<<<<<<<< @@ -7675,7 +7805,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea __pyx_t_1 = ((__pyx_v_self->capacity == 0) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_tree.pyx":664 + /* "sklearn/tree/_tree.pyx":667 * if capacity == (-1): * if self.capacity == 0: * capacity = 3 # default initial value # <<<<<<<<<<<<<< @@ -7687,7 +7817,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea } /*else*/ { - /* "sklearn/tree/_tree.pyx":666 + /* "sklearn/tree/_tree.pyx":669 * capacity = 3 # default initial value * else: * capacity = 2 * self.capacity # <<<<<<<<<<<<<< @@ -7701,7 +7831,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea } __pyx_L6:; - /* "sklearn/tree/_tree.pyx":669 + /* "sklearn/tree/_tree.pyx":672 * * # XXX no safe_realloc here because we need to grab the GIL * cdef void* ptr = realloc(self.nodes, capacity * sizeof(Node)) # <<<<<<<<<<<<<< @@ -7710,7 +7840,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea */ __pyx_v_ptr = realloc(__pyx_v_self->nodes, (__pyx_v_capacity * (sizeof(struct __pyx_t_7sklearn_4tree_5_tree_Node)))); - /* "sklearn/tree/_tree.pyx":670 + /* "sklearn/tree/_tree.pyx":673 * # XXX no safe_realloc here because we need to grab the GIL * cdef void* ptr = realloc(self.nodes, capacity * sizeof(Node)) * if ptr == NULL: # <<<<<<<<<<<<<< @@ -7720,7 +7850,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea __pyx_t_1 = ((__pyx_v_ptr == NULL) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_tree.pyx":671 + /* "sklearn/tree/_tree.pyx":674 * cdef void* ptr = realloc(self.nodes, capacity * sizeof(Node)) * if ptr == NULL: * return -1 # <<<<<<<<<<<<<< @@ -7731,7 +7861,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea goto __pyx_L0; } - /* "sklearn/tree/_tree.pyx":672 + /* "sklearn/tree/_tree.pyx":675 * if ptr == NULL: * return -1 * self.nodes = ptr # <<<<<<<<<<<<<< @@ -7740,7 +7870,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea */ __pyx_v_self->nodes = ((struct __pyx_t_7sklearn_4tree_5_tree_Node *)__pyx_v_ptr); - /* "sklearn/tree/_tree.pyx":673 + /* "sklearn/tree/_tree.pyx":676 * return -1 * self.nodes = ptr * ptr = realloc(self.value, # <<<<<<<<<<<<<< @@ -7749,7 +7879,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea */ __pyx_v_ptr = realloc(__pyx_v_self->value, ((__pyx_v_capacity * __pyx_v_self->value_stride) * (sizeof(double)))); - /* "sklearn/tree/_tree.pyx":675 + /* "sklearn/tree/_tree.pyx":678 * ptr = realloc(self.value, * capacity * self.value_stride * sizeof(double)) * if ptr == NULL: # <<<<<<<<<<<<<< @@ -7759,7 +7889,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea __pyx_t_1 = ((__pyx_v_ptr == NULL) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_tree.pyx":676 + /* "sklearn/tree/_tree.pyx":679 * capacity * self.value_stride * sizeof(double)) * if ptr == NULL: * return -1 # <<<<<<<<<<<<<< @@ -7770,7 +7900,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea goto __pyx_L0; } - /* "sklearn/tree/_tree.pyx":677 + /* "sklearn/tree/_tree.pyx":680 * if ptr == NULL: * return -1 * self.value = ptr # <<<<<<<<<<<<<< @@ -7779,7 +7909,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea */ __pyx_v_self->value = ((double *)__pyx_v_ptr); - /* "sklearn/tree/_tree.pyx":680 + /* "sklearn/tree/_tree.pyx":683 * * # value memory is initialised to 0 to enable classifier argmax * if capacity > self.capacity: # <<<<<<<<<<<<<< @@ -7789,7 +7919,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea __pyx_t_1 = ((__pyx_v_capacity > __pyx_v_self->capacity) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_tree.pyx":681 + /* "sklearn/tree/_tree.pyx":684 * # value memory is initialised to 0 to enable classifier argmax * if capacity > self.capacity: * memset((self.value + self.capacity * self.value_stride), 0, # <<<<<<<<<<<<<< @@ -7801,7 +7931,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea } __pyx_L10:; - /* "sklearn/tree/_tree.pyx":686 + /* "sklearn/tree/_tree.pyx":689 * * # if capacity smaller than node_count, adjust the counter * if capacity < self.node_count: # <<<<<<<<<<<<<< @@ -7811,7 +7941,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea __pyx_t_1 = ((__pyx_v_capacity < __pyx_v_self->node_count) != 0); if (__pyx_t_1) { - /* "sklearn/tree/_tree.pyx":687 + /* "sklearn/tree/_tree.pyx":690 * # if capacity smaller than node_count, adjust the counter * if capacity < self.node_count: * self.node_count = capacity # <<<<<<<<<<<<<< @@ -7823,7 +7953,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea } __pyx_L11:; - /* "sklearn/tree/_tree.pyx":689 + /* "sklearn/tree/_tree.pyx":692 * self.node_count = capacity * * self.capacity = capacity # <<<<<<<<<<<<<< @@ -7832,7 +7962,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea */ __pyx_v_self->capacity = __pyx_v_capacity; - /* "sklearn/tree/_tree.pyx":690 + /* "sklearn/tree/_tree.pyx":693 * * self.capacity = capacity * return 0 # <<<<<<<<<<<<<< @@ -7842,7 +7972,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea __pyx_r = 0; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":657 + /* "sklearn/tree/_tree.pyx":660 * # XXX using (size_t)(-1) is ugly, but SIZE_MAX is not available in C89 * # (i.e., older MSVC). * cdef int _resize_c(self, SIZE_t capacity=(-1)) nogil: # <<<<<<<<<<<<<< @@ -7855,7 +7985,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_4Tree__resize_c(struct __pyx_obj_7sklea return __pyx_r; } -/* "sklearn/tree/_tree.pyx":692 +/* "sklearn/tree/_tree.pyx":695 * return 0 * * cdef SIZE_t _add_node(self, SIZE_t parent, bint is_left, bint is_leaf, # <<<<<<<<<<<<<< @@ -7870,7 +8000,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_t_1; int __pyx_t_2; - /* "sklearn/tree/_tree.pyx":701 + /* "sklearn/tree/_tree.pyx":704 * Returns (size_t)(-1) on error. * """ * cdef SIZE_t node_id = self.node_count # <<<<<<<<<<<<<< @@ -7880,7 +8010,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ __pyx_t_1 = __pyx_v_self->node_count; __pyx_v_node_id = __pyx_t_1; - /* "sklearn/tree/_tree.pyx":703 + /* "sklearn/tree/_tree.pyx":706 * cdef SIZE_t node_id = self.node_count * * if node_id >= self.capacity: # <<<<<<<<<<<<<< @@ -7890,7 +8020,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ __pyx_t_2 = ((__pyx_v_node_id >= __pyx_v_self->capacity) != 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":704 + /* "sklearn/tree/_tree.pyx":707 * * if node_id >= self.capacity: * if self._resize_c() != 0: # <<<<<<<<<<<<<< @@ -7900,7 +8030,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ __pyx_t_2 = ((((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_resize_c(__pyx_v_self, NULL) != 0) != 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":705 + /* "sklearn/tree/_tree.pyx":708 * if node_id >= self.capacity: * if self._resize_c() != 0: * return (-1) # <<<<<<<<<<<<<< @@ -7914,7 +8044,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ } __pyx_L3:; - /* "sklearn/tree/_tree.pyx":707 + /* "sklearn/tree/_tree.pyx":710 * return (-1) * * cdef Node* node = &self.nodes[node_id] # <<<<<<<<<<<<<< @@ -7923,7 +8053,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ */ __pyx_v_node = (&(__pyx_v_self->nodes[__pyx_v_node_id])); - /* "sklearn/tree/_tree.pyx":708 + /* "sklearn/tree/_tree.pyx":711 * * cdef Node* node = &self.nodes[node_id] * node.impurity = impurity # <<<<<<<<<<<<<< @@ -7932,7 +8062,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ */ __pyx_v_node->impurity = __pyx_v_impurity; - /* "sklearn/tree/_tree.pyx":709 + /* "sklearn/tree/_tree.pyx":712 * cdef Node* node = &self.nodes[node_id] * node.impurity = impurity * node.n_node_samples = n_node_samples # <<<<<<<<<<<<<< @@ -7941,7 +8071,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ */ __pyx_v_node->n_node_samples = __pyx_v_n_node_samples; - /* "sklearn/tree/_tree.pyx":710 + /* "sklearn/tree/_tree.pyx":713 * node.impurity = impurity * node.n_node_samples = n_node_samples * node.weighted_n_node_samples = weighted_n_node_samples # <<<<<<<<<<<<<< @@ -7950,7 +8080,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ */ __pyx_v_node->weighted_n_node_samples = __pyx_v_weighted_n_node_samples; - /* "sklearn/tree/_tree.pyx":712 + /* "sklearn/tree/_tree.pyx":715 * node.weighted_n_node_samples = weighted_n_node_samples * * if parent != _TREE_UNDEFINED: # <<<<<<<<<<<<<< @@ -7960,7 +8090,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ __pyx_t_2 = ((__pyx_v_parent != __pyx_v_7sklearn_4tree_5_tree__TREE_UNDEFINED) != 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":713 + /* "sklearn/tree/_tree.pyx":716 * * if parent != _TREE_UNDEFINED: * if is_left: # <<<<<<<<<<<<<< @@ -7970,7 +8100,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ __pyx_t_2 = (__pyx_v_is_left != 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":714 + /* "sklearn/tree/_tree.pyx":717 * if parent != _TREE_UNDEFINED: * if is_left: * self.nodes[parent].left_child = node_id # <<<<<<<<<<<<<< @@ -7982,7 +8112,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ } /*else*/ { - /* "sklearn/tree/_tree.pyx":716 + /* "sklearn/tree/_tree.pyx":719 * self.nodes[parent].left_child = node_id * else: * self.nodes[parent].right_child = node_id # <<<<<<<<<<<<<< @@ -7996,7 +8126,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ } __pyx_L5:; - /* "sklearn/tree/_tree.pyx":718 + /* "sklearn/tree/_tree.pyx":721 * self.nodes[parent].right_child = node_id * * if is_leaf: # <<<<<<<<<<<<<< @@ -8006,7 +8136,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ __pyx_t_2 = (__pyx_v_is_leaf != 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":719 + /* "sklearn/tree/_tree.pyx":722 * * if is_leaf: * node.left_child = _TREE_LEAF # <<<<<<<<<<<<<< @@ -8015,7 +8145,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ */ __pyx_v_node->left_child = __pyx_v_7sklearn_4tree_5_tree__TREE_LEAF; - /* "sklearn/tree/_tree.pyx":720 + /* "sklearn/tree/_tree.pyx":723 * if is_leaf: * node.left_child = _TREE_LEAF * node.right_child = _TREE_LEAF # <<<<<<<<<<<<<< @@ -8024,7 +8154,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ */ __pyx_v_node->right_child = __pyx_v_7sklearn_4tree_5_tree__TREE_LEAF; - /* "sklearn/tree/_tree.pyx":721 + /* "sklearn/tree/_tree.pyx":724 * node.left_child = _TREE_LEAF * node.right_child = _TREE_LEAF * node.feature = _TREE_UNDEFINED # <<<<<<<<<<<<<< @@ -8033,7 +8163,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ */ __pyx_v_node->feature = __pyx_v_7sklearn_4tree_5_tree__TREE_UNDEFINED; - /* "sklearn/tree/_tree.pyx":722 + /* "sklearn/tree/_tree.pyx":725 * node.right_child = _TREE_LEAF * node.feature = _TREE_UNDEFINED * node.threshold = _TREE_UNDEFINED # <<<<<<<<<<<<<< @@ -8045,7 +8175,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ } /*else*/ { - /* "sklearn/tree/_tree.pyx":726 + /* "sklearn/tree/_tree.pyx":729 * else: * # left_child and right_child will be set later * node.feature = feature # <<<<<<<<<<<<<< @@ -8054,7 +8184,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ */ __pyx_v_node->feature = __pyx_v_feature; - /* "sklearn/tree/_tree.pyx":727 + /* "sklearn/tree/_tree.pyx":730 * # left_child and right_child will be set later * node.feature = feature * node.threshold = threshold # <<<<<<<<<<<<<< @@ -8065,7 +8195,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ } __pyx_L7:; - /* "sklearn/tree/_tree.pyx":729 + /* "sklearn/tree/_tree.pyx":732 * node.threshold = threshold * * self.node_count += 1 # <<<<<<<<<<<<<< @@ -8074,7 +8204,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ */ __pyx_v_self->node_count = (__pyx_v_self->node_count + 1); - /* "sklearn/tree/_tree.pyx":731 + /* "sklearn/tree/_tree.pyx":734 * self.node_count += 1 * * return node_id # <<<<<<<<<<<<<< @@ -8084,7 +8214,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ __pyx_r = __pyx_v_node_id; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":692 + /* "sklearn/tree/_tree.pyx":695 * return 0 * * cdef SIZE_t _add_node(self, SIZE_t parent, bint is_left, bint is_leaf, # <<<<<<<<<<<<<< @@ -8097,7 +8227,7 @@ static __pyx_t_7sklearn_4tree_5_tree_SIZE_t __pyx_f_7sklearn_4tree_5_tree_4Tree_ return __pyx_r; } -/* "sklearn/tree/_tree.pyx":733 +/* "sklearn/tree/_tree.pyx":736 * return node_id * * cpdef np.ndarray predict(self, object X): # <<<<<<<<<<<<<< @@ -8126,7 +8256,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_predict(struct __pyx_o if (unlikely(__pyx_skip_dispatch)) ; /* Check if overridden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_predict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_predict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_4Tree_11predict)) { __Pyx_XDECREF(((PyObject *)__pyx_r)); @@ -8142,21 +8272,21 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_predict(struct __pyx_o } } if (!__pyx_t_4) { - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_X); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_X); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); } else { - __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL; __Pyx_INCREF(__pyx_v_X); __Pyx_GIVEREF(__pyx_v_X); PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_v_X); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = ((PyArrayObject *)__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -8165,30 +8295,30 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_predict(struct __pyx_o __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } - /* "sklearn/tree/_tree.pyx":735 + /* "sklearn/tree/_tree.pyx":738 * cpdef np.ndarray predict(self, object X): * """Predict target for X.""" * out = self._get_value_ndarray().take(self.apply(X), axis=0, # <<<<<<<<<<<<<< * mode='clip') * if self.n_outputs == 1: */ - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_value_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->_get_value_ndarray(__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_take); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_take); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->apply(__pyx_v_self, __pyx_v_X, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Tree *)__pyx_v_self->__pyx_vtab)->apply(__pyx_v_self, __pyx_v_X, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_axis, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_mode, __pyx_n_s_clip) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_axis, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_mode, __pyx_n_s_clip) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -8196,7 +8326,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_predict(struct __pyx_o __pyx_v_out = __pyx_t_5; __pyx_t_5 = 0; - /* "sklearn/tree/_tree.pyx":737 + /* "sklearn/tree/_tree.pyx":740 * out = self._get_value_ndarray().take(self.apply(X), axis=0, * mode='clip') * if self.n_outputs == 1: # <<<<<<<<<<<<<< @@ -8206,21 +8336,21 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_predict(struct __pyx_o __pyx_t_6 = ((__pyx_v_self->n_outputs == 1) != 0); if (__pyx_t_6) { - /* "sklearn/tree/_tree.pyx":738 + /* "sklearn/tree/_tree.pyx":741 * mode='clip') * if self.n_outputs == 1: * out = out.reshape(X.shape[0], self.max_n_classes) # <<<<<<<<<<<<<< * return out * */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_out, __pyx_n_s_reshape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_out, __pyx_n_s_reshape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->max_n_classes); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->max_n_classes); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_7 = 0; @@ -8234,7 +8364,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_predict(struct __pyx_o __pyx_t_7 = 1; } } - __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); if (__pyx_t_4) { __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4); __pyx_t_4 = NULL; @@ -8245,7 +8375,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_predict(struct __pyx_o PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_8, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_8, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -8255,7 +8385,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_predict(struct __pyx_o } __pyx_L3:; - /* "sklearn/tree/_tree.pyx":739 + /* "sklearn/tree/_tree.pyx":742 * if self.n_outputs == 1: * out = out.reshape(X.shape[0], self.max_n_classes) * return out # <<<<<<<<<<<<<< @@ -8263,12 +8393,12 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_predict(struct __pyx_o * cpdef np.ndarray apply(self, object X): */ __Pyx_XDECREF(((PyObject *)__pyx_r)); - if (!(likely(((__pyx_v_out) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_out, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 739; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_v_out) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_out, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_INCREF(__pyx_v_out); __pyx_r = ((PyArrayObject *)__pyx_v_out); goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":733 + /* "sklearn/tree/_tree.pyx":736 * return node_id * * cpdef np.ndarray predict(self, object X): # <<<<<<<<<<<<<< @@ -8316,7 +8446,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_10predict(struct __pyx_obj int __pyx_clineno = 0; __Pyx_RefNannySetupContext("predict", 0); __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)__pyx_f_7sklearn_4tree_5_tree_4Tree_predict(__pyx_v_self, __pyx_v_X, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)__pyx_f_7sklearn_4tree_5_tree_4Tree_predict(__pyx_v_self, __pyx_v_X, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -8333,7 +8463,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_10predict(struct __pyx_obj return __pyx_r; } -/* "sklearn/tree/_tree.pyx":741 +/* "sklearn/tree/_tree.pyx":744 * return out * * cpdef np.ndarray apply(self, object X): # <<<<<<<<<<<<<< @@ -8359,7 +8489,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_apply(struct __pyx_obj if (unlikely(__pyx_skip_dispatch)) ; /* Check if overridden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_apply); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_apply); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_4Tree_13apply)) { __Pyx_XDECREF(((PyObject *)__pyx_r)); @@ -8375,21 +8505,21 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_apply(struct __pyx_obj } } if (!__pyx_t_4) { - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_X); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_X); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); } else { - __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL; __Pyx_INCREF(__pyx_v_X); __Pyx_GIVEREF(__pyx_v_X); PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_v_X); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = ((PyArrayObject *)__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -8398,14 +8528,14 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_apply(struct __pyx_obj __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } - /* "sklearn/tree/_tree.pyx":743 + /* "sklearn/tree/_tree.pyx":746 * cpdef np.ndarray apply(self, object X): * """Finds the terminal region (=leaf node) for each sample in X.""" * if issparse(X): # <<<<<<<<<<<<<< * return self._apply_sparse_csr(X) * else: */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_issparse); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_issparse); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -8418,25 +8548,25 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_apply(struct __pyx_obj } } if (!__pyx_t_3) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_X); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_X); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); } else { - __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL; __Pyx_INCREF(__pyx_v_X); __Pyx_GIVEREF(__pyx_v_X); PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_v_X); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_6) { - /* "sklearn/tree/_tree.pyx":744 + /* "sklearn/tree/_tree.pyx":747 * """Finds the terminal region (=leaf node) for each sample in X.""" * if issparse(X): * return self._apply_sparse_csr(X) # <<<<<<<<<<<<<< @@ -8444,7 +8574,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_apply(struct __pyx_obj * return self._apply_dense(X) */ __Pyx_XDECREF(((PyObject *)__pyx_r)); - __pyx_t_1 = ((PyObject *)__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(__pyx_v_self, __pyx_v_X)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(__pyx_v_self, __pyx_v_X)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 747; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; @@ -8452,7 +8582,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_apply(struct __pyx_obj } /*else*/ { - /* "sklearn/tree/_tree.pyx":746 + /* "sklearn/tree/_tree.pyx":749 * return self._apply_sparse_csr(X) * else: * return self._apply_dense(X) # <<<<<<<<<<<<<< @@ -8460,14 +8590,14 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_apply(struct __pyx_obj * */ __Pyx_XDECREF(((PyObject *)__pyx_r)); - __pyx_t_1 = ((PyObject *)__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(__pyx_v_self, __pyx_v_X)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(__pyx_v_self, __pyx_v_X)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 749; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } - /* "sklearn/tree/_tree.pyx":741 + /* "sklearn/tree/_tree.pyx":744 * return out * * cpdef np.ndarray apply(self, object X): # <<<<<<<<<<<<<< @@ -8513,7 +8643,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_12apply(struct __pyx_obj_7 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("apply", 0); __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)__pyx_f_7sklearn_4tree_5_tree_4Tree_apply(__pyx_v_self, __pyx_v_X, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)__pyx_f_7sklearn_4tree_5_tree_4Tree_apply(__pyx_v_self, __pyx_v_X, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -8530,7 +8660,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_12apply(struct __pyx_obj_7 return __pyx_r; } -/* "sklearn/tree/_tree.pyx":749 +/* "sklearn/tree/_tree.pyx":752 * * * cdef inline np.ndarray _apply_dense(self, object X): # <<<<<<<<<<<<<< @@ -8572,7 +8702,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ __pyx_pybuffernd_out.data = NULL; __pyx_pybuffernd_out.rcbuffer = &__pyx_pybuffer_out; - /* "sklearn/tree/_tree.pyx":753 + /* "sklearn/tree/_tree.pyx":756 * * # Check input * if not isinstance(X, np.ndarray): # <<<<<<<<<<<<<< @@ -8583,93 +8713,93 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":755 + /* "sklearn/tree/_tree.pyx":758 * if not isinstance(X, np.ndarray): * raise ValueError("X should be in np.ndarray format, got %s" * % type(X)) # <<<<<<<<<<<<<< * * if X.dtype != DTYPE: */ - __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_X_should_be_in_np_ndarray_format, ((PyObject *)Py_TYPE(__pyx_v_X))); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 755; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_X_should_be_in_np_ndarray_format, ((PyObject *)Py_TYPE(__pyx_v_X))); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 758; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - /* "sklearn/tree/_tree.pyx":754 + /* "sklearn/tree/_tree.pyx":757 * # Check input * if not isinstance(X, np.ndarray): * raise ValueError("X should be in np.ndarray format, got %s" # <<<<<<<<<<<<<< * % type(X)) * */ - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 754; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 757; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 754; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 757; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 754; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 757; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":757 + /* "sklearn/tree/_tree.pyx":760 * % type(X)) * * if X.dtype != DTYPE: # <<<<<<<<<<<<<< * raise ValueError("X.dtype should be np.float32, got %s" % X.dtype) * */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_dtype); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 757; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_dtype); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 757; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 757; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 757; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":758 + /* "sklearn/tree/_tree.pyx":761 * * if X.dtype != DTYPE: * raise ValueError("X.dtype should be np.float32, got %s" % X.dtype) # <<<<<<<<<<<<<< * * # Extract input */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 758; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_X_dtype_should_be_np_float32_got, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 758; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_X_dtype_should_be_np_float32_got, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 758; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 758; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 758; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":761 + /* "sklearn/tree/_tree.pyx":764 * * # Extract input * cdef np.ndarray X_ndarray = X # <<<<<<<<<<<<<< * cdef DTYPE_t* X_ptr = X_ndarray.data * cdef SIZE_t X_sample_stride = X.strides[0] / X.itemsize */ - if (!(likely(((__pyx_v_X) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_X, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_v_X) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_X, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = __pyx_v_X; __Pyx_INCREF(__pyx_t_4); __pyx_v_X_ndarray = ((PyArrayObject *)__pyx_t_4); __pyx_t_4 = 0; - /* "sklearn/tree/_tree.pyx":762 + /* "sklearn/tree/_tree.pyx":765 * # Extract input * cdef np.ndarray X_ndarray = X * cdef DTYPE_t* X_ptr = X_ndarray.data # <<<<<<<<<<<<<< @@ -8678,107 +8808,107 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ */ __pyx_v_X_ptr = ((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *)__pyx_v_X_ndarray->data); - /* "sklearn/tree/_tree.pyx":763 + /* "sklearn/tree/_tree.pyx":766 * cdef np.ndarray X_ndarray = X * cdef DTYPE_t* X_ptr = X_ndarray.data * cdef SIZE_t X_sample_stride = X.strides[0] / X.itemsize # <<<<<<<<<<<<<< * cdef SIZE_t X_fx_stride = X.strides[1] / X.itemsize * cdef SIZE_t n_samples = X.shape[0] */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_strides); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_strides); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_7 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_5); if (unlikely((__pyx_t_7 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_5); if (unlikely((__pyx_t_7 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_X_sample_stride = (((__pyx_t_7sklearn_4tree_5_tree_SIZE_t)__pyx_t_6) / ((__pyx_t_7sklearn_4tree_5_tree_SIZE_t)__pyx_t_7)); - /* "sklearn/tree/_tree.pyx":764 + /* "sklearn/tree/_tree.pyx":767 * cdef DTYPE_t* X_ptr = X_ndarray.data * cdef SIZE_t X_sample_stride = X.strides[0] / X.itemsize * cdef SIZE_t X_fx_stride = X.strides[1] / X.itemsize # <<<<<<<<<<<<<< * cdef SIZE_t n_samples = X.shape[0] * */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_strides); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_strides); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 767; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_5, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_5, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_7 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_4); if (unlikely((__pyx_t_7 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_4); if (unlikely((__pyx_t_7 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 767; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 767; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_6 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_4); if (unlikely((__pyx_t_6 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_4); if (unlikely((__pyx_t_6 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 767; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_X_fx_stride = (((__pyx_t_7sklearn_4tree_5_tree_SIZE_t)__pyx_t_7) / ((__pyx_t_7sklearn_4tree_5_tree_SIZE_t)__pyx_t_6)); - /* "sklearn/tree/_tree.pyx":765 + /* "sklearn/tree/_tree.pyx":768 * cdef SIZE_t X_sample_stride = X.strides[0] / X.itemsize * cdef SIZE_t X_fx_stride = X.strides[1] / X.itemsize * cdef SIZE_t n_samples = X.shape[0] # <<<<<<<<<<<<<< * * # Initialize output */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_n_samples = __pyx_t_6; - /* "sklearn/tree/_tree.pyx":768 + /* "sklearn/tree/_tree.pyx":771 * * # Initialize output * cdef np.ndarray[SIZE_t] out = np.zeros((n_samples,), dtype=np.intp) # <<<<<<<<<<<<<< * cdef SIZE_t* out_ptr = out.data * */ - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_n_samples); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_n_samples); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_intp); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_intp); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (!(likely(((__pyx_t_9) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_9, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_9) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_9, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_10 = ((PyArrayObject *)__pyx_t_9); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_out.rcbuffer->pybuffer, (PyObject*)__pyx_t_10, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_SIZE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_out = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_out.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_out.diminfo[0].strides = __pyx_pybuffernd_out.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_out.diminfo[0].shape = __pyx_pybuffernd_out.rcbuffer->pybuffer.shape[0]; } } @@ -8786,7 +8916,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ __pyx_v_out = ((PyArrayObject *)__pyx_t_9); __pyx_t_9 = 0; - /* "sklearn/tree/_tree.pyx":769 + /* "sklearn/tree/_tree.pyx":772 * # Initialize output * cdef np.ndarray[SIZE_t] out = np.zeros((n_samples,), dtype=np.intp) * cdef SIZE_t* out_ptr = out.data # <<<<<<<<<<<<<< @@ -8795,7 +8925,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ */ __pyx_v_out_ptr = ((__pyx_t_7sklearn_4tree_5_tree_SIZE_t *)__pyx_v_out->data); - /* "sklearn/tree/_tree.pyx":772 + /* "sklearn/tree/_tree.pyx":775 * * # Initialize auxiliary data-structure * cdef Node* node = NULL # <<<<<<<<<<<<<< @@ -8804,7 +8934,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ */ __pyx_v_node = NULL; - /* "sklearn/tree/_tree.pyx":773 + /* "sklearn/tree/_tree.pyx":776 * # Initialize auxiliary data-structure * cdef Node* node = NULL * cdef SIZE_t i = 0 # <<<<<<<<<<<<<< @@ -8813,7 +8943,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ */ __pyx_v_i = 0; - /* "sklearn/tree/_tree.pyx":775 + /* "sklearn/tree/_tree.pyx":778 * cdef SIZE_t i = 0 * * with nogil: # <<<<<<<<<<<<<< @@ -8827,7 +8957,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ #endif /*try:*/ { - /* "sklearn/tree/_tree.pyx":776 + /* "sklearn/tree/_tree.pyx":779 * * with nogil: * for i in range(n_samples): # <<<<<<<<<<<<<< @@ -8838,7 +8968,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { __pyx_v_i = __pyx_t_7; - /* "sklearn/tree/_tree.pyx":777 + /* "sklearn/tree/_tree.pyx":780 * with nogil: * for i in range(n_samples): * node = self.nodes # <<<<<<<<<<<<<< @@ -8848,7 +8978,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ __pyx_t_11 = __pyx_v_self->nodes; __pyx_v_node = __pyx_t_11; - /* "sklearn/tree/_tree.pyx":779 + /* "sklearn/tree/_tree.pyx":782 * node = self.nodes * # While node not a leaf * while node.left_child != _TREE_LEAF: # <<<<<<<<<<<<<< @@ -8859,7 +8989,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ __pyx_t_2 = ((__pyx_v_node->left_child != __pyx_v_7sklearn_4tree_5_tree__TREE_LEAF) != 0); if (!__pyx_t_2) break; - /* "sklearn/tree/_tree.pyx":782 + /* "sklearn/tree/_tree.pyx":785 * # ... and node.right_child != _TREE_LEAF: * if X_ptr[X_sample_stride * i + * X_fx_stride * node.feature] <= node.threshold: # <<<<<<<<<<<<<< @@ -8869,7 +8999,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ __pyx_t_2 = (((__pyx_v_X_ptr[((__pyx_v_X_sample_stride * __pyx_v_i) + (__pyx_v_X_fx_stride * __pyx_v_node->feature))]) <= __pyx_v_node->threshold) != 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":783 + /* "sklearn/tree/_tree.pyx":786 * if X_ptr[X_sample_stride * i + * X_fx_stride * node.feature] <= node.threshold: * node = &self.nodes[node.left_child] # <<<<<<<<<<<<<< @@ -8881,7 +9011,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ } /*else*/ { - /* "sklearn/tree/_tree.pyx":785 + /* "sklearn/tree/_tree.pyx":788 * node = &self.nodes[node.left_child] * else: * node = &self.nodes[node.right_child] # <<<<<<<<<<<<<< @@ -8893,7 +9023,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ __pyx_L12:; } - /* "sklearn/tree/_tree.pyx":787 + /* "sklearn/tree/_tree.pyx":790 * node = &self.nodes[node.right_child] * * out_ptr[i] = (node - self.nodes) # node offset # <<<<<<<<<<<<<< @@ -8904,7 +9034,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ } } - /* "sklearn/tree/_tree.pyx":775 + /* "sklearn/tree/_tree.pyx":778 * cdef SIZE_t i = 0 * * with nogil: # <<<<<<<<<<<<<< @@ -8922,7 +9052,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ } } - /* "sklearn/tree/_tree.pyx":789 + /* "sklearn/tree/_tree.pyx":792 * out_ptr[i] = (node - self.nodes) # node offset * * return out # <<<<<<<<<<<<<< @@ -8934,7 +9064,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ __pyx_r = ((PyArrayObject *)__pyx_v_out); goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":749 + /* "sklearn/tree/_tree.pyx":752 * * * cdef inline np.ndarray _apply_dense(self, object X): # <<<<<<<<<<<<<< @@ -8966,7 +9096,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense(struct __ return __pyx_r; } -/* "sklearn/tree/_tree.pyx":791 +/* "sklearn/tree/_tree.pyx":794 * return out * * cdef inline np.ndarray _apply_sparse_csr(self, object X): # <<<<<<<<<<<<<< @@ -9038,109 +9168,109 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru __pyx_pybuffernd_out.data = NULL; __pyx_pybuffernd_out.rcbuffer = &__pyx_pybuffer_out; - /* "sklearn/tree/_tree.pyx":796 + /* "sklearn/tree/_tree.pyx":799 * """ * # Check input * if not isinstance(X, csr_matrix): # <<<<<<<<<<<<<< * raise ValueError("X should be in csr_matrix format, got %s" * % type(X)) */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_csr_matrix); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_csr_matrix); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_IsInstance(__pyx_v_X, __pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyObject_IsInstance(__pyx_v_X, __pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_3 = ((!(__pyx_t_2 != 0)) != 0); if (__pyx_t_3) { - /* "sklearn/tree/_tree.pyx":798 + /* "sklearn/tree/_tree.pyx":801 * if not isinstance(X, csr_matrix): * raise ValueError("X should be in csr_matrix format, got %s" * % type(X)) # <<<<<<<<<<<<<< * * if X.dtype != DTYPE: */ - __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_X_should_be_in_csr_matrix_format, ((PyObject *)Py_TYPE(__pyx_v_X))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_X_should_be_in_csr_matrix_format, ((PyObject *)Py_TYPE(__pyx_v_X))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - /* "sklearn/tree/_tree.pyx":797 + /* "sklearn/tree/_tree.pyx":800 * # Check input * if not isinstance(X, csr_matrix): * raise ValueError("X should be in csr_matrix format, got %s" # <<<<<<<<<<<<<< * % type(X)) * */ - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":800 + /* "sklearn/tree/_tree.pyx":803 * % type(X)) * * if X.dtype != DTYPE: # <<<<<<<<<<<<<< * raise ValueError("X.dtype should be np.float32, got %s" % X.dtype) * */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyObject_RichCompare(__pyx_t_1, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyObject_RichCompare(__pyx_t_1, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_3) { - /* "sklearn/tree/_tree.pyx":801 + /* "sklearn/tree/_tree.pyx":804 * * if X.dtype != DTYPE: * raise ValueError("X.dtype should be np.float32, got %s" % X.dtype) # <<<<<<<<<<<<<< * * # Extract input */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_X_dtype_should_be_np_float32_got, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_X_dtype_should_be_np_float32_got, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "sklearn/tree/_tree.pyx":804 + /* "sklearn/tree/_tree.pyx":807 * * # Extract input * cdef np.ndarray[ndim=1, dtype=DTYPE_t] X_data_ndarray = X.data # <<<<<<<<<<<<<< * cdef np.ndarray[ndim=1, dtype=INT32_t] X_indices_ndarray = X.indices * cdef np.ndarray[ndim=1, dtype=INT32_t] X_indptr_ndarray = X.indptr */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_data); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_data); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_6 = ((PyArrayObject *)__pyx_t_4); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_data_ndarray.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_X_data_ndarray = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_data_ndarray.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_X_data_ndarray.diminfo[0].strides = __pyx_pybuffernd_X_data_ndarray.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_data_ndarray.diminfo[0].shape = __pyx_pybuffernd_X_data_ndarray.rcbuffer->pybuffer.shape[0]; } } @@ -9148,22 +9278,22 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru __pyx_v_X_data_ndarray = ((PyArrayObject *)__pyx_t_4); __pyx_t_4 = 0; - /* "sklearn/tree/_tree.pyx":805 + /* "sklearn/tree/_tree.pyx":808 * # Extract input * cdef np.ndarray[ndim=1, dtype=DTYPE_t] X_data_ndarray = X.data * cdef np.ndarray[ndim=1, dtype=INT32_t] X_indices_ndarray = X.indices # <<<<<<<<<<<<<< * cdef np.ndarray[ndim=1, dtype=INT32_t] X_indptr_ndarray = X.indptr * */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indices); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indices); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = ((PyArrayObject *)__pyx_t_4); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_indices_ndarray.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_INT32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_X_indices_ndarray = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_indices_ndarray.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_X_indices_ndarray.diminfo[0].strides = __pyx_pybuffernd_X_indices_ndarray.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_indices_ndarray.diminfo[0].shape = __pyx_pybuffernd_X_indices_ndarray.rcbuffer->pybuffer.shape[0]; } } @@ -9171,22 +9301,22 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru __pyx_v_X_indices_ndarray = ((PyArrayObject *)__pyx_t_4); __pyx_t_4 = 0; - /* "sklearn/tree/_tree.pyx":806 + /* "sklearn/tree/_tree.pyx":809 * cdef np.ndarray[ndim=1, dtype=DTYPE_t] X_data_ndarray = X.data * cdef np.ndarray[ndim=1, dtype=INT32_t] X_indices_ndarray = X.indices * cdef np.ndarray[ndim=1, dtype=INT32_t] X_indptr_ndarray = X.indptr # <<<<<<<<<<<<<< * * cdef DTYPE_t* X_data = X_data_ndarray.data */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indptr); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_indptr); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_8 = ((PyArrayObject *)__pyx_t_4); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_indptr_ndarray.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_INT32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_X_indptr_ndarray = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_X_indptr_ndarray.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_X_indptr_ndarray.diminfo[0].strides = __pyx_pybuffernd_X_indptr_ndarray.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_indptr_ndarray.diminfo[0].shape = __pyx_pybuffernd_X_indptr_ndarray.rcbuffer->pybuffer.shape[0]; } } @@ -9194,7 +9324,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru __pyx_v_X_indptr_ndarray = ((PyArrayObject *)__pyx_t_4); __pyx_t_4 = 0; - /* "sklearn/tree/_tree.pyx":808 + /* "sklearn/tree/_tree.pyx":811 * cdef np.ndarray[ndim=1, dtype=INT32_t] X_indptr_ndarray = X.indptr * * cdef DTYPE_t* X_data = X_data_ndarray.data # <<<<<<<<<<<<<< @@ -9203,7 +9333,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ __pyx_v_X_data = ((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *)__pyx_v_X_data_ndarray->data); - /* "sklearn/tree/_tree.pyx":809 + /* "sklearn/tree/_tree.pyx":812 * * cdef DTYPE_t* X_data = X_data_ndarray.data * cdef INT32_t* X_indices = X_indices_ndarray.data # <<<<<<<<<<<<<< @@ -9212,7 +9342,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ __pyx_v_X_indices = ((__pyx_t_7sklearn_4tree_5_tree_INT32_t *)__pyx_v_X_indices_ndarray->data); - /* "sklearn/tree/_tree.pyx":810 + /* "sklearn/tree/_tree.pyx":813 * cdef DTYPE_t* X_data = X_data_ndarray.data * cdef INT32_t* X_indices = X_indices_ndarray.data * cdef INT32_t* X_indptr = X_indptr_ndarray.data # <<<<<<<<<<<<<< @@ -9221,99 +9351,99 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ __pyx_v_X_indptr = ((__pyx_t_7sklearn_4tree_5_tree_INT32_t *)__pyx_v_X_indptr_ndarray->data); - /* "sklearn/tree/_tree.pyx":812 + /* "sklearn/tree/_tree.pyx":815 * cdef INT32_t* X_indptr = X_indptr_ndarray.data * * cdef SIZE_t n_samples = X.shape[0] # <<<<<<<<<<<<<< * cdef SIZE_t n_features = X.shape[1] * */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 812; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 812; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_9 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 812; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_9 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_n_samples = __pyx_t_9; - /* "sklearn/tree/_tree.pyx":813 + /* "sklearn/tree/_tree.pyx":816 * * cdef SIZE_t n_samples = X.shape[0] * cdef SIZE_t n_features = X.shape[1] # <<<<<<<<<<<<<< * * # Initialize output */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_X, __pyx_n_s_shape); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_5, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_5, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_9 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_4); if (unlikely((__pyx_t_9 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_9 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_4); if (unlikely((__pyx_t_9 == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_n_features = __pyx_t_9; - /* "sklearn/tree/_tree.pyx":816 + /* "sklearn/tree/_tree.pyx":819 * * # Initialize output * cdef np.ndarray[SIZE_t, ndim=1] out = np.zeros((n_samples,), # <<<<<<<<<<<<<< * dtype=np.intp) * cdef SIZE_t* out_ptr = out.data */ - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_zeros); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_zeros); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_n_samples); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_n_samples); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - /* "sklearn/tree/_tree.pyx":817 + /* "sklearn/tree/_tree.pyx":820 * # Initialize output * cdef np.ndarray[SIZE_t, ndim=1] out = np.zeros((n_samples,), * dtype=np.intp) # <<<<<<<<<<<<<< * cdef SIZE_t* out_ptr = out.data * */ - __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); - __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_intp); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_intp); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_11) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_11) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - /* "sklearn/tree/_tree.pyx":816 + /* "sklearn/tree/_tree.pyx":819 * * # Initialize output * cdef np.ndarray[SIZE_t, ndim=1] out = np.zeros((n_samples,), # <<<<<<<<<<<<<< * dtype=np.intp) * cdef SIZE_t* out_ptr = out.data */ - __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, __pyx_t_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, __pyx_t_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (!(likely(((__pyx_t_11) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_11, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_11) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_11, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_12 = ((PyArrayObject *)__pyx_t_11); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_out.rcbuffer->pybuffer, (PyObject*)__pyx_t_12, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_SIZE_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_out = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_out.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_out.diminfo[0].strides = __pyx_pybuffernd_out.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_out.diminfo[0].shape = __pyx_pybuffernd_out.rcbuffer->pybuffer.shape[0]; } } @@ -9321,7 +9451,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru __pyx_v_out = ((PyArrayObject *)__pyx_t_11); __pyx_t_11 = 0; - /* "sklearn/tree/_tree.pyx":818 + /* "sklearn/tree/_tree.pyx":821 * cdef np.ndarray[SIZE_t, ndim=1] out = np.zeros((n_samples,), * dtype=np.intp) * cdef SIZE_t* out_ptr = out.data # <<<<<<<<<<<<<< @@ -9330,7 +9460,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ __pyx_v_out_ptr = ((__pyx_t_7sklearn_4tree_5_tree_SIZE_t *)__pyx_v_out->data); - /* "sklearn/tree/_tree.pyx":821 + /* "sklearn/tree/_tree.pyx":824 * * # Initialize auxiliary data-structure * cdef DTYPE_t feature_value = 0. # <<<<<<<<<<<<<< @@ -9339,7 +9469,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ __pyx_v_feature_value = 0.; - /* "sklearn/tree/_tree.pyx":822 + /* "sklearn/tree/_tree.pyx":825 * # Initialize auxiliary data-structure * cdef DTYPE_t feature_value = 0. * cdef Node* node = NULL # <<<<<<<<<<<<<< @@ -9348,7 +9478,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ __pyx_v_node = NULL; - /* "sklearn/tree/_tree.pyx":823 + /* "sklearn/tree/_tree.pyx":826 * cdef DTYPE_t feature_value = 0. * cdef Node* node = NULL * cdef DTYPE_t* X_sample = NULL # <<<<<<<<<<<<<< @@ -9357,7 +9487,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ __pyx_v_X_sample = NULL; - /* "sklearn/tree/_tree.pyx":824 + /* "sklearn/tree/_tree.pyx":827 * cdef Node* node = NULL * cdef DTYPE_t* X_sample = NULL * cdef SIZE_t i = 0 # <<<<<<<<<<<<<< @@ -9366,7 +9496,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ __pyx_v_i = 0; - /* "sklearn/tree/_tree.pyx":825 + /* "sklearn/tree/_tree.pyx":828 * cdef DTYPE_t* X_sample = NULL * cdef SIZE_t i = 0 * cdef INT32_t k = 0 # <<<<<<<<<<<<<< @@ -9375,7 +9505,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ __pyx_v_k = 0; - /* "sklearn/tree/_tree.pyx":830 + /* "sklearn/tree/_tree.pyx":833 * # for each feature; functionally, it is an efficient way to identify * # which features are nonzero in the present sample. * cdef SIZE_t* feature_to_sample = NULL # <<<<<<<<<<<<<< @@ -9384,25 +9514,25 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ __pyx_v_feature_to_sample = NULL; - /* "sklearn/tree/_tree.pyx":832 + /* "sklearn/tree/_tree.pyx":835 * cdef SIZE_t* feature_to_sample = NULL * * safe_realloc(&X_sample, n_features * sizeof(DTYPE_t)) # <<<<<<<<<<<<<< * safe_realloc(&feature_to_sample, n_features * sizeof(SIZE_t)) * */ - __pyx_fuse_0__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_X_sample), (__pyx_v_n_features * (sizeof(__pyx_t_7sklearn_4tree_5_tree_DTYPE_t)))); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_fuse_0__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_X_sample), (__pyx_v_n_features * (sizeof(__pyx_t_7sklearn_4tree_5_tree_DTYPE_t)))); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":833 + /* "sklearn/tree/_tree.pyx":836 * * safe_realloc(&X_sample, n_features * sizeof(DTYPE_t)) * safe_realloc(&feature_to_sample, n_features * sizeof(SIZE_t)) # <<<<<<<<<<<<<< * * with nogil: */ - __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_feature_to_sample), (__pyx_v_n_features * (sizeof(__pyx_t_7sklearn_4tree_5_tree_SIZE_t)))); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_fuse_1__pyx_f_7sklearn_4tree_6_utils_safe_realloc((&__pyx_v_feature_to_sample), (__pyx_v_n_features * (sizeof(__pyx_t_7sklearn_4tree_5_tree_SIZE_t)))); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":835 + /* "sklearn/tree/_tree.pyx":838 * safe_realloc(&feature_to_sample, n_features * sizeof(SIZE_t)) * * with nogil: # <<<<<<<<<<<<<< @@ -9416,7 +9546,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru #endif /*try:*/ { - /* "sklearn/tree/_tree.pyx":836 + /* "sklearn/tree/_tree.pyx":839 * * with nogil: * memset(feature_to_sample, -1, n_features * sizeof(SIZE_t)) # <<<<<<<<<<<<<< @@ -9425,7 +9555,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ memset(__pyx_v_feature_to_sample, -1, (__pyx_v_n_features * (sizeof(__pyx_t_7sklearn_4tree_5_tree_SIZE_t)))); - /* "sklearn/tree/_tree.pyx":838 + /* "sklearn/tree/_tree.pyx":841 * memset(feature_to_sample, -1, n_features * sizeof(SIZE_t)) * * for i in range(n_samples): # <<<<<<<<<<<<<< @@ -9436,7 +9566,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_9; __pyx_t_13+=1) { __pyx_v_i = __pyx_t_13; - /* "sklearn/tree/_tree.pyx":839 + /* "sklearn/tree/_tree.pyx":842 * * for i in range(n_samples): * node = self.nodes # <<<<<<<<<<<<<< @@ -9446,7 +9576,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru __pyx_t_14 = __pyx_v_self->nodes; __pyx_v_node = __pyx_t_14; - /* "sklearn/tree/_tree.pyx":841 + /* "sklearn/tree/_tree.pyx":844 * node = self.nodes * * for k in range(X_indptr[i], X_indptr[i + 1]): # <<<<<<<<<<<<<< @@ -9457,7 +9587,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru for (__pyx_t_16 = (__pyx_v_X_indptr[__pyx_v_i]); __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { __pyx_v_k = __pyx_t_16; - /* "sklearn/tree/_tree.pyx":842 + /* "sklearn/tree/_tree.pyx":845 * * for k in range(X_indptr[i], X_indptr[i + 1]): * feature_to_sample[X_indices[k]] = i # <<<<<<<<<<<<<< @@ -9466,7 +9596,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ (__pyx_v_feature_to_sample[(__pyx_v_X_indices[__pyx_v_k])]) = __pyx_v_i; - /* "sklearn/tree/_tree.pyx":843 + /* "sklearn/tree/_tree.pyx":846 * for k in range(X_indptr[i], X_indptr[i + 1]): * feature_to_sample[X_indices[k]] = i * X_sample[X_indices[k]] = X_data[k] # <<<<<<<<<<<<<< @@ -9476,7 +9606,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru (__pyx_v_X_sample[(__pyx_v_X_indices[__pyx_v_k])]) = (__pyx_v_X_data[__pyx_v_k]); } - /* "sklearn/tree/_tree.pyx":846 + /* "sklearn/tree/_tree.pyx":849 * * # While node not a leaf * while node.left_child != _TREE_LEAF: # <<<<<<<<<<<<<< @@ -9487,7 +9617,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru __pyx_t_3 = ((__pyx_v_node->left_child != __pyx_v_7sklearn_4tree_5_tree__TREE_LEAF) != 0); if (!__pyx_t_3) break; - /* "sklearn/tree/_tree.pyx":848 + /* "sklearn/tree/_tree.pyx":851 * while node.left_child != _TREE_LEAF: * # ... and node.right_child != _TREE_LEAF: * if feature_to_sample[node.feature] == i: # <<<<<<<<<<<<<< @@ -9497,7 +9627,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru __pyx_t_3 = (((__pyx_v_feature_to_sample[__pyx_v_node->feature]) == __pyx_v_i) != 0); if (__pyx_t_3) { - /* "sklearn/tree/_tree.pyx":849 + /* "sklearn/tree/_tree.pyx":852 * # ... and node.right_child != _TREE_LEAF: * if feature_to_sample[node.feature] == i: * feature_value = X_sample[node.feature] # <<<<<<<<<<<<<< @@ -9509,7 +9639,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru } /*else*/ { - /* "sklearn/tree/_tree.pyx":852 + /* "sklearn/tree/_tree.pyx":855 * * else: * feature_value = 0. # <<<<<<<<<<<<<< @@ -9520,7 +9650,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru } __pyx_L14:; - /* "sklearn/tree/_tree.pyx":854 + /* "sklearn/tree/_tree.pyx":857 * feature_value = 0. * * if feature_value <= node.threshold: # <<<<<<<<<<<<<< @@ -9530,7 +9660,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru __pyx_t_3 = ((__pyx_v_feature_value <= __pyx_v_node->threshold) != 0); if (__pyx_t_3) { - /* "sklearn/tree/_tree.pyx":855 + /* "sklearn/tree/_tree.pyx":858 * * if feature_value <= node.threshold: * node = &self.nodes[node.left_child] # <<<<<<<<<<<<<< @@ -9542,7 +9672,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru } /*else*/ { - /* "sklearn/tree/_tree.pyx":857 + /* "sklearn/tree/_tree.pyx":860 * node = &self.nodes[node.left_child] * else: * node = &self.nodes[node.right_child] # <<<<<<<<<<<<<< @@ -9554,7 +9684,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru __pyx_L15:; } - /* "sklearn/tree/_tree.pyx":859 + /* "sklearn/tree/_tree.pyx":862 * node = &self.nodes[node.right_child] * * out_ptr[i] = (node - self.nodes) # node offset # <<<<<<<<<<<<<< @@ -9564,7 +9694,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru (__pyx_v_out_ptr[__pyx_v_i]) = ((__pyx_t_7sklearn_4tree_5_tree_SIZE_t)(__pyx_v_node - __pyx_v_self->nodes)); } - /* "sklearn/tree/_tree.pyx":862 + /* "sklearn/tree/_tree.pyx":865 * * # Free auxiliary arrays * free(X_sample) # <<<<<<<<<<<<<< @@ -9573,7 +9703,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru */ free(__pyx_v_X_sample); - /* "sklearn/tree/_tree.pyx":863 + /* "sklearn/tree/_tree.pyx":866 * # Free auxiliary arrays * free(X_sample) * free(feature_to_sample) # <<<<<<<<<<<<<< @@ -9583,7 +9713,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru free(__pyx_v_feature_to_sample); } - /* "sklearn/tree/_tree.pyx":835 + /* "sklearn/tree/_tree.pyx":838 * safe_realloc(&feature_to_sample, n_features * sizeof(SIZE_t)) * * with nogil: # <<<<<<<<<<<<<< @@ -9601,7 +9731,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru } } - /* "sklearn/tree/_tree.pyx":865 + /* "sklearn/tree/_tree.pyx":868 * free(feature_to_sample) * * return out # <<<<<<<<<<<<<< @@ -9613,7 +9743,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru __pyx_r = ((PyArrayObject *)__pyx_v_out); goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":791 + /* "sklearn/tree/_tree.pyx":794 * return out * * cdef inline np.ndarray _apply_sparse_csr(self, object X): # <<<<<<<<<<<<<< @@ -9653,7 +9783,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr(stru return __pyx_r; } -/* "sklearn/tree/_tree.pyx":867 +/* "sklearn/tree/_tree.pyx":870 * return out * * cpdef compute_feature_importances(self, normalize=True): # <<<<<<<<<<<<<< @@ -9707,7 +9837,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances if (unlikely(__pyx_skip_dispatch)) ; /* Check if overridden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_compute_feature_importances); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_compute_feature_importances); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_4Tree_15compute_feature_importances)) { __Pyx_XDECREF(__pyx_r); @@ -9723,16 +9853,16 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances } } if (!__pyx_t_4) { - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_normalize); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_normalize); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); } else { - __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL; __Pyx_INCREF(__pyx_v_normalize); __Pyx_GIVEREF(__pyx_v_normalize); PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_v_normalize); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } @@ -9745,7 +9875,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } - /* "sklearn/tree/_tree.pyx":871 + /* "sklearn/tree/_tree.pyx":874 * cdef Node* left * cdef Node* right * cdef Node* nodes = self.nodes # <<<<<<<<<<<<<< @@ -9755,7 +9885,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances __pyx_t_6 = __pyx_v_self->nodes; __pyx_v_nodes = __pyx_t_6; - /* "sklearn/tree/_tree.pyx":872 + /* "sklearn/tree/_tree.pyx":875 * cdef Node* right * cdef Node* nodes = self.nodes * cdef Node* node = nodes # <<<<<<<<<<<<<< @@ -9764,7 +9894,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances */ __pyx_v_node = __pyx_v_nodes; - /* "sklearn/tree/_tree.pyx":873 + /* "sklearn/tree/_tree.pyx":876 * cdef Node* nodes = self.nodes * cdef Node* node = nodes * cdef Node* end_node = node + self.node_count # <<<<<<<<<<<<<< @@ -9773,7 +9903,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances */ __pyx_v_end_node = (__pyx_v_node + __pyx_v_self->node_count); - /* "sklearn/tree/_tree.pyx":875 + /* "sklearn/tree/_tree.pyx":878 * cdef Node* end_node = node + self.node_count * * cdef double normalizer = 0. # <<<<<<<<<<<<<< @@ -9782,21 +9912,21 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances */ __pyx_v_normalizer = 0.; - /* "sklearn/tree/_tree.pyx":878 + /* "sklearn/tree/_tree.pyx":881 * * cdef np.ndarray[np.float64_t, ndim=1] importances * importances = np.zeros((self.n_features,)) # <<<<<<<<<<<<<< * cdef DOUBLE_t* importance_data = importances.data * */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->n_features); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_self->n_features); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); @@ -9812,22 +9942,22 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances } } if (!__pyx_t_2) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GOTREF(__pyx_t_1); } else { - __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __pyx_t_2 = NULL; __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_t_5); __pyx_t_5 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = ((PyArrayObject *)__pyx_t_1); { __Pyx_BufFmt_StackElem __pyx_stack[1]; @@ -9843,13 +9973,13 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances } } __pyx_pybuffernd_importances.diminfo[0].strides = __pyx_pybuffernd_importances.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_importances.diminfo[0].shape = __pyx_pybuffernd_importances.rcbuffer->pybuffer.shape[0]; - if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_7 = 0; __pyx_v_importances = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":879 + /* "sklearn/tree/_tree.pyx":882 * cdef np.ndarray[np.float64_t, ndim=1] importances * importances = np.zeros((self.n_features,)) * cdef DOUBLE_t* importance_data = importances.data # <<<<<<<<<<<<<< @@ -9858,7 +9988,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances */ __pyx_v_importance_data = ((__pyx_t_7sklearn_4tree_5_tree_DOUBLE_t *)__pyx_v_importances->data); - /* "sklearn/tree/_tree.pyx":881 + /* "sklearn/tree/_tree.pyx":884 * cdef DOUBLE_t* importance_data = importances.data * * with nogil: # <<<<<<<<<<<<<< @@ -9872,7 +10002,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances #endif /*try:*/ { - /* "sklearn/tree/_tree.pyx":882 + /* "sklearn/tree/_tree.pyx":885 * * with nogil: * while node != end_node: # <<<<<<<<<<<<<< @@ -9883,7 +10013,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances __pyx_t_12 = ((__pyx_v_node != __pyx_v_end_node) != 0); if (!__pyx_t_12) break; - /* "sklearn/tree/_tree.pyx":883 + /* "sklearn/tree/_tree.pyx":886 * with nogil: * while node != end_node: * if node.left_child != _TREE_LEAF: # <<<<<<<<<<<<<< @@ -9893,7 +10023,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances __pyx_t_12 = ((__pyx_v_node->left_child != __pyx_v_7sklearn_4tree_5_tree__TREE_LEAF) != 0); if (__pyx_t_12) { - /* "sklearn/tree/_tree.pyx":885 + /* "sklearn/tree/_tree.pyx":888 * if node.left_child != _TREE_LEAF: * # ... and node.right_child != _TREE_LEAF: * left = &nodes[node.left_child] # <<<<<<<<<<<<<< @@ -9902,7 +10032,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances */ __pyx_v_left = (&(__pyx_v_nodes[__pyx_v_node->left_child])); - /* "sklearn/tree/_tree.pyx":886 + /* "sklearn/tree/_tree.pyx":889 * # ... and node.right_child != _TREE_LEAF: * left = &nodes[node.left_child] * right = &nodes[node.right_child] # <<<<<<<<<<<<<< @@ -9911,7 +10041,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances */ __pyx_v_right = (&(__pyx_v_nodes[__pyx_v_node->right_child])); - /* "sklearn/tree/_tree.pyx":888 + /* "sklearn/tree/_tree.pyx":891 * right = &nodes[node.right_child] * * importance_data[node.feature] += ( # <<<<<<<<<<<<<< @@ -9920,7 +10050,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances */ __pyx_t_13 = __pyx_v_node->feature; - /* "sklearn/tree/_tree.pyx":890 + /* "sklearn/tree/_tree.pyx":893 * importance_data[node.feature] += ( * node.weighted_n_node_samples * node.impurity - * left.weighted_n_node_samples * left.impurity - # <<<<<<<<<<<<<< @@ -9932,7 +10062,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances } __pyx_L8:; - /* "sklearn/tree/_tree.pyx":892 + /* "sklearn/tree/_tree.pyx":895 * left.weighted_n_node_samples * left.impurity - * right.weighted_n_node_samples * right.impurity) * node += 1 # <<<<<<<<<<<<<< @@ -9943,7 +10073,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances } } - /* "sklearn/tree/_tree.pyx":881 + /* "sklearn/tree/_tree.pyx":884 * cdef DOUBLE_t* importance_data = importances.data * * with nogil: # <<<<<<<<<<<<<< @@ -9961,19 +10091,19 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances } } - /* "sklearn/tree/_tree.pyx":894 + /* "sklearn/tree/_tree.pyx":897 * node += 1 * * importances /= nodes[0].weighted_n_node_samples # <<<<<<<<<<<<<< * * if normalize: */ - __pyx_t_1 = PyFloat_FromDouble((__pyx_v_nodes[0]).weighted_n_node_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyFloat_FromDouble((__pyx_v_nodes[0]).weighted_n_node_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyNumber_InPlaceDivide(((PyObject *)__pyx_v_importances), __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyNumber_InPlaceDivide(((PyObject *)__pyx_v_importances), __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = ((PyArrayObject *)__pyx_t_3); { __Pyx_BufFmt_StackElem __pyx_stack[1]; @@ -9989,32 +10119,32 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances } } __pyx_pybuffernd_importances.diminfo[0].strides = __pyx_pybuffernd_importances.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_importances.diminfo[0].shape = __pyx_pybuffernd_importances.rcbuffer->pybuffer.shape[0]; - if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_7 = 0; __Pyx_DECREF_SET(__pyx_v_importances, ((PyArrayObject *)__pyx_t_3)); __pyx_t_3 = 0; - /* "sklearn/tree/_tree.pyx":896 + /* "sklearn/tree/_tree.pyx":899 * importances /= nodes[0].weighted_n_node_samples * * if normalize: # <<<<<<<<<<<<<< * normalizer = np.sum(importances) * */ - __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_v_normalize); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_v_normalize); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 899; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__pyx_t_12) { - /* "sklearn/tree/_tree.pyx":897 + /* "sklearn/tree/_tree.pyx":900 * * if normalize: * normalizer = np.sum(importances) # <<<<<<<<<<<<<< * * if normalizer > 0.0: */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sum); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sum); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = NULL; @@ -10028,25 +10158,25 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances } } if (!__pyx_t_1) { - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, ((PyObject *)__pyx_v_importances)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, ((PyObject *)__pyx_v_importances)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); } else { - __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); __pyx_t_1 = NULL; __Pyx_INCREF(((PyObject *)__pyx_v_importances)); __Pyx_GIVEREF(((PyObject *)__pyx_v_importances)); PyTuple_SET_ITEM(__pyx_t_5, 0+1, ((PyObject *)__pyx_v_importances)); - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_normalizer = __pyx_t_14; - /* "sklearn/tree/_tree.pyx":899 + /* "sklearn/tree/_tree.pyx":902 * normalizer = np.sum(importances) * * if normalizer > 0.0: # <<<<<<<<<<<<<< @@ -10056,19 +10186,19 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances __pyx_t_12 = ((__pyx_v_normalizer > 0.0) != 0); if (__pyx_t_12) { - /* "sklearn/tree/_tree.pyx":901 + /* "sklearn/tree/_tree.pyx":904 * if normalizer > 0.0: * # Avoid dividing by zero (e.g., when root is pure) * importances /= normalizer # <<<<<<<<<<<<<< * * return importances */ - __pyx_t_3 = PyFloat_FromDouble(__pyx_v_normalizer); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 901; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_normalizer); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyNumber_InPlaceDivide(((PyObject *)__pyx_v_importances), __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 901; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __Pyx_PyNumber_InPlaceDivide(((PyObject *)__pyx_v_importances), __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 901; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = ((PyArrayObject *)__pyx_t_4); { __Pyx_BufFmt_StackElem __pyx_stack[1]; @@ -10084,7 +10214,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances } } __pyx_pybuffernd_importances.diminfo[0].strides = __pyx_pybuffernd_importances.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_importances.diminfo[0].shape = __pyx_pybuffernd_importances.rcbuffer->pybuffer.shape[0]; - if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 901; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_7 = 0; __Pyx_DECREF_SET(__pyx_v_importances, ((PyArrayObject *)__pyx_t_4)); @@ -10096,7 +10226,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances } __pyx_L9:; - /* "sklearn/tree/_tree.pyx":903 + /* "sklearn/tree/_tree.pyx":906 * importances /= normalizer * * return importances # <<<<<<<<<<<<<< @@ -10108,7 +10238,7 @@ static PyObject *__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances __pyx_r = ((PyObject *)__pyx_v_importances); goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":867 + /* "sklearn/tree/_tree.pyx":870 * return out * * cpdef compute_feature_importances(self, normalize=True): # <<<<<<<<<<<<<< @@ -10171,7 +10301,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_4Tree_15compute_feature_importan } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "compute_feature_importances") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "compute_feature_importances") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -10184,7 +10314,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_4Tree_15compute_feature_importan } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("compute_feature_importances", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("compute_feature_importances", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree.Tree.compute_feature_importances", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -10209,7 +10339,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_14compute_feature_importan __Pyx_XDECREF(__pyx_r); __pyx_t_2.__pyx_n = 1; __pyx_t_2.normalize = __pyx_v_normalize; - __pyx_t_1 = __pyx_vtabptr_7sklearn_4tree_5_tree_Tree->compute_feature_importances(__pyx_v_self, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __pyx_vtabptr_7sklearn_4tree_5_tree_Tree->compute_feature_importances(__pyx_v_self, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -10226,7 +10356,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4Tree_14compute_feature_importan return __pyx_r; } -/* "sklearn/tree/_tree.pyx":905 +/* "sklearn/tree/_tree.pyx":908 * return importances * * cdef np.ndarray _get_value_ndarray(self): # <<<<<<<<<<<<<< @@ -10245,7 +10375,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_value_ndarray(str int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_get_value_ndarray", 0); - /* "sklearn/tree/_tree.pyx":912 + /* "sklearn/tree/_tree.pyx":915 * """ * cdef np.npy_intp shape[3] * shape[0] = self.node_count # <<<<<<<<<<<<<< @@ -10254,7 +10384,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_value_ndarray(str */ (__pyx_v_shape[0]) = ((npy_intp)__pyx_v_self->node_count); - /* "sklearn/tree/_tree.pyx":913 + /* "sklearn/tree/_tree.pyx":916 * cdef np.npy_intp shape[3] * shape[0] = self.node_count * shape[1] = self.n_outputs # <<<<<<<<<<<<<< @@ -10263,7 +10393,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_value_ndarray(str */ (__pyx_v_shape[1]) = ((npy_intp)__pyx_v_self->n_outputs); - /* "sklearn/tree/_tree.pyx":914 + /* "sklearn/tree/_tree.pyx":917 * shape[0] = self.node_count * shape[1] = self.n_outputs * shape[2] = self.max_n_classes # <<<<<<<<<<<<<< @@ -10272,20 +10402,20 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_value_ndarray(str */ (__pyx_v_shape[2]) = ((npy_intp)__pyx_v_self->max_n_classes); - /* "sklearn/tree/_tree.pyx":916 + /* "sklearn/tree/_tree.pyx":919 * shape[2] = self.max_n_classes * cdef np.ndarray arr * arr = np.PyArray_SimpleNewFromData(3, shape, np.NPY_DOUBLE, self.value) # <<<<<<<<<<<<<< * Py_INCREF(self) * arr.base = self */ - __pyx_t_1 = PyArray_SimpleNewFromData(3, __pyx_v_shape, NPY_DOUBLE, __pyx_v_self->value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 916; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyArray_SimpleNewFromData(3, __pyx_v_shape, NPY_DOUBLE, __pyx_v_self->value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 916; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_arr = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":917 + /* "sklearn/tree/_tree.pyx":920 * cdef np.ndarray arr * arr = np.PyArray_SimpleNewFromData(3, shape, np.NPY_DOUBLE, self.value) * Py_INCREF(self) # <<<<<<<<<<<<<< @@ -10294,7 +10424,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_value_ndarray(str */ Py_INCREF(((PyObject *)__pyx_v_self)); - /* "sklearn/tree/_tree.pyx":918 + /* "sklearn/tree/_tree.pyx":921 * arr = np.PyArray_SimpleNewFromData(3, shape, np.NPY_DOUBLE, self.value) * Py_INCREF(self) * arr.base = self # <<<<<<<<<<<<<< @@ -10303,7 +10433,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_value_ndarray(str */ __pyx_v_arr->base = ((PyObject *)__pyx_v_self); - /* "sklearn/tree/_tree.pyx":919 + /* "sklearn/tree/_tree.pyx":922 * Py_INCREF(self) * arr.base = self * return arr # <<<<<<<<<<<<<< @@ -10315,7 +10445,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_value_ndarray(str __pyx_r = __pyx_v_arr; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":905 + /* "sklearn/tree/_tree.pyx":908 * return importances * * cdef np.ndarray _get_value_ndarray(self): # <<<<<<<<<<<<<< @@ -10335,7 +10465,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_value_ndarray(str return __pyx_r; } -/* "sklearn/tree/_tree.pyx":921 +/* "sklearn/tree/_tree.pyx":924 * return arr * * cdef np.ndarray _get_node_ndarray(self): # <<<<<<<<<<<<<< @@ -10356,7 +10486,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_node_ndarray(stru int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_get_node_ndarray", 0); - /* "sklearn/tree/_tree.pyx":929 + /* "sklearn/tree/_tree.pyx":932 * """ * cdef np.npy_intp shape[1] * shape[0] = self.node_count # <<<<<<<<<<<<<< @@ -10365,7 +10495,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_node_ndarray(stru */ (__pyx_v_shape[0]) = ((npy_intp)__pyx_v_self->node_count); - /* "sklearn/tree/_tree.pyx":931 + /* "sklearn/tree/_tree.pyx":934 * shape[0] = self.node_count * cdef np.npy_intp strides[1] * strides[0] = sizeof(Node) # <<<<<<<<<<<<<< @@ -10374,51 +10504,51 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_node_ndarray(stru */ (__pyx_v_strides[0]) = (sizeof(struct __pyx_t_7sklearn_4tree_5_tree_Node)); - /* "sklearn/tree/_tree.pyx":933 + /* "sklearn/tree/_tree.pyx":936 * strides[0] = sizeof(Node) * cdef np.ndarray arr * Py_INCREF(NODE_DTYPE) # <<<<<<<<<<<<<< * arr = PyArray_NewFromDescr(np.ndarray, NODE_DTYPE, 1, shape, * strides, self.nodes, */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_NODE_DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_NODE_DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 936; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); Py_INCREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":934 + /* "sklearn/tree/_tree.pyx":937 * cdef np.ndarray arr * Py_INCREF(NODE_DTYPE) * arr = PyArray_NewFromDescr(np.ndarray, NODE_DTYPE, 1, shape, # <<<<<<<<<<<<<< * strides, self.nodes, * np.NPY_DEFAULT, None) */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_NODE_DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_NODE_DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - /* "sklearn/tree/_tree.pyx":936 + /* "sklearn/tree/_tree.pyx":939 * arr = PyArray_NewFromDescr(np.ndarray, NODE_DTYPE, 1, shape, * strides, self.nodes, * np.NPY_DEFAULT, None) # <<<<<<<<<<<<<< * Py_INCREF(self) * arr.base = self */ - __pyx_t_2 = PyArray_NewFromDescr(((PyObject *)((PyObject*)__pyx_ptype_5numpy_ndarray)), ((PyArray_Descr *)__pyx_t_1), 1, __pyx_v_shape, __pyx_v_strides, ((void *)__pyx_v_self->nodes), NPY_DEFAULT, Py_None); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyArray_NewFromDescr(((PyObject *)((PyObject*)__pyx_ptype_5numpy_ndarray)), ((PyArray_Descr *)__pyx_t_1), 1, __pyx_v_shape, __pyx_v_strides, ((void *)__pyx_v_self->nodes), NPY_DEFAULT, Py_None); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":934 + /* "sklearn/tree/_tree.pyx":937 * cdef np.ndarray arr * Py_INCREF(NODE_DTYPE) * arr = PyArray_NewFromDescr(np.ndarray, NODE_DTYPE, 1, shape, # <<<<<<<<<<<<<< * strides, self.nodes, * np.NPY_DEFAULT, None) */ - if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_arr = ((PyArrayObject *)__pyx_t_2); __pyx_t_2 = 0; - /* "sklearn/tree/_tree.pyx":937 + /* "sklearn/tree/_tree.pyx":940 * strides, self.nodes, * np.NPY_DEFAULT, None) * Py_INCREF(self) # <<<<<<<<<<<<<< @@ -10427,7 +10557,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_node_ndarray(stru */ Py_INCREF(((PyObject *)__pyx_v_self)); - /* "sklearn/tree/_tree.pyx":938 + /* "sklearn/tree/_tree.pyx":941 * np.NPY_DEFAULT, None) * Py_INCREF(self) * arr.base = self # <<<<<<<<<<<<<< @@ -10435,7 +10565,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_node_ndarray(stru */ __pyx_v_arr->base = ((PyObject *)__pyx_v_self); - /* "sklearn/tree/_tree.pyx":939 + /* "sklearn/tree/_tree.pyx":942 * Py_INCREF(self) * arr.base = self * return arr # <<<<<<<<<<<<<< @@ -10445,7 +10575,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_4Tree__get_node_ndarray(stru __pyx_r = __pyx_v_arr; goto __pyx_L0; - /* "sklearn/tree/_tree.pyx":921 + /* "sklearn/tree/_tree.pyx":924 * return arr * * cdef np.ndarray _get_node_ndarray(self): # <<<<<<<<<<<<<< @@ -13499,6 +13629,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1}, {&__pyx_kp_s_X_dtype_should_be_np_float32_got, __pyx_k_X_dtype_should_be_np_float32_got, sizeof(__pyx_k_X_dtype_should_be_np_float32_got), 0, 0, 1, 0}, + {&__pyx_n_s_X_idx_sorted, __pyx_k_X_idx_sorted, sizeof(__pyx_k_X_idx_sorted), 0, 0, 1, 1}, {&__pyx_kp_s_X_should_be_in_csr_matrix_format, __pyx_k_X_should_be_in_csr_matrix_format, sizeof(__pyx_k_X_should_be_in_csr_matrix_format), 0, 0, 1, 0}, {&__pyx_kp_s_X_should_be_in_np_ndarray_format, __pyx_k_X_should_be_in_np_ndarray_format, sizeof(__pyx_k_X_should_be_in_np_ndarray_format), 0, 0, 1, 0}, {&__pyx_kp_s_You_have_loaded_Tree_version_whi, __pyx_k_You_have_loaded_Tree_version_whi, sizeof(__pyx_k_You_have_loaded_Tree_version_whi), 0, 0, 1, 0}, @@ -13582,9 +13713,9 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 589; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; @@ -13595,36 +13726,36 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - /* "sklearn/tree/_tree.pyx":108 + /* "sklearn/tree/_tree.pyx":109 * * if X.indices.dtype != np.int32 or X.indptr.dtype != np.int32: * raise ValueError("No support for np.int64 index based " # <<<<<<<<<<<<<< * "sparse matrices") * */ - __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_No_support_for_np_int64_index_ba); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_No_support_for_np_int64_index_ba); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); - /* "sklearn/tree/_tree.pyx":625 + /* "sklearn/tree/_tree.pyx":628 * * if 'nodes' not in d: * raise ValueError('You have loaded Tree version which ' # <<<<<<<<<<<<<< * 'cannot be imported') * */ - __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_You_have_loaded_Tree_version_whi); if (unlikely(!__pyx_tuple__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_You_have_loaded_Tree_version_whi); if (unlikely(!__pyx_tuple__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); - /* "sklearn/tree/_tree.pyx":639 + /* "sklearn/tree/_tree.pyx":642 * not value_ndarray.flags.c_contiguous or * value_ndarray.dtype != np.float64): * raise ValueError('Did not recognise loaded array layout') # <<<<<<<<<<<<<< * * self.capacity = node_ndarray.shape[0] */ - __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_Did_not_recognise_loaded_array_l); if (unlikely(!__pyx_tuple__3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_Did_not_recognise_loaded_array_l); if (unlikely(!__pyx_tuple__3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 642; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); @@ -13813,10 +13944,10 @@ PyMODINIT_FUNC PyInit__tree(void) __pyx_vtable_7sklearn_4tree_5_tree_Tree._apply_dense = (PyArrayObject *(*)(struct __pyx_obj_7sklearn_4tree_5_tree_Tree *, PyObject *))__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_dense; __pyx_vtable_7sklearn_4tree_5_tree_Tree._apply_sparse_csr = (PyArrayObject *(*)(struct __pyx_obj_7sklearn_4tree_5_tree_Tree *, PyObject *))__pyx_f_7sklearn_4tree_5_tree_4Tree__apply_sparse_csr; __pyx_vtable_7sklearn_4tree_5_tree_Tree.compute_feature_importances = (PyObject *(*)(struct __pyx_obj_7sklearn_4tree_5_tree_Tree *, int __pyx_skip_dispatch, struct __pyx_opt_args_7sklearn_4tree_5_tree_4Tree_compute_feature_importances *__pyx_optional_args))__pyx_f_7sklearn_4tree_5_tree_4Tree_compute_feature_importances; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_Tree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_Tree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_type_7sklearn_4tree_5_tree_Tree.tp_print = 0; - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_Tree.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_Tree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyObject_SetAttrString(__pyx_m, "Tree", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_Tree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_Tree.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_Tree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyObject_SetAttrString(__pyx_m, "Tree", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_Tree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_5_tree_Tree = &__pyx_type_7sklearn_4tree_5_tree_Tree; __pyx_vtabptr_7sklearn_4tree_5_tree_TreeBuilder = &__pyx_vtable_7sklearn_4tree_5_tree_TreeBuilder; __pyx_vtable_7sklearn_4tree_5_tree_TreeBuilder.build = (PyObject *(*)(struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *, PyObject *, PyArrayObject *, int __pyx_skip_dispatch, struct __pyx_opt_args_7sklearn_4tree_5_tree_11TreeBuilder_build *__pyx_optional_args))__pyx_f_7sklearn_4tree_5_tree_11TreeBuilder_build; @@ -13830,20 +13961,20 @@ PyMODINIT_FUNC PyInit__tree(void) __pyx_vtable_7sklearn_4tree_5_tree_DepthFirstTreeBuilder.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_5_tree_TreeBuilder; __pyx_vtable_7sklearn_4tree_5_tree_DepthFirstTreeBuilder.__pyx_base.build = (PyObject *(*)(struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *, PyObject *, PyArrayObject *, int __pyx_skip_dispatch, struct __pyx_opt_args_7sklearn_4tree_5_tree_11TreeBuilder_build *__pyx_optional_args))__pyx_f_7sklearn_4tree_5_tree_21DepthFirstTreeBuilder_build; __pyx_type_7sklearn_4tree_5_tree_DepthFirstTreeBuilder.tp_base = __pyx_ptype_7sklearn_4tree_5_tree_TreeBuilder; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_DepthFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_DepthFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_type_7sklearn_4tree_5_tree_DepthFirstTreeBuilder.tp_print = 0; - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_DepthFirstTreeBuilder.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_DepthFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyObject_SetAttrString(__pyx_m, "DepthFirstTreeBuilder", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_DepthFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_DepthFirstTreeBuilder.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_DepthFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyObject_SetAttrString(__pyx_m, "DepthFirstTreeBuilder", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_DepthFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_5_tree_DepthFirstTreeBuilder = &__pyx_type_7sklearn_4tree_5_tree_DepthFirstTreeBuilder; __pyx_vtabptr_7sklearn_4tree_5_tree_BestFirstTreeBuilder = &__pyx_vtable_7sklearn_4tree_5_tree_BestFirstTreeBuilder; __pyx_vtable_7sklearn_4tree_5_tree_BestFirstTreeBuilder.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_5_tree_TreeBuilder; __pyx_vtable_7sklearn_4tree_5_tree_BestFirstTreeBuilder.__pyx_base.build = (PyObject *(*)(struct __pyx_obj_7sklearn_4tree_5_tree_TreeBuilder *, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *, PyObject *, PyArrayObject *, int __pyx_skip_dispatch, struct __pyx_opt_args_7sklearn_4tree_5_tree_11TreeBuilder_build *__pyx_optional_args))__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder_build; __pyx_vtable_7sklearn_4tree_5_tree_BestFirstTreeBuilder._add_split_node = (int (*)(struct __pyx_obj_7sklearn_4tree_5_tree_BestFirstTreeBuilder *, struct __pyx_obj_7sklearn_4tree_9_splitter_Splitter *, struct __pyx_obj_7sklearn_4tree_5_tree_Tree *, __pyx_t_7sklearn_4tree_5_tree_SIZE_t, __pyx_t_7sklearn_4tree_5_tree_SIZE_t, double, int, int, struct __pyx_t_7sklearn_4tree_5_tree_Node *, __pyx_t_7sklearn_4tree_5_tree_SIZE_t, struct __pyx_t_7sklearn_4tree_6_utils_PriorityHeapRecord *))__pyx_f_7sklearn_4tree_5_tree_20BestFirstTreeBuilder__add_split_node; __pyx_type_7sklearn_4tree_5_tree_BestFirstTreeBuilder.tp_base = __pyx_ptype_7sklearn_4tree_5_tree_TreeBuilder; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_BestFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_BestFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_type_7sklearn_4tree_5_tree_BestFirstTreeBuilder.tp_print = 0; - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_BestFirstTreeBuilder.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_BestFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (PyObject_SetAttrString(__pyx_m, "BestFirstTreeBuilder", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_BestFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_BestFirstTreeBuilder.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_BestFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyObject_SetAttrString(__pyx_m, "BestFirstTreeBuilder", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_BestFirstTreeBuilder) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_5_tree_BestFirstTreeBuilder = &__pyx_type_7sklearn_4tree_5_tree_BestFirstTreeBuilder; /*--- Type import code ---*/ __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", @@ -14366,7 +14497,7 @@ PyMODINIT_FUNC PyInit__tree(void) if (PyDict_SetItem(__pyx_d, __pyx_n_s_NODE_DTYPE, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "sklearn/tree/_tree.pyx":657 + /* "sklearn/tree/_tree.pyx":660 * # XXX using (size_t)(-1) is ugly, but SIZE_MAX is not available in C89 * # (i.e., older MSVC). * cdef int _resize_c(self, SIZE_t capacity=(-1)) nogil: # <<<<<<<<<<<<<< diff --git a/sklearn/tree/_tree.pxd b/sklearn/tree/_tree.pxd index 34baa0f437248..0390e3f5b4655 100644 --- a/sklearn/tree/_tree.pxd +++ b/sklearn/tree/_tree.pxd @@ -92,5 +92,6 @@ cdef class TreeBuilder: cdef SIZE_t max_depth # Maximal tree depth cpdef build(self, Tree tree, object X, np.ndarray y, - np.ndarray sample_weight=*) + np.ndarray sample_weight=*, + np.ndarray X_idx_sorted=*) cdef _check_input(self, object X, np.ndarray y, np.ndarray sample_weight) diff --git a/sklearn/tree/_tree.pyx b/sklearn/tree/_tree.pyx index 4eaebe41efab1..12b9262ee7e68 100644 --- a/sklearn/tree/_tree.pyx +++ b/sklearn/tree/_tree.pyx @@ -90,7 +90,8 @@ cdef class TreeBuilder: """Interface for different tree building strategies.""" cpdef build(self, Tree tree, object X, np.ndarray y, - np.ndarray sample_weight=None): + np.ndarray sample_weight=None, + np.ndarray X_idx_sorted=None): """Build a decision tree from the training set (X, y).""" pass @@ -138,7 +139,8 @@ cdef class DepthFirstTreeBuilder(TreeBuilder): self.max_depth = max_depth cpdef build(self, Tree tree, object X, np.ndarray y, - np.ndarray sample_weight=None): + np.ndarray sample_weight=None, + np.ndarray X_idx_sorted=None): """Build a decision tree from the training set (X, y).""" # check input @@ -166,7 +168,7 @@ cdef class DepthFirstTreeBuilder(TreeBuilder): cdef SIZE_t min_samples_split = self.min_samples_split # Recursive partition (without actual recursion) - splitter.init(X, y, sample_weight_ptr) + splitter.init(X, y, sample_weight_ptr, X_idx_sorted) cdef SIZE_t start cdef SIZE_t end @@ -295,7 +297,8 @@ cdef class BestFirstTreeBuilder(TreeBuilder): self.max_leaf_nodes = max_leaf_nodes cpdef build(self, Tree tree, object X, np.ndarray y, - np.ndarray sample_weight=None): + np.ndarray sample_weight=None, + np.ndarray X_idx_sorted=None): """Build a decision tree from the training set (X, y).""" # check input @@ -313,7 +316,7 @@ cdef class BestFirstTreeBuilder(TreeBuilder): cdef SIZE_t min_samples_split = self.min_samples_split # Recursive partition (without actual recursion) - splitter.init(X, y, sample_weight_ptr) + splitter.init(X, y, sample_weight_ptr, X_idx_sorted) cdef PriorityHeap frontier = PriorityHeap(INITIAL_STACK_SIZE) cdef PriorityHeapRecord record diff --git a/sklearn/tree/_utils.c b/sklearn/tree/_utils.c index 8e6c60dc64556..c1d6c5a623fe6 100644 --- a/sklearn/tree/_utils.c +++ b/sklearn/tree/_utils.c @@ -472,7 +472,7 @@ static const char *__pyx_f[] = { "type.pxd", }; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":726 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":726 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -481,7 +481,7 @@ static const char *__pyx_f[] = { */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":727 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":727 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -490,7 +490,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":728 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":728 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -499,7 +499,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":729 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":729 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -508,7 +508,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":733 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":733 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -517,7 +517,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":734 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":734 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -526,7 +526,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":735 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":735 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -535,7 +535,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":736 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":736 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -544,7 +544,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":740 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":740 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -553,7 +553,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":741 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":741 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -562,7 +562,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":750 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":750 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -571,7 +571,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":751 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":751 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -580,7 +580,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":752 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":752 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -589,7 +589,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":754 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":754 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -598,7 +598,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":755 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":755 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -607,7 +607,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":756 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":756 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -616,7 +616,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":758 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":758 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -625,7 +625,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":759 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":759 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -634,7 +634,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":761 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":761 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -643,7 +643,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":762 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":762 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -652,7 +652,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":763 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":763 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -730,7 +730,7 @@ typedef npy_uint32 __pyx_t_7sklearn_4tree_6_utils_UINT32_t; struct __pyx_obj_7sklearn_4tree_6_utils_Stack; struct __pyx_obj_7sklearn_4tree_6_utils_PriorityHeap; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":765 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":765 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -739,7 +739,7 @@ struct __pyx_obj_7sklearn_4tree_6_utils_PriorityHeap; */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":766 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":766 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -748,7 +748,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":767 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":767 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -757,7 +757,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":769 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":769 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -1251,8 +1251,8 @@ static char __pyx_k_sklearn_tree__utils[] = "sklearn.tree._utils"; static char __pyx_k_could_not_allocate_d_bytes[] = "could not allocate %d bytes"; static char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; static char __pyx_k_could_not_allocate_d_d_bytes[] = "could not allocate (%d * %d) bytes"; +static char __pyx_k_home_jmschr_Desktop_scikit_lear[] = "/home/jmschr/Desktop/scikit-learn/sklearn/tree/_utils.pyx"; static char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; -static char __pyx_k_volatile_jmschrei_Bureau_scikit[] = "/volatile/jmschrei/Bureau/scikit-learn/sklearn/tree/_utils.pyx"; static char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; static char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; static char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; @@ -1266,6 +1266,7 @@ static PyObject *__pyx_n_s_ValueError; static PyObject *__pyx_n_s_capacity; static PyObject *__pyx_kp_s_could_not_allocate_d_bytes; static PyObject *__pyx_kp_s_could_not_allocate_d_d_bytes; +static PyObject *__pyx_kp_s_home_jmschr_Desktop_scikit_lear; static PyObject *__pyx_n_s_import; static PyObject *__pyx_n_s_main; static PyObject *__pyx_kp_u_ndarray_is_not_C_contiguous; @@ -1279,7 +1280,6 @@ static PyObject *__pyx_n_s_realloc_test; static PyObject *__pyx_n_s_sklearn_tree__utils; static PyObject *__pyx_n_s_test; static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd; -static PyObject *__pyx_kp_s_volatile_jmschrei_Bureau_scikit; static PyObject *__pyx_tuple_; static PyObject *__pyx_tuple__2; static PyObject *__pyx_tuple__3; @@ -3458,7 +3458,7 @@ static int __pyx_f_7sklearn_4tree_6_utils_12PriorityHeap_pop(struct __pyx_obj_7s return __pyx_r; } -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -3508,7 +3508,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_GIVEREF(__pyx_v_info->obj); } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":203 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":203 * # of flags * * if info == NULL: return # <<<<<<<<<<<<<< @@ -3521,7 +3521,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L0; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":206 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":206 * * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -3530,7 +3530,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_endian_detector = 1; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":207 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":207 * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -3539,7 +3539,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":209 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":209 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< @@ -3548,7 +3548,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":211 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":211 * ndim = PyArray_NDIM(self) * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -3558,7 +3558,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":212 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":212 * * if sizeof(npy_intp) != sizeof(Py_ssize_t): * copy_shape = 1 # <<<<<<<<<<<<<< @@ -3570,7 +3570,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } /*else*/ { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":214 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":214 * copy_shape = 1 * else: * copy_shape = 0 # <<<<<<<<<<<<<< @@ -3581,7 +3581,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L4:; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":216 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -3595,7 +3595,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L6_bool_binop_done; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":217 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":217 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -3607,7 +3607,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_L6_bool_binop_done:; if (__pyx_t_1) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -3621,7 +3621,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":220 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -3635,7 +3635,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L9_bool_binop_done; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":221 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":221 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -3647,7 +3647,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_L9_bool_binop_done:; if (__pyx_t_1) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -3661,7 +3661,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":224 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":224 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< @@ -3670,7 +3670,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":225 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":225 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< @@ -3679,7 +3679,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->ndim = __pyx_v_ndim; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":226 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":226 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if copy_shape: # <<<<<<<<<<<<<< @@ -3689,7 +3689,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (__pyx_v_copy_shape != 0); if (__pyx_t_1) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":229 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) # <<<<<<<<<<<<<< @@ -3698,7 +3698,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2))); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":230 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":230 * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< @@ -3707,7 +3707,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":231 * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< @@ -3718,7 +3718,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { __pyx_v_i = __pyx_t_5; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":232 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":232 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< @@ -3727,7 +3727,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":233 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< @@ -3740,7 +3740,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } /*else*/ { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":235 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":235 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< @@ -3749,7 +3749,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":236 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":236 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< @@ -3760,7 +3760,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L11:; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -3769,7 +3769,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->suboffsets = NULL; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":238 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":238 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< @@ -3778,7 +3778,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":239 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":239 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< @@ -3787,7 +3787,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":242 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":242 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< @@ -3796,7 +3796,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_f = NULL; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":243 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":243 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< @@ -3808,7 +3808,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":247 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":247 * cdef int offset * * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< @@ -3817,7 +3817,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":249 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":249 * cdef bint hasfields = PyDataType_HASFIELDS(descr) * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< @@ -3835,7 +3835,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_L15_bool_binop_done:; if (__pyx_t_1) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":251 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":251 * if not hasfields and not copy_shape: * # do not call releasebuffer * info.obj = None # <<<<<<<<<<<<<< @@ -3851,7 +3851,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } /*else*/ { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":254 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":254 * else: * # need to call releasebuffer * info.obj = self # <<<<<<<<<<<<<< @@ -3866,7 +3866,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L14:; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":256 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":256 * info.obj = self * * if not hasfields: # <<<<<<<<<<<<<< @@ -3876,7 +3876,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = ((!(__pyx_v_hasfields != 0)) != 0); if (__pyx_t_1) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257 * * if not hasfields: * t = descr.type_num # <<<<<<<<<<<<<< @@ -3886,7 +3886,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":258 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":258 * if not hasfields: * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -3906,7 +3906,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L20_next_or:; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":259 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -3924,7 +3924,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_L19_bool_binop_done:; if (__pyx_t_1) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -3938,7 +3938,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P {__pyx_filename = __pyx_f[1]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":277 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":277 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -3947,7 +3947,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ switch (__pyx_v_t) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":261 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< @@ -3958,7 +3958,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_b; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":262 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":262 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< @@ -3969,7 +3969,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_B; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< @@ -3980,7 +3980,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_h; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":264 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":264 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< @@ -3991,7 +3991,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_H; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":265 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":265 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< @@ -4002,7 +4002,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_i; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":266 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":266 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< @@ -4013,7 +4013,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_I; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":267 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< @@ -4024,7 +4024,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_l; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":268 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< @@ -4035,7 +4035,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_L; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":269 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< @@ -4046,7 +4046,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_q; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":270 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< @@ -4057,7 +4057,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_Q; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":271 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< @@ -4068,7 +4068,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_f; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":272 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< @@ -4079,7 +4079,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_d; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":273 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< @@ -4090,7 +4090,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_g; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":274 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< @@ -4101,7 +4101,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_Zf; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":275 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< @@ -4112,7 +4112,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_Zd; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":276 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< @@ -4123,7 +4123,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = __pyx_k_Zg; break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":277 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":277 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -4135,7 +4135,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; default: - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":279 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -4161,7 +4161,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":280 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":280 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< @@ -4170,7 +4170,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = __pyx_v_f; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":281 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":281 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< @@ -4182,7 +4182,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } /*else*/ { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":283 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":283 * return * else: * info.format = stdlib.malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< @@ -4191,7 +4191,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = ((char *)malloc(255)); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":284 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":284 * else: * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< @@ -4200,7 +4200,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->format[0]) = '^'; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":285 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":285 * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< @@ -4209,7 +4209,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_offset = 0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":286 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":286 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< @@ -4219,7 +4219,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_f = __pyx_t_7; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":289 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":289 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< @@ -4229,7 +4229,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_f[0]) = '\x00'; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -4261,7 +4261,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P return __pyx_r; } -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -4285,7 +4285,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":292 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":292 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -4295,7 +4295,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":293 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":293 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * stdlib.free(info.format) # <<<<<<<<<<<<<< @@ -4307,7 +4307,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s } __pyx_L3:; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":294 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":294 * if PyArray_HASFIELDS(self): * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -4317,7 +4317,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":295 * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) # <<<<<<<<<<<<<< @@ -4329,7 +4329,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s } __pyx_L4:; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -4341,7 +4341,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannyFinishContext(); } -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -4358,7 +4358,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":772 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":772 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< @@ -4372,7 +4372,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -4391,7 +4391,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ return __pyx_r; } -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -4408,7 +4408,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":775 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":775 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< @@ -4422,7 +4422,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -4441,7 +4441,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ return __pyx_r; } -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -4458,7 +4458,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":778 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":778 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< @@ -4472,7 +4472,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -4491,7 +4491,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ return __pyx_r; } -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -4508,7 +4508,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":781 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":781 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< @@ -4522,7 +4522,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -4541,7 +4541,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ return __pyx_r; } -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -4558,7 +4558,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":784 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":784 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< @@ -4572,7 +4572,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -4591,7 +4591,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ return __pyx_r; } -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":786 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":786 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -4623,7 +4623,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_util_dtypestring", 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":793 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":793 * cdef int delta_offset * cdef tuple i * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -4632,7 +4632,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_endian_detector = 1; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794 * cdef tuple i * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -4641,7 +4641,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":797 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":797 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -4664,7 +4664,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":798 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":798 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< @@ -4681,7 +4681,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< @@ -4720,7 +4720,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -4737,7 +4737,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (__pyx_t_6) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -4751,7 +4751,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx {__pyx_filename = __pyx_f[1]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":804 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":804 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -4771,7 +4771,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L8_next_or:; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":805 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -4789,7 +4789,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_L7_bool_binop_done:; if (__pyx_t_6) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":806 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":806 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -4803,7 +4803,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx {__pyx_filename = __pyx_f[1]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":816 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":816 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< @@ -4819,7 +4819,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":817 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":817 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< @@ -4828,7 +4828,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ (__pyx_v_f[0]) = 120; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":818 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":818 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< @@ -4837,7 +4837,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":819 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":819 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< @@ -4848,7 +4848,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":821 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":821 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< @@ -4858,7 +4858,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -4868,7 +4868,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":824 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":824 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< @@ -4880,7 +4880,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":825 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":825 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -4890,7 +4890,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (__pyx_t_6) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -4904,7 +4904,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":829 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":829 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< @@ -4922,7 +4922,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":830 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":830 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< @@ -4940,7 +4940,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":831 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< @@ -4958,7 +4958,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":832 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":832 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< @@ -4976,7 +4976,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":833 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< @@ -4994,7 +4994,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":834 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< @@ -5012,7 +5012,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":835 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":835 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< @@ -5030,7 +5030,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":836 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":836 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< @@ -5048,7 +5048,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":837 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":837 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< @@ -5066,7 +5066,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":838 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":838 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< @@ -5084,7 +5084,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":839 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":839 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< @@ -5102,7 +5102,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":840 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< @@ -5120,7 +5120,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":841 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< @@ -5138,7 +5138,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":842 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< @@ -5158,7 +5158,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":843 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":843 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< @@ -5178,7 +5178,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":844 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< @@ -5198,7 +5198,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":845 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":845 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< @@ -5217,7 +5217,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } /*else*/ { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":847 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":847 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -5240,7 +5240,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L15:; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":848 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":848 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< @@ -5252,7 +5252,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } /*else*/ { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":852 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":852 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< @@ -5264,7 +5264,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L13:; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":797 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":797 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -5274,7 +5274,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":853 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":853 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< @@ -5284,7 +5284,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_r = __pyx_v_f; goto __pyx_L0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":786 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":786 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -5309,7 +5309,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx return __pyx_r; } -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -5324,7 +5324,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":971 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":971 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -5335,7 +5335,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":972 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":972 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< @@ -5347,7 +5347,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } /*else*/ { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":974 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":974 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< @@ -5356,7 +5356,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_INCREF(__pyx_v_base); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":975 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":975 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< @@ -5367,7 +5367,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } __pyx_L3:; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< @@ -5376,7 +5376,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_XDECREF(__pyx_v_arr->base); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":977 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< @@ -5385,7 +5385,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_arr->base = __pyx_v_baseptr; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -5397,7 +5397,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979 +/* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -5411,7 +5411,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":980 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":980 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -5421,7 +5421,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":981 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":981 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< @@ -5435,7 +5435,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py } /*else*/ { - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":983 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":983 * return None * else: * return arr.base # <<<<<<<<<<<<<< @@ -5446,7 +5446,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; } - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -5685,6 +5685,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_capacity, __pyx_k_capacity, sizeof(__pyx_k_capacity), 0, 0, 1, 1}, {&__pyx_kp_s_could_not_allocate_d_bytes, __pyx_k_could_not_allocate_d_bytes, sizeof(__pyx_k_could_not_allocate_d_bytes), 0, 0, 1, 0}, {&__pyx_kp_s_could_not_allocate_d_d_bytes, __pyx_k_could_not_allocate_d_d_bytes, sizeof(__pyx_k_could_not_allocate_d_d_bytes), 0, 0, 1, 0}, + {&__pyx_kp_s_home_jmschr_Desktop_scikit_lear, __pyx_k_home_jmschr_Desktop_scikit_lear, sizeof(__pyx_k_home_jmschr_Desktop_scikit_lear), 0, 0, 1, 0}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_kp_u_ndarray_is_not_C_contiguous, __pyx_k_ndarray_is_not_C_contiguous, sizeof(__pyx_k_ndarray_is_not_C_contiguous), 0, 1, 0, 0}, @@ -5698,7 +5699,6 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_sklearn_tree__utils, __pyx_k_sklearn_tree__utils, sizeof(__pyx_k_sklearn_tree__utils), 0, 0, 1, 1}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0}, - {&__pyx_kp_s_volatile_jmschrei_Bureau_scikit, __pyx_k_volatile_jmschrei_Bureau_scikit, sizeof(__pyx_k_volatile_jmschrei_Bureau_scikit), 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { @@ -5715,7 +5715,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -5726,7 +5726,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -5737,7 +5737,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -5748,7 +5748,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -5759,7 +5759,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":806 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":806 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -5770,7 +5770,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -5791,7 +5791,7 @@ static int __Pyx_InitCachedConstants(void) { __pyx_tuple__7 = PyTuple_Pack(1, __pyx_n_s_p); if (unlikely(!__pyx_tuple__7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); - __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_volatile_jmschrei_Bureau_scikit, __pyx_n_s_realloc_test, 42, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jmschr_Desktop_scikit_lear, __pyx_n_s_realloc_test, 42, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -5971,7 +5971,7 @@ PyMODINIT_FUNC PyInit__utils(void) if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../forest/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../anaconda/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< diff --git a/sklearn/tree/tests/test_tree.py b/sklearn/tree/tests/test_tree.py index fa46c81a24c4a..9b553d4d3c51d 100644 --- a/sklearn/tree/tests/test_tree.py +++ b/sklearn/tree/tests/test_tree.py @@ -50,14 +50,14 @@ CLF_TREES = { "DecisionTreeClassifier": DecisionTreeClassifier, "Presort-DecisionTreeClassifier": partial(DecisionTreeClassifier, - splitter="presort-best"), + presort=True), "ExtraTreeClassifier": ExtraTreeClassifier, } REG_TREES = { "DecisionTreeRegressor": DecisionTreeRegressor, "Presort-DecisionTreeRegressor": partial(DecisionTreeRegressor, - splitter="presort-best"), + presort=True), "ExtraTreeRegressor": ExtraTreeRegressor, } @@ -65,8 +65,8 @@ ALL_TREES.update(CLF_TREES) ALL_TREES.update(REG_TREES) -SPARSE_TREES = [name for name, Tree in ALL_TREES.items() - if Tree().splitter in SPARSE_SPLITTERS] +SPARSE_TREES = ["DecisionTreeClassifier", "DecisionTreeRegressor", + "ExtraTreeClassifier", "ExtraTreeRegressor"] X_small = np.array([ @@ -766,7 +766,7 @@ def test_memory_layout(): y = iris.target assert_array_equal(est.fit(X, y).predict(X), y) - if est.splitter in SPARSE_SPLITTERS: + if not est.presort: # csr matrix X = csr_matrix(iris.data, dtype=dtype) y = iris.target @@ -1269,7 +1269,7 @@ def check_min_weight_leaf_split_level(name): sample_weight = [0.2, 0.2, 0.2, 0.2, 0.2] _check_min_weight_leaf_split_level(TreeEstimator, X, y, sample_weight) - if TreeEstimator().splitter in SPARSE_SPLITTERS: + if not TreeEstimator().presort: _check_min_weight_leaf_split_level(TreeEstimator, csc_matrix(X), y, sample_weight) @@ -1303,3 +1303,21 @@ def test_public_apply(): for name in SPARSE_TREES: yield (check_public_apply_sparse, name) + + +def check_presort_sparse(est, X, y): + assert_raises(ValueError, est.fit, X, y ) + +def test_presort_sparse(): + ests = (DecisionTreeClassifier(presort=True), + DecisionTreeRegressor(presort=True)) + sparse_matrices = (csr_matrix, csc_matrix, coo_matrix) + + y, X = datasets.make_multilabel_classification(random_state=0, + n_samples=50, + n_features=1, + n_classes=20) + y = y[:, 0] + + for est, sparse_matrix in product(ests, sparse_matrices): + yield check_presort_sparse, est, sparse_matrix(X), y diff --git a/sklearn/tree/tree.py b/sklearn/tree/tree.py index 82e5d15809d04..45845fd192704 100644 --- a/sklearn/tree/tree.py +++ b/sklearn/tree/tree.py @@ -17,21 +17,27 @@ import numbers -from abc import ABCMeta, abstractmethod +from abc import ABCMeta +from abc import abstractmethod import numpy as np from scipy.sparse import issparse -from ..base import BaseEstimator, ClassifierMixin, RegressorMixin +from ..base import BaseEstimator +from ..base import ClassifierMixin +from ..base import RegressorMixin from ..externals import six from ..feature_selection.from_model import _LearntSelectorMixin -from ..utils import check_array, check_random_state, compute_sample_weight +from ..utils import check_array +from ..utils import check_random_state +from ..utils import compute_sample_weight from ..utils.validation import NotFittedError from ._criterion import Criterion from ._splitter import Splitter -from ._tree import DepthFirstTreeBuilder, BestFirstTreeBuilder +from ._tree import DepthFirstTreeBuilder +from ._tree import BestFirstTreeBuilder from ._tree import Tree from . import _tree, _splitter, _criterion @@ -52,7 +58,6 @@ CRITERIA_REG = {"mse": _criterion.MSE, "friedman_mse": _criterion.FriedmanMSE} DENSE_SPLITTERS = {"best": _splitter.BestSplitter, - "presort-best": _splitter.PresortBestSplitter, "random": _splitter.RandomSplitter} SPARSE_SPLITTERS = {"best": _splitter.BestSparseSplitter, @@ -82,7 +87,8 @@ def __init__(self, max_features, max_leaf_nodes, random_state, - class_weight=None): + class_weight=None, + presort=False): self.criterion = criterion self.splitter = splitter self.max_depth = max_depth @@ -93,6 +99,7 @@ def __init__(self, self.random_state = random_state self.max_leaf_nodes = max_leaf_nodes self.class_weight = class_weight + self.presort = presort self.n_features_ = None self.n_outputs_ = None @@ -102,7 +109,8 @@ def __init__(self, self.tree_ = None self.max_features_ = None - def fit(self, X, y, sample_weight=None, check_input=True): + def fit(self, X, y, sample_weight=None, check_input=True, + X_idx_sorted=None): """Build a decision tree from the training set (X, y). Parameters @@ -128,11 +136,18 @@ def fit(self, X, y, sample_weight=None, check_input=True): Allow to bypass several input checking. Don't use this parameter unless you know what you do. + X_idx_sorted : array-like, shape = [n_samples, n_features], optional + The indexes of the sorted training input samples. If many tree + are grown on the same dataset, this allows the ordering to be + cached between trees. If None, the data will be sorted here. + Don't use this parameter unless you know what to do. + Returns ------- self : object Returns self. """ + random_state = check_random_state(self.random_state) if check_input: X = check_array(X, dtype=DTYPE, accept_sparse="csc") @@ -269,6 +284,33 @@ def fit(self, X, y, sample_weight=None, check_input=True): min_samples_split = max(self.min_samples_split, 2 * self.min_samples_leaf) + + presort = self.presort + # Allow presort to be 'auto', which means True if the dataset is dense, + # otherwise it will be False. + if self.presort == 'auto' and issparse(X): + presort = False + elif self.presort == 'auto': + presort = True + + if presort == True and issparse(X): + raise ValueError("Presorting is not supported for sparse matrices.") + + # If multiple trees are built on the same dataset, we only want to + # presort once. Splitters now can accept presorted indices if desired, + # but do not handle any presorting themselves. Ensemble algorithms which + # desire presorting must do presorting themselves and pass that matrix + # into each tree. + if X_idx_sorted is None and presort: + X_idx_sorted = np.asfortranarray(np.argsort(X, axis=0), + dtype=np.int32) + + if presort and X_idx_sorted.shape != X.shape: + raise ValueError("The shape of X (X.shape = {}) doesn't match " + "the shape of X_idx_sorted (X_idx_sorted" + ".shape = {})".format(X.shape, + X_idx_sorted.shape)) + # Build tree criterion = self.criterion if not isinstance(criterion, Criterion): @@ -286,7 +328,8 @@ def fit(self, X, y, sample_weight=None, check_input=True): self.max_features_, self.min_samples_leaf, min_weight_leaf, - random_state) + random_state, + self.presort) self.tree_ = Tree(self.n_features_, self.n_classes_, self.n_outputs_) @@ -303,7 +346,7 @@ def fit(self, X, y, sample_weight=None, check_input=True): max_depth, max_leaf_nodes) - builder.build(self.tree_, X, y, sample_weight) + builder.build(self.tree_, X, y, sample_weight, X_idx_sorted) if self.n_outputs_ == 1: self.n_classes_ = self.n_classes_[0] @@ -356,6 +399,7 @@ def predict(self, X, check_input=True): y : array of shape = [n_samples] or [n_samples, n_outputs] The predicted classes, or the predict values. """ + X = self._validate_X_predict(X, check_input) proba = self.tree_.predict(X) n_samples = X.shape[0] @@ -507,6 +551,13 @@ class DecisionTreeClassifier(BaseDecisionTree, ClassifierMixin): If None, the random number generator is the RandomState instance used by `np.random`. + presort : bool, optional (default=False) + Whether to presort the data to speed up the finding of best splits in + fitting. For the default settings of a decision tree on large + datasets, setting this to true may slow down the training process. + When using either a smaller dataset or a restricted depth, this may + speed up the training. + Attributes ---------- classes_ : array of shape = [n_classes] or a list of such arrays @@ -577,7 +628,8 @@ def __init__(self, max_features=None, random_state=None, max_leaf_nodes=None, - class_weight=None): + class_weight=None, + presort=False): super(DecisionTreeClassifier, self).__init__( criterion=criterion, splitter=splitter, @@ -588,7 +640,8 @@ def __init__(self, max_features=max_features, max_leaf_nodes=max_leaf_nodes, class_weight=class_weight, - random_state=random_state) + random_state=random_state, + presort=presort) def predict_proba(self, X, check_input=True): """Predict class probabilities of the input samples X. @@ -726,6 +779,13 @@ class DecisionTreeRegressor(BaseDecisionTree, RegressorMixin): If None, the random number generator is the RandomState instance used by `np.random`. + presort : bool, optional (default=False) + Whether to presort the data to speed up the finding of best splits in + fitting. For the default settings of a decision tree on large + datasets, setting this to true may slow down the training process. + When using either a smaller dataset or a restricted depth, this may + speed up the training. + Attributes ---------- feature_importances_ : array of shape = [n_features] @@ -787,7 +847,8 @@ def __init__(self, min_weight_fraction_leaf=0., max_features=None, random_state=None, - max_leaf_nodes=None): + max_leaf_nodes=None, + presort=False): super(DecisionTreeRegressor, self).__init__( criterion=criterion, splitter=splitter, @@ -797,7 +858,8 @@ def __init__(self, min_weight_fraction_leaf=min_weight_fraction_leaf, max_features=max_features, max_leaf_nodes=max_leaf_nodes, - random_state=random_state) + random_state=random_state, + presort=presort) class ExtraTreeClassifier(DecisionTreeClassifier):