Skip to content

Commit 510901e

Browse files
committed
[FIX] Hierarchical Clustering: infinite distances
1 parent 60ca105 commit 510901e

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

Orange/widgets/unsupervised/owhierarchicalclustering.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
from Orange.widgets.utils import colorpalette, itemmodels
3535
from Orange.widgets.utils.annotated_data import (create_annotated_table,
3636
ANNOTATED_DATA_SIGNAL_NAME)
37-
from Orange.widgets.widget import Input, Output
37+
from Orange.widgets.widget import Input, Output, Msg
3838

3939
__all__ = ["OWHierarchicalClustering"]
4040

@@ -763,6 +763,9 @@ class Outputs:
763763
cluster_roles = ["Attribute", "Class variable", "Meta variable"]
764764
basic_annotations = ["None", "Enumeration"]
765765

766+
class Error(widget.OWWidget.Error):
767+
not_finite_distances = Msg("Some distances are infinite")
768+
766769
def __init__(self):
767770
super().__init__()
768771

@@ -962,11 +965,16 @@ def axis_view(orientation):
962965
@Inputs.distances
963966
def set_distances(self, matrix):
964967
self.error()
968+
self.Error.clear()
965969
if matrix is not None:
966970
N, _ = matrix.shape
967971
if N < 2:
968972
self.error("Empty distance matrix")
969973
matrix = None
974+
if matrix is not None:
975+
if not np.all(np.isfinite(matrix)):
976+
self.Error.not_finite_distances()
977+
matrix = None
970978

971979
self.matrix = matrix
972980
if matrix is not None:

Orange/widgets/unsupervised/tests/test_owhierarchicalclustering.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# pylint: disable=missing-docstring
33
import numpy as np
44
import Orange.misc
5+
from Orange.data import Table, Domain, ContinuousVariable, DiscreteVariable
56
from Orange.distance import Euclidean
67
from Orange.widgets.tests.base import WidgetTest, WidgetOutputsTestMixin
78
from Orange.widgets.unsupervised.owhierarchicalclustering import \
@@ -102,3 +103,23 @@ def test_domain_loses_class(self):
102103
data = self.data[:, :4]
103104
distances = Euclidean(data)
104105
self.send_signal(self.widget.Inputs.distances, distances)
106+
107+
def test_infinite_distances(self):
108+
"""
109+
Scipy does not accept infinite distances and neither does this widget.
110+
Error is shown.
111+
GH-2380
112+
"""
113+
table = Table(
114+
Domain(
115+
[ContinuousVariable("a")],
116+
[DiscreteVariable("b", values=["y"])]),
117+
list(zip([1.79e308, -1e120],
118+
"yy"))
119+
)
120+
distances = Euclidean(table)
121+
self.assertFalse(self.widget.Error.not_finite_distances.is_shown())
122+
self.send_signal(self.widget.Inputs.distances, distances)
123+
self.assertTrue(self.widget.Error.not_finite_distances.is_shown())
124+
self.send_signal(self.widget.Inputs.distances, self.distances)
125+
self.assertFalse(self.widget.Error.not_finite_distances.is_shown())

0 commit comments

Comments
 (0)