Skip to main content
IBM Quantum Platform

Kalkulationsmodul mit der REST-API

Paketversionen

Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt. Wir empfehlen, diese Versionen oder neuere zu verwenden.

qiskit[all]~=2.3.0

Die Schritte in diesem Abschnitt beschreiben, wie Sie Workloads über die REST-API ausführen und konfigurieren, und zeigen, wie Sie diese in einem Programm Ihrer Wahl aufrufen können.

Note

In dieser Dokumentation wird das Modul requests „ Python “ verwendet, um die REST-API zu veranschaulichen. Dieser Workflow kann jedoch mit jeder Sprache oder jedem Framework ausgeführt werden, die bzw. das die Arbeit mit REST-APIs unterstützt. Weitere Informationen finden Sie in der API-Referenzdokumentation.


1. Konto einrichten

Da es sich bei Estimator um einen Managed Service handelt, müssen Sie zunächst Ihr Konto einrichten. Anschließend können Sie das Gerät auswählen, das Sie zur Berechnung des Erwartungswerts verwenden möchten.

In diesem Abschnitt erfahren Sie, wie Sie Ihr Konto einrichten, verfügbare Backends anzeigen und Tokens ungültig machen können.


2. Erstellen Sie eine QASM-Schaltung

Sie benötigen mindestens einen Schaltkreis als Eingabe für die Estimator-Primitive.

Definieren Sie einen QASM-Quantenschaltkreis. Zum Beispiel:

qasm_string='''
OPENQASM 3;
include "stdgates.inc";
qreg q[2];
creg c[2];
x q[0];
cx q[0], q[1];
c[0] = measure q[0];
c[1] = measure q[1];
'''

Die folgenden Codeausschnitte gehen davon aus, dass in eine neue qasm_string Zeichenkette transpiliert resulting_qasm wurde.


3. Führen Sie den Quantenschaltkreis mithilfe der Estimator- V2 -API aus

Note

Die folgenden Jobs verwenden die Primitive „ IBM Quantum “ und „ V2 “. Sowohl SamplerV2 als auch EstimatorV2 nehmen einen oder mehrere primitive vereinheitlichte Blöcke (PUBs) als Eingabe entgegen. Jedes „ PUB “ ist ein Tupel, das einen Schaltkreis und die an diesen Schaltkreis übertragenen Daten enthält; dabei kann es sich um mehrere Observables und Parameter handeln. Jeder Aufruf von PUB liefert ein Ergebnis zurück.

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }

job_input = {
    'program_id': 'estimator',
    "backend": backend,
    "params": {
        "pubs": [ #primitive unified blocs (PUBs) containing one circuit each.
            [resulting_qasm, # QASM circuit
             {"IIZII": 1, "XIZZZ": 2.3}, # Observable
             None # parameter values
             ]]
}}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print("Job created:",response.text)
else:
    print(f"Error: {response.status_code}")

4. Auftragsstatus prüfen und Ergebnisse abrufen

Geben Sie anschließend die job_id an die API weiter:

response_status_singlejob= requests.get(url+'/'+job_id, headers=headers)
response_status_singlejob.json().get('state')

Ausgabe

>>> Job ID: 58223448-5100-4dec-a47a-942fb30edcad
>>> Job Status: JobStatus.RUNNING

Ergebnisse anzeigen:

response_result= requests.get(url+'/'+job_id+'/results', headers=headers)

res_dict=response_result.json()

estimator_result=res_dict['results']
print(estimator_result)

Ausgabe

[{'data': {'evs': 0.7428980350102542, 'stds': 0.029884014518789213, 'ensemble_standard_error': 0.03261147170624149}, 'metadata': {'shots': 10016, 'target_precision': 0.01, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}}]

5. Mit Optionen arbeiten

Mithilfe von Techniken zur Fehlerminderung können Benutzer Schaltungsfehler minimieren, indem sie das Rauschen des Bausteins zum Zeitpunkt der Ausführung modellieren. Dies führt in der Regel zu einem Aufwandsaufwand bei der Quantenvorverarbeitung im Zusammenhang mit dem Modelltraining sowie zu einem Aufwandsaufwand bei der klassischen Nachbearbeitung, um Fehler in den Rohdaten mithilfe des generierten Modells zu beheben.

Die in die Primitive integrierten Techniken zur Fehlerminderung stellen erweiterte Optionen zur Ausfallsicherheit dar. Um diese Optionen festzulegen, verwenden Sie bei der Übermittlung Ihres Auftrags die resilience_level Option.

Die folgenden Beispiele veranschaulichen die Standardoptionen für dynamische Entkopplung, Twirling und TREX + ZNE. Weitere Optionen und Details finden Sie im Abschnitt „Techniken zur Fehlerminderung und -unterdrückung “.

TREX + ZNE

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "BACKEND_NAME"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }
job_input = {
    'program_id': 'estimator',
    "backend": backend,
    "params": {
        "pubs": [ #primitive unified blocs (PUBs) containing one circuit each
            [resulting_qasm, # QASM circuit
             {"IIZII": 1, "XIZZZ": 2.3}, # Observable
             None # parameter values
             ]]
        "options": {
            "resilience": {
              "measure_mitigation": True,
              "zne_mitigation": True,
              "zne": {
                  "extrapolator":["exponential", "linear"],
                  "noise_factors":[1, 3, 5],
              },
          },
        },
    }
}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print("Job created:",response.text)
else:
    print(f"Error: {response.status_code}")

Dynamische Entkopplung

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "BACKEND_NAME"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }
job_input = {
    'program_id': 'estimator',
    "backend": backend,
    "params": {
        "pubs": [ #primitive unified blocs (PUBs) containing one circuit each
            [resulting_qasm, # QASM circuit
             {"IIZII": 1, "XIZZZ": 2.3}, # Observable
             None # parameter values
             ]]
        "options": {
            "dynamical_decoupling": {
                "enable": True,
                "sequence_type": 'XpXm',
                "extra_slack_distribution": 'middle',
                "scheduling_method": 'alap',
            },
        },
    }
}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print("Job created:",response.text)
else:
    print(f"Error: {response.status_code}")

Wirbeln

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "BACKEND_NAME"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }
job_input = {
    'program_id': 'estimator',
    "backend": backend,
    "params": {
        "pubs": [ #primitive unified blocs (PUBs) containing one circuit each
            [resulting_qasm, # QASM circuit
             {"IIZII": 1, "XIZZZ": 2.3}, # Observable
             None # parameter values
             ]]
        "options": {
            "twirling": {
                "enable_gates": True,
                "enable_measure": True,
                "num_randomizations": "auto",
                "shots_per_randomization": "auto",
                "strategy": "active-accum",
                },
        },
    }
}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print("Job created:",response.text)
else:
    print(f"Error: {response.status_code}")

Parametrisierte Schaltungen

1. Konto einrichten

Zunächst müssen Sie Ihr Konto einrichten. Anschließend können Sie das Gerät auswählen, auf dem Sie Ihre Berechnungen durchführen möchten.

In diesem Abschnitt erfahren Sie, wie Sie Ihr Konto einrichten, verfügbare Backends anzeigen und Tokens ungültig machen können.

2. Parameter festlegen

import requests
import qiskit_ibm_runtime
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.qasm3 import dumps
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit import transpile

service = QiskitRuntimeService(channel='ibm_quantum')
backend = service.backend("<SPECIFY BACKEND>")

pm = generate_preset_pass_manager(backend=backend, optimization_level=1)

theta = Parameter('theta')
phi = Parameter('phi')
parameter_values = {'theta': 1.57, 'phi': 3.14}   # In case we want to pass a dictionary

3. Erstellen Sie einen Quantenschaltkreis und fügen Sie parametrisierte Gatter hinzu

qc = QuantumCircuit(2)

# Add parameterized gates
qc.rx(theta, 0)
qc.ry(phi, 1)
qc.cx(0, 1)
qc.measure_all()

# Draw the original circuit
qc.draw('mpl')

# Get an ISA circuit
isa_circuit = pm.run(qc)

4. QASM-3-Code generieren

qasm_str = dumps(isa_circuit)
print("Generated QASM 3 code:")
print(qasm_str)

5. Führen Sie den Quantenschaltkreis mithilfe der Estimator- V2 -API aus

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }

job_input = {
    'program_id': 'estimator',
    "backend": backend,
    "params": {
        # Choose one option: direct parameter transfer or through a dictionary
        #"pubs": [[qasm_str,[1,2],500]], # primitive unified blocs (PUBs) containing one circuit each.
        "pubs": [[qasm_str,parameter_values,500]], # primitive unified blocs (PUBs) containing one circuit each.
}}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print(f"Job created: {response.text}")
else:
    print(f"Error: {response.status_code}")
print(response.text)

6. Auftragsstatus prüfen und Ergebnisse abrufen

Geben Sie anschließend die job_id an die API weiter:

response_status_singlejob = requests.get(f"{url}/{job_id}", headers=headers)
response_status_singlejob.json().get('state')

Ausgabe

{'status': 'Completed'}

Ergebnisse anzeigen:

response_result = requests.get(f"{url}/{job_id}/results", headers=headers)

res_dict=response_result.json()

# Get results for the first PUB
counts=res_dict['results'][0]['data']['c']['samples']

print(counts[:20])

Ausgabe

['0x1', '0x2', '0x1', '0x2', '0x1', '0x2', '0x0', '0x2', '0x1', '0x1', '0x2', '0x2', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1']

Nächste Schritte

Empfehlungen
  • Je nach Ihren Anforderungen gibt es verschiedene Möglichkeiten, Workloads auszuführen: im Job-Modus, im Sitzungsmodus und im Batch-Modus. Erfahren Sie im Abschnitt „Ausführungsmodi“, wie Sie mit dem Sitzungsmodus und dem Batch-Modus arbeiten. Bitte beachten Sie, dass Nutzer von Open Plan keine Sitzungsaufträge übermitteln können.
  • Erfahren Sie, wie Sie Ihr Konto über die REST-API einrichten.
  • Üben Sie den Umgang mit Primitiven, indem Sie die Lektion zur Cost-Funktion unter IBM Quantum® Learning durcharbeiten.
  • Im Abschnitt „Transpile“ erfahren Sie, wie Sie lokal transpilieren können.
War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.