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.
- divi/__init__.py +1 -2
- divi/backends/__init__.py +7 -0
- divi/backends/_circuit_runner.py +46 -0
- divi/{parallel_simulator.py → backends/_parallel_simulator.py} +136 -53
- divi/backends/_qoro_service.py +531 -0
- divi/circuits/__init__.py +5 -0
- divi/circuits/_core.py +226 -0
- divi/{qasm.py → circuits/qasm.py} +21 -2
- divi/{exp → extern}/cirq/_validator.py +9 -7
- divi/qprog/__init__.py +18 -5
- divi/qprog/algorithms/__init__.py +14 -0
- divi/qprog/algorithms/_ansatze.py +311 -0
- divi/qprog/{_qaoa.py → algorithms/_qaoa.py} +69 -41
- divi/qprog/{_vqe.py → algorithms/_vqe.py} +79 -135
- divi/qprog/batch.py +239 -55
- divi/qprog/exceptions.py +9 -0
- divi/qprog/optimizers.py +219 -18
- divi/qprog/quantum_program.py +389 -57
- divi/qprog/workflows/__init__.py +10 -0
- divi/qprog/{_graph_partitioning.py → workflows/_graph_partitioning.py} +3 -34
- divi/qprog/{_qubo_partitioning.py → workflows/_qubo_partitioning.py} +42 -25
- divi/qprog/{_vqe_sweep.py → workflows/_vqe_sweep.py} +59 -26
- divi/reporting/__init__.py +7 -0
- divi/reporting/_pbar.py +112 -0
- divi/{qlogger.py → reporting/_qlogger.py} +37 -2
- divi/{reporter.py → reporting/_reporter.py} +8 -14
- divi/utils.py +49 -10
- {qoro_divi-0.3.3.dist-info → qoro_divi-0.3.5.dist-info}/METADATA +2 -1
- qoro_divi-0.3.5.dist-info/RECORD +69 -0
- divi/_pbar.py +0 -70
- divi/circuits.py +0 -139
- divi/interfaces.py +0 -25
- divi/qoro_service.py +0 -425
- qoro_divi-0.3.3.dist-info/RECORD +0 -62
- /divi/{qpu_system.py → backends/_qpu_system.py} +0 -0
- /divi/{qem.py → circuits/qem.py} +0 -0
- /divi/{exp → extern}/cirq/__init__.py +0 -0
- /divi/{exp → extern}/cirq/_lexer.py +0 -0
- /divi/{exp → extern}/cirq/_parser.py +0 -0
- /divi/{exp → extern}/cirq/_qasm_export.py +0 -0
- /divi/{exp → extern}/cirq/_qasm_import.py +0 -0
- /divi/{exp → extern}/cirq/exception.py +0 -0
- /divi/{exp → extern}/scipy/_cobyla.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/LICENCE.txt +0 -0
- /divi/{exp → extern}/scipy/pyprima/__init__.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/cobyla/__init__.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/cobyla/cobyla.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/cobyla/cobylb.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/cobyla/geometry.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/cobyla/initialize.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/cobyla/trustregion.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/cobyla/update.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/__init__.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/_bounds.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/_linear_constraints.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/_nonlinear_constraints.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/_project.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/checkbreak.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/consts.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/evaluate.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/history.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/infos.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/linalg.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/message.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/powalg.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/preproc.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/present.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/ratio.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/redrho.py +0 -0
- /divi/{exp → extern}/scipy/pyprima/common/selectx.py +0 -0
- {qoro_divi-0.3.3.dist-info → qoro_divi-0.3.5.dist-info}/LICENSE +0 -0
- {qoro_divi-0.3.3.dist-info → qoro_divi-0.3.5.dist-info}/LICENSES/.license-header +0 -0
- {qoro_divi-0.3.3.dist-info → qoro_divi-0.3.5.dist-info}/LICENSES/Apache-2.0.txt +0 -0
- {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
|