Skip to content
Snippets Groups Projects
Commit d16371d4 authored by Oscar Gustafsson's avatar Oscar Gustafsson :bicyclist:
Browse files

Do simulation in separate thread

parent d86cbdb8
No related branches found
No related tags found
1 merge request!281Do simulation in separate thread
Pipeline #93895 passed
...@@ -12,7 +12,7 @@ from collections import deque ...@@ -12,7 +12,7 @@ from collections import deque
from pprint import pprint from pprint import pprint
from typing import Dict, List, Optional, Tuple, cast from typing import Dict, List, Optional, Tuple, cast
from qtpy.QtCore import QCoreApplication, QFileInfo, QSettings, QSize, Qt from qtpy.QtCore import QCoreApplication, QFileInfo, QSettings, QSize, Qt, QThread
from qtpy.QtGui import QCursor, QIcon, QKeySequence, QPainter from qtpy.QtGui import QCursor, QIcon, QKeySequence, QPainter
from qtpy.QtWidgets import ( from qtpy.QtWidgets import (
QAction, QAction,
...@@ -39,9 +39,8 @@ from b_asic.GUI.gui_interface import Ui_main_window ...@@ -39,9 +39,8 @@ from b_asic.GUI.gui_interface import Ui_main_window
from b_asic.GUI.port_button import PortButton from b_asic.GUI.port_button import PortButton
from b_asic.GUI.select_sfg_window import SelectSFGWindow from b_asic.GUI.select_sfg_window import SelectSFGWindow
from b_asic.GUI.show_pc_window import ShowPCWindow from b_asic.GUI.show_pc_window import ShowPCWindow
# from b_asic.GUI.simulate_sfg_window import Plot, SimulateSFGWindow
from b_asic.GUI.simulate_sfg_window import SimulateSFGWindow from b_asic.GUI.simulate_sfg_window import SimulateSFGWindow
from b_asic.GUI.simulation_worker import SimulationWorker
from b_asic.GUI.util_dialogs import FaqWindow, KeybindingsWindow from b_asic.GUI.util_dialogs import FaqWindow, KeybindingsWindow
from b_asic.gui_utils.about_window import AboutWindow from b_asic.gui_utils.about_window import AboutWindow
from b_asic.gui_utils.decorators import decorate_class, handle_error from b_asic.gui_utils.decorators import decorate_class, handle_error
...@@ -51,9 +50,7 @@ from b_asic.port import InputPort, OutputPort ...@@ -51,9 +50,7 @@ from b_asic.port import InputPort, OutputPort
from b_asic.save_load_structure import python_to_sfg, sfg_to_python from b_asic.save_load_structure import python_to_sfg, sfg_to_python
from b_asic.signal import Signal from b_asic.signal import Signal
from b_asic.signal_flow_graph import SFG from b_asic.signal_flow_graph import SFG
from b_asic.simulation import Simulation
# from b_asic import FastSimulation
from b_asic.simulation import Simulation as FastSimulation
from b_asic.special_operations import Input, Output from b_asic.special_operations import Input, Output
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
...@@ -89,6 +86,7 @@ class MainWindow(QMainWindow): ...@@ -89,6 +86,7 @@ class MainWindow(QMainWindow):
self.sfg_dict = {} self.sfg_dict = {}
self._window = self self._window = self
self.logger = logging.getLogger(__name__) self.logger = logging.getLogger(__name__)
self._plot: Dict[Simulation, PlotWindow] = dict()
# Create Graphics View # Create Graphics View
self.graphic_view = QGraphicsView(self.scene, self) self.graphic_view = QGraphicsView(self.scene, self)
...@@ -237,7 +235,6 @@ class MainWindow(QMainWindow): ...@@ -237,7 +235,6 @@ class MainWindow(QMainWindow):
module, accepted = QFileDialog().getOpenFileName() module, accepted = QFileDialog().getOpenFileName()
if not accepted: if not accepted:
return return
self.addRecentFile(module)
self._load_from_file(module) self._load_from_file(module)
def _load_from_file(self, module) -> None: def _load_from_file(self, module) -> None:
...@@ -250,6 +247,8 @@ class MainWindow(QMainWindow): ...@@ -250,6 +247,8 @@ class MainWindow(QMainWindow):
) )
return return
self.addRecentFile(module)
while sfg.name in self.sfg_dict: while sfg.name in self.sfg_dict:
self.logger.warning( self.logger.warning(
f"Duplicate SFG with name: {sfg.name} detected. " f"Duplicate SFG with name: {sfg.name} detected. "
...@@ -741,22 +740,23 @@ class MainWindow(QMainWindow): ...@@ -741,22 +740,23 @@ class MainWindow(QMainWindow):
self.pressed_operations = selected self.pressed_operations = selected
def _simulate_sfg(self) -> None: def _simulate_sfg(self) -> None:
self._thread = dict()
self._sim_worker = dict()
for sfg, properties in self._simulation_dialog.properties.items(): for sfg, properties in self._simulation_dialog.properties.items():
self.logger.info("Simulating SFG with name: %s" % str(sfg.name)) self.logger.info("Simulating SFG with name: %s" % str(sfg.name))
simulation = FastSimulation(sfg, input_providers=properties["input_values"]) self._sim_worker[sfg] = SimulationWorker(sfg, properties)
l_result = simulation.run_for( self._thread[sfg] = QThread()
properties["iteration_count"], self._sim_worker[sfg].moveToThread(self._thread[sfg])
save_results=properties["all_results"], self._thread[sfg].started.connect(self._sim_worker[sfg].start_simulation)
) self._sim_worker[sfg].finished.connect(self._thread[sfg].quit)
self._sim_worker[sfg].finished.connect(self._show_plot_window)
print(f"{'=' * 10} {sfg.name} {'=' * 10}") self._sim_worker[sfg].finished.connect(self._sim_worker[sfg].deleteLater)
pprint(simulation.results if properties["all_results"] else l_result) self._thread[sfg].finished.connect(self._thread[sfg].deleteLater)
print(f"{'=' * 10} /{sfg.name} {'=' * 10}") self._thread[sfg].start()
if properties["show_plot"]: def _show_plot_window(self, sim: Simulation):
self.logger.info("Opening plot for SFG with name: " + str(sfg.name)) self._plot[sim] = PlotWindow(sim.results, sfg_name=sim._sfg.name)
self._plot = PlotWindow(simulation.results, sfg_name=sfg.name) self._plot[sim].show()
self._plot.show()
def simulate_sfg(self, event=None) -> None: def simulate_sfg(self, event=None) -> None:
self._simulation_dialog = SimulateSFGWindow(self) self._simulation_dialog = SimulateSFGWindow(self)
......
from qtpy.QtCore import QObject, Signal
from b_asic.signal_flow_graph import SFG
from b_asic.simulation import Simulation
class SimulationWorker(QObject):
finished = Signal(Simulation)
def __init__(self, sfg: SFG, properties):
super().__init__()
self._sfg = sfg
self._props = properties
def start_simulation(self):
simulation = Simulation(self._sfg, input_providers=self._props["input_values"])
simulation.run_for(
self._props["iteration_count"],
save_results=self._props["all_results"],
)
self.finished.emit(simulation)
...@@ -12,20 +12,20 @@ from qtpy.QtCore import Qt ...@@ -12,20 +12,20 @@ from qtpy.QtCore import Qt
from qtpy.QtWidgets import ( # QFrame,; QScrollArea,; QLineEdit,; QSizePolicy,; QLabel,; QFileDialog,; QShortcut, from qtpy.QtWidgets import ( # QFrame,; QScrollArea,; QLineEdit,; QSizePolicy,; QLabel,; QFileDialog,; QShortcut,
QApplication, QApplication,
QCheckBox, QCheckBox,
QDialog,
QHBoxLayout, QHBoxLayout,
QListWidget, QListWidget,
QListWidgetItem, QListWidgetItem,
QPushButton, QPushButton,
QSizePolicy, QSizePolicy,
QVBoxLayout, QVBoxLayout,
QWidget,
) )
from b_asic.operation import ResultKey from b_asic.operation import ResultKey
from b_asic.types import Num from b_asic.types import Num
class PlotWindow(QDialog): class PlotWindow(QWidget):
""" """
Dialog for plotting the result of a simulation. Dialog for plotting the result of a simulation.
...@@ -43,9 +43,8 @@ class PlotWindow(QDialog): ...@@ -43,9 +43,8 @@ class PlotWindow(QDialog):
self, self,
sim_result: Mapping[ResultKey, Sequence[Num]], sim_result: Mapping[ResultKey, Sequence[Num]],
sfg_name: Optional[str] = None, sfg_name: Optional[str] = None,
parent=None,
): ):
super().__init__(parent=parent) super().__init__()
self.setWindowFlags( self.setWindowFlags(
Qt.WindowTitleHint Qt.WindowTitleHint
| Qt.WindowCloseButtonHint | Qt.WindowCloseButtonHint
......
...@@ -157,8 +157,8 @@ def test_simulate(qtbot, datadir): ...@@ -157,8 +157,8 @@ def test_simulate(qtbot, datadir):
assert 'twotapfir' in widget.sfg_dict assert 'twotapfir' in widget.sfg_dict
widget.simulate_sfg() widget.simulate_sfg()
qtbot.wait(100) qtbot.wait(100)
# widget.dialog.save_properties() widget._simulation_dialog.save_properties()
# qtbot.wait(100) qtbot.wait(100)
widget._simulation_dialog.close() widget._simulation_dialog.close()
widget.exit_app() widget.exit_app()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment