qoro-divi 0.3.3__py3-none-any.whl → 0.3.5__py3-none-any.whl

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.

Potentially problematic release.


This version of qoro-divi might be problematic. Click here for more details.

Files changed (74) hide show
  1. divi/__init__.py +1 -2
  2. divi/backends/__init__.py +7 -0
  3. divi/backends/_circuit_runner.py +46 -0
  4. divi/{parallel_simulator.py → backends/_parallel_simulator.py} +136 -53
  5. divi/backends/_qoro_service.py +531 -0
  6. divi/circuits/__init__.py +5 -0
  7. divi/circuits/_core.py +226 -0
  8. divi/{qasm.py → circuits/qasm.py} +21 -2
  9. divi/{exp → extern}/cirq/_validator.py +9 -7
  10. divi/qprog/__init__.py +18 -5
  11. divi/qprog/algorithms/__init__.py +14 -0
  12. divi/qprog/algorithms/_ansatze.py +311 -0
  13. divi/qprog/{_qaoa.py → algorithms/_qaoa.py} +69 -41
  14. divi/qprog/{_vqe.py → algorithms/_vqe.py} +79 -135
  15. divi/qprog/batch.py +239 -55
  16. divi/qprog/exceptions.py +9 -0
  17. divi/qprog/optimizers.py +219 -18
  18. divi/qprog/quantum_program.py +389 -57
  19. divi/qprog/workflows/__init__.py +10 -0
  20. divi/qprog/{_graph_partitioning.py → workflows/_graph_partitioning.py} +3 -34
  21. divi/qprog/{_qubo_partitioning.py → workflows/_qubo_partitioning.py} +42 -25
  22. divi/qprog/{_vqe_sweep.py → workflows/_vqe_sweep.py} +59 -26
  23. divi/reporting/__init__.py +7 -0
  24. divi/reporting/_pbar.py +112 -0
  25. divi/{qlogger.py → reporting/_qlogger.py} +37 -2
  26. divi/{reporter.py → reporting/_reporter.py} +8 -14
  27. divi/utils.py +49 -10
  28. {qoro_divi-0.3.3.dist-info → qoro_divi-0.3.5.dist-info}/METADATA +2 -1
  29. qoro_divi-0.3.5.dist-info/RECORD +69 -0
  30. divi/_pbar.py +0 -70
  31. divi/circuits.py +0 -139
  32. divi/interfaces.py +0 -25
  33. divi/qoro_service.py +0 -425
  34. qoro_divi-0.3.3.dist-info/RECORD +0 -62
  35. /divi/{qpu_system.py → backends/_qpu_system.py} +0 -0
  36. /divi/{qem.py → circuits/qem.py} +0 -0
  37. /divi/{exp → extern}/cirq/__init__.py +0 -0
  38. /divi/{exp → extern}/cirq/_lexer.py +0 -0
  39. /divi/{exp → extern}/cirq/_parser.py +0 -0
  40. /divi/{exp → extern}/cirq/_qasm_export.py +0 -0
  41. /divi/{exp → extern}/cirq/_qasm_import.py +0 -0
  42. /divi/{exp → extern}/cirq/exception.py +0 -0
  43. /divi/{exp → extern}/scipy/_cobyla.py +0 -0
  44. /divi/{exp → extern}/scipy/pyprima/LICENCE.txt +0 -0
  45. /divi/{exp → extern}/scipy/pyprima/__init__.py +0 -0
  46. /divi/{exp → extern}/scipy/pyprima/cobyla/__init__.py +0 -0
  47. /divi/{exp → extern}/scipy/pyprima/cobyla/cobyla.py +0 -0
  48. /divi/{exp → extern}/scipy/pyprima/cobyla/cobylb.py +0 -0
  49. /divi/{exp → extern}/scipy/pyprima/cobyla/geometry.py +0 -0
  50. /divi/{exp → extern}/scipy/pyprima/cobyla/initialize.py +0 -0
  51. /divi/{exp → extern}/scipy/pyprima/cobyla/trustregion.py +0 -0
  52. /divi/{exp → extern}/scipy/pyprima/cobyla/update.py +0 -0
  53. /divi/{exp → extern}/scipy/pyprima/common/__init__.py +0 -0
  54. /divi/{exp → extern}/scipy/pyprima/common/_bounds.py +0 -0
  55. /divi/{exp → extern}/scipy/pyprima/common/_linear_constraints.py +0 -0
  56. /divi/{exp → extern}/scipy/pyprima/common/_nonlinear_constraints.py +0 -0
  57. /divi/{exp → extern}/scipy/pyprima/common/_project.py +0 -0
  58. /divi/{exp → extern}/scipy/pyprima/common/checkbreak.py +0 -0
  59. /divi/{exp → extern}/scipy/pyprima/common/consts.py +0 -0
  60. /divi/{exp → extern}/scipy/pyprima/common/evaluate.py +0 -0
  61. /divi/{exp → extern}/scipy/pyprima/common/history.py +0 -0
  62. /divi/{exp → extern}/scipy/pyprima/common/infos.py +0 -0
  63. /divi/{exp → extern}/scipy/pyprima/common/linalg.py +0 -0
  64. /divi/{exp → extern}/scipy/pyprima/common/message.py +0 -0
  65. /divi/{exp → extern}/scipy/pyprima/common/powalg.py +0 -0
  66. /divi/{exp → extern}/scipy/pyprima/common/preproc.py +0 -0
  67. /divi/{exp → extern}/scipy/pyprima/common/present.py +0 -0
  68. /divi/{exp → extern}/scipy/pyprima/common/ratio.py +0 -0
  69. /divi/{exp → extern}/scipy/pyprima/common/redrho.py +0 -0
  70. /divi/{exp → extern}/scipy/pyprima/common/selectx.py +0 -0
  71. {qoro_divi-0.3.3.dist-info → qoro_divi-0.3.5.dist-info}/LICENSE +0 -0
  72. {qoro_divi-0.3.3.dist-info → qoro_divi-0.3.5.dist-info}/LICENSES/.license-header +0 -0
  73. {qoro_divi-0.3.3.dist-info → qoro_divi-0.3.5.dist-info}/LICENSES/Apache-2.0.txt +0 -0
  74. {qoro_divi-0.3.3.dist-info → qoro_divi-0.3.5.dist-info}/WHEEL +0 -0
@@ -0,0 +1,69 @@
1
+ divi/__init__.py,sha256=SyBWflbDS6qGEtHg-AfzD1TRNgfXoW2H5qTYGJ-W3XQ,167
2
+ divi/backends/__init__.py,sha256=1S3EJH5XXou2s7EnZowhfI4b3u3zLUG05x7etj4W-IM,264
3
+ divi/backends/_circuit_runner.py,sha256=RlVEPQtn_Oyb2jIhz3y4HwNb7d1bDpgKUx8ZliS2POk,1387
4
+ divi/backends/_parallel_simulator.py,sha256=PMu2fsdXw9y_OwJBa5xWrnlfjhb4m7DZ_x4N1yZvVbE,13195
5
+ divi/backends/_qoro_service.py,sha256=nL69tjPtXubA1-ElEyO77pv-2p32kH9tjOXGB-7GVj4,17795
6
+ divi/backends/_qpu_system.py,sha256=teVeG18ukyzMFgbPSr4BLx4MJUHVK382RqZMOy2voFk,374
7
+ divi/circuits/__init__.py,sha256=Wl4BF0_TwG1Ol4oaftCD5lpkgS9us9EW7F4hu6r_eXM,151
8
+ divi/circuits/_core.py,sha256=fBXRspBDCXB0M1PgHwibMDGTdRR441jp73lwh1_NvkQ,8393
9
+ divi/circuits/qasm.py,sha256=iq2hLjx9KBqgG_wKb7CRfNSXTOHZttD4tgBBp-pUnQQ,8161
10
+ divi/circuits/qem.py,sha256=o6rMPUcxLuCBitBb8-QcxveUiKZVsP3HMamxyVFLi6M,6805
11
+ divi/extern/cirq/__init__.py,sha256=6NjP3TlQn_oNkg8VrKvEIoYQxB5Bx0mLLFOT3SXReTc,371
12
+ divi/extern/cirq/_lexer.py,sha256=x5UArrnN_JEyiq7E02ikq0wdmqZ2vEQ3_FADL1LIhQI,3187
13
+ divi/extern/cirq/_parser.py,sha256=z_bSn4m03-sfRlN8eL99Mo4LnjY-zmR-Xt6UrjzstZc,29279
14
+ divi/extern/cirq/_qasm_export.py,sha256=8C5xLYvIIkQTWWAAYo7ZjwtQjvYXNSflbf5UyUx6YUE,1024
15
+ divi/extern/cirq/_qasm_import.py,sha256=HbehrgfLl3iDdRyWr4o26Bek3ZpN-_dvNVSexl5-aVE,969
16
+ divi/extern/cirq/_validator.py,sha256=GVCeoi3IGUCPcqmg6E7lPtD52h-63_0AH4-MToajL4o,20509
17
+ divi/extern/cirq/exception.py,sha256=w1w2vSubOGMRmyKBFqXejxfeIAzkPZ6V7gSrDX_ap4A,765
18
+ divi/extern/scipy/_cobyla.py,sha256=cnCf5AsOM8JWIMiujuUbWMNOgmUr3ZET9y04hUyumHs,10937
19
+ divi/extern/scipy/pyprima/LICENCE.txt,sha256=mXN5ssG_U6OR0v0yldznW_PJTtKNZIgu3jDRtRjLDdY,1533
20
+ divi/extern/scipy/pyprima/__init__.py,sha256=WHV_bPKPLakKdP2TdecrbtMrZ7KR3qb1E3m5VkCjLSo,8956
21
+ divi/extern/scipy/pyprima/cobyla/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ divi/extern/scipy/pyprima/cobyla/cobyla.py,sha256=zIHjhLDkzhijMrzypObgYjQQfelUdxp6VOKQd34m_oU,22281
23
+ divi/extern/scipy/pyprima/cobyla/cobylb.py,sha256=DhOW4SnJ8ihLHybC4-1BK2X-5BFZlndEduuagmXQOVY,42091
24
+ divi/extern/scipy/pyprima/cobyla/geometry.py,sha256=YtGsY-lXAKmsuBj_D59H97Z8acDl7fAJGt4QTEigsiU,10789
25
+ divi/extern/scipy/pyprima/cobyla/initialize.py,sha256=QT9rpkO8IjlljA-z5wPxg7KFWtB_ae38Z7Ww0S-fMpU,9964
26
+ divi/extern/scipy/pyprima/cobyla/trustregion.py,sha256=AD_tdF7VCt6xBrduv0KFr7VgyUoGdIIz4mwde_9dk0g,26021
27
+ divi/extern/scipy/pyprima/cobyla/update.py,sha256=VuwqaE3wXxsGopPAkOAATmesLDUH-8WZrw3iRqu3jzs,14353
28
+ divi/extern/scipy/pyprima/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
+ divi/extern/scipy/pyprima/common/_bounds.py,sha256=0tY542ERqX53I5lreyVUy9XVXfNFvt1bx9peKM70U3U,1683
30
+ divi/extern/scipy/pyprima/common/_linear_constraints.py,sha256=piTatWAMPQo-nwFB14VpRQ6JphBgrBL8OjLysBrTlhI,2160
31
+ divi/extern/scipy/pyprima/common/_nonlinear_constraints.py,sha256=evfY-4FWXKcGae658NXfrlSpCtkHRxCqSG-MyO-WDx4,2180
32
+ divi/extern/scipy/pyprima/common/_project.py,sha256=dnQURl2ztxjGDvoYgMZGnEqUGLUoNUvBaLS12p9-qN0,8541
33
+ divi/extern/scipy/pyprima/common/checkbreak.py,sha256=WrW_dAjZI_3iKvvG3eLTJCxcj5HkIksUBtQQ9BUdB_E,3549
34
+ divi/extern/scipy/pyprima/common/consts.py,sha256=PiGCfDRy9fZjmGJBeCg25gULDfe1cv2HkjS6CQujphg,1313
35
+ divi/extern/scipy/pyprima/common/evaluate.py,sha256=vzjNPdGiAFdD8qpUVp_V1b5f3t2pFyr2N-sMSnTE6OI,3156
36
+ divi/extern/scipy/pyprima/common/history.py,sha256=m0cQ7VOGefWWKTPweqx3dvGZiyzGClTB0BjaKY5mOtQ,1362
37
+ divi/extern/scipy/pyprima/common/infos.py,sha256=MzhS3XciMW5fg4ccW8ubZ3Mkdp2qT6sq56GAkYZikXI,704
38
+ divi/extern/scipy/pyprima/common/linalg.py,sha256=HYoy6vYR2AMUVGSKbA8xj9tjvloMofk_s26N34qiFNk,14516
39
+ divi/extern/scipy/pyprima/common/message.py,sha256=G2_hmqxKvZg0aGCXqw3VmXDxrle8k0Grujzb4iiuPLI,10086
40
+ divi/extern/scipy/pyprima/common/powalg.py,sha256=Azla5UC3oPppDcSTub_1auLS_QXQ_aY1Djm4RT3HkV4,6825
41
+ divi/extern/scipy/pyprima/common/preproc.py,sha256=Ye62rhEilf3ah9aiGc6cSLZg77_qAi3FPK2r4XvPxGk,14929
42
+ divi/extern/scipy/pyprima/common/present.py,sha256=caedmqSB5ggGXNfky0A6v6FAdyaEGrbMEJqNh5Cf6l4,147
43
+ divi/extern/scipy/pyprima/common/ratio.py,sha256=taadehpW0c3ULUggH5frIMpvTom53dsEhvFaXrIKvOI,1833
44
+ divi/extern/scipy/pyprima/common/redrho.py,sha256=J6rJILcOoCeo942LUAXxpUvKLarUGNCGdC-zcmIlVHE,1264
45
+ divi/extern/scipy/pyprima/common/selectx.py,sha256=mXVS2L6AuTmbOhpp1KlXwOBR54ttnbjwagYfnXhezJY,14713
46
+ divi/qprog/__init__.py,sha256=3X7MK7PjXI-rCZQ9OYq314w14npmasCNSBECq23DW7U,622
47
+ divi/qprog/algorithms/__init__.py,sha256=KLGD3zRk3z4nJQDqBjejTGgJ5m0n02jyBVHLJihMMws,355
48
+ divi/qprog/algorithms/_ansatze.py,sha256=CGW6bh6BQreAhcWbKgPX2MMTTTytHO51gizZh9tRFZ4,11199
49
+ divi/qprog/algorithms/_qaoa.py,sha256=5mbsY4enLRAemVuUaw5iGmVI4_YBKdI7ITkV5dAultg,16608
50
+ divi/qprog/algorithms/_vqe.py,sha256=iP0rKbnQys0mIGn7lcFDLVr9tdYVbfs6Wt6vUdsAuLY,8121
51
+ divi/qprog/batch.py,sha256=SO1jxySGAddqzoTYX-Zq_f6HWoEf67wJ70fA3UDWxRw,17011
52
+ divi/qprog/exceptions.py,sha256=2VvUf8qgNBw60Q4wyt_2nbE4JHHMmZiT2JaGmWChp2o,231
53
+ divi/qprog/optimizers.py,sha256=GWaO07PylyLtI-oYXgJmqYUzVzeXHVSqdVFCTiGeNTU,13402
54
+ divi/qprog/quantum_program.py,sha256=c8bEZvtcmQMlrILl5j9PkyvUUb_aO1M_Zwv30NfH1cU,26858
55
+ divi/qprog/workflows/__init__.py,sha256=_GAFsZsgj9p61E1xUXasa1aspwcOWp4s8i6hA6mQ9eg,320
56
+ divi/qprog/workflows/_graph_partitioning.py,sha256=EpDsU0WG4dXKaCqox96LxxupI5lts4TeLgehTg8cUno,22702
57
+ divi/qprog/workflows/_qubo_partitioning.py,sha256=HDFOlQhDH_ax_CV0FtgcoUtCErnDE_Xfv0RVL6O8_WI,8243
58
+ divi/qprog/workflows/_vqe_sweep.py,sha256=V8CpLEXmOqiMM2MXveTOWKIHbdP5fzJJOVzZ0Nmvxzg,18808
59
+ divi/reporting/__init__.py,sha256=gaBUZrhNxR53VHojZxfjvQRDl-eDHo901vLE8I95kIw,290
60
+ divi/reporting/_pbar.py,sha256=I5UcriPLMKdTf_wusFCbxVH4MlA1Etui2GcYxRPC9Is,3686
61
+ divi/reporting/_qlogger.py,sha256=moFF9k_KECdhEmbsUTZHFXwVh30CuRCcChil_LBQUXM,5000
62
+ divi/reporting/_reporter.py,sha256=sMOpDPeTSlFh-soX4BseQkW5XiqgIjcqNgZHPH1SccI,2746
63
+ divi/utils.py,sha256=Avc0Lg0AbkhXAh73Ye4NZOsqZ8U5ImHVF4_kz6hTJNA,5138
64
+ qoro_divi-0.3.5.dist-info/LICENSE,sha256=NS4JlQrgNwg1bvB3kE5shE-P4cJgnntgl-kClbOpG_Q,10760
65
+ qoro_divi-0.3.5.dist-info/LICENSES/.license-header,sha256=2jN_xtJscqP8LG-NaveY2KHUkfRCC543Y_XjOyKEfWY,105
66
+ qoro_divi-0.3.5.dist-info/LICENSES/Apache-2.0.txt,sha256=yoILHpvVuguUBpk8UwMnzJbcHUUyst9iGNNuEwUtWVc,10270
67
+ qoro_divi-0.3.5.dist-info/METADATA,sha256=2EpuPs1up06jPpmbgSalH_VRkzdGUMXToMsNyrOXdsw,2470
68
+ qoro_divi-0.3.5.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
69
+ qoro_divi-0.3.5.dist-info/RECORD,,
divi/_pbar.py DELETED
@@ -1,70 +0,0 @@
1
- # SPDX-FileCopyrightText: 2025 Qoro Quantum Ltd <divi@qoroquantum.de>
2
- #
3
- # SPDX-License-Identifier: Apache-2.0
4
-
5
- from rich.progress import (
6
- BarColumn,
7
- MofNCompleteColumn,
8
- Progress,
9
- ProgressColumn,
10
- SpinnerColumn,
11
- TextColumn,
12
- )
13
- from rich.text import Text
14
-
15
-
16
- class ConditionalSpinnerColumn(ProgressColumn):
17
- def __init__(self):
18
- super().__init__()
19
- self.spinner = SpinnerColumn("point")
20
-
21
- def render(self, task):
22
- status = task.fields.get("final_status")
23
-
24
- if status in ("Success", "Failed"):
25
- return Text("")
26
-
27
- return self.spinner.render(task)
28
-
29
-
30
- class PhaseStatusColumn(ProgressColumn):
31
- def __init__(self, table_column=None):
32
- super().__init__(table_column)
33
-
34
- def render(self, task):
35
- final_status = task.fields.get("final_status")
36
-
37
- if final_status == "Success":
38
- return Text("• Success! ✅", style="bold green")
39
- elif final_status == "Failed":
40
- return Text("• Failed! ❌", style="bold red")
41
-
42
- message = task.fields.get("message")
43
-
44
- poll_attempt = task.fields.get("poll_attempt")
45
- polling_str = ""
46
- service_job_id = ""
47
- if poll_attempt > 0:
48
- max_retries = task.fields.get("max_retries")
49
- service_job_id = task.fields.get("service_job_id").split("-")[0]
50
- job_status = task.fields.get("job_status")
51
- polling_str = f" [Job {service_job_id} is {job_status}. Polling attempt {poll_attempt} / {max_retries}]"
52
-
53
- final_text = Text(f"[{message}]{polling_str}")
54
- final_text.highlight_words([service_job_id], "blue")
55
-
56
- return final_text
57
-
58
-
59
- def make_progress_bar(is_jupyter: bool = False) -> Progress:
60
- return Progress(
61
- TextColumn("[bold blue]{task.fields[job_name]}"),
62
- BarColumn(),
63
- MofNCompleteColumn(),
64
- ConditionalSpinnerColumn(),
65
- PhaseStatusColumn(),
66
- # For jupyter notebooks, refresh manually instead
67
- auto_refresh=not is_jupyter,
68
- # Give a dummy positive value if is_jupyter
69
- refresh_per_second=10 if not is_jupyter else 999,
70
- )
divi/circuits.py DELETED
@@ -1,139 +0,0 @@
1
- # SPDX-FileCopyrightText: 2025 Qoro Quantum Ltd <divi@qoroquantum.de>
2
- #
3
- # SPDX-License-Identifier: Apache-2.0
4
-
5
- import re
6
- from copy import deepcopy
7
- from itertools import product
8
- from typing import Literal
9
-
10
- import dill
11
- import pennylane as qml
12
- from pennylane.transforms.core.transform_program import TransformProgram
13
- from qiskit.qasm2 import dumps
14
-
15
- from divi.qasm import to_openqasm
16
- from divi.qem import QEMProtocol
17
-
18
- TRANSFORM_PROGRAM = TransformProgram()
19
- TRANSFORM_PROGRAM.add_transform(qml.transforms.split_to_single_terms)
20
- TRANSFORM_PROGRAM.add_transform(qml.transforms.split_non_commuting)
21
-
22
-
23
- class Circuit:
24
- _id_counter = 0
25
-
26
- def __init__(
27
- self,
28
- main_circuit,
29
- tags: list[str],
30
- qasm_circuits: list[str] = None,
31
- ):
32
- self.main_circuit = main_circuit
33
- self.circuit_type = main_circuit.__module__.split(".")[0]
34
- self.tags = tags
35
-
36
- self.qasm_circuits = qasm_circuits
37
-
38
- if self.qasm_circuits is None:
39
- self.convert_to_qasm()
40
-
41
- self.circuit_id = Circuit._id_counter
42
- Circuit._id_counter += 1
43
-
44
- def __str__(self):
45
- return f"Circuit: {self.circuit_id}"
46
-
47
- def convert_to_qasm(self):
48
- if self.circuit_type == "pennylane":
49
- self.qasm_circuits = to_openqasm(
50
- self.main_circuit,
51
- measurement_groups=[self.main_circuit.measurements],
52
- return_measurements_separately=False,
53
- )
54
-
55
- elif self.circuit_type == "qiskit":
56
- self.qasm_circuits = [dumps(self.main_circuit)]
57
-
58
- else:
59
- raise ValueError(
60
- f"Invalid circuit type. Circuit type {self.circuit_type} not currently supported."
61
- )
62
-
63
-
64
- class MetaCircuit:
65
- def __init__(
66
- self,
67
- main_circuit,
68
- symbols,
69
- grouping_strategy: Literal["wires", "default", "qwc"] | None = None,
70
- qem_protocol: QEMProtocol | None = None,
71
- ):
72
- self.main_circuit = main_circuit
73
- self.symbols = symbols
74
- self.qem_protocol = qem_protocol
75
-
76
- transform_program = deepcopy(TRANSFORM_PROGRAM)
77
- transform_program[1].kwargs["grouping_strategy"] = grouping_strategy
78
-
79
- qscripts, self.postprocessing_fn = transform_program((main_circuit,))
80
-
81
- self.compiled_circuits_bodies, self.measurements = to_openqasm(
82
- main_circuit,
83
- measurement_groups=[qsc.measurements for qsc in qscripts],
84
- return_measurements_separately=True,
85
- # TODO: optimize later
86
- measure_all=True,
87
- symbols=self.symbols,
88
- qem_protocol=qem_protocol,
89
- )
90
-
91
- # Need to store the measurement groups for computing
92
- # expectation values later on, stripped of the `qml.expval` wrapper
93
- self.measurement_groups = [
94
- [meas.obs for meas in qsc.measurements] for qsc in qscripts
95
- ]
96
-
97
- def __getstate__(self):
98
- state = self.__dict__.copy()
99
- state["postprocessing_fn"] = dill.dumps(self.postprocessing_fn)
100
- return state
101
-
102
- def __setstate__(self, state):
103
- state["postprocessing_fn"] = dill.loads(state["postprocessing_fn"])
104
-
105
- self.__dict__.update(state)
106
-
107
- def initialize_circuit_from_params(
108
- self, param_list, tag_prefix: str = "", precision: int = 8
109
- ) -> Circuit:
110
- mapping = dict(
111
- zip(
112
- map(lambda x: re.escape(str(x)), self.symbols),
113
- map(lambda x: f"{x:.{precision}f}", param_list),
114
- )
115
- )
116
- pattern = re.compile("|".join(k for k in mapping.keys()))
117
-
118
- final_qasm_strs = []
119
- for circuit_body in self.compiled_circuits_bodies:
120
- final_qasm_strs.append(
121
- pattern.sub(lambda match: mapping[match.group(0)], circuit_body)
122
- )
123
-
124
- tags = []
125
- qasm_circuits = []
126
- for (i, body_str), (j, meas_str) in product(
127
- enumerate(final_qasm_strs), enumerate(self.measurements)
128
- ):
129
- qasm_circuits.append(body_str + meas_str)
130
-
131
- nonempty_subtags = filter(
132
- None,
133
- [tag_prefix, f"{self.qem_protocol.name}:{i}", str(j)],
134
- )
135
- tags.append("_".join(nonempty_subtags))
136
-
137
- # Note: The main circuit's parameters are still in symbol form.
138
- # Not sure if it is necessary for any useful application to parameterize them.
139
- return Circuit(self.main_circuit, qasm_circuits=qasm_circuits, tags=tags)
divi/interfaces.py DELETED
@@ -1,25 +0,0 @@
1
- # SPDX-FileCopyrightText: 2025 Qoro Quantum Ltd <divi@qoroquantum.de>
2
- #
3
- # SPDX-License-Identifier: Apache-2.0
4
-
5
- from abc import ABC, abstractmethod
6
-
7
-
8
- class CircuitRunner(ABC):
9
- """
10
- A generic interface for anything that can "run" quantum circuits.
11
- """
12
-
13
- def __init__(self, shots: int):
14
- if shots <= 0:
15
- raise ValueError(f"Shots must be a positive integer. Got {shots}.")
16
-
17
- self._shots = shots
18
-
19
- @property
20
- def shots(self):
21
- return self._shots
22
-
23
- @abstractmethod
24
- def submit_circuits(self, circuits: dict[str, str], **kwargs):
25
- pass