7
7
from typing import Tuple
8
8
9
9
import boto3
10
- from braket .aws import AwsSession
10
+ from braket .aws import AwsQuantumJob
11
11
from braket .devices import Devices
12
12
from braket .jobs import OutputDataConfig
13
13
from braket .jobs .hybrid_job import hybrid_job
14
14
from braket .tracking import Tracker
15
15
from qiskit import QuantumCircuit
16
16
from qiskit .primitives import BackendEstimator
17
- from qiskit .providers import JobStatus
18
17
from qiskit .providers import ProviderV1
19
18
from qiskit .result import Result
20
19
from qiskit .visualization import plot_histogram
21
20
from qiskit_braket_provider import AWSBraketProvider
22
21
from qiskit_braket_provider import BraketLocalBackend
23
- from qiskit_braket_provider .providers .braket_job import AmazonBraketTask
24
22
25
23
from quantum_linear_systems .implementations .vqls_qiskit_implementation import (
26
24
solve_vqls_qiskit ,
@@ -43,43 +41,66 @@ def run_real_device_aws(
43
41
"""Run circuit on real AWS BraKet device."""
44
42
provider : ProviderV1 = AWSBraketProvider ()
45
43
# select device by name
44
+ device = None
46
45
if device_name == "ionq" :
47
- backend = provider . get_backend ( "IonQ Device" )
46
+ device = "arn:aws:braket:::device/qpu/ionq/ionQdevice"
48
47
elif device_name == "rigetti" :
49
- backend = provider . get_backend ( " Aspen-M-1")
48
+ device = "arn:aws:braket:::device/qpu/rigetti/ Aspen-M-1"
50
49
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"
54
51
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." )
56
54
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 )
58
57
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 ())
62
61
63
62
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
66
65
) -> 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 ."""
69
68
while True :
70
- status = braket_task . status ()
69
+ state = aws_quantum_job . state ()
71
70
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
75
94
else :
76
95
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 } "
78
97
)
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
+ )
83
104
time .sleep (seconds_interval )
84
105
85
106
@@ -132,16 +153,13 @@ def aws_s3_folder(folder_name: str) -> Tuple[str, str]:
132
153
)
133
154
134
155
# 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
+ )
141
159
142
160
@hybrid_job (
143
161
device = device_arn ,
144
- # role_arn=role_arn ,
162
+ role_arn = surf_role_arn ,
145
163
output_data_config = output_data_config ,
146
164
dependencies = "aws_requirements.txt" ,
147
165
local = args .local ,
@@ -176,17 +194,17 @@ def execute_hybrid_job() -> None:
176
194
177
195
with Tracker () as tracker :
178
196
# submit the job
179
- job = execute_hybrid_job ()
197
+ job : AwsQuantumJob = execute_hybrid_job ()
180
198
181
- check_task_status ( braket_task = job , seconds_interval = 10 )
199
+ check_job_status ( aws_quantum_job = job , seconds_interval = 10 )
182
200
183
201
# 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 ()} ." )
185
203
186
204
# Retrieve results if job is completed
187
205
if job .state () == "COMPLETED" :
188
206
result = job .result ()
189
207
print ("Job result:" , result )
190
- # display the results
191
- print (job . result () .measurement_counts )
208
+ # display the results
209
+ print (result .measurement_counts )
192
210
print (tracker .simulator_tasks_cost ())
0 commit comments