フラクショナルゲート
パッケージバージョン
このページのコードは、以下の要件を使用して開発されました。 これらのバージョン以降を使用することをお勧めします。
qiskit[all]~=2.3.1
qiskit-ibm-runtime~=0.45.1
このページでは、IBM Quantum® QPUフリートで新たにサポートされた2種類のゲートタイプを紹介します。これらのフラクショナルゲートは、Heron QPUで次の形式でサポートされています:
- (の範囲)
- (任意の)
このページでは、フラクショナルゲートの実装がワークフローの効率を向上させるユースケースと、IBM Quantum QPUでこれらのゲートを使用する方法について説明します。
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
フラクショナルゲートの使用方法
内部的には、これらのフラクショナルゲートは任意の角度に対しておよび回転を直接実行することで動作します。ゲートを使用すると、任意角度の1量子ビット回転の時間とエラーを最大2倍削減できます。ゲートの回転を直接実行することで、複数のCZGateオブジェクトへの分解を避け、同様にCircuitの時間とエラーを削減します。これは、量子システムのダイナミクスをシミュレートする場合や、多くのパラメータを持つ変分アンザッツを使用する場合など、多くの1量子ビットおよび2量子ビット回転を含むCircuitに特に有効です。
これらのゲートタイプはQuantumCircuitが持てる標準ゲートのライブラリに含まれていますが、特定のIBM Quantum QPUでのみ使用でき、use_fractional_gatesフラグをTrueに設定して読み込む必要があります(以下を参照)。このフラグにより、フラクショナルゲートがTranspiler用のBackendのTargetに含まれるようになります。
service = QiskitRuntimeService()
backend = service.backend('ibm_torino', use_fractional_gates=True)
このコード例では、フラクショナルゲートを使用してイジング鎖のダイナミクスをシミュレートするワークフローの文脈でフラクショナルゲートを使用する方法を示します。その後、Circuit時間をフラクショナルゲートを使用しないBackendと比較します。
フラクショナルゲートが有効なBackendのTargetで報告されるエラー値は、非フラクショナルゲートに対応するもののコピーにすぎません(同一でない場合があります)。これは、フラクショナルゲートのエラーレートの報告がまだサポートされていないためです。
ただし、フラクショナルゲートと非フラクショナルゲートのゲート時間は同じであるため、エラーレートは比較可能であると合理的に仮定できます――特にCircuit内のエラーの主要な要因が緩和によるものである場合はなおさらです。
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization.timeline import draw as draw_timeline, IQXSimple
from qiskit_ibm_runtime import QiskitRuntimeService
num_qubits = 5
num_time_steps = 3
rx_angle = 0.1
rzz_angle = 0.1
ising_circuit = QuantumCircuit(num_qubits)
for i in range(num_time_steps):
# rx layer
for q in range(num_qubits):
ising_circuit.rx(rx_angle, q)
for q in range(1, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
# 2nd rzz layer
for q in range(0, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
ising_circuit.barrier()
ising_circuit.draw("mpl")
フラクショナルゲートを有効にしたものと無効にしたものの2つのBackendオブジェクトを指定し、両方をトランスパイルします。
service = QiskitRuntimeService()
backend_fractional = service.backend("ibm_torino", use_fractional_gates=True)
backend_conventional = service.backend(
"ibm_torino", use_fractional_gates=False
)
pm_fractional = generate_preset_pass_manager(
optimization_level=3, backend=backend_fractional, scheduling_method="alap"
)
pm_conventional = generate_preset_pass_manager(
optimization_level=3,
backend=backend_conventional,
scheduling_method="alap",
)
ising_circuit_fractional = pm_fractional.run(ising_circuit)
ising_circuit_conventional = pm_conventional.run(ising_circuit)
2種類のゲートを使用したCircuitのタイムラインを表示します。
# Draw timeline of circuit with conventional gates
draw_timeline(
ising_circuit_conventional,
idle_wires=False,
target=backend_conventional.target,
time_range=(0, 500),
style=IQXSimple(),
)
# Draw timeline of circuit with fractional gates
draw_timeline(
ising_circuit_fractional,
idle_wires=False,
target=backend_fractional.target,
time_range=(0, 500),
style=IQXSimple(),
)
角度の制約
2量子ビットのゲートについては、IBM Quantumハードウェア上で実行できる角度はからの間のみです。Circuitにこの範囲外の角度を持つゲートが含まれている場合、標準のトランスパイルパイプラインは通常、適切なCircuit変換(FoldRzzAngleパスを通じて)でこれを修正します。ただし、1つ以上のParameterを含むゲートについては、Transpilerはこれらのパラメータが実行時にこの範囲内の角度に割り当てられると仮定します。Qiskit RuntimeへのPUBに指定されたパラメータ値のいずれかがこの範囲外の場合、ジョブは失敗します。
フラクショナルゲートを使用する場面
歴史的に、IBM Quantum QPUで利用可能なBasis Gateは**CZ、X、RZ、SX、ID**であり、の倍数でない1量子ビットおよび2量子ビット回転を持つCircuitを効率的に表現できませんでした。例えば、ゲートはトランスパイル時に一連のゲートとゲートに分解する必要があり、1つではなく有限時間を持つ2つのゲートを含むCircuitが作成されます。
同様に、ゲートなどの2量子ビット回転がトランスパイルされる場合、分解には2つの**CZ**ゲートといくつかの1量子ビットゲートが必要となり、Circuit深度が増加します。これらの分解は以下のコードに示されています。
qc = QuantumCircuit(1)
param = Parameter("θ")
qc.rx(param, 0)
qc.draw("mpl")
# Decomposition of an RX(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.backend("ibm_torino")
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
qc = QuantumCircuit(2)
param = Parameter("θ")
qc.rzz(param, 0, 1)
qc.draw("mpl")
# Decomposition of an RZZ(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.backend("ibm_torino")
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)
多くの1量子ビットまたは2量子ビット回転を必要とするワークフロー(変分アンザッツや量子システムの時間発展をシミュレートする場合など)では、この制約によってCircuit深度が急速に増大します。 しかし、フラクショナルゲートはこの要件を取り除きます。なぜなら、1量子ビットおよび2量子ビット回転が直接実行され、より効率的な(つまりエラーが抑制された)量子Circuitが作成されるからです。
フラクショナルゲートを使用すべきでない場面
フラクショナルゲートは実験的な機能であり、use_fractional_gatesフラグの動作は将来変更される可能性があることに注意することが重要です。詳細については、Qiskit Runtimeの新バージョンのリリースノートを参照してください。また、use_fractional_gatesについて説明しているQiskitRuntimeService.backendのAPIリファレンスドキュメントも参照してください。
また、QiskitのTranspilerには最適化パスでを使用する機能が限られています。そのため、これらの命令を含むCircuitの設計と最適化においてより注意が必要です。
最後に、フラクショナルゲートは以下の用途ではサポートされていません:
- 動的Circuit
- Pauliツワーリング - ただし、TREXによる測定ツワーリングはサポートされています。
- 確率的エラーキャンセル
- ゼロノイズ外挿(確率的エラー増幅を使用)
特定の量子ワークロードに対するエラー緩和および抑制技術のカスタマイズについては、プリミティブオプションのガイドを読んでください。
次のステップ
- トランスパイルの詳細については、トランスパイルの概要ページを参照してください。
- カスタムTranspilerパスの作成について読んでください。
- Qiskit Runtimeのエラー緩和の設定方法を理解してください。