Skip to content

Commit 539832d

Browse files
committed
Fix: Neighbours: Error when data and reference have different domain.
1 parent 42ea260 commit 539832d

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-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: 32 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,37 @@ 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+
# same domain - no error
360+
self.send_signal(w.Inputs.data, data)
361+
self.send_signal(w.Inputs.reference, data[:1])
362+
self.assertFalse(w.Error.diff_domains.is_shown())
363+
364+
# one attribute different attribute name
365+
self.send_signal(w.Inputs.data, data)
366+
self.send_signal(w.Inputs.reference, reference)
367+
self.assertTrue(w.Error.diff_domains.is_shown())
368+
369+
# different number of attributes
370+
domain_ref = Domain([ContinuousVariable("a"), ContinuousVariable("b")])
371+
reference = Table(domain_ref, np.random.rand(1, len(domain_ref)))
372+
373+
self.send_signal(w.Inputs.data, data)
374+
self.send_signal(w.Inputs.reference, reference)
375+
self.assertTrue(w.Error.diff_domains.is_shown())
376+
346377

347378
if __name__ == "__main__":
348379
unittest.main()

0 commit comments

Comments
 (0)