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.
Files changed (132) hide show
  1. {sequence-1.2.0 → sequence-1.3.1}/PKG-INFO +3 -1
  2. {sequence-1.2.0 → sequence-1.3.1}/README.md +1 -0
  3. {sequence-1.2.0 → sequence-1.3.1}/pyproject.toml +2 -1
  4. {sequence-1.2.0 → sequence-1.3.1}/pyproject.toml.orig +4 -3
  5. sequence-1.3.1/sequence/__init__.py +33 -0
  6. sequence-1.3.1/sequence/__init__.pyi +169 -0
  7. sequence-1.3.1/sequence/app/__init__.py +5 -0
  8. sequence-1.3.1/sequence/app/__init__.pyi +4 -0
  9. {sequence-1.2.0 → sequence-1.3.1}/sequence/app/request_app.py +3 -3
  10. sequence-1.3.1/sequence/components/__init__.py +5 -0
  11. sequence-1.3.1/sequence/components/__init__.pyi +49 -0
  12. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/memory.py +6 -1
  13. sequence-1.3.1/sequence/entanglement_management/__init__.py +5 -0
  14. sequence-1.3.1/sequence/entanglement_management/__init__.pyi +34 -0
  15. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/swapping/swapping_bds.py +3 -13
  16. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/swapping/swapping_circuit.py +3 -13
  17. sequence-1.3.1/sequence/kernel/__init__.py +5 -0
  18. sequence-1.3.1/sequence/kernel/__init__.pyi +21 -0
  19. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/base.py +16 -0
  20. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/bell_diagonal.py +16 -0
  21. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/density_matrix.py +27 -0
  22. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/fock_density_matrix.py +3 -0
  23. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/ket_vector.py +18 -0
  24. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/stabilizer.py +18 -0
  25. sequence-1.3.1/sequence/network_management/__init__.py +5 -0
  26. sequence-1.3.1/sequence/network_management/__init__.pyi +24 -0
  27. {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/network_manager.py +3 -27
  28. {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/reservation.py +3 -2
  29. sequence-1.3.1/sequence/network_management/routing/__init__.py +11 -0
  30. {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/rsvp.py +5 -18
  31. sequence-1.3.1/sequence/py.typed +0 -0
  32. sequence-1.3.1/sequence/qkd/__init__.py +5 -0
  33. sequence-1.3.1/sequence/qkd/__init__.pyi +12 -0
  34. sequence-1.3.1/sequence/resource_management/__init__.py +5 -0
  35. sequence-1.3.1/sequence/resource_management/__init__.pyi +7 -0
  36. sequence-1.3.1/sequence/resource_management/reservation_rule_registry.py +347 -0
  37. {sequence-1.2.0 → sequence-1.3.1}/sequence/resource_management/resource_manager.py +58 -109
  38. sequence-1.3.1/sequence/topology/__init__.py +5 -0
  39. sequence-1.3.1/sequence/topology/__init__.pyi +12 -0
  40. sequence-1.3.1/sequence/utils/__init__.py +5 -0
  41. sequence-1.3.1/sequence/utils/__init__.pyi +7 -0
  42. sequence-1.2.0/sequence/__init__.py +0 -27
  43. sequence-1.2.0/sequence/app/__init__.py +0 -5
  44. sequence-1.2.0/sequence/components/__init__.py +0 -5
  45. sequence-1.2.0/sequence/entanglement_management/__init__.py +0 -4
  46. sequence-1.2.0/sequence/kernel/__init__.py +0 -5
  47. sequence-1.2.0/sequence/network_management/__init__.py +0 -4
  48. sequence-1.2.0/sequence/network_management/routing/__init__.py +0 -8
  49. sequence-1.2.0/sequence/qkd/__init__.py +0 -4
  50. sequence-1.2.0/sequence/resource_management/__init__.py +0 -4
  51. sequence-1.2.0/sequence/topology/__init__.py +0 -4
  52. sequence-1.2.0/sequence/utils/__init__.py +0 -3
  53. {sequence-1.2.0 → sequence-1.3.1}/LICENSE +0 -0
  54. {sequence-1.2.0 → sequence-1.3.1}/sequence/app/app.py +0 -0
  55. {sequence-1.2.0 → sequence-1.3.1}/sequence/app/random_request.py +0 -0
  56. {sequence-1.2.0 → sequence-1.3.1}/sequence/app/teleport_app.py +0 -0
  57. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/beam_splitter.py +0 -0
  58. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/bsm.py +0 -0
  59. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/circuit.py +0 -0
  60. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/detector.py +0 -0
  61. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/fiber_stretcher.py +0 -0
  62. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/interferometer.py +0 -0
  63. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/light_source.py +0 -0
  64. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/mirror.py +0 -0
  65. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/optical_channel.py +0 -0
  66. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/photon.py +0 -0
  67. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/spdc_lens.py +0 -0
  68. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/switch.py +0 -0
  69. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/transducer.py +0 -0
  70. {sequence-1.2.0 → sequence-1.3.1}/sequence/components/transmon.py +0 -0
  71. {sequence-1.2.0 → sequence-1.3.1}/sequence/constants.py +0 -0
  72. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/entanglement_protocol.py +0 -0
  73. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/generation/__init__.py +0 -0
  74. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/generation/barret_kok.py +0 -0
  75. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/generation/generation_base.py +0 -0
  76. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/generation/generation_message.py +0 -0
  77. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/generation/single_heralded.py +0 -0
  78. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/purification/__init__.py +0 -0
  79. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/purification/bbpssw_bds.py +0 -0
  80. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/purification/bbpssw_circuit.py +0 -0
  81. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/purification/dejmps_bds.py +0 -0
  82. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/purification/purification_protocol.py +0 -0
  83. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/swapping/__init__.py +0 -0
  84. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/swapping/swapping_base.py +0 -0
  85. {sequence-1.2.0 → sequence-1.3.1}/sequence/entanglement_management/teleportation.py +0 -0
  86. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/entity.py +0 -0
  87. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/event.py +0 -0
  88. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/eventlist.py +0 -0
  89. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/process.py +0 -0
  90. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_gates.py +0 -0
  91. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/__init__.py +0 -0
  92. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_manager/utils.py +0 -0
  93. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/__init__.py +0 -0
  94. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/base.py +0 -0
  95. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/bell_diagonal.py +0 -0
  96. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/density_matrix.py +0 -0
  97. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/free.py +0 -0
  98. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/ket_vector.py +0 -0
  99. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_state/stabilizer.py +0 -0
  100. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/quantum_utils.py +0 -0
  101. {sequence-1.2.0 → sequence-1.3.1}/sequence/kernel/timeline.py +0 -0
  102. {sequence-1.2.0 → sequence-1.3.1}/sequence/message.py +0 -0
  103. {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/forwarding.py +0 -0
  104. {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/memory_timecard.py +0 -0
  105. {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/routing/routing_base.py +0 -0
  106. {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/routing/routing_distributed.py +0 -0
  107. {sequence-1.2.0 → sequence-1.3.1}/sequence/network_management/routing/routing_static.py +0 -0
  108. {sequence-1.2.0 → sequence-1.3.1}/sequence/protocol.py +0 -0
  109. {sequence-1.2.0 → sequence-1.3.1}/sequence/qkd/BB84.py +0 -0
  110. {sequence-1.2.0 → sequence-1.3.1}/sequence/qkd/cascade.py +0 -0
  111. {sequence-1.2.0 → sequence-1.3.1}/sequence/resource_management/action_condition_set.py +0 -0
  112. {sequence-1.2.0 → sequence-1.3.1}/sequence/resource_management/memory_manager.py +0 -0
  113. {sequence-1.2.0 → sequence-1.3.1}/sequence/resource_management/rule_manager.py +0 -0
  114. {sequence-1.2.0 → sequence-1.3.1}/sequence/topology/dqc_net_topo.py +0 -0
  115. {sequence-1.2.0 → sequence-1.3.1}/sequence/topology/node.py +0 -0
  116. {sequence-1.2.0 → sequence-1.3.1}/sequence/topology/qkd_topo.py +0 -0
  117. {sequence-1.2.0 → sequence-1.3.1}/sequence/topology/router_net_topo.py +0 -0
  118. {sequence-1.2.0 → sequence-1.3.1}/sequence/topology/topology.py +0 -0
  119. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/classical_delay.py +0 -0
  120. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/config_generator_cli.py +0 -0
  121. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/draw_topo.py +0 -0
  122. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/encoding.py +0 -0
  123. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/graphs.py +0 -0
  124. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/log.py +0 -0
  125. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/__init__.py +0 -0
  126. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/builtins.py +0 -0
  127. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/event_types.py +0 -0
  128. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/metric_types.py +0 -0
  129. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/registry.py +0 -0
  130. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/metrics/storage.py +0 -0
  131. {sequence-1.2.0 → sequence-1.3.1}/sequence/utils/noise.py +0 -0
  132. {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.2.0
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.2.0"
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.2.0"
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: ...
@@ -0,0 +1,5 @@
1
+ """Applications supplied with SeQUeNCe."""
2
+
3
+ import lazy_loader as lazy
4
+
5
+ __getattr__, __dir__, __all__ = lazy.attach_stub(__name__, __file__)
@@ -0,0 +1,4 @@
1
+ from .app import App as App
2
+ from .random_request import RandomRequestApp as RandomRequestApp
3
+ from .request_app import RequestApp as RequestApp
4
+ from .teleport_app import TeleportApp as TeleportApp
@@ -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,5 @@
1
+ """Public hardware components for quantum-network simulations."""
2
+
3
+ import lazy_loader as lazy
4
+
5
+ __getattr__, __dir__, __all__ = lazy.attach_stub(__name__, __file__)
@@ -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
- Will reset quantum state to |0> and will clear entanglement information.
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,5 @@
1
+ """Entanglement generation, purification, swapping, and teleportation."""
2
+
3
+ import lazy_loader as lazy
4
+
5
+ __getattr__, __dir__, __all__ = lazy.attach_stub(__name__, __file__)
@@ -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
- EventTypes.ES_SUCCESS,
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
 
@@ -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
- EventTypes.ES_SUCCESS,
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,5 @@
1
+ """Core simulation primitives and quantum-state management."""
2
+
3
+ import lazy_loader as lazy
4
+
5
+ __getattr__, __dir__, __all__ = lazy.attach_stub(__name__, __file__)
@@ -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.