diff --git a/quasi/devices/beam_splitters/ideal_beam_splitter.py b/quasi/devices/beam_splitters/ideal_beam_splitter.py index e79da5e..272406b 100644 --- a/quasi/devices/beam_splitters/ideal_beam_splitter.py +++ b/quasi/devices/beam_splitters/ideal_beam_splitter.py @@ -7,9 +7,11 @@ ensure_output_compute) from quasi.devices.port import Port from quasi.signals import (GenericSignal, + QuantumContentType, GenericQuantumSignal) from quasi.gui.icons import icon_list +from quasi.simulation import ModeManager class IdealBeamSplitter(GenericDevice): @@ -18,11 +20,11 @@ class IdealBeamSplitter(GenericDevice): """ ports = { "A": Port(label="A", direction="input", signal=None, - signal_type=GenericSignal, device=None), + signal_type=GenericQuantumSignal, device=None), "B": Port(label="B", direction="output", signal=None, signal_type=GenericQuantumSignal, device=None), "C": Port(label="C", direction="input", signal=None, - signal_type=GenericSignal, device=None), + signal_type=GenericQuantumSignal, device=None), "D": Port(label="D", direction="output", signal=None, signal_type=GenericQuantumSignal, device=None), } @@ -32,6 +34,25 @@ class IdealBeamSplitter(GenericDevice): gui_tags = ["ideal"] gui_name = "Ideal Beam Splitter" + power_average = 0 + power_peak = 0 + reference = None + @wait_input_compute - def compute_outputs(self): - print("TEST") + def compute_outputs(self, *args, **kwargs): + mm = ModeManager() + + m_id_a = self.ports["A"].signal.mode_id + m_id_b = self.ports["B"].signal.mode_id + + self.ports["C"].signal.set_contents( + content_type=QuantumContentType.FOCK, + mode_id=m_id_a) + + self.ports["D"].signal.set_contents( + content_type=QuantumContentType.FOCK, + mode_id=m_id_b) + print(mm.modes.keys()) + + self.ports["C"].signal.set_computed() + self.ports["D"].signal.set_computed() diff --git a/quasi/devices/sources/ideal_coherent_source.py b/quasi/devices/sources/ideal_coherent_source.py index 95fdcb9..5f1be5f 100644 --- a/quasi/devices/sources/ideal_coherent_source.py +++ b/quasi/devices/sources/ideal_coherent_source.py @@ -61,12 +61,12 @@ def compute_outputs(self, *args, **kwargs): density_matrix = np.zeros(( mm.simulation.dimensions, mm.simulation.dimensions), dtype=np.complex128) - alpha = 1 + alpha = 10 for m in range(mm.simulation.dimensions): for n in range(mm.simulation.dimensions): density_matrix[m, n] = ((alpha**m * np.conj(alpha)**n) / - np.sqrt(factorial(m) * factorial(n))) + np.sqrt(factorial(m) * factorial(n))) density_matrix /= np.pi diff --git a/quasi/devices/sources/ideal_single_photon_source.py b/quasi/devices/sources/ideal_single_photon_source.py index 6788305..8318783 100644 --- a/quasi/devices/sources/ideal_single_photon_source.py +++ b/quasi/devices/sources/ideal_single_photon_source.py @@ -57,7 +57,9 @@ def compute_outputs(self, *args, **kwargs): AD = adagger(mm.simulation.dimensions) A = a(mm.simulation.dimensions) mode = mm.get_mode(m_id) - mm.modes[m_id] = np.matmul(AD, np.matmul(mode, A)) + + mode=np.matmul(AD, np.matmul(mode, A)) + mm.modes[m_id]=np.matmul(AD, np.matmul(mode, A)) self.ports["output"].signal.set_contents( content_type=QuantumContentType.FOCK, mode_id=m_id) diff --git a/quasi/gui/bar/simulation_bar.py b/quasi/gui/bar/simulation_bar.py index dc43787..671b148 100644 --- a/quasi/gui/bar/simulation_bar.py +++ b/quasi/gui/bar/simulation_bar.py @@ -2,6 +2,7 @@ from quasi.gui.icons import icon_list from quasi.gui.simulation.simulation_wrapper import SimulationWrapper +from quasi.simulation import Simulation class SimulationBar(ft.UserControl): @@ -23,20 +24,47 @@ def __init__(self) -> None: on_click=self.on_click_simulate ) + self.dimensions = ft.Container( + height=25, + width=100, + content=ft.Row( + controls=[ + ft.Icon( + name=ft.icons.ALL_OUT, + color="white"), + ft.TextField( + multiline=False, + width=40, + filled=False, + disabled=False, + value=str(Simulation.dimensions), + content_padding=0, + bgcolor="#2b223b", + color="white", + border=ft.InputBorder.NONE, + input_filter=ft.NumbersOnlyInputFilter(), + dense=True, + on_change=self.on_dimensions_change + ), + ] + ) + ) + self.bar = ft.Container( bgcolor="#2b223b", - top=25, + top=0, left=0, right=0, height=25, content=ft.Row( [ ft.Container(width=2), - self.simulate_button - ] + self.simulate_button, + self.dimensions, + ], + vertical_alignment=ft.MainAxisAlignment.CENTER) ) - ) def build(self) -> ft.Dropdown: return self.bar @@ -44,3 +72,7 @@ def build(self) -> ft.Dropdown: def on_click_simulate(self, e) -> None: self.sim_warpper.execute() + + def on_dimensions_change(self, e): + print("changing dimensions") + Simulation.set_dimensions(int(e.control.value)) diff --git a/quasi/gui/board/board.py b/quasi/gui/board/board.py index b392682..9cba526 100644 --- a/quasi/gui/board/board.py +++ b/quasi/gui/board/board.py @@ -54,7 +54,7 @@ def __init__(self, page: ft.Page): self.content, ]) self.board_wrapper = ft.Container( - top=50, + top=0, left=0, right=0, bottom=0, @@ -105,7 +105,7 @@ def drag_accept(self, e: ft.DragUpdateEvent): d = Device( page=self.page, board=self, - top=(e.y-self.offset_y)/2, + top=(e.y-self.offset_y-75)/2, left=(e.x-self.offset_x)/2, device_instance=dev_instance) diff --git a/quasi/gui/board/device.py b/quasi/gui/board/device.py index 90bc41b..1906e14 100644 --- a/quasi/gui/board/device.py +++ b/quasi/gui/board/device.py @@ -50,14 +50,12 @@ def __init__(self, *args, **kwargs): height=self.content_height - self.header_height ) + self.image_left = 0 + self.image_right = 0 if len(self.ports_in.ports) > 0: - self._body_controls.append(self.ports_in) - self._body_controls.append(self.image) + self.image_left = 10 if len(self.ports_out.ports) > 0: - self._body_controls.append(self.ports_out) - - - + self.image_right = 10 self.set_contents( @@ -67,11 +65,19 @@ def __init__(self, *args, **kwargs): right=0, bottom=0, bgcolor="#3f3e42", - content=ft.Row( - alignment=ft.MainAxisAlignment.SPACE_AROUND, - spacing=0, - controls=self._body_controls - ) + content=ft.Stack( + controls=[self.ports_in, + self.ports_out, + ft.Container( + top=0, + left=self.image_left, + right=self.image_right, + bottom=0, + content=self.image + ) + ], + expand=True + ) ) ) diff --git a/quasi/gui/board/ports.py b/quasi/gui/board/ports.py index 77ca5f3..f9d0faf 100644 --- a/quasi/gui/board/ports.py +++ b/quasi/gui/board/ports.py @@ -183,11 +183,18 @@ def __init__( self.side = Ports.right_side self.create_ports(self.side) - def build(self) -> ft.Column(): - return ft.Column( - spacing=5, - alignment=ft.MainAxisAlignment.SPACE_AROUND, - controls=self.ports_controls + def build(self) -> ft.Container(): + return ft.Container( + top=0, + bottom=0, + right=0 if self.side == Ports.right_side else None, + left=0 if self.side == Ports.left_side else None, + width=10, + content=ft.Column( + spacing=5, + alignment=ft.MainAxisAlignment.SPACE_AROUND, + controls=self.ports_controls + ) ) def create_ports(self, side): diff --git a/quasi/gui/menus/menu_bar.py b/quasi/gui/menus/menu_bar.py index da9d057..10cf38d 100644 --- a/quasi/gui/menus/menu_bar.py +++ b/quasi/gui/menus/menu_bar.py @@ -24,8 +24,21 @@ def __init__(self, page: ft.Page) -> None: ) self.menu_items = ft.Row( [ - ft.Text("Exit", color="white"), - ft.Container(width=2), + ft.Container( + on_click=self.on_minimize, + content=ft.Icon( + name=ft.icons.MINIMIZE, + color="white" + ) + ), + ft.Container( + on_click=self.on_exit, + content=ft.Icon( + name=ft.icons.CLOSE, + color="white" + ) + ), + ft.Container(width=1), ] ) self.container = ft.Container( @@ -34,16 +47,42 @@ def __init__(self, page: ft.Page) -> None: right=0, height=self.height, bgcolor="#1f1c1e", - content=ft.Row( - [ - self.window_commands, - self.menu_items - ], - width=self.page.window_width, - alignment=ft.MainAxisAlignment.SPACE_BETWEEN + content=ft.GestureDetector( + drag_interval=10, + content=ft.Row( + [ + self.window_commands, + self.menu_items + ], + width=self.page.window_width, + alignment=ft.MainAxisAlignment.SPACE_BETWEEN + ), + on_vertical_drag_update=self.move_application_window, + on_double_tap=self.toggle_full_screen ) ) + def move_application_window(self, e) -> None: + print("——————————————————") + print(e.delta_x, e.delta_y) + print(e.local_x, e.local_y) + print(e.global_x, e.global_y) + self.page.window_left = e.global_x + self.page.window_top = e.global_y + self.page.update() + + def toggle_full_screen(self, e) -> None: + self.page.window_full_screen = not self.page.window_full_screen + self.page.update() + + + def on_minimize(self, e) -> None: + self.page.minimized=True + self.page.update() + + def on_exit(self, e) -> None: + self.page.window_destroy() + def on_click_simulate(self, e) -> None: self.sim_warpper.execute() diff --git a/quasi/gui/panels/main_panel.py b/quasi/gui/panels/main_panel.py index 1edbf0c..19da0bf 100644 --- a/quasi/gui/panels/main_panel.py +++ b/quasi/gui/panels/main_panel.py @@ -8,16 +8,52 @@ class MainPanel(ft.UserControl): def __init__(self, page: ft.Page): super().__init__() self.simulation_bar = SimulationBar() - self.container = ft.Container( - top=0, - left=0, - right=0, - bottom=0, - content=ft.Stack( - [Board(self.page), - self.simulation_bar] + self.container=ft.Stack( + [ft.Container( + top=25, + left=0, + right=0, + bottom=0, + bgcolor="#130925", + content=ft.Tabs( + tab_alignment=ft.TabAlignment.START, + indicator_color="white", + divider_color="black", + unselected_label_color="white", + indicator_padding=0, + indicator_tab_size=5, + label_color="blue", + tabs=[ + ft.Tab( + text="Board", + content=ft.Stack( + [ + ft.Container( + top=0, + left=0, + right=0, + bottom=0, + content=ft.Stack( + [ + Board(self.page), + self.simulation_bar + ] + ))] + ) + ), + ft.Tab( + text="Report", + ), + ft.Tab( + text="Beam Splitter", + ) + ] ) + ) + ] ) - + def build(self) -> ft.Container: return self.container + +