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.
Files changed (33) hide show
  1. {quapp_pyquil-0.0.4.dev1/quapp_pyquil.egg-info → quapp_pyquil-0.0.4.dev3}/PKG-INFO +2 -2
  2. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/pyproject.toml +2 -2
  3. quapp_pyquil-0.0.4.dev3/qapp_pyquil/async_tasks/pyquil_circuit_export_task.py +25 -0
  4. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/component/backend/pyquil_invocation.py +5 -4
  5. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/component/backend/pyquil_job_fetching.py +1 -2
  6. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/factory/pyquil_device_factory.py +0 -1
  7. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/factory/pyquil_handler_factory.py +8 -9
  8. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/handler/invocation_handler.py +1 -2
  9. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/device/qapp_pyquil_device.py +17 -23
  10. quapp_pyquil-0.0.4.dev3/qapp_pyquil/model/device/rigetti_pyquil_device.py +175 -0
  11. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3/quapp_pyquil.egg-info}/PKG-INFO +2 -2
  12. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/quapp_pyquil.egg-info/requires.txt +1 -1
  13. quapp_pyquil-0.0.4.dev1/qapp_pyquil/async_tasks/pyquil_circuit_export_task.py +0 -62
  14. quapp_pyquil-0.0.4.dev1/qapp_pyquil/model/device/rigetti_pyquil_device.py +0 -75
  15. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/LICENSE +0 -0
  16. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/README.md +0 -0
  17. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/__init__.py +0 -0
  18. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/async_tasks/__init__.py +0 -0
  19. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/component/__init__.py +0 -0
  20. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/component/backend/__init__.py +0 -0
  21. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/factory/__init__.py +0 -0
  22. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/factory/pyquil_provider_factory.py +0 -0
  23. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/handler/__init__.py +0 -0
  24. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/handler/job_fetching_handler.py +0 -0
  25. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/__init__.py +0 -0
  26. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/device/__init__.py +0 -0
  27. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/provider/__init__.py +0 -0
  28. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/provider/qapp_pyquil_provider.py +0 -0
  29. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/qapp_pyquil/model/provider/rigetti_pyquil_provider.py +0 -0
  30. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/quapp_pyquil.egg-info/SOURCES.txt +0 -0
  31. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/quapp_pyquil.egg-info/dependency_links.txt +0 -0
  32. {quapp_pyquil-0.0.4.dev1 → quapp_pyquil-0.0.4.dev3}/quapp_pyquil.egg-info/top_level.txt +0 -0
  33. {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.dev1
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.dev3
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.dev1"
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.dev3",
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 (job.execution_duration_microseconds is not None):
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")
@@ -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
@@ -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 ..handler.job_fetching_handler import JobFetchingHandler
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
- 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
+ # )
@@ -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
 
@@ -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.project_header import ProjectHeader
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: ProjectHeader):
87
- """
88
- @param project_header: project header
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.dev1
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.dev3
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,4 +1,4 @@
1
- quapp-common==0.0.11.dev3
1
+ quapp-common==0.0.11.dev6
2
2
  pyquil==4.15.0
3
3
 
4
4
  [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
-