@@ -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