Skip to content

Commit d2dec6e

Browse files
authored
Merge pull request #2374 from jerneju/memory-outliers
[FIX] Outliers: handling memory error
2 parents 1dfb316 + 67f6195 commit d2dec6e

File tree

2 files changed

+39
-15
lines changed

2 files changed

+39
-15
lines changed

Orange/widgets/data/owoutliers.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class OWOutliers(widget.OWWidget):
4040
class Error(widget.OWWidget.Error):
4141
singular_cov = Msg("Singular covariance matrix.")
4242
multiclass_error = Msg("Multiple class data is not supported")
43+
memory_error = Msg("Not enough memory")
4344

4445
def __init__(self):
4546
super().__init__()
@@ -137,6 +138,28 @@ def set_data(self, dataset):
137138

138139
self.commit()
139140

141+
def _get_outliers(self):
142+
try:
143+
y_pred = self.detect_outliers()
144+
except ValueError:
145+
self.Error.singular_cov()
146+
self.in_out_info_label.setText(self.in_out_info_default)
147+
except MemoryError:
148+
self.Error.memory_error()
149+
return None, None
150+
else:
151+
inliers_ind = np.where(y_pred == 1)[0]
152+
outliers_ind = np.where(y_pred == -1)[0]
153+
inliers = self.new_data[inliers_ind]
154+
outliers = self.new_data[outliers_ind]
155+
self.in_out_info_label.setText(
156+
"{} inliers, {} outliers".format(len(inliers),
157+
len(outliers)))
158+
self.n_inliers = len(inliers)
159+
self.n_outliers = len(outliers)
160+
161+
return inliers, outliers
162+
140163
def commit(self):
141164
self.clear_messages()
142165
inliers = outliers = None
@@ -145,21 +168,7 @@ def commit(self):
145168
if self.data.Y.ndim > 1:
146169
self.Error.multiclass_error()
147170
else:
148-
try:
149-
y_pred = self.detect_outliers()
150-
except ValueError:
151-
self.Error.singular_cov()
152-
self.in_out_info_label.setText(self.in_out_info_default)
153-
else:
154-
inliers_ind = np.where(y_pred == 1)[0]
155-
outliers_ind = np.where(y_pred == -1)[0]
156-
inliers = self.new_data[inliers_ind]
157-
outliers = self.new_data[outliers_ind]
158-
self.in_out_info_label.setText(
159-
"{} inliers, {} outliers".format(len(inliers),
160-
len(outliers)))
161-
self.n_inliers = len(inliers)
162-
self.n_outliers = len(outliers)
171+
inliers, outliers = self._get_outliers()
163172

164173
self.send("Inliers", inliers)
165174
self.send("Outliers", outliers)

Orange/widgets/data/tests/test_owoutliers.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Test methods with long descriptive names can omit docstrings
22
# pylint: disable=missing-docstring
33

4+
import unittest
5+
46
import numpy as np
57

68
from Orange.data import Table, Domain, ContinuousVariable, DiscreteVariable
@@ -36,3 +38,16 @@ def test_multiclass(self):
3638
self.assertTrue(self.widget.Error.multiclass_error.is_shown())
3739
self.send_signal("Data", None)
3840
self.assertFalse(self.widget.Error.multiclass_error.is_shown())
41+
42+
def test_memory_error(self):
43+
"""
44+
Handling memory error.
45+
GH-2374
46+
"""
47+
data = Table("iris")[::3]
48+
self.assertFalse(self.widget.Error.memory_error.is_shown())
49+
with unittest.mock.patch(
50+
"Orange.widgets.data.owoutliers.OWOutliers.detect_outliers",
51+
side_effect=MemoryError):
52+
self.send_signal("Data", data)
53+
self.assertTrue(self.widget.Error.memory_error.is_shown())

0 commit comments

Comments
 (0)