|
16 | 16 | QGraphicsProxyWidget, QGraphicsItemGroup, QGraphicsSimpleTextItem, |
17 | 17 | QGraphicsRectItem, QFrame, QSizePolicy |
18 | 18 | ) |
19 | | -from AnyQt.QtGui import QColor, QPen, QBrush, QPainter, QFont, QFontMetrics |
| 19 | +from AnyQt.QtGui import QColor, QPen, QBrush, QPainter, QFontMetrics |
20 | 20 | from AnyQt.QtCore import Qt, QEvent, QRectF, QSizeF, QSize, QPointF |
21 | 21 | from AnyQt.QtCore import pyqtSignal as Signal |
22 | 22 |
|
@@ -83,6 +83,7 @@ class Outputs: |
83 | 83 | class Error(widget.OWWidget.Error): |
84 | 84 | need_two_clusters = Msg("Need at least two non-empty clusters") |
85 | 85 | singleton_clusters_all = Msg("All clusters are singletons") |
| 86 | + memory_error = Msg("Not enough memory") |
86 | 87 |
|
87 | 88 | class Warning(widget.OWWidget.Warning): |
88 | 89 | missing_cluster_assignment = Msg( |
@@ -253,30 +254,44 @@ def _invalidate_scores(self): |
253 | 254 |
|
254 | 255 | def _update(self): |
255 | 256 | # Update/recompute the distances/scores as required |
| 257 | + self._clear_messages() |
| 258 | + |
256 | 259 | if self.data is None or not len(self.data): |
257 | | - self._mask = None |
258 | | - self._silhouette = None |
259 | | - self._labels = None |
260 | | - self._matrix = None |
261 | | - self._clear_scene() |
| 260 | + self._reset_all() |
262 | 261 | return |
263 | 262 |
|
264 | 263 | if self._matrix is None and self._effective_data is not None: |
265 | 264 | _, metric = self.Distances[self.distance_idx] |
266 | | - self._matrix = numpy.asarray(metric(self._effective_data)) |
| 265 | + try: |
| 266 | + self._matrix = numpy.asarray(metric(self._effective_data)) |
| 267 | + except MemoryError: |
| 268 | + self.Error.memory_error() |
| 269 | + return |
| 270 | + |
| 271 | + self._update_labels() |
| 272 | + |
| 273 | + def _reset_all(self): |
| 274 | + self._mask = None |
| 275 | + self._silhouette = None |
| 276 | + self._labels = None |
| 277 | + self._matrix = None |
| 278 | + self._clear_scene() |
267 | 279 |
|
| 280 | + def _clear_messages(self): |
| 281 | + self.Error.memory_error.clear() |
| 282 | + self.Error.singleton_clusters_all.clear() |
| 283 | + self.Error.need_two_clusters.clear() |
| 284 | + self.Warning.missing_cluster_assignment.clear() |
| 285 | + |
| 286 | + def _update_labels(self): |
268 | 287 | labelvar = self.cluster_var_model[self.cluster_var_idx] |
269 | 288 | labels, _ = self.data.get_column_view(labelvar) |
270 | 289 | labels = numpy.asarray(labels, dtype=float) |
271 | 290 | mask = numpy.isnan(labels) |
272 | 291 | labels = labels.astype(int) |
273 | 292 | labels = labels[~mask] |
274 | 293 |
|
275 | | - labels_unq, counts = numpy.unique(labels, return_counts=True) |
276 | | - |
277 | | - self.Error.singleton_clusters_all.clear() |
278 | | - self.Error.need_two_clusters.clear() |
279 | | - self.Warning.missing_cluster_assignment.clear() |
| 294 | + labels_unq, _ = numpy.unique(labels, return_counts=True) |
280 | 295 |
|
281 | 296 | if len(labels_unq) < 2: |
282 | 297 | self.Error.need_two_clusters() |
@@ -529,8 +544,8 @@ def setRowNames(self, names): |
529 | 544 | else: |
530 | 545 | tooltips = grp.rownames |
531 | 546 |
|
532 | | - for bar, tooltip in zip(baritems, tooltips): |
533 | | - bar.setToolTip(tooltip) |
| 547 | + for baritem, tooltip in zip(baritems, tooltips): |
| 548 | + baritem.setToolTip(tooltip) |
534 | 549 |
|
535 | 550 | self.layout().activate() |
536 | 551 |
|
@@ -969,7 +984,7 @@ def __update(self): |
969 | 984 |
|
970 | 985 | pen = self.pen() |
971 | 986 | brush = self.brush() |
972 | | - for i in range(self.count()): |
| 987 | + for _ in range(self.count()): |
973 | 988 | item = QGraphicsRectItem(self) |
974 | 989 | item.setPen(pen) |
975 | 990 | item.setBrush(brush) |
@@ -1017,7 +1032,7 @@ def __init__(self, parent=None, items=None, **kwargs): |
1017 | 1032 | self.__spacing = 0 |
1018 | 1033 |
|
1019 | 1034 | sp = QSizePolicy(QSizePolicy.Preferred, |
1020 | | - QSizePolicy.Preferred) |
| 1035 | + QSizePolicy.Preferred) |
1021 | 1036 | sp.setWidthForHeight(True) |
1022 | 1037 | self.setSizePolicy(sp) |
1023 | 1038 |
|
@@ -1113,8 +1128,10 @@ def remove(items, scene): |
1113 | 1128 | self.__textitems = [] |
1114 | 1129 |
|
1115 | 1130 |
|
1116 | | -def main(argv=sys.argv): |
| 1131 | +def main(argv=None): |
1117 | 1132 | from AnyQt.QtWidgets import QApplication |
| 1133 | + if argv is None: |
| 1134 | + argv = sys.argv |
1118 | 1135 | app = QApplication(list(argv)) |
1119 | 1136 | argv = app.arguments() |
1120 | 1137 | if len(argv) > 1: |
|
0 commit comments