sequence 1.2.0__tar.gz → 1.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sequence-1.2.0 → sequence-1.3.1}/PKG-INFO +3 -1
- {sequence-1.2.0 → sequence-1.3.1}/README.md +1 -0
- {sequence-1.2.0 → sequence-1.3.1}/pyproject.toml +2 -1
- {sequence-1.2.0 → sequence-1.3.1}/pyproject.toml.orig +4 -3
- sequence-1.3.1/sequence/__init__.py +33 -0
- sequence-1.3.1/sequence/__init__.pyi +169 -0
- sequence-1.3.1/sequence/app/__init__.py +5 -0
- sequence-1.3.1/sequence/app/__init__.pyi +4 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/app/request_app.py +3 -3
- sequence-1.3.1/sequence/components/__init__.py +5 -0
- sequence-1.3.1/sequence/components/__init__.pyi +49 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/memory.py +6 -1
- sequence-1.3.1/sequence/entanglement_management/__init__.py +5 -0
- sequence-1.3.1/sequence/entanglement_management/__init__.pyi +34 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/swapping/swapping_bds.py +3 -13
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/swapping/swapping_circuit.py +3 -13
- sequence-1.3.1/sequence/kernel/__init__.py +5 -0
- sequence-1.3.1/sequence/kernel/__init__.pyi +21 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/base.py +16 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/bell_diagonal.py +16 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/density_matrix.py +27 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/fock_density_matrix.py +3 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/ket_vector.py +18 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/stabilizer.py +18 -0
- sequence-1.3.1/sequence/network_management/__init__.py +5 -0
- sequence-1.3.1/sequence/network_management/__init__.pyi +24 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/network_manager.py +3 -27
- {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/reservation.py +3 -2
- sequence-1.3.1/sequence/network_management/routing/__init__.py +11 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/rsvp.py +5 -18
- sequence-1.3.1/sequence/py.typed +0 -0
- sequence-1.3.1/sequence/qkd/__init__.py +5 -0
- sequence-1.3.1/sequence/qkd/__init__.pyi +12 -0
- sequence-1.3.1/sequence/resource_management/__init__.py +5 -0
- sequence-1.3.1/sequence/resource_management/__init__.pyi +7 -0
- sequence-1.3.1/sequence/resource_management/reservation_rule_registry.py +347 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/resource_management/resource_manager.py +58 -109
- sequence-1.3.1/sequence/topology/__init__.py +5 -0
- sequence-1.3.1/sequence/topology/__init__.pyi +12 -0
- sequence-1.3.1/sequence/utils/__init__.py +5 -0
- sequence-1.3.1/sequence/utils/__init__.pyi +7 -0
- sequence-1.2.0/sequence/__init__.py +0 -27
- sequence-1.2.0/sequence/app/__init__.py +0 -5
- sequence-1.2.0/sequence/components/__init__.py +0 -5
- sequence-1.2.0/sequence/entanglement_management/__init__.py +0 -4
- sequence-1.2.0/sequence/kernel/__init__.py +0 -5
- sequence-1.2.0/sequence/network_management/__init__.py +0 -4
- sequence-1.2.0/sequence/network_management/routing/__init__.py +0 -8
- sequence-1.2.0/sequence/qkd/__init__.py +0 -4
- sequence-1.2.0/sequence/resource_management/__init__.py +0 -4
- sequence-1.2.0/sequence/topology/__init__.py +0 -4
- sequence-1.2.0/sequence/utils/__init__.py +0 -3
- {sequence-1.2.0 → sequence-1.3.1}/LICENSE +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/app/app.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/app/random_request.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/app/teleport_app.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/beam_splitter.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/bsm.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/circuit.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/detector.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/fiber_stretcher.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/interferometer.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/light_source.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/mirror.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/optical_channel.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/photon.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/spdc_lens.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/switch.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/transducer.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/components/transmon.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/constants.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/entanglement_protocol.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/generation/__init__.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/generation/barret_kok.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/generation/generation_base.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/generation/generation_message.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/generation/single_heralded.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/purification/__init__.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/purification/bbpssw_bds.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/purification/bbpssw_circuit.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/purification/dejmps_bds.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/purification/purification_protocol.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/swapping/__init__.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/swapping/swapping_base.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/teleportation.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/entity.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/event.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/eventlist.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/process.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_gates.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/__init__.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/utils.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/__init__.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/base.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/bell_diagonal.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/density_matrix.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/free.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/ket_vector.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/stabilizer.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_utils.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/timeline.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/message.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/forwarding.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/memory_timecard.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/routing/routing_base.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/routing/routing_distributed.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/routing/routing_static.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/protocol.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/qkd/BB84.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/qkd/cascade.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/resource_management/action_condition_set.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/resource_management/memory_manager.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/resource_management/rule_manager.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/topology/dqc_net_topo.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/topology/node.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/topology/qkd_topo.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/topology/router_net_topo.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/topology/topology.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/classical_delay.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/config_generator_cli.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/draw_topo.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/encoding.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/graphs.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/log.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/__init__.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/builtins.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/event_types.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/metric_types.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/registry.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/storage.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/noise.py +0 -0
- {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/nx_converter.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sequence
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.1
|
|
4
4
|
Summary: Simulator of QUantum Network Communication (SeQUeNCe) is an open-source tool that allows modeling of quantum networks including photonic network components, control protocols, and applications.
|
|
5
5
|
Keywords: quantum,network,discrete,event,simulator
|
|
6
6
|
Author: Xiaoliang Wu, Joaquin Chung, Alexander Kolar, Alexander Kiefer, Eugene Wang, Tian Zhong, Rajkumar Kettimuthu, Martin Suchara, Robert Hayek, Ansh Singal, Caitao Zhan
|
|
@@ -13,6 +13,7 @@ Requires-Dist: gmpy2>=2.2.2
|
|
|
13
13
|
Requires-Dist: graphviz>=0.21
|
|
14
14
|
Requires-Dist: ipywidgets>=8.1.8
|
|
15
15
|
Requires-Dist: jupyterlab>=4.5.0
|
|
16
|
+
Requires-Dist: lazy-loader>=0.6
|
|
16
17
|
Requires-Dist: matplotlib>=3.10.7
|
|
17
18
|
Requires-Dist: networkx>=3.6.1
|
|
18
19
|
Requires-Dist: numpy>=2.3.5
|
|
@@ -184,6 +185,7 @@ Here is the updated table with the Code column populated:
|
|
|
184
185
|
| 2025 | V. S. Mai et al. | [Towards Optimal Orders for Entanglement Swapping in Path Graphs: A Greedy Approach](https://arxiv.org/abs/2504.14040) | IEEE QCE | |
|
|
185
186
|
| 2024 | C. Howe et al. | [Towards Scalable Quantum Repeater Networks](https://arxiv.org/abs/2409.08416) | arXiv preprint | |
|
|
186
187
|
| 2024 | X. Wu et al. | [Parallel Simulation of Quantum Networks with Distributed Quantum State Management](https://dl.acm.org/doi/abs/10.1145/3634701) | ACM TOMACS | |
|
|
188
|
+
| 2024 | L. Vinci | [Quantum Key Distribution Performance: Extending the Sequence simulator to Estimate the Speed of free-space Optic Links](https://hdl.handle.net/20.500.14247/17332) | Master's Thesis, Ca’ Foscari University of Venice | [GitHub](https://github.com/lcky00/QKD_Simulator) |
|
|
187
189
|
| 2023 | R. Zhou et al. | [A Simulator of Atom-Atom Entanglement with Atomic Ensembles and Quantum Optics](https://doi.org/10.1109/QCE57702.2023.00143) | IEEE QCE | |
|
|
188
190
|
| 2023 | M.G. Davis et al. | [Towards Distributed Quantum Computing by Qubit and Gate Graph Partitioning Techniques](https://doi.org/10.1109/QCE57702.2023.00026) | IEEE QCE | |
|
|
189
191
|
| 2022 | A. Zang et al. | [Simulation of Entanglement Generation between Absorptive Quantum Memories](https://doi.org/10.1109/QCE53715.2022.00084) | IEEE QCE | |
|
|
@@ -148,6 +148,7 @@ Here is the updated table with the Code column populated:
|
|
|
148
148
|
| 2025 | V. S. Mai et al. | [Towards Optimal Orders for Entanglement Swapping in Path Graphs: A Greedy Approach](https://arxiv.org/abs/2504.14040) | IEEE QCE | |
|
|
149
149
|
| 2024 | C. Howe et al. | [Towards Scalable Quantum Repeater Networks](https://arxiv.org/abs/2409.08416) | arXiv preprint | |
|
|
150
150
|
| 2024 | X. Wu et al. | [Parallel Simulation of Quantum Networks with Distributed Quantum State Management](https://dl.acm.org/doi/abs/10.1145/3634701) | ACM TOMACS | |
|
|
151
|
+
| 2024 | L. Vinci | [Quantum Key Distribution Performance: Extending the Sequence simulator to Estimate the Speed of free-space Optic Links](https://hdl.handle.net/20.500.14247/17332) | Master's Thesis, Ca’ Foscari University of Venice | [GitHub](https://github.com/lcky00/QKD_Simulator) |
|
|
151
152
|
| 2023 | R. Zhou et al. | [A Simulator of Atom-Atom Entanglement with Atomic Ensembles and Quantum Optics](https://doi.org/10.1109/QCE57702.2023.00143) | IEEE QCE | |
|
|
152
153
|
| 2023 | M.G. Davis et al. | [Towards Distributed Quantum Computing by Qubit and Gate Graph Partitioning Techniques](https://doi.org/10.1109/QCE57702.2023.00026) | IEEE QCE | |
|
|
153
154
|
| 2022 | A. Zang et al. | [Simulation of Entanglement Generation between Absorptive Quantum Memories](https://doi.org/10.1109/QCE53715.2022.00084) | IEEE QCE | |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sequence"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.3.1"
|
|
4
4
|
license-files = ["LICENSE"]
|
|
5
5
|
description = "Simulator of QUantum Network Communication (SeQUeNCe) is an open-source tool that allows modeling of quantum networks including photonic network components, control protocols, and applications."
|
|
6
6
|
readme = "README.md"
|
|
@@ -22,6 +22,7 @@ dependencies = [
|
|
|
22
22
|
"graphviz>=0.21",
|
|
23
23
|
"ipywidgets>=8.1.8",
|
|
24
24
|
"jupyterlab>=4.5.0",
|
|
25
|
+
"lazy-loader>=0.6",
|
|
25
26
|
"matplotlib>=3.10.7",
|
|
26
27
|
"networkx>=3.6.1",
|
|
27
28
|
"numpy>=2.3.5",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sequence"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.3.1"
|
|
4
4
|
authors = [
|
|
5
5
|
{ name = "Xiaoliang Wu, Joaquin Chung, Alexander Kolar, Alexander Kiefer, Eugene Wang, Tian Zhong, Rajkumar Kettimuthu, Martin Suchara, Robert Hayek, Ansh Singal, Caitao Zhan", email = "czhan@anl.gov" }
|
|
6
6
|
]
|
|
@@ -23,6 +23,7 @@ dependencies = [
|
|
|
23
23
|
"graphviz>=0.21",
|
|
24
24
|
"ipywidgets>=8.1.8",
|
|
25
25
|
"jupyterlab>=4.5.0",
|
|
26
|
+
"lazy-loader>=0.6",
|
|
26
27
|
"matplotlib>=3.10.7",
|
|
27
28
|
"networkx>=3.6.1",
|
|
28
29
|
"numpy>=2.3.5",
|
|
@@ -34,7 +35,7 @@ dependencies = [
|
|
|
34
35
|
"seaborn>=0.13.2",
|
|
35
36
|
"tqdm>=4.67.1",
|
|
36
37
|
"typer>=0.24.1",
|
|
37
|
-
"stim>=1.15"
|
|
38
|
+
"stim>=1.15",
|
|
38
39
|
]
|
|
39
40
|
|
|
40
41
|
[project.scripts]
|
|
@@ -132,4 +133,4 @@ other_allowed_tags = ["chore"]
|
|
|
132
133
|
|
|
133
134
|
default_bump_level = 0
|
|
134
135
|
parse_squash_commits = true
|
|
135
|
-
ignore_merge_commits = true
|
|
136
|
+
ignore_merge_commits = true
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""SeQUeNCe Quantum Network Simulator. Documentation is provided at https://sequence-rtd-tutorial.readthedocs.io/stable/index.html
|
|
2
|
+
|
|
3
|
+
Example usage:
|
|
4
|
+
```
|
|
5
|
+
import sequence as sq
|
|
6
|
+
timeline = sq.Timeline()
|
|
7
|
+
memory = sq.Memory(...)
|
|
8
|
+
```
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
import lazy_loader as lazy
|
|
14
|
+
|
|
15
|
+
__getattr__, __dir__, __all__ = lazy.attach_stub(__name__, __file__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def read_version_from_pyproject() -> str:
|
|
19
|
+
"""Read the project version from a source checkout."""
|
|
20
|
+
pyproject = Path(__file__).resolve().parent.parent / "pyproject.toml"
|
|
21
|
+
if not pyproject.exists():
|
|
22
|
+
return "unknown"
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
import tomllib
|
|
26
|
+
|
|
27
|
+
with pyproject.open("rb") as file:
|
|
28
|
+
return tomllib.load(file)["project"]["version"]
|
|
29
|
+
except (ImportError, KeyError, OSError, TypeError):
|
|
30
|
+
return "unknown"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
__version__ = read_version_from_pyproject()
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
from . import (
|
|
2
|
+
app as app,
|
|
3
|
+
components as components,
|
|
4
|
+
constants as constants,
|
|
5
|
+
entanglement_management as entanglement_management,
|
|
6
|
+
kernel as kernel,
|
|
7
|
+
network_management as network_management,
|
|
8
|
+
qkd as qkd,
|
|
9
|
+
resource_management as resource_management,
|
|
10
|
+
topology as topology,
|
|
11
|
+
utils as utils,
|
|
12
|
+
)
|
|
13
|
+
from .app import (
|
|
14
|
+
App as App,
|
|
15
|
+
RandomRequestApp as RandomRequestApp,
|
|
16
|
+
RequestApp as RequestApp,
|
|
17
|
+
TeleportApp as TeleportApp,
|
|
18
|
+
)
|
|
19
|
+
from .components import (
|
|
20
|
+
AbsorptiveBSM as AbsorptiveBSM,
|
|
21
|
+
AbsorptiveMemory as AbsorptiveMemory,
|
|
22
|
+
BSM as BSM,
|
|
23
|
+
BeamSplitter as BeamSplitter,
|
|
24
|
+
Circuit as Circuit,
|
|
25
|
+
ClassicalChannel as ClassicalChannel,
|
|
26
|
+
Detector as Detector,
|
|
27
|
+
DownConversionProtocol as DownConversionProtocol,
|
|
28
|
+
EmittingProtocol as EmittingProtocol,
|
|
29
|
+
FiberStretcher as FiberStretcher,
|
|
30
|
+
FockBeamSplitter as FockBeamSplitter,
|
|
31
|
+
FockBeamSplitter2 as FockBeamSplitter2,
|
|
32
|
+
FockDetector as FockDetector,
|
|
33
|
+
Interferometer as Interferometer,
|
|
34
|
+
LightSource as LightSource,
|
|
35
|
+
Memory as Memory,
|
|
36
|
+
MemoryArray as MemoryArray,
|
|
37
|
+
MemoryWithRandomCoherenceTime as MemoryWithRandomCoherenceTime,
|
|
38
|
+
Mirror as Mirror,
|
|
39
|
+
OpticalChannel as OpticalChannel,
|
|
40
|
+
Photon as Photon,
|
|
41
|
+
PolarizationBSM as PolarizationBSM,
|
|
42
|
+
QSDetector as QSDetector,
|
|
43
|
+
QSDetectorFockDirect as QSDetectorFockDirect,
|
|
44
|
+
QSDetectorFockInterference as QSDetectorFockInterference,
|
|
45
|
+
QSDetectorPolarization as QSDetectorPolarization,
|
|
46
|
+
QSDetectorTimeBin as QSDetectorTimeBin,
|
|
47
|
+
QuantumChannel as QuantumChannel,
|
|
48
|
+
SPDCLens as SPDCLens,
|
|
49
|
+
SPDCSource as SPDCSource,
|
|
50
|
+
ShellBSM as ShellBSM,
|
|
51
|
+
SingleAtomBSM as SingleAtomBSM,
|
|
52
|
+
SingleHeraldedBSM as SingleHeraldedBSM,
|
|
53
|
+
Switch as Switch,
|
|
54
|
+
TimeBinBSM as TimeBinBSM,
|
|
55
|
+
Transducer as Transducer,
|
|
56
|
+
Transmon as Transmon,
|
|
57
|
+
UpConversionProtocol as UpConversionProtocol,
|
|
58
|
+
make_bsm as make_bsm,
|
|
59
|
+
)
|
|
60
|
+
from .entanglement_management import (
|
|
61
|
+
BBPSSW_BDS as BBPSSW_BDS,
|
|
62
|
+
BBPSSWCircuit as BBPSSWCircuit,
|
|
63
|
+
BBPSSWMessage as BBPSSWMessage,
|
|
64
|
+
BBPSSWMsgType as BBPSSWMsgType,
|
|
65
|
+
BarretKokA as BarretKokA,
|
|
66
|
+
BarretKokB as BarretKokB,
|
|
67
|
+
DEJMPS_BDS as DEJMPS_BDS,
|
|
68
|
+
EntanglementGenerationA as EntanglementGenerationA,
|
|
69
|
+
EntanglementGenerationB as EntanglementGenerationB,
|
|
70
|
+
EntanglementGenerationMessage as EntanglementGenerationMessage,
|
|
71
|
+
EntanglementProtocol as EntanglementProtocol,
|
|
72
|
+
EntanglementSwappingA as EntanglementSwappingA,
|
|
73
|
+
EntanglementSwappingA_BDS as EntanglementSwappingA_BDS,
|
|
74
|
+
EntanglementSwappingA_Circuit as EntanglementSwappingA_Circuit,
|
|
75
|
+
EntanglementSwappingB as EntanglementSwappingB,
|
|
76
|
+
EntanglementSwappingB_BDS as EntanglementSwappingB_BDS,
|
|
77
|
+
EntanglementSwappingB_Circuit as EntanglementSwappingB_Circuit,
|
|
78
|
+
EntanglementSwappingMessage as EntanglementSwappingMessage,
|
|
79
|
+
GenerationMsgType as GenerationMsgType,
|
|
80
|
+
PurificationProtocol as PurificationProtocol,
|
|
81
|
+
SingleHeraldedA as SingleHeraldedA,
|
|
82
|
+
SingleHeraldedB as SingleHeraldedB,
|
|
83
|
+
SwappingMsgType as SwappingMsgType,
|
|
84
|
+
TeleportMessage as TeleportMessage,
|
|
85
|
+
TeleportMsgType as TeleportMsgType,
|
|
86
|
+
TeleportProtocol as TeleportProtocol,
|
|
87
|
+
)
|
|
88
|
+
from .kernel import (
|
|
89
|
+
BellDiagonalState as BellDiagonalState,
|
|
90
|
+
ClassicalEntity as ClassicalEntity,
|
|
91
|
+
DensityState as DensityState,
|
|
92
|
+
Entity as Entity,
|
|
93
|
+
Event as Event,
|
|
94
|
+
EventList as EventList,
|
|
95
|
+
FreeQuantumState as FreeQuantumState,
|
|
96
|
+
KetState as KetState,
|
|
97
|
+
Process as Process,
|
|
98
|
+
QuantumManager as QuantumManager,
|
|
99
|
+
QuantumManagerBellDiagonal as QuantumManagerBellDiagonal,
|
|
100
|
+
QuantumManagerDensity as QuantumManagerDensity,
|
|
101
|
+
QuantumManagerDensityFock as QuantumManagerDensityFock,
|
|
102
|
+
QuantumManagerKet as QuantumManagerKet,
|
|
103
|
+
QuantumManagerStabilizer as QuantumManagerStabilizer,
|
|
104
|
+
StabilizerState as StabilizerState,
|
|
105
|
+
State as State,
|
|
106
|
+
Timeline as Timeline,
|
|
107
|
+
)
|
|
108
|
+
from .message import Message as Message
|
|
109
|
+
from .network_management import (
|
|
110
|
+
DistributedNetworkManager as DistributedNetworkManager,
|
|
111
|
+
DistributedRoutingProtocol as DistributedRoutingProtocol,
|
|
112
|
+
ForwardingMessage as ForwardingMessage,
|
|
113
|
+
ForwardingMessageType as ForwardingMessageType,
|
|
114
|
+
ForwardingProtocol as ForwardingProtocol,
|
|
115
|
+
MemoryTimeCard as MemoryTimeCard,
|
|
116
|
+
NetworkManager as NetworkManager,
|
|
117
|
+
NetworkManagerMessage as NetworkManagerMessage,
|
|
118
|
+
NetworkManagerMsgType as NetworkManagerMsgType,
|
|
119
|
+
QCap as QCap,
|
|
120
|
+
RSVPMessage as RSVPMessage,
|
|
121
|
+
RSVPMsgType as RSVPMsgType,
|
|
122
|
+
RSVPProtocol as RSVPProtocol,
|
|
123
|
+
Reservation as Reservation,
|
|
124
|
+
RoutingProtocol as RoutingProtocol,
|
|
125
|
+
StaticRoutingProtocol as StaticRoutingProtocol,
|
|
126
|
+
)
|
|
127
|
+
from .protocol import Protocol as Protocol, StackProtocol as StackProtocol
|
|
128
|
+
from .qkd import (
|
|
129
|
+
BB84 as BB84,
|
|
130
|
+
BB84Message as BB84Message,
|
|
131
|
+
BB84MsgType as BB84MsgType,
|
|
132
|
+
Cascade as Cascade,
|
|
133
|
+
CascadeMessage as CascadeMessage,
|
|
134
|
+
CascadeMsgType as CascadeMsgType,
|
|
135
|
+
pair_bb84_protocols as pair_bb84_protocols,
|
|
136
|
+
pair_cascade_protocols as pair_cascade_protocols,
|
|
137
|
+
)
|
|
138
|
+
from .resource_management import (
|
|
139
|
+
MemoryInfo as MemoryInfo,
|
|
140
|
+
MemoryManager as MemoryManager,
|
|
141
|
+
ResourceManager as ResourceManager,
|
|
142
|
+
ResourceManagerMessage as ResourceManagerMessage,
|
|
143
|
+
ResourceManagerMsgType as ResourceManagerMsgType,
|
|
144
|
+
Rule as Rule,
|
|
145
|
+
RuleManager as RuleManager,
|
|
146
|
+
)
|
|
147
|
+
from .topology import (
|
|
148
|
+
BSMNode as BSMNode,
|
|
149
|
+
ClassicalNode as ClassicalNode,
|
|
150
|
+
DQCNetTopo as DQCNetTopo,
|
|
151
|
+
DQCNode as DQCNode,
|
|
152
|
+
Node as Node,
|
|
153
|
+
QKDNode as QKDNode,
|
|
154
|
+
QKDTopo as QKDTopo,
|
|
155
|
+
QuantumRouter as QuantumRouter,
|
|
156
|
+
RouterNetTopo as RouterNetTopo,
|
|
157
|
+
Topology as Topology,
|
|
158
|
+
)
|
|
159
|
+
from .utils import (
|
|
160
|
+
encoding as encoding,
|
|
161
|
+
graphs as graphs,
|
|
162
|
+
log as log,
|
|
163
|
+
metrics as metrics,
|
|
164
|
+
nx_converter as nx_converter,
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
__version__: str
|
|
168
|
+
|
|
169
|
+
def read_version_from_pyproject() -> str: ...
|
|
@@ -131,20 +131,20 @@ class RequestApp(App):
|
|
|
131
131
|
info (MemoryInfo): info on the qualified entangled memory.
|
|
132
132
|
"""
|
|
133
133
|
|
|
134
|
-
if info.state != "ENTANGLED":
|
|
134
|
+
if info.state != "ENTANGLED" and info.state != "PURIFIED":
|
|
135
135
|
return
|
|
136
136
|
|
|
137
137
|
if info.index in self.memo_to_reservation:
|
|
138
138
|
reservation = self.memo_to_reservation[info.index]
|
|
139
139
|
valid_fidelity = info.fidelity >= reservation.fidelity
|
|
140
140
|
if info.remote_node == reservation.initiator and valid_fidelity:
|
|
141
|
-
self.node.resource_manager.update(None, info.memory, "RAW")
|
|
142
141
|
metrics.record(EventTypes.DELIVERY, self.node.name, fidelity=info.fidelity, **reservation)
|
|
142
|
+
self.node.resource_manager.update(None, info.memory, "RAW")
|
|
143
143
|
elif info.remote_node == reservation.responder and valid_fidelity:
|
|
144
144
|
self.memory_counter += 1
|
|
145
|
+
metrics.record(EventTypes.DELIVERY, self.node.name, fidelity=info.fidelity, **reservation)
|
|
145
146
|
log.logger.info(f"Successfully generated entanglement. Counter is at {self.memory_counter}.")
|
|
146
147
|
self.node.resource_manager.update(None, info.memory, "RAW")
|
|
147
|
-
metrics.record(EventTypes.DELIVERY, self.node.name, fidelity=info.fidelity, **reservation)
|
|
148
148
|
|
|
149
149
|
def get_throughput(self) -> float:
|
|
150
150
|
warnings.warn("get_throughput is deprecated and will be removed in a future release, "
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from .beam_splitter import (
|
|
2
|
+
BeamSplitter as BeamSplitter,
|
|
3
|
+
FockBeamSplitter as FockBeamSplitter,
|
|
4
|
+
FockBeamSplitter2 as FockBeamSplitter2,
|
|
5
|
+
)
|
|
6
|
+
from .bsm import (
|
|
7
|
+
AbsorptiveBSM as AbsorptiveBSM,
|
|
8
|
+
BSM as BSM,
|
|
9
|
+
PolarizationBSM as PolarizationBSM,
|
|
10
|
+
ShellBSM as ShellBSM,
|
|
11
|
+
SingleAtomBSM as SingleAtomBSM,
|
|
12
|
+
SingleHeraldedBSM as SingleHeraldedBSM,
|
|
13
|
+
TimeBinBSM as TimeBinBSM,
|
|
14
|
+
make_bsm as make_bsm,
|
|
15
|
+
)
|
|
16
|
+
from .circuit import Circuit as Circuit
|
|
17
|
+
from .detector import (
|
|
18
|
+
Detector as Detector,
|
|
19
|
+
FockDetector as FockDetector,
|
|
20
|
+
QSDetector as QSDetector,
|
|
21
|
+
QSDetectorFockDirect as QSDetectorFockDirect,
|
|
22
|
+
QSDetectorFockInterference as QSDetectorFockInterference,
|
|
23
|
+
QSDetectorPolarization as QSDetectorPolarization,
|
|
24
|
+
QSDetectorTimeBin as QSDetectorTimeBin,
|
|
25
|
+
)
|
|
26
|
+
from .fiber_stretcher import FiberStretcher as FiberStretcher
|
|
27
|
+
from .interferometer import Interferometer as Interferometer
|
|
28
|
+
from .light_source import LightSource as LightSource, SPDCSource as SPDCSource
|
|
29
|
+
from .memory import (
|
|
30
|
+
AbsorptiveMemory as AbsorptiveMemory,
|
|
31
|
+
Memory as Memory,
|
|
32
|
+
MemoryArray as MemoryArray,
|
|
33
|
+
MemoryWithRandomCoherenceTime as MemoryWithRandomCoherenceTime,
|
|
34
|
+
)
|
|
35
|
+
from .mirror import Mirror as Mirror
|
|
36
|
+
from .optical_channel import (
|
|
37
|
+
ClassicalChannel as ClassicalChannel,
|
|
38
|
+
OpticalChannel as OpticalChannel,
|
|
39
|
+
QuantumChannel as QuantumChannel,
|
|
40
|
+
)
|
|
41
|
+
from .photon import Photon as Photon
|
|
42
|
+
from .spdc_lens import SPDCLens as SPDCLens
|
|
43
|
+
from .switch import Switch as Switch
|
|
44
|
+
from .transducer import (
|
|
45
|
+
DownConversionProtocol as DownConversionProtocol,
|
|
46
|
+
Transducer as Transducer,
|
|
47
|
+
UpConversionProtocol as UpConversionProtocol,
|
|
48
|
+
)
|
|
49
|
+
from .transmon import EmittingProtocol as EmittingProtocol, Transmon as Transmon
|
|
@@ -333,7 +333,10 @@ class Memory(Entity):
|
|
|
333
333
|
def reset(self) -> None:
|
|
334
334
|
"""Method to clear quantum memory.
|
|
335
335
|
|
|
336
|
-
|
|
336
|
+
Discard the state from any joint state first, otherwise the remote memories sharing it keep a
|
|
337
|
+
stale reference to this key and a later operation on them resurrects the discarded qubit.
|
|
338
|
+
|
|
339
|
+
Then reset quantum state to |0> and will clear entanglement information.
|
|
337
340
|
|
|
338
341
|
Side Effects:
|
|
339
342
|
Will modify internal parameters and quantum state.
|
|
@@ -343,6 +346,7 @@ class Memory(Entity):
|
|
|
343
346
|
self.generation_time = -1
|
|
344
347
|
self.last_update_time = -1
|
|
345
348
|
|
|
349
|
+
self.timeline.quantum_manager.discard(self.qstate_key, self.get_generator().random())
|
|
346
350
|
self.timeline.quantum_manager.set([self.qstate_key], [complex(1), complex(0)])
|
|
347
351
|
self.entangled_memory = {'node_id': None, 'memo_id': None}
|
|
348
352
|
if self.expiration_event is not None:
|
|
@@ -360,6 +364,7 @@ class Memory(Entity):
|
|
|
360
364
|
May schedule expiration event.
|
|
361
365
|
"""
|
|
362
366
|
|
|
367
|
+
self.timeline.quantum_manager.discard(self.qstate_key, self.get_generator().random())
|
|
363
368
|
self.timeline.quantum_manager.set([self.qstate_key], state)
|
|
364
369
|
self.previous_bsm = -1
|
|
365
370
|
self.entangled_memory = {'node_id': None, 'memo_id': None}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from .entanglement_protocol import EntanglementProtocol as EntanglementProtocol
|
|
2
|
+
from .generation import (
|
|
3
|
+
BarretKokA as BarretKokA,
|
|
4
|
+
BarretKokB as BarretKokB,
|
|
5
|
+
EntanglementGenerationA as EntanglementGenerationA,
|
|
6
|
+
EntanglementGenerationB as EntanglementGenerationB,
|
|
7
|
+
EntanglementGenerationMessage as EntanglementGenerationMessage,
|
|
8
|
+
GenerationMsgType as GenerationMsgType,
|
|
9
|
+
SingleHeraldedA as SingleHeraldedA,
|
|
10
|
+
SingleHeraldedB as SingleHeraldedB,
|
|
11
|
+
)
|
|
12
|
+
from .purification import (
|
|
13
|
+
BBPSSW_BDS as BBPSSW_BDS,
|
|
14
|
+
BBPSSWCircuit as BBPSSWCircuit,
|
|
15
|
+
BBPSSWMessage as BBPSSWMessage,
|
|
16
|
+
BBPSSWMsgType as BBPSSWMsgType,
|
|
17
|
+
DEJMPS_BDS as DEJMPS_BDS,
|
|
18
|
+
PurificationProtocol as PurificationProtocol,
|
|
19
|
+
)
|
|
20
|
+
from .swapping import (
|
|
21
|
+
EntanglementSwappingA as EntanglementSwappingA,
|
|
22
|
+
EntanglementSwappingA_BDS as EntanglementSwappingA_BDS,
|
|
23
|
+
EntanglementSwappingA_Circuit as EntanglementSwappingA_Circuit,
|
|
24
|
+
EntanglementSwappingB as EntanglementSwappingB,
|
|
25
|
+
EntanglementSwappingB_BDS as EntanglementSwappingB_BDS,
|
|
26
|
+
EntanglementSwappingB_Circuit as EntanglementSwappingB_Circuit,
|
|
27
|
+
EntanglementSwappingMessage as EntanglementSwappingMessage,
|
|
28
|
+
SwappingMsgType as SwappingMsgType,
|
|
29
|
+
)
|
|
30
|
+
from .teleportation import (
|
|
31
|
+
TeleportMessage as TeleportMessage,
|
|
32
|
+
TeleportMsgType as TeleportMsgType,
|
|
33
|
+
TeleportProtocol as TeleportProtocol
|
|
34
|
+
)
|
|
@@ -89,13 +89,8 @@ class EntanglementSwappingA_BDS(EntanglementSwappingA):
|
|
|
89
89
|
# get BDS conditioned on success, fidelity is the first diagonal element
|
|
90
90
|
new_bds = self.swapping_res()
|
|
91
91
|
fidelity = new_bds[0]
|
|
92
|
-
metrics.record(
|
|
93
|
-
|
|
94
|
-
self.owner.name,
|
|
95
|
-
left_node=self.left_node,
|
|
96
|
-
right_node=self.right_node,
|
|
97
|
-
fidelity=fidelity,
|
|
98
|
-
)
|
|
92
|
+
metrics.record(EventTypes.ES_SUCCESS, self.owner.name, left_node=self.left_node,
|
|
93
|
+
right_node=self.right_node, fidelity=fidelity)
|
|
99
94
|
keys = [left_remote_memory.qstate_key, right_remote_memory.qstate_key]
|
|
100
95
|
self.owner.timeline.quantum_manager.set(keys, new_bds)
|
|
101
96
|
|
|
@@ -115,12 +110,7 @@ class EntanglementSwappingA_BDS(EntanglementSwappingA):
|
|
|
115
110
|
meas_res=[])
|
|
116
111
|
else:
|
|
117
112
|
log.logger.info(f'{self.owner.name} Swapping failed!')
|
|
118
|
-
metrics.record(
|
|
119
|
-
EventTypes.ES_FAILURE,
|
|
120
|
-
self.owner.name,
|
|
121
|
-
left_node=self.left_node,
|
|
122
|
-
right_node=self.right_node,
|
|
123
|
-
)
|
|
113
|
+
metrics.record(EventTypes.ES_FAILURE, self.owner.name, left_node=self.left_node, right_node=self.right_node)
|
|
124
114
|
msg_l = EntanglementSwappingMessage(SwappingMsgType.SWAP_RES, self.left_protocol_name, fidelity=0)
|
|
125
115
|
msg_r = EntanglementSwappingMessage(SwappingMsgType.SWAP_RES, self.right_protocol_name, fidelity=0)
|
|
126
116
|
|
{sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/swapping/swapping_circuit.py
RENAMED
|
@@ -85,13 +85,8 @@ class EntanglementSwappingA_Circuit(EntanglementSwappingA):
|
|
|
85
85
|
if self.owner.get_generator().random() < self.success_probability():
|
|
86
86
|
# swapping succeeded
|
|
87
87
|
fidelity = self.updated_fidelity(self.left_memo.fidelity, self.right_memo.fidelity)
|
|
88
|
-
metrics.record(
|
|
89
|
-
|
|
90
|
-
self.owner.name,
|
|
91
|
-
left_node=self.left_node,
|
|
92
|
-
right_node=self.right_node,
|
|
93
|
-
fidelity=fidelity,
|
|
94
|
-
)
|
|
88
|
+
metrics.record(EventTypes.ES_SUCCESS, self.owner.name, left_node=self.left_node,
|
|
89
|
+
right_node=self.right_node, fidelity=fidelity)
|
|
95
90
|
self.is_success = True
|
|
96
91
|
|
|
97
92
|
expire_time = min(self.left_memo.get_expire_time(), self.right_memo.get_expire_time())
|
|
@@ -116,12 +111,7 @@ class EntanglementSwappingA_Circuit(EntanglementSwappingA):
|
|
|
116
111
|
else:
|
|
117
112
|
# swapping failed
|
|
118
113
|
log.logger.info(f"{self.name} swapping failed")
|
|
119
|
-
metrics.record(
|
|
120
|
-
EventTypes.ES_FAILURE,
|
|
121
|
-
self.owner.name,
|
|
122
|
-
left_node=self.left_node,
|
|
123
|
-
right_node=self.right_node,
|
|
124
|
-
)
|
|
114
|
+
metrics.record(EventTypes.ES_FAILURE, self.owner.name, left_node=self.left_node, right_node=self.right_node)
|
|
125
115
|
msg_l = EntanglementSwappingMessage(SwappingMsgType.SWAP_RES,self.left_protocol_name, fidelity=0)
|
|
126
116
|
msg_r = EntanglementSwappingMessage(SwappingMsgType.SWAP_RES, self.right_protocol_name, fidelity=0)
|
|
127
117
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from .entity import ClassicalEntity as ClassicalEntity, Entity as Entity
|
|
2
|
+
from .event import Event as Event
|
|
3
|
+
from .eventlist import EventList as EventList
|
|
4
|
+
from .process import Process as Process
|
|
5
|
+
from .quantum_manager import (
|
|
6
|
+
QuantumManager as QuantumManager,
|
|
7
|
+
QuantumManagerBellDiagonal as QuantumManagerBellDiagonal,
|
|
8
|
+
QuantumManagerDensity as QuantumManagerDensity,
|
|
9
|
+
QuantumManagerDensityFock as QuantumManagerDensityFock,
|
|
10
|
+
QuantumManagerKet as QuantumManagerKet,
|
|
11
|
+
QuantumManagerStabilizer as QuantumManagerStabilizer,
|
|
12
|
+
)
|
|
13
|
+
from .quantum_state import (
|
|
14
|
+
BellDiagonalState as BellDiagonalState,
|
|
15
|
+
DensityState as DensityState,
|
|
16
|
+
FreeQuantumState as FreeQuantumState,
|
|
17
|
+
KetState as KetState,
|
|
18
|
+
StabilizerState as StabilizerState,
|
|
19
|
+
State as State,
|
|
20
|
+
)
|
|
21
|
+
from .timeline import Timeline as Timeline
|
|
@@ -125,7 +125,23 @@ class QuantumManager(ABC):
|
|
|
125
125
|
keys (list[int]): key(s) of state(s) to change.
|
|
126
126
|
state (Any): State payload to assign, type determined by type of subclass.
|
|
127
127
|
"""
|
|
128
|
+
pass
|
|
129
|
+
|
|
130
|
+
@abstractmethod
|
|
131
|
+
def discard(self, key: int, meas_samp: float | None = None) -> None:
|
|
132
|
+
"""Discard a key from any joint quantum state while updating the remaining subsystem according to the
|
|
133
|
+
quantum formalism. Discarding a subsystem of the quantum state.
|
|
128
134
|
|
|
135
|
+
`set` only rebinds the keys it is given. When a key that belongs to a multi-qubit
|
|
136
|
+
state is rebound on its own, the remaining keys keep a stale reference to it and a
|
|
137
|
+
later operation on any of them will silently pull the discarded key back in.
|
|
138
|
+
Formalisms that group keys into a shared state object must override this method to
|
|
139
|
+
remove `key` from its group before the caller rebinds it.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
key (int): key to discard from its joint state.
|
|
143
|
+
meas_samp (float | None): random sample in [0, 1) used if discarding requires a collapse.
|
|
144
|
+
"""
|
|
129
145
|
pass
|
|
130
146
|
|
|
131
147
|
def remove(self, key: int) -> None:
|
|
@@ -64,3 +64,19 @@ class QuantumManagerBellDiagonal(QuantumManager):
|
|
|
64
64
|
|
|
65
65
|
def set_to_noiseless(self, keys: list[int]):
|
|
66
66
|
self.set(keys, [float(1), float(0), float(0), float(0)])
|
|
67
|
+
|
|
68
|
+
def discard(self, key: int, meas_samp: float | None = None) -> None:
|
|
69
|
+
"""Discard a quantum state from the manager.
|
|
70
|
+
|
|
71
|
+
Note:
|
|
72
|
+
`meas_samp` is intentionally unused in the Bell diagonal formalism. Kept for interface compatibility.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
key (int): key to discard from the quantum manager.
|
|
76
|
+
meas_samp (float | None): unused.
|
|
77
|
+
"""
|
|
78
|
+
state = self.states.get(key)
|
|
79
|
+
if state is None:
|
|
80
|
+
return
|
|
81
|
+
if key in state.keys:
|
|
82
|
+
self.states.pop(key)
|
|
@@ -132,6 +132,33 @@ class QuantumManagerDensity(QuantumManager):
|
|
|
132
132
|
"""
|
|
133
133
|
self.set([key], [[complex(0), complex(0)], [complex(0), complex(1)]])
|
|
134
134
|
|
|
135
|
+
def discard(self, key: int, meas_samp: float | None = None) -> None:
|
|
136
|
+
"""Discard a key from its joint state by tracing it out.
|
|
137
|
+
|
|
138
|
+
A density matrix represents the reduced state of the remaining qubits exactly,
|
|
139
|
+
so no collapse is needed here.
|
|
140
|
+
|
|
141
|
+
Note:
|
|
142
|
+
`meas_samp` is intentionally unused in the density matrix formalism. Kept for interface compatibility.
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
key (int): key to detach from its joint state.
|
|
146
|
+
meas_samp (float | None): unused.
|
|
147
|
+
"""
|
|
148
|
+
state = self.states.get(key)
|
|
149
|
+
if state is None or len(state.keys) <= 1:
|
|
150
|
+
return
|
|
151
|
+
|
|
152
|
+
all_keys = state.keys
|
|
153
|
+
index = all_keys.index(key)
|
|
154
|
+
num_qubits = len(all_keys)
|
|
155
|
+
tensor = np.asarray(state.state, dtype=complex).reshape((2,) * (2 * num_qubits))
|
|
156
|
+
reduced = np.trace(tensor, axis1=index, axis2=num_qubits + index)
|
|
157
|
+
reduced = reduced.reshape(2 ** (num_qubits - 1), 2 ** (num_qubits - 1))
|
|
158
|
+
|
|
159
|
+
rem_keys = [k for k in all_keys if k != key]
|
|
160
|
+
self.set(rem_keys, reduced)
|
|
161
|
+
|
|
135
162
|
def get_ascending_keys(self, key: int) -> DensityState:
|
|
136
163
|
"""Method to get quantum state stored at an index.
|
|
137
164
|
Reorders qubits (in-place) in ascending order of keys before returning.
|
|
@@ -312,3 +312,6 @@ class QuantumManagerDensityFock(QuantumManager):
|
|
|
312
312
|
output_state += kraus_op @ prepared_state @ kraus_op.conj().T
|
|
313
313
|
|
|
314
314
|
self.set(all_keys, output_state)
|
|
315
|
+
|
|
316
|
+
def discard(self, key: int, meas_samp: float | None = None) -> None:
|
|
317
|
+
raise NotImplementedError("discard() is not implemented for QuantumManagerDensityFock")
|
|
@@ -131,6 +131,24 @@ class QuantumManagerKet(QuantumManager):
|
|
|
131
131
|
for key in keys:
|
|
132
132
|
self.states[key] = new_state
|
|
133
133
|
|
|
134
|
+
def discard(self, key: int, meas_samp: float | None = None) -> None:
|
|
135
|
+
"""Discard a key from its joint state by collapsing it in the computational basis.
|
|
136
|
+
|
|
137
|
+
A ket vector cannot represent the mixed state left on the other qubits by simply
|
|
138
|
+
discarding one of them, so the discarded qubit is measured. The remaining keys
|
|
139
|
+
receive the normalized post-measurement branch and no longer reference `key`.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
key (int): key to discard from its joint state.
|
|
143
|
+
meas_samp (float | None): random sample in [0, 1) selecting the collapse outcome.
|
|
144
|
+
"""
|
|
145
|
+
state = self.states.get(key)
|
|
146
|
+
if state is None or len(state.keys) <= 1:
|
|
147
|
+
return
|
|
148
|
+
if meas_samp is None:
|
|
149
|
+
raise ValueError("meas_samp is required to separate a key from a joint state.")
|
|
150
|
+
self._measure(state.state, [key], state.keys, meas_samp)
|
|
151
|
+
|
|
134
152
|
def get_ascending_keys(self, key: int) -> KetState:
|
|
135
153
|
"""Method to get quantum state stored at an index.
|
|
136
154
|
Reorders qubits (in-place) in ascending order of keys before returning.
|