Skip to content

Commit 7f5932e

Browse files
committed
Merge branch 'main' of github.com:SURFQuantum/qc-quantum-linear-systems
2 parents d7f445d + 36fe367 commit 7f5932e

File tree

6 files changed

+94
-1632
lines changed

6 files changed

+94
-1632
lines changed

.github/workflows/publish_pypi.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
name: Python package
2+
on:
3+
push:
4+
tags:
5+
- "v*.*.*"
6+
workflow_dispatch:
7+
jobs:
8+
build:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- uses: actions/checkout@v3
12+
- name: Build and publish to pypi
13+
uses: JRubics/poetry-publish@v1.17
14+
with:
15+
pypi_token: ${{ secrets.PYPI_API_TOKEN }}

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
CHANGELOG
2+
=========
3+
4+
2023-11-28 (0.1.0)
5+
---
6+
* initial release

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
[![PyPI Version](https://img.shields.io/pypi/v/quantum-linear-systems.svg)](https://pypi.org/project/quantum-linear-systems)
2+
![Python Version](https://img.shields.io/badge/Python-3.9%20%E2%86%92%203.12-blue)
3+
![CI/CD](https://github.com/SURFQuantum/qc-quantum-linear-systems/actions/workflows/actions.yml/badge.svg)
14
[![Coverage Status](https://coveralls.io/repos/github/SURFQuantum/qc-quantum-linear-systems/badge.svg?branch=main)](https://coveralls.io/github/SURFQuantum/qc-quantum-linear-systems?branch=main)
25

36
# quantum-linear-systems

pyproject.toml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,20 @@ name = "quantum-linear-systems"
33
version = "0.1.0"
44
description = "Quantum algorithms to solve linear systems of equations."
55
authors = ["dmark04 <dmark04@web.de>"]
6-
license = "Apache 2.0"
6+
license = "Apache-2.0"
77
readme = "README.md"
8+
keywords = ["science", "quantum"]
9+
repository = "https://github.com/SURFQuantum/qc-quantum-linear-systems"
10+
classifiers=[
11+
"Development Status :: 4 - Beta",
12+
"Programming Language :: Python :: 3.9",
13+
"Programming Language :: Python :: 3.10",
14+
"Programming Language :: Python :: 3.11",
15+
"License :: OSI Approved :: Apache Software License",
16+
"Operating System :: OS Independent",
17+
"Topic :: Scientific/Engineering",
18+
]
19+
include = ["CHANGELOG.md"]
820

921
[tool.poetry.dependencies]
1022
python = ">=3.9, <3.12" # >=3.9 because of amazon-braket, <3.12 because of classiq

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)