Source code for qrisp.interface.qunicorn.backend_client
"""
\********************************************************************************
* Copyright (c) 2023 the Qrisp authors
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License, v. 2.0 are satisfied: GNU General Public License, version 2
* with the GNU Classpath Exception which is
* available at https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
********************************************************************************/
"""
"""
This file sets up a client adhering to the interface specified by the Qunicorn middleware
developed in the SeQuenC project: https://sequenc.de/
To learn more about Qunicorn check out the Qunicorn GitHub: https://github.com/qunicorn/qunicorn-core
And it's documentation:
https://qunicorn-core.readthedocs.io/en/latest/index.html
"""
import requests
import time
[docs]
class BackendClient:
"""
This object allows connecting to Qunicorn backend servers.
Parameters
----------
socket_ip : string
The IP address of the socket of the target server.
port : int
The port on which the server is listening.
Examples
--------
We assume that the example from BackendServer has been executed in the same console.
>>> from qrisp.interface import BackendClient
>>> example_backend = BackendClient(api_endpoint = "127.0.0.1", port = 8080)
>>> from qrisp import QuantumCircuit
>>> qc = QuantumCircuit(2)
>>> qc.h(0)
>>> qc.cx(0,1)
>>> qc.measure(qc.qubits)
>>> example_backend.run(qc, shots = 1000)
{'00': 510, '11': 490}
"""
[docs]
def __init__(self, api_endpoint, port=None, token = ""):
#https anstatt http
api_endpoint = 'http://' + api_endpoint
#if api_endpoint[:8] != 'http://':
# api_endpoint = 'http://' + api_endpoint
if port is None:
port = 9010
self.port = port
self.token = token
self.api_endpoint = api_endpoint + ":" + str(port)
#Executes
[docs]
def run(self, qc, shots):
qasm_str = qc.qasm()
deployment_data = {
"programs": [
{
"quantumCircuit": qasm_str,
"assemblerLanguage": "QASM2",
"pythonFilePath": "",
"pythonFileMetadata": ""
}
],
"name": ""
}
deployment_response = requests.post(f'{self.api_endpoint}/deployments', json = deployment_data, verify = False)
if deployment_response.status_code == 422:
raise Exception(f'Unprocessable quantum ciruict {deployment_response.status_code}')
elif deployment_response.status_code != 201:
print(deployment_response.status_code)
raise Exception(f'Failed to deploy quantum circuit {deployment_response.status_code}')
deployment_id = deployment_response.json()["id"]
job_data = {
"name": "",
"providerName": "",
"deviceName": "",
"shots": shots,
"token": self.token,
"type": "RUNNER",
"deploymentId": deployment_id
}
job_post_response = requests.post(f'{self.api_endpoint}/jobs', json = job_data, verify = False)
if deployment_response.status_code == 422:
raise Exception(f'Unprocessable quantum ciruict (status code: {job_post_response.status_code})')
elif deployment_response.status_code != 201:
raise Exception(f'Failed to post job (status code: {job_post_response.status_code})')
job_id = job_post_response.json()["id"]
job_running = True
while True:
job_get_response = requests.get(f'{self.api_endpoint}/jobs/{job_id}', json = job_data, verify = False)
if job_get_response.status_code != 201:
raise Exception(f'Quantum circuit execution failed: {job_get_response.json()["message"]}')
job_state = job_get_response.json()["state"]
if job_state == "finished":
break
time.sleep(0.1)
results = job_get_response.json()["results"][0]["results"]
return results