Skip to content

Commit 872a084

Browse files
authored
FIX error when deserialzing a Tree instance from a read only buffer (scikit-learn#25585)
1 parent 4810fab commit 872a084

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

sklearn/tree/_tree.pyx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -708,11 +708,9 @@ cdef class Tree:
708708
if self._resize_c(self.capacity) != 0:
709709
raise MemoryError("resizing tree to %d" % self.capacity)
710710

711-
cdef Node[::1] node_memory_view = node_ndarray
712-
cdef DOUBLE_t[:, :, ::1] value_memory_view = value_ndarray
713-
nodes = memcpy(self.nodes, &node_memory_view[0],
711+
nodes = memcpy(self.nodes, cnp.PyArray_DATA(node_ndarray),
714712
self.capacity * sizeof(Node))
715-
value = memcpy(self.value, &value_memory_view[0, 0, 0],
713+
value = memcpy(self.value, cnp.PyArray_DATA(value_ndarray),
716714
self.capacity * self.value_stride * sizeof(double))
717715

718716
cdef int _resize(self, SIZE_t capacity) nogil except -1:

sklearn/tree/tests/test_tree.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2406,3 +2406,22 @@ def test_splitter_serializable(Splitter):
24062406
splitter_back = pickle.loads(splitter_serialize)
24072407
assert splitter_back.max_features == max_features
24082408
assert isinstance(splitter_back, Splitter)
2409+
2410+
2411+
def test_tree_deserialization_from_read_only_buffer(tmpdir):
2412+
"""Check that Trees can be deserialized with read only buffers.
2413+
2414+
Non-regression test for gh-25584.
2415+
"""
2416+
pickle_path = str(tmpdir.join("clf.joblib"))
2417+
clf = DecisionTreeClassifier(random_state=0)
2418+
clf.fit(X_small, y_small)
2419+
2420+
joblib.dump(clf, pickle_path)
2421+
loaded_clf = joblib.load(pickle_path, mmap_mode="r")
2422+
2423+
assert_tree_equal(
2424+
loaded_clf.tree_,
2425+
clf.tree_,
2426+
"The trees of the original and loaded classifiers are not equal.",
2427+
)

0 commit comments

Comments
 (0)