diff --git a/doc/modules/ensemble.rst b/doc/modules/ensemble.rst index 1c41763e80b80..8bff203ab062e 100644 --- a/doc/modules/ensemble.rst +++ b/doc/modules/ensemble.rst @@ -50,6 +50,10 @@ target values (class labels) for the training samples:: >>> clf = RandomForestClassifier(n_estimators=10) >>> clf = clf.fit(X, Y) +Like :ref:`decision trees `, forests of trees also extend +to :ref:`multi-output problems ` (if Y is an array of size +``[n_samples, n_outputs]``). + Random Forests -------------- @@ -161,6 +165,8 @@ amount of time (e.g., on large datasets). * :ref:`example_ensemble_plot_forest_iris.py` * :ref:`example_ensemble_plot_forest_importances_faces.py` + * :ref:`example_ensemble_plot_forest_multioutput.py` + .. topic:: References @@ -210,6 +216,7 @@ the matching feature to the prediction function. * :ref:`example_ensemble_plot_forest_importances_faces.py` * :ref:`example_ensemble_plot_forest_importances.py` + .. _gradient_boosting: Gradient Tree Boosting @@ -471,6 +478,7 @@ can be controled via the ``max_features`` parameter. * :ref:`example_ensemble_plot_gradient_boosting_regression.py` * :ref:`example_ensemble_plot_gradient_boosting_regularization.py` + .. topic:: References .. [F2001] J. Friedman, "Greedy Function Approximation: A Gradient Boosting Machine", diff --git a/doc/modules/tree.rst b/doc/modules/tree.rst index 063b3a8e46fb0..a30eed4c8aff7 100644 --- a/doc/modules/tree.rst +++ b/doc/modules/tree.rst @@ -38,6 +38,8 @@ Some advantages of decision trees are: of variable. See :ref:`algorithms ` for more information. + - Able to handle multi-output problems. + - Uses a white box model. If a given situation is observable in a model, the explanation for the condition is easily explained by boolean logic. By constrast, in a black box model (e.g., in an artificial neural @@ -49,6 +51,7 @@ Some advantages of decision trees are: - Performs well even if its assumptions are somewhat violated by the true model from which the data were generated. + The disadvantages of decision trees include: - Decision-tree learners can create over-complex trees that do not @@ -78,6 +81,7 @@ The disadvantages of decision trees include: It is therefore recommended to balance the dataset prior to fitting with the decision tree. + .. _tree_classification: Classification @@ -87,8 +91,8 @@ Classification classification on a dataset. As other classifiers, :class:`DecisionTreeClassifier` take as input two -arrays: an array X of size [n_samples, n_features] holding the training -samples, and an array Y of integer values, size [n_samples], holding +arrays: an array X of size ``[n_samples, n_features]`` holding the training +samples, and an array Y of integer values, size ``[n_samples]``, holding the class labels for the training samples:: >>> from sklearn import tree @@ -147,6 +151,7 @@ After being fitted, the model can then be used to predict new values:: * :ref:`example_tree_plot_iris.py` + .. _tree_regression: Regression @@ -177,6 +182,67 @@ instead of integer values:: * :ref:`example_tree_plot_tree_regression.py` + +.. _tree_multioutput: + +Multi-output problems +===================== + +A multi-output problem is a supervised learning problem with several outputs +to predict, that is when Y is a 2d array of size ``[n_samples, n_outputs]``. + +When there is no correlation between the outputs, a very simple way to solve +this kind of problem is to build n independent models, i.e. one for each +output, and then to use those models to independently predict each one of the n +outputs. However, because it is likely that the output values related to the +same input are themselves correlated, an often better way is to build a single +model capable of predicting simultaneously all n outputs. First, it requires +lower training time since only a single estimator is built. Second, the +generalization accuracy of the resulting estimator may often be increased. + +With regard to decision trees, this strategy can readily be used to support +multi-output problems. This requires the following changes: + + - Store n output values in leaves, instead of 1; + - Use splitting criteria that compute the average reduction across all + n outputs. + +This module offers support for multi-output problems by implementing this +strategy in both :class:`DecisionTreeClassifier` and +:class:`DecisionTreeRegressor`. If a decision tree is fit on an output array Y +of size ``[n_samples, n_outputs]`` then the resulting estimator will: + + * Output n_output values upon ``predict``; + + * Output a list of n_output arrays of class probabilities upon + ``predict_proba``. + + +The use of multi-output trees for regression is demonstrated in +:ref:`example_tree_plot_tree_regression_multioutput.py`. In this example, the input +X is a single real value and the outputs Y are the sine and cosine of X. + +.. figure:: ../auto_examples/tree/images/plot_tree_regression_multioutput_1.png + :target: ../auto_examples/tree/plot_tree_regression_multioutput.html + :scale: 75 + :align: center + +The use of multi-output trees for classification is demonstrated in +:ref:`example_ensemble_plot_forest_multioutput.py`. In this example, the inputs +X are the pixels of the upper half of faces and the outputs Y are the pixels of +the lower half of those faces. + +.. figure:: ../auto_examples/ensemble/images/plot_forest_multioutput_1.png + :target: ../auto_examples/ensemble/plot_forest_multioutput.html + :scale: 75 + :align: center + +.. topic:: Examples: + + * :ref:`example_tree_plot_tree_regression_multioutput.py` + * :ref:`example_ensemble_plot_forest_multioutput.py` + + .. _tree_complexity: Complexity @@ -228,6 +294,7 @@ slowing down the algorithm significantly. Tips on practical use ===================== + * Decision trees tend to overfit on data with a large number of features. Getting the right ratio of samples to number of features is important, since a tree with few samples in high dimensional space is very likely to overfit. @@ -259,6 +326,7 @@ Tips on practical use * All decision trees use Fortran ordered ``np.float32`` arrays internally. If training data is not in this format, a copy of the dataset will be made. + .. _tree_algorithms: Tree algorithms: ID3, C4.5, C5.0 and CART @@ -297,6 +365,7 @@ scikit-learn uses an optimised version of the CART algorithm. .. _ID3: http://en.wikipedia.org/wiki/ID3_algorithm .. _CART: http://en.wikipedia.org/wiki/Predictive_analytics#Classification_and_regression_trees + .. _tree_mathematical_formulation: Mathematical formulation diff --git a/doc/whats_new.rst b/doc/whats_new.rst index c2d40d91c7ffe..1d8a0823dfab0 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -30,6 +30,9 @@ Changelog - A common testing framework for all estimators was added. + - Decision trees and forests of randomized trees now support multi-output + classification and regression problems, by `Gilles Louppe` + API changes summary ------------------- diff --git a/examples/ensemble/plot_forest_importances_faces.py b/examples/ensemble/plot_forest_importances_faces.py index 3e71d67c4f9e8..60ebaec1bb8fe 100644 --- a/examples/ensemble/plot_forest_importances_faces.py +++ b/examples/ensemble/plot_forest_importances_faces.py @@ -21,7 +21,7 @@ # Number of cores to use to perform parallel fitting of the forest model n_jobs = 1 -# Loading the digits dataset +# Load the faces dataset data = fetch_olivetti_faces() X = data.images.reshape((len(data.images), -1)) y = data.target diff --git a/examples/ensemble/plot_forest_multioutput.py b/examples/ensemble/plot_forest_multioutput.py new file mode 100644 index 0000000000000..84ab43c29f5b7 --- /dev/null +++ b/examples/ensemble/plot_forest_multioutput.py @@ -0,0 +1,70 @@ +""" +========================================= +Face completion with multi-output forests +========================================= + +This example shows the use of multi-output forests to complete images. +The goal is to predict the lower half of a face given its upper half. + +The first row of images shows true faces. The second half illustrates +how the forest completes the lower half of those faces. + +""" +print __doc__ + +import numpy as np +import pylab as pl + +from sklearn.datasets import fetch_olivetti_faces +from sklearn.ensemble import ExtraTreesRegressor +from sklearn.tree import DecisionTreeRegressor + + +# Load the faces datasets +data = fetch_olivetti_faces() +targets = data.target + +data = data.images.reshape((len(data.images), -1)) +train = data[targets < 30] +test = data[targets >= 30] # Test on independent people +n_pixels = data.shape[1] + +X_train = train[:, :int(0.5 * n_pixels)] # Upper half of the faces +Y_train = train[:, int(0.5 * n_pixels):] # Lower half of the faces +X_test = test[:, :int(0.5 * n_pixels)] +Y_test = test[:, int(0.5 * n_pixels):] + +# Build a multi-output forest +forest = ExtraTreesRegressor(n_estimators=10, + max_features=32, + random_state=0) + +forest.fit(X_train, Y_train) +Y_test_predict = forest.predict(X_test) + +# Plot the completed faces +n_faces = 5 +image_shape = (64, 64) + +pl.figure(figsize=(2. * n_faces, 2.26 * 2)) +pl.suptitle("Face completion with multi-output forests", size=16) + +for i in xrange(1, 1 + n_faces): + face_id = np.random.randint(X_test.shape[0]) + + true_face = np.hstack((X_test[face_id], Y_test[face_id])) + completed_face = np.hstack((X_test[face_id], Y_test_predict[face_id])) + + pl.subplot(2, n_faces, i) + pl.axis("off") + pl.imshow(true_face.reshape(image_shape), + cmap=pl.cm.gray, + interpolation="nearest") + + pl.subplot(2, n_faces, n_faces + i) + pl.axis("off") + pl.imshow(completed_face.reshape(image_shape), + cmap=pl.cm.gray, + interpolation="nearest") + +pl.show() diff --git a/examples/tree/plot_tree_regression_multioutput.py b/examples/tree/plot_tree_regression_multioutput.py new file mode 100644 index 0000000000000..3c7d37fdb3467 --- /dev/null +++ b/examples/tree/plot_tree_regression_multioutput.py @@ -0,0 +1,55 @@ +""" +=================================================================== +Multi-output Decision Tree Regression +=================================================================== + +Multi-output regression with :ref:`decision trees `: the decision tree +is used to predict simultaneously the noisy x and y observations of a circle +given a single underlying feature. As a result, it learns local linear +regressions approximating the circle. + +We can see that if the maximum depth of the tree (controlled by the +`max_depth` parameter) is set too high, the decision trees learn too fine +details of the training data and learn from the noise, i.e. they overfit. +""" +print __doc__ + +import numpy as np + +# Create a random dataset +rng = np.random.RandomState(1) +X = np.sort(200 * rng.rand(100, 1) - 100, axis=0) +y = np.array([np.pi * np.sin(X).ravel(), np.pi * np.cos(X).ravel()]).T +y[::5,:] += (0.5 - rng.rand(20,2)) + +# Fit regression model +from sklearn.tree import DecisionTreeRegressor + +clf_1 = DecisionTreeRegressor(max_depth=2) +clf_2 = DecisionTreeRegressor(max_depth=5) +clf_3 = DecisionTreeRegressor(max_depth=8) +clf_1.fit(X, y) +clf_2.fit(X, y) +clf_3.fit(X, y) + +# Predict +X_test = np.arange(-100.0, 100.0, 0.01)[:, np.newaxis] +y_1 = clf_1.predict(X_test) +y_2 = clf_2.predict(X_test) +y_3 = clf_3.predict(X_test) + +# Plot the results +import pylab as pl + +pl.figure() +pl.scatter(y[:,0], y[:,1], c="k", label="data") +pl.scatter(y_1[:,0], y_1[:,1], c="g", label="max_depth=2") +pl.scatter(y_2[:,0], y_2[:,1], c="r", label="max_depth=5") +pl.scatter(y_3[:,0], y_3[:,1], c="b", label="max_depth=8") +pl.xlim([-6, 6]) +pl.ylim([-6, 6]) +pl.xlabel("data") +pl.ylabel("target") +pl.title("Multi-output Decision Tree Regression") +pl.legend() +pl.show() \ No newline at end of file diff --git a/sklearn/ensemble/forest.py b/sklearn/ensemble/forest.py index b3dfc8854b0ac..a2a400f8b551f 100644 --- a/sklearn/ensemble/forest.py +++ b/sklearn/ensemble/forest.py @@ -28,6 +28,8 @@ class calls the ``fit`` method of each sub-estimator on random samples ``ExtraTreeClassifier`` and ``ExtraTreeRegressor`` as sub-estimator implementations. +Single and multi-output problems are both handled. + """ # Authors: Gilles Louppe, Brian Holt @@ -86,19 +88,27 @@ def _parallel_build_trees(n_trees, forest, X, y, return trees -def _parallel_predict_proba(trees, X, n_classes): +def _parallel_predict_proba(trees, X, n_classes, n_outputs): """Private function used to compute a batch of predictions within a job.""" - p = np.zeros((X.shape[0], n_classes)) + n_samples = X.shape[0] + p = [] + + for k in xrange(n_outputs): + p.append(np.zeros((n_samples, n_classes[k]))) for tree in trees: - if n_classes == tree.n_classes_: - p += tree.predict_proba(X) + p_tree = tree.predict_proba(X) - else: - proba = tree.predict_proba(X) + if n_outputs == 1: + p_tree = [p_tree] - for j, c in enumerate(tree.classes_): - p[:, c] += proba[:, j] + for k in xrange(n_outputs): + if n_classes[k] == tree.n_classes_[k]: + p[k] += p_tree[k] + + else: + for j, c in enumerate(tree.classes_[k]): + p[k][:, c] += p_tree[k][:, j] return p @@ -188,7 +198,12 @@ def __init__(self, base_estimator, self.n_jobs = n_jobs self.random_state = check_random_state(random_state) + self.n_features_ = None + self.n_outputs_ = None + self.classes_ = None + self.n_classes_ = None self.feature_importances_ = None + self.verbose = verbose def fit(self, X, y): @@ -199,7 +214,7 @@ def fit(self, X, y): X : array-like of shape = [n_samples, n_features] The training input samples. - y : array-like, shape = [n_samples] + y : array-like, shape = [n_samples] or [n_samples, n_outputs] The target values (integers that correspond to classes in classification, real numbers in regression). @@ -210,7 +225,7 @@ def fit(self, X, y): """ # Precompute some data X = np.atleast_2d(X) - y = np.atleast_1d(y) + n_samples, self.n_features_ = X.shape if self.bootstrap: sample_mask = None @@ -221,9 +236,9 @@ def fit(self, X, y): raise ValueError("Out of bag estimation only available" " if bootstrap=True") - sample_mask = np.ones((X.shape[0],), dtype=np.bool) + sample_mask = np.ones((n_samples,), dtype=np.bool) - n_jobs, _, starts = _partition_features(self, X.shape[1]) + n_jobs, _, starts = _partition_features(self, self.n_features_) all_X_argsorted = Parallel(n_jobs=n_jobs)( delayed(_parallel_X_argsort)( @@ -232,10 +247,21 @@ def fit(self, X, y): X_argsorted = np.asfortranarray(np.hstack(all_X_argsorted)) + y = np.copy(y) + y = np.atleast_1d(y) + if y.ndim == 1: + y = y[:, np.newaxis] + + self.classes_ = [] + self.n_classes_ = [] + self.n_outputs_ = y.shape[1] + if isinstance(self.base_estimator, ClassifierMixin): - self.classes_ = np.unique(y) - self.n_classes_ = len(self.classes_) - y = np.searchsorted(self.classes_, y) + for k in xrange(self.n_outputs_): + unique = np.unique(y[:, k]) + self.classes_.append(unique) + self.n_classes_.append(unique.shape[0]) + y[:, k] = np.searchsorted(unique, y[:, k]) # Assign chunk of trees to jobs n_jobs, n_trees, _ = _partition_trees(self) @@ -259,29 +285,66 @@ def fit(self, X, y): # Calculate out of bag predictions and score if self.oob_score: if isinstance(self, ClassifierMixin): - predictions = np.zeros((X.shape[0], self.n_classes_)) + self.oob_decision_function_ = [] + self.oob_score_ = 0.0 + + predictions = [] + for k in xrange(self.n_outputs_): + predictions.append(np.zeros((n_samples, + self.n_classes_[k]))) + for estimator in self.estimators_: - mask = np.ones(X.shape[0], dtype=np.bool) + mask = np.ones(n_samples, dtype=np.bool) mask[estimator.indices_] = False - predictions[mask, :] += estimator.predict_proba(X[mask, :]) - self.oob_decision_function_ = (predictions - / predictions.sum(axis=1)[:, np.newaxis]) - self.oob_score_ = np.mean(y == np.argmax(predictions, axis=1)) + p_estimator = estimator.predict_proba(X[mask, :]) + if self.n_outputs_ == 1: + p_estimator = [p_estimator] + + for k in xrange(self.n_outputs_): + predictions[k][mask, :] += p_estimator[k] + + for k in xrange(self.n_outputs_): + decision = predictions[k] \ + / predictions[k].sum(axis=1)[:, np.newaxis] + self.oob_decision_function_.append(decision) + + self.oob_score_ += np.mean(y[:, k] \ + == np.argmax(predictions[k], axis=1)) + + if self.n_outputs_ == 1: + self.oob_decision_function_ = \ + self.oob_decision_function_[0] + + self.oob_score_ /= self.n_outputs_ else: # Regression: - predictions = np.zeros(X.shape[0]) - n_predictions = np.zeros(X.shape[0]) + predictions = np.zeros((n_samples, self.n_outputs_)) + n_predictions = np.zeros((n_samples, self.n_outputs_)) + for estimator in self.estimators_: - mask = np.ones(X.shape[0], dtype=np.bool) + mask = np.ones(n_samples, dtype=np.bool) mask[estimator.indices_] = False - predictions[mask] += estimator.predict(X[mask, :]) - n_predictions[mask] += 1 + + p_estimator = estimator.predict(X[mask, :]) + if self.n_outputs_ == 1: + p_estimator = p_estimator[:, np.newaxis] + + predictions[mask, :] += p_estimator + n_predictions[mask, :] += 1 + predictions /= n_predictions self.oob_prediction_ = predictions - self.oob_score_ = r2_score(y, predictions) + if self.n_outputs_ == 1: + self.oob_prediction_ = \ + self.oob_prediction_.reshape((n_samples, )) + + self.oob_score_ = 0.0 + for k in xrange(self.n_outputs_): + self.oob_score_ += r2_score(y[:, k], predictions[:, k]) + self.oob_score_ /= self.n_outputs_ # Sum the importances if self.compute_importances: @@ -334,11 +397,25 @@ def predict(self, X): Returns ------- - y : array of shape = [n_samples] + y : array of shape = [n_samples] or [n_samples, n_outputs] The predicted classes. """ - return self.classes_.take( - np.argmax(self.predict_proba(X), axis=1), axis=0) + n_samples = len(X) + + P = self.predict_proba(X) + if self.n_outputs_ == 1: + P = [P] + + predictions = np.zeros((n_samples, self.n_outputs_)) + + for k in xrange(self.n_outputs_): + predictions[:, k] = self.classes_[k].take(np.argmax(P[k], axis=1), + axis=0) + + if self.n_outputs_ == 1: + predictions = predictions.reshape((n_samples, )) + + return predictions def predict_proba(self, X): """Predict class probabilities for X. @@ -353,7 +430,8 @@ def predict_proba(self, X): Returns ------- - p : array of shape = [n_samples] + p : array of shape = [n_samples, n_classes], or a list of n_outputs + such arrays if n_outputs > 1. The class probabilities of the input samples. Classes are ordered by arithmetical order. """ @@ -367,13 +445,26 @@ def predict_proba(self, X): all_p = Parallel(n_jobs=n_jobs)( delayed(_parallel_predict_proba)( self.estimators_[starts[i]:starts[i + 1]], - X, self.n_classes_) + X, + self.n_classes_, + self.n_outputs_) for i in xrange(n_jobs)) # Reduce - p = sum(all_p) / self.n_estimators + p = all_p[0] + + for j in xrange(1, self.n_jobs): + for k in xrange(self.n_outputs_): + p[k] += all_p[j][k] + + for k in xrange(self.n_outputs_): + p[k] /= self.n_estimators - return p + if self.n_outputs_ == 1: + return p[0] + + else: + return p def predict_log_proba(self, X): """Predict class log-probabilities for X. @@ -388,11 +479,21 @@ def predict_log_proba(self, X): Returns ------- - p : array of shape = [n_samples] + p : array of shape = [n_samples, n_classes], or a list of n_outputs + such arrays if n_outputs > 1. The class log-probabilities of the input samples. Classes are ordered by arithmetical order. """ - return np.log(self.predict_proba(X)) + proba = self.predict_proba(X) + + if self.n_outputs_ == 1: + return np.log(proba) + + else: + for k in xrange(self.n_outputs_): + proba[k] = np.log(proba[k]) + + return proba class ForestRegressor(BaseForest, RegressorMixin): @@ -437,7 +538,7 @@ def predict(self, X): Returns ------- - y: array of shape = [n_samples] + y: array of shape = [n_samples] or [n_samples, n_outputs] The predicted values. """ # Check data diff --git a/sklearn/ensemble/gradient_boosting.py b/sklearn/ensemble/gradient_boosting.py index dcaee074c37a9..0579f3da5134f 100644 --- a/sklearn/ensemble/gradient_boosting.py +++ b/sklearn/ensemble/gradient_boosting.py @@ -177,7 +177,7 @@ def update_terminal_regions(self, tree, X, y, residual, y_pred, y_pred[:, k]) # update predictions (both in-bag and out-of-bag) - y_pred[:, k] += learn_rate * tree.value[:, 0].take(terminal_regions, + y_pred[:, k] += learn_rate * tree.value[:, 0, 0].take(terminal_regions, axis=0) @abstractmethod @@ -239,8 +239,8 @@ def _update_terminal_region(self, tree, terminal_regions, leaf, X, y, residual, pred): """LAD updates terminal regions to median estimates. """ terminal_region = np.where(terminal_regions == leaf)[0] - tree.value[leaf, 0] = np.median(y.take(terminal_region, axis=0) - \ - pred.take(terminal_region, axis=0)) + tree.value[leaf, 0, 0] = np.median(y.take(terminal_region, axis=0) - \ + pred.take(terminal_region, axis=0)) class HuberLossFunction(RegressionLossFunction): @@ -364,9 +364,9 @@ def _update_terminal_region(self, tree, terminal_regions, leaf, X, y, denominator = np.sum((y - residual) * (1 - y + residual)) if denominator == 0.0: - tree.value[leaf, 0] = 0.0 + tree.value[leaf, 0, 0] = 0.0 else: - tree.value[leaf, 0] = numerator / denominator + tree.value[leaf, 0, 0] = numerator / denominator class MultinomialDeviance(LossFunction): @@ -414,9 +414,9 @@ def _update_terminal_region(self, tree, terminal_regions, leaf, X, y, denominator = np.sum((y - residual) * (1.0 - y + residual)) if denominator == 0.0: - tree.value[leaf, 0] = 0.0 + tree.value[leaf, 0, 0] = 0.0 else: - tree.value[leaf, 0] = numerator / denominator + tree.value[leaf, 0, 0] = numerator / denominator LOSS_FUNCTIONS = {'ls': LeastSquaresError, @@ -491,8 +491,8 @@ def fit_stage(self, i, X, X_argsorted, y, y_pred, sample_mask): residual = loss.negative_gradient(y, y_pred, k=k) # induce regression tree on residuals - tree = Tree(1, self.n_features) - tree.build(X, residual, MSE(), self.max_depth, + tree = Tree(1, self.n_features, 1) + tree.build(X, residual[:, np.newaxis], MSE(1), self.max_depth, self.min_samples_split, self.min_samples_leaf, 0.0, self.max_features, self.random_state, _find_best_split, sample_mask, X_argsorted) diff --git a/sklearn/ensemble/tests/test_forest.py b/sklearn/ensemble/tests/test_forest.py index 0259c289273cf..3aed8c73fb96f 100644 --- a/sklearn/ensemble/tests/test_forest.py +++ b/sklearn/ensemble/tests/test_forest.py @@ -260,7 +260,7 @@ def test_pickle(): import pickle # Random forest - obj = RandomForestClassifier() + obj = RandomForestClassifier(random_state=0) obj.fit(iris.data, iris.target) score = obj.score(iris.data, iris.target) s = pickle.dumps(obj) @@ -270,7 +270,7 @@ def test_pickle(): score2 = obj2.score(iris.data, iris.target) assert_true(score == score2) - obj = RandomForestRegressor() + obj = RandomForestRegressor(random_state=0) obj.fit(boston.data, boston.target) score = obj.score(boston.data, boston.target) s = pickle.dumps(obj) @@ -281,7 +281,7 @@ def test_pickle(): assert_true(score == score2) # Extra-trees - obj = ExtraTreesClassifier() + obj = ExtraTreesClassifier(random_state=0) obj.fit(iris.data, iris.target) score = obj.score(iris.data, iris.target) s = pickle.dumps(obj) @@ -291,7 +291,7 @@ def test_pickle(): score2 = obj2.score(iris.data, iris.target) assert_true(score == score2) - obj = ExtraTreesRegressor() + obj = ExtraTreesRegressor(random_state=0) obj.fit(boston.data, boston.target) score = obj.score(boston.data, boston.target) s = pickle.dumps(obj) @@ -302,6 +302,61 @@ def test_pickle(): assert_true(score == score2) +def test_multioutput(): + """Check estimators on multi-output problems.""" + + X = [[-2, -1], + [-1, -1], + [-1, -2], + [1, 1], + [1, 2], + [2, 1], + [-2, 1], + [-1, 1], + [-1, 2], + [2, -1], + [1, -1], + [1, -2]] + + y = [[-1, 0], + [-1, 0], + [-1, 0], + [1, 1], + [1, 1], + [1, 1], + [-1, 2], + [-1, 2], + [-1, 2], + [1, 3], + [1, 3], + [1, 3]] + + T = [[-1, -1], [1, 1], [-1, 1], [1, -1]] + y_true = [[-1, 0], [1, 1], [-1, 2], [1, 3]] + + # toy classification problem + clf = ExtraTreesClassifier(random_state=0) + y_hat = clf.fit(X, y).predict(T) + assert_array_equal(y_hat, y_true) + assert_equal(y_hat.shape, (4, 2)) + + proba = clf.predict_proba(T) + assert_equal(len(proba), 2) + assert_equal(proba[0].shape, (4, 2)) + assert_equal(proba[1].shape, (4, 4)) + + log_proba = clf.predict_log_proba(T) + assert_equal(len(log_proba), 2) + assert_equal(log_proba[0].shape, (4, 2)) + assert_equal(log_proba[1].shape, (4, 4)) + + # toy regression problem + clf = ExtraTreesRegressor(random_state=5) + y_hat = clf.fit(X, y).predict(T) + assert_almost_equal(y_hat, y_true) + assert_equal(y_hat.shape, (4, 2)) + + if __name__ == "__main__": import nose nose.runmodule() diff --git a/sklearn/tree/_tree.c b/sklearn/tree/_tree.c index ddc9c6a2d0c6b..02359faf1f29d 100644 --- a/sklearn/tree/_tree.c +++ b/sklearn/tree/_tree.c @@ -1,4 +1,4 @@ -/* Generated by Cython 0.16 on Tue Jun 26 14:21:54 2012 */ +/* Generated by Cython 0.16 on Mon Jul 9 17:29:13 2012 */ #define PY_SSIZE_T_CLEAN #include "Python.h" @@ -621,7 +621,7 @@ typedef __pyx_t_5numpy_float32_t __pyx_t_7sklearn_4tree_5_tree_DTYPE_t; * ctypedef np.float32_t DTYPE_t * ctypedef np.int8_t BOOL_t # <<<<<<<<<<<<<< * - * cdef extern from "math.h": + * cdef extern from "stdlib.h": */ typedef __pyx_t_5numpy_int8_t __pyx_t_7sklearn_4tree_5_tree_BOOL_t; #if CYTHON_CCOMPLEX @@ -689,7 +689,7 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; */ typedef npy_cdouble __pyx_t_5numpy_complex_t; -/* "sklearn/tree/_tree.pyx":40 +/* "sklearn/tree/_tree.pyx":47 * # be the proportion of class k observations in node m * * cdef class Criterion: # <<<<<<<<<<<<<< @@ -702,7 +702,7 @@ struct __pyx_obj_7sklearn_4tree_5_tree_Criterion { }; -/* "sklearn/tree/_tree.pyx":67 +/* "sklearn/tree/_tree.pyx":81 * * * cdef class ClassificationCriterion(Criterion): # <<<<<<<<<<<<<< @@ -711,21 +711,20 @@ struct __pyx_obj_7sklearn_4tree_5_tree_Criterion { */ struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion { struct __pyx_obj_7sklearn_4tree_5_tree_Criterion __pyx_base; - int n_classes; + int n_outputs; + int *n_classes; int n_samples; + int label_count_stride; int *label_count_left; int *label_count_right; int *label_count_init; int n_left; int n_right; - PyObject *ndarray_label_count_left; - PyObject *ndarray_label_count_right; - PyObject *ndarray_label_count_init; }; -/* "sklearn/tree/_tree.pyx":181 - * +/* "sklearn/tree/_tree.pyx":255 + * return value * * cdef class Gini(ClassificationCriterion): # <<<<<<<<<<<<<< * """Gini Index splitting criteria. @@ -736,7 +735,7 @@ struct __pyx_obj_7sklearn_4tree_5_tree_Gini { }; -/* "sklearn/tree/_tree.pyx":217 +/* "sklearn/tree/_tree.pyx":306 * * * cdef class Entropy(ClassificationCriterion): # <<<<<<<<<<<<<< @@ -748,7 +747,7 @@ struct __pyx_obj_7sklearn_4tree_5_tree_Entropy { }; -/* "sklearn/tree/_tree.pyx":245 +/* "sklearn/tree/_tree.pyx":348 * * * cdef class RegressionCriterion(Criterion): # <<<<<<<<<<<<<< @@ -757,21 +756,22 @@ struct __pyx_obj_7sklearn_4tree_5_tree_Entropy { */ struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion { struct __pyx_obj_7sklearn_4tree_5_tree_Criterion __pyx_base; + int n_outputs; int n_samples; + double *mean_left; + double *mean_right; + double *mean_init; + double *sq_sum_left; + double *sq_sum_right; + double *sq_sum_init; + double *var_left; + double *var_right; int n_right; int n_left; - double mean_left; - double mean_right; - double mean_init; - double sq_sum_right; - double sq_sum_left; - double sq_sum_init; - double var_left; - double var_right; }; -/* "sklearn/tree/_tree.pyx":394 +/* "sklearn/tree/_tree.pyx":576 * * * cdef class MSE(RegressionCriterion): # <<<<<<<<<<<<<< @@ -784,7 +784,7 @@ struct __pyx_obj_7sklearn_4tree_5_tree_MSE { -/* "sklearn/tree/_tree.pyx":40 +/* "sklearn/tree/_tree.pyx":47 * # be the proportion of class k observations in node m * * cdef class Criterion: # <<<<<<<<<<<<<< @@ -793,16 +793,16 @@ struct __pyx_obj_7sklearn_4tree_5_tree_MSE { */ struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion { - void (*init)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *, int, int); + void (*init)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *, int, int); void (*reset)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *); - int (*update)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int, int, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *); + int (*update)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int, int, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int, int *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *); double (*eval)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *); PyArrayObject *(*init_value)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int __pyx_skip_dispatch); }; static struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *__pyx_vtabptr_7sklearn_4tree_5_tree_Criterion; -/* "sklearn/tree/_tree.pyx":245 +/* "sklearn/tree/_tree.pyx":348 * * * cdef class RegressionCriterion(Criterion): # <<<<<<<<<<<<<< @@ -816,7 +816,7 @@ struct __pyx_vtabstruct_7sklearn_4tree_5_tree_RegressionCriterion { static struct __pyx_vtabstruct_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_vtabptr_7sklearn_4tree_5_tree_RegressionCriterion; -/* "sklearn/tree/_tree.pyx":394 +/* "sklearn/tree/_tree.pyx":576 * * * cdef class MSE(RegressionCriterion): # <<<<<<<<<<<<<< @@ -830,7 +830,7 @@ struct __pyx_vtabstruct_7sklearn_4tree_5_tree_MSE { static struct __pyx_vtabstruct_7sklearn_4tree_5_tree_MSE *__pyx_vtabptr_7sklearn_4tree_5_tree_MSE; -/* "sklearn/tree/_tree.pyx":67 +/* "sklearn/tree/_tree.pyx":81 * * * cdef class ClassificationCriterion(Criterion): # <<<<<<<<<<<<<< @@ -844,8 +844,8 @@ struct __pyx_vtabstruct_7sklearn_4tree_5_tree_ClassificationCriterion { static struct __pyx_vtabstruct_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_vtabptr_7sklearn_4tree_5_tree_ClassificationCriterion; -/* "sklearn/tree/_tree.pyx":181 - * +/* "sklearn/tree/_tree.pyx":255 + * return value * * cdef class Gini(ClassificationCriterion): # <<<<<<<<<<<<<< * """Gini Index splitting criteria. @@ -858,7 +858,7 @@ struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Gini { static struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Gini *__pyx_vtabptr_7sklearn_4tree_5_tree_Gini; -/* "sklearn/tree/_tree.pyx":217 +/* "sklearn/tree/_tree.pyx":306 * * * cdef class Entropy(ClassificationCriterion): # <<<<<<<<<<<<<< @@ -924,34 +924,105 @@ static struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Entropy *__pyx_vtabptr_7skl #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) -static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ - static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ + static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \ const char* function_name); /*proto*/ -static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, - Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +#define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ + __Pyx_GetItemInt_List_Fast(o, i) : \ + __Pyx_GetItemInt_Generic(o, to_py_func(i))) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) { + if (likely(o != Py_None)) { + if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) { + PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i); + Py_INCREF(r); + return r; + } + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} +#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ + __Pyx_GetItemInt_Tuple_Fast(o, i) : \ + __Pyx_GetItemInt_Generic(o, to_py_func(i))) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) { + if (likely(o != Py_None)) { + if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) { + PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i); + Py_INCREF(r); + return r; + } + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} +#define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ + __Pyx_GetItemInt_Fast(o, i) : \ + __Pyx_GetItemInt_Generic(o, to_py_func(i))) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) { + if (PyList_CheckExact(o)) { + Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (likely(i >= 0)) { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_item)) { + return m->sq_item(o, i); + } + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ -static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); /*proto*/ - #define __Pyx_BufPtrCContig1d(type, buf, i0, s0) ((type)buf + i0) static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact); /*proto*/ -#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) #define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) +#define __Pyx_BufPtrStrided3d(type, buf, i0, s0, i1, s1, i2, s2) (type)((char*)buf + i0 * s0 + i1 * s1 + i2 * s2) static void __Pyx_RaiseBufferFallbackError(void); /*proto*/ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/ @@ -990,8 +1061,6 @@ static Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1}; static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/ -static CYTHON_INLINE npy_int32 __Pyx_PyInt_from_py_npy_int32(PyObject *); - #if CYTHON_CCOMPLEX #ifdef __cplusplus #define __Pyx_CREAL(z) ((z).real()) @@ -1187,24 +1256,26 @@ static PyTypeObject *__pyx_ptype_7sklearn_4tree_5_tree_Gini = 0; static PyTypeObject *__pyx_ptype_7sklearn_4tree_5_tree_Entropy = 0; static PyTypeObject *__pyx_ptype_7sklearn_4tree_5_tree_RegressionCriterion = 0; static PyTypeObject *__pyx_ptype_7sklearn_4tree_5_tree_MSE = 0; +static __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_v_7sklearn_4tree_5_tree_INFINITY; static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *, int); /*proto*/ -static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t = { "int32_t", NULL, sizeof(__pyx_t_5numpy_int32_t), { 0 }, 0, 'I', IS_UNSIGNED(__pyx_t_5numpy_int32_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t = { "DTYPE_t", NULL, sizeof(__pyx_t_7sklearn_4tree_5_tree_DTYPE_t), { 0 }, 0, 'R', 0, 0 }; static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), { 0 }, 0, 'R', 0, 0 }; static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_BOOL_t = { "BOOL_t", NULL, sizeof(__pyx_t_7sklearn_4tree_5_tree_BOOL_t), { 0 }, 0, 'I', IS_UNSIGNED(__pyx_t_7sklearn_4tree_5_tree_BOOL_t), 0 }; -static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t = { "DTYPE_t", NULL, sizeof(__pyx_t_7sklearn_4tree_5_tree_DTYPE_t), { 0 }, 0, 'R', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t = { "int32_t", NULL, sizeof(__pyx_t_5numpy_int32_t), { 0 }, 0, 'I', IS_UNSIGNED(__pyx_t_5numpy_int32_t), 0 }; #define __Pyx_MODULE_NAME "sklearn.tree._tree" int __pyx_module_is_main_sklearn__tree___tree = 0; /* Implementation of 'sklearn.tree._tree' */ -static PyObject *__pyx_builtin_range; -static PyObject *__pyx_builtin_xrange; static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_RuntimeError; static PyObject *__pyx_pf_7sklearn_4tree_5_tree_9Criterion_init_value(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *__pyx_v_self); /* proto */ -static int __pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion___init__(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self, int __pyx_v_n_classes); /* proto */ -static PyObject *__pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion_2init_value(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self); /* proto */ -static int __pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion___init__(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion_2init_value(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self); /* proto */ +static int __pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion___init__(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self, int __pyx_v_n_outputs, PyObject *__pyx_v_n_classes); /* proto */ +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion_2__del__(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion_4init_value(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self); /* proto */ +static int __pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion___init__(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self, int __pyx_v_n_outputs); /* proto */ +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion_2__del__(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion_4init_value(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_5_tree__random_sample_mask(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_n_total_samples, int __pyx_v_n_total_in_bag, PyObject *__pyx_v_random_state); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_2_apply_tree(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_children, PyArrayObject *__pyx_v_feature, PyArrayObject *__pyx_v_threshold, PyArrayObject *__pyx_v_out); /* proto */ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4_predict_tree(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_children, PyArrayObject *__pyx_v_feature, PyArrayObject *__pyx_v_threshold, PyArrayObject *__pyx_v_values, PyArrayObject *__pyx_v_pred); /* proto */ @@ -1219,16 +1290,14 @@ static char __pyx_k_5[] = "Non-native byte order not supported"; static char __pyx_k_7[] = "unknown dtype code in numpy.pxd (%d)"; static char __pyx_k_8[] = "Format string allocated too short, see comment in numpy.pxd"; static char __pyx_k_11[] = "Format string allocated too short."; -static char __pyx_k_15[] = "/home/pprett/workspace/scikit-learn/sklearn/tree/_tree.pyx"; +static char __pyx_k_15[] = "/home/gilles/Sources/scikit-learn/sklearn/tree/_tree.pyx"; static char __pyx_k_16[] = "sklearn.tree._tree"; static char __pyx_k_23[] = "X_argsorted_elem_stride"; static char __pyx_k_24[] = "X_argsorted_col_stride"; static char __pyx_k_29[] = "_find_best_random_split"; static char __pyx_k__B[] = "B"; -static char __pyx_k__C[] = "C"; static char __pyx_k__H[] = "H"; static char __pyx_k__I[] = "I"; -static char __pyx_k__K[] = "K"; static char __pyx_k__L[] = "L"; static char __pyx_k__O[] = "O"; static char __pyx_k__Q[] = "Q"; @@ -1263,7 +1332,6 @@ static char __pyx_k__dtype[] = "dtype"; static char __pyx_k__error[] = "error"; static char __pyx_k__int32[] = "int32"; static char __pyx_k__numpy[] = "numpy"; -static char __pyx_k__order[] = "order"; static char __pyx_k__range[] = "range"; static char __pyx_k__y_ptr[] = "y_ptr"; static char __pyx_k__zeros[] = "zeros"; @@ -1273,8 +1341,6 @@ static char __pyx_k__best_i[] = "best_i"; static char __pyx_k__best_t[] = "best_t"; static char __pyx_k__n_left[] = "n_left"; static char __pyx_k__values[] = "values"; -static char __pyx_k__xrange[] = "xrange"; -static char __pyx_k__asarray[] = "asarray"; static char __pyx_k__feature[] = "feature"; static char __pyx_k__float32[] = "float32"; static char __pyx_k__node_id[] = "node_id"; @@ -1285,8 +1351,10 @@ static char __pyx_k__children[] = "children"; static char __pyx_k__features[] = "features"; static char __pyx_k__min_leaf[] = "min_leaf"; static char __pyx_k__n_bagged[] = "n_bagged"; +static char __pyx_k__y_stride[] = "y_stride"; static char __pyx_k__criterion[] = "criterion"; static char __pyx_k__n_classes[] = "n_classes"; +static char __pyx_k__n_outputs[] = "n_outputs"; static char __pyx_k__n_samples[] = "n_samples"; static char __pyx_k__threshold[] = "threshold"; static char __pyx_k__ValueError[] = "ValueError"; @@ -1324,9 +1392,7 @@ static PyObject *__pyx_kp_u_3; static PyObject *__pyx_kp_u_5; static PyObject *__pyx_kp_u_7; static PyObject *__pyx_kp_u_8; -static PyObject *__pyx_n_s__C; static PyObject *__pyx_n_s__DTYPE; -static PyObject *__pyx_n_s__K; static PyObject *__pyx_n_s__RuntimeError; static PyObject *__pyx_n_s__ValueError; static PyObject *__pyx_n_s__X; @@ -1346,7 +1412,6 @@ static PyObject *__pyx_n_s___predict_tree; static PyObject *__pyx_n_s___random_sample_mask; static PyObject *__pyx_n_s__a; static PyObject *__pyx_n_s__arange; -static PyObject *__pyx_n_s__asarray; static PyObject *__pyx_n_s__astype; static PyObject *__pyx_n_s__b; static PyObject *__pyx_n_s__best_error; @@ -1376,13 +1441,13 @@ static PyObject *__pyx_n_s__n_bagged; static PyObject *__pyx_n_s__n_classes; static PyObject *__pyx_n_s__n_features; static PyObject *__pyx_n_s__n_left; +static PyObject *__pyx_n_s__n_outputs; static PyObject *__pyx_n_s__n_samples; static PyObject *__pyx_n_s__n_total_in_bag; static PyObject *__pyx_n_s__n_total_samples; static PyObject *__pyx_n_s__node_id; static PyObject *__pyx_n_s__np; static PyObject *__pyx_n_s__numpy; -static PyObject *__pyx_n_s__order; static PyObject *__pyx_n_s__out; static PyObject *__pyx_n_s__permutation; static PyObject *__pyx_n_s__pred; @@ -1394,10 +1459,11 @@ static PyObject *__pyx_n_s__sample_mask_ptr; static PyObject *__pyx_n_s__t; static PyObject *__pyx_n_s__threshold; static PyObject *__pyx_n_s__values; -static PyObject *__pyx_n_s__xrange; static PyObject *__pyx_n_s__y; static PyObject *__pyx_n_s__y_ptr; +static PyObject *__pyx_n_s__y_stride; static PyObject *__pyx_n_s__zeros; +static PyObject *__pyx_int_1; static PyObject *__pyx_int_15; static PyObject *__pyx_k_tuple_2; static PyObject *__pyx_k_tuple_4; @@ -1418,22 +1484,22 @@ static PyObject *__pyx_k_codeobj_22; static PyObject *__pyx_k_codeobj_26; static PyObject *__pyx_k_codeobj_28; -/* "sklearn/tree/_tree.pyx":43 +/* "sklearn/tree/_tree.pyx":50 * """Interface for splitting criteria (regression and classification)""" * - * cdef void init(self, DTYPE_t *y, BOOL_t *sample_mask, int n_samples, # <<<<<<<<<<<<<< - * int n_total_samples): - * """Initialise the criterion class for new split point.""" + * cdef void init(self, DTYPE_t* y, # <<<<<<<<<<<<<< + * int y_stride, + * BOOL_t* sample_mask, */ -static void __pyx_f_7sklearn_4tree_5_tree_9Criterion_init(CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *__pyx_v_self, CYTHON_UNUSED __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, CYTHON_UNUSED __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask, CYTHON_UNUSED int __pyx_v_n_samples, CYTHON_UNUSED int __pyx_v_n_total_samples) { +static void __pyx_f_7sklearn_4tree_5_tree_9Criterion_init(CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *__pyx_v_self, CYTHON_UNUSED __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, CYTHON_UNUSED int __pyx_v_y_stride, CYTHON_UNUSED __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask, CYTHON_UNUSED int __pyx_v_n_samples, CYTHON_UNUSED int __pyx_v_n_total_samples) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("init", 0); __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_tree.pyx":48 +/* "sklearn/tree/_tree.pyx":58 * pass * * cdef void reset(self): # <<<<<<<<<<<<<< @@ -1448,15 +1514,15 @@ static void __pyx_f_7sklearn_4tree_5_tree_9Criterion_reset(CYTHON_UNUSED struct __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_tree.pyx":52 +/* "sklearn/tree/_tree.pyx":62 * pass * - * cdef int update(self, int a, int b, DTYPE_t *y, int *X_argsorted_i, # <<<<<<<<<<<<<< - * BOOL_t *sample_mask): - * """Update the criteria for each value in interval [a,b) (where a and b + * cdef int update(self, int a, # <<<<<<<<<<<<<< + * int b, + * DTYPE_t* y, */ -static int __pyx_f_7sklearn_4tree_5_tree_9Criterion_update(CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *__pyx_v_self, CYTHON_UNUSED int __pyx_v_a, CYTHON_UNUSED int __pyx_v_b, CYTHON_UNUSED __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, CYTHON_UNUSED int *__pyx_v_X_argsorted_i, CYTHON_UNUSED __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask) { +static int __pyx_f_7sklearn_4tree_5_tree_9Criterion_update(CYTHON_UNUSED struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *__pyx_v_self, CYTHON_UNUSED int __pyx_v_a, CYTHON_UNUSED int __pyx_v_b, CYTHON_UNUSED __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, CYTHON_UNUSED int __pyx_v_y_stride, CYTHON_UNUSED int *__pyx_v_X_argsorted_i, CYTHON_UNUSED __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("update", 0); @@ -1466,7 +1532,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_9Criterion_update(CYTHON_UNUSED struct return __pyx_r; } -/* "sklearn/tree/_tree.pyx":58 +/* "sklearn/tree/_tree.pyx":72 * pass * * cdef double eval(self): # <<<<<<<<<<<<<< @@ -1484,7 +1550,7 @@ static double __pyx_f_7sklearn_4tree_5_tree_9Criterion_eval(CYTHON_UNUSED struct return __pyx_r; } -/* "sklearn/tree/_tree.pyx":62 +/* "sklearn/tree/_tree.pyx":76 * pass * * cpdef np.ndarray init_value(self): # <<<<<<<<<<<<<< @@ -1506,13 +1572,13 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_9Criterion_init_value(CYTHON if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { - __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__init_value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__init_value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __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_9Criterion_1init_value)) { __Pyx_XDECREF(((PyObject *)__pyx_r)); - __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __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 = 76; __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; @@ -1521,7 +1587,7 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_9Criterion_init_value(CYTHON __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } - /* "sklearn/tree/_tree.pyx":64 + /* "sklearn/tree/_tree.pyx":78 * cpdef np.ndarray init_value(self): * """Get the init value of the criterion - `init` must be called before.""" * pass # <<<<<<<<<<<<<< @@ -1554,7 +1620,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_9Criterion_1init_value(PyObject return __pyx_r; } -/* "sklearn/tree/_tree.pyx":62 +/* "sklearn/tree/_tree.pyx":76 * pass * * cpdef np.ndarray init_value(self): # <<<<<<<<<<<<<< @@ -1571,7 +1637,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_9Criterion_init_value(struct __p int __pyx_clineno = 0; __Pyx_RefNannySetupContext("init_value", 0); __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_self->__pyx_vtab)->init_value(__pyx_v_self, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_self->__pyx_vtab)->init_value(__pyx_v_self, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -1592,17 +1658,19 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_9Criterion_init_value(struct __p /* Python wrapper */ static int __pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - int __pyx_v_n_classes; - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__n_classes,0}; + int __pyx_v_n_outputs; + PyObject *__pyx_v_n_classes = 0; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__n_outputs,&__pyx_n_s__n_classes,0}; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { - PyObject* values[1] = {0}; + PyObject* values[2] = {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 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; @@ -1610,396 +1678,381 @@ static int __pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_1__init__(Py kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: - values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_classes); + values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_outputs); if (likely(values[0])) kw_args--; else goto __pyx_L5_argtuple_error; + case 1: + values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_classes); + if (likely(values[1])) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } - } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { + } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } - __pyx_v_n_classes = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_n_classes == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_n_outputs = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_n_outputs == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_n_classes = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree.ClassificationCriterion.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion___init__(((struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *)__pyx_v_self), __pyx_v_n_classes); + __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion___init__(((struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *)__pyx_v_self), __pyx_v_n_outputs, __pyx_v_n_classes); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "sklearn/tree/_tree.pyx":107 - * cdef ndarray_label_count_init +/* "sklearn/tree/_tree.pyx":120 + * cdef int n_right + * + * def __init__(self, int n_outputs, object n_classes): # <<<<<<<<<<<<<< + * cdef int k = 0 * - * def __init__(self, int n_classes): # <<<<<<<<<<<<<< - * cdef np.ndarray[np.int32_t, ndim=1] ndarray_label_count_left \ - * = np.zeros((n_classes,), dtype=np.int32, order='C') */ -static int __pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion___init__(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self, int __pyx_v_n_classes) { - PyArrayObject *__pyx_v_ndarray_label_count_left = 0; - PyArrayObject *__pyx_v_ndarray_label_count_right = 0; - PyArrayObject *__pyx_v_ndarray_label_count_init = 0; - __Pyx_LocalBuf_ND __pyx_pybuffernd_ndarray_label_count_init; - __Pyx_Buffer __pyx_pybuffer_ndarray_label_count_init; - __Pyx_LocalBuf_ND __pyx_pybuffernd_ndarray_label_count_left; - __Pyx_Buffer __pyx_pybuffer_ndarray_label_count_left; - __Pyx_LocalBuf_ND __pyx_pybuffernd_ndarray_label_count_right; - __Pyx_Buffer __pyx_pybuffer_ndarray_label_count_right; +static int __pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion___init__(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self, int __pyx_v_n_outputs, PyObject *__pyx_v_n_classes) { + int __pyx_v_k; + int __pyx_v_label_count_stride; int __pyx_r; __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; + int __pyx_t_1; PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; + int __pyx_t_3; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; - PyArrayObject *__pyx_t_6 = NULL; - PyArrayObject *__pyx_t_7 = NULL; - PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 0); - __pyx_pybuffer_ndarray_label_count_left.pybuffer.buf = NULL; - __pyx_pybuffer_ndarray_label_count_left.refcount = 0; - __pyx_pybuffernd_ndarray_label_count_left.data = NULL; - __pyx_pybuffernd_ndarray_label_count_left.rcbuffer = &__pyx_pybuffer_ndarray_label_count_left; - __pyx_pybuffer_ndarray_label_count_right.pybuffer.buf = NULL; - __pyx_pybuffer_ndarray_label_count_right.refcount = 0; - __pyx_pybuffernd_ndarray_label_count_right.data = NULL; - __pyx_pybuffernd_ndarray_label_count_right.rcbuffer = &__pyx_pybuffer_ndarray_label_count_right; - __pyx_pybuffer_ndarray_label_count_init.pybuffer.buf = NULL; - __pyx_pybuffer_ndarray_label_count_init.refcount = 0; - __pyx_pybuffernd_ndarray_label_count_init.data = NULL; - __pyx_pybuffernd_ndarray_label_count_init.rcbuffer = &__pyx_pybuffer_ndarray_label_count_init; - - /* "sklearn/tree/_tree.pyx":109 - * def __init__(self, int n_classes): - * cdef np.ndarray[np.int32_t, ndim=1] ndarray_label_count_left \ - * = np.zeros((n_classes,), dtype=np.int32, order='C') # <<<<<<<<<<<<<< - * cdef np.ndarray[np.int32_t, ndim=1] ndarray_label_count_right \ - * = np.zeros((n_classes,), dtype=np.int32, order='C') - */ - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyInt_FromLong(__pyx_v_n_classes); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __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 = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); - __Pyx_GIVEREF(__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 = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_3)); - __Pyx_GIVEREF(((PyObject *)__pyx_t_3)); - __pyx_t_3 = 0; - __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_3)); - __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__dtype), __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__C)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_5 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 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 = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_6 = ((PyArrayObject *)__pyx_t_5); - { - __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_ndarray_label_count_left.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { - __pyx_v_ndarray_label_count_left = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_ndarray_label_count_left.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } else {__pyx_pybuffernd_ndarray_label_count_left.diminfo[0].strides = __pyx_pybuffernd_ndarray_label_count_left.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_ndarray_label_count_left.diminfo[0].shape = __pyx_pybuffernd_ndarray_label_count_left.rcbuffer->pybuffer.shape[0]; - } - } - __pyx_t_6 = 0; - __pyx_v_ndarray_label_count_left = ((PyArrayObject *)__pyx_t_5); - __pyx_t_5 = 0; - /* "sklearn/tree/_tree.pyx":111 - * = np.zeros((n_classes,), dtype=np.int32, order='C') - * cdef np.ndarray[np.int32_t, ndim=1] ndarray_label_count_right \ - * = np.zeros((n_classes,), dtype=np.int32, order='C') # <<<<<<<<<<<<<< - * cdef np.ndarray[np.int32_t, ndim=1] ndarray_label_count_init \ - * = np.zeros((n_classes,), dtype=np.int32, order='C') + /* "sklearn/tree/_tree.pyx":121 + * + * def __init__(self, int n_outputs, object n_classes): + * cdef int k = 0 # <<<<<<<<<<<<<< + * + * self.n_outputs = n_outputs */ - __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_3 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__zeros); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyInt_FromLong(__pyx_v_n_classes); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5); - __Pyx_GIVEREF(__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 = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1)); - __Pyx_GIVEREF(((PyObject *)__pyx_t_1)); - __pyx_t_1 = 0; - __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_1)); - __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__int32); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__dtype), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__C)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_5), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; - __Pyx_DECREF(((PyObject *)__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 = 111; __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_ndarray_label_count_right.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { - __pyx_v_ndarray_label_count_right = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_ndarray_label_count_right.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } else {__pyx_pybuffernd_ndarray_label_count_right.diminfo[0].strides = __pyx_pybuffernd_ndarray_label_count_right.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_ndarray_label_count_right.diminfo[0].shape = __pyx_pybuffernd_ndarray_label_count_right.rcbuffer->pybuffer.shape[0]; - } - } - __pyx_t_7 = 0; - __pyx_v_ndarray_label_count_right = ((PyArrayObject *)__pyx_t_4); - __pyx_t_4 = 0; + __pyx_v_k = 0; - /* "sklearn/tree/_tree.pyx":113 - * = np.zeros((n_classes,), dtype=np.int32, order='C') - * cdef np.ndarray[np.int32_t, ndim=1] ndarray_label_count_init \ - * = np.zeros((n_classes,), dtype=np.int32, order='C') # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":123 + * cdef int k = 0 * - * self.n_classes = n_classes + * self.n_outputs = n_outputs # <<<<<<<<<<<<<< + * self.n_classes = calloc(n_outputs, sizeof(int)) + * cdef int label_count_stride = -1 */ - __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_1 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__zeros); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = PyInt_FromLong(__pyx_v_n_classes); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); - __Pyx_GIVEREF(__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 = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_5)); - __Pyx_GIVEREF(((PyObject *)__pyx_t_5)); - __pyx_t_5 = 0; - __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_5)); - __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__int32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__dtype), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__C)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 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 = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_8 = ((PyArrayObject *)__pyx_t_2); - { - __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_ndarray_label_count_init.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { - __pyx_v_ndarray_label_count_init = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_ndarray_label_count_init.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } else {__pyx_pybuffernd_ndarray_label_count_init.diminfo[0].strides = __pyx_pybuffernd_ndarray_label_count_init.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_ndarray_label_count_init.diminfo[0].shape = __pyx_pybuffernd_ndarray_label_count_init.rcbuffer->pybuffer.shape[0]; + __pyx_v_self->n_outputs = __pyx_v_n_outputs; + + /* "sklearn/tree/_tree.pyx":124 + * + * self.n_outputs = n_outputs + * self.n_classes = calloc(n_outputs, sizeof(int)) # <<<<<<<<<<<<<< + * cdef int label_count_stride = -1 + * + */ + __pyx_v_self->n_classes = ((int *)calloc(__pyx_v_n_outputs, (sizeof(int)))); + + /* "sklearn/tree/_tree.pyx":125 + * self.n_outputs = n_outputs + * self.n_classes = calloc(n_outputs, sizeof(int)) + * cdef int label_count_stride = -1 # <<<<<<<<<<<<<< + * + * for k from 0 <= k < n_outputs: + */ + __pyx_v_label_count_stride = -1; + + /* "sklearn/tree/_tree.pyx":127 + * cdef int label_count_stride = -1 + * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * self.n_classes[k] = n_classes[k] + * + */ + __pyx_t_1 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_1; __pyx_v_k++) { + + /* "sklearn/tree/_tree.pyx":128 + * + * for k from 0 <= k < n_outputs: + * self.n_classes[k] = n_classes[k] # <<<<<<<<<<<<<< + * + * if n_classes[k] > label_count_stride: + */ + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_n_classes, __pyx_v_k, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + (__pyx_v_self->n_classes[__pyx_v_k]) = __pyx_t_3; + + /* "sklearn/tree/_tree.pyx":130 + * self.n_classes[k] = n_classes[k] + * + * if n_classes[k] > label_count_stride: # <<<<<<<<<<<<<< + * label_count_stride = n_classes[k] + * + */ + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_n_classes, __pyx_v_k, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = PyInt_FromLong(__pyx_v_label_count_stride); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_GT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __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_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_6) { + + /* "sklearn/tree/_tree.pyx":131 + * + * if n_classes[k] > label_count_stride: + * label_count_stride = n_classes[k] # <<<<<<<<<<<<<< + * + * self.label_count_stride = label_count_stride + */ + __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_n_classes, __pyx_v_k, sizeof(int), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_label_count_stride = __pyx_t_3; + goto __pyx_L5; } + __pyx_L5:; } - __pyx_t_8 = 0; - __pyx_v_ndarray_label_count_init = ((PyArrayObject *)__pyx_t_2); - __pyx_t_2 = 0; - /* "sklearn/tree/_tree.pyx":115 - * = np.zeros((n_classes,), dtype=np.int32, order='C') + /* "sklearn/tree/_tree.pyx":133 + * label_count_stride = n_classes[k] + * + * self.label_count_stride = label_count_stride # <<<<<<<<<<<<<< + * self.label_count_left = calloc(n_outputs * label_count_stride, sizeof(int)) + * self.label_count_right = calloc(n_outputs * label_count_stride, sizeof(int)) + */ + __pyx_v_self->label_count_stride = __pyx_v_label_count_stride; + + /* "sklearn/tree/_tree.pyx":134 + * + * self.label_count_stride = label_count_stride + * self.label_count_left = calloc(n_outputs * label_count_stride, sizeof(int)) # <<<<<<<<<<<<<< + * self.label_count_right = calloc(n_outputs * label_count_stride, sizeof(int)) + * self.label_count_init = calloc(n_outputs * label_count_stride, sizeof(int)) + */ + __pyx_v_self->label_count_left = ((int *)calloc((__pyx_v_n_outputs * __pyx_v_label_count_stride), (sizeof(int)))); + + /* "sklearn/tree/_tree.pyx":135 + * self.label_count_stride = label_count_stride + * self.label_count_left = calloc(n_outputs * label_count_stride, sizeof(int)) + * self.label_count_right = calloc(n_outputs * label_count_stride, sizeof(int)) # <<<<<<<<<<<<<< + * self.label_count_init = calloc(n_outputs * label_count_stride, sizeof(int)) + * + */ + __pyx_v_self->label_count_right = ((int *)calloc((__pyx_v_n_outputs * __pyx_v_label_count_stride), (sizeof(int)))); + + /* "sklearn/tree/_tree.pyx":136 + * self.label_count_left = calloc(n_outputs * label_count_stride, sizeof(int)) + * self.label_count_right = calloc(n_outputs * label_count_stride, sizeof(int)) + * self.label_count_init = calloc(n_outputs * label_count_stride, sizeof(int)) # <<<<<<<<<<<<<< * - * self.n_classes = n_classes # <<<<<<<<<<<<<< * self.n_samples = 0 - * self.n_left = 0 */ - __pyx_v_self->n_classes = __pyx_v_n_classes; + __pyx_v_self->label_count_init = ((int *)calloc((__pyx_v_n_outputs * __pyx_v_label_count_stride), (sizeof(int)))); - /* "sklearn/tree/_tree.pyx":116 + /* "sklearn/tree/_tree.pyx":138 + * self.label_count_init = calloc(n_outputs * label_count_stride, sizeof(int)) * - * self.n_classes = n_classes * self.n_samples = 0 # <<<<<<<<<<<<<< * self.n_left = 0 * self.n_right = 0 */ __pyx_v_self->n_samples = 0; - /* "sklearn/tree/_tree.pyx":117 - * self.n_classes = n_classes + /* "sklearn/tree/_tree.pyx":139 + * * self.n_samples = 0 * self.n_left = 0 # <<<<<<<<<<<<<< * self.n_right = 0 - * self.label_count_left = ndarray_label_count_left.data + * */ __pyx_v_self->n_left = 0; - /* "sklearn/tree/_tree.pyx":118 + /* "sklearn/tree/_tree.pyx":140 * self.n_samples = 0 * self.n_left = 0 * self.n_right = 0 # <<<<<<<<<<<<<< - * self.label_count_left = ndarray_label_count_left.data - * self.label_count_right = ndarray_label_count_right.data + * + * def __del__(self): */ __pyx_v_self->n_right = 0; - /* "sklearn/tree/_tree.pyx":119 - * self.n_left = 0 + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("sklearn.tree._tree.ClassificationCriterion.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion_2__del__(((struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *)__pyx_v_self)); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "sklearn/tree/_tree.pyx":142 * self.n_right = 0 - * self.label_count_left = ndarray_label_count_left.data # <<<<<<<<<<<<<< - * self.label_count_right = ndarray_label_count_right.data - * self.label_count_init = ndarray_label_count_init.data + * + * def __del__(self): # <<<<<<<<<<<<<< + * free(self.n_classes) + * free(self.label_count_left) */ - __pyx_v_self->label_count_left = ((int *)__pyx_v_ndarray_label_count_left->data); - /* "sklearn/tree/_tree.pyx":120 - * self.n_right = 0 - * self.label_count_left = ndarray_label_count_left.data - * self.label_count_right = ndarray_label_count_right.data # <<<<<<<<<<<<<< - * self.label_count_init = ndarray_label_count_init.data - * self.ndarray_label_count_left = ndarray_label_count_left +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion_2__del__(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 0); + + /* "sklearn/tree/_tree.pyx":143 + * + * def __del__(self): + * free(self.n_classes) # <<<<<<<<<<<<<< + * free(self.label_count_left) + * free(self.label_count_right) */ - __pyx_v_self->label_count_right = ((int *)__pyx_v_ndarray_label_count_right->data); + free(__pyx_v_self->n_classes); - /* "sklearn/tree/_tree.pyx":121 - * self.label_count_left = ndarray_label_count_left.data - * self.label_count_right = ndarray_label_count_right.data - * self.label_count_init = ndarray_label_count_init.data # <<<<<<<<<<<<<< - * self.ndarray_label_count_left = ndarray_label_count_left - * self.ndarray_label_count_right = ndarray_label_count_right - */ - __pyx_v_self->label_count_init = ((int *)__pyx_v_ndarray_label_count_init->data); - - /* "sklearn/tree/_tree.pyx":122 - * self.label_count_right = ndarray_label_count_right.data - * self.label_count_init = ndarray_label_count_init.data - * self.ndarray_label_count_left = ndarray_label_count_left # <<<<<<<<<<<<<< - * self.ndarray_label_count_right = ndarray_label_count_right - * self.ndarray_label_count_init = ndarray_label_count_init - */ - __Pyx_INCREF(((PyObject *)__pyx_v_ndarray_label_count_left)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_ndarray_label_count_left)); - __Pyx_GOTREF(__pyx_v_self->ndarray_label_count_left); - __Pyx_DECREF(__pyx_v_self->ndarray_label_count_left); - __pyx_v_self->ndarray_label_count_left = ((PyObject *)__pyx_v_ndarray_label_count_left); + /* "sklearn/tree/_tree.pyx":144 + * def __del__(self): + * free(self.n_classes) + * free(self.label_count_left) # <<<<<<<<<<<<<< + * free(self.label_count_right) + * free(self.label_count_init) + */ + free(__pyx_v_self->label_count_left); - /* "sklearn/tree/_tree.pyx":123 - * self.label_count_init = ndarray_label_count_init.data - * self.ndarray_label_count_left = ndarray_label_count_left - * self.ndarray_label_count_right = ndarray_label_count_right # <<<<<<<<<<<<<< - * self.ndarray_label_count_init = ndarray_label_count_init + /* "sklearn/tree/_tree.pyx":145 + * free(self.n_classes) + * free(self.label_count_left) + * free(self.label_count_right) # <<<<<<<<<<<<<< + * free(self.label_count_init) * */ - __Pyx_INCREF(((PyObject *)__pyx_v_ndarray_label_count_right)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_ndarray_label_count_right)); - __Pyx_GOTREF(__pyx_v_self->ndarray_label_count_right); - __Pyx_DECREF(__pyx_v_self->ndarray_label_count_right); - __pyx_v_self->ndarray_label_count_right = ((PyObject *)__pyx_v_ndarray_label_count_right); + free(__pyx_v_self->label_count_right); - /* "sklearn/tree/_tree.pyx":124 - * self.ndarray_label_count_left = ndarray_label_count_left - * self.ndarray_label_count_right = ndarray_label_count_right - * self.ndarray_label_count_init = ndarray_label_count_init # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":146 + * free(self.label_count_left) + * free(self.label_count_right) + * free(self.label_count_init) # <<<<<<<<<<<<<< * - * cdef void init(self, DTYPE_t *y, BOOL_t *sample_mask, int n_samples, + * cdef void init(self, DTYPE_t* y, */ - __Pyx_INCREF(((PyObject *)__pyx_v_ndarray_label_count_init)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_ndarray_label_count_init)); - __Pyx_GOTREF(__pyx_v_self->ndarray_label_count_init); - __Pyx_DECREF(__pyx_v_self->ndarray_label_count_init); - __pyx_v_self->ndarray_label_count_init = ((PyObject *)__pyx_v_ndarray_label_count_init); + free(__pyx_v_self->label_count_init); - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; - __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); - __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_ndarray_label_count_init.rcbuffer->pybuffer); - __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_ndarray_label_count_left.rcbuffer->pybuffer); - __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_ndarray_label_count_right.rcbuffer->pybuffer); - __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} - __Pyx_AddTraceback("sklearn.tree._tree.ClassificationCriterion.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - goto __pyx_L2; - __pyx_L0:; - __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_ndarray_label_count_init.rcbuffer->pybuffer); - __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_ndarray_label_count_left.rcbuffer->pybuffer); - __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_ndarray_label_count_right.rcbuffer->pybuffer); - __pyx_L2:; - __Pyx_XDECREF((PyObject *)__pyx_v_ndarray_label_count_left); - __Pyx_XDECREF((PyObject *)__pyx_v_ndarray_label_count_right); - __Pyx_XDECREF((PyObject *)__pyx_v_ndarray_label_count_init); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "sklearn/tree/_tree.pyx":126 - * self.ndarray_label_count_init = ndarray_label_count_init +/* "sklearn/tree/_tree.pyx":148 + * free(self.label_count_init) * - * cdef void init(self, DTYPE_t *y, BOOL_t *sample_mask, int n_samples, # <<<<<<<<<<<<<< - * int n_total_samples): - * """Initialise the criterion class.""" + * cdef void init(self, DTYPE_t* y, # <<<<<<<<<<<<<< + * int y_stride, + * BOOL_t *sample_mask, */ -static void __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_init(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask, int __pyx_v_n_samples, int __pyx_v_n_total_samples) { +static void __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_init(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, int __pyx_v_y_stride, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask, int __pyx_v_n_samples, int __pyx_v_n_total_samples) { + int __pyx_v_n_outputs; + int *__pyx_v_n_classes; + int __pyx_v_label_count_stride; + int *__pyx_v_label_count_init; + int __pyx_v_k; int __pyx_v_c; int __pyx_v_j; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; + int __pyx_t_4; __Pyx_RefNannySetupContext("init", 0); - /* "sklearn/tree/_tree.pyx":129 - * int n_total_samples): + /* "sklearn/tree/_tree.pyx":154 + * int n_total_samples): + * """Initialise the criterion class.""" + * cdef int n_outputs = self.n_outputs # <<<<<<<<<<<<<< + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride + */ + __pyx_v_n_outputs = __pyx_v_self->n_outputs; + + /* "sklearn/tree/_tree.pyx":155 * """Initialise the criterion class.""" + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes # <<<<<<<<<<<<<< + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_init = self.label_count_init + */ + __pyx_v_n_classes = __pyx_v_self->n_classes; + + /* "sklearn/tree/_tree.pyx":156 + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride # <<<<<<<<<<<<<< + * cdef int* label_count_init = self.label_count_init + * + */ + __pyx_v_label_count_stride = __pyx_v_self->label_count_stride; + + /* "sklearn/tree/_tree.pyx":157 + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_init = self.label_count_init # <<<<<<<<<<<<<< + * + * cdef int k = 0 + */ + __pyx_v_label_count_init = __pyx_v_self->label_count_init; + + /* "sklearn/tree/_tree.pyx":159 + * cdef int* label_count_init = self.label_count_init + * + * cdef int k = 0 # <<<<<<<<<<<<<< + * cdef int c = 0 + * cdef int j = 0 + */ + __pyx_v_k = 0; + + /* "sklearn/tree/_tree.pyx":160 + * + * cdef int k = 0 * cdef int c = 0 # <<<<<<<<<<<<<< * cdef int j = 0 * */ __pyx_v_c = 0; - /* "sklearn/tree/_tree.pyx":130 - * """Initialise the criterion class.""" + /* "sklearn/tree/_tree.pyx":161 + * cdef int k = 0 * cdef int c = 0 * cdef int j = 0 # <<<<<<<<<<<<<< * @@ -2007,37 +2060,48 @@ static void __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_init(struct */ __pyx_v_j = 0; - /* "sklearn/tree/_tree.pyx":132 + /* "sklearn/tree/_tree.pyx":163 * cdef int j = 0 * * self.n_samples = n_samples # <<<<<<<<<<<<<< * - * for c from 0 <= c < self.n_classes: + * for k from 0 <= k < n_outputs: */ __pyx_v_self->n_samples = __pyx_v_n_samples; - /* "sklearn/tree/_tree.pyx":134 + /* "sklearn/tree/_tree.pyx":165 * self.n_samples = n_samples * - * for c from 0 <= c < self.n_classes: # <<<<<<<<<<<<<< - * self.label_count_init[c] = 0 - * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * for c from 0 <= c < n_classes[k]: + * label_count_init[k * label_count_stride + c] = 0 */ - __pyx_t_1 = __pyx_v_self->n_classes; - for (__pyx_v_c = 0; __pyx_v_c < __pyx_t_1; __pyx_v_c++) { + __pyx_t_1 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_1; __pyx_v_k++) { - /* "sklearn/tree/_tree.pyx":135 + /* "sklearn/tree/_tree.pyx":166 * - * for c from 0 <= c < self.n_classes: - * self.label_count_init[c] = 0 # <<<<<<<<<<<<<< + * for k from 0 <= k < n_outputs: + * for c from 0 <= c < n_classes[k]: # <<<<<<<<<<<<<< + * label_count_init[k * label_count_stride + c] = 0 + * + */ + __pyx_t_2 = (__pyx_v_n_classes[__pyx_v_k]); + for (__pyx_v_c = 0; __pyx_v_c < __pyx_t_2; __pyx_v_c++) { + + /* "sklearn/tree/_tree.pyx":167 + * for k from 0 <= k < n_outputs: + * for c from 0 <= c < n_classes[k]: + * label_count_init[k * label_count_stride + c] = 0 # <<<<<<<<<<<<<< * * for j from 0 <= j < n_total_samples: */ - (__pyx_v_self->label_count_init[__pyx_v_c]) = 0; + (__pyx_v_label_count_init[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]) = 0; + } } - /* "sklearn/tree/_tree.pyx":137 - * self.label_count_init[c] = 0 + /* "sklearn/tree/_tree.pyx":169 + * label_count_init[k * label_count_stride + c] = 0 * * for j from 0 <= j < n_total_samples: # <<<<<<<<<<<<<< * if sample_mask[j] == 0: @@ -2046,51 +2110,62 @@ static void __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_init(struct __pyx_t_1 = __pyx_v_n_total_samples; for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) { - /* "sklearn/tree/_tree.pyx":138 + /* "sklearn/tree/_tree.pyx":170 * * for j from 0 <= j < n_total_samples: * if sample_mask[j] == 0: # <<<<<<<<<<<<<< * continue - * c = (y[j]) + * */ - __pyx_t_2 = ((__pyx_v_sample_mask[__pyx_v_j]) == 0); - if (__pyx_t_2) { + __pyx_t_3 = ((__pyx_v_sample_mask[__pyx_v_j]) == 0); + if (__pyx_t_3) { - /* "sklearn/tree/_tree.pyx":139 + /* "sklearn/tree/_tree.pyx":171 * for j from 0 <= j < n_total_samples: * if sample_mask[j] == 0: * continue # <<<<<<<<<<<<<< - * c = (y[j]) - * self.label_count_init[c] += 1 + * + * for k from 0 <= k < n_outputs: */ - goto __pyx_L5_continue; - goto __pyx_L7; + goto __pyx_L7_continue; + goto __pyx_L9; } - __pyx_L7:; + __pyx_L9:; - /* "sklearn/tree/_tree.pyx":140 - * if sample_mask[j] == 0: + /* "sklearn/tree/_tree.pyx":173 * continue - * c = (y[j]) # <<<<<<<<<<<<<< - * self.label_count_init[c] += 1 * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * c = y[j * y_stride + k] + * label_count_init[k * label_count_stride + c] += 1 */ - __pyx_v_c = ((int)(__pyx_v_y[__pyx_v_j])); + __pyx_t_2 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_2; __pyx_v_k++) { - /* "sklearn/tree/_tree.pyx":141 - * continue - * c = (y[j]) - * self.label_count_init[c] += 1 # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":174 + * + * for k from 0 <= k < n_outputs: + * c = y[j * y_stride + k] # <<<<<<<<<<<<<< + * label_count_init[k * label_count_stride + c] += 1 + * + */ + __pyx_v_c = ((int)(__pyx_v_y[((__pyx_v_j * __pyx_v_y_stride) + __pyx_v_k)])); + + /* "sklearn/tree/_tree.pyx":175 + * for k from 0 <= k < n_outputs: + * c = y[j * y_stride + k] + * label_count_init[k * label_count_stride + c] += 1 # <<<<<<<<<<<<<< * * self.reset() */ - __pyx_t_3 = __pyx_v_c; - (__pyx_v_self->label_count_init[__pyx_t_3]) = ((__pyx_v_self->label_count_init[__pyx_t_3]) + 1); - __pyx_L5_continue:; + __pyx_t_4 = ((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c); + (__pyx_v_label_count_init[__pyx_t_4]) = ((__pyx_v_label_count_init[__pyx_t_4]) + 1); + } + __pyx_L7_continue:; } - /* "sklearn/tree/_tree.pyx":143 - * self.label_count_init[c] += 1 + /* "sklearn/tree/_tree.pyx":177 + * label_count_init[k * label_count_stride + c] += 1 * * self.reset() # <<<<<<<<<<<<<< * @@ -2101,7 +2176,7 @@ static void __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_init(struct __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_tree.pyx":145 +/* "sklearn/tree/_tree.pyx":179 * self.reset() * * cdef void reset(self): # <<<<<<<<<<<<<< @@ -2110,22 +2185,93 @@ static void __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_init(struct */ static void __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_reset(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self) { + int __pyx_v_n_outputs; + int *__pyx_v_n_classes; + int __pyx_v_label_count_stride; + int *__pyx_v_label_count_init; + int *__pyx_v_label_count_left; + int *__pyx_v_label_count_right; + int __pyx_v_k; int __pyx_v_c; __Pyx_RefNannyDeclarations int __pyx_t_1; + int __pyx_t_2; __Pyx_RefNannySetupContext("reset", 0); - /* "sklearn/tree/_tree.pyx":148 + /* "sklearn/tree/_tree.pyx":182 * """Reset label_counts by setting `label_count_left to zero * and copying the init array into the right.""" + * cdef int n_outputs = self.n_outputs # <<<<<<<<<<<<<< + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride + */ + __pyx_v_n_outputs = __pyx_v_self->n_outputs; + + /* "sklearn/tree/_tree.pyx":183 + * and copying the init array into the right.""" + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes # <<<<<<<<<<<<<< + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_init = self.label_count_init + */ + __pyx_v_n_classes = __pyx_v_self->n_classes; + + /* "sklearn/tree/_tree.pyx":184 + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride # <<<<<<<<<<<<<< + * cdef int* label_count_init = self.label_count_init + * cdef int* label_count_left = self.label_count_left + */ + __pyx_v_label_count_stride = __pyx_v_self->label_count_stride; + + /* "sklearn/tree/_tree.pyx":185 + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_init = self.label_count_init # <<<<<<<<<<<<<< + * cdef int* label_count_left = self.label_count_left + * cdef int* label_count_right = self.label_count_right + */ + __pyx_v_label_count_init = __pyx_v_self->label_count_init; + + /* "sklearn/tree/_tree.pyx":186 + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_init = self.label_count_init + * cdef int* label_count_left = self.label_count_left # <<<<<<<<<<<<<< + * cdef int* label_count_right = self.label_count_right + * + */ + __pyx_v_label_count_left = __pyx_v_self->label_count_left; + + /* "sklearn/tree/_tree.pyx":187 + * cdef int* label_count_init = self.label_count_init + * cdef int* label_count_left = self.label_count_left + * cdef int* label_count_right = self.label_count_right # <<<<<<<<<<<<<< + * + * cdef int k = 0 + */ + __pyx_v_label_count_right = __pyx_v_self->label_count_right; + + /* "sklearn/tree/_tree.pyx":189 + * cdef int* label_count_right = self.label_count_right + * + * cdef int k = 0 # <<<<<<<<<<<<<< + * cdef int c = 0 + * self.n_left = 0 + */ + __pyx_v_k = 0; + + /* "sklearn/tree/_tree.pyx":190 + * + * cdef int k = 0 * cdef int c = 0 # <<<<<<<<<<<<<< * self.n_left = 0 * self.n_right = self.n_samples */ __pyx_v_c = 0; - /* "sklearn/tree/_tree.pyx":149 - * and copying the init array into the right.""" + /* "sklearn/tree/_tree.pyx":191 + * cdef int k = 0 * cdef int c = 0 * self.n_left = 0 # <<<<<<<<<<<<<< * self.n_right = self.n_samples @@ -2133,164 +2279,266 @@ static void __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_reset(struct */ __pyx_v_self->n_left = 0; - /* "sklearn/tree/_tree.pyx":150 + /* "sklearn/tree/_tree.pyx":192 * cdef int c = 0 * self.n_left = 0 * self.n_right = self.n_samples # <<<<<<<<<<<<<< * - * for c from 0 <= c < self.n_classes: + * for k from 0 <= k < n_outputs: */ __pyx_v_self->n_right = __pyx_v_self->n_samples; - /* "sklearn/tree/_tree.pyx":152 + /* "sklearn/tree/_tree.pyx":194 * self.n_right = self.n_samples * - * for c from 0 <= c < self.n_classes: # <<<<<<<<<<<<<< - * self.label_count_left[c] = 0 - * self.label_count_right[c] = self.label_count_init[c] + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * for c from 0 <= c < n_classes[k]: + * label_count_left[k * label_count_stride + c] = 0 */ - __pyx_t_1 = __pyx_v_self->n_classes; - for (__pyx_v_c = 0; __pyx_v_c < __pyx_t_1; __pyx_v_c++) { + __pyx_t_1 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_1; __pyx_v_k++) { - /* "sklearn/tree/_tree.pyx":153 + /* "sklearn/tree/_tree.pyx":195 * - * for c from 0 <= c < self.n_classes: - * self.label_count_left[c] = 0 # <<<<<<<<<<<<<< - * self.label_count_right[c] = self.label_count_init[c] + * for k from 0 <= k < n_outputs: + * for c from 0 <= c < n_classes[k]: # <<<<<<<<<<<<<< + * label_count_left[k * label_count_stride + c] = 0 + * label_count_right[k * label_count_stride + c] = label_count_init[k * label_count_stride + c] + */ + __pyx_t_2 = (__pyx_v_n_classes[__pyx_v_k]); + for (__pyx_v_c = 0; __pyx_v_c < __pyx_t_2; __pyx_v_c++) { + + /* "sklearn/tree/_tree.pyx":196 + * for k from 0 <= k < n_outputs: + * for c from 0 <= c < n_classes[k]: + * label_count_left[k * label_count_stride + c] = 0 # <<<<<<<<<<<<<< + * label_count_right[k * label_count_stride + c] = label_count_init[k * label_count_stride + c] * */ - (__pyx_v_self->label_count_left[__pyx_v_c]) = 0; + (__pyx_v_label_count_left[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]) = 0; - /* "sklearn/tree/_tree.pyx":154 - * for c from 0 <= c < self.n_classes: - * self.label_count_left[c] = 0 - * self.label_count_right[c] = self.label_count_init[c] # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":197 + * for c from 0 <= c < n_classes[k]: + * label_count_left[k * label_count_stride + c] = 0 + * label_count_right[k * label_count_stride + c] = label_count_init[k * label_count_stride + c] # <<<<<<<<<<<<<< * - * cdef int update(self, int a, int b, DTYPE_t *y, int *X_argsorted_i, + * cdef int update(self, int a, */ - (__pyx_v_self->label_count_right[__pyx_v_c]) = (__pyx_v_self->label_count_init[__pyx_v_c]); + (__pyx_v_label_count_right[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]) = (__pyx_v_label_count_init[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]); + } } __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_tree.pyx":156 - * self.label_count_right[c] = self.label_count_init[c] +/* "sklearn/tree/_tree.pyx":199 + * label_count_right[k * label_count_stride + c] = label_count_init[k * label_count_stride + c] * - * cdef int update(self, int a, int b, DTYPE_t *y, int *X_argsorted_i, # <<<<<<<<<<<<<< - * BOOL_t *sample_mask): - * """Update the criteria for each value in interval [a,b) (where a and b + * cdef int update(self, int a, # <<<<<<<<<<<<<< + * int b, + * DTYPE_t* y, */ -static int __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_update(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self, int __pyx_v_a, int __pyx_v_b, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, int *__pyx_v_X_argsorted_i, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask) { - int __pyx_v_c; +static int __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_update(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self, int __pyx_v_a, int __pyx_v_b, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, int __pyx_v_y_stride, int *__pyx_v_X_argsorted_i, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask) { + int __pyx_v_n_outputs; + int __pyx_v_label_count_stride; + int *__pyx_v_label_count_left; + int *__pyx_v_label_count_right; + int __pyx_v_n_left; + int __pyx_v_n_right; int __pyx_v_idx; + int __pyx_v_k; + int __pyx_v_c; int __pyx_v_s; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; + int __pyx_t_4; __Pyx_RefNannySetupContext("update", 0); - /* "sklearn/tree/_tree.pyx":162 - * cdef int c + /* "sklearn/tree/_tree.pyx":207 + * """Update the criteria for each value in interval [a,b) (where a and b + * are indices in `X_argsorted_i`).""" + * cdef int n_outputs = self.n_outputs # <<<<<<<<<<<<<< + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_left = self.label_count_left + */ + __pyx_v_n_outputs = __pyx_v_self->n_outputs; + + /* "sklearn/tree/_tree.pyx":208 + * are indices in `X_argsorted_i`).""" + * cdef int n_outputs = self.n_outputs + * cdef int label_count_stride = self.label_count_stride # <<<<<<<<<<<<<< + * cdef int* label_count_left = self.label_count_left + * cdef int* label_count_right = self.label_count_right + */ + __pyx_v_label_count_stride = __pyx_v_self->label_count_stride; + + /* "sklearn/tree/_tree.pyx":209 + * cdef int n_outputs = self.n_outputs + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_left = self.label_count_left # <<<<<<<<<<<<<< + * cdef int* label_count_right = self.label_count_right + * cdef int n_left = self.n_left + */ + __pyx_v_label_count_left = __pyx_v_self->label_count_left; + + /* "sklearn/tree/_tree.pyx":210 + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_left = self.label_count_left + * cdef int* label_count_right = self.label_count_right # <<<<<<<<<<<<<< + * cdef int n_left = self.n_left + * cdef int n_right = self.n_right + */ + __pyx_v_label_count_right = __pyx_v_self->label_count_right; + + /* "sklearn/tree/_tree.pyx":211 + * cdef int* label_count_left = self.label_count_left + * cdef int* label_count_right = self.label_count_right + * cdef int n_left = self.n_left # <<<<<<<<<<<<<< + * cdef int n_right = self.n_right + * + */ + __pyx_v_n_left = __pyx_v_self->n_left; + + /* "sklearn/tree/_tree.pyx":212 + * cdef int* label_count_right = self.label_count_right + * cdef int n_left = self.n_left + * cdef int n_right = self.n_right # <<<<<<<<<<<<<< + * + * cdef int idx, k, c, s + */ + __pyx_v_n_right = __pyx_v_self->n_right; + + /* "sklearn/tree/_tree.pyx":217 + * * # post condition: all samples from [0:b) are on the left side * for idx from a <= idx < b: # <<<<<<<<<<<<<< * s = X_argsorted_i[idx] - * if sample_mask[s] == 0: + * */ __pyx_t_1 = __pyx_v_b; for (__pyx_v_idx = __pyx_v_a; __pyx_v_idx < __pyx_t_1; __pyx_v_idx++) { - /* "sklearn/tree/_tree.pyx":163 + /* "sklearn/tree/_tree.pyx":218 * # post condition: all samples from [0:b) are on the left side * for idx from a <= idx < b: * s = X_argsorted_i[idx] # <<<<<<<<<<<<<< + * * if sample_mask[s] == 0: - * continue */ __pyx_v_s = (__pyx_v_X_argsorted_i[__pyx_v_idx]); - /* "sklearn/tree/_tree.pyx":164 - * for idx from a <= idx < b: + /* "sklearn/tree/_tree.pyx":220 * s = X_argsorted_i[idx] + * * if sample_mask[s] == 0: # <<<<<<<<<<<<<< * continue - * c = (y[s]) + * */ __pyx_t_2 = ((__pyx_v_sample_mask[__pyx_v_s]) == 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":165 - * s = X_argsorted_i[idx] + /* "sklearn/tree/_tree.pyx":221 + * * if sample_mask[s] == 0: * continue # <<<<<<<<<<<<<< - * c = (y[s]) - * self.label_count_right[c] -= 1 + * + * for k from 0 <= k < n_outputs: */ goto __pyx_L3_continue; goto __pyx_L5; } __pyx_L5:; - /* "sklearn/tree/_tree.pyx":166 - * if sample_mask[s] == 0: + /* "sklearn/tree/_tree.pyx":223 * continue - * c = (y[s]) # <<<<<<<<<<<<<< - * self.label_count_right[c] -= 1 - * self.label_count_left[c] += 1 + * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * c = y[s * y_stride + k] + * label_count_right[k * label_count_stride + c] -= 1 */ - __pyx_v_c = ((int)(__pyx_v_y[__pyx_v_s])); + __pyx_t_3 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_3; __pyx_v_k++) { - /* "sklearn/tree/_tree.pyx":167 - * continue - * c = (y[s]) - * self.label_count_right[c] -= 1 # <<<<<<<<<<<<<< - * self.label_count_left[c] += 1 - * self.n_right -= 1 + /* "sklearn/tree/_tree.pyx":224 + * + * for k from 0 <= k < n_outputs: + * c = y[s * y_stride + k] # <<<<<<<<<<<<<< + * label_count_right[k * label_count_stride + c] -= 1 + * label_count_left[k * label_count_stride + c] += 1 */ - __pyx_t_3 = __pyx_v_c; - (__pyx_v_self->label_count_right[__pyx_t_3]) = ((__pyx_v_self->label_count_right[__pyx_t_3]) - 1); + __pyx_v_c = ((int)(__pyx_v_y[((__pyx_v_s * __pyx_v_y_stride) + __pyx_v_k)])); - /* "sklearn/tree/_tree.pyx":168 - * c = (y[s]) - * self.label_count_right[c] -= 1 - * self.label_count_left[c] += 1 # <<<<<<<<<<<<<< - * self.n_right -= 1 - * self.n_left += 1 + /* "sklearn/tree/_tree.pyx":225 + * for k from 0 <= k < n_outputs: + * c = y[s * y_stride + k] + * label_count_right[k * label_count_stride + c] -= 1 # <<<<<<<<<<<<<< + * label_count_left[k * label_count_stride + c] += 1 + * */ - __pyx_t_3 = __pyx_v_c; - (__pyx_v_self->label_count_left[__pyx_t_3]) = ((__pyx_v_self->label_count_left[__pyx_t_3]) + 1); + __pyx_t_4 = ((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c); + (__pyx_v_label_count_right[__pyx_t_4]) = ((__pyx_v_label_count_right[__pyx_t_4]) - 1); - /* "sklearn/tree/_tree.pyx":169 - * self.label_count_right[c] -= 1 - * self.label_count_left[c] += 1 - * self.n_right -= 1 # <<<<<<<<<<<<<< - * self.n_left += 1 + /* "sklearn/tree/_tree.pyx":226 + * c = y[s * y_stride + k] + * label_count_right[k * label_count_stride + c] -= 1 + * label_count_left[k * label_count_stride + c] += 1 # <<<<<<<<<<<<<< * + * n_left += 1 */ - __pyx_v_self->n_right = (__pyx_v_self->n_right - 1); + __pyx_t_4 = ((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c); + (__pyx_v_label_count_left[__pyx_t_4]) = ((__pyx_v_label_count_left[__pyx_t_4]) + 1); + } - /* "sklearn/tree/_tree.pyx":170 - * self.label_count_left[c] += 1 - * self.n_right -= 1 - * self.n_left += 1 # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":228 + * label_count_left[k * label_count_stride + c] += 1 + * + * n_left += 1 # <<<<<<<<<<<<<< + * n_right -=1 * - * return self.n_left */ - __pyx_v_self->n_left = (__pyx_v_self->n_left + 1); + __pyx_v_n_left = (__pyx_v_n_left + 1); + + /* "sklearn/tree/_tree.pyx":229 + * + * n_left += 1 + * n_right -=1 # <<<<<<<<<<<<<< + * + * self.n_left = n_left + */ + __pyx_v_n_right = (__pyx_v_n_right - 1); __pyx_L3_continue:; } - /* "sklearn/tree/_tree.pyx":172 - * self.n_left += 1 + /* "sklearn/tree/_tree.pyx":231 + * n_right -=1 + * + * self.n_left = n_left # <<<<<<<<<<<<<< + * self.n_right = n_right + * + */ + __pyx_v_self->n_left = __pyx_v_n_left; + + /* "sklearn/tree/_tree.pyx":232 + * + * self.n_left = n_left + * self.n_right = n_right # <<<<<<<<<<<<<< + * + * return n_left + */ + __pyx_v_self->n_right = __pyx_v_n_right; + + /* "sklearn/tree/_tree.pyx":234 + * self.n_right = n_right * - * return self.n_left # <<<<<<<<<<<<<< + * return n_left # <<<<<<<<<<<<<< * * cdef double eval(self): */ - __pyx_r = __pyx_v_self->n_left; + __pyx_r = __pyx_v_n_left; goto __pyx_L0; __pyx_r = 0; @@ -2299,8 +2547,8 @@ static int __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_update(struct return __pyx_r; } -/* "sklearn/tree/_tree.pyx":174 - * return self.n_left +/* "sklearn/tree/_tree.pyx":236 + * return n_left * * cdef double eval(self): # <<<<<<<<<<<<<< * pass @@ -2317,35 +2565,55 @@ static double __pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_eval(CYTHO return __pyx_r; } -/* "sklearn/tree/_tree.pyx":177 +/* "sklearn/tree/_tree.pyx":239 * pass * * cpdef np.ndarray init_value(self): # <<<<<<<<<<<<<< - * return self.ndarray_label_count_init - * + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes */ -static PyObject *__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_3init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_5init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_init_value(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self, int __pyx_skip_dispatch) { + int __pyx_v_n_outputs; + int *__pyx_v_n_classes; + int __pyx_v_label_count_stride; + int *__pyx_v_label_count_init; + PyArrayObject *__pyx_v_value = 0; + int __pyx_v_k; + int __pyx_v_c; + __Pyx_LocalBuf_ND __pyx_pybuffernd_value; + __Pyx_Buffer __pyx_pybuffer_value; PyArrayObject *__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; + PyArrayObject *__pyx_t_5 = NULL; + int __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("init_value", 0); + __pyx_pybuffer_value.pybuffer.buf = NULL; + __pyx_pybuffer_value.refcount = 0; + __pyx_pybuffernd_value.data = NULL; + __pyx_pybuffernd_value.rcbuffer = &__pyx_pybuffer_value; /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { - __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__init_value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__init_value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __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_23ClassificationCriterion_3init_value)) { + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_5init_value)) { __Pyx_XDECREF(((PyObject *)__pyx_r)); - __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __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 = 239; __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; @@ -2354,17 +2622,139 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_in __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } - /* "sklearn/tree/_tree.pyx":178 + /* "sklearn/tree/_tree.pyx":240 * * cpdef np.ndarray init_value(self): - * return self.ndarray_label_count_init # <<<<<<<<<<<<<< + * cdef int n_outputs = self.n_outputs # <<<<<<<<<<<<<< + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride + */ + __pyx_v_n_outputs = __pyx_v_self->n_outputs; + + /* "sklearn/tree/_tree.pyx":241 + * cpdef np.ndarray init_value(self): + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes # <<<<<<<<<<<<<< + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_init = self.label_count_init + */ + __pyx_v_n_classes = __pyx_v_self->n_classes; + + /* "sklearn/tree/_tree.pyx":242 + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride # <<<<<<<<<<<<<< + * cdef int* label_count_init = self.label_count_init + * + */ + __pyx_v_label_count_stride = __pyx_v_self->label_count_stride; + + /* "sklearn/tree/_tree.pyx":243 + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_init = self.label_count_init # <<<<<<<<<<<<<< + * + * cdef np.ndarray[DTYPE_t, ndim=2] value = np.zeros((n_outputs, label_count_stride), dtype=DTYPE) + */ + __pyx_v_label_count_init = __pyx_v_self->label_count_init; + + /* "sklearn/tree/_tree.pyx":245 + * cdef int* label_count_init = self.label_count_init + * + * cdef np.ndarray[DTYPE_t, ndim=2] value = np.zeros((n_outputs, label_count_stride), dtype=DTYPE) # <<<<<<<<<<<<<< + * + * cdef int k, c + */ + __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyInt_FromLong(__pyx_v_n_outputs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyInt_FromLong(__pyx_v_label_count_stride); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_4)); + __Pyx_GIVEREF(((PyObject *)__pyx_t_4)); + __pyx_t_4 = 0; + __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_4)); + __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__dtype), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; + __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 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 = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = ((PyArrayObject *)__pyx_t_1); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_value.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_value = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_value.rcbuffer->pybuffer.buf = NULL; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } else {__pyx_pybuffernd_value.diminfo[0].strides = __pyx_pybuffernd_value.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_value.diminfo[0].shape = __pyx_pybuffernd_value.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_value.diminfo[1].strides = __pyx_pybuffernd_value.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_value.diminfo[1].shape = __pyx_pybuffernd_value.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_5 = 0; + __pyx_v_value = ((PyArrayObject *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "sklearn/tree/_tree.pyx":249 + * cdef int k, c + * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * for c from 0 <= c < n_classes[k]: + * value[k, c] = (label_count_init[k * label_count_stride + c]) + */ + __pyx_t_6 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_6; __pyx_v_k++) { + + /* "sklearn/tree/_tree.pyx":250 + * + * for k from 0 <= k < n_outputs: + * for c from 0 <= c < n_classes[k]: # <<<<<<<<<<<<<< + * value[k, c] = (label_count_init[k * label_count_stride + c]) + * + */ + __pyx_t_7 = (__pyx_v_n_classes[__pyx_v_k]); + for (__pyx_v_c = 0; __pyx_v_c < __pyx_t_7; __pyx_v_c++) { + + /* "sklearn/tree/_tree.pyx":251 + * for k from 0 <= k < n_outputs: + * for c from 0 <= c < n_classes[k]: + * value[k, c] = (label_count_init[k * label_count_stride + c]) # <<<<<<<<<<<<<< + * + * return value + */ + __pyx_t_8 = __pyx_v_k; + __pyx_t_9 = __pyx_v_c; + *__Pyx_BufPtrStrided2d(__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, __pyx_pybuffernd_value.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_value.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_value.diminfo[1].strides) = ((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t)(__pyx_v_label_count_init[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)])); + } + } + + /* "sklearn/tree/_tree.pyx":253 + * value[k, c] = (label_count_init[k * label_count_stride + c]) * + * return value # <<<<<<<<<<<<<< * + * cdef class Gini(ClassificationCriterion): */ __Pyx_XDECREF(((PyObject *)__pyx_r)); - if (!(likely(((__pyx_v_self->ndarray_label_count_init) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_self->ndarray_label_count_init, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_INCREF(__pyx_v_self->ndarray_label_count_init); - __pyx_r = ((PyArrayObject *)__pyx_v_self->ndarray_label_count_init); + __Pyx_INCREF(((PyObject *)__pyx_v_value)); + __pyx_r = ((PyArrayObject *)__pyx_v_value); goto __pyx_L0; __pyx_r = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); @@ -2372,34 +2762,44 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_in __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_value.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("sklearn.tree._tree.ClassificationCriterion.init_value", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; + goto __pyx_L2; __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_value.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_value); __Pyx_XGIVEREF((PyObject *)__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ -static PyObject *__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_3init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_3init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { +static PyObject *__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_5init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_5init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("init_value (wrapper)", 0); - __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion_2init_value(((struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *)__pyx_v_self)); + __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion_4init_value(((struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *)__pyx_v_self)); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "sklearn/tree/_tree.pyx":177 +/* "sklearn/tree/_tree.pyx":239 * pass * * cpdef np.ndarray init_value(self): # <<<<<<<<<<<<<< - * return self.ndarray_label_count_init - * + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes */ -static PyObject *__pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion_2init_value(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self) { +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion_4init_value(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; @@ -2408,7 +2808,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion_2init_ int __pyx_clineno = 0; __Pyx_RefNannySetupContext("init_value", 0); __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_ClassificationCriterion *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.init_value(((struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *)__pyx_v_self), 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_ClassificationCriterion *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.init_value(((struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *)__pyx_v_self), 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -2426,211 +2826,303 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_23ClassificationCriterion_2init_ return __pyx_r; } -/* "sklearn/tree/_tree.pyx":188 +/* "sklearn/tree/_tree.pyx":262 * """ * * cdef double eval(self): # <<<<<<<<<<<<<< * """Returns Gini index of left branch + Gini index of right branch. """ - * cdef double n_left = self.n_left + * cdef int n_samples = self.n_samples */ static double __pyx_f_7sklearn_4tree_5_tree_4Gini_eval(struct __pyx_obj_7sklearn_4tree_5_tree_Gini *__pyx_v_self) { + int __pyx_v_n_samples; + int __pyx_v_n_outputs; + int *__pyx_v_n_classes; + int __pyx_v_label_count_stride; + int *__pyx_v_label_count_left; + int *__pyx_v_label_count_right; double __pyx_v_n_left; double __pyx_v_n_right; + double __pyx_v_total; double __pyx_v_H_left; double __pyx_v_H_right; int __pyx_v_k; + int __pyx_v_c; int __pyx_v_count_left; int __pyx_v_count_right; double __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; + int __pyx_t_3; __Pyx_RefNannySetupContext("eval", 0); - /* "sklearn/tree/_tree.pyx":190 + /* "sklearn/tree/_tree.pyx":264 * cdef double eval(self): * """Returns Gini index of left branch + Gini index of right branch. """ + * cdef int n_samples = self.n_samples # <<<<<<<<<<<<<< + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes + */ + __pyx_v_n_samples = __pyx_v_self->__pyx_base.n_samples; + + /* "sklearn/tree/_tree.pyx":265 + * """Returns Gini index of left branch + Gini index of right branch. """ + * cdef int n_samples = self.n_samples + * cdef int n_outputs = self.n_outputs # <<<<<<<<<<<<<< + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride + */ + __pyx_v_n_outputs = __pyx_v_self->__pyx_base.n_outputs; + + /* "sklearn/tree/_tree.pyx":266 + * cdef int n_samples = self.n_samples + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes # <<<<<<<<<<<<<< + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_left = self.label_count_left + */ + __pyx_v_n_classes = __pyx_v_self->__pyx_base.n_classes; + + /* "sklearn/tree/_tree.pyx":267 + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride # <<<<<<<<<<<<<< + * cdef int* label_count_left = self.label_count_left + * cdef int* label_count_right = self.label_count_right + */ + __pyx_v_label_count_stride = __pyx_v_self->__pyx_base.label_count_stride; + + /* "sklearn/tree/_tree.pyx":268 + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_left = self.label_count_left # <<<<<<<<<<<<<< + * cdef int* label_count_right = self.label_count_right + * cdef double n_left = self.n_left + */ + __pyx_v_label_count_left = __pyx_v_self->__pyx_base.label_count_left; + + /* "sklearn/tree/_tree.pyx":269 + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_left = self.label_count_left + * cdef int* label_count_right = self.label_count_right # <<<<<<<<<<<<<< + * cdef double n_left = self.n_left + * cdef double n_right = self.n_right + */ + __pyx_v_label_count_right = __pyx_v_self->__pyx_base.label_count_right; + + /* "sklearn/tree/_tree.pyx":270 + * cdef int* label_count_left = self.label_count_left + * cdef int* label_count_right = self.label_count_right * cdef double n_left = self.n_left # <<<<<<<<<<<<<< * cdef double n_right = self.n_right - * cdef double H_left = n_left * n_left + * */ __pyx_v_n_left = ((double)__pyx_v_self->__pyx_base.n_left); - /* "sklearn/tree/_tree.pyx":191 - * """Returns Gini index of left branch + Gini index of right branch. """ + /* "sklearn/tree/_tree.pyx":271 + * cdef int* label_count_right = self.label_count_right * cdef double n_left = self.n_left * cdef double n_right = self.n_right # <<<<<<<<<<<<<< - * cdef double H_left = n_left * n_left - * cdef double H_right = n_right * n_right + * + * cdef double total = 0.0 */ __pyx_v_n_right = ((double)__pyx_v_self->__pyx_base.n_right); - /* "sklearn/tree/_tree.pyx":192 - * cdef double n_left = self.n_left + /* "sklearn/tree/_tree.pyx":273 * cdef double n_right = self.n_right - * cdef double H_left = n_left * n_left # <<<<<<<<<<<<<< - * cdef double H_right = n_right * n_right - * cdef int k, count_left, count_right + * + * cdef double total = 0.0 # <<<<<<<<<<<<<< + * cdef double H_left + * cdef double H_right */ - __pyx_v_H_left = (__pyx_v_n_left * __pyx_v_n_left); + __pyx_v_total = 0.0; - /* "sklearn/tree/_tree.pyx":193 - * cdef double n_right = self.n_right - * cdef double H_left = n_left * n_left - * cdef double H_right = n_right * n_right # <<<<<<<<<<<<<< - * cdef int k, count_left, count_right + /* "sklearn/tree/_tree.pyx":278 + * cdef int k, c, count_left, count_right * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * H_left = n_left * n_left + * H_right = n_right * n_right */ - __pyx_v_H_right = (__pyx_v_n_right * __pyx_v_n_right); + __pyx_t_1 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_1; __pyx_v_k++) { - /* "sklearn/tree/_tree.pyx":196 - * cdef int k, count_left, count_right + /* "sklearn/tree/_tree.pyx":279 + * + * for k from 0 <= k < n_outputs: + * H_left = n_left * n_left # <<<<<<<<<<<<<< + * H_right = n_right * n_right * - * for k from 0 <= k < self.n_classes: # <<<<<<<<<<<<<< - * count_left = self.label_count_left[k] - * if count_left > 0: */ - __pyx_t_1 = __pyx_v_self->__pyx_base.n_classes; - for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_1; __pyx_v_k++) { + __pyx_v_H_left = (__pyx_v_n_left * __pyx_v_n_left); - /* "sklearn/tree/_tree.pyx":197 + /* "sklearn/tree/_tree.pyx":280 + * for k from 0 <= k < n_outputs: + * H_left = n_left * n_left + * H_right = n_right * n_right # <<<<<<<<<<<<<< * - * for k from 0 <= k < self.n_classes: - * count_left = self.label_count_left[k] # <<<<<<<<<<<<<< - * if count_left > 0: - * H_left -= (count_left * count_left) + * for c from 0 <= c < n_classes[k]: */ - __pyx_v_count_left = (__pyx_v_self->__pyx_base.label_count_left[__pyx_v_k]); + __pyx_v_H_right = (__pyx_v_n_right * __pyx_v_n_right); - /* "sklearn/tree/_tree.pyx":198 - * for k from 0 <= k < self.n_classes: - * count_left = self.label_count_left[k] - * if count_left > 0: # <<<<<<<<<<<<<< - * H_left -= (count_left * count_left) - * count_right = self.label_count_right[k] + /* "sklearn/tree/_tree.pyx":282 + * H_right = n_right * n_right + * + * for c from 0 <= c < n_classes[k]: # <<<<<<<<<<<<<< + * count_left = label_count_left[k * label_count_stride + c] + * if count_left > 0: */ - __pyx_t_2 = (__pyx_v_count_left > 0); - if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_n_classes[__pyx_v_k]); + for (__pyx_v_c = 0; __pyx_v_c < __pyx_t_2; __pyx_v_c++) { - /* "sklearn/tree/_tree.pyx":199 - * count_left = self.label_count_left[k] - * if count_left > 0: - * H_left -= (count_left * count_left) # <<<<<<<<<<<<<< - * count_right = self.label_count_right[k] - * if count_right > 0: + /* "sklearn/tree/_tree.pyx":283 + * + * for c from 0 <= c < n_classes[k]: + * count_left = label_count_left[k * label_count_stride + c] # <<<<<<<<<<<<<< + * if count_left > 0: + * H_left -= (count_left * count_left) */ - __pyx_v_H_left = (__pyx_v_H_left - (__pyx_v_count_left * __pyx_v_count_left)); - goto __pyx_L5; - } - __pyx_L5:; + __pyx_v_count_left = (__pyx_v_label_count_left[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]); - /* "sklearn/tree/_tree.pyx":200 - * if count_left > 0: - * H_left -= (count_left * count_left) - * count_right = self.label_count_right[k] # <<<<<<<<<<<<<< - * if count_right > 0: - * H_right -= (count_right * count_right) + /* "sklearn/tree/_tree.pyx":284 + * for c from 0 <= c < n_classes[k]: + * count_left = label_count_left[k * label_count_stride + c] + * if count_left > 0: # <<<<<<<<<<<<<< + * H_left -= (count_left * count_left) + * */ - __pyx_v_count_right = (__pyx_v_self->__pyx_base.label_count_right[__pyx_v_k]); + __pyx_t_3 = (__pyx_v_count_left > 0); + if (__pyx_t_3) { - /* "sklearn/tree/_tree.pyx":201 - * H_left -= (count_left * count_left) - * count_right = self.label_count_right[k] - * if count_right > 0: # <<<<<<<<<<<<<< - * H_right -= (count_right * count_right) + /* "sklearn/tree/_tree.pyx":285 + * count_left = label_count_left[k * label_count_stride + c] + * if count_left > 0: + * H_left -= (count_left * count_left) # <<<<<<<<<<<<<< * + * count_right = label_count_right[k * label_count_stride + c] */ - __pyx_t_2 = (__pyx_v_count_right > 0); - if (__pyx_t_2) { + __pyx_v_H_left = (__pyx_v_H_left - (__pyx_v_count_left * __pyx_v_count_left)); + goto __pyx_L7; + } + __pyx_L7:; - /* "sklearn/tree/_tree.pyx":202 - * count_right = self.label_count_right[k] - * if count_right > 0: - * H_right -= (count_right * count_right) # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":287 + * H_left -= (count_left * count_left) * - * if n_left == 0: + * count_right = label_count_right[k * label_count_stride + c] # <<<<<<<<<<<<<< + * if count_right > 0: + * H_right -= (count_right * count_right) */ - __pyx_v_H_right = (__pyx_v_H_right - (__pyx_v_count_right * __pyx_v_count_right)); - goto __pyx_L6; + __pyx_v_count_right = (__pyx_v_label_count_right[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]); + + /* "sklearn/tree/_tree.pyx":288 + * + * count_right = label_count_right[k * label_count_stride + c] + * if count_right > 0: # <<<<<<<<<<<<<< + * H_right -= (count_right * count_right) + * + */ + __pyx_t_3 = (__pyx_v_count_right > 0); + if (__pyx_t_3) { + + /* "sklearn/tree/_tree.pyx":289 + * count_right = label_count_right[k * label_count_stride + c] + * if count_right > 0: + * H_right -= (count_right * count_right) # <<<<<<<<<<<<<< + * + * if n_left == 0: + */ + __pyx_v_H_right = (__pyx_v_H_right - (__pyx_v_count_right * __pyx_v_count_right)); + goto __pyx_L8; + } + __pyx_L8:; } - __pyx_L6:; - } - /* "sklearn/tree/_tree.pyx":204 - * H_right -= (count_right * count_right) + /* "sklearn/tree/_tree.pyx":291 + * H_right -= (count_right * count_right) * - * if n_left == 0: # <<<<<<<<<<<<<< - * H_left = 0 - * else: + * if n_left == 0: # <<<<<<<<<<<<<< + * H_left = 0 + * else: */ - __pyx_t_2 = (__pyx_v_n_left == 0.0); - if (__pyx_t_2) { + __pyx_t_3 = (__pyx_v_n_left == 0.0); + if (__pyx_t_3) { - /* "sklearn/tree/_tree.pyx":205 + /* "sklearn/tree/_tree.pyx":292 * - * if n_left == 0: - * H_left = 0 # <<<<<<<<<<<<<< - * else: - * H_left /= n_left + * if n_left == 0: + * H_left = 0 # <<<<<<<<<<<<<< + * else: + * H_left /= n_left */ - __pyx_v_H_left = 0.0; - goto __pyx_L7; - } - /*else*/ { + __pyx_v_H_left = 0.0; + goto __pyx_L9; + } + /*else*/ { - /* "sklearn/tree/_tree.pyx":207 - * H_left = 0 - * else: - * H_left /= n_left # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":294 + * H_left = 0 + * else: + * H_left /= n_left # <<<<<<<<<<<<<< * - * if n_right == 0: + * if n_right == 0: */ - __pyx_v_H_left = (__pyx_v_H_left / __pyx_v_n_left); - } - __pyx_L7:; + __pyx_v_H_left = (__pyx_v_H_left / __pyx_v_n_left); + } + __pyx_L9:; - /* "sklearn/tree/_tree.pyx":209 - * H_left /= n_left + /* "sklearn/tree/_tree.pyx":296 + * H_left /= n_left * - * if n_right == 0: # <<<<<<<<<<<<<< - * H_right = 0 - * else: + * if n_right == 0: # <<<<<<<<<<<<<< + * H_right = 0 + * else: */ - __pyx_t_2 = (__pyx_v_n_right == 0.0); - if (__pyx_t_2) { + __pyx_t_3 = (__pyx_v_n_right == 0.0); + if (__pyx_t_3) { - /* "sklearn/tree/_tree.pyx":210 + /* "sklearn/tree/_tree.pyx":297 * - * if n_right == 0: - * H_right = 0 # <<<<<<<<<<<<<< - * else: - * H_right /= n_right + * if n_right == 0: + * H_right = 0 # <<<<<<<<<<<<<< + * else: + * H_right /= n_right */ - __pyx_v_H_right = 0.0; - goto __pyx_L8; - } - /*else*/ { + __pyx_v_H_right = 0.0; + goto __pyx_L10; + } + /*else*/ { - /* "sklearn/tree/_tree.pyx":212 - * H_right = 0 - * else: - * H_right /= n_right # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":299 + * H_right = 0 + * else: + * H_right /= n_right # <<<<<<<<<<<<<< + * + * total += (H_left + H_right) + */ + __pyx_v_H_right = (__pyx_v_H_right / __pyx_v_n_right); + } + __pyx_L10:; + + /* "sklearn/tree/_tree.pyx":301 + * H_right /= n_right + * + * total += (H_left + H_right) # <<<<<<<<<<<<<< * - * return (H_left + H_right) / self.n_samples + * return total / (n_samples * n_outputs) */ - __pyx_v_H_right = (__pyx_v_H_right / __pyx_v_n_right); + __pyx_v_total = (__pyx_v_total + (__pyx_v_H_left + __pyx_v_H_right)); } - __pyx_L8:; - /* "sklearn/tree/_tree.pyx":214 - * H_right /= n_right + /* "sklearn/tree/_tree.pyx":303 + * total += (H_left + H_right) * - * return (H_left + H_right) / self.n_samples # <<<<<<<<<<<<<< + * return total / (n_samples * n_outputs) # <<<<<<<<<<<<<< * * */ - __pyx_r = ((__pyx_v_H_left + __pyx_v_H_right) / __pyx_v_self->__pyx_base.n_samples); + __pyx_r = (__pyx_v_total / (__pyx_v_n_samples * __pyx_v_n_outputs)); goto __pyx_L0; __pyx_r = 0; @@ -2639,145 +3131,237 @@ static double __pyx_f_7sklearn_4tree_5_tree_4Gini_eval(struct __pyx_obj_7sklearn return __pyx_r; } -/* "sklearn/tree/_tree.pyx":223 +/* "sklearn/tree/_tree.pyx":312 * """ * * cdef double eval(self): # <<<<<<<<<<<<<< * """Returns Entropy of left branch + Entropy index of right branch. """ - * cdef double H_left = 0.0 + * cdef int n_samples = self.n_samples */ static double __pyx_f_7sklearn_4tree_5_tree_7Entropy_eval(struct __pyx_obj_7sklearn_4tree_5_tree_Entropy *__pyx_v_self) { + int __pyx_v_n_samples; + int __pyx_v_n_outputs; + int *__pyx_v_n_classes; + int __pyx_v_label_count_stride; + int *__pyx_v_label_count_left; + int *__pyx_v_label_count_right; + double __pyx_v_n_left; + double __pyx_v_n_right; + double __pyx_v_total; double __pyx_v_H_left; double __pyx_v_H_right; int __pyx_v_k; + int __pyx_v_c; double __pyx_v_e1; double __pyx_v_e2; - double __pyx_v_n_left; - double __pyx_v_n_right; double __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; + int __pyx_t_3; __Pyx_RefNannySetupContext("eval", 0); - /* "sklearn/tree/_tree.pyx":225 + /* "sklearn/tree/_tree.pyx":314 * cdef double eval(self): * """Returns Entropy of left branch + Entropy index of right branch. """ - * cdef double H_left = 0.0 # <<<<<<<<<<<<<< - * cdef double H_right = 0.0 - * cdef int k + * cdef int n_samples = self.n_samples # <<<<<<<<<<<<<< + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes */ - __pyx_v_H_left = 0.0; + __pyx_v_n_samples = __pyx_v_self->__pyx_base.n_samples; - /* "sklearn/tree/_tree.pyx":226 + /* "sklearn/tree/_tree.pyx":315 * """Returns Entropy of left branch + Entropy index of right branch. """ - * cdef double H_left = 0.0 - * cdef double H_right = 0.0 # <<<<<<<<<<<<<< - * cdef int k - * cdef double e1, e2 + * cdef int n_samples = self.n_samples + * cdef int n_outputs = self.n_outputs # <<<<<<<<<<<<<< + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride */ - __pyx_v_H_right = 0.0; + __pyx_v_n_outputs = __pyx_v_self->__pyx_base.n_outputs; - /* "sklearn/tree/_tree.pyx":229 - * cdef int k - * cdef double e1, e2 + /* "sklearn/tree/_tree.pyx":316 + * cdef int n_samples = self.n_samples + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes # <<<<<<<<<<<<<< + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_left = self.label_count_left + */ + __pyx_v_n_classes = __pyx_v_self->__pyx_base.n_classes; + + /* "sklearn/tree/_tree.pyx":317 + * cdef int n_outputs = self.n_outputs + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride # <<<<<<<<<<<<<< + * cdef int* label_count_left = self.label_count_left + * cdef int* label_count_right = self.label_count_right + */ + __pyx_v_label_count_stride = __pyx_v_self->__pyx_base.label_count_stride; + + /* "sklearn/tree/_tree.pyx":318 + * cdef int* n_classes = self.n_classes + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_left = self.label_count_left # <<<<<<<<<<<<<< + * cdef int* label_count_right = self.label_count_right + * cdef double n_left = self.n_left + */ + __pyx_v_label_count_left = __pyx_v_self->__pyx_base.label_count_left; + + /* "sklearn/tree/_tree.pyx":319 + * cdef int label_count_stride = self.label_count_stride + * cdef int* label_count_left = self.label_count_left + * cdef int* label_count_right = self.label_count_right # <<<<<<<<<<<<<< + * cdef double n_left = self.n_left + * cdef double n_right = self.n_right + */ + __pyx_v_label_count_right = __pyx_v_self->__pyx_base.label_count_right; + + /* "sklearn/tree/_tree.pyx":320 + * cdef int* label_count_left = self.label_count_left + * cdef int* label_count_right = self.label_count_right * cdef double n_left = self.n_left # <<<<<<<<<<<<<< * cdef double n_right = self.n_right * */ __pyx_v_n_left = ((double)__pyx_v_self->__pyx_base.n_left); - /* "sklearn/tree/_tree.pyx":230 - * cdef double e1, e2 + /* "sklearn/tree/_tree.pyx":321 + * cdef int* label_count_right = self.label_count_right * cdef double n_left = self.n_left * cdef double n_right = self.n_right # <<<<<<<<<<<<<< * - * for k from 0 <= k < self.n_classes: + * cdef double total = 0.0 */ __pyx_v_n_right = ((double)__pyx_v_self->__pyx_base.n_right); - /* "sklearn/tree/_tree.pyx":232 + /* "sklearn/tree/_tree.pyx":323 * cdef double n_right = self.n_right * - * for k from 0 <= k < self.n_classes: # <<<<<<<<<<<<<< - * if self.label_count_left[k] > 0: - * H_left -= ((self.label_count_left[k] / n_left) + * cdef double total = 0.0 # <<<<<<<<<<<<<< + * cdef double H_left + * cdef double H_right + */ + __pyx_v_total = 0.0; + + /* "sklearn/tree/_tree.pyx":329 + * cdef double e1, e2 + * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * H_left = 0.0 + * H_right = 0.0 */ - __pyx_t_1 = __pyx_v_self->__pyx_base.n_classes; + __pyx_t_1 = __pyx_v_n_outputs; for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_1; __pyx_v_k++) { - /* "sklearn/tree/_tree.pyx":233 + /* "sklearn/tree/_tree.pyx":330 + * + * for k from 0 <= k < n_outputs: + * H_left = 0.0 # <<<<<<<<<<<<<< + * H_right = 0.0 * - * for k from 0 <= k < self.n_classes: - * if self.label_count_left[k] > 0: # <<<<<<<<<<<<<< - * H_left -= ((self.label_count_left[k] / n_left) - * * log(self.label_count_left[k] / n_left)) */ - __pyx_t_2 = ((__pyx_v_self->__pyx_base.label_count_left[__pyx_v_k]) > 0); - if (__pyx_t_2) { + __pyx_v_H_left = 0.0; - /* "sklearn/tree/_tree.pyx":235 - * if self.label_count_left[k] > 0: - * H_left -= ((self.label_count_left[k] / n_left) - * * log(self.label_count_left[k] / n_left)) # <<<<<<<<<<<<<< - * if self.label_count_right[k] > 0: - * H_right -= ((self.label_count_right[k] / n_right) + /* "sklearn/tree/_tree.pyx":331 + * for k from 0 <= k < n_outputs: + * H_left = 0.0 + * H_right = 0.0 # <<<<<<<<<<<<<< + * + * for c from 0 <= c < n_classes[k]: */ - __pyx_v_H_left = (__pyx_v_H_left - (((__pyx_v_self->__pyx_base.label_count_left[__pyx_v_k]) / __pyx_v_n_left) * log(((__pyx_v_self->__pyx_base.label_count_left[__pyx_v_k]) / __pyx_v_n_left)))); - goto __pyx_L5; - } - __pyx_L5:; + __pyx_v_H_right = 0.0; - /* "sklearn/tree/_tree.pyx":236 - * H_left -= ((self.label_count_left[k] / n_left) - * * log(self.label_count_left[k] / n_left)) - * if self.label_count_right[k] > 0: # <<<<<<<<<<<<<< - * H_right -= ((self.label_count_right[k] / n_right) - * * log(self.label_count_right[k] / n_right)) + /* "sklearn/tree/_tree.pyx":333 + * H_right = 0.0 + * + * for c from 0 <= c < n_classes[k]: # <<<<<<<<<<<<<< + * if label_count_left[k * label_count_stride + c] > 0: + * H_left -= ((label_count_left[k * label_count_stride + c] / n_left) * log(label_count_left[k * label_count_stride + c] / n_left)) */ - __pyx_t_2 = ((__pyx_v_self->__pyx_base.label_count_right[__pyx_v_k]) > 0); - if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_n_classes[__pyx_v_k]); + for (__pyx_v_c = 0; __pyx_v_c < __pyx_t_2; __pyx_v_c++) { - /* "sklearn/tree/_tree.pyx":238 - * if self.label_count_right[k] > 0: - * H_right -= ((self.label_count_right[k] / n_right) - * * log(self.label_count_right[k] / n_right)) # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":334 + * + * for c from 0 <= c < n_classes[k]: + * if label_count_left[k * label_count_stride + c] > 0: # <<<<<<<<<<<<<< + * H_left -= ((label_count_left[k * label_count_stride + c] / n_left) * log(label_count_left[k * label_count_stride + c] / n_left)) * - * e1 = (n_left / self.n_samples) * H_left */ - __pyx_v_H_right = (__pyx_v_H_right - (((__pyx_v_self->__pyx_base.label_count_right[__pyx_v_k]) / __pyx_v_n_right) * log(((__pyx_v_self->__pyx_base.label_count_right[__pyx_v_k]) / __pyx_v_n_right)))); - goto __pyx_L6; + __pyx_t_3 = ((__pyx_v_label_count_left[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]) > 0); + if (__pyx_t_3) { + + /* "sklearn/tree/_tree.pyx":335 + * for c from 0 <= c < n_classes[k]: + * if label_count_left[k * label_count_stride + c] > 0: + * H_left -= ((label_count_left[k * label_count_stride + c] / n_left) * log(label_count_left[k * label_count_stride + c] / n_left)) # <<<<<<<<<<<<<< + * + * if self.label_count_right[k * label_count_stride + c] > 0: + */ + __pyx_v_H_left = (__pyx_v_H_left - (((__pyx_v_label_count_left[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]) / __pyx_v_n_left) * log(((__pyx_v_label_count_left[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]) / __pyx_v_n_left)))); + goto __pyx_L7; + } + __pyx_L7:; + + /* "sklearn/tree/_tree.pyx":337 + * H_left -= ((label_count_left[k * label_count_stride + c] / n_left) * log(label_count_left[k * label_count_stride + c] / n_left)) + * + * if self.label_count_right[k * label_count_stride + c] > 0: # <<<<<<<<<<<<<< + * H_right -= ((label_count_right[k * label_count_stride + c] / n_right) * log(label_count_right[k * label_count_stride + c] / n_right)) + * + */ + __pyx_t_3 = ((__pyx_v_self->__pyx_base.label_count_right[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]) > 0); + if (__pyx_t_3) { + + /* "sklearn/tree/_tree.pyx":338 + * + * if self.label_count_right[k * label_count_stride + c] > 0: + * H_right -= ((label_count_right[k * label_count_stride + c] / n_right) * log(label_count_right[k * label_count_stride + c] / n_right)) # <<<<<<<<<<<<<< + * + * e1 = (n_left / n_samples) * H_left + */ + __pyx_v_H_right = (__pyx_v_H_right - (((__pyx_v_label_count_right[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]) / __pyx_v_n_right) * log(((__pyx_v_label_count_right[((__pyx_v_k * __pyx_v_label_count_stride) + __pyx_v_c)]) / __pyx_v_n_right)))); + goto __pyx_L8; + } + __pyx_L8:; } - __pyx_L6:; - } - /* "sklearn/tree/_tree.pyx":240 - * * log(self.label_count_right[k] / n_right)) + /* "sklearn/tree/_tree.pyx":340 + * H_right -= ((label_count_right[k * label_count_stride + c] / n_right) * log(label_count_right[k * label_count_stride + c] / n_right)) + * + * e1 = (n_left / n_samples) * H_left # <<<<<<<<<<<<<< + * e2 = (n_right / n_samples) * H_right * - * e1 = (n_left / self.n_samples) * H_left # <<<<<<<<<<<<<< - * e2 = (n_right / self.n_samples) * H_right - * return e1 + e2 */ - __pyx_v_e1 = ((__pyx_v_n_left / __pyx_v_self->__pyx_base.n_samples) * __pyx_v_H_left); + __pyx_v_e1 = ((__pyx_v_n_left / __pyx_v_n_samples) * __pyx_v_H_left); - /* "sklearn/tree/_tree.pyx":241 + /* "sklearn/tree/_tree.pyx":341 * - * e1 = (n_left / self.n_samples) * H_left - * e2 = (n_right / self.n_samples) * H_right # <<<<<<<<<<<<<< - * return e1 + e2 + * e1 = (n_left / n_samples) * H_left + * e2 = (n_right / n_samples) * H_right # <<<<<<<<<<<<<< * + * total += e1 + e2 */ - __pyx_v_e2 = ((__pyx_v_n_right / __pyx_v_self->__pyx_base.n_samples) * __pyx_v_H_right); + __pyx_v_e2 = ((__pyx_v_n_right / __pyx_v_n_samples) * __pyx_v_H_right); - /* "sklearn/tree/_tree.pyx":242 - * e1 = (n_left / self.n_samples) * H_left - * e2 = (n_right / self.n_samples) * H_right - * return e1 + e2 # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":343 + * e2 = (n_right / n_samples) * H_right * + * total += e1 + e2 # <<<<<<<<<<<<<< * + * return total / n_outputs */ - __pyx_r = (__pyx_v_e1 + __pyx_v_e2); + __pyx_v_total = (__pyx_v_total + (__pyx_v_e1 + __pyx_v_e2)); + } + + /* "sklearn/tree/_tree.pyx":345 + * total += e1 + e2 + * + * return total / n_outputs # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = (__pyx_v_total / __pyx_v_n_outputs); goto __pyx_L0; __pyx_r = 0; @@ -2789,242 +3373,520 @@ static double __pyx_f_7sklearn_4tree_5_tree_7Entropy_eval(struct __pyx_obj_7skle /* Python wrapper */ static int __pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + int __pyx_v_n_outputs; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__n_outputs,0}; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); - if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;} - if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1; - __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion___init__(((struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *)__pyx_v_self)); + { + PyObject* values[1] = {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 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: + values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_outputs); + if (likely(values[0])) kw_args--; + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + } + __pyx_v_n_outputs = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_n_outputs == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sklearn.tree._tree.RegressionCriterion.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion___init__(((struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *)__pyx_v_self), __pyx_v_n_outputs); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "sklearn/tree/_tree.pyx":299 - * cdef double var_right +/* "sklearn/tree/_tree.pyx":402 + * cdef int n_left + * + * def __init__(self, int n_outputs): # <<<<<<<<<<<<<< + * cdef int k = 0 * - * def __init__(self): # <<<<<<<<<<<<<< - * self.n_samples = 0 - * self.n_left = 0 */ -static int __pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion___init__(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self) { +static int __pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion___init__(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self, int __pyx_v_n_outputs) { + CYTHON_UNUSED int __pyx_v_k; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__", 0); - /* "sklearn/tree/_tree.pyx":300 + /* "sklearn/tree/_tree.pyx":403 + * + * def __init__(self, int n_outputs): + * cdef int k = 0 # <<<<<<<<<<<<<< + * + * self.n_outputs = n_outputs + */ + __pyx_v_k = 0; + + /* "sklearn/tree/_tree.pyx":405 + * cdef int k = 0 + * + * self.n_outputs = n_outputs # <<<<<<<<<<<<<< + * + * self.n_samples = 0 + */ + __pyx_v_self->n_outputs = __pyx_v_n_outputs; + + /* "sklearn/tree/_tree.pyx":407 + * self.n_outputs = n_outputs * - * def __init__(self): * self.n_samples = 0 # <<<<<<<<<<<<<< * self.n_left = 0 * self.n_right = 0 */ __pyx_v_self->n_samples = 0; - /* "sklearn/tree/_tree.pyx":301 - * def __init__(self): + /* "sklearn/tree/_tree.pyx":408 + * * self.n_samples = 0 * self.n_left = 0 # <<<<<<<<<<<<<< * self.n_right = 0 - * self.mean_left = 0.0 + * */ __pyx_v_self->n_left = 0; - /* "sklearn/tree/_tree.pyx":302 + /* "sklearn/tree/_tree.pyx":409 * self.n_samples = 0 * self.n_left = 0 * self.n_right = 0 # <<<<<<<<<<<<<< - * self.mean_left = 0.0 - * self.mean_right = 0.0 + * + * self.mean_left = calloc(n_outputs, sizeof(double)) */ __pyx_v_self->n_right = 0; - /* "sklearn/tree/_tree.pyx":303 - * self.n_left = 0 + /* "sklearn/tree/_tree.pyx":411 * self.n_right = 0 - * self.mean_left = 0.0 # <<<<<<<<<<<<<< - * self.mean_right = 0.0 - * self.mean_init = 0.0 + * + * self.mean_left = calloc(n_outputs, sizeof(double)) # <<<<<<<<<<<<<< + * self.mean_right = calloc(n_outputs, sizeof(double)) + * self.mean_init = calloc(n_outputs, sizeof(double)) */ - __pyx_v_self->mean_left = 0.0; + __pyx_v_self->mean_left = ((double *)calloc(__pyx_v_n_outputs, (sizeof(double)))); - /* "sklearn/tree/_tree.pyx":304 - * self.n_right = 0 - * self.mean_left = 0.0 - * self.mean_right = 0.0 # <<<<<<<<<<<<<< - * self.mean_init = 0.0 - * self.sq_sum_right = 0.0 + /* "sklearn/tree/_tree.pyx":412 + * + * self.mean_left = calloc(n_outputs, sizeof(double)) + * self.mean_right = calloc(n_outputs, sizeof(double)) # <<<<<<<<<<<<<< + * self.mean_init = calloc(n_outputs, sizeof(double)) + * self.sq_sum_left = calloc(n_outputs, sizeof(double)) */ - __pyx_v_self->mean_right = 0.0; + __pyx_v_self->mean_right = ((double *)calloc(__pyx_v_n_outputs, (sizeof(double)))); - /* "sklearn/tree/_tree.pyx":305 - * self.mean_left = 0.0 - * self.mean_right = 0.0 - * self.mean_init = 0.0 # <<<<<<<<<<<<<< - * self.sq_sum_right = 0.0 - * self.sq_sum_left = 0.0 + /* "sklearn/tree/_tree.pyx":413 + * self.mean_left = calloc(n_outputs, sizeof(double)) + * self.mean_right = calloc(n_outputs, sizeof(double)) + * self.mean_init = calloc(n_outputs, sizeof(double)) # <<<<<<<<<<<<<< + * self.sq_sum_left = calloc(n_outputs, sizeof(double)) + * self.sq_sum_right = calloc(n_outputs, sizeof(double)) */ - __pyx_v_self->mean_init = 0.0; + __pyx_v_self->mean_init = ((double *)calloc(__pyx_v_n_outputs, (sizeof(double)))); - /* "sklearn/tree/_tree.pyx":306 - * self.mean_right = 0.0 - * self.mean_init = 0.0 - * self.sq_sum_right = 0.0 # <<<<<<<<<<<<<< - * self.sq_sum_left = 0.0 - * self.sq_sum_init = 0.0 + /* "sklearn/tree/_tree.pyx":414 + * self.mean_right = calloc(n_outputs, sizeof(double)) + * self.mean_init = calloc(n_outputs, sizeof(double)) + * self.sq_sum_left = calloc(n_outputs, sizeof(double)) # <<<<<<<<<<<<<< + * self.sq_sum_right = calloc(n_outputs, sizeof(double)) + * self.sq_sum_init = calloc(n_outputs, sizeof(double)) */ - __pyx_v_self->sq_sum_right = 0.0; + __pyx_v_self->sq_sum_left = ((double *)calloc(__pyx_v_n_outputs, (sizeof(double)))); - /* "sklearn/tree/_tree.pyx":307 - * self.mean_init = 0.0 - * self.sq_sum_right = 0.0 - * self.sq_sum_left = 0.0 # <<<<<<<<<<<<<< - * self.sq_sum_init = 0.0 - * self.var_left = 0.0 + /* "sklearn/tree/_tree.pyx":415 + * self.mean_init = calloc(n_outputs, sizeof(double)) + * self.sq_sum_left = calloc(n_outputs, sizeof(double)) + * self.sq_sum_right = calloc(n_outputs, sizeof(double)) # <<<<<<<<<<<<<< + * self.sq_sum_init = calloc(n_outputs, sizeof(double)) + * self.var_left = calloc(n_outputs, sizeof(double)) */ - __pyx_v_self->sq_sum_left = 0.0; + __pyx_v_self->sq_sum_right = ((double *)calloc(__pyx_v_n_outputs, (sizeof(double)))); - /* "sklearn/tree/_tree.pyx":308 - * self.sq_sum_right = 0.0 - * self.sq_sum_left = 0.0 - * self.sq_sum_init = 0.0 # <<<<<<<<<<<<<< - * self.var_left = 0.0 - * self.var_right = 0.0 + /* "sklearn/tree/_tree.pyx":416 + * self.sq_sum_left = calloc(n_outputs, sizeof(double)) + * self.sq_sum_right = calloc(n_outputs, sizeof(double)) + * self.sq_sum_init = calloc(n_outputs, sizeof(double)) # <<<<<<<<<<<<<< + * self.var_left = calloc(n_outputs, sizeof(double)) + * self.var_right = calloc(n_outputs, sizeof(double)) */ - __pyx_v_self->sq_sum_init = 0.0; + __pyx_v_self->sq_sum_init = ((double *)calloc(__pyx_v_n_outputs, (sizeof(double)))); - /* "sklearn/tree/_tree.pyx":309 - * self.sq_sum_left = 0.0 - * self.sq_sum_init = 0.0 - * self.var_left = 0.0 # <<<<<<<<<<<<<< - * self.var_right = 0.0 + /* "sklearn/tree/_tree.pyx":417 + * self.sq_sum_right = calloc(n_outputs, sizeof(double)) + * self.sq_sum_init = calloc(n_outputs, sizeof(double)) + * self.var_left = calloc(n_outputs, sizeof(double)) # <<<<<<<<<<<<<< + * self.var_right = calloc(n_outputs, sizeof(double)) * */ - __pyx_v_self->var_left = 0.0; + __pyx_v_self->var_left = ((double *)calloc(__pyx_v_n_outputs, (sizeof(double)))); - /* "sklearn/tree/_tree.pyx":310 - * self.sq_sum_init = 0.0 - * self.var_left = 0.0 - * self.var_right = 0.0 # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":418 + * self.sq_sum_init = calloc(n_outputs, sizeof(double)) + * self.var_left = calloc(n_outputs, sizeof(double)) + * self.var_right = calloc(n_outputs, sizeof(double)) # <<<<<<<<<<<<<< * - * cdef void init(self, DTYPE_t *y, BOOL_t *sample_mask, int n_samples, + * def __del__(self): */ - __pyx_v_self->var_right = 0.0; + __pyx_v_self->var_right = ((double *)calloc(__pyx_v_n_outputs, (sizeof(double)))); __pyx_r = 0; __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "sklearn/tree/_tree.pyx":312 - * self.var_right = 0.0 +/* Python wrapper */ +static PyObject *__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion_2__del__(((struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *)__pyx_v_self)); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "sklearn/tree/_tree.pyx":420 + * self.var_right = calloc(n_outputs, sizeof(double)) + * + * def __del__(self): # <<<<<<<<<<<<<< + * free(self.mean_left) + * free(self.mean_right) + */ + +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion_2__del__(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 0); + + /* "sklearn/tree/_tree.pyx":421 + * + * def __del__(self): + * free(self.mean_left) # <<<<<<<<<<<<<< + * free(self.mean_right) + * free(self.mean_init) + */ + free(__pyx_v_self->mean_left); + + /* "sklearn/tree/_tree.pyx":422 + * def __del__(self): + * free(self.mean_left) + * free(self.mean_right) # <<<<<<<<<<<<<< + * free(self.mean_init) + * free(self.sq_sum_left) + */ + free(__pyx_v_self->mean_right); + + /* "sklearn/tree/_tree.pyx":423 + * free(self.mean_left) + * free(self.mean_right) + * free(self.mean_init) # <<<<<<<<<<<<<< + * free(self.sq_sum_left) + * free(self.sq_sum_right) + */ + free(__pyx_v_self->mean_init); + + /* "sklearn/tree/_tree.pyx":424 + * free(self.mean_right) + * free(self.mean_init) + * free(self.sq_sum_left) # <<<<<<<<<<<<<< + * free(self.sq_sum_right) + * free(self.sq_sum_init) + */ + free(__pyx_v_self->sq_sum_left); + + /* "sklearn/tree/_tree.pyx":425 + * free(self.mean_init) + * free(self.sq_sum_left) + * free(self.sq_sum_right) # <<<<<<<<<<<<<< + * free(self.sq_sum_init) + * free(self.var_left) + */ + free(__pyx_v_self->sq_sum_right); + + /* "sklearn/tree/_tree.pyx":426 + * free(self.sq_sum_left) + * free(self.sq_sum_right) + * free(self.sq_sum_init) # <<<<<<<<<<<<<< + * free(self.var_left) + * free(self.var_right) + */ + free(__pyx_v_self->sq_sum_init); + + /* "sklearn/tree/_tree.pyx":427 + * free(self.sq_sum_right) + * free(self.sq_sum_init) + * free(self.var_left) # <<<<<<<<<<<<<< + * free(self.var_right) + * + */ + free(__pyx_v_self->var_left); + + /* "sklearn/tree/_tree.pyx":428 + * free(self.sq_sum_init) + * free(self.var_left) + * free(self.var_right) # <<<<<<<<<<<<<< * - * cdef void init(self, DTYPE_t *y, BOOL_t *sample_mask, int n_samples, # <<<<<<<<<<<<<< - * int n_total_samples): - * """Initialise the criterion class; assume all samples + * cdef void init(self, DTYPE_t* y, */ + free(__pyx_v_self->var_right); -static void __pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_init(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask, int __pyx_v_n_samples, int __pyx_v_n_total_samples) { + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "sklearn/tree/_tree.pyx":430 + * free(self.var_right) + * + * cdef void init(self, DTYPE_t* y, # <<<<<<<<<<<<<< + * int y_stride, + * BOOL_t* sample_mask, + */ + +static void __pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_init(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, int __pyx_v_y_stride, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask, int __pyx_v_n_samples, int __pyx_v_n_total_samples) { + double *__pyx_v_mean_left; + double *__pyx_v_mean_right; + double *__pyx_v_mean_init; + double *__pyx_v_sq_sum_left; + double *__pyx_v_sq_sum_right; + double *__pyx_v_sq_sum_init; + double *__pyx_v_var_left; + double *__pyx_v_var_right; + int __pyx_v_n_outputs; + int __pyx_v_k; int __pyx_v_j; + __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_v_y_jk; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; __Pyx_RefNannySetupContext("init", 0); - /* "sklearn/tree/_tree.pyx":317 + /* "sklearn/tree/_tree.pyx":438 * are in the right branch and store the mean and squared * sum in `self.mean_init` and `self.sq_sum_init`. """ - * self.mean_left = 0.0 # <<<<<<<<<<<<<< - * self.mean_right = 0.0 - * self.mean_init = 0.0 + * cdef double* mean_left = self.mean_left # <<<<<<<<<<<<<< + * cdef double* mean_right = self.mean_right + * cdef double* mean_init = self.mean_init */ - __pyx_v_self->mean_left = 0.0; + __pyx_v_mean_left = __pyx_v_self->mean_left; - /* "sklearn/tree/_tree.pyx":318 + /* "sklearn/tree/_tree.pyx":439 * sum in `self.mean_init` and `self.sq_sum_init`. """ - * self.mean_left = 0.0 - * self.mean_right = 0.0 # <<<<<<<<<<<<<< - * self.mean_init = 0.0 - * self.sq_sum_right = 0.0 + * cdef double* mean_left = self.mean_left + * cdef double* mean_right = self.mean_right # <<<<<<<<<<<<<< + * cdef double* mean_init = self.mean_init + * cdef double* sq_sum_left = self.sq_sum_left */ - __pyx_v_self->mean_right = 0.0; + __pyx_v_mean_right = __pyx_v_self->mean_right; - /* "sklearn/tree/_tree.pyx":319 - * self.mean_left = 0.0 - * self.mean_right = 0.0 - * self.mean_init = 0.0 # <<<<<<<<<<<<<< - * self.sq_sum_right = 0.0 - * self.sq_sum_left = 0.0 + /* "sklearn/tree/_tree.pyx":440 + * cdef double* mean_left = self.mean_left + * cdef double* mean_right = self.mean_right + * cdef double* mean_init = self.mean_init # <<<<<<<<<<<<<< + * cdef double* sq_sum_left = self.sq_sum_left + * cdef double* sq_sum_right = self.sq_sum_right */ - __pyx_v_self->mean_init = 0.0; + __pyx_v_mean_init = __pyx_v_self->mean_init; - /* "sklearn/tree/_tree.pyx":320 - * self.mean_right = 0.0 - * self.mean_init = 0.0 - * self.sq_sum_right = 0.0 # <<<<<<<<<<<<<< - * self.sq_sum_left = 0.0 - * self.sq_sum_init = 0.0 + /* "sklearn/tree/_tree.pyx":441 + * cdef double* mean_right = self.mean_right + * cdef double* mean_init = self.mean_init + * cdef double* sq_sum_left = self.sq_sum_left # <<<<<<<<<<<<<< + * cdef double* sq_sum_right = self.sq_sum_right + * cdef double* sq_sum_init = self.sq_sum_init */ - __pyx_v_self->sq_sum_right = 0.0; + __pyx_v_sq_sum_left = __pyx_v_self->sq_sum_left; - /* "sklearn/tree/_tree.pyx":321 - * self.mean_init = 0.0 - * self.sq_sum_right = 0.0 - * self.sq_sum_left = 0.0 # <<<<<<<<<<<<<< - * self.sq_sum_init = 0.0 - * self.var_left = 0.0 + /* "sklearn/tree/_tree.pyx":442 + * cdef double* mean_init = self.mean_init + * cdef double* sq_sum_left = self.sq_sum_left + * cdef double* sq_sum_right = self.sq_sum_right # <<<<<<<<<<<<<< + * cdef double* sq_sum_init = self.sq_sum_init + * cdef double* var_left = self.var_left */ - __pyx_v_self->sq_sum_left = 0.0; + __pyx_v_sq_sum_right = __pyx_v_self->sq_sum_right; - /* "sklearn/tree/_tree.pyx":322 - * self.sq_sum_right = 0.0 - * self.sq_sum_left = 0.0 - * self.sq_sum_init = 0.0 # <<<<<<<<<<<<<< - * self.var_left = 0.0 - * self.var_right = 0.0 + /* "sklearn/tree/_tree.pyx":443 + * cdef double* sq_sum_left = self.sq_sum_left + * cdef double* sq_sum_right = self.sq_sum_right + * cdef double* sq_sum_init = self.sq_sum_init # <<<<<<<<<<<<<< + * cdef double* var_left = self.var_left + * cdef double* var_right = self.var_right */ - __pyx_v_self->sq_sum_init = 0.0; + __pyx_v_sq_sum_init = __pyx_v_self->sq_sum_init; - /* "sklearn/tree/_tree.pyx":323 - * self.sq_sum_left = 0.0 - * self.sq_sum_init = 0.0 - * self.var_left = 0.0 # <<<<<<<<<<<<<< - * self.var_right = 0.0 - * self.n_samples = n_samples + /* "sklearn/tree/_tree.pyx":444 + * cdef double* sq_sum_right = self.sq_sum_right + * cdef double* sq_sum_init = self.sq_sum_init + * cdef double* var_left = self.var_left # <<<<<<<<<<<<<< + * cdef double* var_right = self.var_right + * cdef int n_outputs = self.n_outputs */ - __pyx_v_self->var_left = 0.0; + __pyx_v_var_left = __pyx_v_self->var_left; - /* "sklearn/tree/_tree.pyx":324 - * self.sq_sum_init = 0.0 - * self.var_left = 0.0 - * self.var_right = 0.0 # <<<<<<<<<<<<<< - * self.n_samples = n_samples + /* "sklearn/tree/_tree.pyx":445 + * cdef double* sq_sum_init = self.sq_sum_init + * cdef double* var_left = self.var_left + * cdef double* var_right = self.var_right # <<<<<<<<<<<<<< + * cdef int n_outputs = self.n_outputs + * + */ + __pyx_v_var_right = __pyx_v_self->var_right; + + /* "sklearn/tree/_tree.pyx":446 + * cdef double* var_left = self.var_left + * cdef double* var_right = self.var_right + * cdef int n_outputs = self.n_outputs # <<<<<<<<<<<<<< + * + * cdef int k = 0 + */ + __pyx_v_n_outputs = __pyx_v_self->n_outputs; + + /* "sklearn/tree/_tree.pyx":448 + * cdef int n_outputs = self.n_outputs * + * cdef int k = 0 # <<<<<<<<<<<<<< + * + * for k from 0 <= k < n_outputs: + */ + __pyx_v_k = 0; + + /* "sklearn/tree/_tree.pyx":450 + * cdef int k = 0 + * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * mean_left[k] = 0.0 + * mean_right[k] = 0.0 + */ + __pyx_t_1 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_1; __pyx_v_k++) { + + /* "sklearn/tree/_tree.pyx":451 + * + * for k from 0 <= k < n_outputs: + * mean_left[k] = 0.0 # <<<<<<<<<<<<<< + * mean_right[k] = 0.0 + * mean_init[k] = 0.0 + */ + (__pyx_v_mean_left[__pyx_v_k]) = 0.0; + + /* "sklearn/tree/_tree.pyx":452 + * for k from 0 <= k < n_outputs: + * mean_left[k] = 0.0 + * mean_right[k] = 0.0 # <<<<<<<<<<<<<< + * mean_init[k] = 0.0 + * sq_sum_right[k] = 0.0 + */ + (__pyx_v_mean_right[__pyx_v_k]) = 0.0; + + /* "sklearn/tree/_tree.pyx":453 + * mean_left[k] = 0.0 + * mean_right[k] = 0.0 + * mean_init[k] = 0.0 # <<<<<<<<<<<<<< + * sq_sum_right[k] = 0.0 + * sq_sum_left[k] = 0.0 + */ + (__pyx_v_mean_init[__pyx_v_k]) = 0.0; + + /* "sklearn/tree/_tree.pyx":454 + * mean_right[k] = 0.0 + * mean_init[k] = 0.0 + * sq_sum_right[k] = 0.0 # <<<<<<<<<<<<<< + * sq_sum_left[k] = 0.0 + * sq_sum_init[k] = 0.0 + */ + (__pyx_v_sq_sum_right[__pyx_v_k]) = 0.0; + + /* "sklearn/tree/_tree.pyx":455 + * mean_init[k] = 0.0 + * sq_sum_right[k] = 0.0 + * sq_sum_left[k] = 0.0 # <<<<<<<<<<<<<< + * sq_sum_init[k] = 0.0 + * var_left[k] = 0.0 */ - __pyx_v_self->var_right = 0.0; + (__pyx_v_sq_sum_left[__pyx_v_k]) = 0.0; - /* "sklearn/tree/_tree.pyx":325 - * self.var_left = 0.0 - * self.var_right = 0.0 + /* "sklearn/tree/_tree.pyx":456 + * sq_sum_right[k] = 0.0 + * sq_sum_left[k] = 0.0 + * sq_sum_init[k] = 0.0 # <<<<<<<<<<<<<< + * var_left[k] = 0.0 + * var_right[k] = 0.0 + */ + (__pyx_v_sq_sum_init[__pyx_v_k]) = 0.0; + + /* "sklearn/tree/_tree.pyx":457 + * sq_sum_left[k] = 0.0 + * sq_sum_init[k] = 0.0 + * var_left[k] = 0.0 # <<<<<<<<<<<<<< + * var_right[k] = 0.0 + * + */ + (__pyx_v_var_left[__pyx_v_k]) = 0.0; + + /* "sklearn/tree/_tree.pyx":458 + * sq_sum_init[k] = 0.0 + * var_left[k] = 0.0 + * var_right[k] = 0.0 # <<<<<<<<<<<<<< + * + * self.n_samples = n_samples + */ + (__pyx_v_var_right[__pyx_v_k]) = 0.0; + } + + /* "sklearn/tree/_tree.pyx":460 + * var_right[k] = 0.0 + * * self.n_samples = n_samples # <<<<<<<<<<<<<< * * cdef int j = 0 */ __pyx_v_self->n_samples = __pyx_v_n_samples; - /* "sklearn/tree/_tree.pyx":327 + /* "sklearn/tree/_tree.pyx":462 * self.n_samples = n_samples * * cdef int j = 0 # <<<<<<<<<<<<<< - * for j from 0 <= j < n_total_samples: - * if sample_mask[j] == 0: + * cdef DTYPE_t y_jk = 0.0 + * */ __pyx_v_j = 0; - /* "sklearn/tree/_tree.pyx":328 + /* "sklearn/tree/_tree.pyx":463 * * cdef int j = 0 + * cdef DTYPE_t y_jk = 0.0 # <<<<<<<<<<<<<< + * + * for j from 0 <= j < n_total_samples: + */ + __pyx_v_y_jk = 0.0; + + /* "sklearn/tree/_tree.pyx":465 + * cdef DTYPE_t y_jk = 0.0 + * * for j from 0 <= j < n_total_samples: # <<<<<<<<<<<<<< * if sample_mask[j] == 0: * continue @@ -3032,59 +3894,93 @@ static void __pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_init(struct __py __pyx_t_1 = __pyx_v_n_total_samples; for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) { - /* "sklearn/tree/_tree.pyx":329 - * cdef int j = 0 + /* "sklearn/tree/_tree.pyx":466 + * * for j from 0 <= j < n_total_samples: * if sample_mask[j] == 0: # <<<<<<<<<<<<<< * continue - * self.sq_sum_init += (y[j] * y[j]) + * */ __pyx_t_2 = ((__pyx_v_sample_mask[__pyx_v_j]) == 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":330 + /* "sklearn/tree/_tree.pyx":467 * for j from 0 <= j < n_total_samples: * if sample_mask[j] == 0: * continue # <<<<<<<<<<<<<< - * self.sq_sum_init += (y[j] * y[j]) - * self.mean_init += y[j] + * + * for k from 0 <= k < n_outputs: */ - goto __pyx_L3_continue; - goto __pyx_L5; + goto __pyx_L5_continue; + goto __pyx_L7; } - __pyx_L5:; + __pyx_L7:; - /* "sklearn/tree/_tree.pyx":331 - * if sample_mask[j] == 0: + /* "sklearn/tree/_tree.pyx":469 * continue - * self.sq_sum_init += (y[j] * y[j]) # <<<<<<<<<<<<<< - * self.mean_init += y[j] * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * y_jk = y[j * y_stride + k] + * sq_sum_init[k] += y_jk * y_jk */ - __pyx_v_self->sq_sum_init = (__pyx_v_self->sq_sum_init + ((__pyx_v_y[__pyx_v_j]) * (__pyx_v_y[__pyx_v_j]))); + __pyx_t_3 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_3; __pyx_v_k++) { - /* "sklearn/tree/_tree.pyx":332 - * continue - * self.sq_sum_init += (y[j] * y[j]) - * self.mean_init += y[j] # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":470 * - * self.mean_init = self.mean_init / self.n_samples + * for k from 0 <= k < n_outputs: + * y_jk = y[j * y_stride + k] # <<<<<<<<<<<<<< + * sq_sum_init[k] += y_jk * y_jk + * mean_init[k] += y_jk */ - __pyx_v_self->mean_init = (__pyx_v_self->mean_init + (__pyx_v_y[__pyx_v_j])); - __pyx_L3_continue:; + __pyx_v_y_jk = (__pyx_v_y[((__pyx_v_j * __pyx_v_y_stride) + __pyx_v_k)]); + + /* "sklearn/tree/_tree.pyx":471 + * for k from 0 <= k < n_outputs: + * y_jk = y[j * y_stride + k] + * sq_sum_init[k] += y_jk * y_jk # <<<<<<<<<<<<<< + * mean_init[k] += y_jk + * + */ + __pyx_t_4 = __pyx_v_k; + (__pyx_v_sq_sum_init[__pyx_t_4]) = ((__pyx_v_sq_sum_init[__pyx_t_4]) + (__pyx_v_y_jk * __pyx_v_y_jk)); + + /* "sklearn/tree/_tree.pyx":472 + * y_jk = y[j * y_stride + k] + * sq_sum_init[k] += y_jk * y_jk + * mean_init[k] += y_jk # <<<<<<<<<<<<<< + * + * for k from 0 <= k < n_outputs: + */ + __pyx_t_4 = __pyx_v_k; + (__pyx_v_mean_init[__pyx_t_4]) = ((__pyx_v_mean_init[__pyx_t_4]) + __pyx_v_y_jk); + } + __pyx_L5_continue:; } - /* "sklearn/tree/_tree.pyx":334 - * self.mean_init += y[j] + /* "sklearn/tree/_tree.pyx":474 + * mean_init[k] += y_jk + * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * mean_init[k] /= n_samples + * + */ + __pyx_t_1 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_1; __pyx_v_k++) { + + /* "sklearn/tree/_tree.pyx":475 * - * self.mean_init = self.mean_init / self.n_samples # <<<<<<<<<<<<<< + * for k from 0 <= k < n_outputs: + * mean_init[k] /= n_samples # <<<<<<<<<<<<<< * * self.reset() */ - __pyx_v_self->mean_init = (__pyx_v_self->mean_init / __pyx_v_self->n_samples); + __pyx_t_3 = __pyx_v_k; + (__pyx_v_mean_init[__pyx_t_3]) = ((__pyx_v_mean_init[__pyx_t_3]) / __pyx_v_n_samples); + } - /* "sklearn/tree/_tree.pyx":336 - * self.mean_init = self.mean_init / self.n_samples + /* "sklearn/tree/_tree.pyx":477 + * mean_init[k] /= n_samples * * self.reset() # <<<<<<<<<<<<<< * @@ -3095,7 +3991,7 @@ static void __pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_init(struct __py __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_tree.pyx":338 +/* "sklearn/tree/_tree.pyx":479 * self.reset() * * cdef void reset(self): # <<<<<<<<<<<<<< @@ -3104,243 +4000,510 @@ static void __pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_init(struct __py */ static void __pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_reset(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self) { + double *__pyx_v_mean_left; + double *__pyx_v_mean_right; + double *__pyx_v_mean_init; + double *__pyx_v_sq_sum_left; + double *__pyx_v_sq_sum_right; + double *__pyx_v_sq_sum_init; + double *__pyx_v_var_left; + double *__pyx_v_var_right; + int __pyx_v_n_samples; + int __pyx_v_n_outputs; + int __pyx_v_k; __Pyx_RefNannyDeclarations + int __pyx_t_1; __Pyx_RefNannySetupContext("reset", 0); - /* "sklearn/tree/_tree.pyx":345 + /* "sklearn/tree/_tree.pyx":486 * right branch. * """ + * cdef double* mean_left = self.mean_left # <<<<<<<<<<<<<< + * cdef double* mean_right = self.mean_right + * cdef double* mean_init = self.mean_init + */ + __pyx_v_mean_left = __pyx_v_self->mean_left; + + /* "sklearn/tree/_tree.pyx":487 + * """ + * cdef double* mean_left = self.mean_left + * cdef double* mean_right = self.mean_right # <<<<<<<<<<<<<< + * cdef double* mean_init = self.mean_init + * cdef double* sq_sum_left = self.sq_sum_left + */ + __pyx_v_mean_right = __pyx_v_self->mean_right; + + /* "sklearn/tree/_tree.pyx":488 + * cdef double* mean_left = self.mean_left + * cdef double* mean_right = self.mean_right + * cdef double* mean_init = self.mean_init # <<<<<<<<<<<<<< + * cdef double* sq_sum_left = self.sq_sum_left + * cdef double* sq_sum_right = self.sq_sum_right + */ + __pyx_v_mean_init = __pyx_v_self->mean_init; + + /* "sklearn/tree/_tree.pyx":489 + * cdef double* mean_right = self.mean_right + * cdef double* mean_init = self.mean_init + * cdef double* sq_sum_left = self.sq_sum_left # <<<<<<<<<<<<<< + * cdef double* sq_sum_right = self.sq_sum_right + * cdef double* sq_sum_init = self.sq_sum_init + */ + __pyx_v_sq_sum_left = __pyx_v_self->sq_sum_left; + + /* "sklearn/tree/_tree.pyx":490 + * cdef double* mean_init = self.mean_init + * cdef double* sq_sum_left = self.sq_sum_left + * cdef double* sq_sum_right = self.sq_sum_right # <<<<<<<<<<<<<< + * cdef double* sq_sum_init = self.sq_sum_init + * cdef double* var_left = self.var_left + */ + __pyx_v_sq_sum_right = __pyx_v_self->sq_sum_right; + + /* "sklearn/tree/_tree.pyx":491 + * cdef double* sq_sum_left = self.sq_sum_left + * cdef double* sq_sum_right = self.sq_sum_right + * cdef double* sq_sum_init = self.sq_sum_init # <<<<<<<<<<<<<< + * cdef double* var_left = self.var_left + * cdef double* var_right = self.var_right + */ + __pyx_v_sq_sum_init = __pyx_v_self->sq_sum_init; + + /* "sklearn/tree/_tree.pyx":492 + * cdef double* sq_sum_right = self.sq_sum_right + * cdef double* sq_sum_init = self.sq_sum_init + * cdef double* var_left = self.var_left # <<<<<<<<<<<<<< + * cdef double* var_right = self.var_right + * + */ + __pyx_v_var_left = __pyx_v_self->var_left; + + /* "sklearn/tree/_tree.pyx":493 + * cdef double* sq_sum_init = self.sq_sum_init + * cdef double* var_left = self.var_left + * cdef double* var_right = self.var_right # <<<<<<<<<<<<<< + * + * cdef int n_samples = self.n_samples + */ + __pyx_v_var_right = __pyx_v_self->var_right; + + /* "sklearn/tree/_tree.pyx":495 + * cdef double* var_right = self.var_right + * + * cdef int n_samples = self.n_samples # <<<<<<<<<<<<<< + * cdef int n_outputs = self.n_outputs + * + */ + __pyx_v_n_samples = __pyx_v_self->n_samples; + + /* "sklearn/tree/_tree.pyx":496 + * + * cdef int n_samples = self.n_samples + * cdef int n_outputs = self.n_outputs # <<<<<<<<<<<<<< + * + * cdef int k = 0 + */ + __pyx_v_n_outputs = __pyx_v_self->n_outputs; + + /* "sklearn/tree/_tree.pyx":498 + * cdef int n_outputs = self.n_outputs + * + * cdef int k = 0 # <<<<<<<<<<<<<< + * + * self.n_right = self.n_samples + */ + __pyx_v_k = 0; + + /* "sklearn/tree/_tree.pyx":500 + * cdef int k = 0 + * * self.n_right = self.n_samples # <<<<<<<<<<<<<< * self.n_left = 0 - * self.mean_right = self.mean_init + * */ __pyx_v_self->n_right = __pyx_v_self->n_samples; - /* "sklearn/tree/_tree.pyx":346 - * """ + /* "sklearn/tree/_tree.pyx":501 + * * self.n_right = self.n_samples * self.n_left = 0 # <<<<<<<<<<<<<< - * self.mean_right = self.mean_init - * self.mean_left = 0.0 + * + * for k from 0 <= k < n_outputs: */ __pyx_v_self->n_left = 0; - /* "sklearn/tree/_tree.pyx":347 - * self.n_right = self.n_samples + /* "sklearn/tree/_tree.pyx":503 * self.n_left = 0 - * self.mean_right = self.mean_init # <<<<<<<<<<<<<< - * self.mean_left = 0.0 - * self.sq_sum_right = self.sq_sum_init + * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * mean_right[k] = mean_init[k] + * mean_left[k] = 0.0 + */ + __pyx_t_1 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_1; __pyx_v_k++) { + + /* "sklearn/tree/_tree.pyx":504 + * + * for k from 0 <= k < n_outputs: + * mean_right[k] = mean_init[k] # <<<<<<<<<<<<<< + * mean_left[k] = 0.0 + * sq_sum_right[k] = sq_sum_init[k] */ - __pyx_v_self->mean_right = __pyx_v_self->mean_init; + (__pyx_v_mean_right[__pyx_v_k]) = (__pyx_v_mean_init[__pyx_v_k]); - /* "sklearn/tree/_tree.pyx":348 - * self.n_left = 0 - * self.mean_right = self.mean_init - * self.mean_left = 0.0 # <<<<<<<<<<<<<< - * self.sq_sum_right = self.sq_sum_init - * self.sq_sum_left = 0.0 + /* "sklearn/tree/_tree.pyx":505 + * for k from 0 <= k < n_outputs: + * mean_right[k] = mean_init[k] + * mean_left[k] = 0.0 # <<<<<<<<<<<<<< + * sq_sum_right[k] = sq_sum_init[k] + * sq_sum_left[k] = 0.0 */ - __pyx_v_self->mean_left = 0.0; + (__pyx_v_mean_left[__pyx_v_k]) = 0.0; - /* "sklearn/tree/_tree.pyx":349 - * self.mean_right = self.mean_init - * self.mean_left = 0.0 - * self.sq_sum_right = self.sq_sum_init # <<<<<<<<<<<<<< - * self.sq_sum_left = 0.0 - * self.var_left = 0.0 + /* "sklearn/tree/_tree.pyx":506 + * mean_right[k] = mean_init[k] + * mean_left[k] = 0.0 + * sq_sum_right[k] = sq_sum_init[k] # <<<<<<<<<<<<<< + * sq_sum_left[k] = 0.0 + * var_left[k] = 0.0 */ - __pyx_v_self->sq_sum_right = __pyx_v_self->sq_sum_init; + (__pyx_v_sq_sum_right[__pyx_v_k]) = (__pyx_v_sq_sum_init[__pyx_v_k]); - /* "sklearn/tree/_tree.pyx":350 - * self.mean_left = 0.0 - * self.sq_sum_right = self.sq_sum_init - * self.sq_sum_left = 0.0 # <<<<<<<<<<<<<< - * self.var_left = 0.0 - * self.var_right = self.sq_sum_right - \ + /* "sklearn/tree/_tree.pyx":507 + * mean_left[k] = 0.0 + * sq_sum_right[k] = sq_sum_init[k] + * sq_sum_left[k] = 0.0 # <<<<<<<<<<<<<< + * var_left[k] = 0.0 + * var_right[k] = sq_sum_right[k] - n_samples * (mean_right[k] * mean_right[k]) */ - __pyx_v_self->sq_sum_left = 0.0; + (__pyx_v_sq_sum_left[__pyx_v_k]) = 0.0; - /* "sklearn/tree/_tree.pyx":351 - * self.sq_sum_right = self.sq_sum_init - * self.sq_sum_left = 0.0 - * self.var_left = 0.0 # <<<<<<<<<<<<<< - * self.var_right = self.sq_sum_right - \ - * self.n_samples * (self.mean_right * self.mean_right) + /* "sklearn/tree/_tree.pyx":508 + * sq_sum_right[k] = sq_sum_init[k] + * sq_sum_left[k] = 0.0 + * var_left[k] = 0.0 # <<<<<<<<<<<<<< + * var_right[k] = sq_sum_right[k] - n_samples * (mean_right[k] * mean_right[k]) + * */ - __pyx_v_self->var_left = 0.0; + (__pyx_v_var_left[__pyx_v_k]) = 0.0; - /* "sklearn/tree/_tree.pyx":352 - * self.sq_sum_left = 0.0 - * self.var_left = 0.0 - * self.var_right = self.sq_sum_right - \ # <<<<<<<<<<<<<< - * self.n_samples * (self.mean_right * self.mean_right) + /* "sklearn/tree/_tree.pyx":509 + * sq_sum_left[k] = 0.0 + * var_left[k] = 0.0 + * var_right[k] = sq_sum_right[k] - n_samples * (mean_right[k] * mean_right[k]) # <<<<<<<<<<<<<< * + * cdef int update(self, int a, */ - __pyx_v_self->var_right = (__pyx_v_self->sq_sum_right - (__pyx_v_self->n_samples * (__pyx_v_self->mean_right * __pyx_v_self->mean_right))); + (__pyx_v_var_right[__pyx_v_k]) = ((__pyx_v_sq_sum_right[__pyx_v_k]) - (__pyx_v_n_samples * ((__pyx_v_mean_right[__pyx_v_k]) * (__pyx_v_mean_right[__pyx_v_k])))); + } __Pyx_RefNannyFinishContext(); } -/* "sklearn/tree/_tree.pyx":355 - * self.n_samples * (self.mean_right * self.mean_right) +/* "sklearn/tree/_tree.pyx":511 + * var_right[k] = sq_sum_right[k] - n_samples * (mean_right[k] * mean_right[k]) * - * cdef int update(self, int a, int b, DTYPE_t *y, int *X_argsorted_i, # <<<<<<<<<<<<<< - * BOOL_t *sample_mask): - * """Update the criteria for each value in interval [a,b) (where a and b + * cdef int update(self, int a, # <<<<<<<<<<<<<< + * int b, + * DTYPE_t* y, */ -static int __pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_update(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self, int __pyx_v_a, int __pyx_v_b, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, int *__pyx_v_X_argsorted_i, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask) { +static int __pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_update(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self, int __pyx_v_a, int __pyx_v_b, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y, int __pyx_v_y_stride, int *__pyx_v_X_argsorted_i, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask) { + double *__pyx_v_mean_left; + double *__pyx_v_mean_right; + double *__pyx_v_sq_sum_left; + double *__pyx_v_sq_sum_right; + double *__pyx_v_var_left; + double *__pyx_v_var_right; + int __pyx_v_n_samples; + int __pyx_v_n_outputs; + int __pyx_v_n_left; + int __pyx_v_n_right; double __pyx_v_y_idx; int __pyx_v_idx; int __pyx_v_j; + int __pyx_v_k; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; __Pyx_RefNannySetupContext("update", 0); - /* "sklearn/tree/_tree.pyx":359 + /* "sklearn/tree/_tree.pyx":519 * """Update the criteria for each value in interval [a,b) (where a and b * are indices in `X_argsorted_i`).""" + * cdef double* mean_left = self.mean_left # <<<<<<<<<<<<<< + * cdef double* mean_right = self.mean_right + * cdef double* sq_sum_left = self.sq_sum_left + */ + __pyx_v_mean_left = __pyx_v_self->mean_left; + + /* "sklearn/tree/_tree.pyx":520 + * are indices in `X_argsorted_i`).""" + * cdef double* mean_left = self.mean_left + * cdef double* mean_right = self.mean_right # <<<<<<<<<<<<<< + * cdef double* sq_sum_left = self.sq_sum_left + * cdef double* sq_sum_right = self.sq_sum_right + */ + __pyx_v_mean_right = __pyx_v_self->mean_right; + + /* "sklearn/tree/_tree.pyx":521 + * cdef double* mean_left = self.mean_left + * cdef double* mean_right = self.mean_right + * cdef double* sq_sum_left = self.sq_sum_left # <<<<<<<<<<<<<< + * cdef double* sq_sum_right = self.sq_sum_right + * cdef double* var_left = self.var_left + */ + __pyx_v_sq_sum_left = __pyx_v_self->sq_sum_left; + + /* "sklearn/tree/_tree.pyx":522 + * cdef double* mean_right = self.mean_right + * cdef double* sq_sum_left = self.sq_sum_left + * cdef double* sq_sum_right = self.sq_sum_right # <<<<<<<<<<<<<< + * cdef double* var_left = self.var_left + * cdef double* var_right = self.var_right + */ + __pyx_v_sq_sum_right = __pyx_v_self->sq_sum_right; + + /* "sklearn/tree/_tree.pyx":523 + * cdef double* sq_sum_left = self.sq_sum_left + * cdef double* sq_sum_right = self.sq_sum_right + * cdef double* var_left = self.var_left # <<<<<<<<<<<<<< + * cdef double* var_right = self.var_right + * + */ + __pyx_v_var_left = __pyx_v_self->var_left; + + /* "sklearn/tree/_tree.pyx":524 + * cdef double* sq_sum_right = self.sq_sum_right + * cdef double* var_left = self.var_left + * cdef double* var_right = self.var_right # <<<<<<<<<<<<<< + * + * cdef int n_samples = self.n_samples + */ + __pyx_v_var_right = __pyx_v_self->var_right; + + /* "sklearn/tree/_tree.pyx":526 + * cdef double* var_right = self.var_right + * + * cdef int n_samples = self.n_samples # <<<<<<<<<<<<<< + * cdef int n_outputs = self.n_outputs + * cdef int n_left = self.n_left + */ + __pyx_v_n_samples = __pyx_v_self->n_samples; + + /* "sklearn/tree/_tree.pyx":527 + * + * cdef int n_samples = self.n_samples + * cdef int n_outputs = self.n_outputs # <<<<<<<<<<<<<< + * cdef int n_left = self.n_left + * cdef int n_right = self.n_right + */ + __pyx_v_n_outputs = __pyx_v_self->n_outputs; + + /* "sklearn/tree/_tree.pyx":528 + * cdef int n_samples = self.n_samples + * cdef int n_outputs = self.n_outputs + * cdef int n_left = self.n_left # <<<<<<<<<<<<<< + * cdef int n_right = self.n_right + * + */ + __pyx_v_n_left = __pyx_v_self->n_left; + + /* "sklearn/tree/_tree.pyx":529 + * cdef int n_outputs = self.n_outputs + * cdef int n_left = self.n_left + * cdef int n_right = self.n_right # <<<<<<<<<<<<<< + * + * cdef double y_idx = 0.0 + */ + __pyx_v_n_right = __pyx_v_self->n_right; + + /* "sklearn/tree/_tree.pyx":531 + * cdef int n_right = self.n_right + * * cdef double y_idx = 0.0 # <<<<<<<<<<<<<< - * cdef int idx, j - * # post condition: all samples from [0:b) are on the left side + * cdef int idx, j, k + * */ __pyx_v_y_idx = 0.0; - /* "sklearn/tree/_tree.pyx":362 - * cdef int idx, j + /* "sklearn/tree/_tree.pyx":535 + * * # post condition: all samples from [0:b) are on the left side * for idx from a <= idx < b: # <<<<<<<<<<<<<< * j = X_argsorted_i[idx] - * if sample_mask[j] == 0: + * */ __pyx_t_1 = __pyx_v_b; for (__pyx_v_idx = __pyx_v_a; __pyx_v_idx < __pyx_t_1; __pyx_v_idx++) { - /* "sklearn/tree/_tree.pyx":363 + /* "sklearn/tree/_tree.pyx":536 * # post condition: all samples from [0:b) are on the left side * for idx from a <= idx < b: * j = X_argsorted_i[idx] # <<<<<<<<<<<<<< + * * if sample_mask[j] == 0: - * continue */ __pyx_v_j = (__pyx_v_X_argsorted_i[__pyx_v_idx]); - /* "sklearn/tree/_tree.pyx":364 - * for idx from a <= idx < b: + /* "sklearn/tree/_tree.pyx":538 * j = X_argsorted_i[idx] + * * if sample_mask[j] == 0: # <<<<<<<<<<<<<< * continue - * y_idx = y[j] + * */ __pyx_t_2 = ((__pyx_v_sample_mask[__pyx_v_j]) == 0); if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":365 - * j = X_argsorted_i[idx] + /* "sklearn/tree/_tree.pyx":539 + * * if sample_mask[j] == 0: * continue # <<<<<<<<<<<<<< - * y_idx = y[j] - * self.sq_sum_left = self.sq_sum_left + (y_idx * y_idx) + * + * for k from 0 <= k < n_outputs: */ goto __pyx_L3_continue; goto __pyx_L5; } __pyx_L5:; - /* "sklearn/tree/_tree.pyx":366 - * if sample_mask[j] == 0: + /* "sklearn/tree/_tree.pyx":541 * continue - * y_idx = y[j] # <<<<<<<<<<<<<< - * self.sq_sum_left = self.sq_sum_left + (y_idx * y_idx) - * self.sq_sum_right = self.sq_sum_right - (y_idx * y_idx) + * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * y_idx = y[j * y_stride + k] + * sq_sum_left[k] += (y_idx * y_idx) */ - __pyx_v_y_idx = (__pyx_v_y[__pyx_v_j]); + __pyx_t_3 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_3; __pyx_v_k++) { - /* "sklearn/tree/_tree.pyx":367 - * continue - * y_idx = y[j] - * self.sq_sum_left = self.sq_sum_left + (y_idx * y_idx) # <<<<<<<<<<<<<< - * self.sq_sum_right = self.sq_sum_right - (y_idx * y_idx) + /* "sklearn/tree/_tree.pyx":542 * + * for k from 0 <= k < n_outputs: + * y_idx = y[j * y_stride + k] # <<<<<<<<<<<<<< + * sq_sum_left[k] += (y_idx * y_idx) + * sq_sum_right[k] -= (y_idx * y_idx) */ - __pyx_v_self->sq_sum_left = (__pyx_v_self->sq_sum_left + (__pyx_v_y_idx * __pyx_v_y_idx)); + __pyx_v_y_idx = (__pyx_v_y[((__pyx_v_j * __pyx_v_y_stride) + __pyx_v_k)]); - /* "sklearn/tree/_tree.pyx":368 - * y_idx = y[j] - * self.sq_sum_left = self.sq_sum_left + (y_idx * y_idx) - * self.sq_sum_right = self.sq_sum_right - (y_idx * y_idx) # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":543 + * for k from 0 <= k < n_outputs: + * y_idx = y[j * y_stride + k] + * sq_sum_left[k] += (y_idx * y_idx) # <<<<<<<<<<<<<< + * sq_sum_right[k] -= (y_idx * y_idx) * - * self.mean_left = (self.n_left * self.mean_left + y_idx) / \ */ - __pyx_v_self->sq_sum_right = (__pyx_v_self->sq_sum_right - (__pyx_v_y_idx * __pyx_v_y_idx)); + __pyx_t_4 = __pyx_v_k; + (__pyx_v_sq_sum_left[__pyx_t_4]) = ((__pyx_v_sq_sum_left[__pyx_t_4]) + (__pyx_v_y_idx * __pyx_v_y_idx)); - /* "sklearn/tree/_tree.pyx":370 - * self.sq_sum_right = self.sq_sum_right - (y_idx * y_idx) + /* "sklearn/tree/_tree.pyx":544 + * y_idx = y[j * y_stride + k] + * sq_sum_left[k] += (y_idx * y_idx) + * sq_sum_right[k] -= (y_idx * y_idx) # <<<<<<<<<<<<<< * - * self.mean_left = (self.n_left * self.mean_left + y_idx) / \ # <<<<<<<<<<<<<< - * (self.n_left + 1) - * self.mean_right = ((self.n_samples - self.n_left) * \ + * mean_left[k] = (n_left * mean_left[k] + y_idx) / (n_left + 1) */ - __pyx_v_self->mean_left = (((__pyx_v_self->n_left * __pyx_v_self->mean_left) + __pyx_v_y_idx) / ((double)(__pyx_v_self->n_left + 1))); + __pyx_t_4 = __pyx_v_k; + (__pyx_v_sq_sum_right[__pyx_t_4]) = ((__pyx_v_sq_sum_right[__pyx_t_4]) - (__pyx_v_y_idx * __pyx_v_y_idx)); - /* "sklearn/tree/_tree.pyx":372 - * self.mean_left = (self.n_left * self.mean_left + y_idx) / \ - * (self.n_left + 1) - * self.mean_right = ((self.n_samples - self.n_left) * \ # <<<<<<<<<<<<<< - * self.mean_right - y_idx) / \ - * (self.n_samples - self.n_left - 1) + /* "sklearn/tree/_tree.pyx":546 + * sq_sum_right[k] -= (y_idx * y_idx) + * + * mean_left[k] = (n_left * mean_left[k] + y_idx) / (n_left + 1) # <<<<<<<<<<<<<< + * mean_right[k] = ((n_samples - n_left) * mean_right[k] - y_idx) / (n_samples - n_left - 1) + * + */ + (__pyx_v_mean_left[__pyx_v_k]) = (((__pyx_v_n_left * (__pyx_v_mean_left[__pyx_v_k])) + __pyx_v_y_idx) / ((double)(__pyx_v_n_left + 1))); + + /* "sklearn/tree/_tree.pyx":547 + * + * mean_left[k] = (n_left * mean_left[k] + y_idx) / (n_left + 1) + * mean_right[k] = ((n_samples - n_left) * mean_right[k] - y_idx) / (n_samples - n_left - 1) # <<<<<<<<<<<<<< + * + * n_left += 1 + */ + (__pyx_v_mean_right[__pyx_v_k]) = ((((__pyx_v_n_samples - __pyx_v_n_left) * (__pyx_v_mean_right[__pyx_v_k])) - __pyx_v_y_idx) / ((double)((__pyx_v_n_samples - __pyx_v_n_left) - 1))); + } + + /* "sklearn/tree/_tree.pyx":549 + * mean_right[k] = ((n_samples - n_left) * mean_right[k] - y_idx) / (n_samples - n_left - 1) + * + * n_left += 1 # <<<<<<<<<<<<<< + * self.n_left = n_left + * n_right -= 1 */ - __pyx_v_self->mean_right = ((((__pyx_v_self->n_samples - __pyx_v_self->n_left) * __pyx_v_self->mean_right) - __pyx_v_y_idx) / ((double)((__pyx_v_self->n_samples - __pyx_v_self->n_left) - 1))); + __pyx_v_n_left = (__pyx_v_n_left + 1); - /* "sklearn/tree/_tree.pyx":376 - * (self.n_samples - self.n_left - 1) + /* "sklearn/tree/_tree.pyx":550 * - * self.n_right -= 1 # <<<<<<<<<<<<<< - * self.n_left += 1 + * n_left += 1 + * self.n_left = n_left # <<<<<<<<<<<<<< + * n_right -= 1 + * self.n_right = n_right + */ + __pyx_v_self->n_left = __pyx_v_n_left; + + /* "sklearn/tree/_tree.pyx":551 + * n_left += 1 + * self.n_left = n_left + * n_right -= 1 # <<<<<<<<<<<<<< + * self.n_right = n_right * */ - __pyx_v_self->n_right = (__pyx_v_self->n_right - 1); + __pyx_v_n_right = (__pyx_v_n_right - 1); - /* "sklearn/tree/_tree.pyx":377 + /* "sklearn/tree/_tree.pyx":552 + * self.n_left = n_left + * n_right -= 1 + * self.n_right = n_right # <<<<<<<<<<<<<< * - * self.n_right -= 1 - * self.n_left += 1 # <<<<<<<<<<<<<< + * for k from 0 <= k < n_outputs: + */ + __pyx_v_self->n_right = __pyx_v_n_right; + + /* "sklearn/tree/_tree.pyx":554 + * self.n_right = n_right * - * self.var_left = self.sq_sum_left - \ + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * var_left[k] = sq_sum_left[k] - n_left * (mean_left[k] * mean_left[k]) + * var_right[k] = sq_sum_right[k] - n_right * (mean_right[k] * mean_right[k]) */ - __pyx_v_self->n_left = (__pyx_v_self->n_left + 1); + __pyx_t_3 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_3; __pyx_v_k++) { - /* "sklearn/tree/_tree.pyx":379 - * self.n_left += 1 + /* "sklearn/tree/_tree.pyx":555 + * + * for k from 0 <= k < n_outputs: + * var_left[k] = sq_sum_left[k] - n_left * (mean_left[k] * mean_left[k]) # <<<<<<<<<<<<<< + * var_right[k] = sq_sum_right[k] - n_right * (mean_right[k] * mean_right[k]) * - * self.var_left = self.sq_sum_left - \ # <<<<<<<<<<<<<< - * self.n_left * (self.mean_left * self.mean_left) - * self.var_right = self.sq_sum_right - \ */ - __pyx_v_self->var_left = (__pyx_v_self->sq_sum_left - (__pyx_v_self->n_left * (__pyx_v_self->mean_left * __pyx_v_self->mean_left))); + (__pyx_v_var_left[__pyx_v_k]) = ((__pyx_v_sq_sum_left[__pyx_v_k]) - (__pyx_v_n_left * ((__pyx_v_mean_left[__pyx_v_k]) * (__pyx_v_mean_left[__pyx_v_k])))); - /* "sklearn/tree/_tree.pyx":381 - * self.var_left = self.sq_sum_left - \ - * self.n_left * (self.mean_left * self.mean_left) - * self.var_right = self.sq_sum_right - \ # <<<<<<<<<<<<<< - * self.n_right * (self.mean_right * self.mean_right) + /* "sklearn/tree/_tree.pyx":556 + * for k from 0 <= k < n_outputs: + * var_left[k] = sq_sum_left[k] - n_left * (mean_left[k] * mean_left[k]) + * var_right[k] = sq_sum_right[k] - n_right * (mean_right[k] * mean_right[k]) # <<<<<<<<<<<<<< * + * return n_left */ - __pyx_v_self->var_right = (__pyx_v_self->sq_sum_right - (__pyx_v_self->n_right * (__pyx_v_self->mean_right * __pyx_v_self->mean_right))); + (__pyx_v_var_right[__pyx_v_k]) = ((__pyx_v_sq_sum_right[__pyx_v_k]) - (__pyx_v_n_right * ((__pyx_v_mean_right[__pyx_v_k]) * (__pyx_v_mean_right[__pyx_v_k])))); + } __pyx_L3_continue:; } - /* "sklearn/tree/_tree.pyx":384 - * self.n_right * (self.mean_right * self.mean_right) + /* "sklearn/tree/_tree.pyx":558 + * var_right[k] = sq_sum_right[k] - n_right * (mean_right[k] * mean_right[k]) * - * return self.n_left # <<<<<<<<<<<<<< + * return n_left # <<<<<<<<<<<<<< * * cdef double eval(self): */ - __pyx_r = __pyx_v_self->n_left; + __pyx_r = __pyx_v_n_left; goto __pyx_L0; __pyx_r = 0; @@ -3349,8 +4512,8 @@ static int __pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_update(struct __p return __pyx_r; } -/* "sklearn/tree/_tree.pyx":386 - * return self.n_left +/* "sklearn/tree/_tree.pyx":560 + * return n_left * * cdef double eval(self): # <<<<<<<<<<<<<< * pass @@ -3367,36 +4530,51 @@ static double __pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_eval(CYTHON_UN return __pyx_r; } -/* "sklearn/tree/_tree.pyx":389 +/* "sklearn/tree/_tree.pyx":563 * pass * * cpdef np.ndarray init_value(self): # <<<<<<<<<<<<<< - * ## TODO is calling np.asarray a performance issue? - * return np.asarray(self.mean_init) + * cdef int n_outputs = self.n_outputs + * cdef double* mean_init = self.mean_init */ -static PyObject *__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_3init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_5init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_init_value(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self, int __pyx_skip_dispatch) { + int __pyx_v_n_outputs; + double *__pyx_v_mean_init; + PyArrayObject *__pyx_v_value = 0; + int __pyx_v_k; + __Pyx_LocalBuf_ND __pyx_pybuffernd_value; + __Pyx_Buffer __pyx_pybuffer_value; PyArrayObject *__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; + PyArrayObject *__pyx_t_5 = NULL; + int __pyx_t_6; + int __pyx_t_7; + long __pyx_t_8; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("init_value", 0); + __pyx_pybuffer_value.pybuffer.buf = NULL; + __pyx_pybuffer_value.refcount = 0; + __pyx_pybuffernd_value.data = NULL; + __pyx_pybuffernd_value.rcbuffer = &__pyx_pybuffer_value; /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { - __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__init_value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__init_value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __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_19RegressionCriterion_3init_value)) { + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_5init_value)) { __Pyx_XDECREF(((PyObject *)__pyx_r)); - __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __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 = 563; __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; @@ -3405,33 +4583,108 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_init_v __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } - /* "sklearn/tree/_tree.pyx":391 + /* "sklearn/tree/_tree.pyx":564 + * + * cpdef np.ndarray init_value(self): + * cdef int n_outputs = self.n_outputs # <<<<<<<<<<<<<< + * cdef double* mean_init = self.mean_init + * + */ + __pyx_v_n_outputs = __pyx_v_self->n_outputs; + + /* "sklearn/tree/_tree.pyx":565 * cpdef np.ndarray init_value(self): - * ## TODO is calling np.asarray a performance issue? - * return np.asarray(self.mean_init) # <<<<<<<<<<<<<< + * cdef int n_outputs = self.n_outputs + * cdef double* mean_init = self.mean_init # <<<<<<<<<<<<<< + * + * cdef np.ndarray[DTYPE_t, ndim=2] value = np.zeros((n_outputs, 1), dtype=DTYPE) + */ + __pyx_v_mean_init = __pyx_v_self->mean_init; + + /* "sklearn/tree/_tree.pyx":567 + * cdef double* mean_init = self.mean_init * + * cdef np.ndarray[DTYPE_t, ndim=2] value = np.zeros((n_outputs, 1), dtype=DTYPE) # <<<<<<<<<<<<<< + * cdef int k * */ - __Pyx_XDECREF(((PyObject *)__pyx_r)); - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__asarray); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->mean_init); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyInt_FromLong(__pyx_v_n_outputs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __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 = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); + __Pyx_INCREF(__pyx_int_1); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_1); + __Pyx_GIVEREF(__pyx_int_1); __pyx_t_1 = 0; - __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 391; __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 = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_3)); + __Pyx_GIVEREF(((PyObject *)__pyx_t_3)); + __pyx_t_3 = 0; + __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_3)); + __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__DTYPE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__dtype), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; __Pyx_DECREF(((PyObject *)__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 = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_r = ((PyArrayObject *)__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 = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = ((PyArrayObject *)__pyx_t_4); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_value.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_value = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_value.rcbuffer->pybuffer.buf = NULL; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } else {__pyx_pybuffernd_value.diminfo[0].strides = __pyx_pybuffernd_value.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_value.diminfo[0].shape = __pyx_pybuffernd_value.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_value.diminfo[1].strides = __pyx_pybuffernd_value.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_value.diminfo[1].shape = __pyx_pybuffernd_value.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_5 = 0; + __pyx_v_value = ((PyArrayObject *)__pyx_t_4); + __pyx_t_4 = 0; + + /* "sklearn/tree/_tree.pyx":570 + * cdef int k + * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * value[k, 0] = (mean_init[k]) + * + */ + __pyx_t_6 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_6; __pyx_v_k++) { + + /* "sklearn/tree/_tree.pyx":571 + * + * for k from 0 <= k < n_outputs: + * value[k, 0] = (mean_init[k]) # <<<<<<<<<<<<<< + * + * return value + */ + __pyx_t_7 = __pyx_v_k; + __pyx_t_8 = 0; + *__Pyx_BufPtrStrided2d(__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, __pyx_pybuffernd_value.rcbuffer->pybuffer.buf, __pyx_t_7, __pyx_pybuffernd_value.diminfo[0].strides, __pyx_t_8, __pyx_pybuffernd_value.diminfo[1].strides) = ((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t)(__pyx_v_mean_init[__pyx_v_k])); + } + + /* "sklearn/tree/_tree.pyx":573 + * value[k, 0] = (mean_init[k]) + * + * return value # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(((PyObject *)__pyx_r)); + __Pyx_INCREF(((PyObject *)__pyx_v_value)); + __pyx_r = ((PyArrayObject *)__pyx_v_value); goto __pyx_L0; __pyx_r = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); @@ -3440,34 +4693,43 @@ static PyArrayObject *__pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_init_v __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_value.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("sklearn.tree._tree.RegressionCriterion.init_value", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; + goto __pyx_L2; __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_value.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_value); __Pyx_XGIVEREF((PyObject *)__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ -static PyObject *__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_3init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_3init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { +static PyObject *__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_5init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_5init_value(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("init_value (wrapper)", 0); - __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion_2init_value(((struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *)__pyx_v_self)); + __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion_4init_value(((struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *)__pyx_v_self)); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "sklearn/tree/_tree.pyx":389 +/* "sklearn/tree/_tree.pyx":563 * pass * * cpdef np.ndarray init_value(self): # <<<<<<<<<<<<<< - * ## TODO is calling np.asarray a performance issue? - * return np.asarray(self.mean_init) + * cdef int n_outputs = self.n_outputs + * cdef double* mean_init = self.mean_init */ -static PyObject *__pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion_2init_value(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self) { +static PyObject *__pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion_4init_value(struct __pyx_obj_7sklearn_4tree_5_tree_RegressionCriterion *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; @@ -3476,7 +4738,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion_2init_valu int __pyx_clineno = 0; __Pyx_RefNannySetupContext("init_value", 0); __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_RegressionCriterion *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.init_value(((struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *)__pyx_v_self), 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_RegressionCriterion *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.init_value(((struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *)__pyx_v_self), 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -3494,27 +4756,98 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_19RegressionCriterion_2init_valu return __pyx_r; } -/* "sklearn/tree/_tree.pyx":400 +/* "sklearn/tree/_tree.pyx":582 * """ * * cdef double eval(self): # <<<<<<<<<<<<<< - * return self.var_left + self.var_right - * + * cdef double* var_left = self.var_left + * cdef double* var_right = self.var_right */ static double __pyx_f_7sklearn_4tree_5_tree_3MSE_eval(struct __pyx_obj_7sklearn_4tree_5_tree_MSE *__pyx_v_self) { + double *__pyx_v_var_left; + double *__pyx_v_var_right; + int __pyx_v_n_outputs; + int __pyx_v_k; + double __pyx_v_total; double __pyx_r; __Pyx_RefNannyDeclarations + int __pyx_t_1; __Pyx_RefNannySetupContext("eval", 0); - /* "sklearn/tree/_tree.pyx":401 + /* "sklearn/tree/_tree.pyx":583 + * + * cdef double eval(self): + * cdef double* var_left = self.var_left # <<<<<<<<<<<<<< + * cdef double* var_right = self.var_right * + */ + __pyx_v_var_left = __pyx_v_self->__pyx_base.var_left; + + /* "sklearn/tree/_tree.pyx":584 * cdef double eval(self): - * return self.var_left + self.var_right # <<<<<<<<<<<<<< + * cdef double* var_left = self.var_left + * cdef double* var_right = self.var_right # <<<<<<<<<<<<<< + * + * cdef int n_outputs = self.n_outputs + */ + __pyx_v_var_right = __pyx_v_self->__pyx_base.var_right; + + /* "sklearn/tree/_tree.pyx":586 + * cdef double* var_right = self.var_right + * + * cdef int n_outputs = self.n_outputs # <<<<<<<<<<<<<< + * + * cdef int k + */ + __pyx_v_n_outputs = __pyx_v_self->__pyx_base.n_outputs; + + /* "sklearn/tree/_tree.pyx":589 + * + * cdef int k + * cdef double total = 0.0 # <<<<<<<<<<<<<< + * + * for k from 0 <= k < n_outputs: + */ + __pyx_v_total = 0.0; + + /* "sklearn/tree/_tree.pyx":591 + * cdef double total = 0.0 + * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * total += var_left[k] + * total += var_right[k] + */ + __pyx_t_1 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_1; __pyx_v_k++) { + + /* "sklearn/tree/_tree.pyx":592 + * + * for k from 0 <= k < n_outputs: + * total += var_left[k] # <<<<<<<<<<<<<< + * total += var_right[k] + * + */ + __pyx_v_total = (__pyx_v_total + (__pyx_v_var_left[__pyx_v_k])); + + /* "sklearn/tree/_tree.pyx":593 + * for k from 0 <= k < n_outputs: + * total += var_left[k] + * total += var_right[k] # <<<<<<<<<<<<<< + * + * return total / n_outputs + */ + __pyx_v_total = (__pyx_v_total + (__pyx_v_var_right[__pyx_v_k])); + } + + /* "sklearn/tree/_tree.pyx":595 + * total += var_right[k] + * + * return total / n_outputs # <<<<<<<<<<<<<< * * */ - __pyx_r = (__pyx_v_self->__pyx_base.var_left + __pyx_v_self->__pyx_base.var_right); + __pyx_r = (__pyx_v_total / __pyx_v_n_outputs); goto __pyx_L0; __pyx_r = 0; @@ -3558,17 +4891,17 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_1_random_sample_mask(PyObject *_ values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_total_in_bag); if (likely(values[1])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_random_sample_mask", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_random_sample_mask", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__random_state); if (likely(values[2])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_random_sample_mask", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_random_sample_mask", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_random_sample_mask") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_random_sample_mask") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -3577,13 +4910,13 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_1_random_sample_mask(PyObject *_ values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } - __pyx_v_n_total_samples = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_n_total_samples == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_n_total_in_bag = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_n_total_in_bag == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_n_total_samples = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_n_total_samples == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_n_total_in_bag = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_n_total_in_bag == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_random_state = values[2]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("_random_sample_mask", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_random_sample_mask", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree._random_sample_mask", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -3594,7 +4927,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_1_random_sample_mask(PyObject *_ return __pyx_r; } -/* "sklearn/tree/_tree.pyx":409 +/* "sklearn/tree/_tree.pyx":604 * * * def _random_sample_mask(int n_total_samples, int n_total_in_bag, random_state): # <<<<<<<<<<<<<< @@ -3624,7 +4957,6 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree__random_sample_mask(CYTHON_UNUSE int __pyx_t_9; int __pyx_t_10; int __pyx_t_11; - int __pyx_t_12; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -3638,33 +4970,33 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree__random_sample_mask(CYTHON_UNUSE __pyx_pybuffernd_sample_mask.data = NULL; __pyx_pybuffernd_sample_mask.rcbuffer = &__pyx_pybuffer_sample_mask; - /* "sklearn/tree/_tree.pyx":428 + /* "sklearn/tree/_tree.pyx":623 * """ * cdef np.ndarray[np.float64_t, ndim=1, mode="c"] rand = \ * random_state.rand(n_total_samples) # <<<<<<<<<<<<<< * cdef np.ndarray[BOOL_t, ndim=1, mode="c"] sample_mask = \ * np.zeros((n_total_samples,), dtype=np.int8) */ - __pyx_t_1 = PyObject_GetAttr(__pyx_v_random_state, __pyx_n_s__rand); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyObject_GetAttr(__pyx_v_random_state, __pyx_n_s__rand); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyInt_FromLong(__pyx_v_n_total_samples); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyInt_FromLong(__pyx_v_n_total_samples); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __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 = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(((PyObject *)__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 = 428; __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 = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = ((PyArrayObject *)__pyx_t_2); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_rand.rcbuffer->pybuffer, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { __pyx_v_rand = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_rand.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_rand.diminfo[0].strides = __pyx_pybuffernd_rand.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_rand.diminfo[0].shape = __pyx_pybuffernd_rand.rcbuffer->pybuffer.shape[0]; } } @@ -3672,51 +5004,51 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree__random_sample_mask(CYTHON_UNUSE __pyx_v_rand = ((PyArrayObject *)__pyx_t_2); __pyx_t_2 = 0; - /* "sklearn/tree/_tree.pyx":430 + /* "sklearn/tree/_tree.pyx":625 * random_state.rand(n_total_samples) * cdef np.ndarray[BOOL_t, ndim=1, mode="c"] sample_mask = \ * np.zeros((n_total_samples,), dtype=np.int8) # <<<<<<<<<<<<<< * * cdef int n_bagged = 0 */ - __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__zeros); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__zeros); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyInt_FromLong(__pyx_v_n_total_samples); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyInt_FromLong(__pyx_v_n_total_samples); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __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 = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); __Pyx_GIVEREF(__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 = 430; __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 = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1)); __Pyx_GIVEREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; - __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_1)); - __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__int8); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__int8); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__dtype), __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__dtype), __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; - if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __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 = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = ((PyArrayObject *)__pyx_t_6); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sample_mask.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_BOOL_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) { __pyx_v_sample_mask = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_sample_mask.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_sample_mask.diminfo[0].strides = __pyx_pybuffernd_sample_mask.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sample_mask.diminfo[0].shape = __pyx_pybuffernd_sample_mask.rcbuffer->pybuffer.shape[0]; } } @@ -3724,57 +5056,56 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree__random_sample_mask(CYTHON_UNUSE __pyx_v_sample_mask = ((PyArrayObject *)__pyx_t_6); __pyx_t_6 = 0; - /* "sklearn/tree/_tree.pyx":432 + /* "sklearn/tree/_tree.pyx":627 * np.zeros((n_total_samples,), dtype=np.int8) * * cdef int n_bagged = 0 # <<<<<<<<<<<<<< * cdef int i = 0 - * for i in range(n_total_samples): + * for i from 0 <= i < n_total_samples: */ __pyx_v_n_bagged = 0; - /* "sklearn/tree/_tree.pyx":433 + /* "sklearn/tree/_tree.pyx":628 * * cdef int n_bagged = 0 * cdef int i = 0 # <<<<<<<<<<<<<< - * for i in range(n_total_samples): + * for i from 0 <= i < n_total_samples: * if rand[i] * (n_total_samples - i) < (n_total_in_bag - n_bagged): */ __pyx_v_i = 0; - /* "sklearn/tree/_tree.pyx":434 + /* "sklearn/tree/_tree.pyx":629 * cdef int n_bagged = 0 * cdef int i = 0 - * for i in range(n_total_samples): # <<<<<<<<<<<<<< + * for i from 0 <= i < n_total_samples: # <<<<<<<<<<<<<< * if rand[i] * (n_total_samples - i) < (n_total_in_bag - n_bagged): * sample_mask[i] = 1 */ __pyx_t_8 = __pyx_v_n_total_samples; - for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) { - __pyx_v_i = __pyx_t_9; + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_8; __pyx_v_i++) { - /* "sklearn/tree/_tree.pyx":435 + /* "sklearn/tree/_tree.pyx":630 * cdef int i = 0 - * for i in range(n_total_samples): + * for i from 0 <= i < n_total_samples: * if rand[i] * (n_total_samples - i) < (n_total_in_bag - n_bagged): # <<<<<<<<<<<<<< * sample_mask[i] = 1 * n_bagged += 1 */ - __pyx_t_10 = __pyx_v_i; - __pyx_t_11 = (((*__Pyx_BufPtrCContig1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rand.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_rand.diminfo[0].strides)) * (__pyx_v_n_total_samples - __pyx_v_i)) < (__pyx_v_n_total_in_bag - __pyx_v_n_bagged)); - if (__pyx_t_11) { + __pyx_t_9 = __pyx_v_i; + __pyx_t_10 = (((*__Pyx_BufPtrCContig1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rand.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_rand.diminfo[0].strides)) * (__pyx_v_n_total_samples - __pyx_v_i)) < (__pyx_v_n_total_in_bag - __pyx_v_n_bagged)); + if (__pyx_t_10) { - /* "sklearn/tree/_tree.pyx":436 - * for i in range(n_total_samples): + /* "sklearn/tree/_tree.pyx":631 + * for i from 0 <= i < n_total_samples: * if rand[i] * (n_total_samples - i) < (n_total_in_bag - n_bagged): * sample_mask[i] = 1 # <<<<<<<<<<<<<< * n_bagged += 1 * */ - __pyx_t_12 = __pyx_v_i; - *__Pyx_BufPtrCContig1d(__pyx_t_7sklearn_4tree_5_tree_BOOL_t *, __pyx_pybuffernd_sample_mask.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_sample_mask.diminfo[0].strides) = 1; + __pyx_t_11 = __pyx_v_i; + *__Pyx_BufPtrCContig1d(__pyx_t_7sklearn_4tree_5_tree_BOOL_t *, __pyx_pybuffernd_sample_mask.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_sample_mask.diminfo[0].strides) = 1; - /* "sklearn/tree/_tree.pyx":437 + /* "sklearn/tree/_tree.pyx":632 * if rand[i] * (n_total_samples - i) < (n_total_in_bag - n_bagged): * sample_mask[i] = 1 * n_bagged += 1 # <<<<<<<<<<<<<< @@ -3787,7 +5118,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree__random_sample_mask(CYTHON_UNUSE __pyx_L5:; } - /* "sklearn/tree/_tree.pyx":439 + /* "sklearn/tree/_tree.pyx":634 * n_bagged += 1 * * return sample_mask.astype(np.bool) # <<<<<<<<<<<<<< @@ -3795,19 +5126,19 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree__random_sample_mask(CYTHON_UNUSE * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_sample_mask), __pyx_n_s__astype); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_sample_mask), __pyx_n_s__astype); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); 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_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__bool); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__bool); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __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 = 439; __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 = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; @@ -3881,29 +5212,29 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_3_apply_tree(PyObject *__pyx_sel values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children); if (likely(values[1])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_apply_tree", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_apply_tree", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__feature); if (likely(values[2])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_apply_tree", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_apply_tree", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__threshold); if (likely(values[3])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_apply_tree", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_apply_tree", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__out); if (likely(values[4])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_apply_tree", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_apply_tree", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_apply_tree") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_apply_tree") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { goto __pyx_L5_argtuple_error; @@ -3922,17 +5253,17 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_3_apply_tree(PyObject *__pyx_sel } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("_apply_tree", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_apply_tree", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree._apply_tree", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_children), __pyx_ptype_5numpy_ndarray, 1, "children", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 443; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_feature), __pyx_ptype_5numpy_ndarray, 1, "feature", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_threshold), __pyx_ptype_5numpy_ndarray, 1, "threshold", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_out), __pyx_ptype_5numpy_ndarray, 1, "out", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_children), __pyx_ptype_5numpy_ndarray, 1, "children", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_feature), __pyx_ptype_5numpy_ndarray, 1, "feature", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_threshold), __pyx_ptype_5numpy_ndarray, 1, "threshold", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_out), __pyx_ptype_5numpy_ndarray, 1, "out", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_2_apply_tree(__pyx_self, __pyx_v_X, __pyx_v_children, __pyx_v_feature, __pyx_v_threshold, __pyx_v_out); goto __pyx_L0; __pyx_L1_error:; @@ -3942,7 +5273,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_3_apply_tree(PyObject *__pyx_sel return __pyx_r; } -/* "sklearn/tree/_tree.pyx":442 +/* "sklearn/tree/_tree.pyx":637 * * * def _apply_tree(np.ndarray[DTYPE_t, ndim=2] X, # <<<<<<<<<<<<<< @@ -3968,22 +5299,21 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_2_apply_tree(CYTHON_UNUSED PyObj __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; - int __pyx_t_3; - long __pyx_t_4; + long __pyx_t_3; + int __pyx_t_4; int __pyx_t_5; - int __pyx_t_6; - long __pyx_t_7; + long __pyx_t_6; + int __pyx_t_7; int __pyx_t_8; int __pyx_t_9; int __pyx_t_10; - int __pyx_t_11; - __pyx_t_5numpy_int32_t __pyx_t_12; + __pyx_t_5numpy_int32_t __pyx_t_11; + int __pyx_t_12; int __pyx_t_13; - int __pyx_t_14; - long __pyx_t_15; - int __pyx_t_16; - long __pyx_t_17; - int __pyx_t_18; + long __pyx_t_14; + int __pyx_t_15; + long __pyx_t_16; + int __pyx_t_17; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -4010,31 +5340,31 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_2_apply_tree(CYTHON_UNUSED PyObj __pyx_pybuffernd_out.rcbuffer = &__pyx_pybuffer_out; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_children.rcbuffer->pybuffer, (PyObject*)__pyx_v_children, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_children.rcbuffer->pybuffer, (PyObject*)__pyx_v_children, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_children.diminfo[0].strides = __pyx_pybuffernd_children.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_children.diminfo[0].shape = __pyx_pybuffernd_children.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_children.diminfo[1].strides = __pyx_pybuffernd_children.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_children.diminfo[1].shape = __pyx_pybuffernd_children.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_feature.rcbuffer->pybuffer, (PyObject*)__pyx_v_feature, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_feature.rcbuffer->pybuffer, (PyObject*)__pyx_v_feature, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_feature.diminfo[0].strides = __pyx_pybuffernd_feature.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_feature.diminfo[0].shape = __pyx_pybuffernd_feature.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_threshold.rcbuffer->pybuffer, (PyObject*)__pyx_v_threshold, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_threshold.rcbuffer->pybuffer, (PyObject*)__pyx_v_threshold, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_threshold.diminfo[0].strides = __pyx_pybuffernd_threshold.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_threshold.diminfo[0].shape = __pyx_pybuffernd_threshold.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_out.rcbuffer->pybuffer, (PyObject*)__pyx_v_out, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_out.rcbuffer->pybuffer, (PyObject*)__pyx_v_out, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __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]; - /* "sklearn/tree/_tree.pyx":449 + /* "sklearn/tree/_tree.pyx":644 * """Finds the terminal region (=leaf node) for each sample in * `X` and sets the corresponding element in `out` to its node id.""" * cdef int i = 0 # <<<<<<<<<<<<<< @@ -4043,45 +5373,44 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_2_apply_tree(CYTHON_UNUSED PyObj */ __pyx_v_i = 0; - /* "sklearn/tree/_tree.pyx":450 + /* "sklearn/tree/_tree.pyx":645 * `X` and sets the corresponding element in `out` to its node id.""" * cdef int i = 0 * cdef int n = X.shape[0] # <<<<<<<<<<<<<< * cdef int node_id = 0 - * for i in xrange(n): + * for i from 0 <= i < n: */ __pyx_v_n = (__pyx_v_X->dimensions[0]); - /* "sklearn/tree/_tree.pyx":451 + /* "sklearn/tree/_tree.pyx":646 * cdef int i = 0 * cdef int n = X.shape[0] * cdef int node_id = 0 # <<<<<<<<<<<<<< - * for i in xrange(n): + * for i from 0 <= i < n: * node_id = 0 */ __pyx_v_node_id = 0; - /* "sklearn/tree/_tree.pyx":452 + /* "sklearn/tree/_tree.pyx":647 * cdef int n = X.shape[0] * cdef int node_id = 0 - * for i in xrange(n): # <<<<<<<<<<<<<< + * for i from 0 <= i < n: # <<<<<<<<<<<<<< * node_id = 0 * # While node_id not a leaf */ __pyx_t_1 = __pyx_v_n; - for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { - __pyx_v_i = __pyx_t_2; + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) { - /* "sklearn/tree/_tree.pyx":453 + /* "sklearn/tree/_tree.pyx":648 * cdef int node_id = 0 - * for i in xrange(n): + * for i from 0 <= i < n: * node_id = 0 # <<<<<<<<<<<<<< * # While node_id not a leaf * while children[node_id, 0] != -1 and children[node_id, 1] != -1: */ __pyx_v_node_id = 0; - /* "sklearn/tree/_tree.pyx":455 + /* "sklearn/tree/_tree.pyx":650 * node_id = 0 * # While node_id not a leaf * while children[node_id, 0] != -1 and children[node_id, 1] != -1: # <<<<<<<<<<<<<< @@ -4089,70 +5418,70 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_2_apply_tree(CYTHON_UNUSED PyObj * node_id = children[node_id, 0] */ while (1) { - __pyx_t_3 = __pyx_v_node_id; - __pyx_t_4 = 0; - __pyx_t_5 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_3, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_4, __pyx_pybuffernd_children.diminfo[1].strides)) != -1); - if (__pyx_t_5) { - __pyx_t_6 = __pyx_v_node_id; - __pyx_t_7 = 1; - __pyx_t_8 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_6, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_7, __pyx_pybuffernd_children.diminfo[1].strides)) != -1); - __pyx_t_9 = __pyx_t_8; + __pyx_t_2 = __pyx_v_node_id; + __pyx_t_3 = 0; + __pyx_t_4 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_3, __pyx_pybuffernd_children.diminfo[1].strides)) != -1); + if (__pyx_t_4) { + __pyx_t_5 = __pyx_v_node_id; + __pyx_t_6 = 1; + __pyx_t_7 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_6, __pyx_pybuffernd_children.diminfo[1].strides)) != -1); + __pyx_t_8 = __pyx_t_7; } else { - __pyx_t_9 = __pyx_t_5; + __pyx_t_8 = __pyx_t_4; } - if (!__pyx_t_9) break; + if (!__pyx_t_8) break; - /* "sklearn/tree/_tree.pyx":456 + /* "sklearn/tree/_tree.pyx":651 * # While node_id not a leaf * while children[node_id, 0] != -1 and children[node_id, 1] != -1: * if X[i, feature[node_id]] <= threshold[node_id]: # <<<<<<<<<<<<<< * node_id = children[node_id, 0] * else: */ - __pyx_t_10 = __pyx_v_node_id; - __pyx_t_11 = __pyx_v_i; - __pyx_t_12 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_feature.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_feature.diminfo[0].strides)); - __pyx_t_13 = __pyx_v_node_id; - __pyx_t_9 = ((*__Pyx_BufPtrStrided2d(__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides)) <= (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_threshold.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_threshold.diminfo[0].strides))); - if (__pyx_t_9) { + __pyx_t_9 = __pyx_v_node_id; + __pyx_t_10 = __pyx_v_i; + __pyx_t_11 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_feature.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_feature.diminfo[0].strides)); + __pyx_t_12 = __pyx_v_node_id; + __pyx_t_8 = ((*__Pyx_BufPtrStrided2d(__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides)) <= (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_threshold.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_threshold.diminfo[0].strides))); + if (__pyx_t_8) { - /* "sklearn/tree/_tree.pyx":457 + /* "sklearn/tree/_tree.pyx":652 * while children[node_id, 0] != -1 and children[node_id, 1] != -1: * if X[i, feature[node_id]] <= threshold[node_id]: * node_id = children[node_id, 0] # <<<<<<<<<<<<<< * else: * node_id = children[node_id, 1] */ - __pyx_t_14 = __pyx_v_node_id; - __pyx_t_15 = 0; - __pyx_v_node_id = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_children.diminfo[1].strides)); + __pyx_t_13 = __pyx_v_node_id; + __pyx_t_14 = 0; + __pyx_v_node_id = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_children.diminfo[1].strides)); goto __pyx_L7; } /*else*/ { - /* "sklearn/tree/_tree.pyx":459 + /* "sklearn/tree/_tree.pyx":654 * node_id = children[node_id, 0] * else: * node_id = children[node_id, 1] # <<<<<<<<<<<<<< * out[i] = node_id * */ - __pyx_t_16 = __pyx_v_node_id; - __pyx_t_17 = 1; - __pyx_v_node_id = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_children.diminfo[1].strides)); + __pyx_t_15 = __pyx_v_node_id; + __pyx_t_16 = 1; + __pyx_v_node_id = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_children.diminfo[1].strides)); } __pyx_L7:; } - /* "sklearn/tree/_tree.pyx":460 + /* "sklearn/tree/_tree.pyx":655 * else: * node_id = children[node_id, 1] * out[i] = node_id # <<<<<<<<<<<<<< * * */ - __pyx_t_18 = __pyx_v_i; - *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_out.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_out.diminfo[0].strides) = __pyx_v_node_id; + __pyx_t_17 = __pyx_v_i; + *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_out.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_out.diminfo[0].strides) = __pyx_v_node_id; } __pyx_r = Py_None; __Pyx_INCREF(Py_None); @@ -4222,35 +5551,35 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_5_predict_tree(PyObject *__pyx_s values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children); if (likely(values[1])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__feature); if (likely(values[2])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__threshold); if (likely(values[3])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__values); if (likely(values[4])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 5: values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pred); if (likely(values[5])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_predict_tree") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_predict_tree") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { goto __pyx_L5_argtuple_error; @@ -4271,18 +5600,18 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_5_predict_tree(PyObject *__pyx_s } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_predict_tree", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree._predict_tree", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_children), __pyx_ptype_5numpy_ndarray, 1, "children", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_feature), __pyx_ptype_5numpy_ndarray, 1, "feature", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_threshold), __pyx_ptype_5numpy_ndarray, 1, "threshold", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_values), __pyx_ptype_5numpy_ndarray, 1, "values", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_pred), __pyx_ptype_5numpy_ndarray, 1, "pred", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_children), __pyx_ptype_5numpy_ndarray, 1, "children", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 659; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_feature), __pyx_ptype_5numpy_ndarray, 1, "feature", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_threshold), __pyx_ptype_5numpy_ndarray, 1, "threshold", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_values), __pyx_ptype_5numpy_ndarray, 1, "values", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 662; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_pred), __pyx_ptype_5numpy_ndarray, 1, "pred", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 663; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_4_predict_tree(__pyx_self, __pyx_v_X, __pyx_v_children, __pyx_v_feature, __pyx_v_threshold, __pyx_v_values, __pyx_v_pred); goto __pyx_L0; __pyx_L1_error:; @@ -4292,7 +5621,7 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_5_predict_tree(PyObject *__pyx_s return __pyx_r; } -/* "sklearn/tree/_tree.pyx":463 +/* "sklearn/tree/_tree.pyx":658 * * * def _predict_tree(np.ndarray[DTYPE_t, ndim=2] X, # <<<<<<<<<<<<<< @@ -4302,10 +5631,12 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_5_predict_tree(PyObject *__pyx_s static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4_predict_tree(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_children, PyArrayObject *__pyx_v_feature, PyArrayObject *__pyx_v_threshold, PyArrayObject *__pyx_v_values, PyArrayObject *__pyx_v_pred) { int __pyx_v_i; + int __pyx_v_k; + int __pyx_v_c; int __pyx_v_n; int __pyx_v_node_id; - int __pyx_v_K; - int __pyx_v_k; + int __pyx_v_n_outputs; + int __pyx_v_n_classes; __Pyx_LocalBuf_ND __pyx_pybuffernd_X; __Pyx_Buffer __pyx_pybuffer_X; __Pyx_LocalBuf_ND __pyx_pybuffernd_children; @@ -4322,27 +5653,28 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4_predict_tree(CYTHON_UNUSED PyO __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; - int __pyx_t_3; - long __pyx_t_4; + long __pyx_t_3; + int __pyx_t_4; int __pyx_t_5; - int __pyx_t_6; - long __pyx_t_7; + long __pyx_t_6; + int __pyx_t_7; int __pyx_t_8; int __pyx_t_9; int __pyx_t_10; - int __pyx_t_11; - __pyx_t_5numpy_int32_t __pyx_t_12; + __pyx_t_5numpy_int32_t __pyx_t_11; + int __pyx_t_12; int __pyx_t_13; - int __pyx_t_14; - long __pyx_t_15; - int __pyx_t_16; - long __pyx_t_17; + long __pyx_t_14; + int __pyx_t_15; + long __pyx_t_16; + int __pyx_t_17; int __pyx_t_18; int __pyx_t_19; int __pyx_t_20; int __pyx_t_21; int __pyx_t_22; int __pyx_t_23; + int __pyx_t_24; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -4373,92 +5705,91 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4_predict_tree(CYTHON_UNUSED PyO __pyx_pybuffernd_pred.rcbuffer = &__pyx_pybuffer_pred; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_children.rcbuffer->pybuffer, (PyObject*)__pyx_v_children, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_children.rcbuffer->pybuffer, (PyObject*)__pyx_v_children, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_children.diminfo[0].strides = __pyx_pybuffernd_children.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_children.diminfo[0].shape = __pyx_pybuffernd_children.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_children.diminfo[1].strides = __pyx_pybuffernd_children.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_children.diminfo[1].shape = __pyx_pybuffernd_children.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_feature.rcbuffer->pybuffer, (PyObject*)__pyx_v_feature, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_feature.rcbuffer->pybuffer, (PyObject*)__pyx_v_feature, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_feature.diminfo[0].strides = __pyx_pybuffernd_feature.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_feature.diminfo[0].shape = __pyx_pybuffernd_feature.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_threshold.rcbuffer->pybuffer, (PyObject*)__pyx_v_threshold, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_threshold.rcbuffer->pybuffer, (PyObject*)__pyx_v_threshold, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_threshold.diminfo[0].strides = __pyx_pybuffernd_threshold.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_threshold.diminfo[0].shape = __pyx_pybuffernd_threshold.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 3, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_values.diminfo[1].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_values.diminfo[1].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[1]; + __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_values.diminfo[1].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_values.diminfo[1].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[1]; __pyx_pybuffernd_values.diminfo[2].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[2]; __pyx_pybuffernd_values.diminfo[2].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[2]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_pred.rcbuffer->pybuffer, (PyObject*)__pyx_v_pred, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_pred.rcbuffer->pybuffer, (PyObject*)__pyx_v_pred, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 3, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - __pyx_pybuffernd_pred.diminfo[0].strides = __pyx_pybuffernd_pred.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_pred.diminfo[0].shape = __pyx_pybuffernd_pred.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_pred.diminfo[1].strides = __pyx_pybuffernd_pred.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_pred.diminfo[1].shape = __pyx_pybuffernd_pred.rcbuffer->pybuffer.shape[1]; - - /* "sklearn/tree/_tree.pyx":470 - * np.ndarray[np.float64_t, ndim=2] pred): - * """Finds the terminal region (=leaf node) values for each sample. """ - * cdef int i = 0 # <<<<<<<<<<<<<< - * cdef int n = X.shape[0] - * cdef int node_id = 0 - */ - __pyx_v_i = 0; + __pyx_pybuffernd_pred.diminfo[0].strides = __pyx_pybuffernd_pred.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_pred.diminfo[0].shape = __pyx_pybuffernd_pred.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_pred.diminfo[1].strides = __pyx_pybuffernd_pred.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_pred.diminfo[1].shape = __pyx_pybuffernd_pred.rcbuffer->pybuffer.shape[1]; __pyx_pybuffernd_pred.diminfo[2].strides = __pyx_pybuffernd_pred.rcbuffer->pybuffer.strides[2]; __pyx_pybuffernd_pred.diminfo[2].shape = __pyx_pybuffernd_pred.rcbuffer->pybuffer.shape[2]; - /* "sklearn/tree/_tree.pyx":471 + /* "sklearn/tree/_tree.pyx":666 * """Finds the terminal region (=leaf node) values for each sample. """ - * cdef int i = 0 + * cdef int i, k, c * cdef int n = X.shape[0] # <<<<<<<<<<<<<< * cdef int node_id = 0 - * cdef int K = values.shape[1] + * cdef int n_outputs = values.shape[1] */ __pyx_v_n = (__pyx_v_X->dimensions[0]); - /* "sklearn/tree/_tree.pyx":472 - * cdef int i = 0 + /* "sklearn/tree/_tree.pyx":667 + * cdef int i, k, c * cdef int n = X.shape[0] * cdef int node_id = 0 # <<<<<<<<<<<<<< - * cdef int K = values.shape[1] - * for i in xrange(n): + * cdef int n_outputs = values.shape[1] + * cdef int n_classes = values.shape[2] */ __pyx_v_node_id = 0; - /* "sklearn/tree/_tree.pyx":473 + /* "sklearn/tree/_tree.pyx":668 * cdef int n = X.shape[0] * cdef int node_id = 0 - * cdef int K = values.shape[1] # <<<<<<<<<<<<<< - * for i in xrange(n): - * node_id = 0 + * cdef int n_outputs = values.shape[1] # <<<<<<<<<<<<<< + * cdef int n_classes = values.shape[2] + * */ - __pyx_v_K = (__pyx_v_values->dimensions[1]); + __pyx_v_n_outputs = (__pyx_v_values->dimensions[1]); - /* "sklearn/tree/_tree.pyx":474 + /* "sklearn/tree/_tree.pyx":669 * cdef int node_id = 0 - * cdef int K = values.shape[1] - * for i in xrange(n): # <<<<<<<<<<<<<< + * cdef int n_outputs = values.shape[1] + * cdef int n_classes = values.shape[2] # <<<<<<<<<<<<<< + * + * for i from 0 <= i < n: + */ + __pyx_v_n_classes = (__pyx_v_values->dimensions[2]); + + /* "sklearn/tree/_tree.pyx":671 + * cdef int n_classes = values.shape[2] + * + * for i from 0 <= i < n: # <<<<<<<<<<<<<< * node_id = 0 * # While node_id not a leaf */ __pyx_t_1 = __pyx_v_n; - for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { - __pyx_v_i = __pyx_t_2; + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) { - /* "sklearn/tree/_tree.pyx":475 - * cdef int K = values.shape[1] - * for i in xrange(n): + /* "sklearn/tree/_tree.pyx":672 + * + * for i from 0 <= i < n: * node_id = 0 # <<<<<<<<<<<<<< * # While node_id not a leaf * while children[node_id, 0] != -1 and children[node_id, 1] != -1: */ __pyx_v_node_id = 0; - /* "sklearn/tree/_tree.pyx":477 + /* "sklearn/tree/_tree.pyx":674 * node_id = 0 * # While node_id not a leaf * while children[node_id, 0] != -1 and children[node_id, 1] != -1: # <<<<<<<<<<<<<< @@ -4466,84 +5797,96 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_4_predict_tree(CYTHON_UNUSED PyO * node_id = children[node_id, 0] */ while (1) { - __pyx_t_3 = __pyx_v_node_id; - __pyx_t_4 = 0; - __pyx_t_5 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_3, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_4, __pyx_pybuffernd_children.diminfo[1].strides)) != -1); - if (__pyx_t_5) { - __pyx_t_6 = __pyx_v_node_id; - __pyx_t_7 = 1; - __pyx_t_8 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_6, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_7, __pyx_pybuffernd_children.diminfo[1].strides)) != -1); - __pyx_t_9 = __pyx_t_8; + __pyx_t_2 = __pyx_v_node_id; + __pyx_t_3 = 0; + __pyx_t_4 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_3, __pyx_pybuffernd_children.diminfo[1].strides)) != -1); + if (__pyx_t_4) { + __pyx_t_5 = __pyx_v_node_id; + __pyx_t_6 = 1; + __pyx_t_7 = ((*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_6, __pyx_pybuffernd_children.diminfo[1].strides)) != -1); + __pyx_t_8 = __pyx_t_7; } else { - __pyx_t_9 = __pyx_t_5; + __pyx_t_8 = __pyx_t_4; } - if (!__pyx_t_9) break; + if (!__pyx_t_8) break; - /* "sklearn/tree/_tree.pyx":478 + /* "sklearn/tree/_tree.pyx":675 * # While node_id not a leaf * while children[node_id, 0] != -1 and children[node_id, 1] != -1: * if X[i, feature[node_id]] <= threshold[node_id]: # <<<<<<<<<<<<<< * node_id = children[node_id, 0] * else: */ - __pyx_t_10 = __pyx_v_node_id; - __pyx_t_11 = __pyx_v_i; - __pyx_t_12 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_feature.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_feature.diminfo[0].strides)); - __pyx_t_13 = __pyx_v_node_id; - __pyx_t_9 = ((*__Pyx_BufPtrStrided2d(__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_X.diminfo[1].strides)) <= (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_threshold.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_threshold.diminfo[0].strides))); - if (__pyx_t_9) { + __pyx_t_9 = __pyx_v_node_id; + __pyx_t_10 = __pyx_v_i; + __pyx_t_11 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_feature.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_feature.diminfo[0].strides)); + __pyx_t_12 = __pyx_v_node_id; + __pyx_t_8 = ((*__Pyx_BufPtrStrided2d(__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_X.diminfo[1].strides)) <= (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_threshold.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_threshold.diminfo[0].strides))); + if (__pyx_t_8) { - /* "sklearn/tree/_tree.pyx":479 + /* "sklearn/tree/_tree.pyx":676 * while children[node_id, 0] != -1 and children[node_id, 1] != -1: * if X[i, feature[node_id]] <= threshold[node_id]: * node_id = children[node_id, 0] # <<<<<<<<<<<<<< * else: * node_id = children[node_id, 1] */ - __pyx_t_14 = __pyx_v_node_id; - __pyx_t_15 = 0; - __pyx_v_node_id = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_children.diminfo[1].strides)); + __pyx_t_13 = __pyx_v_node_id; + __pyx_t_14 = 0; + __pyx_v_node_id = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_children.diminfo[1].strides)); goto __pyx_L7; } /*else*/ { - /* "sklearn/tree/_tree.pyx":481 + /* "sklearn/tree/_tree.pyx":678 * node_id = children[node_id, 0] * else: * node_id = children[node_id, 1] # <<<<<<<<<<<<<< - * for k in xrange(K): - * pred[i, k] = values[node_id, k] + * + * for k from 0 <= k < n_outputs: */ - __pyx_t_16 = __pyx_v_node_id; - __pyx_t_17 = 1; - __pyx_v_node_id = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_children.diminfo[1].strides)); + __pyx_t_15 = __pyx_v_node_id; + __pyx_t_16 = 1; + __pyx_v_node_id = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_children.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_children.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_children.diminfo[1].strides)); } __pyx_L7:; } - /* "sklearn/tree/_tree.pyx":482 - * else: + /* "sklearn/tree/_tree.pyx":680 * node_id = children[node_id, 1] - * for k in xrange(K): # <<<<<<<<<<<<<< - * pred[i, k] = values[node_id, k] * + * for k from 0 <= k < n_outputs: # <<<<<<<<<<<<<< + * for c from 0 <= c < n_classes: + * pred[i, k, c] = values[node_id, k, c] */ - __pyx_t_18 = __pyx_v_K; - for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) { - __pyx_v_k = __pyx_t_19; + __pyx_t_17 = __pyx_v_n_outputs; + for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_17; __pyx_v_k++) { - /* "sklearn/tree/_tree.pyx":483 - * node_id = children[node_id, 1] - * for k in xrange(K): - * pred[i, k] = values[node_id, k] # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":681 + * + * for k from 0 <= k < n_outputs: + * for c from 0 <= c < n_classes: # <<<<<<<<<<<<<< + * pred[i, k, c] = values[node_id, k, c] + * + */ + __pyx_t_18 = __pyx_v_n_classes; + for (__pyx_v_c = 0; __pyx_v_c < __pyx_t_18; __pyx_v_c++) { + + /* "sklearn/tree/_tree.pyx":682 + * for k from 0 <= k < n_outputs: + * for c from 0 <= c < n_classes: + * pred[i, k, c] = values[node_id, k, c] # <<<<<<<<<<<<<< * * */ - __pyx_t_20 = __pyx_v_node_id; - __pyx_t_21 = __pyx_v_k; - __pyx_t_22 = __pyx_v_i; - __pyx_t_23 = __pyx_v_k; - *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_pred.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_pred.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_pred.diminfo[1].strides) = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_values.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_values.diminfo[1].strides)); + __pyx_t_19 = __pyx_v_node_id; + __pyx_t_20 = __pyx_v_k; + __pyx_t_21 = __pyx_v_c; + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = __pyx_v_k; + __pyx_t_24 = __pyx_v_c; + *__Pyx_BufPtrStrided3d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_pred.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_pred.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_pred.diminfo[1].strides, __pyx_t_24, __pyx_pybuffernd_pred.diminfo[2].strides) = (*__Pyx_BufPtrStrided3d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_values.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_values.diminfo[1].strides, __pyx_t_21, __pyx_pybuffernd_values.diminfo[2].strides)); + } } } @@ -4612,23 +5955,23 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_7_error_at_leaf(PyObject *__pyx_ values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_mask); if (likely(values[1])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_error_at_leaf", 1, 4, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_error_at_leaf", 1, 4, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__criterion); if (likely(values[2])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_error_at_leaf", 1, 4, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_error_at_leaf", 1, 4, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_samples); if (likely(values[3])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_error_at_leaf", 1, 4, 4, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_error_at_leaf", 1, 4, 4, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_error_at_leaf") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_error_at_leaf") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { goto __pyx_L5_argtuple_error; @@ -4641,19 +5984,19 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_7_error_at_leaf(PyObject *__pyx_ __pyx_v_y = ((PyArrayObject *)values[0]); __pyx_v_sample_mask = ((PyArrayObject *)values[1]); __pyx_v_criterion = ((struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *)values[2]); - __pyx_v_n_samples = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_n_samples == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_n_samples = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_n_samples == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 688; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("_error_at_leaf", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_error_at_leaf", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree._error_at_leaf", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_y), __pyx_ptype_5numpy_ndarray, 1, "y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_mask), __pyx_ptype_5numpy_ndarray, 1, "sample_mask", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_5_tree_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __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 = 685; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_mask), __pyx_ptype_5numpy_ndarray, 1, "sample_mask", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 686; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_5_tree_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 687; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_6_error_at_leaf(__pyx_self, __pyx_v_y, __pyx_v_sample_mask, __pyx_v_criterion, __pyx_v_n_samples); goto __pyx_L0; __pyx_L1_error:; @@ -4663,17 +6006,18 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_7_error_at_leaf(PyObject *__pyx_ return __pyx_r; } -/* "sklearn/tree/_tree.pyx":486 +/* "sklearn/tree/_tree.pyx":685 * * - * def _error_at_leaf(np.ndarray[DTYPE_t, ndim=1, mode="c"] y, # <<<<<<<<<<<<<< - * np.ndarray sample_mask, Criterion criterion, - * int n_samples): + * def _error_at_leaf(np.ndarray[DTYPE_t, ndim=2, mode="c"] y, # <<<<<<<<<<<<<< + * np.ndarray sample_mask, + * Criterion criterion, */ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_6_error_at_leaf(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_y, PyArrayObject *__pyx_v_sample_mask, struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *__pyx_v_criterion, int __pyx_v_n_samples) { - int __pyx_v_n_total_samples; __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y_ptr; + int __pyx_v_y_stride; + int __pyx_v_n_total_samples; __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask_ptr; __Pyx_LocalBuf_ND __pyx_pybuffernd_y; __Pyx_Buffer __pyx_pybuffer_y; @@ -4690,55 +6034,64 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_6_error_at_leaf(CYTHON_UNUSED Py __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_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __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_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __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[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/_tree.pyx":491 + /* "sklearn/tree/_tree.pyx":691 * """Compute criterion error at leaf with terminal region defined * by `sample_mask`. """ - * cdef int n_total_samples = y.shape[0] # <<<<<<<<<<<<<< - * cdef DTYPE_t *y_ptr = y.data - * cdef BOOL_t *sample_mask_ptr = sample_mask.data + * cdef DTYPE_t* y_ptr = y.data # <<<<<<<<<<<<<< + * cdef int y_stride = y.strides[0] / y.strides[1] + * cdef int n_total_samples = y.shape[0] */ - __pyx_v_n_total_samples = (__pyx_v_y->dimensions[0]); + __pyx_v_y_ptr = ((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *)__pyx_v_y->data); - /* "sklearn/tree/_tree.pyx":492 + /* "sklearn/tree/_tree.pyx":692 * by `sample_mask`. """ + * cdef DTYPE_t* y_ptr = y.data + * cdef int y_stride = y.strides[0] / y.strides[1] # <<<<<<<<<<<<<< * cdef int n_total_samples = y.shape[0] - * cdef DTYPE_t *y_ptr = y.data # <<<<<<<<<<<<<< * cdef BOOL_t *sample_mask_ptr = sample_mask.data - * criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) */ - __pyx_v_y_ptr = ((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *)__pyx_v_y->data); + __pyx_v_y_stride = (((int)(__pyx_v_y->strides[0])) / ((int)(__pyx_v_y->strides[1]))); - /* "sklearn/tree/_tree.pyx":493 + /* "sklearn/tree/_tree.pyx":693 + * cdef DTYPE_t* y_ptr = y.data + * cdef int y_stride = y.strides[0] / y.strides[1] + * cdef int n_total_samples = y.shape[0] # <<<<<<<<<<<<<< + * cdef BOOL_t *sample_mask_ptr = sample_mask.data + * + */ + __pyx_v_n_total_samples = (__pyx_v_y->dimensions[0]); + + /* "sklearn/tree/_tree.pyx":694 + * cdef int y_stride = y.strides[0] / y.strides[1] * cdef int n_total_samples = y.shape[0] - * cdef DTYPE_t *y_ptr = y.data * cdef BOOL_t *sample_mask_ptr = sample_mask.data # <<<<<<<<<<<<<< - * criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) - * return criterion.eval() + * + * criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) */ __pyx_v_sample_mask_ptr = ((__pyx_t_7sklearn_4tree_5_tree_BOOL_t *)__pyx_v_sample_mask->data); - /* "sklearn/tree/_tree.pyx":494 - * cdef DTYPE_t *y_ptr = y.data + /* "sklearn/tree/_tree.pyx":696 * cdef BOOL_t *sample_mask_ptr = sample_mask.data - * criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) # <<<<<<<<<<<<<< - * return criterion.eval() * + * criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) # <<<<<<<<<<<<<< + * + * return criterion.eval() */ - ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->init(__pyx_v_criterion, __pyx_v_y_ptr, __pyx_v_sample_mask_ptr, __pyx_v_n_samples, __pyx_v_n_total_samples); + ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->init(__pyx_v_criterion, __pyx_v_y_ptr, __pyx_v_y_stride, __pyx_v_sample_mask_ptr, __pyx_v_n_samples, __pyx_v_n_total_samples); - /* "sklearn/tree/_tree.pyx":495 - * cdef BOOL_t *sample_mask_ptr = sample_mask.data - * criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) + /* "sklearn/tree/_tree.pyx":698 + * criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) + * * return criterion.eval() # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->eval(__pyx_v_criterion)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->eval(__pyx_v_criterion)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 698; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -4763,7 +6116,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_6_error_at_leaf(CYTHON_UNUSED Py return __pyx_r; } -/* "sklearn/tree/_tree.pyx":498 +/* "sklearn/tree/_tree.pyx":701 * * * cdef int smallest_sample_larger_than(int sample_idx, DTYPE_t *X_i, # <<<<<<<<<<<<<< @@ -4781,7 +6134,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int __pyx_v int __pyx_t_2; __Pyx_RefNannySetupContext("smallest_sample_larger_than", 0); - /* "sklearn/tree/_tree.pyx":515 + /* "sklearn/tree/_tree.pyx":718 * -1 if no such element exists. * """ * cdef int idx = 0, j # <<<<<<<<<<<<<< @@ -4790,7 +6143,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int __pyx_v */ __pyx_v_idx = 0; - /* "sklearn/tree/_tree.pyx":516 + /* "sklearn/tree/_tree.pyx":719 * """ * cdef int idx = 0, j * cdef DTYPE_t threshold = -DBL_MAX # <<<<<<<<<<<<<< @@ -4799,7 +6152,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int __pyx_v */ __pyx_v_threshold = (-DBL_MAX); - /* "sklearn/tree/_tree.pyx":518 + /* "sklearn/tree/_tree.pyx":721 * cdef DTYPE_t threshold = -DBL_MAX * * if sample_idx > -1: # <<<<<<<<<<<<<< @@ -4809,7 +6162,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int __pyx_v __pyx_t_1 = (__pyx_v_sample_idx > -1); if (__pyx_t_1) { - /* "sklearn/tree/_tree.pyx":519 + /* "sklearn/tree/_tree.pyx":722 * * if sample_idx > -1: * threshold = X_i[X_argsorted_i[sample_idx]] # <<<<<<<<<<<<<< @@ -4821,7 +6174,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int __pyx_v } __pyx_L3:; - /* "sklearn/tree/_tree.pyx":521 + /* "sklearn/tree/_tree.pyx":724 * threshold = X_i[X_argsorted_i[sample_idx]] * * for idx from sample_idx < idx < n_total_samples: # <<<<<<<<<<<<<< @@ -4831,7 +6184,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int __pyx_v __pyx_t_2 = __pyx_v_n_total_samples; for (__pyx_v_idx = __pyx_v_sample_idx+1; __pyx_v_idx < __pyx_t_2; __pyx_v_idx++) { - /* "sklearn/tree/_tree.pyx":522 + /* "sklearn/tree/_tree.pyx":725 * * for idx from sample_idx < idx < n_total_samples: * j = X_argsorted_i[idx] # <<<<<<<<<<<<<< @@ -4840,7 +6193,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int __pyx_v */ __pyx_v_j = (__pyx_v_X_argsorted_i[__pyx_v_idx]); - /* "sklearn/tree/_tree.pyx":524 + /* "sklearn/tree/_tree.pyx":727 * j = X_argsorted_i[idx] * * if sample_mask[j] == 0: # <<<<<<<<<<<<<< @@ -4850,7 +6203,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int __pyx_v __pyx_t_1 = ((__pyx_v_sample_mask[__pyx_v_j]) == 0); if (__pyx_t_1) { - /* "sklearn/tree/_tree.pyx":525 + /* "sklearn/tree/_tree.pyx":728 * * if sample_mask[j] == 0: * continue # <<<<<<<<<<<<<< @@ -4862,7 +6215,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int __pyx_v } __pyx_L6:; - /* "sklearn/tree/_tree.pyx":527 + /* "sklearn/tree/_tree.pyx":730 * continue * * if X_i[j] > threshold + 1.e-7: # <<<<<<<<<<<<<< @@ -4872,7 +6225,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int __pyx_v __pyx_t_1 = ((__pyx_v_X_i[__pyx_v_j]) > (__pyx_v_threshold + 1.e-7)); if (__pyx_t_1) { - /* "sklearn/tree/_tree.pyx":528 + /* "sklearn/tree/_tree.pyx":731 * * if X_i[j] > threshold + 1.e-7: * return idx # <<<<<<<<<<<<<< @@ -4887,7 +6240,7 @@ static int __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(int __pyx_v __pyx_L4_continue:; } - /* "sklearn/tree/_tree.pyx":530 + /* "sklearn/tree/_tree.pyx":733 * return idx * * return -1 # <<<<<<<<<<<<<< @@ -4950,53 +6303,53 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_9_find_best_split(PyObject *__py values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y); if (likely(values[1])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_argsorted); if (likely(values[2])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_mask); if (likely(values[3])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_samples); if (likely(values[4])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 5: values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__min_leaf); if (likely(values[5])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 6: values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__max_features); if (likely(values[6])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 7: values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__criterion); if (likely(values[7])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 8: values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__random_state); if (likely(values[8])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_find_best_split") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_find_best_split") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 9) { goto __pyx_L5_argtuple_error; @@ -5015,25 +6368,25 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_9_find_best_split(PyObject *__py __pyx_v_y = ((PyArrayObject *)values[1]); __pyx_v_X_argsorted = ((PyArrayObject *)values[2]); __pyx_v_sample_mask = ((PyArrayObject *)values[3]); - __pyx_v_n_samples = __Pyx_PyInt_AsInt(values[4]); if (unlikely((__pyx_v_n_samples == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_leaf = __Pyx_PyInt_AsInt(values[5]); if (unlikely((__pyx_v_min_leaf == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_max_features = __Pyx_PyInt_AsInt(values[6]); if (unlikely((__pyx_v_max_features == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_n_samples = __Pyx_PyInt_AsInt(values[4]); if (unlikely((__pyx_v_n_samples == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 740; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_leaf = __Pyx_PyInt_AsInt(values[5]); if (unlikely((__pyx_v_min_leaf == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_max_features = __Pyx_PyInt_AsInt(values[6]); if (unlikely((__pyx_v_max_features == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_criterion = ((struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *)values[7]); __pyx_v_random_state = values[8]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_split", 1, 9, 9, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree._find_best_split", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __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 = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_argsorted), __pyx_ptype_5numpy_ndarray, 1, "X_argsorted", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_mask), __pyx_ptype_5numpy_ndarray, 1, "sample_mask", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_5_tree_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __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 = 737; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_argsorted), __pyx_ptype_5numpy_ndarray, 1, "X_argsorted", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_mask), __pyx_ptype_5numpy_ndarray, 1, "sample_mask", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 739; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_5_tree_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(__pyx_self, __pyx_v_X, __pyx_v_y, __pyx_v_X_argsorted, __pyx_v_sample_mask, __pyx_v_n_samples, __pyx_v_min_leaf, __pyx_v_max_features, __pyx_v_criterion, __pyx_v_random_state); goto __pyx_L0; __pyx_L1_error:; @@ -5043,11 +6396,11 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_9_find_best_split(PyObject *__py return __pyx_r; } -/* "sklearn/tree/_tree.pyx":533 +/* "sklearn/tree/_tree.pyx":736 * * * def _find_best_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, # <<<<<<<<<<<<<< - * np.ndarray[DTYPE_t, ndim=1, mode="c"] y, + * np.ndarray[DTYPE_t, ndim=2, mode="c"] y, * np.ndarray[np.int32_t, ndim=2, mode="fortran"] X_argsorted, */ @@ -5065,11 +6418,12 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_v_error; __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_v_best_error; __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_v_best_t; - __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y_ptr; __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_X_i; int *__pyx_v_X_argsorted_i; + __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y_ptr; __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask_ptr; PyArrayObject *__pyx_v_features = 0; + int __pyx_v_y_stride; int __pyx_v_X_elem_stride; int __pyx_v_X_col_stride; int __pyx_v_X_stride; @@ -5086,22 +6440,20 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED __Pyx_Buffer __pyx_pybuffer_y; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_t_3; - PyArrayObject *__pyx_t_4 = NULL; - int __pyx_t_5; + PyArrayObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_t_9; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; - PyObject *__pyx_t_12 = NULL; + int __pyx_t_12; int __pyx_t_13; - int __pyx_t_14; - __pyx_t_5numpy_int32_t __pyx_t_15; - __pyx_t_5numpy_int32_t __pyx_t_16; + __pyx_t_5numpy_int32_t __pyx_t_14; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -5124,21 +6476,21 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED __pyx_pybuffernd_X_argsorted.rcbuffer = &__pyx_pybuffer_X_argsorted; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_F_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_F_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; { __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_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __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_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __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[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]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_argsorted, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_F_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_argsorted, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_F_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_X_argsorted.diminfo[0].strides = __pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_argsorted.diminfo[0].shape = __pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_argsorted.diminfo[1].strides = __pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_argsorted.diminfo[1].shape = __pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer.shape[1]; - /* "sklearn/tree/_tree.pyx":592 + /* "sklearn/tree/_tree.pyx":795 * """ * # Variables declarations * cdef int n_total_samples = X.shape[0] # <<<<<<<<<<<<<< @@ -5147,7 +6499,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_n_total_samples = (__pyx_v_X->dimensions[0]); - /* "sklearn/tree/_tree.pyx":593 + /* "sklearn/tree/_tree.pyx":796 * # Variables declarations * cdef int n_total_samples = X.shape[0] * cdef int n_features = X.shape[1] # <<<<<<<<<<<<<< @@ -5156,7 +6508,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_n_features = (__pyx_v_X->dimensions[1]); - /* "sklearn/tree/_tree.pyx":594 + /* "sklearn/tree/_tree.pyx":797 * cdef int n_total_samples = X.shape[0] * cdef int n_features = X.shape[1] * cdef int i, a, b, best_i = -1 # <<<<<<<<<<<<<< @@ -5165,7 +6517,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_best_i = -1; - /* "sklearn/tree/_tree.pyx":595 + /* "sklearn/tree/_tree.pyx":798 * cdef int n_features = X.shape[1] * cdef int i, a, b, best_i = -1 * cdef np.int32_t feature_idx = -1 # <<<<<<<<<<<<<< @@ -5174,106 +6526,101 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_feature_idx = -1; - /* "sklearn/tree/_tree.pyx":596 + /* "sklearn/tree/_tree.pyx":799 * cdef int i, a, b, best_i = -1 * cdef np.int32_t feature_idx = -1 * cdef int n_left = 0 # <<<<<<<<<<<<<< * cdef DTYPE_t t, initial_error, error - * cdef DTYPE_t best_error = np.inf, best_t = np.inf + * cdef DTYPE_t best_error = INFINITY, best_t = INFINITY */ __pyx_v_n_left = 0; - /* "sklearn/tree/_tree.pyx":598 + /* "sklearn/tree/_tree.pyx":801 * cdef int n_left = 0 * cdef DTYPE_t t, initial_error, error - * cdef DTYPE_t best_error = np.inf, best_t = np.inf # <<<<<<<<<<<<<< - * cdef DTYPE_t *y_ptr = y.data - * cdef DTYPE_t *X_i = NULL + * cdef DTYPE_t best_error = INFINITY, best_t = INFINITY # <<<<<<<<<<<<<< + * cdef DTYPE_t* X_i = NULL + * cdef int* X_argsorted_i = NULL */ - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__inf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __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_PyFloat_AsFloat(__pyx_t_2); if (unlikely((__pyx_t_3 == (npy_float32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v_best_error = __pyx_t_3; - __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__inf); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_3 = __pyx_PyFloat_AsFloat(__pyx_t_1); if (unlikely((__pyx_t_3 == (npy_float32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_best_t = __pyx_t_3; + __pyx_v_best_error = __pyx_v_7sklearn_4tree_5_tree_INFINITY; + __pyx_v_best_t = __pyx_v_7sklearn_4tree_5_tree_INFINITY; - /* "sklearn/tree/_tree.pyx":599 + /* "sklearn/tree/_tree.pyx":802 * cdef DTYPE_t t, initial_error, error - * cdef DTYPE_t best_error = np.inf, best_t = np.inf - * cdef DTYPE_t *y_ptr = y.data # <<<<<<<<<<<<<< - * cdef DTYPE_t *X_i = NULL - * cdef int *X_argsorted_i = NULL - */ - __pyx_v_y_ptr = ((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *)__pyx_v_y->data); - - /* "sklearn/tree/_tree.pyx":600 - * cdef DTYPE_t best_error = np.inf, best_t = np.inf - * cdef DTYPE_t *y_ptr = y.data - * cdef DTYPE_t *X_i = NULL # <<<<<<<<<<<<<< - * cdef int *X_argsorted_i = NULL - * cdef BOOL_t *sample_mask_ptr = sample_mask.data + * cdef DTYPE_t best_error = INFINITY, best_t = INFINITY + * cdef DTYPE_t* X_i = NULL # <<<<<<<<<<<<<< + * cdef int* X_argsorted_i = NULL + * cdef DTYPE_t* y_ptr = y.data */ __pyx_v_X_i = NULL; - /* "sklearn/tree/_tree.pyx":601 - * cdef DTYPE_t *y_ptr = y.data - * cdef DTYPE_t *X_i = NULL - * cdef int *X_argsorted_i = NULL # <<<<<<<<<<<<<< - * cdef BOOL_t *sample_mask_ptr = sample_mask.data - * cdef np.ndarray[np.int32_t, ndim=1, mode='c'] features = None + /* "sklearn/tree/_tree.pyx":803 + * cdef DTYPE_t best_error = INFINITY, best_t = INFINITY + * cdef DTYPE_t* X_i = NULL + * cdef int* X_argsorted_i = NULL # <<<<<<<<<<<<<< + * cdef DTYPE_t* y_ptr = y.data + * cdef BOOL_t* sample_mask_ptr = sample_mask.data */ __pyx_v_X_argsorted_i = NULL; - /* "sklearn/tree/_tree.pyx":602 - * cdef DTYPE_t *X_i = NULL - * cdef int *X_argsorted_i = NULL - * cdef BOOL_t *sample_mask_ptr = sample_mask.data # <<<<<<<<<<<<<< - * cdef np.ndarray[np.int32_t, ndim=1, mode='c'] features = None + /* "sklearn/tree/_tree.pyx":804 + * cdef DTYPE_t* X_i = NULL + * cdef int* X_argsorted_i = NULL + * cdef DTYPE_t* y_ptr = y.data # <<<<<<<<<<<<<< + * cdef BOOL_t* sample_mask_ptr = sample_mask.data + * cdef np.ndarray[np.int32_t, ndim=1, mode="c"] features = None + */ + __pyx_v_y_ptr = ((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *)__pyx_v_y->data); + + /* "sklearn/tree/_tree.pyx":805 + * cdef int* X_argsorted_i = NULL + * cdef DTYPE_t* y_ptr = y.data + * cdef BOOL_t* sample_mask_ptr = sample_mask.data # <<<<<<<<<<<<<< + * cdef np.ndarray[np.int32_t, ndim=1, mode="c"] features = None * */ __pyx_v_sample_mask_ptr = ((__pyx_t_7sklearn_4tree_5_tree_BOOL_t *)__pyx_v_sample_mask->data); - /* "sklearn/tree/_tree.pyx":603 - * cdef int *X_argsorted_i = NULL - * cdef BOOL_t *sample_mask_ptr = sample_mask.data - * cdef np.ndarray[np.int32_t, ndim=1, mode='c'] features = None # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":806 + * cdef DTYPE_t* y_ptr = y.data + * cdef BOOL_t* sample_mask_ptr = sample_mask.data + * cdef np.ndarray[np.int32_t, ndim=1, mode="c"] features = None # <<<<<<<<<<<<<< * * # Compute the column strides (increment in pointer elements to get */ - __pyx_t_4 = ((PyArrayObject *)Py_None); + __pyx_t_1 = ((PyArrayObject *)Py_None); { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_1, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { __pyx_v_features = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_features.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_features.diminfo[0].strides = __pyx_pybuffernd_features.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_features.diminfo[0].shape = __pyx_pybuffernd_features.rcbuffer->pybuffer.shape[0]; } } - __pyx_t_4 = 0; + __pyx_t_1 = 0; __Pyx_INCREF(Py_None); __pyx_v_features = ((PyArrayObject *)Py_None); - /* "sklearn/tree/_tree.pyx":607 + /* "sklearn/tree/_tree.pyx":810 * # Compute the column strides (increment in pointer elements to get * # from column i to i + 1) for `X` and `X_argsorted` + * cdef int y_stride = y.strides[0] / y.strides[1] # <<<<<<<<<<<<<< + * cdef int X_elem_stride = X.strides[0] + * cdef int X_col_stride = X.strides[1] + */ + __pyx_v_y_stride = (((int)(__pyx_v_y->strides[0])) / ((int)(__pyx_v_y->strides[1]))); + + /* "sklearn/tree/_tree.pyx":811 + * # from column i to i + 1) for `X` and `X_argsorted` + * cdef int y_stride = y.strides[0] / y.strides[1] * cdef int X_elem_stride = X.strides[0] # <<<<<<<<<<<<<< * cdef int X_col_stride = X.strides[1] * cdef int X_stride = X_col_stride / X_elem_stride */ __pyx_v_X_elem_stride = (__pyx_v_X->strides[0]); - /* "sklearn/tree/_tree.pyx":608 - * # from column i to i + 1) for `X` and `X_argsorted` + /* "sklearn/tree/_tree.pyx":812 + * cdef int y_stride = y.strides[0] / y.strides[1] * cdef int X_elem_stride = X.strides[0] * cdef int X_col_stride = X.strides[1] # <<<<<<<<<<<<<< * cdef int X_stride = X_col_stride / X_elem_stride @@ -5281,7 +6628,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_X_col_stride = (__pyx_v_X->strides[1]); - /* "sklearn/tree/_tree.pyx":609 + /* "sklearn/tree/_tree.pyx":813 * cdef int X_elem_stride = X.strides[0] * cdef int X_col_stride = X.strides[1] * cdef int X_stride = X_col_stride / X_elem_stride # <<<<<<<<<<<<<< @@ -5290,7 +6637,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_X_stride = (__pyx_v_X_col_stride / __pyx_v_X_elem_stride); - /* "sklearn/tree/_tree.pyx":610 + /* "sklearn/tree/_tree.pyx":814 * cdef int X_col_stride = X.strides[1] * cdef int X_stride = X_col_stride / X_elem_stride * cdef int X_argsorted_elem_stride = X_argsorted.strides[0] # <<<<<<<<<<<<<< @@ -5299,7 +6646,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_X_argsorted_elem_stride = (__pyx_v_X_argsorted->strides[0]); - /* "sklearn/tree/_tree.pyx":611 + /* "sklearn/tree/_tree.pyx":815 * cdef int X_stride = X_col_stride / X_elem_stride * cdef int X_argsorted_elem_stride = X_argsorted.strides[0] * cdef int X_argsorted_col_stride = X_argsorted.strides[1] # <<<<<<<<<<<<<< @@ -5308,7 +6655,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_X_argsorted_col_stride = (__pyx_v_X_argsorted->strides[1]); - /* "sklearn/tree/_tree.pyx":612 + /* "sklearn/tree/_tree.pyx":816 * cdef int X_argsorted_elem_stride = X_argsorted.strides[0] * cdef int X_argsorted_col_stride = X_argsorted.strides[1] * cdef int X_argsorted_stride = X_argsorted_col_stride / X_argsorted_elem_stride # <<<<<<<<<<<<<< @@ -5317,44 +6664,44 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_X_argsorted_stride = (__pyx_v_X_argsorted_col_stride / __pyx_v_X_argsorted_elem_stride); - /* "sklearn/tree/_tree.pyx":615 + /* "sklearn/tree/_tree.pyx":819 * * # Compute the initial criterion value in the node - * X_argsorted_i = X_argsorted.data # <<<<<<<<<<<<<< - * criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) + * X_argsorted_i = X_argsorted.data # <<<<<<<<<<<<<< + * criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) * initial_error = criterion.eval() */ __pyx_v_X_argsorted_i = ((int *)__pyx_v_X_argsorted->data); - /* "sklearn/tree/_tree.pyx":616 + /* "sklearn/tree/_tree.pyx":820 * # Compute the initial criterion value in the node - * X_argsorted_i = X_argsorted.data - * criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) # <<<<<<<<<<<<<< + * X_argsorted_i = X_argsorted.data + * criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) # <<<<<<<<<<<<<< * initial_error = criterion.eval() * */ - ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->init(__pyx_v_criterion, __pyx_v_y_ptr, __pyx_v_sample_mask_ptr, __pyx_v_n_samples, __pyx_v_n_total_samples); + ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->init(__pyx_v_criterion, __pyx_v_y_ptr, __pyx_v_y_stride, __pyx_v_sample_mask_ptr, __pyx_v_n_samples, __pyx_v_n_total_samples); - /* "sklearn/tree/_tree.pyx":617 - * X_argsorted_i = X_argsorted.data - * criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) + /* "sklearn/tree/_tree.pyx":821 + * X_argsorted_i = X_argsorted.data + * criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) * initial_error = criterion.eval() # <<<<<<<<<<<<<< * * if initial_error == 0: # break early if the node is pure */ __pyx_v_initial_error = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->eval(__pyx_v_criterion); - /* "sklearn/tree/_tree.pyx":619 + /* "sklearn/tree/_tree.pyx":823 * initial_error = criterion.eval() * * if initial_error == 0: # break early if the node is pure # <<<<<<<<<<<<<< * return best_i, best_t, initial_error, initial_error * */ - __pyx_t_5 = (__pyx_v_initial_error == 0.0); - if (__pyx_t_5) { + __pyx_t_2 = (__pyx_v_initial_error == 0.0); + if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":620 + /* "sklearn/tree/_tree.pyx":824 * * if initial_error == 0: # break early if the node is pure * return best_i, best_t, initial_error, initial_error # <<<<<<<<<<<<<< @@ -5362,36 +6709,36 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED * best_error = initial_error */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyInt_FromLong(__pyx_v_best_i); 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); - __pyx_t_2 = PyFloat_FromDouble(__pyx_v_best_t); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = PyFloat_FromDouble(__pyx_v_initial_error); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyInt_FromLong(__pyx_v_best_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyFloat_FromDouble(__pyx_v_best_t); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyFloat_FromDouble(__pyx_v_initial_error); 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_t_6 = PyFloat_FromDouble(__pyx_v_initial_error); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = PyFloat_FromDouble(__pyx_v_initial_error); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_7); - __Pyx_GIVEREF(__pyx_t_7); - __pyx_t_1 = 0; - __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_5 = 0; __pyx_t_6 = 0; + __pyx_r = ((PyObject *)__pyx_t_7); __pyx_t_7 = 0; - __pyx_r = ((PyObject *)__pyx_t_8); - __pyx_t_8 = 0; goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; - /* "sklearn/tree/_tree.pyx":622 + /* "sklearn/tree/_tree.pyx":826 * return best_i, best_t, initial_error, initial_error * * best_error = initial_error # <<<<<<<<<<<<<< @@ -5400,79 +6747,79 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_best_error = __pyx_v_initial_error; - /* "sklearn/tree/_tree.pyx":625 + /* "sklearn/tree/_tree.pyx":829 * * # Features to consider * features = np.arange(n_features, dtype=np.int32) # <<<<<<<<<<<<<< * if max_features < 0 or max_features >= n_features: * max_features = n_features */ - __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__arange); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_8 = PyInt_FromLong(__pyx_v_n_features); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyObject_GetAttr(__pyx_t_7, __pyx_n_s__arange); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_8); - __Pyx_GIVEREF(__pyx_t_8); - __pyx_t_8 = 0; - __pyx_t_8 = PyDict_New(); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_8)); - __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__int32); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_t_8, ((PyObject *)__pyx_n_s__dtype), __pyx_t_1) < 0) {__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_t_1 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 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 = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_4 = ((PyArrayObject *)__pyx_t_1); + __pyx_t_7 = PyInt_FromLong(__pyx_v_n_features); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = PyTuple_New(1); 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); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + __pyx_t_7 = PyDict_New(); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_7)); + __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_t_7, ((PyObject *)__pyx_n_s__dtype), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_5), ((PyObject *)__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; + __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 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 = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyArrayObject *)__pyx_t_3); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_features.rcbuffer->pybuffer); - __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack); - if (unlikely(__pyx_t_9 < 0)) { - PyErr_Fetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + __pyx_t_8 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_1, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack); + if (unlikely(__pyx_t_8 < 0)) { + PyErr_Fetch(&__pyx_t_9, &__pyx_t_10, &__pyx_t_11); if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_v_features, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { - Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12); + Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); __Pyx_RaiseBufferFallbackError(); } else { - PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12); + PyErr_Restore(__pyx_t_9, __pyx_t_10, __pyx_t_11); } } __pyx_pybuffernd_features.diminfo[0].strides = __pyx_pybuffernd_features.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_features.diminfo[0].shape = __pyx_pybuffernd_features.rcbuffer->pybuffer.shape[0]; - if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - __pyx_t_4 = 0; - __Pyx_DECREF(((PyObject *)__pyx_v_features)); - __pyx_v_features = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(((PyObject *)__pyx_v_features)); + __pyx_v_features = ((PyArrayObject *)__pyx_t_3); + __pyx_t_3 = 0; - /* "sklearn/tree/_tree.pyx":626 + /* "sklearn/tree/_tree.pyx":830 * # Features to consider * features = np.arange(n_features, dtype=np.int32) * if max_features < 0 or max_features >= n_features: # <<<<<<<<<<<<<< * max_features = n_features * else: */ - __pyx_t_5 = (__pyx_v_max_features < 0); - if (!__pyx_t_5) { - __pyx_t_13 = (__pyx_v_max_features >= __pyx_v_n_features); - __pyx_t_14 = __pyx_t_13; + __pyx_t_2 = (__pyx_v_max_features < 0); + if (!__pyx_t_2) { + __pyx_t_12 = (__pyx_v_max_features >= __pyx_v_n_features); + __pyx_t_13 = __pyx_t_12; } else { - __pyx_t_14 = __pyx_t_5; + __pyx_t_13 = __pyx_t_2; } - if (__pyx_t_14) { + if (__pyx_t_13) { - /* "sklearn/tree/_tree.pyx":627 + /* "sklearn/tree/_tree.pyx":831 * features = np.arange(n_features, dtype=np.int32) * if max_features < 0 or max_features >= n_features: * max_features = n_features # <<<<<<<<<<<<<< @@ -5484,92 +6831,91 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED } /*else*/ { - /* "sklearn/tree/_tree.pyx":629 + /* "sklearn/tree/_tree.pyx":833 * max_features = n_features * else: * features = random_state.permutation(features)[:max_features] # <<<<<<<<<<<<<< * * # Look for the best split */ - __pyx_t_1 = PyObject_GetAttr(__pyx_v_random_state, __pyx_n_s__permutation); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); + __pyx_t_3 = PyObject_GetAttr(__pyx_v_random_state, __pyx_n_s__permutation); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); __Pyx_INCREF(((PyObject *)__pyx_v_features)); - PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_v_features)); + PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_v_features)); __Pyx_GIVEREF(((PyObject *)__pyx_v_features)); - __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0; - __pyx_t_8 = __Pyx_PySequence_GetSlice(__pyx_t_6, 0, __pyx_v_max_features); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (!(likely(((__pyx_t_8) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_8, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_4 = ((PyArrayObject *)__pyx_t_8); + __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PySequence_GetSlice(__pyx_t_5, 0, __pyx_v_max_features); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyArrayObject *)__pyx_t_7); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_features.rcbuffer->pybuffer); - __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack); - if (unlikely(__pyx_t_9 < 0)) { - PyErr_Fetch(&__pyx_t_12, &__pyx_t_11, &__pyx_t_10); + __pyx_t_8 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_1, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack); + if (unlikely(__pyx_t_8 < 0)) { + PyErr_Fetch(&__pyx_t_11, &__pyx_t_10, &__pyx_t_9); if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_v_features, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { - Py_XDECREF(__pyx_t_12); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_10); + Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_9); __Pyx_RaiseBufferFallbackError(); } else { - PyErr_Restore(__pyx_t_12, __pyx_t_11, __pyx_t_10); + PyErr_Restore(__pyx_t_11, __pyx_t_10, __pyx_t_9); } } __pyx_pybuffernd_features.diminfo[0].strides = __pyx_pybuffernd_features.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_features.diminfo[0].shape = __pyx_pybuffernd_features.rcbuffer->pybuffer.shape[0]; - if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - __pyx_t_4 = 0; + __pyx_t_1 = 0; __Pyx_DECREF(((PyObject *)__pyx_v_features)); - __pyx_v_features = ((PyArrayObject *)__pyx_t_8); - __pyx_t_8 = 0; + __pyx_v_features = ((PyArrayObject *)__pyx_t_7); + __pyx_t_7 = 0; } __pyx_L4:; - /* "sklearn/tree/_tree.pyx":632 + /* "sklearn/tree/_tree.pyx":836 * * # Look for the best split - * for feature_idx in range(max_features): # <<<<<<<<<<<<<< + * for feature_idx from 0 <= feature_idx < max_features: # <<<<<<<<<<<<<< * i = features[feature_idx] * # Get i-th col of X and X_sorted */ - __pyx_t_9 = __pyx_v_max_features; - for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_9; __pyx_t_15+=1) { - __pyx_v_feature_idx = __pyx_t_15; + __pyx_t_8 = __pyx_v_max_features; + for (__pyx_v_feature_idx = 0; __pyx_v_feature_idx < __pyx_t_8; __pyx_v_feature_idx++) { - /* "sklearn/tree/_tree.pyx":633 + /* "sklearn/tree/_tree.pyx":837 * # Look for the best split - * for feature_idx in range(max_features): + * for feature_idx from 0 <= feature_idx < max_features: * i = features[feature_idx] # <<<<<<<<<<<<<< * # Get i-th col of X and X_sorted - * X_i = (X.data) + X_stride * i + * X_i = (X.data) + X_stride * i */ - __pyx_t_16 = __pyx_v_feature_idx; - __pyx_v_i = (*__Pyx_BufPtrCContig1d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_features.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_features.diminfo[0].strides)); + __pyx_t_14 = __pyx_v_feature_idx; + __pyx_v_i = (*__Pyx_BufPtrCContig1d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_features.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_features.diminfo[0].strides)); - /* "sklearn/tree/_tree.pyx":635 + /* "sklearn/tree/_tree.pyx":839 * i = features[feature_idx] * # Get i-th col of X and X_sorted - * X_i = (X.data) + X_stride * i # <<<<<<<<<<<<<< - * X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i + * X_i = (X.data) + X_stride * i # <<<<<<<<<<<<<< + * X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i * */ __pyx_v_X_i = (((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *)__pyx_v_X->data) + (__pyx_v_X_stride * __pyx_v_i)); - /* "sklearn/tree/_tree.pyx":636 + /* "sklearn/tree/_tree.pyx":840 * # Get i-th col of X and X_sorted - * X_i = (X.data) + X_stride * i - * X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i # <<<<<<<<<<<<<< + * X_i = (X.data) + X_stride * i + * X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i # <<<<<<<<<<<<<< * * # Reset the criterion for this feature */ __pyx_v_X_argsorted_i = (((int *)__pyx_v_X_argsorted->data) + (__pyx_v_X_argsorted_stride * __pyx_v_i)); - /* "sklearn/tree/_tree.pyx":639 + /* "sklearn/tree/_tree.pyx":843 * * # Reset the criterion for this feature * criterion.reset() # <<<<<<<<<<<<<< @@ -5578,7 +6924,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->reset(__pyx_v_criterion); - /* "sklearn/tree/_tree.pyx":642 + /* "sklearn/tree/_tree.pyx":846 * * # Index of smallest sample in X_argsorted_i that is in the sample mask * a = 0 # <<<<<<<<<<<<<< @@ -5587,7 +6933,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_a = 0; - /* "sklearn/tree/_tree.pyx":643 + /* "sklearn/tree/_tree.pyx":847 * # Index of smallest sample in X_argsorted_i that is in the sample mask * a = 0 * while sample_mask_ptr[X_argsorted_i[a]] == 0: # <<<<<<<<<<<<<< @@ -5595,10 +6941,10 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED * */ while (1) { - __pyx_t_14 = ((__pyx_v_sample_mask_ptr[(__pyx_v_X_argsorted_i[__pyx_v_a])]) == 0); - if (!__pyx_t_14) break; + __pyx_t_13 = ((__pyx_v_sample_mask_ptr[(__pyx_v_X_argsorted_i[__pyx_v_a])]) == 0); + if (!__pyx_t_13) break; - /* "sklearn/tree/_tree.pyx":644 + /* "sklearn/tree/_tree.pyx":848 * a = 0 * while sample_mask_ptr[X_argsorted_i[a]] == 0: * a = a + 1 # <<<<<<<<<<<<<< @@ -5608,7 +6954,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED __pyx_v_a = (__pyx_v_a + 1); } - /* "sklearn/tree/_tree.pyx":647 + /* "sklearn/tree/_tree.pyx":851 * * # Consider splits between two consecutive samples * while True: # <<<<<<<<<<<<<< @@ -5618,7 +6964,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED while (1) { if (!1) break; - /* "sklearn/tree/_tree.pyx":650 + /* "sklearn/tree/_tree.pyx":854 * # Find the following larger sample * b = smallest_sample_larger_than(a, X_i, X_argsorted_i, * sample_mask_ptr, n_total_samples) # <<<<<<<<<<<<<< @@ -5627,17 +6973,17 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_b = __pyx_f_7sklearn_4tree_5_tree_smallest_sample_larger_than(__pyx_v_a, __pyx_v_X_i, __pyx_v_X_argsorted_i, __pyx_v_sample_mask_ptr, __pyx_v_n_total_samples); - /* "sklearn/tree/_tree.pyx":651 + /* "sklearn/tree/_tree.pyx":855 * b = smallest_sample_larger_than(a, X_i, X_argsorted_i, * sample_mask_ptr, n_total_samples) * if b == -1: # <<<<<<<<<<<<<< * break * */ - __pyx_t_14 = (__pyx_v_b == -1); - if (__pyx_t_14) { + __pyx_t_13 = (__pyx_v_b == -1); + if (__pyx_t_13) { - /* "sklearn/tree/_tree.pyx":652 + /* "sklearn/tree/_tree.pyx":856 * sample_mask_ptr, n_total_samples) * if b == -1: * break # <<<<<<<<<<<<<< @@ -5649,32 +6995,32 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED } __pyx_L11:; - /* "sklearn/tree/_tree.pyx":655 + /* "sklearn/tree/_tree.pyx":859 * * # Better split than the best so far? - * n_left = criterion.update(a, b, y_ptr, X_argsorted_i, sample_mask_ptr) # <<<<<<<<<<<<<< + * n_left = criterion.update(a, b, y_ptr, y_stride, X_argsorted_i, sample_mask_ptr) # <<<<<<<<<<<<<< * * # Only consider splits that respect min_leaf */ - __pyx_v_n_left = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->update(__pyx_v_criterion, __pyx_v_a, __pyx_v_b, __pyx_v_y_ptr, __pyx_v_X_argsorted_i, __pyx_v_sample_mask_ptr); + __pyx_v_n_left = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->update(__pyx_v_criterion, __pyx_v_a, __pyx_v_b, __pyx_v_y_ptr, __pyx_v_y_stride, __pyx_v_X_argsorted_i, __pyx_v_sample_mask_ptr); - /* "sklearn/tree/_tree.pyx":658 + /* "sklearn/tree/_tree.pyx":862 * * # Only consider splits that respect min_leaf * if n_left < min_leaf or (n_samples - n_left) < min_leaf: # <<<<<<<<<<<<<< * a = b * continue */ - __pyx_t_14 = (__pyx_v_n_left < __pyx_v_min_leaf); - if (!__pyx_t_14) { - __pyx_t_5 = ((__pyx_v_n_samples - __pyx_v_n_left) < __pyx_v_min_leaf); - __pyx_t_13 = __pyx_t_5; + __pyx_t_13 = (__pyx_v_n_left < __pyx_v_min_leaf); + if (!__pyx_t_13) { + __pyx_t_2 = ((__pyx_v_n_samples - __pyx_v_n_left) < __pyx_v_min_leaf); + __pyx_t_12 = __pyx_t_2; } else { - __pyx_t_13 = __pyx_t_14; + __pyx_t_12 = __pyx_t_13; } - if (__pyx_t_13) { + if (__pyx_t_12) { - /* "sklearn/tree/_tree.pyx":659 + /* "sklearn/tree/_tree.pyx":863 * # Only consider splits that respect min_leaf * if n_left < min_leaf or (n_samples - n_left) < min_leaf: * a = b # <<<<<<<<<<<<<< @@ -5683,7 +7029,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_a = __pyx_v_b; - /* "sklearn/tree/_tree.pyx":660 + /* "sklearn/tree/_tree.pyx":864 * if n_left < min_leaf or (n_samples - n_left) < min_leaf: * a = b * continue # <<<<<<<<<<<<<< @@ -5695,7 +7041,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED } __pyx_L12:; - /* "sklearn/tree/_tree.pyx":662 + /* "sklearn/tree/_tree.pyx":866 * continue * * error = criterion.eval() # <<<<<<<<<<<<<< @@ -5704,17 +7050,17 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_error = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->eval(__pyx_v_criterion); - /* "sklearn/tree/_tree.pyx":664 + /* "sklearn/tree/_tree.pyx":868 * error = criterion.eval() * * if error < best_error: # <<<<<<<<<<<<<< * t = X_i[X_argsorted_i[a]] + \ * ((X_i[X_argsorted_i[b]] - X_i[X_argsorted_i[a]]) / 2.0) */ - __pyx_t_13 = (__pyx_v_error < __pyx_v_best_error); - if (__pyx_t_13) { + __pyx_t_12 = (__pyx_v_error < __pyx_v_best_error); + if (__pyx_t_12) { - /* "sklearn/tree/_tree.pyx":666 + /* "sklearn/tree/_tree.pyx":870 * if error < best_error: * t = X_i[X_argsorted_i[a]] + \ * ((X_i[X_argsorted_i[b]] - X_i[X_argsorted_i[a]]) / 2.0) # <<<<<<<<<<<<<< @@ -5723,17 +7069,17 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_t = ((__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_a])]) + (((__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_b])]) - (__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_a])])) / 2.0)); - /* "sklearn/tree/_tree.pyx":667 + /* "sklearn/tree/_tree.pyx":871 * t = X_i[X_argsorted_i[a]] + \ * ((X_i[X_argsorted_i[b]] - X_i[X_argsorted_i[a]]) / 2.0) * if t == X_i[X_argsorted_i[b]]: # <<<<<<<<<<<<<< * t = X_i[X_argsorted_i[a]] * best_i = i */ - __pyx_t_13 = (__pyx_v_t == (__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_b])])); - if (__pyx_t_13) { + __pyx_t_12 = (__pyx_v_t == (__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_b])])); + if (__pyx_t_12) { - /* "sklearn/tree/_tree.pyx":668 + /* "sklearn/tree/_tree.pyx":872 * ((X_i[X_argsorted_i[b]] - X_i[X_argsorted_i[a]]) / 2.0) * if t == X_i[X_argsorted_i[b]]: * t = X_i[X_argsorted_i[a]] # <<<<<<<<<<<<<< @@ -5745,7 +7091,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED } __pyx_L14:; - /* "sklearn/tree/_tree.pyx":669 + /* "sklearn/tree/_tree.pyx":873 * if t == X_i[X_argsorted_i[b]]: * t = X_i[X_argsorted_i[a]] * best_i = i # <<<<<<<<<<<<<< @@ -5754,7 +7100,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_best_i = __pyx_v_i; - /* "sklearn/tree/_tree.pyx":670 + /* "sklearn/tree/_tree.pyx":874 * t = X_i[X_argsorted_i[a]] * best_i = i * best_t = t # <<<<<<<<<<<<<< @@ -5763,7 +7109,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED */ __pyx_v_best_t = __pyx_v_t; - /* "sklearn/tree/_tree.pyx":671 + /* "sklearn/tree/_tree.pyx":875 * best_i = i * best_t = t * best_error = error # <<<<<<<<<<<<<< @@ -5775,7 +7121,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED } __pyx_L13:; - /* "sklearn/tree/_tree.pyx":674 + /* "sklearn/tree/_tree.pyx":878 * * # Proceed to the next interval * a = b # <<<<<<<<<<<<<< @@ -5788,7 +7134,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED __pyx_L10_break:; } - /* "sklearn/tree/_tree.pyx":676 + /* "sklearn/tree/_tree.pyx":880 * a = b * * return best_i, best_t, best_error, initial_error # <<<<<<<<<<<<<< @@ -5796,40 +7142,40 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_8_find_best_split(CYTHON_UNUSED * def _find_best_random_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, */ __Pyx_XDECREF(__pyx_r); - __pyx_t_8 = PyInt_FromLong(__pyx_v_best_i); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_6 = PyFloat_FromDouble(__pyx_v_best_t); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_1 = PyFloat_FromDouble(__pyx_v_best_error); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_7 = PyFloat_FromDouble(__pyx_v_initial_error); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = PyInt_FromLong(__pyx_v_best_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_8); - __Pyx_GIVEREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_6); - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_7); + __pyx_t_5 = PyFloat_FromDouble(__pyx_v_best_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_best_error); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = PyFloat_FromDouble(__pyx_v_initial_error); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); - __pyx_t_8 = 0; - __pyx_t_6 = 0; - __pyx_t_1 = 0; + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); __pyx_t_7 = 0; - __pyx_r = ((PyObject *)__pyx_t_2); - __pyx_t_2 = 0; + __pyx_t_5 = 0; + __pyx_t_3 = 0; + __pyx_t_6 = 0; + __pyx_r = ((PyObject *)__pyx_t_4); + __pyx_t_4 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); @@ -5899,53 +7245,53 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_11_find_best_random_split(PyObje values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y); if (likely(values[1])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_argsorted); if (likely(values[2])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_mask); if (likely(values[3])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_samples); if (likely(values[4])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 5: values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__min_leaf); if (likely(values[5])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 6: values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__max_features); if (likely(values[6])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 7: values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__criterion); if (likely(values[7])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 8: values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__random_state); if (likely(values[8])) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_find_best_random_split") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_find_best_random_split") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 9) { goto __pyx_L5_argtuple_error; @@ -5964,25 +7310,25 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_11_find_best_random_split(PyObje __pyx_v_y = ((PyArrayObject *)values[1]); __pyx_v_X_argsorted = ((PyArrayObject *)values[2]); __pyx_v_sample_mask = ((PyArrayObject *)values[3]); - __pyx_v_n_samples = __Pyx_PyInt_AsInt(values[4]); if (unlikely((__pyx_v_n_samples == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 682; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_min_leaf = __Pyx_PyInt_AsInt(values[5]); if (unlikely((__pyx_v_min_leaf == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 683; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_max_features = __Pyx_PyInt_AsInt(values[6]); if (unlikely((__pyx_v_max_features == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_n_samples = __Pyx_PyInt_AsInt(values[4]); if (unlikely((__pyx_v_n_samples == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_min_leaf = __Pyx_PyInt_AsInt(values[5]); if (unlikely((__pyx_v_min_leaf == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_max_features = __Pyx_PyInt_AsInt(values[6]); if (unlikely((__pyx_v_max_features == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_criterion = ((struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *)values[7]); __pyx_v_random_state = values[8]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __Pyx_RaiseArgtupleInvalid("_find_best_random_split", 1, 9, 9, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.tree._tree._find_best_random_split", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __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 = 679; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_argsorted), __pyx_ptype_5numpy_ndarray, 1, "X_argsorted", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 680; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_mask), __pyx_ptype_5numpy_ndarray, 1, "sample_mask", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 681; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_5_tree_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __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 = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_argsorted), __pyx_ptype_5numpy_ndarray, 1, "X_argsorted", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_mask), __pyx_ptype_5numpy_ndarray, 1, "sample_mask", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_criterion), __pyx_ptype_7sklearn_4tree_5_tree_Criterion, 1, "criterion", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(__pyx_self, __pyx_v_X, __pyx_v_y, __pyx_v_X_argsorted, __pyx_v_sample_mask, __pyx_v_n_samples, __pyx_v_min_leaf, __pyx_v_max_features, __pyx_v_criterion, __pyx_v_random_state); goto __pyx_L0; __pyx_L1_error:; @@ -5992,11 +7338,11 @@ static PyObject *__pyx_pw_7sklearn_4tree_5_tree_11_find_best_random_split(PyObje return __pyx_r; } -/* "sklearn/tree/_tree.pyx":678 +/* "sklearn/tree/_tree.pyx":882 * return best_i, best_t, best_error, initial_error * * def _find_best_random_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, # <<<<<<<<<<<<<< - * np.ndarray[DTYPE_t, ndim=1, mode="c"] y, + * np.ndarray[DTYPE_t, ndim=2, mode="c"] y, * np.ndarray[np.int32_t, ndim=2, mode="fortran"] X_argsorted, */ @@ -6015,11 +7361,12 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_v_error; __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_v_best_error; __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_v_best_t; - __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y_ptr; __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_X_i; int *__pyx_v_X_argsorted_i; + __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *__pyx_v_y_ptr; __pyx_t_7sklearn_4tree_5_tree_BOOL_t *__pyx_v_sample_mask_ptr; PyArrayObject *__pyx_v_features = 0; + int __pyx_v_y_stride; int __pyx_v_X_elem_stride; int __pyx_v_X_col_stride; int __pyx_v_X_stride; @@ -6036,22 +7383,21 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON __Pyx_Buffer __pyx_pybuffer_y; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_t_3; - PyArrayObject *__pyx_t_4 = NULL; - int __pyx_t_5; + PyArrayObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_t_9; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; - PyObject *__pyx_t_12 = NULL; + int __pyx_t_12; int __pyx_t_13; - int __pyx_t_14; - __pyx_t_5numpy_int32_t __pyx_t_15; - __pyx_t_5numpy_int32_t __pyx_t_16; + __pyx_t_5numpy_int32_t __pyx_t_14; + __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_t_15; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; @@ -6074,21 +7420,21 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON __pyx_pybuffernd_X_argsorted.rcbuffer = &__pyx_pybuffer_X_argsorted; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_F_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_4tree_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_F_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1]; { __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_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __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_5_tree_DTYPE_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __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[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]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_argsorted, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_F_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_argsorted, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_F_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_X_argsorted.diminfo[0].strides = __pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_argsorted.diminfo[0].shape = __pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X_argsorted.diminfo[1].strides = __pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X_argsorted.diminfo[1].shape = __pyx_pybuffernd_X_argsorted.rcbuffer->pybuffer.shape[1]; - /* "sklearn/tree/_tree.pyx":737 + /* "sklearn/tree/_tree.pyx":941 * """ * # Variables * cdef int n_total_samples = X.shape[0] # <<<<<<<<<<<<<< @@ -6097,7 +7443,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_n_total_samples = (__pyx_v_X->dimensions[0]); - /* "sklearn/tree/_tree.pyx":738 + /* "sklearn/tree/_tree.pyx":942 * # Variables * cdef int n_total_samples = X.shape[0] * cdef int n_features = X.shape[1] # <<<<<<<<<<<<<< @@ -6106,7 +7452,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_n_features = (__pyx_v_X->dimensions[1]); - /* "sklearn/tree/_tree.pyx":739 + /* "sklearn/tree/_tree.pyx":943 * cdef int n_total_samples = X.shape[0] * cdef int n_features = X.shape[1] * cdef int i, a, b, c, n_left, best_i = -1 # <<<<<<<<<<<<<< @@ -6115,106 +7461,101 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_best_i = -1; - /* "sklearn/tree/_tree.pyx":740 + /* "sklearn/tree/_tree.pyx":944 * cdef int n_features = X.shape[1] * cdef int i, a, b, c, n_left, best_i = -1 * cdef np.int32_t feature_idx = -1 # <<<<<<<<<<<<<< * cdef DTYPE_t t, initial_error, error - * cdef DTYPE_t best_error = np.inf, best_t = np.inf + * cdef DTYPE_t best_error = INFINITY, best_t = INFINITY */ __pyx_v_feature_idx = -1; - /* "sklearn/tree/_tree.pyx":742 + /* "sklearn/tree/_tree.pyx":946 * cdef np.int32_t feature_idx = -1 * cdef DTYPE_t t, initial_error, error - * cdef DTYPE_t best_error = np.inf, best_t = np.inf # <<<<<<<<<<<<<< - * cdef DTYPE_t *y_ptr = y.data - * cdef DTYPE_t *X_i = NULL + * cdef DTYPE_t best_error = INFINITY, best_t = INFINITY # <<<<<<<<<<<<<< + * cdef DTYPE_t* X_i = NULL + * cdef int* X_argsorted_i = NULL */ - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__inf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __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_PyFloat_AsFloat(__pyx_t_2); if (unlikely((__pyx_t_3 == (npy_float32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v_best_error = __pyx_t_3; - __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__inf); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_3 = __pyx_PyFloat_AsFloat(__pyx_t_1); if (unlikely((__pyx_t_3 == (npy_float32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_best_t = __pyx_t_3; + __pyx_v_best_error = __pyx_v_7sklearn_4tree_5_tree_INFINITY; + __pyx_v_best_t = __pyx_v_7sklearn_4tree_5_tree_INFINITY; - /* "sklearn/tree/_tree.pyx":743 + /* "sklearn/tree/_tree.pyx":947 * cdef DTYPE_t t, initial_error, error - * cdef DTYPE_t best_error = np.inf, best_t = np.inf - * cdef DTYPE_t *y_ptr = y.data # <<<<<<<<<<<<<< - * cdef DTYPE_t *X_i = NULL - * cdef int *X_argsorted_i = NULL - */ - __pyx_v_y_ptr = ((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *)__pyx_v_y->data); - - /* "sklearn/tree/_tree.pyx":744 - * cdef DTYPE_t best_error = np.inf, best_t = np.inf - * cdef DTYPE_t *y_ptr = y.data - * cdef DTYPE_t *X_i = NULL # <<<<<<<<<<<<<< - * cdef int *X_argsorted_i = NULL - * cdef BOOL_t *sample_mask_ptr = sample_mask.data + * cdef DTYPE_t best_error = INFINITY, best_t = INFINITY + * cdef DTYPE_t* X_i = NULL # <<<<<<<<<<<<<< + * cdef int* X_argsorted_i = NULL + * cdef DTYPE_t* y_ptr = y.data */ __pyx_v_X_i = NULL; - /* "sklearn/tree/_tree.pyx":745 - * cdef DTYPE_t *y_ptr = y.data - * cdef DTYPE_t *X_i = NULL - * cdef int *X_argsorted_i = NULL # <<<<<<<<<<<<<< - * cdef BOOL_t *sample_mask_ptr = sample_mask.data - * cdef np.ndarray[np.int32_t, ndim=1, mode='c'] features = None + /* "sklearn/tree/_tree.pyx":948 + * cdef DTYPE_t best_error = INFINITY, best_t = INFINITY + * cdef DTYPE_t* X_i = NULL + * cdef int* X_argsorted_i = NULL # <<<<<<<<<<<<<< + * cdef DTYPE_t* y_ptr = y.data + * cdef BOOL_t* sample_mask_ptr = sample_mask.data */ __pyx_v_X_argsorted_i = NULL; - /* "sklearn/tree/_tree.pyx":746 - * cdef DTYPE_t *X_i = NULL - * cdef int *X_argsorted_i = NULL - * cdef BOOL_t *sample_mask_ptr = sample_mask.data # <<<<<<<<<<<<<< - * cdef np.ndarray[np.int32_t, ndim=1, mode='c'] features = None + /* "sklearn/tree/_tree.pyx":949 + * cdef DTYPE_t* X_i = NULL + * cdef int* X_argsorted_i = NULL + * cdef DTYPE_t* y_ptr = y.data # <<<<<<<<<<<<<< + * cdef BOOL_t* sample_mask_ptr = sample_mask.data + * cdef np.ndarray[np.int32_t, ndim=1, mode="c"] features = None + */ + __pyx_v_y_ptr = ((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *)__pyx_v_y->data); + + /* "sklearn/tree/_tree.pyx":950 + * cdef int* X_argsorted_i = NULL + * cdef DTYPE_t* y_ptr = y.data + * cdef BOOL_t* sample_mask_ptr = sample_mask.data # <<<<<<<<<<<<<< + * cdef np.ndarray[np.int32_t, ndim=1, mode="c"] features = None * */ __pyx_v_sample_mask_ptr = ((__pyx_t_7sklearn_4tree_5_tree_BOOL_t *)__pyx_v_sample_mask->data); - /* "sklearn/tree/_tree.pyx":747 - * cdef int *X_argsorted_i = NULL - * cdef BOOL_t *sample_mask_ptr = sample_mask.data - * cdef np.ndarray[np.int32_t, ndim=1, mode='c'] features = None # <<<<<<<<<<<<<< + /* "sklearn/tree/_tree.pyx":951 + * cdef DTYPE_t* y_ptr = y.data + * cdef BOOL_t* sample_mask_ptr = sample_mask.data + * cdef np.ndarray[np.int32_t, ndim=1, mode="c"] features = None # <<<<<<<<<<<<<< * * # Compute the column strides (increment in pointer elements to get */ - __pyx_t_4 = ((PyArrayObject *)Py_None); + __pyx_t_1 = ((PyArrayObject *)Py_None); { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_1, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { __pyx_v_features = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_features.rcbuffer->pybuffer.buf = NULL; - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 747; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 951; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_features.diminfo[0].strides = __pyx_pybuffernd_features.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_features.diminfo[0].shape = __pyx_pybuffernd_features.rcbuffer->pybuffer.shape[0]; } } - __pyx_t_4 = 0; + __pyx_t_1 = 0; __Pyx_INCREF(Py_None); __pyx_v_features = ((PyArrayObject *)Py_None); - /* "sklearn/tree/_tree.pyx":751 + /* "sklearn/tree/_tree.pyx":955 * # Compute the column strides (increment in pointer elements to get * # from column i to i + 1) for `X` and `X_argsorted` + * cdef int y_stride = y.strides[0] / y.strides[1] # <<<<<<<<<<<<<< + * cdef int X_elem_stride = X.strides[0] + * cdef int X_col_stride = X.strides[1] + */ + __pyx_v_y_stride = (((int)(__pyx_v_y->strides[0])) / ((int)(__pyx_v_y->strides[1]))); + + /* "sklearn/tree/_tree.pyx":956 + * # from column i to i + 1) for `X` and `X_argsorted` + * cdef int y_stride = y.strides[0] / y.strides[1] * cdef int X_elem_stride = X.strides[0] # <<<<<<<<<<<<<< * cdef int X_col_stride = X.strides[1] * cdef int X_stride = X_col_stride / X_elem_stride */ __pyx_v_X_elem_stride = (__pyx_v_X->strides[0]); - /* "sklearn/tree/_tree.pyx":752 - * # from column i to i + 1) for `X` and `X_argsorted` + /* "sklearn/tree/_tree.pyx":957 + * cdef int y_stride = y.strides[0] / y.strides[1] * cdef int X_elem_stride = X.strides[0] * cdef int X_col_stride = X.strides[1] # <<<<<<<<<<<<<< * cdef int X_stride = X_col_stride / X_elem_stride @@ -6222,7 +7563,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_X_col_stride = (__pyx_v_X->strides[1]); - /* "sklearn/tree/_tree.pyx":753 + /* "sklearn/tree/_tree.pyx":958 * cdef int X_elem_stride = X.strides[0] * cdef int X_col_stride = X.strides[1] * cdef int X_stride = X_col_stride / X_elem_stride # <<<<<<<<<<<<<< @@ -6231,7 +7572,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_X_stride = (__pyx_v_X_col_stride / __pyx_v_X_elem_stride); - /* "sklearn/tree/_tree.pyx":754 + /* "sklearn/tree/_tree.pyx":959 * cdef int X_col_stride = X.strides[1] * cdef int X_stride = X_col_stride / X_elem_stride * cdef int X_argsorted_elem_stride = X_argsorted.strides[0] # <<<<<<<<<<<<<< @@ -6240,7 +7581,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_X_argsorted_elem_stride = (__pyx_v_X_argsorted->strides[0]); - /* "sklearn/tree/_tree.pyx":755 + /* "sklearn/tree/_tree.pyx":960 * cdef int X_stride = X_col_stride / X_elem_stride * cdef int X_argsorted_elem_stride = X_argsorted.strides[0] * cdef int X_argsorted_col_stride = X_argsorted.strides[1] # <<<<<<<<<<<<<< @@ -6249,7 +7590,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_X_argsorted_col_stride = (__pyx_v_X_argsorted->strides[1]); - /* "sklearn/tree/_tree.pyx":756 + /* "sklearn/tree/_tree.pyx":961 * cdef int X_argsorted_elem_stride = X_argsorted.strides[0] * cdef int X_argsorted_col_stride = X_argsorted.strides[1] * cdef int X_argsorted_stride = X_argsorted_col_stride / X_argsorted_elem_stride # <<<<<<<<<<<<<< @@ -6258,44 +7599,44 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_X_argsorted_stride = (__pyx_v_X_argsorted_col_stride / __pyx_v_X_argsorted_elem_stride); - /* "sklearn/tree/_tree.pyx":759 + /* "sklearn/tree/_tree.pyx":964 * * # Compute the initial criterion value - * X_argsorted_i = X_argsorted.data # <<<<<<<<<<<<<< - * criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) + * X_argsorted_i = X_argsorted.data # <<<<<<<<<<<<<< + * criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) * initial_error = criterion.eval() */ __pyx_v_X_argsorted_i = ((int *)__pyx_v_X_argsorted->data); - /* "sklearn/tree/_tree.pyx":760 + /* "sklearn/tree/_tree.pyx":965 * # Compute the initial criterion value - * X_argsorted_i = X_argsorted.data - * criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) # <<<<<<<<<<<<<< + * X_argsorted_i = X_argsorted.data + * criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) # <<<<<<<<<<<<<< * initial_error = criterion.eval() * */ - ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->init(__pyx_v_criterion, __pyx_v_y_ptr, __pyx_v_sample_mask_ptr, __pyx_v_n_samples, __pyx_v_n_total_samples); + ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->init(__pyx_v_criterion, __pyx_v_y_ptr, __pyx_v_y_stride, __pyx_v_sample_mask_ptr, __pyx_v_n_samples, __pyx_v_n_total_samples); - /* "sklearn/tree/_tree.pyx":761 - * X_argsorted_i = X_argsorted.data - * criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) + /* "sklearn/tree/_tree.pyx":966 + * X_argsorted_i = X_argsorted.data + * criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) * initial_error = criterion.eval() # <<<<<<<<<<<<<< * * if initial_error == 0: # break early if the node is pure */ __pyx_v_initial_error = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->eval(__pyx_v_criterion); - /* "sklearn/tree/_tree.pyx":763 + /* "sklearn/tree/_tree.pyx":968 * initial_error = criterion.eval() * * if initial_error == 0: # break early if the node is pure # <<<<<<<<<<<<<< * return best_i, best_t, best_error, initial_error * */ - __pyx_t_5 = (__pyx_v_initial_error == 0.0); - if (__pyx_t_5) { + __pyx_t_2 = (__pyx_v_initial_error == 0.0); + if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":764 + /* "sklearn/tree/_tree.pyx":969 * * if initial_error == 0: # break early if the node is pure * return best_i, best_t, best_error, initial_error # <<<<<<<<<<<<<< @@ -6303,36 +7644,36 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON * best_error = initial_error */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyInt_FromLong(__pyx_v_best_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyFloat_FromDouble(__pyx_v_best_t); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = PyFloat_FromDouble(__pyx_v_best_error); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = PyInt_FromLong(__pyx_v_best_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyFloat_FromDouble(__pyx_v_best_t); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyFloat_FromDouble(__pyx_v_best_error); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyFloat_FromDouble(__pyx_v_initial_error); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = PyFloat_FromDouble(__pyx_v_initial_error); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_7); - __Pyx_GIVEREF(__pyx_t_7); - __pyx_t_1 = 0; - __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_5 = 0; __pyx_t_6 = 0; + __pyx_r = ((PyObject *)__pyx_t_7); __pyx_t_7 = 0; - __pyx_r = ((PyObject *)__pyx_t_8); - __pyx_t_8 = 0; goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; - /* "sklearn/tree/_tree.pyx":766 + /* "sklearn/tree/_tree.pyx":971 * return best_i, best_t, best_error, initial_error * * best_error = initial_error # <<<<<<<<<<<<<< @@ -6341,79 +7682,79 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_best_error = __pyx_v_initial_error; - /* "sklearn/tree/_tree.pyx":769 + /* "sklearn/tree/_tree.pyx":974 * * # Features to consider * features = np.arange(n_features, dtype=np.int32) # <<<<<<<<<<<<<< * if max_features < 0 or max_features >= n_features: * max_features = n_features */ - __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__arange); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_8 = PyInt_FromLong(__pyx_v_n_features); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = PyObject_GetAttr(__pyx_t_7, __pyx_n_s__arange); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_8); - __Pyx_GIVEREF(__pyx_t_8); - __pyx_t_8 = 0; - __pyx_t_8 = PyDict_New(); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_8)); - __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__int32); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_t_8, ((PyObject *)__pyx_n_s__dtype), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 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 = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_4 = ((PyArrayObject *)__pyx_t_1); + __pyx_t_7 = PyInt_FromLong(__pyx_v_n_features); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + __pyx_t_7 = PyDict_New(); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_7)); + __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_t_7, ((PyObject *)__pyx_n_s__dtype), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_5), ((PyObject *)__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; + __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 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 = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyArrayObject *)__pyx_t_3); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_features.rcbuffer->pybuffer); - __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack); - if (unlikely(__pyx_t_9 < 0)) { - PyErr_Fetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + __pyx_t_8 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_1, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack); + if (unlikely(__pyx_t_8 < 0)) { + PyErr_Fetch(&__pyx_t_9, &__pyx_t_10, &__pyx_t_11); if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_v_features, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { - Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12); + Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); __Pyx_RaiseBufferFallbackError(); } else { - PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12); + PyErr_Restore(__pyx_t_9, __pyx_t_10, __pyx_t_11); } } __pyx_pybuffernd_features.diminfo[0].strides = __pyx_pybuffernd_features.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_features.diminfo[0].shape = __pyx_pybuffernd_features.rcbuffer->pybuffer.shape[0]; - if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - __pyx_t_4 = 0; - __Pyx_DECREF(((PyObject *)__pyx_v_features)); - __pyx_v_features = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(((PyObject *)__pyx_v_features)); + __pyx_v_features = ((PyArrayObject *)__pyx_t_3); + __pyx_t_3 = 0; - /* "sklearn/tree/_tree.pyx":770 + /* "sklearn/tree/_tree.pyx":975 * # Features to consider * features = np.arange(n_features, dtype=np.int32) * if max_features < 0 or max_features >= n_features: # <<<<<<<<<<<<<< * max_features = n_features * else: */ - __pyx_t_5 = (__pyx_v_max_features < 0); - if (!__pyx_t_5) { - __pyx_t_13 = (__pyx_v_max_features >= __pyx_v_n_features); - __pyx_t_14 = __pyx_t_13; + __pyx_t_2 = (__pyx_v_max_features < 0); + if (!__pyx_t_2) { + __pyx_t_12 = (__pyx_v_max_features >= __pyx_v_n_features); + __pyx_t_13 = __pyx_t_12; } else { - __pyx_t_14 = __pyx_t_5; + __pyx_t_13 = __pyx_t_2; } - if (__pyx_t_14) { + if (__pyx_t_13) { - /* "sklearn/tree/_tree.pyx":771 + /* "sklearn/tree/_tree.pyx":976 * features = np.arange(n_features, dtype=np.int32) * if max_features < 0 or max_features >= n_features: * max_features = n_features # <<<<<<<<<<<<<< @@ -6425,92 +7766,91 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON } /*else*/ { - /* "sklearn/tree/_tree.pyx":773 + /* "sklearn/tree/_tree.pyx":978 * max_features = n_features * else: * features = random_state.permutation(features)[:max_features] # <<<<<<<<<<<<<< * * # Look for the best random split */ - __pyx_t_1 = PyObject_GetAttr(__pyx_v_random_state, __pyx_n_s__permutation); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); + __pyx_t_3 = PyObject_GetAttr(__pyx_v_random_state, __pyx_n_s__permutation); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 978; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 978; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); __Pyx_INCREF(((PyObject *)__pyx_v_features)); - PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_v_features)); + PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_v_features)); __Pyx_GIVEREF(((PyObject *)__pyx_v_features)); - __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0; - __pyx_t_8 = __Pyx_PySequence_GetSlice(__pyx_t_6, 0, __pyx_v_max_features); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (!(likely(((__pyx_t_8) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_8, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_4 = ((PyArrayObject *)__pyx_t_8); + __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 978; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PySequence_GetSlice(__pyx_t_5, 0, __pyx_v_max_features); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 978; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 978; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((PyArrayObject *)__pyx_t_7); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_features.rcbuffer->pybuffer); - __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack); - if (unlikely(__pyx_t_9 < 0)) { - PyErr_Fetch(&__pyx_t_12, &__pyx_t_11, &__pyx_t_10); + __pyx_t_8 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_t_1, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack); + if (unlikely(__pyx_t_8 < 0)) { + PyErr_Fetch(&__pyx_t_11, &__pyx_t_10, &__pyx_t_9); if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_features.rcbuffer->pybuffer, (PyObject*)__pyx_v_features, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { - Py_XDECREF(__pyx_t_12); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_10); + Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_9); __Pyx_RaiseBufferFallbackError(); } else { - PyErr_Restore(__pyx_t_12, __pyx_t_11, __pyx_t_10); + PyErr_Restore(__pyx_t_11, __pyx_t_10, __pyx_t_9); } } __pyx_pybuffernd_features.diminfo[0].strides = __pyx_pybuffernd_features.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_features.diminfo[0].shape = __pyx_pybuffernd_features.rcbuffer->pybuffer.shape[0]; - if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 978; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - __pyx_t_4 = 0; + __pyx_t_1 = 0; __Pyx_DECREF(((PyObject *)__pyx_v_features)); - __pyx_v_features = ((PyArrayObject *)__pyx_t_8); - __pyx_t_8 = 0; + __pyx_v_features = ((PyArrayObject *)__pyx_t_7); + __pyx_t_7 = 0; } __pyx_L4:; - /* "sklearn/tree/_tree.pyx":776 + /* "sklearn/tree/_tree.pyx":981 * * # Look for the best random split - * for feature_idx in range(max_features): # <<<<<<<<<<<<<< + * for feature_idx from 0 <= feature_idx < max_features: # <<<<<<<<<<<<<< * i = features[feature_idx] * # Get i-th col of X and X_sorted */ - __pyx_t_9 = __pyx_v_max_features; - for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_9; __pyx_t_15+=1) { - __pyx_v_feature_idx = __pyx_t_15; + __pyx_t_8 = __pyx_v_max_features; + for (__pyx_v_feature_idx = 0; __pyx_v_feature_idx < __pyx_t_8; __pyx_v_feature_idx++) { - /* "sklearn/tree/_tree.pyx":777 + /* "sklearn/tree/_tree.pyx":982 * # Look for the best random split - * for feature_idx in range(max_features): + * for feature_idx from 0 <= feature_idx < max_features: * i = features[feature_idx] # <<<<<<<<<<<<<< * # Get i-th col of X and X_sorted - * X_i = (X.data) + X_stride * i + * X_i = (X.data) + X_stride * i */ - __pyx_t_16 = __pyx_v_feature_idx; - __pyx_v_i = (*__Pyx_BufPtrCContig1d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_features.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_features.diminfo[0].strides)); + __pyx_t_14 = __pyx_v_feature_idx; + __pyx_v_i = (*__Pyx_BufPtrCContig1d(__pyx_t_5numpy_int32_t *, __pyx_pybuffernd_features.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_features.diminfo[0].strides)); - /* "sklearn/tree/_tree.pyx":779 + /* "sklearn/tree/_tree.pyx":984 * i = features[feature_idx] * # Get i-th col of X and X_sorted - * X_i = (X.data) + X_stride * i # <<<<<<<<<<<<<< - * X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i + * X_i = (X.data) + X_stride * i # <<<<<<<<<<<<<< + * X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i * */ __pyx_v_X_i = (((__pyx_t_7sklearn_4tree_5_tree_DTYPE_t *)__pyx_v_X->data) + (__pyx_v_X_stride * __pyx_v_i)); - /* "sklearn/tree/_tree.pyx":780 + /* "sklearn/tree/_tree.pyx":985 * # Get i-th col of X and X_sorted - * X_i = (X.data) + X_stride * i - * X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i # <<<<<<<<<<<<<< + * X_i = (X.data) + X_stride * i + * X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i # <<<<<<<<<<<<<< * * # Reset the criterion for this feature */ __pyx_v_X_argsorted_i = (((int *)__pyx_v_X_argsorted->data) + (__pyx_v_X_argsorted_stride * __pyx_v_i)); - /* "sklearn/tree/_tree.pyx":783 + /* "sklearn/tree/_tree.pyx":988 * * # Reset the criterion for this feature * criterion.reset() # <<<<<<<<<<<<<< @@ -6519,7 +7859,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->reset(__pyx_v_criterion); - /* "sklearn/tree/_tree.pyx":786 + /* "sklearn/tree/_tree.pyx":991 * * # Find min and max * a = 0 # <<<<<<<<<<<<<< @@ -6528,7 +7868,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_a = 0; - /* "sklearn/tree/_tree.pyx":787 + /* "sklearn/tree/_tree.pyx":992 * # Find min and max * a = 0 * while sample_mask_ptr[X_argsorted_i[a]] == 0: # <<<<<<<<<<<<<< @@ -6536,10 +7876,10 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON * */ while (1) { - __pyx_t_14 = ((__pyx_v_sample_mask_ptr[(__pyx_v_X_argsorted_i[__pyx_v_a])]) == 0); - if (!__pyx_t_14) break; + __pyx_t_13 = ((__pyx_v_sample_mask_ptr[(__pyx_v_X_argsorted_i[__pyx_v_a])]) == 0); + if (!__pyx_t_13) break; - /* "sklearn/tree/_tree.pyx":788 + /* "sklearn/tree/_tree.pyx":993 * a = 0 * while sample_mask_ptr[X_argsorted_i[a]] == 0: * a = a + 1 # <<<<<<<<<<<<<< @@ -6549,7 +7889,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON __pyx_v_a = (__pyx_v_a + 1); } - /* "sklearn/tree/_tree.pyx":790 + /* "sklearn/tree/_tree.pyx":995 * a = a + 1 * * b = n_total_samples - 1 # <<<<<<<<<<<<<< @@ -6558,7 +7898,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_b = (__pyx_v_n_total_samples - 1); - /* "sklearn/tree/_tree.pyx":791 + /* "sklearn/tree/_tree.pyx":996 * * b = n_total_samples - 1 * while sample_mask_ptr[X_argsorted_i[b]] == 0: # <<<<<<<<<<<<<< @@ -6566,10 +7906,10 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON * */ while (1) { - __pyx_t_14 = ((__pyx_v_sample_mask_ptr[(__pyx_v_X_argsorted_i[__pyx_v_b])]) == 0); - if (!__pyx_t_14) break; + __pyx_t_13 = ((__pyx_v_sample_mask_ptr[(__pyx_v_X_argsorted_i[__pyx_v_b])]) == 0); + if (!__pyx_t_13) break; - /* "sklearn/tree/_tree.pyx":792 + /* "sklearn/tree/_tree.pyx":997 * b = n_total_samples - 1 * while sample_mask_ptr[X_argsorted_i[b]] == 0: * b = b - 1 # <<<<<<<<<<<<<< @@ -6579,23 +7919,23 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON __pyx_v_b = (__pyx_v_b - 1); } - /* "sklearn/tree/_tree.pyx":794 + /* "sklearn/tree/_tree.pyx":999 * b = b - 1 * * if b <= a or X_i[X_argsorted_i[a]] == X_i[X_argsorted_i[b]]: # <<<<<<<<<<<<<< * continue * */ - __pyx_t_14 = (__pyx_v_b <= __pyx_v_a); - if (!__pyx_t_14) { - __pyx_t_5 = ((__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_a])]) == (__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_b])])); - __pyx_t_13 = __pyx_t_5; + __pyx_t_13 = (__pyx_v_b <= __pyx_v_a); + if (!__pyx_t_13) { + __pyx_t_2 = ((__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_a])]) == (__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_b])])); + __pyx_t_12 = __pyx_t_2; } else { - __pyx_t_13 = __pyx_t_14; + __pyx_t_12 = __pyx_t_13; } - if (__pyx_t_13) { + if (__pyx_t_12) { - /* "sklearn/tree/_tree.pyx":795 + /* "sklearn/tree/_tree.pyx":1000 * * if b <= a or X_i[X_argsorted_i[a]] == X_i[X_argsorted_i[b]]: * continue # <<<<<<<<<<<<<< @@ -6607,53 +7947,53 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON } __pyx_L11:; - /* "sklearn/tree/_tree.pyx":798 + /* "sklearn/tree/_tree.pyx":1003 * * # Draw a random threshold in [a, b) * t = X_i[X_argsorted_i[a]] + (random_state.rand() * # <<<<<<<<<<<<<< * (X_i[X_argsorted_i[b]] - X_i[X_argsorted_i[a]])) * if t == X_i[X_argsorted_i[b]]: */ - __pyx_t_8 = PyFloat_FromDouble((__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_a])])); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_6 = PyObject_GetAttr(__pyx_v_random_state, __pyx_n_s__rand); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_1 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_7 = PyFloat_FromDouble((__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_a])])); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = PyObject_GetAttr(__pyx_v_random_state, __pyx_n_s__rand); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - /* "sklearn/tree/_tree.pyx":799 + /* "sklearn/tree/_tree.pyx":1004 * # Draw a random threshold in [a, b) * t = X_i[X_argsorted_i[a]] + (random_state.rand() * * (X_i[X_argsorted_i[b]] - X_i[X_argsorted_i[a]])) # <<<<<<<<<<<<<< * if t == X_i[X_argsorted_i[b]]: * t = X_i[X_argsorted_i[a]] */ - __pyx_t_6 = PyFloat_FromDouble(((__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_b])]) - (__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_a])]))); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = PyNumber_Multiply(__pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = PyNumber_Add(__pyx_t_8, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyFloat_FromDouble(((__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_b])]) - (__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_a])]))); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyNumber_Multiply(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PyNumber_Add(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_3 = __pyx_PyFloat_AsFloat(__pyx_t_6); if (unlikely((__pyx_t_3 == (npy_float32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_v_t = __pyx_t_3; + __pyx_t_15 = __pyx_PyFloat_AsFloat(__pyx_t_5); if (unlikely((__pyx_t_15 == (npy_float32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_t = __pyx_t_15; - /* "sklearn/tree/_tree.pyx":800 + /* "sklearn/tree/_tree.pyx":1005 * t = X_i[X_argsorted_i[a]] + (random_state.rand() * * (X_i[X_argsorted_i[b]] - X_i[X_argsorted_i[a]])) * if t == X_i[X_argsorted_i[b]]: # <<<<<<<<<<<<<< * t = X_i[X_argsorted_i[a]] * */ - __pyx_t_13 = (__pyx_v_t == (__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_b])])); - if (__pyx_t_13) { + __pyx_t_12 = (__pyx_v_t == (__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_b])])); + if (__pyx_t_12) { - /* "sklearn/tree/_tree.pyx":801 + /* "sklearn/tree/_tree.pyx":1006 * (X_i[X_argsorted_i[b]] - X_i[X_argsorted_i[a]])) * if t == X_i[X_argsorted_i[b]]: * t = X_i[X_argsorted_i[a]] # <<<<<<<<<<<<<< @@ -6665,7 +8005,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON } __pyx_L12:; - /* "sklearn/tree/_tree.pyx":804 + /* "sklearn/tree/_tree.pyx":1009 * * # Find the sample just greater than t * c = a + 1 # <<<<<<<<<<<<<< @@ -6674,7 +8014,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_c = (__pyx_v_a + 1); - /* "sklearn/tree/_tree.pyx":806 + /* "sklearn/tree/_tree.pyx":1011 * c = a + 1 * * while True: # <<<<<<<<<<<<<< @@ -6684,33 +8024,33 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON while (1) { if (!1) break; - /* "sklearn/tree/_tree.pyx":807 + /* "sklearn/tree/_tree.pyx":1012 * * while True: * if sample_mask_ptr[X_argsorted_i[c]] != 0: # <<<<<<<<<<<<<< * if X_i[X_argsorted_i[c]] > t or c == b: * break */ - __pyx_t_13 = ((__pyx_v_sample_mask_ptr[(__pyx_v_X_argsorted_i[__pyx_v_c])]) != 0); - if (__pyx_t_13) { + __pyx_t_12 = ((__pyx_v_sample_mask_ptr[(__pyx_v_X_argsorted_i[__pyx_v_c])]) != 0); + if (__pyx_t_12) { - /* "sklearn/tree/_tree.pyx":808 + /* "sklearn/tree/_tree.pyx":1013 * while True: * if sample_mask_ptr[X_argsorted_i[c]] != 0: * if X_i[X_argsorted_i[c]] > t or c == b: # <<<<<<<<<<<<<< * break * */ - __pyx_t_13 = ((__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_c])]) > __pyx_v_t); - if (!__pyx_t_13) { - __pyx_t_14 = (__pyx_v_c == __pyx_v_b); - __pyx_t_5 = __pyx_t_14; + __pyx_t_12 = ((__pyx_v_X_i[(__pyx_v_X_argsorted_i[__pyx_v_c])]) > __pyx_v_t); + if (!__pyx_t_12) { + __pyx_t_13 = (__pyx_v_c == __pyx_v_b); + __pyx_t_2 = __pyx_t_13; } else { - __pyx_t_5 = __pyx_t_13; + __pyx_t_2 = __pyx_t_12; } - if (__pyx_t_5) { + if (__pyx_t_2) { - /* "sklearn/tree/_tree.pyx":809 + /* "sklearn/tree/_tree.pyx":1014 * if sample_mask_ptr[X_argsorted_i[c]] != 0: * if X_i[X_argsorted_i[c]] > t or c == b: * break # <<<<<<<<<<<<<< @@ -6725,7 +8065,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON } __pyx_L15:; - /* "sklearn/tree/_tree.pyx":811 + /* "sklearn/tree/_tree.pyx":1016 * break * * c += 1 # <<<<<<<<<<<<<< @@ -6736,41 +8076,41 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON } __pyx_L14_break:; - /* "sklearn/tree/_tree.pyx":814 + /* "sklearn/tree/_tree.pyx":1019 * * # Better than the best so far? - * n_left = criterion.update(0, c, y_ptr, X_argsorted_i, sample_mask_ptr) # <<<<<<<<<<<<<< + * n_left = criterion.update(0, c, y_ptr, y_stride, X_argsorted_i, sample_mask_ptr) # <<<<<<<<<<<<<< * error = criterion.eval() * */ - __pyx_v_n_left = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->update(__pyx_v_criterion, 0, __pyx_v_c, __pyx_v_y_ptr, __pyx_v_X_argsorted_i, __pyx_v_sample_mask_ptr); + __pyx_v_n_left = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->update(__pyx_v_criterion, 0, __pyx_v_c, __pyx_v_y_ptr, __pyx_v_y_stride, __pyx_v_X_argsorted_i, __pyx_v_sample_mask_ptr); - /* "sklearn/tree/_tree.pyx":815 + /* "sklearn/tree/_tree.pyx":1020 * # Better than the best so far? - * n_left = criterion.update(0, c, y_ptr, X_argsorted_i, sample_mask_ptr) + * n_left = criterion.update(0, c, y_ptr, y_stride, X_argsorted_i, sample_mask_ptr) * error = criterion.eval() # <<<<<<<<<<<<<< * * if n_left < min_leaf or (n_samples - n_left) < min_leaf: */ __pyx_v_error = ((struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion *)__pyx_v_criterion->__pyx_vtab)->eval(__pyx_v_criterion); - /* "sklearn/tree/_tree.pyx":817 + /* "sklearn/tree/_tree.pyx":1022 * error = criterion.eval() * * if n_left < min_leaf or (n_samples - n_left) < min_leaf: # <<<<<<<<<<<<<< * continue * */ - __pyx_t_5 = (__pyx_v_n_left < __pyx_v_min_leaf); - if (!__pyx_t_5) { - __pyx_t_13 = ((__pyx_v_n_samples - __pyx_v_n_left) < __pyx_v_min_leaf); - __pyx_t_14 = __pyx_t_13; + __pyx_t_2 = (__pyx_v_n_left < __pyx_v_min_leaf); + if (!__pyx_t_2) { + __pyx_t_12 = ((__pyx_v_n_samples - __pyx_v_n_left) < __pyx_v_min_leaf); + __pyx_t_13 = __pyx_t_12; } else { - __pyx_t_14 = __pyx_t_5; + __pyx_t_13 = __pyx_t_2; } - if (__pyx_t_14) { + if (__pyx_t_13) { - /* "sklearn/tree/_tree.pyx":818 + /* "sklearn/tree/_tree.pyx":1023 * * if n_left < min_leaf or (n_samples - n_left) < min_leaf: * continue # <<<<<<<<<<<<<< @@ -6782,17 +8122,17 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON } __pyx_L17:; - /* "sklearn/tree/_tree.pyx":820 + /* "sklearn/tree/_tree.pyx":1025 * continue * * if error < best_error: # <<<<<<<<<<<<<< * best_i = i * best_t = t */ - __pyx_t_14 = (__pyx_v_error < __pyx_v_best_error); - if (__pyx_t_14) { + __pyx_t_13 = (__pyx_v_error < __pyx_v_best_error); + if (__pyx_t_13) { - /* "sklearn/tree/_tree.pyx":821 + /* "sklearn/tree/_tree.pyx":1026 * * if error < best_error: * best_i = i # <<<<<<<<<<<<<< @@ -6801,7 +8141,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_best_i = __pyx_v_i; - /* "sklearn/tree/_tree.pyx":822 + /* "sklearn/tree/_tree.pyx":1027 * if error < best_error: * best_i = i * best_t = t # <<<<<<<<<<<<<< @@ -6810,7 +8150,7 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON */ __pyx_v_best_t = __pyx_v_t; - /* "sklearn/tree/_tree.pyx":823 + /* "sklearn/tree/_tree.pyx":1028 * best_i = i * best_t = t * best_error = error # <<<<<<<<<<<<<< @@ -6824,46 +8164,46 @@ static PyObject *__pyx_pf_7sklearn_4tree_5_tree_10_find_best_random_split(CYTHON __pyx_L5_continue:; } - /* "sklearn/tree/_tree.pyx":825 + /* "sklearn/tree/_tree.pyx":1030 * best_error = error * * return best_i, best_t, best_error, initial_error # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); - __pyx_t_6 = PyInt_FromLong(__pyx_v_best_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyInt_FromLong(__pyx_v_best_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyFloat_FromDouble(__pyx_v_best_t); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = PyFloat_FromDouble(__pyx_v_best_t); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = PyFloat_FromDouble(__pyx_v_best_error); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = PyFloat_FromDouble(__pyx_v_best_error); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_1 = PyFloat_FromDouble(__pyx_v_initial_error); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_6); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_initial_error); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); - PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_8); - __Pyx_GIVEREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; - __pyx_t_8 = 0; - __pyx_t_1 = 0; - __pyx_r = ((PyObject *)__pyx_t_2); - __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_r = ((PyObject *)__pyx_t_4); + __pyx_t_4 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); @@ -9020,58 +10360,12 @@ static PyObject *__pyx_tp_new_7sklearn_4tree_5_tree_ClassificationCriterion(PyTy if (!o) return 0; p = ((struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *)o); p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion*)__pyx_vtabptr_7sklearn_4tree_5_tree_ClassificationCriterion; - p->ndarray_label_count_left = Py_None; Py_INCREF(Py_None); - p->ndarray_label_count_right = Py_None; Py_INCREF(Py_None); - p->ndarray_label_count_init = Py_None; Py_INCREF(Py_None); return o; } -static void __pyx_tp_dealloc_7sklearn_4tree_5_tree_ClassificationCriterion(PyObject *o) { - struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *p = (struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *)o; - Py_XDECREF(p->ndarray_label_count_left); - Py_XDECREF(p->ndarray_label_count_right); - Py_XDECREF(p->ndarray_label_count_init); - __pyx_tp_dealloc_7sklearn_4tree_5_tree_Criterion(o); -} - -static int __pyx_tp_traverse_7sklearn_4tree_5_tree_ClassificationCriterion(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *p = (struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *)o; - if (__pyx_ptype_7sklearn_4tree_5_tree_Criterion->tp_traverse) { - e = __pyx_ptype_7sklearn_4tree_5_tree_Criterion->tp_traverse(o, v, a); if (e) return e; - } - if (p->ndarray_label_count_left) { - e = (*v)(p->ndarray_label_count_left, a); if (e) return e; - } - if (p->ndarray_label_count_right) { - e = (*v)(p->ndarray_label_count_right, a); if (e) return e; - } - if (p->ndarray_label_count_init) { - e = (*v)(p->ndarray_label_count_init, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7sklearn_4tree_5_tree_ClassificationCriterion(PyObject *o) { - struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *p = (struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion *)o; - PyObject* tmp; - if (__pyx_ptype_7sklearn_4tree_5_tree_Criterion->tp_clear) { - __pyx_ptype_7sklearn_4tree_5_tree_Criterion->tp_clear(o); - } - tmp = ((PyObject*)p->ndarray_label_count_left); - p->ndarray_label_count_left = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->ndarray_label_count_right); - p->ndarray_label_count_right = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->ndarray_label_count_init); - p->ndarray_label_count_init = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - static PyMethodDef __pyx_methods_7sklearn_4tree_5_tree_ClassificationCriterion[] = { - {__Pyx_NAMESTR("init_value"), (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_3init_value, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("__del__"), (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_3__del__, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("init_value"), (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_23ClassificationCriterion_5init_value, METH_NOARGS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; @@ -9178,7 +10472,7 @@ static PyTypeObject __pyx_type_7sklearn_4tree_5_tree_ClassificationCriterion = { __Pyx_NAMESTR("sklearn.tree._tree.ClassificationCriterion"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_4tree_5_tree_ClassificationCriterion), /*tp_basicsize*/ 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7sklearn_4tree_5_tree_ClassificationCriterion, /*tp_dealloc*/ + __pyx_tp_dealloc_7sklearn_4tree_5_tree_Criterion, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -9197,10 +10491,10 @@ static PyTypeObject __pyx_type_7sklearn_4tree_5_tree_ClassificationCriterion = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_ClassificationCriterion, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Abstract criterion for classification.\n\n Attributes\n ----------\n n_classes : int\n The number of classes.\n\n n_samples : int\n The number of samples.\n\n label_count_left : int*\n The label counts for samples left of splitting point.\n\n label_count_right : int*\n The label counts for samples right of splitting point.\n\n label_count_init : int*\n The initial label counts for samples right of splitting point.\n Used to reset `label_count_right` for each feature.\n\n n_left : int\n The number of samples left of splitting point.\n\n n_right : int\n The number of samples right of splitting point.\n "), /*tp_doc*/ - __pyx_tp_traverse_7sklearn_4tree_5_tree_ClassificationCriterion, /*tp_traverse*/ - __pyx_tp_clear_7sklearn_4tree_5_tree_ClassificationCriterion, /*tp_clear*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ @@ -9232,7 +10526,7 @@ static struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Gini __pyx_vtable_7sklearn_ static PyObject *__pyx_tp_new_7sklearn_4tree_5_tree_Gini(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_4tree_5_tree_Gini *p; - PyObject *o = __pyx_tp_new_7sklearn_4tree_5_tree_ClassificationCriterion(t, a, k); + PyObject *o = __pyx_tp_new_7sklearn_4tree_5_tree_Criterion(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_4tree_5_tree_Gini *)o); p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion*)__pyx_vtabptr_7sklearn_4tree_5_tree_Gini; @@ -9346,7 +10640,7 @@ static PyTypeObject __pyx_type_7sklearn_4tree_5_tree_Gini = { __Pyx_NAMESTR("sklearn.tree._tree.Gini"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_4tree_5_tree_Gini), /*tp_basicsize*/ 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7sklearn_4tree_5_tree_ClassificationCriterion, /*tp_dealloc*/ + __pyx_tp_dealloc_7sklearn_4tree_5_tree_Criterion, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -9365,10 +10659,10 @@ static PyTypeObject __pyx_type_7sklearn_4tree_5_tree_Gini = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_Gini, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Gini Index splitting criteria.\n\n Gini index = \\sum_{k=0}^{K-1} pmk (1 - pmk)\n = 1 - \\sum_{k=0}^{K-1} pmk ** 2\n "), /*tp_doc*/ - __pyx_tp_traverse_7sklearn_4tree_5_tree_ClassificationCriterion, /*tp_traverse*/ - __pyx_tp_clear_7sklearn_4tree_5_tree_ClassificationCriterion, /*tp_clear*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ @@ -9400,7 +10694,7 @@ static struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Entropy __pyx_vtable_7sklea static PyObject *__pyx_tp_new_7sklearn_4tree_5_tree_Entropy(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_4tree_5_tree_Entropy *p; - PyObject *o = __pyx_tp_new_7sklearn_4tree_5_tree_ClassificationCriterion(t, a, k); + PyObject *o = __pyx_tp_new_7sklearn_4tree_5_tree_Criterion(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_4tree_5_tree_Entropy *)o); p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_4tree_5_tree_Criterion*)__pyx_vtabptr_7sklearn_4tree_5_tree_Entropy; @@ -9514,7 +10808,7 @@ static PyTypeObject __pyx_type_7sklearn_4tree_5_tree_Entropy = { __Pyx_NAMESTR("sklearn.tree._tree.Entropy"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_4tree_5_tree_Entropy), /*tp_basicsize*/ 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7sklearn_4tree_5_tree_ClassificationCriterion, /*tp_dealloc*/ + __pyx_tp_dealloc_7sklearn_4tree_5_tree_Criterion, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -9533,10 +10827,10 @@ static PyTypeObject __pyx_type_7sklearn_4tree_5_tree_Entropy = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_Entropy, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Entropy splitting criteria.\n\n Cross Entropy = - \\sum_{k=0}^{K-1} pmk log(pmk)\n "), /*tp_doc*/ - __pyx_tp_traverse_7sklearn_4tree_5_tree_ClassificationCriterion, /*tp_traverse*/ - __pyx_tp_clear_7sklearn_4tree_5_tree_ClassificationCriterion, /*tp_clear*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ @@ -9576,7 +10870,8 @@ static PyObject *__pyx_tp_new_7sklearn_4tree_5_tree_RegressionCriterion(PyTypeOb } static PyMethodDef __pyx_methods_7sklearn_4tree_5_tree_RegressionCriterion[] = { - {__Pyx_NAMESTR("init_value"), (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_3init_value, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("__del__"), (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_3__del__, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("init_value"), (PyCFunction)__pyx_pw_7sklearn_4tree_5_tree_19RegressionCriterion_5init_value, METH_NOARGS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; @@ -9932,9 +11227,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_u_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 0}, {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0}, {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0}, - {&__pyx_n_s__C, __pyx_k__C, sizeof(__pyx_k__C), 0, 0, 1, 1}, {&__pyx_n_s__DTYPE, __pyx_k__DTYPE, sizeof(__pyx_k__DTYPE), 0, 0, 1, 1}, - {&__pyx_n_s__K, __pyx_k__K, sizeof(__pyx_k__K), 0, 0, 1, 1}, {&__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_n_s__X, __pyx_k__X, sizeof(__pyx_k__X), 0, 0, 1, 1}, @@ -9954,7 +11247,6 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s___random_sample_mask, __pyx_k___random_sample_mask, sizeof(__pyx_k___random_sample_mask), 0, 0, 1, 1}, {&__pyx_n_s__a, __pyx_k__a, sizeof(__pyx_k__a), 0, 0, 1, 1}, {&__pyx_n_s__arange, __pyx_k__arange, sizeof(__pyx_k__arange), 0, 0, 1, 1}, - {&__pyx_n_s__asarray, __pyx_k__asarray, sizeof(__pyx_k__asarray), 0, 0, 1, 1}, {&__pyx_n_s__astype, __pyx_k__astype, sizeof(__pyx_k__astype), 0, 0, 1, 1}, {&__pyx_n_s__b, __pyx_k__b, sizeof(__pyx_k__b), 0, 0, 1, 1}, {&__pyx_n_s__best_error, __pyx_k__best_error, sizeof(__pyx_k__best_error), 0, 0, 1, 1}, @@ -9984,13 +11276,13 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s__n_classes, __pyx_k__n_classes, sizeof(__pyx_k__n_classes), 0, 0, 1, 1}, {&__pyx_n_s__n_features, __pyx_k__n_features, sizeof(__pyx_k__n_features), 0, 0, 1, 1}, {&__pyx_n_s__n_left, __pyx_k__n_left, sizeof(__pyx_k__n_left), 0, 0, 1, 1}, + {&__pyx_n_s__n_outputs, __pyx_k__n_outputs, sizeof(__pyx_k__n_outputs), 0, 0, 1, 1}, {&__pyx_n_s__n_samples, __pyx_k__n_samples, sizeof(__pyx_k__n_samples), 0, 0, 1, 1}, {&__pyx_n_s__n_total_in_bag, __pyx_k__n_total_in_bag, sizeof(__pyx_k__n_total_in_bag), 0, 0, 1, 1}, {&__pyx_n_s__n_total_samples, __pyx_k__n_total_samples, sizeof(__pyx_k__n_total_samples), 0, 0, 1, 1}, {&__pyx_n_s__node_id, __pyx_k__node_id, sizeof(__pyx_k__node_id), 0, 0, 1, 1}, {&__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__order, __pyx_k__order, sizeof(__pyx_k__order), 0, 0, 1, 1}, {&__pyx_n_s__out, __pyx_k__out, sizeof(__pyx_k__out), 0, 0, 1, 1}, {&__pyx_n_s__permutation, __pyx_k__permutation, sizeof(__pyx_k__permutation), 0, 0, 1, 1}, {&__pyx_n_s__pred, __pyx_k__pred, sizeof(__pyx_k__pred), 0, 0, 1, 1}, @@ -10002,20 +11294,15 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s__t, __pyx_k__t, sizeof(__pyx_k__t), 0, 0, 1, 1}, {&__pyx_n_s__threshold, __pyx_k__threshold, sizeof(__pyx_k__threshold), 0, 0, 1, 1}, {&__pyx_n_s__values, __pyx_k__values, sizeof(__pyx_k__values), 0, 0, 1, 1}, - {&__pyx_n_s__xrange, __pyx_k__xrange, sizeof(__pyx_k__xrange), 0, 0, 1, 1}, {&__pyx_n_s__y, __pyx_k__y, sizeof(__pyx_k__y), 0, 0, 1, 1}, {&__pyx_n_s__y_ptr, __pyx_k__y_ptr, sizeof(__pyx_k__y_ptr), 0, 0, 1, 1}, + {&__pyx_n_s__y_stride, __pyx_k__y_stride, sizeof(__pyx_k__y_stride), 0, 0, 1, 1}, {&__pyx_n_s__zeros, __pyx_k__zeros, sizeof(__pyx_k__zeros), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #if PY_MAJOR_VERSION >= 3 - __pyx_builtin_xrange = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #else - __pyx_builtin_xrange = __Pyx_GetName(__pyx_b, __pyx_n_s__xrange); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; @@ -10110,14 +11397,14 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_11)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12)); - /* "sklearn/tree/_tree.pyx":409 + /* "sklearn/tree/_tree.pyx":604 * * * def _random_sample_mask(int n_total_samples, int n_total_in_bag, random_state): # <<<<<<<<<<<<<< * """Create a random sample mask where ``n_total_in_bag`` elements are set. * */ - __pyx_k_tuple_13 = PyTuple_New(7); if (unlikely(!__pyx_k_tuple_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_tuple_13 = PyTuple_New(7); if (unlikely(!__pyx_k_tuple_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_13); __Pyx_INCREF(((PyObject *)__pyx_n_s__n_total_samples)); PyTuple_SET_ITEM(__pyx_k_tuple_13, 0, ((PyObject *)__pyx_n_s__n_total_samples)); @@ -10141,16 +11428,16 @@ static int __Pyx_InitCachedConstants(void) { PyTuple_SET_ITEM(__pyx_k_tuple_13, 6, ((PyObject *)__pyx_n_s__i)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_13)); - __pyx_k_codeobj_14 = (PyObject*)__Pyx_PyCode_New(3, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s___random_sample_mask, 409, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_codeobj_14 = (PyObject*)__Pyx_PyCode_New(3, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s___random_sample_mask, 604, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":442 + /* "sklearn/tree/_tree.pyx":637 * * * def _apply_tree(np.ndarray[DTYPE_t, ndim=2] X, # <<<<<<<<<<<<<< * np.ndarray[np.int32_t, ndim=2] children, * np.ndarray[np.int32_t, ndim=1] feature, */ - __pyx_k_tuple_17 = PyTuple_New(8); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_tuple_17 = PyTuple_New(8); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_17); __Pyx_INCREF(((PyObject *)__pyx_n_s__X)); PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, ((PyObject *)__pyx_n_s__X)); @@ -10177,16 +11464,16 @@ static int __Pyx_InitCachedConstants(void) { PyTuple_SET_ITEM(__pyx_k_tuple_17, 7, ((PyObject *)__pyx_n_s__node_id)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__node_id)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17)); - __pyx_k_codeobj_18 = (PyObject*)__Pyx_PyCode_New(5, 0, 8, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_17, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s___apply_tree, 442, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_codeobj_18 = (PyObject*)__Pyx_PyCode_New(5, 0, 8, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_17, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s___apply_tree, 637, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":463 + /* "sklearn/tree/_tree.pyx":658 * * * def _predict_tree(np.ndarray[DTYPE_t, ndim=2] X, # <<<<<<<<<<<<<< * np.ndarray[np.int32_t, ndim=2] children, * np.ndarray[np.int32_t, ndim=1] feature, */ - __pyx_k_tuple_19 = PyTuple_New(11); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_tuple_19 = PyTuple_New(13); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_19); __Pyx_INCREF(((PyObject *)__pyx_n_s__X)); PyTuple_SET_ITEM(__pyx_k_tuple_19, 0, ((PyObject *)__pyx_n_s__X)); @@ -10209,29 +11496,35 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_INCREF(((PyObject *)__pyx_n_s__i)); PyTuple_SET_ITEM(__pyx_k_tuple_19, 6, ((PyObject *)__pyx_n_s__i)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i)); + __Pyx_INCREF(((PyObject *)__pyx_n_s__k)); + PyTuple_SET_ITEM(__pyx_k_tuple_19, 7, ((PyObject *)__pyx_n_s__k)); + __Pyx_GIVEREF(((PyObject *)__pyx_n_s__k)); + __Pyx_INCREF(((PyObject *)__pyx_n_s__c)); + PyTuple_SET_ITEM(__pyx_k_tuple_19, 8, ((PyObject *)__pyx_n_s__c)); + __Pyx_GIVEREF(((PyObject *)__pyx_n_s__c)); __Pyx_INCREF(((PyObject *)__pyx_n_s__n)); - PyTuple_SET_ITEM(__pyx_k_tuple_19, 7, ((PyObject *)__pyx_n_s__n)); + PyTuple_SET_ITEM(__pyx_k_tuple_19, 9, ((PyObject *)__pyx_n_s__n)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n)); __Pyx_INCREF(((PyObject *)__pyx_n_s__node_id)); - PyTuple_SET_ITEM(__pyx_k_tuple_19, 8, ((PyObject *)__pyx_n_s__node_id)); + PyTuple_SET_ITEM(__pyx_k_tuple_19, 10, ((PyObject *)__pyx_n_s__node_id)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__node_id)); - __Pyx_INCREF(((PyObject *)__pyx_n_s__K)); - PyTuple_SET_ITEM(__pyx_k_tuple_19, 9, ((PyObject *)__pyx_n_s__K)); - __Pyx_GIVEREF(((PyObject *)__pyx_n_s__K)); - __Pyx_INCREF(((PyObject *)__pyx_n_s__k)); - PyTuple_SET_ITEM(__pyx_k_tuple_19, 10, ((PyObject *)__pyx_n_s__k)); - __Pyx_GIVEREF(((PyObject *)__pyx_n_s__k)); + __Pyx_INCREF(((PyObject *)__pyx_n_s__n_outputs)); + PyTuple_SET_ITEM(__pyx_k_tuple_19, 11, ((PyObject *)__pyx_n_s__n_outputs)); + __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_outputs)); + __Pyx_INCREF(((PyObject *)__pyx_n_s__n_classes)); + PyTuple_SET_ITEM(__pyx_k_tuple_19, 12, ((PyObject *)__pyx_n_s__n_classes)); + __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_classes)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_19)); - __pyx_k_codeobj_20 = (PyObject*)__Pyx_PyCode_New(6, 0, 11, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s___predict_tree, 463, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_codeobj_20 = (PyObject*)__Pyx_PyCode_New(6, 0, 13, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s___predict_tree, 658, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":486 + /* "sklearn/tree/_tree.pyx":685 * * - * def _error_at_leaf(np.ndarray[DTYPE_t, ndim=1, mode="c"] y, # <<<<<<<<<<<<<< - * np.ndarray sample_mask, Criterion criterion, - * int n_samples): + * def _error_at_leaf(np.ndarray[DTYPE_t, ndim=2, mode="c"] y, # <<<<<<<<<<<<<< + * np.ndarray sample_mask, + * Criterion criterion, */ - __pyx_k_tuple_21 = PyTuple_New(7); if (unlikely(!__pyx_k_tuple_21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_tuple_21 = PyTuple_New(8); if (unlikely(!__pyx_k_tuple_21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_21); __Pyx_INCREF(((PyObject *)__pyx_n_s__y)); PyTuple_SET_ITEM(__pyx_k_tuple_21, 0, ((PyObject *)__pyx_n_s__y)); @@ -10245,26 +11538,29 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_INCREF(((PyObject *)__pyx_n_s__n_samples)); PyTuple_SET_ITEM(__pyx_k_tuple_21, 3, ((PyObject *)__pyx_n_s__n_samples)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_samples)); - __Pyx_INCREF(((PyObject *)__pyx_n_s__n_total_samples)); - PyTuple_SET_ITEM(__pyx_k_tuple_21, 4, ((PyObject *)__pyx_n_s__n_total_samples)); - __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_total_samples)); __Pyx_INCREF(((PyObject *)__pyx_n_s__y_ptr)); - PyTuple_SET_ITEM(__pyx_k_tuple_21, 5, ((PyObject *)__pyx_n_s__y_ptr)); + PyTuple_SET_ITEM(__pyx_k_tuple_21, 4, ((PyObject *)__pyx_n_s__y_ptr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y_ptr)); + __Pyx_INCREF(((PyObject *)__pyx_n_s__y_stride)); + PyTuple_SET_ITEM(__pyx_k_tuple_21, 5, ((PyObject *)__pyx_n_s__y_stride)); + __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y_stride)); + __Pyx_INCREF(((PyObject *)__pyx_n_s__n_total_samples)); + PyTuple_SET_ITEM(__pyx_k_tuple_21, 6, ((PyObject *)__pyx_n_s__n_total_samples)); + __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_total_samples)); __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_mask_ptr)); - PyTuple_SET_ITEM(__pyx_k_tuple_21, 6, ((PyObject *)__pyx_n_s__sample_mask_ptr)); + PyTuple_SET_ITEM(__pyx_k_tuple_21, 7, ((PyObject *)__pyx_n_s__sample_mask_ptr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_mask_ptr)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_21)); - __pyx_k_codeobj_22 = (PyObject*)__Pyx_PyCode_New(4, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s___error_at_leaf, 486, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_22)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_codeobj_22 = (PyObject*)__Pyx_PyCode_New(4, 0, 8, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s___error_at_leaf, 685, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_22)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":533 + /* "sklearn/tree/_tree.pyx":736 * * * def _find_best_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, # <<<<<<<<<<<<<< - * np.ndarray[DTYPE_t, ndim=1, mode="c"] y, + * np.ndarray[DTYPE_t, ndim=2, mode="c"] y, * np.ndarray[np.int32_t, ndim=2, mode="fortran"] X_argsorted, */ - __pyx_k_tuple_25 = PyTuple_New(33); if (unlikely(!__pyx_k_tuple_25)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_tuple_25 = PyTuple_New(34); if (unlikely(!__pyx_k_tuple_25)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_25); __Pyx_INCREF(((PyObject *)__pyx_n_s__X)); PyTuple_SET_ITEM(__pyx_k_tuple_25, 0, ((PyObject *)__pyx_n_s__X)); @@ -10332,50 +11628,53 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_INCREF(((PyObject *)__pyx_n_s__best_t)); PyTuple_SET_ITEM(__pyx_k_tuple_25, 21, ((PyObject *)__pyx_n_s__best_t)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__best_t)); - __Pyx_INCREF(((PyObject *)__pyx_n_s__y_ptr)); - PyTuple_SET_ITEM(__pyx_k_tuple_25, 22, ((PyObject *)__pyx_n_s__y_ptr)); - __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y_ptr)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_i)); - PyTuple_SET_ITEM(__pyx_k_tuple_25, 23, ((PyObject *)__pyx_n_s__X_i)); + PyTuple_SET_ITEM(__pyx_k_tuple_25, 22, ((PyObject *)__pyx_n_s__X_i)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_i)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_argsorted_i)); - PyTuple_SET_ITEM(__pyx_k_tuple_25, 24, ((PyObject *)__pyx_n_s__X_argsorted_i)); + PyTuple_SET_ITEM(__pyx_k_tuple_25, 23, ((PyObject *)__pyx_n_s__X_argsorted_i)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_argsorted_i)); + __Pyx_INCREF(((PyObject *)__pyx_n_s__y_ptr)); + PyTuple_SET_ITEM(__pyx_k_tuple_25, 24, ((PyObject *)__pyx_n_s__y_ptr)); + __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y_ptr)); __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_mask_ptr)); PyTuple_SET_ITEM(__pyx_k_tuple_25, 25, ((PyObject *)__pyx_n_s__sample_mask_ptr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_mask_ptr)); __Pyx_INCREF(((PyObject *)__pyx_n_s__features)); PyTuple_SET_ITEM(__pyx_k_tuple_25, 26, ((PyObject *)__pyx_n_s__features)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__features)); + __Pyx_INCREF(((PyObject *)__pyx_n_s__y_stride)); + PyTuple_SET_ITEM(__pyx_k_tuple_25, 27, ((PyObject *)__pyx_n_s__y_stride)); + __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y_stride)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_elem_stride)); - PyTuple_SET_ITEM(__pyx_k_tuple_25, 27, ((PyObject *)__pyx_n_s__X_elem_stride)); + PyTuple_SET_ITEM(__pyx_k_tuple_25, 28, ((PyObject *)__pyx_n_s__X_elem_stride)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_elem_stride)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_col_stride)); - PyTuple_SET_ITEM(__pyx_k_tuple_25, 28, ((PyObject *)__pyx_n_s__X_col_stride)); + PyTuple_SET_ITEM(__pyx_k_tuple_25, 29, ((PyObject *)__pyx_n_s__X_col_stride)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_col_stride)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_stride)); - PyTuple_SET_ITEM(__pyx_k_tuple_25, 29, ((PyObject *)__pyx_n_s__X_stride)); + PyTuple_SET_ITEM(__pyx_k_tuple_25, 30, ((PyObject *)__pyx_n_s__X_stride)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_stride)); __Pyx_INCREF(((PyObject *)__pyx_n_s_23)); - PyTuple_SET_ITEM(__pyx_k_tuple_25, 30, ((PyObject *)__pyx_n_s_23)); + PyTuple_SET_ITEM(__pyx_k_tuple_25, 31, ((PyObject *)__pyx_n_s_23)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s_23)); __Pyx_INCREF(((PyObject *)__pyx_n_s_24)); - PyTuple_SET_ITEM(__pyx_k_tuple_25, 31, ((PyObject *)__pyx_n_s_24)); + PyTuple_SET_ITEM(__pyx_k_tuple_25, 32, ((PyObject *)__pyx_n_s_24)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s_24)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_argsorted_stride)); - PyTuple_SET_ITEM(__pyx_k_tuple_25, 32, ((PyObject *)__pyx_n_s__X_argsorted_stride)); + PyTuple_SET_ITEM(__pyx_k_tuple_25, 33, ((PyObject *)__pyx_n_s__X_argsorted_stride)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_argsorted_stride)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_25)); - __pyx_k_codeobj_26 = (PyObject*)__Pyx_PyCode_New(9, 0, 33, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s___find_best_split, 533, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_26)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_codeobj_26 = (PyObject*)__Pyx_PyCode_New(9, 0, 34, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s___find_best_split, 736, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_26)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "sklearn/tree/_tree.pyx":678 + /* "sklearn/tree/_tree.pyx":882 * return best_i, best_t, best_error, initial_error * * def _find_best_random_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, # <<<<<<<<<<<<<< - * np.ndarray[DTYPE_t, ndim=1, mode="c"] y, + * np.ndarray[DTYPE_t, ndim=2, mode="c"] y, * np.ndarray[np.int32_t, ndim=2, mode="fortran"] X_argsorted, */ - __pyx_k_tuple_27 = PyTuple_New(34); if (unlikely(!__pyx_k_tuple_27)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_tuple_27 = PyTuple_New(35); if (unlikely(!__pyx_k_tuple_27)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_27); __Pyx_INCREF(((PyObject *)__pyx_n_s__X)); PyTuple_SET_ITEM(__pyx_k_tuple_27, 0, ((PyObject *)__pyx_n_s__X)); @@ -10446,41 +11745,44 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_INCREF(((PyObject *)__pyx_n_s__best_t)); PyTuple_SET_ITEM(__pyx_k_tuple_27, 22, ((PyObject *)__pyx_n_s__best_t)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__best_t)); - __Pyx_INCREF(((PyObject *)__pyx_n_s__y_ptr)); - PyTuple_SET_ITEM(__pyx_k_tuple_27, 23, ((PyObject *)__pyx_n_s__y_ptr)); - __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y_ptr)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_i)); - PyTuple_SET_ITEM(__pyx_k_tuple_27, 24, ((PyObject *)__pyx_n_s__X_i)); + PyTuple_SET_ITEM(__pyx_k_tuple_27, 23, ((PyObject *)__pyx_n_s__X_i)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_i)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_argsorted_i)); - PyTuple_SET_ITEM(__pyx_k_tuple_27, 25, ((PyObject *)__pyx_n_s__X_argsorted_i)); + PyTuple_SET_ITEM(__pyx_k_tuple_27, 24, ((PyObject *)__pyx_n_s__X_argsorted_i)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_argsorted_i)); + __Pyx_INCREF(((PyObject *)__pyx_n_s__y_ptr)); + PyTuple_SET_ITEM(__pyx_k_tuple_27, 25, ((PyObject *)__pyx_n_s__y_ptr)); + __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y_ptr)); __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_mask_ptr)); PyTuple_SET_ITEM(__pyx_k_tuple_27, 26, ((PyObject *)__pyx_n_s__sample_mask_ptr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_mask_ptr)); __Pyx_INCREF(((PyObject *)__pyx_n_s__features)); PyTuple_SET_ITEM(__pyx_k_tuple_27, 27, ((PyObject *)__pyx_n_s__features)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__features)); + __Pyx_INCREF(((PyObject *)__pyx_n_s__y_stride)); + PyTuple_SET_ITEM(__pyx_k_tuple_27, 28, ((PyObject *)__pyx_n_s__y_stride)); + __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y_stride)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_elem_stride)); - PyTuple_SET_ITEM(__pyx_k_tuple_27, 28, ((PyObject *)__pyx_n_s__X_elem_stride)); + PyTuple_SET_ITEM(__pyx_k_tuple_27, 29, ((PyObject *)__pyx_n_s__X_elem_stride)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_elem_stride)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_col_stride)); - PyTuple_SET_ITEM(__pyx_k_tuple_27, 29, ((PyObject *)__pyx_n_s__X_col_stride)); + PyTuple_SET_ITEM(__pyx_k_tuple_27, 30, ((PyObject *)__pyx_n_s__X_col_stride)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_col_stride)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_stride)); - PyTuple_SET_ITEM(__pyx_k_tuple_27, 30, ((PyObject *)__pyx_n_s__X_stride)); + PyTuple_SET_ITEM(__pyx_k_tuple_27, 31, ((PyObject *)__pyx_n_s__X_stride)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_stride)); __Pyx_INCREF(((PyObject *)__pyx_n_s_23)); - PyTuple_SET_ITEM(__pyx_k_tuple_27, 31, ((PyObject *)__pyx_n_s_23)); + PyTuple_SET_ITEM(__pyx_k_tuple_27, 32, ((PyObject *)__pyx_n_s_23)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s_23)); __Pyx_INCREF(((PyObject *)__pyx_n_s_24)); - PyTuple_SET_ITEM(__pyx_k_tuple_27, 32, ((PyObject *)__pyx_n_s_24)); + PyTuple_SET_ITEM(__pyx_k_tuple_27, 33, ((PyObject *)__pyx_n_s_24)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s_24)); __Pyx_INCREF(((PyObject *)__pyx_n_s__X_argsorted_stride)); - PyTuple_SET_ITEM(__pyx_k_tuple_27, 33, ((PyObject *)__pyx_n_s__X_argsorted_stride)); + PyTuple_SET_ITEM(__pyx_k_tuple_27, 34, ((PyObject *)__pyx_n_s__X_argsorted_stride)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_argsorted_stride)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_27)); - __pyx_k_codeobj_28 = (PyObject*)__Pyx_PyCode_New(9, 0, 34, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_27, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s_29, 678, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_28)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_k_codeobj_28 = (PyObject*)__Pyx_PyCode_New(9, 0, 35, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_27, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_15, __pyx_n_s_29, 882, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_28)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -10490,6 +11792,7 @@ static int __Pyx_InitCachedConstants(void) { static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; return 0; __pyx_L1_error:; @@ -10506,6 +11809,7 @@ PyMODINIT_FUNC PyInit__tree(void) { PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; + __pyx_t_7sklearn_4tree_5_tree_DTYPE_t __pyx_t_3; __Pyx_RefNannyDeclarations #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); @@ -10563,62 +11867,62 @@ PyMODINIT_FUNC PyInit__tree(void) /*--- Function export code ---*/ /*--- Type init code ---*/ __pyx_vtabptr_7sklearn_4tree_5_tree_Criterion = &__pyx_vtable_7sklearn_4tree_5_tree_Criterion; - __pyx_vtable_7sklearn_4tree_5_tree_Criterion.init = (void (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *, int, int))__pyx_f_7sklearn_4tree_5_tree_9Criterion_init; + __pyx_vtable_7sklearn_4tree_5_tree_Criterion.init = (void (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *, int, int))__pyx_f_7sklearn_4tree_5_tree_9Criterion_init; __pyx_vtable_7sklearn_4tree_5_tree_Criterion.reset = (void (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *))__pyx_f_7sklearn_4tree_5_tree_9Criterion_reset; - __pyx_vtable_7sklearn_4tree_5_tree_Criterion.update = (int (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int, int, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *))__pyx_f_7sklearn_4tree_5_tree_9Criterion_update; + __pyx_vtable_7sklearn_4tree_5_tree_Criterion.update = (int (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int, int, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int, int *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *))__pyx_f_7sklearn_4tree_5_tree_9Criterion_update; __pyx_vtable_7sklearn_4tree_5_tree_Criterion.eval = (double (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *))__pyx_f_7sklearn_4tree_5_tree_9Criterion_eval; __pyx_vtable_7sklearn_4tree_5_tree_Criterion.init_value = (PyArrayObject *(*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int __pyx_skip_dispatch))__pyx_f_7sklearn_4tree_5_tree_9Criterion_init_value; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_Criterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_Criterion.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_Criterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetAttrString(__pyx_m, "Criterion", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_Criterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_Criterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_Criterion.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_Criterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "Criterion", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_Criterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_5_tree_Criterion = &__pyx_type_7sklearn_4tree_5_tree_Criterion; __pyx_vtabptr_7sklearn_4tree_5_tree_ClassificationCriterion = &__pyx_vtable_7sklearn_4tree_5_tree_ClassificationCriterion; __pyx_vtable_7sklearn_4tree_5_tree_ClassificationCriterion.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_5_tree_Criterion; - __pyx_vtable_7sklearn_4tree_5_tree_ClassificationCriterion.__pyx_base.init = (void (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *, int, int))__pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_init; + __pyx_vtable_7sklearn_4tree_5_tree_ClassificationCriterion.__pyx_base.init = (void (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *, int, int))__pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_init; __pyx_vtable_7sklearn_4tree_5_tree_ClassificationCriterion.__pyx_base.reset = (void (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *))__pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_reset; - __pyx_vtable_7sklearn_4tree_5_tree_ClassificationCriterion.__pyx_base.update = (int (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int, int, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *))__pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_update; + __pyx_vtable_7sklearn_4tree_5_tree_ClassificationCriterion.__pyx_base.update = (int (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int, int, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int, int *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *))__pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_update; __pyx_vtable_7sklearn_4tree_5_tree_ClassificationCriterion.__pyx_base.eval = (double (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *))__pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_eval; __pyx_vtable_7sklearn_4tree_5_tree_ClassificationCriterion.__pyx_base.init_value = (PyArrayObject *(*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int __pyx_skip_dispatch))__pyx_f_7sklearn_4tree_5_tree_23ClassificationCriterion_init_value; __pyx_type_7sklearn_4tree_5_tree_ClassificationCriterion.tp_base = __pyx_ptype_7sklearn_4tree_5_tree_Criterion; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_ClassificationCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_ClassificationCriterion.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_ClassificationCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetAttrString(__pyx_m, "ClassificationCriterion", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_ClassificationCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_ClassificationCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_ClassificationCriterion.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_ClassificationCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "ClassificationCriterion", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_ClassificationCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_5_tree_ClassificationCriterion = &__pyx_type_7sklearn_4tree_5_tree_ClassificationCriterion; __pyx_vtabptr_7sklearn_4tree_5_tree_Gini = &__pyx_vtable_7sklearn_4tree_5_tree_Gini; __pyx_vtable_7sklearn_4tree_5_tree_Gini.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_5_tree_ClassificationCriterion; __pyx_vtable_7sklearn_4tree_5_tree_Gini.__pyx_base.__pyx_base.eval = (double (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *))__pyx_f_7sklearn_4tree_5_tree_4Gini_eval; __pyx_type_7sklearn_4tree_5_tree_Gini.tp_base = __pyx_ptype_7sklearn_4tree_5_tree_ClassificationCriterion; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_Gini) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_Gini.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_Gini) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetAttrString(__pyx_m, "Gini", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_Gini) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_Gini) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_Gini.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_Gini) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "Gini", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_Gini) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_5_tree_Gini = &__pyx_type_7sklearn_4tree_5_tree_Gini; __pyx_vtabptr_7sklearn_4tree_5_tree_Entropy = &__pyx_vtable_7sklearn_4tree_5_tree_Entropy; __pyx_vtable_7sklearn_4tree_5_tree_Entropy.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_5_tree_ClassificationCriterion; __pyx_vtable_7sklearn_4tree_5_tree_Entropy.__pyx_base.__pyx_base.eval = (double (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *))__pyx_f_7sklearn_4tree_5_tree_7Entropy_eval; __pyx_type_7sklearn_4tree_5_tree_Entropy.tp_base = __pyx_ptype_7sklearn_4tree_5_tree_ClassificationCriterion; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_Entropy) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_Entropy.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_Entropy) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetAttrString(__pyx_m, "Entropy", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_Entropy) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_Entropy) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_Entropy.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_Entropy) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "Entropy", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_Entropy) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_5_tree_Entropy = &__pyx_type_7sklearn_4tree_5_tree_Entropy; __pyx_vtabptr_7sklearn_4tree_5_tree_RegressionCriterion = &__pyx_vtable_7sklearn_4tree_5_tree_RegressionCriterion; __pyx_vtable_7sklearn_4tree_5_tree_RegressionCriterion.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_5_tree_Criterion; - __pyx_vtable_7sklearn_4tree_5_tree_RegressionCriterion.__pyx_base.init = (void (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *, int, int))__pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_init; + __pyx_vtable_7sklearn_4tree_5_tree_RegressionCriterion.__pyx_base.init = (void (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *, int, int))__pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_init; __pyx_vtable_7sklearn_4tree_5_tree_RegressionCriterion.__pyx_base.reset = (void (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *))__pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_reset; - __pyx_vtable_7sklearn_4tree_5_tree_RegressionCriterion.__pyx_base.update = (int (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int, int, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *))__pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_update; + __pyx_vtable_7sklearn_4tree_5_tree_RegressionCriterion.__pyx_base.update = (int (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int, int, __pyx_t_7sklearn_4tree_5_tree_DTYPE_t *, int, int *, __pyx_t_7sklearn_4tree_5_tree_BOOL_t *))__pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_update; __pyx_vtable_7sklearn_4tree_5_tree_RegressionCriterion.__pyx_base.eval = (double (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *))__pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_eval; __pyx_vtable_7sklearn_4tree_5_tree_RegressionCriterion.__pyx_base.init_value = (PyArrayObject *(*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *, int __pyx_skip_dispatch))__pyx_f_7sklearn_4tree_5_tree_19RegressionCriterion_init_value; __pyx_type_7sklearn_4tree_5_tree_RegressionCriterion.tp_base = __pyx_ptype_7sklearn_4tree_5_tree_Criterion; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_RegressionCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_RegressionCriterion.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_RegressionCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetAttrString(__pyx_m, "RegressionCriterion", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_RegressionCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_RegressionCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_RegressionCriterion.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_RegressionCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "RegressionCriterion", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_RegressionCriterion) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_5_tree_RegressionCriterion = &__pyx_type_7sklearn_4tree_5_tree_RegressionCriterion; __pyx_vtabptr_7sklearn_4tree_5_tree_MSE = &__pyx_vtable_7sklearn_4tree_5_tree_MSE; __pyx_vtable_7sklearn_4tree_5_tree_MSE.__pyx_base = *__pyx_vtabptr_7sklearn_4tree_5_tree_RegressionCriterion; __pyx_vtable_7sklearn_4tree_5_tree_MSE.__pyx_base.__pyx_base.eval = (double (*)(struct __pyx_obj_7sklearn_4tree_5_tree_Criterion *))__pyx_f_7sklearn_4tree_5_tree_3MSE_eval; __pyx_type_7sklearn_4tree_5_tree_MSE.tp_base = __pyx_ptype_7sklearn_4tree_5_tree_RegressionCriterion; - if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_MSE) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_MSE.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_MSE) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetAttrString(__pyx_m, "MSE", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_MSE) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (PyType_Ready(&__pyx_type_7sklearn_4tree_5_tree_MSE) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_7sklearn_4tree_5_tree_MSE.tp_dict, __pyx_vtabptr_7sklearn_4tree_5_tree_MSE) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "MSE", (PyObject *)&__pyx_type_7sklearn_4tree_5_tree_MSE) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_4tree_5_tree_MSE = &__pyx_type_7sklearn_4tree_5_tree_MSE; /*--- Type import code ---*/ __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;} @@ -10657,87 +11961,103 @@ PyMODINIT_FUNC PyInit__tree(void) if (PyObject_SetAttr(__pyx_m, __pyx_n_s__DTYPE, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "sklearn/tree/_tree.pyx":409 + /* "sklearn/tree/_tree.pyx":32 + * cdef extern double DBL_MAX * + * cdef DTYPE_t INFINITY = np.inf # <<<<<<<<<<<<<< * - * def _random_sample_mask(int n_total_samples, int n_total_in_bag, random_state): # <<<<<<<<<<<<<< - * """Create a random sample mask where ``n_total_in_bag`` elements are set. * */ - __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_1_random_sample_mask, NULL, __pyx_n_s_16); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s___random_sample_mask, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__inf); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_3 = __pyx_PyFloat_AsFloat(__pyx_t_1); if (unlikely((__pyx_t_3 == (npy_float32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_7sklearn_4tree_5_tree_INFINITY = __pyx_t_3; - /* "sklearn/tree/_tree.pyx":442 + /* "sklearn/tree/_tree.pyx":604 + * + * + * def _random_sample_mask(int n_total_samples, int n_total_in_bag, random_state): # <<<<<<<<<<<<<< + * """Create a random sample mask where ``n_total_in_bag`` elements are set. + * + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_1_random_sample_mask, NULL, __pyx_n_s_16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyObject_SetAttr(__pyx_m, __pyx_n_s___random_sample_mask, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "sklearn/tree/_tree.pyx":637 * * * def _apply_tree(np.ndarray[DTYPE_t, ndim=2] X, # <<<<<<<<<<<<<< * np.ndarray[np.int32_t, ndim=2] children, * np.ndarray[np.int32_t, ndim=1] feature, */ - __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_3_apply_tree, NULL, __pyx_n_s_16); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s___apply_tree, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_3_apply_tree, NULL, __pyx_n_s_16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyObject_SetAttr(__pyx_m, __pyx_n_s___apply_tree, __pyx_t_1) < 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; - /* "sklearn/tree/_tree.pyx":463 + /* "sklearn/tree/_tree.pyx":658 * * * def _predict_tree(np.ndarray[DTYPE_t, ndim=2] X, # <<<<<<<<<<<<<< * np.ndarray[np.int32_t, ndim=2] children, * np.ndarray[np.int32_t, ndim=1] feature, */ - __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_5_predict_tree, NULL, __pyx_n_s_16); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s___predict_tree, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_5_predict_tree, NULL, __pyx_n_s_16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyObject_SetAttr(__pyx_m, __pyx_n_s___predict_tree, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":486 + /* "sklearn/tree/_tree.pyx":685 * * - * def _error_at_leaf(np.ndarray[DTYPE_t, ndim=1, mode="c"] y, # <<<<<<<<<<<<<< - * np.ndarray sample_mask, Criterion criterion, - * int n_samples): + * def _error_at_leaf(np.ndarray[DTYPE_t, ndim=2, mode="c"] y, # <<<<<<<<<<<<<< + * np.ndarray sample_mask, + * Criterion criterion, */ - __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_7_error_at_leaf, NULL, __pyx_n_s_16); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s___error_at_leaf, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_7_error_at_leaf, NULL, __pyx_n_s_16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyObject_SetAttr(__pyx_m, __pyx_n_s___error_at_leaf, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":533 + /* "sklearn/tree/_tree.pyx":736 * * * def _find_best_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, # <<<<<<<<<<<<<< - * np.ndarray[DTYPE_t, ndim=1, mode="c"] y, + * np.ndarray[DTYPE_t, ndim=2, mode="c"] y, * np.ndarray[np.int32_t, ndim=2, mode="fortran"] X_argsorted, */ - __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_9_find_best_split, NULL, __pyx_n_s_16); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s___find_best_split, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_9_find_best_split, NULL, __pyx_n_s_16); 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 (PyObject_SetAttr(__pyx_m, __pyx_n_s___find_best_split, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "sklearn/tree/_tree.pyx":678 + /* "sklearn/tree/_tree.pyx":882 * return best_i, best_t, best_error, initial_error * * def _find_best_random_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, # <<<<<<<<<<<<<< - * np.ndarray[DTYPE_t, ndim=1, mode="c"] y, + * np.ndarray[DTYPE_t, ndim=2, mode="c"] y, * np.ndarray[np.int32_t, ndim=2, mode="fortran"] X_argsorted, */ - __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_11_find_best_random_split, NULL, __pyx_n_s_16); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_29, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_4tree_5_tree_11_find_best_random_split, NULL, __pyx_n_s_16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_29, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "sklearn/tree/_tree.pyx":1 * # encoding: utf-8 # <<<<<<<<<<<<<< * # cython: cdivision=True * # cython: boundscheck=False */ - __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_2)); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_1)); + if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; /* "numpy.pxd":974 * arr.base = baseptr @@ -10782,21 +12102,6 @@ static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { } #endif /* CYTHON_REFNANNY */ -static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { - PyObject *result; - result = PyObject_GetAttr(dict, name); - if (!result) { - if (dict != __pyx_b) { - PyErr_Clear(); - result = PyObject_GetAttr(__pyx_b, name); - } - if (!result) { - PyErr_SetObject(PyExc_NameError, name); - } - } - return result; -} - static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { if (unlikely(!type)) { PyErr_Format(PyExc_SystemError, "Missing type object"); @@ -10809,6 +12114,31 @@ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { return 0; } +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%s() takes %s %"PY_FORMAT_SIZE_T"d positional argument%s (%"PY_FORMAT_SIZE_T"d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) @@ -10899,29 +12229,21 @@ static int __Pyx_ParseOptionalKeywords( return -1; } -static void __Pyx_RaiseArgtupleInvalid( - const char* func_name, - int exact, - Py_ssize_t num_min, - Py_ssize_t num_max, - Py_ssize_t num_found) -{ - Py_ssize_t num_expected; - const char *more_or_less; - if (num_found < num_min) { - num_expected = num_min; - more_or_less = "at least"; - } else { - num_expected = num_max; - more_or_less = "at most"; - } - if (exact) { - more_or_less = "exactly"; + + +static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { + PyObject *result; + result = PyObject_GetAttr(dict, name); + if (!result) { + if (dict != __pyx_b) { + PyErr_Clear(); + result = PyObject_GetAttr(__pyx_b, name); + } + if (!result) { + PyErr_SetObject(PyExc_NameError, name); + } } - PyErr_Format(PyExc_TypeError, - "%s() takes %s %"PY_FORMAT_SIZE_T"d positional argument%s (%"PY_FORMAT_SIZE_T"d given)", - func_name, more_or_less, num_expected, - (num_expected == 1) ? "" : "s", num_found); + return result; } static CYTHON_INLINE int __Pyx_IsLittleEndian(void) { @@ -11492,40 +12814,6 @@ static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyOb #endif } -static CYTHON_INLINE int __Pyx_CheckKeywordStrings( - PyObject *kwdict, - const char* function_name, - int kw_allowed) -{ - PyObject* key = 0; - Py_ssize_t pos = 0; - while (PyDict_Next(kwdict, &pos, &key, 0)) { - #if PY_MAJOR_VERSION < 3 - if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) - #else - if (unlikely(!PyUnicode_Check(key))) - #endif - goto invalid_keyword_type; - } - if ((!kw_allowed) && unlikely(key)) - goto invalid_keyword; - return 1; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%s() keywords must be strings", function_name); - return 0; -invalid_keyword: - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION < 3 - "%s() got an unexpected keyword argument '%s'", - function_name, PyString_AsString(key)); - #else - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif - return 0; -} - static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact) { @@ -11860,58 +13148,6 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { return module; } -static CYTHON_INLINE npy_int32 __Pyx_PyInt_from_py_npy_int32(PyObject* x) { - const npy_int32 neg_one = (npy_int32)-1, const_zero = (npy_int32)0; - const int is_unsigned = const_zero < neg_one; - if (sizeof(npy_int32) == sizeof(char)) { - if (is_unsigned) - return (npy_int32)__Pyx_PyInt_AsUnsignedChar(x); - else - return (npy_int32)__Pyx_PyInt_AsSignedChar(x); - } else if (sizeof(npy_int32) == sizeof(short)) { - if (is_unsigned) - return (npy_int32)__Pyx_PyInt_AsUnsignedShort(x); - else - return (npy_int32)__Pyx_PyInt_AsSignedShort(x); - } else if (sizeof(npy_int32) == sizeof(int)) { - if (is_unsigned) - return (npy_int32)__Pyx_PyInt_AsUnsignedInt(x); - else - return (npy_int32)__Pyx_PyInt_AsSignedInt(x); - } else if (sizeof(npy_int32) == sizeof(long)) { - if (is_unsigned) - return (npy_int32)__Pyx_PyInt_AsUnsignedLong(x); - else - return (npy_int32)__Pyx_PyInt_AsSignedLong(x); - } else if (sizeof(npy_int32) == sizeof(PY_LONG_LONG)) { - if (is_unsigned) - return (npy_int32)__Pyx_PyInt_AsUnsignedLongLong(x); - else - return (npy_int32)__Pyx_PyInt_AsSignedLongLong(x); - } else { - npy_int32 val; - PyObject *v = __Pyx_PyNumber_Int(x); - #if PY_VERSION_HEX < 0x03000000 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } - return (npy_int32)-1; - } -} - #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { diff --git a/sklearn/tree/_tree.pyx b/sklearn/tree/_tree.pyx index 55472ddfed261..202ca22bf6dde 100644 --- a/sklearn/tree/_tree.pyx +++ b/sklearn/tree/_tree.pyx @@ -17,6 +17,11 @@ DTYPE = np.float32 ctypedef np.float32_t DTYPE_t ctypedef np.int8_t BOOL_t +cdef extern from "stdlib.h": + void* malloc(size_t size) + void* calloc(size_t nmemb, size_t size) + void free(void* ptr) + cdef extern from "math.h": cdef extern double log(double x) cdef extern double pow(double base, double exponent) @@ -24,6 +29,8 @@ cdef extern from "math.h": cdef extern from "float.h": cdef extern double DBL_MAX +cdef DTYPE_t INFINITY = np.inf + ################################################################################ # Classification entropy measures @@ -40,8 +47,11 @@ cdef extern from "float.h": cdef class Criterion: """Interface for splitting criteria (regression and classification)""" - cdef void init(self, DTYPE_t *y, BOOL_t *sample_mask, int n_samples, - int n_total_samples): + cdef void init(self, DTYPE_t* y, + int y_stride, + BOOL_t* sample_mask, + int n_samples, + int n_total_samples): """Initialise the criterion class for new split point.""" pass @@ -49,8 +59,12 @@ cdef class Criterion: """Reset the criterion for a new feature index.""" pass - cdef int update(self, int a, int b, DTYPE_t *y, int *X_argsorted_i, - BOOL_t *sample_mask): + cdef int update(self, int a, + int b, + DTYPE_t* y, + int y_stride, + int* X_argsorted_i, + BOOL_t* sample_mask): """Update the criteria for each value in interval [a,b) (where a and b are indices in `X_argsorted_i`).""" pass @@ -91,92 +105,152 @@ cdef class ClassificationCriterion(Criterion): n_right : int The number of samples right of splitting point. """ - cdef int n_classes + cdef int n_outputs + cdef int* n_classes cdef int n_samples + + cdef int label_count_stride cdef int* label_count_left cdef int* label_count_right cdef int* label_count_init + cdef int n_left cdef int n_right - # need to store ref to arrays to prevent GC - cdef ndarray_label_count_left - cdef ndarray_label_count_right - cdef ndarray_label_count_init + def __init__(self, int n_outputs, object n_classes): + cdef int k = 0 + + self.n_outputs = n_outputs + self.n_classes = calloc(n_outputs, sizeof(int)) + cdef int label_count_stride = -1 - def __init__(self, int n_classes): - cdef np.ndarray[np.int32_t, ndim=1] ndarray_label_count_left \ - = np.zeros((n_classes,), dtype=np.int32, order='C') - cdef np.ndarray[np.int32_t, ndim=1] ndarray_label_count_right \ - = np.zeros((n_classes,), dtype=np.int32, order='C') - cdef np.ndarray[np.int32_t, ndim=1] ndarray_label_count_init \ - = np.zeros((n_classes,), dtype=np.int32, order='C') + for k from 0 <= k < n_outputs: + self.n_classes[k] = n_classes[k] + + if n_classes[k] > label_count_stride: + label_count_stride = n_classes[k] + + self.label_count_stride = label_count_stride + self.label_count_left = calloc(n_outputs * label_count_stride, sizeof(int)) + self.label_count_right = calloc(n_outputs * label_count_stride, sizeof(int)) + self.label_count_init = calloc(n_outputs * label_count_stride, sizeof(int)) - self.n_classes = n_classes self.n_samples = 0 self.n_left = 0 self.n_right = 0 - self.label_count_left = ndarray_label_count_left.data - self.label_count_right = ndarray_label_count_right.data - self.label_count_init = ndarray_label_count_init.data - self.ndarray_label_count_left = ndarray_label_count_left - self.ndarray_label_count_right = ndarray_label_count_right - self.ndarray_label_count_init = ndarray_label_count_init - - cdef void init(self, DTYPE_t *y, BOOL_t *sample_mask, int n_samples, - int n_total_samples): + + def __del__(self): + free(self.n_classes) + free(self.label_count_left) + free(self.label_count_right) + free(self.label_count_init) + + cdef void init(self, DTYPE_t* y, + int y_stride, + BOOL_t *sample_mask, + int n_samples, + int n_total_samples): """Initialise the criterion class.""" + cdef int n_outputs = self.n_outputs + cdef int* n_classes = self.n_classes + cdef int label_count_stride = self.label_count_stride + cdef int* label_count_init = self.label_count_init + + cdef int k = 0 cdef int c = 0 cdef int j = 0 self.n_samples = n_samples - for c from 0 <= c < self.n_classes: - self.label_count_init[c] = 0 + for k from 0 <= k < n_outputs: + for c from 0 <= c < n_classes[k]: + label_count_init[k * label_count_stride + c] = 0 for j from 0 <= j < n_total_samples: if sample_mask[j] == 0: continue - c = (y[j]) - self.label_count_init[c] += 1 + + for k from 0 <= k < n_outputs: + c = y[j * y_stride + k] + label_count_init[k * label_count_stride + c] += 1 self.reset() cdef void reset(self): """Reset label_counts by setting `label_count_left to zero and copying the init array into the right.""" + cdef int n_outputs = self.n_outputs + cdef int* n_classes = self.n_classes + cdef int label_count_stride = self.label_count_stride + cdef int* label_count_init = self.label_count_init + cdef int* label_count_left = self.label_count_left + cdef int* label_count_right = self.label_count_right + + cdef int k = 0 cdef int c = 0 self.n_left = 0 self.n_right = self.n_samples - for c from 0 <= c < self.n_classes: - self.label_count_left[c] = 0 - self.label_count_right[c] = self.label_count_init[c] - - cdef int update(self, int a, int b, DTYPE_t *y, int *X_argsorted_i, - BOOL_t *sample_mask): + for k from 0 <= k < n_outputs: + for c from 0 <= c < n_classes[k]: + label_count_left[k * label_count_stride + c] = 0 + label_count_right[k * label_count_stride + c] = label_count_init[k * label_count_stride + c] + + cdef int update(self, int a, + int b, + DTYPE_t* y, + int y_stride, + int* X_argsorted_i, + BOOL_t* sample_mask): """Update the criteria for each value in interval [a,b) (where a and b are indices in `X_argsorted_i`).""" - cdef int c + cdef int n_outputs = self.n_outputs + cdef int label_count_stride = self.label_count_stride + cdef int* label_count_left = self.label_count_left + cdef int* label_count_right = self.label_count_right + cdef int n_left = self.n_left + cdef int n_right = self.n_right + + cdef int idx, k, c, s + # post condition: all samples from [0:b) are on the left side for idx from a <= idx < b: s = X_argsorted_i[idx] + if sample_mask[s] == 0: continue - c = (y[s]) - self.label_count_right[c] -= 1 - self.label_count_left[c] += 1 - self.n_right -= 1 - self.n_left += 1 - return self.n_left + for k from 0 <= k < n_outputs: + c = y[s * y_stride + k] + label_count_right[k * label_count_stride + c] -= 1 + label_count_left[k * label_count_stride + c] += 1 + + n_left += 1 + n_right -=1 + + self.n_left = n_left + self.n_right = n_right + + return n_left cdef double eval(self): pass cpdef np.ndarray init_value(self): - return self.ndarray_label_count_init + cdef int n_outputs = self.n_outputs + cdef int* n_classes = self.n_classes + cdef int label_count_stride = self.label_count_stride + cdef int* label_count_init = self.label_count_init + cdef np.ndarray[DTYPE_t, ndim=2] value = np.zeros((n_outputs, label_count_stride), dtype=DTYPE) + + cdef int k, c + + for k from 0 <= k < n_outputs: + for c from 0 <= c < n_classes[k]: + value[k, c] = (label_count_init[k * label_count_stride + c]) + + return value cdef class Gini(ClassificationCriterion): """Gini Index splitting criteria. @@ -187,31 +261,46 @@ cdef class Gini(ClassificationCriterion): cdef double eval(self): """Returns Gini index of left branch + Gini index of right branch. """ + cdef int n_samples = self.n_samples + cdef int n_outputs = self.n_outputs + cdef int* n_classes = self.n_classes + cdef int label_count_stride = self.label_count_stride + cdef int* label_count_left = self.label_count_left + cdef int* label_count_right = self.label_count_right cdef double n_left = self.n_left cdef double n_right = self.n_right - cdef double H_left = n_left * n_left - cdef double H_right = n_right * n_right - cdef int k, count_left, count_right - for k from 0 <= k < self.n_classes: - count_left = self.label_count_left[k] - if count_left > 0: - H_left -= (count_left * count_left) - count_right = self.label_count_right[k] - if count_right > 0: - H_right -= (count_right * count_right) + cdef double total = 0.0 + cdef double H_left + cdef double H_right + cdef int k, c, count_left, count_right + + for k from 0 <= k < n_outputs: + H_left = n_left * n_left + H_right = n_right * n_right + + for c from 0 <= c < n_classes[k]: + count_left = label_count_left[k * label_count_stride + c] + if count_left > 0: + H_left -= (count_left * count_left) + + count_right = label_count_right[k * label_count_stride + c] + if count_right > 0: + H_right -= (count_right * count_right) + + if n_left == 0: + H_left = 0 + else: + H_left /= n_left - if n_left == 0: - H_left = 0 - else: - H_left /= n_left + if n_right == 0: + H_right = 0 + else: + H_right /= n_right - if n_right == 0: - H_right = 0 - else: - H_right /= n_right + total += (H_left + H_right) - return (H_left + H_right) / self.n_samples + return total / (n_samples * n_outputs) cdef class Entropy(ClassificationCriterion): @@ -222,24 +311,38 @@ cdef class Entropy(ClassificationCriterion): cdef double eval(self): """Returns Entropy of left branch + Entropy index of right branch. """ - cdef double H_left = 0.0 - cdef double H_right = 0.0 - cdef int k - cdef double e1, e2 + cdef int n_samples = self.n_samples + cdef int n_outputs = self.n_outputs + cdef int* n_classes = self.n_classes + cdef int label_count_stride = self.label_count_stride + cdef int* label_count_left = self.label_count_left + cdef int* label_count_right = self.label_count_right cdef double n_left = self.n_left cdef double n_right = self.n_right - for k from 0 <= k < self.n_classes: - if self.label_count_left[k] > 0: - H_left -= ((self.label_count_left[k] / n_left) - * log(self.label_count_left[k] / n_left)) - if self.label_count_right[k] > 0: - H_right -= ((self.label_count_right[k] / n_right) - * log(self.label_count_right[k] / n_right)) + cdef double total = 0.0 + cdef double H_left + cdef double H_right + cdef int k, c + cdef double e1, e2 + + for k from 0 <= k < n_outputs: + H_left = 0.0 + H_right = 0.0 + + for c from 0 <= c < n_classes[k]: + if label_count_left[k * label_count_stride + c] > 0: + H_left -= ((label_count_left[k * label_count_stride + c] / n_left) * log(label_count_left[k * label_count_stride + c] / n_left)) + + if self.label_count_right[k * label_count_stride + c] > 0: + H_right -= ((label_count_right[k * label_count_stride + c] / n_right) * log(label_count_right[k * label_count_stride + c] / n_right)) + + e1 = (n_left / n_samples) * H_left + e2 = (n_right / n_samples) * H_right - e1 = (n_left / self.n_samples) * H_left - e2 = (n_right / self.n_samples) * H_right - return e1 + e2 + total += e1 + e2 + + return total / n_outputs cdef class RegressionCriterion(Criterion): @@ -281,57 +384,95 @@ cdef class RegressionCriterion(Criterion): number of samples right of split point. """ + cdef int n_outputs cdef int n_samples + + cdef double* mean_left + cdef double* mean_right + cdef double* mean_init + cdef double* sq_sum_left + cdef double* sq_sum_right + cdef double* sq_sum_init + cdef double* var_left + cdef double* var_right + cdef int n_right cdef int n_left - cdef double mean_left - cdef double mean_right - cdef double mean_init + def __init__(self, int n_outputs): + cdef int k = 0 - cdef double sq_sum_right - cdef double sq_sum_left - cdef double sq_sum_init + self.n_outputs = n_outputs - cdef double var_left - cdef double var_right - - def __init__(self): self.n_samples = 0 self.n_left = 0 self.n_right = 0 - self.mean_left = 0.0 - self.mean_right = 0.0 - self.mean_init = 0.0 - self.sq_sum_right = 0.0 - self.sq_sum_left = 0.0 - self.sq_sum_init = 0.0 - self.var_left = 0.0 - self.var_right = 0.0 - - cdef void init(self, DTYPE_t *y, BOOL_t *sample_mask, int n_samples, - int n_total_samples): + + self.mean_left = calloc(n_outputs, sizeof(double)) + self.mean_right = calloc(n_outputs, sizeof(double)) + self.mean_init = calloc(n_outputs, sizeof(double)) + self.sq_sum_left = calloc(n_outputs, sizeof(double)) + self.sq_sum_right = calloc(n_outputs, sizeof(double)) + self.sq_sum_init = calloc(n_outputs, sizeof(double)) + self.var_left = calloc(n_outputs, sizeof(double)) + self.var_right = calloc(n_outputs, sizeof(double)) + + def __del__(self): + free(self.mean_left) + free(self.mean_right) + free(self.mean_init) + free(self.sq_sum_left) + free(self.sq_sum_right) + free(self.sq_sum_init) + free(self.var_left) + free(self.var_right) + + cdef void init(self, DTYPE_t* y, + int y_stride, + BOOL_t* sample_mask, + int n_samples, + int n_total_samples): """Initialise the criterion class; assume all samples are in the right branch and store the mean and squared sum in `self.mean_init` and `self.sq_sum_init`. """ - self.mean_left = 0.0 - self.mean_right = 0.0 - self.mean_init = 0.0 - self.sq_sum_right = 0.0 - self.sq_sum_left = 0.0 - self.sq_sum_init = 0.0 - self.var_left = 0.0 - self.var_right = 0.0 + cdef double* mean_left = self.mean_left + cdef double* mean_right = self.mean_right + cdef double* mean_init = self.mean_init + cdef double* sq_sum_left = self.sq_sum_left + cdef double* sq_sum_right = self.sq_sum_right + cdef double* sq_sum_init = self.sq_sum_init + cdef double* var_left = self.var_left + cdef double* var_right = self.var_right + cdef int n_outputs = self.n_outputs + + cdef int k = 0 + + for k from 0 <= k < n_outputs: + mean_left[k] = 0.0 + mean_right[k] = 0.0 + mean_init[k] = 0.0 + sq_sum_right[k] = 0.0 + sq_sum_left[k] = 0.0 + sq_sum_init[k] = 0.0 + var_left[k] = 0.0 + var_right[k] = 0.0 + self.n_samples = n_samples cdef int j = 0 + cdef DTYPE_t y_jk = 0.0 + for j from 0 <= j < n_total_samples: if sample_mask[j] == 0: continue - self.sq_sum_init += (y[j] * y[j]) - self.mean_init += y[j] - self.mean_init = self.mean_init / self.n_samples + for k from 0 <= k < n_outputs: + y_jk = y[j * y_stride + k] + sq_sum_init[k] += y_jk * y_jk + mean_init[k] += y_jk + + for k from 0 <= k < n_outputs: + mean_init[k] /= n_samples self.reset() @@ -342,53 +483,94 @@ cdef class RegressionCriterion(Criterion): whole dataset into the auxiliary variables of the right branch. """ + cdef double* mean_left = self.mean_left + cdef double* mean_right = self.mean_right + cdef double* mean_init = self.mean_init + cdef double* sq_sum_left = self.sq_sum_left + cdef double* sq_sum_right = self.sq_sum_right + cdef double* sq_sum_init = self.sq_sum_init + cdef double* var_left = self.var_left + cdef double* var_right = self.var_right + + cdef int n_samples = self.n_samples + cdef int n_outputs = self.n_outputs + + cdef int k = 0 + self.n_right = self.n_samples self.n_left = 0 - self.mean_right = self.mean_init - self.mean_left = 0.0 - self.sq_sum_right = self.sq_sum_init - self.sq_sum_left = 0.0 - self.var_left = 0.0 - self.var_right = self.sq_sum_right - \ - self.n_samples * (self.mean_right * self.mean_right) - - cdef int update(self, int a, int b, DTYPE_t *y, int *X_argsorted_i, - BOOL_t *sample_mask): + + for k from 0 <= k < n_outputs: + mean_right[k] = mean_init[k] + mean_left[k] = 0.0 + sq_sum_right[k] = sq_sum_init[k] + sq_sum_left[k] = 0.0 + var_left[k] = 0.0 + var_right[k] = sq_sum_right[k] - n_samples * (mean_right[k] * mean_right[k]) + + cdef int update(self, int a, + int b, + DTYPE_t* y, + int y_stride, + int* X_argsorted_i, + BOOL_t* sample_mask): """Update the criteria for each value in interval [a,b) (where a and b are indices in `X_argsorted_i`).""" + cdef double* mean_left = self.mean_left + cdef double* mean_right = self.mean_right + cdef double* sq_sum_left = self.sq_sum_left + cdef double* sq_sum_right = self.sq_sum_right + cdef double* var_left = self.var_left + cdef double* var_right = self.var_right + + cdef int n_samples = self.n_samples + cdef int n_outputs = self.n_outputs + cdef int n_left = self.n_left + cdef int n_right = self.n_right + cdef double y_idx = 0.0 - cdef int idx, j + cdef int idx, j, k + # post condition: all samples from [0:b) are on the left side for idx from a <= idx < b: j = X_argsorted_i[idx] + if sample_mask[j] == 0: continue - y_idx = y[j] - self.sq_sum_left = self.sq_sum_left + (y_idx * y_idx) - self.sq_sum_right = self.sq_sum_right - (y_idx * y_idx) - self.mean_left = (self.n_left * self.mean_left + y_idx) / \ - (self.n_left + 1) - self.mean_right = ((self.n_samples - self.n_left) * \ - self.mean_right - y_idx) / \ - (self.n_samples - self.n_left - 1) + for k from 0 <= k < n_outputs: + y_idx = y[j * y_stride + k] + sq_sum_left[k] += (y_idx * y_idx) + sq_sum_right[k] -= (y_idx * y_idx) - self.n_right -= 1 - self.n_left += 1 + mean_left[k] = (n_left * mean_left[k] + y_idx) / (n_left + 1) + mean_right[k] = ((n_samples - n_left) * mean_right[k] - y_idx) / (n_samples - n_left - 1) - self.var_left = self.sq_sum_left - \ - self.n_left * (self.mean_left * self.mean_left) - self.var_right = self.sq_sum_right - \ - self.n_right * (self.mean_right * self.mean_right) + n_left += 1 + self.n_left = n_left + n_right -= 1 + self.n_right = n_right - return self.n_left + for k from 0 <= k < n_outputs: + var_left[k] = sq_sum_left[k] - n_left * (mean_left[k] * mean_left[k]) + var_right[k] = sq_sum_right[k] - n_right * (mean_right[k] * mean_right[k]) + + return n_left cdef double eval(self): pass cpdef np.ndarray init_value(self): - ## TODO is calling np.asarray a performance issue? - return np.asarray(self.mean_init) + cdef int n_outputs = self.n_outputs + cdef double* mean_init = self.mean_init + + cdef np.ndarray[DTYPE_t, ndim=2] value = np.zeros((n_outputs, 1), dtype=DTYPE) + cdef int k + + for k from 0 <= k < n_outputs: + value[k, 0] = (mean_init[k]) + + return value cdef class MSE(RegressionCriterion): @@ -398,7 +580,20 @@ cdef class MSE(RegressionCriterion): """ cdef double eval(self): - return self.var_left + self.var_right + cdef double* var_left = self.var_left + cdef double* var_right = self.var_right + + cdef int n_outputs = self.n_outputs + + cdef int k + cdef double total = 0.0 + + for k from 0 <= k < n_outputs: + total += var_left[k] + total += var_right[k] + + return total / n_outputs + ################################################################################ @@ -431,7 +626,7 @@ def _random_sample_mask(int n_total_samples, int n_total_in_bag, random_state): cdef int n_bagged = 0 cdef int i = 0 - for i in range(n_total_samples): + for i from 0 <= i < n_total_samples: if rand[i] * (n_total_samples - i) < (n_total_in_bag - n_bagged): sample_mask[i] = 1 n_bagged += 1 @@ -449,7 +644,7 @@ def _apply_tree(np.ndarray[DTYPE_t, ndim=2] X, cdef int i = 0 cdef int n = X.shape[0] cdef int node_id = 0 - for i in xrange(n): + for i from 0 <= i < n: node_id = 0 # While node_id not a leaf while children[node_id, 0] != -1 and children[node_id, 1] != -1: @@ -464,14 +659,16 @@ def _predict_tree(np.ndarray[DTYPE_t, ndim=2] X, np.ndarray[np.int32_t, ndim=2] children, np.ndarray[np.int32_t, ndim=1] feature, np.ndarray[np.float64_t, ndim=1] threshold, - np.ndarray[np.float64_t, ndim=2] values, - np.ndarray[np.float64_t, ndim=2] pred): + np.ndarray[np.float64_t, ndim=3] values, + np.ndarray[np.float64_t, ndim=3] pred): """Finds the terminal region (=leaf node) values for each sample. """ - cdef int i = 0 + cdef int i, k, c cdef int n = X.shape[0] cdef int node_id = 0 - cdef int K = values.shape[1] - for i in xrange(n): + cdef int n_outputs = values.shape[1] + cdef int n_classes = values.shape[2] + + for i from 0 <= i < n: node_id = 0 # While node_id not a leaf while children[node_id, 0] != -1 and children[node_id, 1] != -1: @@ -479,19 +676,25 @@ def _predict_tree(np.ndarray[DTYPE_t, ndim=2] X, node_id = children[node_id, 0] else: node_id = children[node_id, 1] - for k in xrange(K): - pred[i, k] = values[node_id, k] + + for k from 0 <= k < n_outputs: + for c from 0 <= c < n_classes: + pred[i, k, c] = values[node_id, k, c] -def _error_at_leaf(np.ndarray[DTYPE_t, ndim=1, mode="c"] y, - np.ndarray sample_mask, Criterion criterion, +def _error_at_leaf(np.ndarray[DTYPE_t, ndim=2, mode="c"] y, + np.ndarray sample_mask, + Criterion criterion, int n_samples): """Compute criterion error at leaf with terminal region defined by `sample_mask`. """ + cdef DTYPE_t* y_ptr = y.data + cdef int y_stride = y.strides[0] / y.strides[1] cdef int n_total_samples = y.shape[0] - cdef DTYPE_t *y_ptr = y.data cdef BOOL_t *sample_mask_ptr = sample_mask.data - criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) + + criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) + return criterion.eval() @@ -531,7 +734,7 @@ cdef int smallest_sample_larger_than(int sample_idx, DTYPE_t *X_i, def _find_best_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, - np.ndarray[DTYPE_t, ndim=1, mode="c"] y, + np.ndarray[DTYPE_t, ndim=2, mode="c"] y, np.ndarray[np.int32_t, ndim=2, mode="fortran"] X_argsorted, np.ndarray sample_mask, int n_samples, @@ -595,15 +798,16 @@ def _find_best_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, cdef np.int32_t feature_idx = -1 cdef int n_left = 0 cdef DTYPE_t t, initial_error, error - cdef DTYPE_t best_error = np.inf, best_t = np.inf - cdef DTYPE_t *y_ptr = y.data - cdef DTYPE_t *X_i = NULL - cdef int *X_argsorted_i = NULL - cdef BOOL_t *sample_mask_ptr = sample_mask.data - cdef np.ndarray[np.int32_t, ndim=1, mode='c'] features = None + cdef DTYPE_t best_error = INFINITY, best_t = INFINITY + cdef DTYPE_t* X_i = NULL + cdef int* X_argsorted_i = NULL + cdef DTYPE_t* y_ptr = y.data + cdef BOOL_t* sample_mask_ptr = sample_mask.data + cdef np.ndarray[np.int32_t, ndim=1, mode="c"] features = None # Compute the column strides (increment in pointer elements to get # from column i to i + 1) for `X` and `X_argsorted` + cdef int y_stride = y.strides[0] / y.strides[1] cdef int X_elem_stride = X.strides[0] cdef int X_col_stride = X.strides[1] cdef int X_stride = X_col_stride / X_elem_stride @@ -612,8 +816,8 @@ def _find_best_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, cdef int X_argsorted_stride = X_argsorted_col_stride / X_argsorted_elem_stride # Compute the initial criterion value in the node - X_argsorted_i = X_argsorted.data - criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) + X_argsorted_i = X_argsorted.data + criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) initial_error = criterion.eval() if initial_error == 0: # break early if the node is pure @@ -629,11 +833,11 @@ def _find_best_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, features = random_state.permutation(features)[:max_features] # Look for the best split - for feature_idx in range(max_features): + for feature_idx from 0 <= feature_idx < max_features: i = features[feature_idx] # Get i-th col of X and X_sorted - X_i = (X.data) + X_stride * i - X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i + X_i = (X.data) + X_stride * i + X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i # Reset the criterion for this feature criterion.reset() @@ -652,7 +856,7 @@ def _find_best_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, break # Better split than the best so far? - n_left = criterion.update(a, b, y_ptr, X_argsorted_i, sample_mask_ptr) + n_left = criterion.update(a, b, y_ptr, y_stride, X_argsorted_i, sample_mask_ptr) # Only consider splits that respect min_leaf if n_left < min_leaf or (n_samples - n_left) < min_leaf: @@ -676,7 +880,7 @@ def _find_best_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, return best_i, best_t, best_error, initial_error def _find_best_random_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, - np.ndarray[DTYPE_t, ndim=1, mode="c"] y, + np.ndarray[DTYPE_t, ndim=2, mode="c"] y, np.ndarray[np.int32_t, ndim=2, mode="fortran"] X_argsorted, np.ndarray sample_mask, int n_samples, @@ -739,15 +943,16 @@ def _find_best_random_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, cdef int i, a, b, c, n_left, best_i = -1 cdef np.int32_t feature_idx = -1 cdef DTYPE_t t, initial_error, error - cdef DTYPE_t best_error = np.inf, best_t = np.inf - cdef DTYPE_t *y_ptr = y.data - cdef DTYPE_t *X_i = NULL - cdef int *X_argsorted_i = NULL - cdef BOOL_t *sample_mask_ptr = sample_mask.data - cdef np.ndarray[np.int32_t, ndim=1, mode='c'] features = None + cdef DTYPE_t best_error = INFINITY, best_t = INFINITY + cdef DTYPE_t* X_i = NULL + cdef int* X_argsorted_i = NULL + cdef DTYPE_t* y_ptr = y.data + cdef BOOL_t* sample_mask_ptr = sample_mask.data + cdef np.ndarray[np.int32_t, ndim=1, mode="c"] features = None # Compute the column strides (increment in pointer elements to get # from column i to i + 1) for `X` and `X_argsorted` + cdef int y_stride = y.strides[0] / y.strides[1] cdef int X_elem_stride = X.strides[0] cdef int X_col_stride = X.strides[1] cdef int X_stride = X_col_stride / X_elem_stride @@ -756,8 +961,8 @@ def _find_best_random_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, cdef int X_argsorted_stride = X_argsorted_col_stride / X_argsorted_elem_stride # Compute the initial criterion value - X_argsorted_i = X_argsorted.data - criterion.init(y_ptr, sample_mask_ptr, n_samples, n_total_samples) + X_argsorted_i = X_argsorted.data + criterion.init(y_ptr, y_stride, sample_mask_ptr, n_samples, n_total_samples) initial_error = criterion.eval() if initial_error == 0: # break early if the node is pure @@ -773,11 +978,11 @@ def _find_best_random_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, features = random_state.permutation(features)[:max_features] # Look for the best random split - for feature_idx in range(max_features): + for feature_idx from 0 <= feature_idx < max_features: i = features[feature_idx] # Get i-th col of X and X_sorted - X_i = (X.data) + X_stride * i - X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i + X_i = (X.data) + X_stride * i + X_argsorted_i = (X_argsorted.data) + X_argsorted_stride * i # Reset the criterion for this feature criterion.reset() @@ -811,7 +1016,7 @@ def _find_best_random_split(np.ndarray[DTYPE_t, ndim=2, mode="fortran"] X, c += 1 # Better than the best so far? - n_left = criterion.update(0, c, y_ptr, X_argsorted_i, sample_mask_ptr) + n_left = criterion.update(0, c, y_ptr, y_stride, X_argsorted_i, sample_mask_ptr) error = criterion.eval() if n_left < min_leaf or (n_samples - n_left) < min_leaf: diff --git a/sklearn/tree/tests/test_tree.py b/sklearn/tree/tests/test_tree.py index 14fe00fb3ee39..8092b4b342127 100644 --- a/sklearn/tree/tests/test_tree.py +++ b/sklearn/tree/tests/test_tree.py @@ -348,6 +348,61 @@ def test_pickle(): " after pickling (regression) " +def test_multioutput(): + """Check estimators on multi-output problems.""" + + X = [[-2, -1], + [-1, -1], + [-1, -2], + [1, 1], + [1, 2], + [2, 1], + [-2, 1], + [-1, 1], + [-1, 2], + [2, -1], + [1, -1], + [1, -2]] + + y = [[-1, 0], + [-1, 0], + [-1, 0], + [1, 1], + [1, 1], + [1, 1], + [-1, 2], + [-1, 2], + [-1, 2], + [1, 3], + [1, 3], + [1, 3]] + + T = [[-1, -1], [1, 1], [-1, 1], [1, -1]] + y_true = [[-1, 0], [1, 1], [-1, 2], [1, 3]] + + # toy classification problem + clf = tree.DecisionTreeClassifier() + y_hat = clf.fit(X, y).predict(T) + assert_array_equal(y_hat, y_true) + assert_equal(y_hat.shape, (4, 2)) + + proba = clf.predict_proba(T) + assert_equal(len(proba), 2) + assert_equal(proba[0].shape, (4, 2)) + assert_equal(proba[1].shape, (4, 4)) + + log_proba = clf.predict_log_proba(T) + assert_equal(len(log_proba), 2) + assert_equal(log_proba[0].shape, (4, 2)) + assert_equal(log_proba[1].shape, (4, 4)) + + # toy regression problem + clf = tree.DecisionTreeRegressor() + y_hat = clf.fit(X, y).predict(T) + assert_almost_equal(y_hat, y_true) + assert_equal(y_hat.shape, (4, 2)) + + if __name__ == "__main__": import nose nose.runmodule() diff --git a/sklearn/tree/tree.py b/sklearn/tree/tree.py index 675c4d309ae0d..310b6f6ff68f4 100644 --- a/sklearn/tree/tree.py +++ b/sklearn/tree/tree.py @@ -1,6 +1,6 @@ """ This module gathers tree-based methods, including decision, regression and -randomized trees. +randomized trees. Single and multi-output problems are both handled. """ # Code is originally adapted from MILK: Machine Learning Toolkit @@ -20,6 +20,8 @@ from . import _tree +import sys + __all__ = ["DecisionTreeClassifier", "DecisionTreeRegressor", "ExtraTreeClassifier", @@ -82,15 +84,23 @@ def node_to_str(tree, node_id): feature = feature_names[tree.feature[node_id]] else: feature = "X[%s]" % tree.feature[node_id] + + value = tree.value[node_id] + if tree.n_outputs == 1: + value = value[0, :] + if tree.children[node_id, 0] == Tree.LEAF: return "error = %.4f\\nsamples = %s\\nvalue = %s" \ - % (tree.init_error[node_id], tree.n_samples[node_id], - tree.value[node_id]) - - return "%s <= %.4f\\nerror = %s\\nsamples = %s\\nvalue = %s" \ - % (feature, tree.threshold[node_id], - tree.init_error[node_id], tree.n_samples[node_id], - tree.value[node_id]) + % (tree.init_error[node_id], + tree.n_samples[node_id], + value) + else: + return "%s <= %.4f\\nerror = %s\\nsamples = %s\\nvalue = %s" \ + % (feature, + tree.threshold[node_id], + tree.init_error[node_id], + tree.n_samples[node_id], + value) def recurse(tree, node_id, parent=None): if node_id == Tree.LEAF: @@ -145,9 +155,9 @@ class Tree(object): The feature to split on (only for internal nodes). threshold : np.ndarray of float64 - The threshold of each node (only for leaves). + The threshold of each node (only for internal nodes). - value : np.ndarray of float64, shape=(capacity, n_classes) + value : np.ndarray of float64, shape=(capacity, n_outputs, n_classes) Contains the constant prediction value of each node. best_error : np.ndarray of float64 @@ -165,9 +175,10 @@ class Tree(object): LEAF = -1 UNDEFINED = -2 - def __init__(self, n_classes, n_features, capacity=3): + def __init__(self, n_classes, n_features, n_outputs, capacity=3): self.n_classes = n_classes self.n_features = n_features + self.n_outputs = n_outputs self.node_count = 0 @@ -178,7 +189,8 @@ def __init__(self, n_classes, n_features, capacity=3): self.feature.fill(Tree.UNDEFINED) self.threshold = np.empty((capacity,), dtype=np.float64) - self.value = np.empty((capacity, n_classes), dtype=np.float64) + self.value = np.empty((capacity, n_outputs, np.max(n_classes)), + dtype=np.float64) self.best_error = np.empty((capacity,), dtype=np.float32) self.init_error = np.empty((capacity,), dtype=np.float32) @@ -195,7 +207,8 @@ def _resize(self, capacity=None): self.children.resize((capacity, 2), refcheck=False) self.feature.resize((capacity,), refcheck=False) self.threshold.resize((capacity,), refcheck=False) - self.value.resize((capacity, self.value.shape[1]), refcheck=False) + self.value.resize((capacity, self.value.shape[1], self.value.shape[2]), + refcheck=False) self.best_error.resize((capacity,), refcheck=False) self.init_error.resize((capacity,), refcheck=False) self.n_samples.resize((capacity,), refcheck=False) @@ -218,6 +231,7 @@ def _add_split_node(self, parent, is_left_child, feature, threshold, self.init_error[node_id] = init_error self.best_error[node_id] = best_error self.n_samples[node_id] = n_samples + self.value[node_id] = value # set as left or right child of parent @@ -228,6 +242,7 @@ def _add_split_node(self, parent, is_left_child, feature, threshold, self.children[parent, 1] = node_id self.node_count += 1 + return node_id def _add_leaf(self, parent, is_left_child, value, error, n_samples): @@ -248,8 +263,8 @@ def _add_leaf(self, parent, is_left_child, value, error, n_samples): self.children[parent, 1] = node_id self.children[node_id, :] = Tree.LEAF - self.node_count += 1 + return node_id def build(self, X, y, criterion, max_depth, min_samples_split, @@ -315,10 +330,10 @@ def recursive_partition(X, X_argsorted, y, sample_mask, depth, # Setup auxiliary data structures and check input before # recursive partitioning if X.dtype != DTYPE or not np.isfortran(X): - X = np.asanyarray(X, dtype=DTYPE, order="F") + X = np.asarray(X, dtype=DTYPE, order="F") if y.dtype != DTYPE or not y.flags.contiguous: - y = np.ascontiguousarray(y, dtype=DTYPE) + y = np.asarray(y, dtype=DTYPE, order="C") if sample_mask is None: sample_mask = np.ones((X.shape[0],), dtype=np.bool) @@ -346,7 +361,8 @@ def recursive_partition(X, X_argsorted, y, sample_mask, depth, return self def predict(self, X): - out = np.empty((X.shape[0], self.value.shape[1]), dtype=np.float64) + out = np.empty((X.shape[0], self.value.shape[1], self.value.shape[2]), + dtype=np.float64) _tree._predict_tree(X, self.children, @@ -430,6 +446,7 @@ def __init__(self, criterion, self.random_state = check_random_state(random_state) self.n_features_ = None + self.n_outputs_ = None self.classes_ = None self.n_classes_ = None self.find_split_ = _tree._find_best_split @@ -445,7 +462,7 @@ def fit(self, X, y, sample_mask=None, X_argsorted=None): X : array-like of shape = [n_samples, n_features] The training input samples. - y : array-like, shape = [n_samples] + y : array-like, shape = [n_samples] or [n_samples, n_outputs] The target values (integers that correspond to classes in classification, real numbers in regression). @@ -455,27 +472,42 @@ def fit(self, X, y, sample_mask=None, X_argsorted=None): Returns self. """ # set min_samples_split sensibly - self.min_samples_split = max(self.min_samples_split, 2 * - self.min_samples_leaf) + self.min_samples_split = max(self.min_samples_split, + 2 * self.min_samples_leaf) # Convert data - X = np.asarray(X, dtype=DTYPE, order='F') + X = np.asarray(X, dtype=DTYPE, order="F") n_samples, self.n_features_ = X.shape is_classification = isinstance(self, ClassifierMixin) + y = np.copy(y) + y = np.atleast_1d(y) + if y.ndim == 1: + y = y[:, np.newaxis] + + self.classes_ = [] + self.n_classes_ = [] + self.n_outputs_ = y.shape[1] + if is_classification: - self.classes_ = np.unique(y) - self.n_classes_ = self.classes_.shape[0] - criterion = CLASSIFICATION[self.criterion](self.n_classes_) - y = np.searchsorted(self.classes_, y) + for k in xrange(self.n_outputs_): + unique = np.unique(y[:, k]) + self.classes_.append(unique) + self.n_classes_.append(unique.shape[0]) + y[:, k] = np.searchsorted(unique, y[:, k]) else: - self.classes_ = None - self.n_classes_ = 1 - criterion = REGRESSION[self.criterion]() + self.classes_ = [None] * self.n_outputs_ + self.n_classes_ = [1] * self.n_outputs_ + + y = np.asarray(y, dtype=DTYPE, order="C") - y = np.ascontiguousarray(y, dtype=DTYPE) + if is_classification: + criterion = CLASSIFICATION[self.criterion](self.n_outputs_, + self.n_classes_) + else: + criterion = REGRESSION[self.criterion](self.n_outputs_) # Check parameters max_depth = np.inf if self.max_depth is None else self.max_depth @@ -484,24 +516,18 @@ def fit(self, X, y, sample_mask=None, X_argsorted=None): if self.max_features == "auto": if is_classification: max_features = max(1, int(np.sqrt(self.n_features_))) - else: max_features = self.n_features_ - elif self.max_features == "sqrt": max_features = max(1, int(np.sqrt(self.n_features_))) - elif self.max_features == "log2": max_features = max(1, int(np.log2(self.n_features_))) - else: raise ValueError( 'Invalid value for max_features. Allowed string ' 'values are "auto", "sqrt" or "log2".') - elif self.max_features is None: max_features = self.n_features_ - else: max_features = self.max_features @@ -520,7 +546,7 @@ def fit(self, X, y, sample_mask=None, X_argsorted=None): raise ValueError("max_features must be in (0, n_features]") # Build tree - self.tree_ = Tree(self.n_classes_, self.n_features_) + self.tree_ = Tree(self.n_classes_, self.n_features_, self.n_outputs_) self.tree_.build(X, y, criterion, max_depth, self.min_samples_split, self.min_samples_leaf, self.min_density, max_features, self.random_state, @@ -547,7 +573,7 @@ def predict(self, X): Returns ------- - y : array of shape = [n_samples] + y : array of shape = [n_samples] or [n_samples, n_outputs] The predicted classes, or the predict values. """ X = array2d(X, dtype=DTYPE) @@ -562,11 +588,20 @@ def predict(self, X): " input n_features is %s " % (self.n_features_, n_features)) + P = self.tree_.predict(X) + if isinstance(self, ClassifierMixin): - predictions = self.classes_.take(np.argmax( - self.tree_.predict(X), axis=1), axis=0) + predictions = np.zeros((n_samples, self.n_outputs_)) + + for k in xrange(self.n_outputs_): + predictions[:, k] = self.classes_[k].take(np.argmax(P[:, k], + axis=1), + axis=0) else: - predictions = self.tree_.predict(X).ravel() + predictions = P[:, :, 0] + + if self.n_outputs_ == 1: + predictions = predictions.reshape((n_samples, )) return predictions @@ -691,7 +726,8 @@ def predict_proba(self, X): Returns ------- - p : array of shape = [n_samples, n_classes] + p : array of shape = [n_samples, n_classes], or a list of n_outputs + such arrays if n_outputs > 1. The class probabilities of the input samples. Classes are ordered by arithmetical order. """ @@ -707,11 +743,21 @@ def predict_proba(self, X): " input n_features is %s " % (self.n_features_, n_features)) + proba = [] P = self.tree_.predict(X) - normalizer = P.sum(axis=1)[:, np.newaxis] - normalizer[normalizer == 0.0] = 1.0 - P /= normalizer - return P + + for k in xrange(self.n_outputs_): + P_k = P[:, k, :self.n_classes_[k]] + normalizer = P_k.sum(axis=1)[:, np.newaxis] + normalizer[normalizer == 0.0] = 1.0 + P_k /= normalizer + proba.append(P_k) + + if self.n_outputs_ == 1: + return proba[0] + + else: + return proba def predict_log_proba(self, X): """Predict class log-probabilities of the input samples X. @@ -723,11 +769,21 @@ def predict_log_proba(self, X): Returns ------- - p : array of shape = [n_samples, n_classes] + p : array of shape = [n_samples, n_classes], or a list of n_outputs + such arrays if n_outputs > 1. The class log-probabilities of the input samples. Classes are ordered by arithmetical order. """ - return np.log(self.predict_proba(X)) + proba = self.predict_proba(X) + + if self.n_outputs_ == 1: + return np.log(proba) + + else: + for k in xrange(self.n_outputs_): + proba[k] = np.log(proba[k]) + + return proba class DecisionTreeRegressor(BaseDecisionTree, RegressorMixin):