Skip to content

Commit 89d3cc9

Browse files
authored
Merge pull request #3547 from PrimozGodec/fix-neighbour-chrashes
[FIX] Neighbours: Show error when data and reference have different domain.
2 parents 42ea260 + 8603572 commit 89d3cc9

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

Orange/widgets/data/owneighbors.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ class Warning(OWWidget.Warning):
4343
all_data_as_reference = \
4444
Msg("Every data instance is same as some reference")
4545

46+
class Error(OWWidget.Error):
47+
diff_domains = Msg("Data and reference have different domains.")
48+
4649
n_neighbors = Setting(10)
4750
distance_index = Setting(0)
4851
exclude_reference = Setting(True)
@@ -107,10 +110,16 @@ def recompute(self):
107110
self.apply()
108111

109112
def compute_distances(self):
113+
self.Error.diff_domains.clear()
110114
if self.data is None or len(self.data) == 0 \
111115
or self.reference is None or len(self.reference) == 0:
112116
self.distances = None
113117
return
118+
if self.reference.domain != self.data.domain:
119+
self.Error.diff_domains()
120+
self.distances = None
121+
return
122+
114123
distance = METRICS[self.distance_index][1]
115124
n_ref = len(self.reference)
116125
all_data = Table.concatenate([self.reference, self.data], 0)

Orange/widgets/data/tests/test_owneighbors.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import numpy as np
66

7-
from Orange.data import Table, Domain
7+
from Orange.data import Table, Domain, ContinuousVariable
88
from Orange.widgets.data.owneighbors import OWNeighbors, METRICS
99
from Orange.widgets.tests.base import WidgetTest, ParameterMapping
1010

@@ -343,6 +343,59 @@ def test_all_equal_ref(self):
343343
self.assertFalse(widget.Warning.all_data_as_reference.is_shown())
344344
self.assertIsNotNone(self.get_output(widget.Outputs.data))
345345

346+
def test_different_domains(self):
347+
"""
348+
Test weather widget show error when data and a reference have different
349+
domains.
350+
"""
351+
w = self.widget
352+
353+
domain = Domain([ContinuousVariable("a")])
354+
domain_ref = Domain([ContinuousVariable("b")])
355+
data = Table(domain, np.random.rand(2, len(domain)))
356+
reference = Table(
357+
domain_ref, np.random.rand(1, len(domain_ref)))
358+
359+
# no error if one or both of the signals is missing
360+
self.send_signal(w.Inputs.data, data)
361+
self.assertFalse(w.Error.diff_domains.is_shown())
362+
363+
self.send_signal(w.Inputs.data, None)
364+
self.assertFalse(w.Error.diff_domains.is_shown())
365+
366+
self.send_signal(w.Inputs.reference, data[:1])
367+
self.assertFalse(w.Error.diff_domains.is_shown())
368+
369+
# same domain - no error
370+
self.send_signal(w.Inputs.data, data)
371+
self.send_signal(w.Inputs.reference, data[:1])
372+
self.assertFalse(w.Error.diff_domains.is_shown())
373+
374+
# one attribute different attribute name
375+
self.send_signal(w.Inputs.data, data)
376+
self.send_signal(w.Inputs.reference, reference)
377+
self.assertTrue(w.Error.diff_domains.is_shown())
378+
379+
# different number of attributes
380+
domain_ref = Domain([ContinuousVariable("a"), ContinuousVariable("b")])
381+
reference = Table(domain_ref, np.random.rand(1, len(domain_ref)))
382+
383+
# error disappears when data is set to None
384+
self.send_signal(w.Inputs.data, data)
385+
self.send_signal(w.Inputs.reference, reference)
386+
self.assertTrue(w.Error.diff_domains.is_shown())
387+
388+
self.send_signal(w.Inputs.data, None)
389+
self.assertFalse(w.Error.diff_domains.is_shown())
390+
391+
# error disappears when reference is set to None
392+
self.send_signal(w.Inputs.data, data)
393+
self.send_signal(w.Inputs.reference, reference)
394+
self.assertTrue(w.Error.diff_domains.is_shown())
395+
396+
self.send_signal(w.Inputs.reference, None)
397+
self.assertFalse(w.Error.diff_domains.is_shown())
398+
346399

347400
if __name__ == "__main__":
348401
unittest.main()

0 commit comments

Comments
 (0)