-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ba84f96
commit c8bb83d
Showing
10 changed files
with
276 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
""" | ||
Mach Zender BB84 implementation | ||
""" | ||
from quasi.simulation import Simulation, SimulationType, ModeManager | ||
from quasi.devices.sources import IdealNPhotonSource, IdealCoherentSource | ||
from quasi.devices.control import SimpleTrigger | ||
from quasi.devices.beam_splitters import IdealBeamSplitter | ||
from quasi.devices.phase_shifters import IdealPhaseShifter | ||
from quasi.signals import GenericBoolSignal, GenericQuantumSignal | ||
from quasi.experiment import Experiment | ||
from quasi.backend.fock_first_backend import FockBackendFirst | ||
import numpy as np | ||
from math import pi | ||
|
||
|
||
sim = Simulation() | ||
sim.set_backend(FockBackendFirst()) | ||
sim.set_dimensions(5) | ||
|
||
# Create all of the devices | ||
BSa = IdealBeamSplitter("BSa") | ||
BSb = IdealBeamSplitter("BSb") | ||
BSc = IdealBeamSplitter("BSc") | ||
BSd = IdealBeamSplitter("BSd") | ||
|
||
PSa = IdealPhaseShifter("PSa") | ||
PSa.set_phi(0) | ||
|
||
PSb = IdealPhaseShifter("PSb") | ||
PSb.set_phi(pi/4) | ||
|
||
S = IdealNPhotonSource() | ||
S.set_photon_num(0) | ||
trigger = SimpleTrigger() | ||
|
||
# Create Signals | ||
signals = {} | ||
signals["trigger"] = GenericBoolSignal() | ||
signals["qsig1"] = GenericQuantumSignal() | ||
signals["qsig2"] = GenericQuantumSignal() | ||
signals["qsig3"] = GenericQuantumSignal() | ||
signals["qsig4"] = GenericQuantumSignal() | ||
signals["qsig5"] = GenericQuantumSignal() | ||
signals["qsig6"] = GenericQuantumSignal() | ||
signals["qsig7"] = GenericQuantumSignal() | ||
signals["qsig8"] = GenericQuantumSignal() | ||
signals["qsig9"] = GenericQuantumSignal() | ||
|
||
# Connect trigger and source | ||
trigger.register_signal(signal=signals["trigger"], port_label="trigger") | ||
S.register_signal(signal=signals["trigger"], port_label="trigger") | ||
|
||
# connect source and beam splitter a | ||
S.register_signal(signal=signals["qsig1"], port_label="output") | ||
BSa.register_signal(signal=signals["qsig1"], port_label="A") | ||
|
||
# connect beam splitter a and phase shifter | ||
BSa.register_signal(signal=signals["qsig2"], port_label="C") | ||
PSa.register_signal(signal=signals["qsig2"], port_label="input") | ||
|
||
# connect beam splitter a and b | ||
BSa.register_signal(signal=signals["qsig3"], port_label="D") | ||
BSb.register_signal(signal=signals["qsig3"], port_label="B") | ||
|
||
# connect phase shifter and beam splitter b | ||
PSa.register_signal(signal=signals["qsig4"], port_label="output") | ||
BSb.register_signal(signal=signals["qsig4"], port_label="A") | ||
|
||
# connect beamspitter b and c | ||
BSb.register_signal(signal=signals["qsig5"], port_label="C") | ||
BSb.register_signal(signal=signals["qsig6"], port_label="D") | ||
|
||
BSc.register_signal(signal=signals["qsig5"], port_label="A") | ||
BSc.register_signal(signal=signals["qsig6"], port_label="B") | ||
|
||
|
||
# Connect beamsplitter c and phase shifter | ||
BSc.register_signal(signal=signals["qsig7"], port_label="C") | ||
PSb.register_signal(signal=signals["qsig7"], port_label="input") | ||
|
||
# Connect phase shifter b and beam splitter d | ||
PSb.register_signal(signal=signals["qsig8"], port_label="output") | ||
BSd.register_signal(signal=signals["qsig8"], port_label="A") | ||
|
||
# Connect beam splitter c and beam splitter d | ||
BSc.register_signal(signal=signals["qsig9"], port_label="D") | ||
BSd.register_signal(signal=signals["qsig9"], port_label="B") | ||
|
||
# Signal going to det 1 | ||
dsig1 = GenericQuantumSignal() | ||
dsig2 = GenericQuantumSignal() | ||
|
||
BSd.register_signal(signal=dsig1, port_label="C") | ||
BSd.register_signal(signal=dsig2, port_label="D") | ||
|
||
sim.run() | ||
|
||
exp = Experiment.get_instance() | ||
|
||
print(exp.state.all_fock_probs()) | ||
state = exp.state | ||
mm = ModeManager() | ||
print(state.mean_photon(mode=[mm.get_mode_index(dsig1.mode_id)])) | ||
print(state.mean_photon(mode=[mm.get_mode_index(dsig2.mode_id)])) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from .ideal_phase_shifter import IdealPhaseShifter |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
""" | ||
Ideal Phase Shifter | ||
""" | ||
from quasi.devices import (GenericDevice, | ||
wait_input_compute, | ||
coordinate_gui, | ||
ensure_output_compute) | ||
from quasi.devices.port import Port | ||
from quasi.signals import (GenericSignal, | ||
GenericFloatSignal, | ||
GenericQuantumSignal) | ||
from quasi.extra.logging import Loggers, get_custom_logger | ||
from quasi.gui.icons import icon_list | ||
from quasi.simulation import Simulation, SimulationType, ModeManager | ||
|
||
logger = get_custom_logger(Loggers.Devices) | ||
|
||
class IdealPhaseShifter(GenericDevice): | ||
""" | ||
Implements Ideal Phase Shifter | ||
""" | ||
|
||
ports = { | ||
"theta": Port(label="theta", direction="input", signal=None, | ||
signal_type=GenericFloatSignal, device=None), | ||
"input": Port(label="input", direction="input", signal=None, | ||
signal_type=GenericQuantumSignal, device=None), | ||
"output": Port(label="output", direction="output", signal=None, | ||
signal_type=GenericQuantumSignal, device=None) | ||
} | ||
|
||
gui_icon = icon_list.LASER | ||
gui_tags = ["ideal"] | ||
gui_name = "Ideal Coherent Photon Source" | ||
gui_documentation = "ideal_phase_shifter.md" | ||
|
||
power_peak = 0 | ||
power_average = 0 | ||
reference = None | ||
|
||
def set_phi(self, phi): | ||
""" | ||
Sets the phi for the phase shifter | ||
""" | ||
theta_sig = GenericFloatSignal() | ||
theta_sig.set_float(phi) | ||
self.register_signal(signal=theta_sig, port_label="theta") | ||
theta_sig.set_computed() | ||
|
||
@ensure_output_compute | ||
@coordinate_gui | ||
@wait_input_compute | ||
def compute_outputs(self, *args, **kwargs): | ||
simulation = Simulation.get_instance() | ||
if simulation.simulation_type is SimulationType.FOCK: | ||
self.simulate_fock() | ||
|
||
def simulate_fock(self): | ||
""" | ||
Fock Simulation | ||
""" | ||
logger.info("Beam Splitter - %s - executing", self.name) | ||
simulation = Simulation.get_instance() | ||
backend = simulation.get_backend() | ||
|
||
# Get the mode manager | ||
mm = ModeManager() | ||
# Generate new mode | ||
theta = self.ports["theta"].signal.contents | ||
mode = self.ports["input"].signal.mode_id | ||
logger.info("Phase Shifter - %s - received mode %s from signal on port %s", | ||
self.name, mm.get_mode_index(mode), | ||
self.ports["output"].label) | ||
|
||
# Initialize photon number state in the mode | ||
operator = backend.phase_shift(theta, mm.get_mode_index(mode)) | ||
backend.apply_operator(operator, [mm.get_mode_index(mode)]) | ||
|
||
logger.info("Phase Shifter - %s - assisning mode %s to signal on port %s", | ||
self.name, mm.get_mode_index(mode), | ||
self.ports["output"].label) | ||
|
||
self.ports["output"].signal.set_contents( | ||
timestamp=0, | ||
mode_id=mode) | ||
self.ports["output"].signal.set_computed() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.