quapp-pyquil 0.0.4.dev1__tar.gz → 0.0.4.dev2__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.dev2}/PKG-INFO +1 -1
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/pyproject.toml +1 -1
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/factory/pyquil_handler_factory.py +4 -5
- quapp_pyquil-0.0.4.dev2/qapp_pyquil/model/device/rigetti_pyquil_device.py +176 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2/quapp_pyquil.egg-info}/PKG-INFO +1 -1
- 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.dev2}/LICENSE +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/README.md +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/async_tasks/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/async_tasks/pyquil_circuit_export_task.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/component/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/component/backend/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/component/backend/pyquil_invocation.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/component/backend/pyquil_job_fetching.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/factory/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/factory/pyquil_device_factory.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/factory/pyquil_provider_factory.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/handler/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/handler/invocation_handler.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/handler/job_fetching_handler.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/device/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/device/qapp_pyquil_device.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/provider/__init__.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/provider/qapp_pyquil_provider.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/provider/rigetti_pyquil_provider.py +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/quapp_pyquil.egg-info/SOURCES.txt +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/quapp_pyquil.egg-info/dependency_links.txt +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/quapp_pyquil.egg-info/requires.txt +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/quapp_pyquil.egg-info/top_level.txt +0 -0
- {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/setup.cfg +0 -0
|
@@ -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.dev2"
|
|
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" }]
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/factory/pyquil_handler_factory.py
RENAMED
|
@@ -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
|
+
# )
|
|
@@ -0,0 +1,176 @@
|
|
|
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
|
+
from quapp_common.data.response.job_response import JobResponse
|
|
18
|
+
|
|
19
|
+
from quapp_common.component.callback.update_job_metadata import update_job_metadata
|
|
20
|
+
from quapp_common.enum.status.job_status import JobStatus
|
|
21
|
+
from quapp_common.enum.media_type import MediaType
|
|
22
|
+
from quapp_common.enum.status.status_code import StatusCode
|
|
23
|
+
from quapp_common.data.callback.callback_url import CallbackUrl
|
|
24
|
+
import pickle
|
|
25
|
+
import time
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class RigettiPyquilDevice(Device):
|
|
29
|
+
def __init__(self, provider: Provider, device_specification: str):
|
|
30
|
+
super().__init__(provider, device_specification)
|
|
31
|
+
logger.debug('[RigettiPyquilDevice] Initializing device specification')
|
|
32
|
+
self.device_specification = device_specification
|
|
33
|
+
|
|
34
|
+
def _create_job(self, circuit, options: CircuitRunningOption):
|
|
35
|
+
logger.debug(
|
|
36
|
+
'[RigettiPyquilDevice] Creating job with {0} shots'.format(
|
|
37
|
+
options.shots))
|
|
38
|
+
|
|
39
|
+
circuit.wrap_in_numshots_loop(options.shots)
|
|
40
|
+
executable = self.device.compile(circuit)
|
|
41
|
+
|
|
42
|
+
return self.device.qam.execute(executable)
|
|
43
|
+
|
|
44
|
+
def _is_simulator(self) -> bool:
|
|
45
|
+
logger.debug('[RigettiPyquilDevice] is quantum machine')
|
|
46
|
+
return False
|
|
47
|
+
|
|
48
|
+
def _get_provider_job_id(self, job) -> str:
|
|
49
|
+
logger.debug('[PyquilDevice] Getting job id')
|
|
50
|
+
|
|
51
|
+
return job.job_id
|
|
52
|
+
|
|
53
|
+
def _get_job_status(self, job) -> str:
|
|
54
|
+
logger.debug('[PyquilDevice] Getting job status')
|
|
55
|
+
|
|
56
|
+
return "RUNNING"
|
|
57
|
+
|
|
58
|
+
def _calculate_execution_time(self, job_result):
|
|
59
|
+
logger.debug('[PyquilDevice] Getting execution time {}',job_result)
|
|
60
|
+
|
|
61
|
+
# the time unit is miliseconds
|
|
62
|
+
return job_result.execution_duration_microseconds/1000
|
|
63
|
+
|
|
64
|
+
def _get_job_result(self, job):
|
|
65
|
+
|
|
66
|
+
return self.device.qam.get_result(job)
|
|
67
|
+
|
|
68
|
+
def _produce_histogram_data(self, job_result) -> dict | None:
|
|
69
|
+
logger.info('[PyquilDevice] Producing histogram data')
|
|
70
|
+
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
def _on_execution(self, authentication: Authentication,
|
|
74
|
+
project_header: ProjectHeader,
|
|
75
|
+
execution_callback: CallbackUrl,
|
|
76
|
+
circuit,
|
|
77
|
+
options: CircuitRunningOption):
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
@param authentication: authentication information
|
|
81
|
+
@param project_header: project header information
|
|
82
|
+
@param execution_callback: execution step callback urls
|
|
83
|
+
@param circuit: circuit will be run
|
|
84
|
+
@param options: options will use for running
|
|
85
|
+
@return: job and job response
|
|
86
|
+
"""
|
|
87
|
+
logger.debug("[Invocation] On execution")
|
|
88
|
+
|
|
89
|
+
job_response = JobResponse(authentication=authentication,
|
|
90
|
+
project_header=project_header,
|
|
91
|
+
status_code=StatusCode.DONE)
|
|
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
|
+
logger.debug("fetching job result")
|
|
104
|
+
|
|
105
|
+
try:
|
|
106
|
+
res = self._get_job_result(job)
|
|
107
|
+
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
|
+
logger.debug("Job result not ready yet: {}".format(str(e)))
|
|
114
|
+
time.sleep(5)
|
|
115
|
+
|
|
116
|
+
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
|
+
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
|
+
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
|
+
# original_job_result_dict = JsonParserUtils.parse(original_job_result)
|
|
154
|
+
self.execution_time = self._calculate_execution_time(original_job_result)
|
|
155
|
+
|
|
156
|
+
job_response.execution_time = self.execution_time
|
|
157
|
+
logger.debug("Execution time: {}".format(job_response.execution_time))
|
|
158
|
+
|
|
159
|
+
update_job_metadata(
|
|
160
|
+
job_response=job_response,
|
|
161
|
+
callback_url=analysis_callback.on_done)
|
|
162
|
+
|
|
163
|
+
return job_response
|
|
164
|
+
|
|
165
|
+
except Exception as exception:
|
|
166
|
+
logger.error("Invocation - Exception when analyst job result : {0}".format(
|
|
167
|
+
str(exception)))
|
|
168
|
+
|
|
169
|
+
job_response.status_code = StatusCode.ERROR
|
|
170
|
+
job_response.content_type = MediaType.APPLICATION_JSON
|
|
171
|
+
job_response.job_status = JobStatus.ERROR.value
|
|
172
|
+
job_response.job_result = {"error": str(exception)}
|
|
173
|
+
|
|
174
|
+
update_job_metadata(job_response=job_response,
|
|
175
|
+
callback_url=analysis_callback.on_error)
|
|
176
|
+
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
|
|
File without changes
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/component/backend/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/factory/pyquil_device_factory.py
RENAMED
|
File without changes
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/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.dev2}/qapp_pyquil/handler/invocation_handler.py
RENAMED
|
File without changes
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/handler/job_fetching_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/device/qapp_pyquil_device.py
RENAMED
|
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.dev2}/quapp_pyquil.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|