注釈
当ページは tutorials/circuits_advanced/05_pulse_gates.ipynb から生成されました。
IBM Quantum lab でインタラクティブに実行します。
パルスゲート¶
ほとんどの量子アルゴリズムは回路演算だけで記載できます。 プログラムの低レベル実装をより制御する必要がある場合は、*パルスゲート*を使用することができます。 パルスゲートは、基底ゲートのみで回路を実行するという制約を取り除き、任意の基底ゲートのデフォルト実装をオーバーライドすることを可能にします。
パルスゲートでは、論理回路ゲート(例: X
) を``Schedule``と呼ばれるQiskit Pulseプログラムにマッピングすることができます。このマッピングは 較正 と呼ばれます。忠実度の高い較正は、マッピングされた論理演算を忠実に実装するものです (例: X
ゲート較正が \(|0\rangle\) を \(|1\rangle\) にするかどうかなど)。
スケジュールは、デバイスに対する全入力 チャンネル にわたる入力信号の正確な時間ダイナミクスを指定します。 通常、ドライブや計測など、量子ビットごとに複数のチャネルがあります。 このインターフェイスはより強力であり、基礎となるデバイス物理についてより深く理解する必要があります。
Pulseプログラムは物理的な量子ビットで動作することに注意することが重要です。 量子ビット \(a\) のドライブパルスは、量子ビット \(b\) の状態で同じ論理演算を行いません。 ゲート較正は量子ビット間で交換できません。これは回路レベルとは異なり、X
ゲートは量子ビットオペランドと独立して定義されます。
このページでは、回路に較正を追加する方法を説明します。
注意: パルスゲートでプログラムを実行するには、バックエンドの OpenPulse を有効にする必要があります。これは``backend.configuration().open_pulse`` で確認できます。OpenPulseが有効な場合``True`` です。 有効になっていてパルスゲート機能が有効になっていない場合は、入力回路を`スケジュール <07_pulse_scheduler.ipynb>`__ することができます。
回路の構築¶
非常に簡単な例、Bell状態の回路から始めましょう。
[1]:
from qiskit import QuantumCircuit
circ = QuantumCircuit(2, 2)
circ.h(0)
circ.cx(0, 1)
circ.measure(0, 0)
circ.measure(1, 1)
circ.draw('mpl')
[1]:

較正の作成¶
回路ができたので、量子ビット 0のアダマールゲートに対する較正を定義しましょう。
実際に パルスの形状とパラメータは一連のRabi実験を通して最適化されます(Qiskit Textbook を参照)。 このデモンストレーションでは、アダマールはガウスパルスになります。量子ビット0の*ドライブ*チャンネルでパルスを*再生*します。
較正自体の構築の詳細についてはあまり心配しないでください。 次のページ、building pulse schedules、でこれについてすべてを学ぶことができます。
[2]:
from qiskit import pulse
from qiskit.pulse.library import Gaussian
from qiskit.test.mock import FakeValencia
backend = FakeValencia()
with pulse.build(backend, name='hadamard') as h_q0:
pulse.play(Gaussian(duration=128, amp=0.1, sigma=16), pulse.drive_channel(0))
新しいスケジュールを描画して、何を作ったのか見てみましょう。
[3]:
h_q0.draw()
[3]:

較正と回路のリンク¶
残っているのは、登録を完了することだけです。 回路メソッド add_calibration
にはゲートに関する情報とマッピングを完了するスケジュールへの参照が必要です。
QuantumCircuit.add_calibration(gate, qubits, schedule, parameters)
gate
は、circuit.Gate
オブジェクトまたはゲートの名前にすることができます。 通常、qubits
と parameters
の固有のセットそれぞれに対し、異なるスケジュールが必要になります。 アダマールゲートにはパラメータがありませんので、何も入力する必要はありません。
[4]:
circ.add_calibration('h', [0], h_q0)
最後に、トランスパイラーは較正を尊重することに注意してください。 通常どおりに使用してください (この例ではトランスパイラーを最適化するには簡単すぎるので、出力は同じです)。
[5]:
from qiskit import transpile
from qiskit.test.mock import FakeAlmaden
backend = FakeAlmaden()
circ = transpile(circ, backend)
print(backend.configuration().basis_gates)
circ.draw('mpl', idle_wires=False)
['id', 'u1', 'u2', 'u3', 'cx']
[5]:

h
はモックバックエンド FakeAlmaden
の基底ゲートではないことに注意してください。 較正を追加したので、トランスパイラーはゲートを基底ゲートとして扱います。ただし、定義された量子ビット上のみです。 別の量子ビットに適用されるアダマールは、基底ゲートに展開されます。
以上です!
カスタムゲート¶
非標準で、完全なるカスタムゲートに対して同じプロセスを簡単に示します。このデモンストレーションにはパラメーター付きゲートが含まれています。
[6]:
from qiskit import QuantumCircuit
from qiskit.circuit import Gate
circ = QuantumCircuit(1, 1)
custom_gate = Gate('my_custom_gate', 1, [3.14, 1])
# 3.14 is an arbitrary parameter for demonstration
circ.append(custom_gate, [0])
circ.measure(0, 0)
circ.draw('mpl')
[6]:

[7]:
with pulse.build(backend, name='custom') as my_schedule:
pulse.play(Gaussian(duration=64, amp=0.2, sigma=8), pulse.drive_channel(0))
circ.add_calibration('my_custom_gate', [0], my_schedule, [3.14, 1])
# Alternatively: circ.add_calibration(custom_gate, [0], my_schedule)
較正を追加するために Gate
のインスタンスである変数 custom_gate
を使用する場合、パラメーターはそのインスタンスから派生します。 パラメーターの順序には意味があることに注意してください。
[8]:
circ = transpile(circ, backend)
circ.draw('mpl', idle_wires=False)
[8]:

通常、circ
をトランスパイルしようとするとエラーになります。 "my_custom_gate"``の機能定義が提供されていないので、トランスパイラーはターゲットデバイスの基底ゲート・セットに展開することができません。 較正されていない別の量子ビットに ``"my_custom_gate"
を追加すると、これを表示できます。
[9]:
circ = QuantumCircuit(2, 2)
circ.append(custom_gate, [1])
from qiskit import QiskitError
try:
circ = transpile(circ, backend)
except QiskitError as e:
print(e)
"Cannot unroll the circuit to the given basis, ['id', 'u1', 'u2', 'u3', 'cx']. Instruction my_custom_gate not found in equivalence library and no rule found to expand."
[10]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright
/Users/thomas/opt/anaconda3/envs/qiskit-3.8/lib/python3.8/site-packages/qiskit/aqua/operators/operator_globals.py:48: DeprecationWarning: `from_label` is deprecated and will be removed no earlier than 3 months after the release date. Use Pauli(label) instead.
X = make_immutable(PrimitiveOp(Pauli.from_label('X')))
Version Information
Qiskit Software | Version |
---|---|
Qiskit | 0.23.6 |
Terra | 0.17.0 |
Aer | 0.7.5 |
Ignis | 0.5.2 |
Aqua | 0.8.2 |
IBM Q Provider | 0.11.1 |
System information | |
Python | 3.8.5 (default, Aug 5 2020, 03:39:04) [Clang 10.0.0 ] |
OS | Darwin |
CPUs | 8 |
Memory (Gb) | 32.0 |
Sat Feb 27 11:07:23 2021 AST |
This code is a part of Qiskit
© Copyright IBM 2017, 2021.
This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.