Skip to content

Commit 9833d76

Browse files
authored
feature/ready for real device (#16)
* added tag to hybrid_job * modified role * try setting role with envvar * try getting defautl role * added coverage workflow * moved coveralls integrateion to test workflow * added token and changed to lcov format for coverage * upload cov only on python 3.10 * added coverage badge to readme * updated name of TrackHHL toymodel to reflect number of detectors and particles * added python version to precommit-autopdate * updated classiq to latest version * fixed aws_roles * updated check_job_status on aws
1 parent 6e5d83b commit 9833d76

File tree

2 files changed

+59
-41
lines changed

2 files changed

+59
-41
lines changed

poetry.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

quantum_linear_systems/execution/aws_execution.py

Lines changed: 56 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,18 @@
77
from typing import Tuple
88

99
import boto3
10-
from braket.aws import AwsSession
10+
from braket.aws import AwsQuantumJob
1111
from braket.devices import Devices
1212
from braket.jobs import OutputDataConfig
1313
from braket.jobs.hybrid_job import hybrid_job
1414
from braket.tracking import Tracker
1515
from qiskit import QuantumCircuit
1616
from qiskit.primitives import BackendEstimator
17-
from qiskit.providers import JobStatus
1817
from qiskit.providers import ProviderV1
1918
from qiskit.result import Result
2019
from qiskit.visualization import plot_histogram
2120
from qiskit_braket_provider import AWSBraketProvider
2221
from qiskit_braket_provider import BraketLocalBackend
23-
from qiskit_braket_provider.providers.braket_job import AmazonBraketTask
2422

2523
from quantum_linear_systems.implementations.vqls_qiskit_implementation import (
2624
solve_vqls_qiskit,
@@ -43,43 +41,66 @@ def run_real_device_aws(
4341
"""Run circuit on real AWS BraKet device."""
4442
provider: ProviderV1 = AWSBraketProvider()
4543
# select device by name
44+
device = None
4645
if device_name == "ionq":
47-
backend = provider.get_backend("IonQ Device")
46+
device = "arn:aws:braket:::device/qpu/ionq/ionQdevice"
4847
elif device_name == "rigetti":
49-
backend = provider.get_backend("Aspen-M-1")
48+
device = "arn:aws:braket:::device/qpu/rigetti/Aspen-M-1"
5049
elif device_name == "oqc":
51-
backend = provider.get_backend("Lucy")
52-
else:
53-
return ValueError(f"{device_name} not in the list of known device names.")
50+
device = "arn:aws:braket:::device/qpu/oqc/Lucy"
5451

55-
task = backend.run(circuit, shots=shots)
52+
if device is None:
53+
raise ValueError(f"{device_name} not in the list of known device ARNs.")
5654

57-
retrieved_job: AmazonBraketTask = backend.retrieve_job(job_id=task.job_id())
55+
backend = provider.get_backend(device)
56+
aws_quantum_job = backend.run(circuit, shots=shots)
5857

59-
check_task_status(braket_task=retrieved_job)
60-
result = retrieved_job.result()
61-
plot_histogram(result.get_counts())
58+
check_job_status(aws_quantum_job=aws_quantum_job)
59+
job_result = aws_quantum_job.result()
60+
plot_histogram(job_result.get_counts())
6261

6362

64-
def check_task_status(
65-
braket_task: AmazonBraketTask, seconds_interval: int = 10
63+
def check_job_status(
64+
aws_quantum_job: AwsQuantumJob, seconds_interval: int = 10
6665
) -> None:
67-
"""Check task status every `second_interval` seconds until the quantum task is
68-
done."""
66+
"""Check job status every `seconds_interval` seconds until the quantum job is done
67+
or failed."""
6968
while True:
70-
status = braket_task.status()
69+
state = aws_quantum_job.state()
7170
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
72-
if status == JobStatus.DONE:
73-
print(f"{current_time} - Your quantum task {braket_task.task_id} is done!")
74-
break # Exit the loop if the job is done
71+
72+
if state == "COMPLETED":
73+
print(
74+
f"{current_time} - Your quantum job {aws_quantum_job.arn} has completed successfully."
75+
)
76+
# Retrieve and print job result
77+
result = aws_quantum_job.result()
78+
print("Job result:", result)
79+
# Print measurement probabilities if available
80+
if "measurementProbabilities" in result:
81+
print("Measurement Probabilities:", result["measurementProbabilities"])
82+
break
83+
elif state == "FAILED":
84+
print(f"{current_time} - Your quantum job {aws_quantum_job.arn} failed.")
85+
# Retrieve and print job metadata for debugging
86+
metadata = aws_quantum_job.metadata()
87+
print("Job failed with metadata:", metadata)
88+
# Display logs for debugging
89+
try:
90+
aws_quantum_job.logs(wait=False)
91+
except Exception as e:
92+
print("An error occurred while retrieving logs:", e)
93+
break
7594
else:
7695
print(
77-
f"{current_time} - Current status of your quantum task {braket_task.task_id} is: {status}"
96+
f"{current_time} - Current status of your quantum job {aws_quantum_job.arn} is: {state}"
7897
)
79-
if status == JobStatus.QUEUED:
80-
print(
81-
f"{current_time} - Your position in the queue is {braket_task.queue_position()}"
82-
)
98+
if state == "QUEUED":
99+
queue_info = aws_quantum_job.queue_position()
100+
if queue_info and queue_info.queue_position:
101+
print(
102+
f"{current_time} - Your position in the queue is {queue_info.queue_position}"
103+
)
83104
time.sleep(seconds_interval)
84105

85106

@@ -132,16 +153,13 @@ def aws_s3_folder(folder_name: str) -> Tuple[str, str]:
132153
)
133154

134155
# Define the role ARN for executing the hybrid job (replace with your actual role ARN)
135-
# role_arn = "arn:aws:iam::815925483357:role/surf-administrator"
136-
os.environ[
137-
"BRAKET_JOBS_ROLE_ARN"
138-
] = "arn:aws:iam::815925483357:role/src-workspace-AmazonBraketJobsExecutionRole"
139-
aws_session = AwsSession()
140-
print("Default role", aws_session.get_default_jobs_role())
156+
surf_role_arn = (
157+
"arn:aws:iam::815925483357:role/src-workspace-AmazonBraketJobsExecutionRole"
158+
)
141159

142160
@hybrid_job(
143161
device=device_arn,
144-
# role_arn=role_arn,
162+
role_arn=surf_role_arn,
145163
output_data_config=output_data_config,
146164
dependencies="aws_requirements.txt",
147165
local=args.local,
@@ -176,17 +194,17 @@ def execute_hybrid_job() -> None:
176194

177195
with Tracker() as tracker:
178196
# submit the job
179-
job = execute_hybrid_job()
197+
job: AwsQuantumJob = execute_hybrid_job()
180198

181-
check_task_status(braket_task=job, seconds_interval=10)
199+
check_job_status(aws_quantum_job=job, seconds_interval=10)
182200

183201
# Check the final status
184-
print(f"Job {job.id} finished with status {job.state()}.")
202+
print(f"Job {job.arn} finished with status {job.state()}.")
185203

186204
# Retrieve results if job is completed
187205
if job.state() == "COMPLETED":
188206
result = job.result()
189207
print("Job result:", result)
190-
# display the results
191-
print(job.result().measurement_counts)
208+
# display the results
209+
print(result.measurement_counts)
192210
print(tracker.simulator_tasks_cost())

0 commit comments

Comments
 (0)