Japanese
言語
English
Japanese
German
Korean
Portuguese, Brazilian
French
Shortcuts

注釈

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

IBM Quantum lab でインタラクティブに実行します。

スケジューラーの使用

スケジューラーは、ゲートと測定 較正 を使用して、QuantumCircuit を パルス Schedule に変換します。これは特定の量子ビットに関する操作の最適化されたパルスレベルの記述です。

OpenPulse対応のバックエンドは、通常、測定用および各基底ゲート用に定義された較正を行います。 較正は、ユーザーによって定義または更新することもできます。

基本的な使い方

まず、普通に量子回路を構築します。以下の例では、シンプルな Bell 状態を作成します。

[1]:
from qiskit import QuantumCircuit

circ = QuantumCircuit(2, 2)
circ.h(0)
circ.cx(0, 1)
circ.measure([0, 1], [0, 1])

circ.draw('mpl')
[1]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_1_0.png

スケジューラーの使い方を示すために、モックのバックエンドの FakeAlmaden を使います。測定用と基本のゲート用のデフォルトの較正が含まれています。 アダマール演算は、それらの基底ゲート操作ではないので、トランスパイラーを使って、入力回路をデバイスの基底ゲートを使った等価回路にコンパイルします。

[2]:
from qiskit import transpile, schedule as build_schedule
from qiskit.test.mock import FakeAlmaden

backend = FakeAlmaden()

transpiled_circ = transpile(circ, backend)  # Undefined Hadamard is replaced by U1
schedule = build_schedule(transpiled_circ, backend)

回路 transpiled_circ から構築されたスケジュール schedule がどのように見えるか見てみましょう。

[3]:
schedule.draw(plot_range=[0, 2000])
[3]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_5_0.png

これは基本がカバーされています! 基底ゲートを使って回路を書き換えるためにトランスパイラーを使いました。そして、バックエンドのデフォルト較正を使ってトランスパイラー回路をスケジュールしました。次に、私たち自身が構築する較正でスケジュールしましょう。

カスタム・ゲート定義によるスケジューリング

入力回路に較正が定義されている場合は、回路をスケジュールするときにこれらの較正を使用します。

[4]:
from qiskit import pulse

with pulse.build() as h_q0:
    pulse.play(pulse.library.Gaussian(duration=256, amp=0.2, sigma=50, name='custom'),
               pulse.DriveChannel(0))

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

schedule = build_schedule(circ, backend)
schedule.draw(plot_range=[0, 2000])
[4]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_7_0.png

D0 上の最初のパルスである、アダマールゲートがカスタムパルスで実装されていることに注意してください。

スケジューラーのメソッド

スケジューラーは複数のルーチンに従うことができます。デフォルトでは、可能な限り遅く (ALAP) ルールに従います。 別のスケジューリング方法は できるだけ早く (ASAP) です。 両方の方法で、出力スケジュールは最小です: 入力回路の最長期間の動作経路内で、各操作の開始時刻は進行中の操作の終了時刻です。 メソッドは、その最も長いパスの外で操作をスケジュールする方法を決定します。

これは、以下の例によって明確になります:

[5]:
circ = QuantumCircuit(2, 2)
circ.x(0)
circ.x(0)
circ.x(1)
circ.measure([0, 1], [0, 1])
[5]:
<qiskit.circuit.instructionset.InstructionSet at 0x12cba98e0>

モックバックエンドでは、これらの \(X\) ゲート操作はそれぞれ同じ継続時間(duration = 160 dt)です。 スケジュールを最小限にするために、量子ビット 0 の 2 つの \(X\) 操作が繰り返しスケジュールされます。 測定パルスは2個目のパルスのすぐ後ろに追随します

ALAP はより制限が少ない操作をスケジュールする最新の有効時間を選択するため、量子ビット1の \(X\) ゲートは、量子ビット0の2番目の \(X\) ゲートと同期して実行されます

[6]:
schedule = build_schedule(circ, backend,
                          method="as_late_as_possible")
schedule.draw(channels=[pulse.DriveChannel(0), pulse.DriveChannel(1)])
[6]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_11_0.png

一方、名前が示すように、ASAPはリソースが解放されるとすぐに操作をスケジュールします。 したがって、量子ビット1 の \(X\) ゲートは time=0 にスケジュールされます。 量子ビット0の最初の \(X\) ゲートと同期しています。

[7]:
schedule = build_schedule(circ, backend,
                          method="as_soon_as_possible")
schedule.draw(channels=[pulse.DriveChannel(0), pulse.DriveChannel(1)])
[7]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_13_0.png

ALAP は、量子ビットを可能な限りアイドル状態のままにできるため、デフォルトです。 この例の場合、ALAP と ASAP の違いは無視できますが、ALAP では、 量子ビット0は、測定前に励起状態から崩壊する時間が ありません

[8]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
Qiskit0.23.2
Terra0.16.2
Aer0.7.2
Ignis0.5.1
Aqua0.8.1
IBM Q Provider0.11.1
System information
Python3.9.1 (default, Dec 10 2020, 10:36:35) [Clang 12.0.0 (clang-1200.0.32.27)]
OSDarwin
CPUs6
Memory (Gb)32.0
Tue Jan 26 15:29:54 2021 EST

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.

[ ]: