Example #1
0
        class Optimizer(QObject):
            update = Signal(float, np.ndarray, np.ndarray)
            done = Signal(SOM)
            stopped = Signal()

            def __init__(self, data, widget):
                super().__init__()
                self.som = SOM(
                    widget.size_x,
                    widget.size_y,
                    hexagonal=widget.hexagonal,
                    pca_init=widget.initialization == 0,
                    random_seed=0 if widget.initialization == 2 else None)
                self.data = data
                self.widget = widget

            def callback(self, progress):
                self.update.emit(progress, self.som.weights.copy(),
                                 self.som.ssum_weights.copy())
                return not self.widget.stop_optimization

            def run(self):
                try:
                    self.som.fit(self.data,
                                 N_ITERATIONS,
                                 callback=self.callback)
                    # Report an exception, but still remove the thread
                finally:
                    self.done.emit(self.som)
                    self.stopped.emit()
Example #2
0
 def __init__(self, data, widget):
     super().__init__()
     self.som = SOM(
         widget.size_x, widget.size_y,
         hexagonal=widget.hexagonal,
         pca_init=widget.initialization == 0,
         random_seed=0 if widget.initialization == 2 else None)
     self.data = data
     self.widget = widget
Example #3
0
    def _recompute_som(self):
        if self.cont_x is None:
            return

        som = SOM(self.size_x,
                  self.size_y,
                  hexagonal=self.hexagonal,
                  pca_init=self.initialization == 0,
                  random_seed=0 if self.initialization == 2 else None)

        class Optimizer(QObject):
            update = Signal(float, np.ndarray, np.ndarray)
            done = Signal(SOM)
            stopped = Signal()
            stop_optimization = False

            def __init__(self, data, som):
                super().__init__()
                self.som = som
                self.data = data

            def callback(self, progress):
                self.update.emit(progress, self.som.weights.copy(),
                                 self.som.ssum_weights.copy())
                return not self.stop_optimization

            def run(self):
                try:
                    self.som.fit(self.data,
                                 N_ITERATIONS,
                                 callback=self.callback)
                    # Report an exception, but still remove the thread
                finally:
                    self.done.emit(self.som)
                    self.stopped.emit()

        def thread_finished():
            self._optimizer = None
            self._optimizer_thread = None

        self.progressBarInit()

        self._optimizer = Optimizer(self.cont_x, som)
        self._optimizer_thread = QThread()
        self._optimizer_thread.setStackSize(5 * 2**20)
        self._optimizer.update.connect(self.__update)
        self._optimizer.done.connect(self.__done)
        self._optimizer.stopped.connect(self._optimizer_thread.quit)
        self._optimizer.moveToThread(self._optimizer_thread)
        self._optimizer_thread.started.connect(self._optimizer.run)
        self._optimizer_thread.finished.connect(thread_finished)
        self.stop_optimization = False
        self._optimizer_thread.start()
Example #4
0
 def _assign_instances(self, weights, ssum_weights):
     if self.cont_x is None:
         return  # the widget is shutting down while signals still processed
     assignments = SOM.winner_from_weights(self.cont_x, weights,
                                           ssum_weights, self.hexagonal)
     members = defaultdict(list)
     for i, (x, y) in enumerate(assignments):
         members[(x, y)].append(i)
     members.pop(None, None)
     self.cells = np.empty((self.size_x, self.size_y, 2), dtype=int)
     self.member_data = np.empty(self.cont_x.shape[0], dtype=int)
     index = 0
     for x in range(self.size_x):
         for y in range(self.size_y):
             nmembers = len(members[(x, y)])
             self.member_data[index:index + nmembers] = members[(x, y)]
             self.cells[x, y] = [index, index + nmembers]
             index += nmembers