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