Skip to main content
IBM Quantum Platform

REST API を使用した見積もりツール

パッケージ・バージョン

このページのコードは、以下の要件に基づいて開発されました。 これらのバージョン以降のご利用をお勧めします。

qiskit[all]~=2.3.0

このトピックの手順では、REST API を使用してワークロードを実行および構成する方法について説明し、任意のプログラムからそれらを呼び出す方法を示します。

Note

このドキュメントでは、 Pythonrequests モジュールを使用してREST APIの動作を説明しています。 ただし、このワークフローは、REST API の操作をサポートするあらゆる言語やフレームワークを使用して実行することができます。 詳細については、 APIリファレンスを参照してください。


1. アカウントを初期化する

Estimatorはマネージドサービスであるため、まずアカウントを初期化する必要があります。 その後、期待値を計算するために使用するデバイスを選択できます。

このトピックでは、アカウントの初期化方法、利用可能なバックエンドの確認方法、およびトークンの無効化方法について詳しく説明しています。


2. QASM回路を作成する

Estimatorプリミティブの入力として、少なくとも1つの回路が必要です。

QASM量子回路を定義せよ。 例:

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];
'''

以下のコードスニペットでは、が新しい文字列に qasm_string トランスパイル resulting_qasmされていることを前提としています。


3. Estimatorの V2 APIを使用して量子回路を実行する

Note

以下のジョブでは、 IBM QuantumV2 プリミティブが使用されています。 と は SamplerV2 、いずれも1つ以上のプリミティブ統一ブロック(PUB)を入力として EstimatorV2 受け取る。 各 PUB は、1つの回路と、その回路にブロードキャストされるデータ(複数のオブザーバブルやパラメータを含む場合がある)を含むタプルです。 各 PUB は結果を返します。

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. ジョブのステータスを確認し、結果を取得する

次に、APIに job_id を渡します:

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

出力

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

求人検索結果を表示:

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

res_dict=response_result.json()

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

出力

[{'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. オプションの操作

エラー軽減技術により、ユーザーは実行時のデバイスノイズをモデル化することで、回路エラーを軽減することができます。 これにより、通常、モデルの学習に関連する量子側の前処理オーバーヘッドと、生成されたモデルを用いて生データの誤差を補正するための古典側の後処理オーバーヘッドが発生することになる。

プリミティブに組み込まれたエラー軽減技術は、高度な耐障害性オプションです。 これらのオプションを指定するには、ジョブを送信する際に オプション resilience_level を使用してください。

以下の例は、動的デカップリング、トゥワリング、およびTREX + ZNEのデフォルト設定を示しています。 その他のオプションや詳細については、「 エラーの軽減および抑制手法 」のトピックをご覧ください。

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}")

動的デカップリング

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}")

くるくる回る

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}")

パラメータ化回路

1. アカウントを初期化する

まず、アカウントを初期化する必要があります。 その後、計算を実行するデバイスを選択できます。

このトピックでは、アカウントの初期化方法、利用可能なバックエンドの確認方法、およびトークンの無効化方法について詳しく説明しています。

2. パラメータを定義する

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. 量子回路を作成し、パラメータ化ゲートを追加する

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 コードを生成する

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

5. Estimatorの V2 APIを使用して量子回路を実行する

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. ジョブのステータスを確認し、結果を取得する

次に、APIに job_id を渡します:

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

出力

{'status': 'Completed'}

求人検索結果を表示:

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])

出力

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

次のステップ

推奨事項
  • ニーズに応じて、ワークロードを実行する方法はいくつかあります。具体的には、ジョブモード、セッションモード、バッチモードです。 「実行モード 」のトピックで、セッションモードとバッチモードの使い方について学びましょう。 なお、Open Planユーザーはセッションジョブを送信できません。
  • REST API を使用してアカウントを初期化する方法について学びましょう。
  • IBM Quantum® Learning の「 Cost関数 」のレッスンに取り組んで、プリミティブ型の扱い方を練習しましょう。
  • トランスパイル 」のセクションで、ローカルでのトランスパイル方法について学びましょう。
このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。