Skip to content

Commit 8673d52

Browse files
authored
Merge pull request #1725 from ales-erjavec/fixes/hclust-zero-div
[FIX] DendrogramWidget: Prevent a zero division error
2 parents a53b8b4 + 23f1395 commit 8673d52

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

Orange/widgets/unsupervised/owhierarchicalclustering.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -605,10 +605,20 @@ def _rescale(self):
605605
else:
606606
drect = QSizeF(leaf_count, self._root.value.height)
607607

608-
transform = QTransform().scale(
609-
crect.width() / drect.width(),
610-
crect.height() / drect.height()
611-
)
608+
eps = numpy.finfo(numpy.float64).eps
609+
610+
if abs(drect.width()) < eps:
611+
sx = 1.0
612+
else:
613+
sx = crect.width() / drect.width()
614+
615+
if abs(drect.height()) < eps:
616+
sy = 1.0
617+
else:
618+
sy = crect.height() / drect.height()
619+
620+
transform = QTransform().scale(sx, sy)
621+
612622
self._itemgroup.setPos(crect.topLeft())
613623
self._itemgroup.setTransform(transform)
614624
self._selection_items = None
@@ -817,7 +827,6 @@ def __init__(self):
817827
self.top_n_spin = gui.spin(self.selection_box, self, "top_n", 1, 20,
818828
callback=self._selection_method_changed)
819829
grid.addWidget(self.top_n_spin, 2, 1)
820-
self.selection_box.layout().addLayout(grid)
821830

822831
self.zoom_slider = gui.hSlider(
823832
self.controlArea, self, "zoom_factor", box="Zoom",

Orange/widgets/unsupervised/tests/test_owhierarchicalclustering.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Test methods with long descriptive names can omit docstrings
22
# pylint: disable=missing-docstring
3+
import numpy
4+
import Orange.misc
35
from Orange.distance import Euclidean
46
from Orange.widgets.tests.base import WidgetTest, WidgetOutputsTestMixin
57
from Orange.widgets.unsupervised.owhierarchicalclustering import \
@@ -50,3 +52,7 @@ def test_selection_box_output(self):
5052
self.widget.selection_box.buttons[2].click()
5153
self.assertIsNotNone(self.get_output("Selected Data"))
5254
self.assertIsNone(self.get_output(ANNOTATED_DATA_SIGNAL_NAME))
55+
56+
def test_all_zero_inputs(self):
57+
d = Orange.misc.DistMatrix(numpy.zeros((10, 10)))
58+
self.widget.set_distances(d)

0 commit comments

Comments
 (0)