quapp-pyquil 0.0.4.dev1__tar.gz → 0.0.4.dev3__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.
- {quapp_pyquil-0.0.4.dev1/quapp_pyquil.egg-info → quapp_pyquil-0.0.4.dev3}/PKG-INFO +2 -2
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/pyproject.toml +2 -2
- quapp_pyquil-0.0.4.dev3/qapp_pyquil/async_tasks/pyquil_circuit_export_task.py +25 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/component/backend/pyquil_invocation.py +5 -4
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/component/backend/pyquil_job_fetching.py +1 -2
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/factory/pyquil_device_factory.py +0 -1
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/factory/pyquil_handler_factory.py +8 -9
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/handler/invocation_handler.py +1 -2
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/device/qapp_pyquil_device.py +17 -23
- quapp_pyquil-0.0.4.dev3/qapp_pyquil/model/device/rigetti_pyquil_device.py +175 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3/quapp_pyquil.egg-info}/PKG-INFO +2 -2
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/quapp_pyquil.egg-info/requires.txt +1 -1
- quapp_pyquil-0.0.4.dev1/qapp_pyquil/async_tasks/pyquil_circuit_export_task.py +0 -62
- quapp_pyquil-0.0.4.dev1/qapp_pyquil/model/device/rigetti_pyquil_device.py +0 -75
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/LICENSE +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/README.md +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/async_tasks/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/component/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/component/backend/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/factory/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/factory/pyquil_provider_factory.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/handler/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/handler/job_fetching_handler.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/device/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/provider/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/provider/qapp_pyquil_provider.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/provider/rigetti_pyquil_provider.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/quapp_pyquil.egg-info/SOURCES.txt +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/quapp_pyquil.egg-info/dependency_links.txt +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/quapp_pyquil.egg-info/top_level.txt +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: quapp-pyquil
|
|
3
|
-
Version: 0.0.4.
|
|
3
|
+
Version: 0.0.4.dev3
|
|
4
4
|
Summary: QApp pyquil library supporting QApp Platform for Quantum Computing
|
|
5
5
|
Author-email: "CITYNOW Co. Ltd. " <corp@citynow.vn>
|
|
6
6
|
License: The MIT License (MIT)
|
|
@@ -19,7 +19,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
19
19
|
Requires-Python: <3.11,>=3.9
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
License-File: LICENSE
|
|
22
|
-
Requires-Dist: quapp-common==0.0.11.
|
|
22
|
+
Requires-Dist: quapp-common==0.0.11.dev6
|
|
23
23
|
Requires-Dist: pyquil==4.15.0
|
|
24
24
|
Provides-Extra: dev
|
|
25
25
|
Requires-Dist: black; extra == "dev"
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "quapp-pyquil"
|
|
7
|
-
version = "0.0.4.
|
|
7
|
+
version = "0.0.4.dev3"
|
|
8
8
|
description = "QApp pyquil library supporting QApp Platform for Quantum Computing"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{ name = "CITYNOW Co. Ltd. ", email = "corp@citynow.vn" }]
|
|
@@ -16,7 +16,7 @@ classifiers = [
|
|
|
16
16
|
]
|
|
17
17
|
keywords = ["quapp", "qapp-pyquil", "quantum"]
|
|
18
18
|
dependencies = [
|
|
19
|
-
"quapp-common==0.0.11.
|
|
19
|
+
"quapp-common==0.0.11.dev6",
|
|
20
20
|
"pyquil==4.15.0"
|
|
21
21
|
]
|
|
22
22
|
requires-python = ">=3.9,<3.11"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""
|
|
2
|
+
QApp Platform Project pennylane_circuit_export_task.py Copyright © CITYNOW Co. Ltd. All rights reserved.
|
|
3
|
+
"""
|
|
4
|
+
from quapp_common.async_tasks.export_circuit_task import CircuitExportTask
|
|
5
|
+
from quapp_common.data.async_task.circuit_export.backend_holder import BackendDataHolder
|
|
6
|
+
from quapp_common.data.async_task.circuit_export.circuit_holder import CircuitDataHolder
|
|
7
|
+
from quapp_common.data.response.custom_header import CustomHeader
|
|
8
|
+
|
|
9
|
+
import requests
|
|
10
|
+
|
|
11
|
+
class PyquilCircuitExportTask(CircuitExportTask):
|
|
12
|
+
|
|
13
|
+
def __init__(self, circuit_data_holder: CircuitDataHolder,
|
|
14
|
+
backend_data_holder: BackendDataHolder,
|
|
15
|
+
project_header: CustomHeader, workspace_header: CustomHeader):
|
|
16
|
+
super().__init__(circuit_data_holder, backend_data_holder,
|
|
17
|
+
project_header, workspace_header)
|
|
18
|
+
|
|
19
|
+
def _transpile_circuit(self):
|
|
20
|
+
# no implementation needed for Pyquil
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
def do(self):
|
|
24
|
+
return
|
|
25
|
+
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from quapp_common.component.backend.invocation import Invocation
|
|
6
|
-
from quapp_common.config.logging_config import logger
|
|
7
6
|
from quapp_common.config.thread_config import circuit_exporting_pool
|
|
8
7
|
from quapp_common.data.async_task.circuit_export.backend_holder import BackendDataHolder
|
|
9
8
|
from quapp_common.data.async_task.circuit_export.circuit_holder import CircuitDataHolder
|
|
@@ -21,25 +20,27 @@ class PyquilInvocation(Invocation):
|
|
|
21
20
|
self.num_qubits = kwargs.get('num_qubits')
|
|
22
21
|
|
|
23
22
|
def _export_circuit(self, circuit):
|
|
24
|
-
logger.info("[PyquilInvocation] _export_circuit()")
|
|
23
|
+
self.logger.info("[PyquilInvocation] _export_circuit()")
|
|
25
24
|
|
|
26
25
|
circuit_export_task = PyquilCircuitExportTask(
|
|
27
26
|
circuit_data_holder=CircuitDataHolder(circuit, self.circuit_export_url),
|
|
28
27
|
backend_data_holder=BackendDataHolder(
|
|
29
28
|
self.backend_information, self.authentication.user_token
|
|
30
29
|
),
|
|
30
|
+
project_header=self.project_header,
|
|
31
|
+
workspace_header=self.workspace_header
|
|
31
32
|
)
|
|
32
33
|
circuit_exporting_pool.submit(circuit_export_task.do)
|
|
33
34
|
|
|
34
35
|
def _create_provider(self):
|
|
35
|
-
logger.info('[PennylaneInvocation] _create_provider()')
|
|
36
|
+
self.logger.info('[PennylaneInvocation] _create_provider()')
|
|
36
37
|
|
|
37
38
|
return PyquilProviderFactory.create_provider(
|
|
38
39
|
provider_type=self.backend_information.provider_tag, sdk=self.sdk,
|
|
39
40
|
authentication=self.backend_information.authentication)
|
|
40
41
|
|
|
41
42
|
def _create_device(self, provider: Provider):
|
|
42
|
-
logger.info('[PennylaneInvocation] Creating device')
|
|
43
|
+
self.logger.info('[PennylaneInvocation] Creating device')
|
|
43
44
|
return PyquilDeviceFactory.create_device(provider=provider,
|
|
44
45
|
device_specification=self.backend_information.device_name,
|
|
45
46
|
authentication=self.backend_information.authentication,
|
|
@@ -7,7 +7,6 @@ from quapp_common.config.logging_config import logger
|
|
|
7
7
|
from quapp_common.enum.provider_tag import ProviderTag
|
|
8
8
|
from quapp_common.enum.sdk import Sdk
|
|
9
9
|
from quapp_common.enum.status.job_status import JobStatus
|
|
10
|
-
from quapp_common.enum.status.status_code import StatusCode
|
|
11
10
|
from pyquil import get_qc
|
|
12
11
|
import pickle
|
|
13
12
|
import os
|
|
@@ -52,7 +51,7 @@ class PyquilJobFetching(JobFetcher):
|
|
|
52
51
|
|
|
53
52
|
def _get_job_status(self, job):
|
|
54
53
|
|
|
55
|
-
if
|
|
54
|
+
if job.execution_duration_microseconds is not None:
|
|
56
55
|
|
|
57
56
|
if os.path.exists(self.provider_job_id+".pkl"):
|
|
58
57
|
os.remove(self.provider_job_id+".pkl")
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/factory/pyquil_device_factory.py
RENAMED
|
@@ -11,7 +11,6 @@ from quapp_common.model.provider.provider import Provider
|
|
|
11
11
|
from ..model.device.qapp_pyquil_device import QAppPyquilDevice
|
|
12
12
|
from ..model.device.rigetti_pyquil_device import RigettiPyquilDevice
|
|
13
13
|
|
|
14
|
-
|
|
15
14
|
class PyquilDeviceFactory(DeviceFactory):
|
|
16
15
|
|
|
17
16
|
@staticmethod
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/factory/pyquil_handler_factory.py
RENAMED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
QApp Platform Project pyquil_handler_factory.py Copyright © CITYNOW Co. Ltd. All rights reserved.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
from quapp_common.config.logging_config import logger
|
|
6
5
|
from quapp_common.factory.handler_factory import HandlerFactory
|
|
7
6
|
from quapp_common.handler.handler import Handler
|
|
8
7
|
|
|
9
8
|
from ..handler.invocation_handler import InvocationHandler
|
|
10
|
-
from
|
|
11
|
-
|
|
9
|
+
from quapp_common.config.logging_config import job_logger
|
|
12
10
|
class PyquilHandlerFactory(HandlerFactory):
|
|
13
11
|
|
|
14
12
|
@staticmethod
|
|
15
13
|
def create_handler(event, circuit_preparation_fn, post_processing_fn) -> Handler:
|
|
16
|
-
logger.info("[PyquilHandlerFactory] create_handler()")
|
|
17
14
|
|
|
18
15
|
request_data = event.json()
|
|
19
16
|
provider_job_id = request_data.get("providerJobId")
|
|
20
17
|
|
|
18
|
+
logger = job_logger(request_data.get('jobId'))
|
|
19
|
+
logger.debug('Creating handler')
|
|
20
|
+
|
|
21
21
|
if provider_job_id is None:
|
|
22
22
|
logger.debug("[PyquilHandlerFactory] Create InvocationHandler")
|
|
23
23
|
return InvocationHandler(
|
|
@@ -25,8 +25,7 @@ class PyquilHandlerFactory(HandlerFactory):
|
|
|
25
25
|
circuit_preparation_fn=circuit_preparation_fn,
|
|
26
26
|
post_processing_fn=post_processing_fn,
|
|
27
27
|
)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
)
|
|
28
|
+
# logger.debug("Create JobFetchingHandler")
|
|
29
|
+
# return JobFetchingHandler(
|
|
30
|
+
# request_data=request_data, post_processing_fn=post_processing_fn
|
|
31
|
+
# )
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/handler/invocation_handler.py
RENAMED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
"""
|
|
4
4
|
from quapp_common.data.request.invocation_request import InvocationRequest
|
|
5
5
|
from quapp_common.handler.handler import Handler
|
|
6
|
-
from quapp_common.config.logging_config import logger
|
|
7
6
|
|
|
8
7
|
from ..component.backend.pyquil_invocation import PyquilInvocation
|
|
9
8
|
|
|
@@ -17,7 +16,7 @@ class InvocationHandler(Handler):
|
|
|
17
16
|
self.circuit_preparation_fn = circuit_preparation_fn
|
|
18
17
|
|
|
19
18
|
def handle(self):
|
|
20
|
-
logger.info("[InvocationHandler] handle()")
|
|
19
|
+
self.logger.info("[InvocationHandler] handle()")
|
|
21
20
|
|
|
22
21
|
invocation_request = InvocationRequest(self.request_data)
|
|
23
22
|
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/device/qapp_pyquil_device.py
RENAMED
|
@@ -4,12 +4,10 @@
|
|
|
4
4
|
Copyright © CITYNOW Co. Ltd. All rights reserved.
|
|
5
5
|
"""
|
|
6
6
|
import time
|
|
7
|
-
import math
|
|
8
7
|
|
|
9
8
|
from quapp_common.data.response.authentication import Authentication
|
|
10
|
-
from quapp_common.data.response.
|
|
9
|
+
from quapp_common.data.response.custom_header import CustomHeader
|
|
11
10
|
from quapp_common.model.device.device import Device
|
|
12
|
-
from quapp_common.config.logging_config import logger
|
|
13
11
|
from quapp_common.data.device.circuit_running_option import CircuitRunningOption
|
|
14
12
|
from quapp_common.model.provider.provider import Provider
|
|
15
13
|
from quapp_common.enum.invocation_step import InvocationStep
|
|
@@ -18,11 +16,11 @@ from quapp_common.enum.invocation_step import InvocationStep
|
|
|
18
16
|
class QAppPyquilDevice(Device):
|
|
19
17
|
def __init__(self, provider: Provider, device_specification: str):
|
|
20
18
|
super().__init__(provider, device_specification)
|
|
21
|
-
logger.debug('[QAppPyquilDevice] Initializing device specification')
|
|
19
|
+
self.logger.debug('[QAppPyquilDevice] Initializing device specification')
|
|
22
20
|
self.device_specification = device_specification
|
|
23
21
|
|
|
24
22
|
def _create_job(self, circuit, options: CircuitRunningOption):
|
|
25
|
-
logger.debug(
|
|
23
|
+
self.logger.debug(
|
|
26
24
|
'[QAppPyquilDevice] Creating job with {0} shots'.format(
|
|
27
25
|
options.shots))
|
|
28
26
|
|
|
@@ -39,41 +37,41 @@ class QAppPyquilDevice(Device):
|
|
|
39
37
|
return data
|
|
40
38
|
|
|
41
39
|
def _is_simulator(self) -> bool:
|
|
42
|
-
logger.debug('[QAppPyquilDevice] Is simulator')
|
|
40
|
+
self.logger.debug('[QAppPyquilDevice] Is simulator')
|
|
43
41
|
return True
|
|
44
42
|
|
|
45
43
|
def _produce_histogram_data(self, job_result) -> dict | None:
|
|
46
|
-
logger.info('[PyquilDevice] Producing histogram data')
|
|
44
|
+
self.logger.info('[PyquilDevice] Producing histogram data')
|
|
47
45
|
|
|
48
46
|
histogram = job_result.get('histogram')
|
|
49
47
|
|
|
50
48
|
if histogram is None:
|
|
51
|
-
logger.debug("[PyquilDevice] Can't produce histogram")
|
|
49
|
+
self.logger.debug("[PyquilDevice] Can't produce histogram")
|
|
52
50
|
|
|
53
51
|
return job_result.get('histogram')
|
|
54
52
|
|
|
55
53
|
def _get_provider_job_id(self, job) -> str:
|
|
56
|
-
logger.debug('[PyquilDevice] Getting job id')
|
|
54
|
+
self.logger.debug('[PyquilDevice] Getting job id')
|
|
57
55
|
|
|
58
56
|
# no job id in local simulator
|
|
59
57
|
return ""
|
|
60
58
|
|
|
61
59
|
def _get_job_status(self, job) -> str:
|
|
62
|
-
logger.debug('[PyquilDevice] Getting job status')
|
|
60
|
+
self.logger.debug('[PyquilDevice] Getting job status')
|
|
63
61
|
|
|
64
62
|
return "DONE"
|
|
65
63
|
|
|
66
64
|
def _get_job_result(self, job) -> dict:
|
|
67
|
-
logger.debug('[PyquilDevice] Getting job result')
|
|
65
|
+
self.logger.debug('[PyquilDevice] Getting job result')
|
|
68
66
|
|
|
69
67
|
return job
|
|
70
68
|
|
|
71
69
|
def _calculate_execution_time(self, job_result):
|
|
72
|
-
logger.debug('[PyquilDevice] Calculating execution time')
|
|
70
|
+
self.logger.debug('[PyquilDevice] Calculating execution time')
|
|
73
71
|
|
|
74
72
|
self.execution_time = job_result.get('time_taken_execute')
|
|
75
73
|
|
|
76
|
-
logger.debug(
|
|
74
|
+
self.logger.debug(
|
|
77
75
|
'[PyquilDevice] Execution time calculation was: {0} seconds'.format(
|
|
78
76
|
self.execution_time))
|
|
79
77
|
|
|
@@ -83,18 +81,13 @@ class QAppPyquilDevice(Device):
|
|
|
83
81
|
options: CircuitRunningOption,
|
|
84
82
|
callback_dict: dict,
|
|
85
83
|
authentication: Authentication,
|
|
86
|
-
project_header:
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
@param callback_dict: callback url dictionary
|
|
90
|
-
@param options: Options for run circuit
|
|
91
|
-
@param authentication: Authentication for calling quao server
|
|
92
|
-
@param post_processing_fn: Post-processing function
|
|
93
|
-
@param circuit: Circuit was run
|
|
94
|
-
"""
|
|
84
|
+
project_header: CustomHeader,
|
|
85
|
+
workspace_header: CustomHeader):
|
|
86
|
+
|
|
95
87
|
original_job_result, job_response = self._on_execution(
|
|
96
88
|
authentication=authentication,
|
|
97
89
|
project_header=project_header,
|
|
90
|
+
workspace_header=workspace_header,
|
|
98
91
|
execution_callback=callback_dict.get(InvocationStep.EXECUTION),
|
|
99
92
|
circuit=circuit,
|
|
100
93
|
options=options)
|
|
@@ -115,4 +108,5 @@ class QAppPyquilDevice(Device):
|
|
|
115
108
|
post_processing_fn=post_processing_fn,
|
|
116
109
|
finalization_callback=callback_dict.get(
|
|
117
110
|
InvocationStep.FINALIZATION),
|
|
118
|
-
project_header=project_header
|
|
111
|
+
project_header=project_header,
|
|
112
|
+
workspace_header= workspace_header)
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"""
|
|
2
|
+
QApp Platform Project
|
|
3
|
+
qapp_pyquil_device.py
|
|
4
|
+
Copyright © CITYNOW Co. Ltd. All rights reserved.
|
|
5
|
+
"""
|
|
6
|
+
import time
|
|
7
|
+
import math
|
|
8
|
+
import os
|
|
9
|
+
|
|
10
|
+
from quapp_common.data.response.authentication import Authentication
|
|
11
|
+
from quapp_common.data.response.custom_header import CustomHeader
|
|
12
|
+
from quapp_common.model.device.device import Device
|
|
13
|
+
from quapp_common.data.device.circuit_running_option import CircuitRunningOption
|
|
14
|
+
from quapp_common.model.provider.provider import Provider
|
|
15
|
+
from quapp_common.data.response.job_response import JobResponse
|
|
16
|
+
|
|
17
|
+
from quapp_common.component.callback.update_job_metadata import update_job_metadata
|
|
18
|
+
from quapp_common.enum.status.job_status import JobStatus
|
|
19
|
+
from quapp_common.enum.media_type import MediaType
|
|
20
|
+
from quapp_common.enum.status.status_code import StatusCode
|
|
21
|
+
from quapp_common.data.callback.callback_url import CallbackUrl
|
|
22
|
+
import pickle
|
|
23
|
+
import time
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class RigettiPyquilDevice(Device):
|
|
27
|
+
def __init__(self, provider: Provider, device_specification: str):
|
|
28
|
+
super().__init__(provider, device_specification)
|
|
29
|
+
self.logger.debug('[RigettiPyquilDevice] Initializing device specification')
|
|
30
|
+
self.device_specification = device_specification
|
|
31
|
+
|
|
32
|
+
def _create_job(self, circuit, options: CircuitRunningOption):
|
|
33
|
+
self.logger.debug(
|
|
34
|
+
'[RigettiPyquilDevice] Creating job with {0} shots'.format(
|
|
35
|
+
options.shots))
|
|
36
|
+
|
|
37
|
+
circuit.wrap_in_numshots_loop(options.shots)
|
|
38
|
+
executable = self.device.compile(circuit)
|
|
39
|
+
|
|
40
|
+
return self.device.qam.execute(executable)
|
|
41
|
+
|
|
42
|
+
def _is_simulator(self) -> bool:
|
|
43
|
+
self.logger.debug('[RigettiPyquilDevice] is quantum machine')
|
|
44
|
+
return False
|
|
45
|
+
|
|
46
|
+
def _get_provider_job_id(self, job) -> str:
|
|
47
|
+
self.logger.debug('[PyquilDevice] Getting job id')
|
|
48
|
+
|
|
49
|
+
return job.job_id
|
|
50
|
+
|
|
51
|
+
def _get_job_status(self, job) -> str:
|
|
52
|
+
self.logger.debug('[PyquilDevice] Getting job status')
|
|
53
|
+
|
|
54
|
+
return "RUNNING"
|
|
55
|
+
|
|
56
|
+
def _calculate_execution_time(self, job_result):
|
|
57
|
+
self.logger.debug('[PyquilDevice] Getting execution time {}',job_result)
|
|
58
|
+
|
|
59
|
+
# the time unit is miliseconds
|
|
60
|
+
return job_result.execution_duration_microseconds/1000
|
|
61
|
+
|
|
62
|
+
def _get_job_result(self, job):
|
|
63
|
+
|
|
64
|
+
return self.device.qam.get_result(job)
|
|
65
|
+
|
|
66
|
+
def _produce_histogram_data(self, job_result) -> dict | None:
|
|
67
|
+
self.logger.info('[PyquilDevice] Producing histogram data')
|
|
68
|
+
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
def _on_execution(self, authentication: Authentication,
|
|
72
|
+
project_header: CustomHeader,
|
|
73
|
+
workspace_header: CustomHeader,
|
|
74
|
+
execution_callback: CallbackUrl,
|
|
75
|
+
circuit,
|
|
76
|
+
options: CircuitRunningOption):
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
@param authentication: authentication information
|
|
80
|
+
@param project_header: project header information
|
|
81
|
+
@param execution_callback: execution step callback urls
|
|
82
|
+
@param circuit: circuit will be run
|
|
83
|
+
@param options: options will use for running
|
|
84
|
+
@return: job and job response
|
|
85
|
+
"""
|
|
86
|
+
self.logger.debug("[Invocation] On execution")
|
|
87
|
+
|
|
88
|
+
job_response = JobResponse(authentication=authentication,
|
|
89
|
+
project_header=project_header,
|
|
90
|
+
status_code=StatusCode.DONE,
|
|
91
|
+
workspace_header=workspace_header)
|
|
92
|
+
|
|
93
|
+
update_job_metadata(job_response=job_response,
|
|
94
|
+
callback_url=execution_callback.on_start)
|
|
95
|
+
try:
|
|
96
|
+
job = self._create_job(circuit=circuit, options=options)
|
|
97
|
+
job_response.provider_job_id = self._get_provider_job_id(job)
|
|
98
|
+
job_response.job_status = self._get_job_status(job)
|
|
99
|
+
original_job_result = None
|
|
100
|
+
|
|
101
|
+
while True:
|
|
102
|
+
|
|
103
|
+
self.logger.debug("fetching job result")
|
|
104
|
+
|
|
105
|
+
try:
|
|
106
|
+
res = self._get_job_result(job)
|
|
107
|
+
self.logger.debug("Job result: {}".format(res))
|
|
108
|
+
if res.execution_duration_microseconds is not None:
|
|
109
|
+
job_response.job_status = JobStatus.DONE.value
|
|
110
|
+
original_job_result = res
|
|
111
|
+
break
|
|
112
|
+
except Exception as e:
|
|
113
|
+
self.logger.debug("Job result not ready yet: {}".format(str(e)))
|
|
114
|
+
time.sleep(5)
|
|
115
|
+
|
|
116
|
+
self.logger.debug("Job result: {}".format(job_response))
|
|
117
|
+
|
|
118
|
+
update_job_metadata(job_response=job_response,
|
|
119
|
+
callback_url=execution_callback.on_done)
|
|
120
|
+
|
|
121
|
+
return original_job_result, job_response
|
|
122
|
+
|
|
123
|
+
except Exception as exception:
|
|
124
|
+
self.logger.debug("Execute job failed with error {}".format(str(exception)))
|
|
125
|
+
|
|
126
|
+
job_response.status_code = StatusCode.ERROR
|
|
127
|
+
job_response.content_type = MediaType.APPLICATION_JSON
|
|
128
|
+
job_response.job_status = JobStatus.ERROR.value
|
|
129
|
+
job_response.job_result = {"error": str(exception)}
|
|
130
|
+
|
|
131
|
+
update_job_metadata(job_response=job_response,
|
|
132
|
+
callback_url=execution_callback.on_error)
|
|
133
|
+
return None, None
|
|
134
|
+
|
|
135
|
+
def _on_analysis(self, job_response: JobResponse,
|
|
136
|
+
analysis_callback: CallbackUrl,
|
|
137
|
+
original_job_result):
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
@param job_response:
|
|
141
|
+
@param analysis_callback:
|
|
142
|
+
@param original_job_result:
|
|
143
|
+
@return:
|
|
144
|
+
"""
|
|
145
|
+
self.logger.debug("[Invocation] On analysis")
|
|
146
|
+
|
|
147
|
+
update_job_metadata(job_response=job_response,
|
|
148
|
+
callback_url=analysis_callback.on_start)
|
|
149
|
+
|
|
150
|
+
try:
|
|
151
|
+
job_response.job_histogram = self._produce_histogram_data(original_job_result)
|
|
152
|
+
|
|
153
|
+
self.execution_time = self._calculate_execution_time(original_job_result)
|
|
154
|
+
|
|
155
|
+
job_response.execution_time = self.execution_time
|
|
156
|
+
self.logger.debug("Execution time: {}".format(job_response.execution_time))
|
|
157
|
+
|
|
158
|
+
update_job_metadata(
|
|
159
|
+
job_response=job_response,
|
|
160
|
+
callback_url=analysis_callback.on_done)
|
|
161
|
+
|
|
162
|
+
return job_response
|
|
163
|
+
|
|
164
|
+
except Exception as exception:
|
|
165
|
+
self.logger.error("Invocation - Exception when analyst job result : {0}".format(
|
|
166
|
+
str(exception)))
|
|
167
|
+
|
|
168
|
+
job_response.status_code = StatusCode.ERROR
|
|
169
|
+
job_response.content_type = MediaType.APPLICATION_JSON
|
|
170
|
+
job_response.job_status = JobStatus.ERROR.value
|
|
171
|
+
job_response.job_result = {"error": str(exception)}
|
|
172
|
+
|
|
173
|
+
update_job_metadata(job_response=job_response,
|
|
174
|
+
callback_url=analysis_callback.on_error)
|
|
175
|
+
return None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: quapp-pyquil
|
|
3
|
-
Version: 0.0.4.
|
|
3
|
+
Version: 0.0.4.dev3
|
|
4
4
|
Summary: QApp pyquil library supporting QApp Platform for Quantum Computing
|
|
5
5
|
Author-email: "CITYNOW Co. Ltd. " <corp@citynow.vn>
|
|
6
6
|
License: The MIT License (MIT)
|
|
@@ -19,7 +19,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
19
19
|
Requires-Python: <3.11,>=3.9
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
License-File: LICENSE
|
|
22
|
-
Requires-Dist: quapp-common==0.0.11.
|
|
22
|
+
Requires-Dist: quapp-common==0.0.11.dev6
|
|
23
23
|
Requires-Dist: pyquil==4.15.0
|
|
24
24
|
Provides-Extra: dev
|
|
25
25
|
Requires-Dist: black; extra == "dev"
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
QApp Platform Project pennylane_circuit_export_task.py Copyright © CITYNOW Co. Ltd. All rights reserved.
|
|
3
|
-
"""
|
|
4
|
-
from quapp_common.async_tasks.export_circuit_task import CircuitExportTask
|
|
5
|
-
# from ..quapp_common.config.logging_config import logger
|
|
6
|
-
# from pyquil.latex import to_latex
|
|
7
|
-
# import os
|
|
8
|
-
# import subprocess
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class PyquilCircuitExportTask(CircuitExportTask):
|
|
12
|
-
|
|
13
|
-
def _convert(self):
|
|
14
|
-
|
|
15
|
-
# circuit = self.circuit_data_holder.circuit
|
|
16
|
-
|
|
17
|
-
# latex_code = to_latex(circuit)
|
|
18
|
-
|
|
19
|
-
# latex_filename = "quantikz.tex"
|
|
20
|
-
# pdf_filename = "quantikz.pdf"
|
|
21
|
-
# svg_filename = "quantikz.svg"
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
# try:
|
|
25
|
-
|
|
26
|
-
# with open(latex_filename, "w") as latex_file:
|
|
27
|
-
# latex_file.write(latex_code)
|
|
28
|
-
|
|
29
|
-
# subprocess.run(["pdflatex", latex_filename], check=True)
|
|
30
|
-
# subprocess.run(["pdf2svg", pdf_filename, svg_filename], check=True)
|
|
31
|
-
|
|
32
|
-
# with open(svg_filename, "rb") as svg_file:
|
|
33
|
-
# svg_bytes = svg_file.read()
|
|
34
|
-
|
|
35
|
-
# except subprocess.CalledProcessError:
|
|
36
|
-
# logger.error('[PyquilCircuitExportTask] Fail to convert to svg')
|
|
37
|
-
# return None
|
|
38
|
-
|
|
39
|
-
# finally:
|
|
40
|
-
|
|
41
|
-
# logger.info('[PyquilCircuitExportTask] Cleaning up temporary files')
|
|
42
|
-
|
|
43
|
-
# files_to_cleanup = [
|
|
44
|
-
# "quantikz.tex", # LaTeX source file
|
|
45
|
-
# "quantikz.pdf", # Generated PDF file
|
|
46
|
-
# "quantikz.svg", # Generated SVG file
|
|
47
|
-
# "quantikz.aux", # Auxiliary file created during LaTeX compilation
|
|
48
|
-
# "quantikz.log", # Log file created during LaTeX compilation
|
|
49
|
-
# ]
|
|
50
|
-
# # Clean up each file if it exists
|
|
51
|
-
# for file in files_to_cleanup:
|
|
52
|
-
# try:
|
|
53
|
-
# os.remove(file)
|
|
54
|
-
# logger.info(f'[PyquilCircuitExportTask] Successfully removed: {file}')
|
|
55
|
-
# except FileNotFoundError:
|
|
56
|
-
# logger.error(f'[PyquilCircuitExportTask] File not found: {file}')
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
# return svg_bytes
|
|
61
|
-
|
|
62
|
-
return None
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
QApp Platform Project
|
|
3
|
-
qapp_pyquil_device.py
|
|
4
|
-
Copyright © CITYNOW Co. Ltd. All rights reserved.
|
|
5
|
-
"""
|
|
6
|
-
import time
|
|
7
|
-
import math
|
|
8
|
-
import os
|
|
9
|
-
|
|
10
|
-
from quapp_common.data.response.authentication import Authentication
|
|
11
|
-
from quapp_common.data.response.project_header import ProjectHeader
|
|
12
|
-
from quapp_common.model.device.device import Device
|
|
13
|
-
from quapp_common.config.logging_config import logger
|
|
14
|
-
from quapp_common.data.device.circuit_running_option import CircuitRunningOption
|
|
15
|
-
from quapp_common.model.provider.provider import Provider
|
|
16
|
-
from quapp_common.enum.invocation_step import InvocationStep
|
|
17
|
-
|
|
18
|
-
import pickle
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class RigettiPyquilDevice(Device):
|
|
22
|
-
def __init__(self, provider: Provider, device_specification: str):
|
|
23
|
-
super().__init__(provider, device_specification)
|
|
24
|
-
logger.debug('[RigettiPyquilDevice] Initializing device specification')
|
|
25
|
-
self.device_specification = device_specification
|
|
26
|
-
|
|
27
|
-
def _create_job(self, circuit, options: CircuitRunningOption):
|
|
28
|
-
logger.debug(
|
|
29
|
-
'[RigettiPyquilDevice] Creating job with {0} shots'.format(
|
|
30
|
-
options.shots))
|
|
31
|
-
|
|
32
|
-
circuit.wrap_in_numshots_loop(options.shots)
|
|
33
|
-
executable = self.device.compile(circuit)
|
|
34
|
-
|
|
35
|
-
return self.device.qam.execute(executable)
|
|
36
|
-
|
|
37
|
-
def _is_simulator(self) -> bool:
|
|
38
|
-
logger.debug('[RigettiPyquilDevice] is quantum machine')
|
|
39
|
-
return False
|
|
40
|
-
|
|
41
|
-
def _get_provider_job_id(self, job) -> str:
|
|
42
|
-
logger.debug('[PyquilDevice] Getting job id')
|
|
43
|
-
|
|
44
|
-
job_id = job.job_id
|
|
45
|
-
|
|
46
|
-
save_dir = "/home/app"
|
|
47
|
-
|
|
48
|
-
file_path = os.path.join(save_dir, f"{job_id}.pkl")
|
|
49
|
-
|
|
50
|
-
with open(file_path, "wb") as f:
|
|
51
|
-
pickle.dump(job,f)
|
|
52
|
-
|
|
53
|
-
print("Job ID: ", job_id)
|
|
54
|
-
|
|
55
|
-
return job_id
|
|
56
|
-
|
|
57
|
-
def _get_job_status(self, job) -> str:
|
|
58
|
-
logger.debug('[PyquilDevice] Getting job status')
|
|
59
|
-
|
|
60
|
-
return "RUNNING"
|
|
61
|
-
|
|
62
|
-
def _calculate_execution_time(self, job_result):
|
|
63
|
-
|
|
64
|
-
logger.debug('[PyquilDevice] Getting execution time')
|
|
65
|
-
return None
|
|
66
|
-
|
|
67
|
-
def _get_job_result(self, job) -> dict:
|
|
68
|
-
|
|
69
|
-
return None
|
|
70
|
-
|
|
71
|
-
def _produce_histogram_data(self, job_result) -> dict | None:
|
|
72
|
-
logger.info('[PyquilDevice] Producing histogram data')
|
|
73
|
-
|
|
74
|
-
return None
|
|
75
|
-
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/component/backend/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/factory/pyquil_provider_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/handler/job_fetching_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/quapp_pyquil.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|