Skip to content

Commit 34e0a2f

Browse files
committed
MDS: Retain embedding if metas change
1 parent fa3414b commit 34e0a2f

File tree

1 file changed

+25
-24
lines changed

1 file changed

+25
-24
lines changed

Orange/widgets/unsupervised/owmds.py

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def __init__(self):
158158
#: Input data table
159159
self.signal_data = None
160160

161-
self._invalidated = False
161+
self.__invalidated = True
162162
self.embedding = None
163163
self.effective_matrix = None
164164

@@ -214,15 +214,6 @@ def set_data(self, data):
214214

215215
self.signal_data = data
216216

217-
if self.matrix is not None and data is not None and \
218-
len(self.matrix) == len(data):
219-
self.closeContext()
220-
self.data = data
221-
self.init_attr_values()
222-
self.openContext(data)
223-
else:
224-
self._invalidated = True
225-
226217
@Inputs.distances
227218
def set_disimilarity(self, matrix):
228219
"""Set the dissimilarity (distance) matrix.
@@ -240,31 +231,34 @@ def set_disimilarity(self, matrix):
240231

241232
self.matrix = matrix
242233
self.matrix_data = matrix.row_items if matrix is not None else None
243-
self._invalidated = True
244234

245-
def clear(self):
235+
def clear(self, with_attr_values=True):
246236
super().clear()
247237
self.embedding = None
248-
self.effective_matrix = None
238+
if with_attr_values:
239+
self.init_attr_values()
249240
self.graph.set_effective_matrix(None)
250241
self.__set_update_loop(None)
251242
self.__state = OWMDS.Waiting
252243

253244
def _initialize(self):
245+
matrix_exists = self.effective_matrix is not None
246+
effective_matrix = self.effective_matrix
247+
self.__invalidated = True
248+
self.data = None
249+
self.effective_matrix = None
254250
self.closeContext()
255-
self.clear()
256251
self.clear_messages()
257252

258253
# if no data nor matrix is present reset plot
259254
if self.signal_data is None and self.matrix is None:
260-
self.data = None
261-
self.init_attr_values()
255+
self.clear()
262256
return
263257

264258
if self.signal_data is not None and self.matrix is not None and \
265259
len(self.signal_data) != len(self.matrix):
266260
self.Error.mismatching_dimensions()
267-
self.init_attr_values()
261+
self.clear()
268262
return
269263

270264
if self.signal_data is not None:
@@ -281,11 +275,17 @@ def _initialize(self):
281275
self.effective_matrix = Euclidean(preprocessed_data)
282276
else:
283277
self.Error.no_attributes()
284-
self.init_attr_values()
278+
self.clear()
285279
return
286280

287281
self.init_attr_values()
288282
self.openContext(self.data)
283+
self.__invalidated = not (matrix_exists and
284+
self.effective_matrix is not None and
285+
np.array_equal(effective_matrix,
286+
self.effective_matrix))
287+
if self.__invalidated:
288+
self.clear(False)
289289
self.graph.set_effective_matrix(self.effective_matrix)
290290

291291
def _toggle_run(self):
@@ -409,7 +409,6 @@ def __next_step(self):
409409
self.__set_update_loop(None)
410410
self.unconditional_commit()
411411
self.graph.resume_drawing_pairs()
412-
self.graph.update_coordinates()
413412
except MemoryError:
414413
self.Error.out_of_memory()
415414
self.__set_update_loop(None)
@@ -448,6 +447,7 @@ def jitter_coord(part):
448447
self.__set_update_loop(None)
449448

450449
if self.effective_matrix is None:
450+
self.graph.reset_graph()
451451
return
452452

453453
X = self.effective_matrix
@@ -479,15 +479,16 @@ def __invalidate_refresh(self):
479479
self.__start()
480480

481481
def handleNewSignals(self):
482-
if self._invalidated:
482+
self._initialize()
483+
if self.__invalidated:
483484
self.graph.pause_drawing_pairs()
484-
self._invalidated = False
485-
self._initialize()
485+
self.__invalidated = False
486486
self.__invalidate_embedding()
487487
self.cb_class_density.setEnabled(self.can_draw_density())
488488
self.start()
489-
490-
super().handleNewSignals()
489+
else:
490+
self.graph.update_point_props()
491+
self.commit()
491492

492493
def _invalidate_output(self):
493494
self.commit()

0 commit comments

Comments
 (0)