Japanese
言語
English
Bengali
French
German
Japanese
Korean
Portuguese
Spanish
Tamil

注釈

当ページは tutorials/circuits_advanced/05_pulse_gates.ipynb から生成されました。

パルスゲート

ほとんどの量子アルゴリズムは回路演算だけで記載できます。 プログラムの低レベル実装をより制御する必要がある場合は、パルスゲート を使用することができます。 パルスゲートは、基底ゲートのみで回路を実行するという制約を取り除き、任意の基底ゲートのデフォルト実装をオーバーライドすることを可能にします。

パルスゲートでは、論理回路ゲート(例: X) を Schedule と呼ばれるQiskit Pulseプログラムにマッピングすることができます。このマッピングは 較正 と呼ばれます。忠実度の高い較正は、マッピングされた論理演算を忠実に実装するものです (例: X ゲート較正が \(|0\rangle\)\(|1\rangle\) にするかどうかなど)。

スケジュールは、デバイスに対する全入力 チャンネル にわたる入力信号の正確な時間ダイナミクスを指定します。 通常、ドライブや計測など、量子ビットごとに複数のチャネルがあります。 このインターフェイスはより強力であり、基礎となるデバイス物理についてより深く理解する必要があります。

Pulseプログラムは物理的な量子ビットで動作することに注意することが重要です。 量子ビット \(a\) のドライブパルスは、量子ビット \(b\) の状態で同じ論理演算を行いません。 ゲート較正は量子ビット間で交換できません。これは回路レベルとは異なり、X ゲートは量子ビットオペランドと独立して定義されます。

このページでは、回路に較正を追加する方法を説明します。

Note: Not all providers support pulse gates.

回路の構築

非常に簡単な例、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]:
../../_images/tutorials_circuits_advanced_05_pulse_gates_2_0.png

較正の作成

回路ができたので、量子ビット 0のアダマールゲートに対する較正を定義しましょう。

実際に パルスの形状とパラメータは一連のRabi実験を通して最適化されます(Qiskit Textbook を参照)。 このデモンストレーションでは、アダマールはガウスパルスになります。量子ビット0の ドライブ チャンネルでパルスを*再生*します。

較正自体の構築の詳細についてはあまり心配しないでください。 次のページ、building pulse schedules、でこれについてすべてを学ぶことができます。

[2]:
from qiskit import pulse
from qiskit.pulse.library import Gaussian
from qiskit.providers.fake_provider 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]:
../../_images/tutorials_circuits_advanced_05_pulse_gates_6_0.png

較正と回路のリンク

残っているのは、登録を完了することだけです。 回路メソッド add_calibration にはゲートに関する情報とマッピングを完了するスケジュールへの参照が必要です。

QuantumCircuit.add_calibration(gate, qubits, schedule, parameters)

gate は、circuit.Gate オブジェクトまたはゲートの名前にすることができます。 通常、qubitsparameters の固有のセットそれぞれに対し、異なるスケジュールが必要になります。 アダマールゲートにはパラメータがありませんので、何も入力する必要はありません。

[4]:
circ.add_calibration('h', [0], h_q0)

最後に、トランスパイラーは較正を尊重することに注意してください。 通常どおりに使用してください (この例ではトランスパイラーを最適化するには簡単すぎるので、出力は同じです)。

[5]:
from qiskit import transpile
from qiskit.providers.fake_provider import FakeHanoi

backend = FakeHanoi()

circ = transpile(circ, backend)

print(backend.configuration().basis_gates)
circ.draw('mpl', idle_wires=False)
['id', 'rz', 'sx', 'x', 'cx', 'reset']
[5]:
../../_images/tutorials_circuits_advanced_05_pulse_gates_10_1.png

h はモックバックエンド FakeHanoi の基底ゲートではないことに注意してください。 較正を追加したので、トランスパイラーはゲートを基底ゲートとして扱います。ただし、定義された量子ビット上のみです。 別の量子ビットに適用されるアダマールは、基底ゲートに展開されます。

以上です!

カスタムゲート

非標準で、完全なるカスタムゲートに対して同じプロセスを簡単に示します。このデモンストレーションにはパラメーター付きゲートが含まれています。

[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]:
../../_images/tutorials_circuits_advanced_05_pulse_gates_12_0.png
[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]:
../../_images/tutorials_circuits_advanced_05_pulse_gates_15_0.png

通常、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', 'rz', 'sx', 'x', 'cx', 'reset']. 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

Version Information

Qiskit SoftwareVersion
qiskit-terra0.21.2
qiskit-aer0.10.4
qiskit-ibmq-provider0.19.2
qiskit0.37.2
System information
Python version3.10.7
Python compilerGCC 12.2.0
Python buildmain, Sep 6 2022 21:22:27
OSLinux
CPUs32
Memory (Gb)125.64828109741211
Mon Sep 12 15:28:25 2022 EDT

This code is a part of Qiskit

© Copyright IBM 2017, 2022.

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.