quapp-pyquil 0.0.3.dev2__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.
Files changed (32) hide show
  1. {quapp_pyquil-0.0.3.dev2/quapp_pyquil.egg-info → quapp_pyquil-0.0.4.dev2}/PKG-INFO +1 -1
  2. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/pyproject.toml +1 -2
  3. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/component/backend/pyquil_job_fetching.py +5 -1
  4. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/factory/pyquil_handler_factory.py +4 -5
  5. quapp_pyquil-0.0.4.dev2/qapp_pyquil/model/device/rigetti_pyquil_device.py +176 -0
  6. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2/quapp_pyquil.egg-info}/PKG-INFO +1 -1
  7. quapp_pyquil-0.0.3.dev2/qapp_pyquil/model/device/rigetti_pyquil_device.py +0 -70
  8. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/LICENSE +0 -0
  9. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/README.md +0 -0
  10. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/__init__.py +0 -0
  11. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/async_tasks/__init__.py +0 -0
  12. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/async_tasks/pyquil_circuit_export_task.py +0 -0
  13. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/component/__init__.py +0 -0
  14. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/component/backend/__init__.py +0 -0
  15. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/component/backend/pyquil_invocation.py +0 -0
  16. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/factory/__init__.py +0 -0
  17. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/factory/pyquil_device_factory.py +0 -0
  18. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/factory/pyquil_provider_factory.py +0 -0
  19. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/handler/__init__.py +0 -0
  20. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/handler/invocation_handler.py +0 -0
  21. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/handler/job_fetching_handler.py +0 -0
  22. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/__init__.py +0 -0
  23. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/device/__init__.py +0 -0
  24. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/device/qapp_pyquil_device.py +0 -0
  25. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/provider/__init__.py +0 -0
  26. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/provider/qapp_pyquil_provider.py +0 -0
  27. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/qapp_pyquil/model/provider/rigetti_pyquil_provider.py +0 -0
  28. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/quapp_pyquil.egg-info/SOURCES.txt +0 -0
  29. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/quapp_pyquil.egg-info/dependency_links.txt +0 -0
  30. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/quapp_pyquil.egg-info/requires.txt +0 -0
  31. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/quapp_pyquil.egg-info/top_level.txt +0 -0
  32. {quapp_pyquil-0.0.3.dev2 → quapp_pyquil-0.0.4.dev2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quapp-pyquil
3
- Version: 0.0.3.dev2
3
+ Version: 0.0.4.dev2
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)
@@ -1,11 +1,10 @@
1
-
2
1
  [build-system]
3
2
  requires = ["setuptools>=61.0.0", "wheel"]
4
3
  build-backend = "setuptools.build_meta"
5
4
 
6
5
  [project]
7
6
  name = "quapp-pyquil"
8
- version = "0.0.3.dev2"
7
+ version = "0.0.4.dev2"
9
8
  description = "QApp pyquil library supporting QApp Platform for Quantum Computing"
10
9
  readme = "README.md"
11
10
  authors = [{ name = "CITYNOW Co. Ltd. ", email = "corp@citynow.vn" }]
@@ -38,7 +38,11 @@ class PyquilJobFetching(JobFetcher):
38
38
  job_id = self.provider_job_id
39
39
  device = self._collect_provider()
40
40
 
41
- with open(job_id+".pkl", 'rb') as file:
41
+ save_dir = "/home/app"
42
+
43
+ file_path = os.path.join(save_dir, f"{job_id}.pkl")
44
+
45
+ with open(file_path, 'rb') as file:
42
46
  data = pickle.load(file)
43
47
 
44
48
  res = device.qam.get_result(data)
@@ -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
- logger.debug("Create JobFetchingHandler")
30
- return JobFetchingHandler(
31
- request_data=request_data, post_processing_fn=post_processing_fn
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quapp-pyquil
3
- Version: 0.0.3.dev2
3
+ Version: 0.0.4.dev2
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)
@@ -1,70 +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
-
9
- from quapp_common.data.response.authentication import Authentication
10
- from quapp_common.data.response.project_header import ProjectHeader
11
- from quapp_common.model.device.device import Device
12
- from quapp_common.config.logging_config import logger
13
- from quapp_common.data.device.circuit_running_option import CircuitRunningOption
14
- from quapp_common.model.provider.provider import Provider
15
- from quapp_common.enum.invocation_step import InvocationStep
16
-
17
- import pickle
18
-
19
-
20
- class RigettiPyquilDevice(Device):
21
- def __init__(self, provider: Provider, device_specification: str):
22
- super().__init__(provider, device_specification)
23
- logger.debug('[RigettiPyquilDevice] Initializing device specification')
24
- self.device_specification = device_specification
25
-
26
- def _create_job(self, circuit, options: CircuitRunningOption):
27
- logger.debug(
28
- '[RigettiPyquilDevice] Creating job with {0} shots'.format(
29
- options.shots))
30
-
31
- circuit.wrap_in_numshots_loop(options.shots)
32
- executable = self.device.compile(circuit)
33
-
34
- return self.device.qam.execute(executable)
35
-
36
- def _is_simulator(self) -> bool:
37
- logger.debug('[RigettiPyquilDevice] is quantum machine')
38
- return False
39
-
40
- def _get_provider_job_id(self, job) -> str:
41
- logger.debug('[PyquilDevice] Getting job id')
42
-
43
- job_id = job.job_id
44
-
45
- with open(job_id + ".pkl", "wb") as f:
46
- pickle.dump(job,f)
47
-
48
- print("Job ID: ", job_id)
49
-
50
- return job_id
51
-
52
- def _get_job_status(self, job) -> str:
53
- logger.debug('[PyquilDevice] Getting job status')
54
-
55
- return "RUNNING"
56
-
57
- def _calculate_execution_time(self, job_result):
58
-
59
- logger.debug('[PyquilDevice] Getting execution time')
60
- return None
61
-
62
- def _get_job_result(self, job) -> dict:
63
-
64
- return None
65
-
66
- def _produce_histogram_data(self, job_result) -> dict | None:
67
- logger.info('[PyquilDevice] Producing histogram data')
68
-
69
- return None
70
-