注釈

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

量子回路の可視化

[1]:
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister

量子回路の描画

量子回路の作成中、回路の描画が助けになることがよくあります。回路の描画は、QuantumCircuit オブジェクトによりネイティブにサポートされています。回路について print() を呼ぶことも、オブジェクトに対して draw() メソッドを呼ぶこともできます。これらは、回路図を アスキー・アート 風に描画します。

[2]:
# Build a quantum circuit
circuit = QuantumCircuit(3, 3)

circuit.x(1)
circuit.h(range(3))
circuit.cx(0, 1)
circuit.measure(range(3), range(3));
[3]:
print(circuit)
     ┌───┐          ┌─┐
q_0: ┤ H ├───────■──┤M├───
     ├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
     ├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
     └───┘ └╥┘       ║  ║
c_0: ═══════╬════════╩══╬═
            ║           ║
c_1: ═══════╬═══════════╩═
            ║
c_2: ═══════╩═════════════

[4]:
circuit.draw()
[4]:
     ┌───┐          ┌─┐
q_0: ┤ H ├───────■──┤M├───
     ├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
     ├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
     └───┘ └╥┘       ║  ║
c_0: ═══════╬════════╩══╬═
            ║           ║
c_1: ═══════╬═══════════╩═
            ║
c_2: ═══════╩═════════════
                          

回路の別なレンダラー

テキスト出力は、回路の構築中、出力を早く見るのに便利な一方、最も柔軟な出力を提供しているわけではありません。量子回路には、他に2つの出力レンダラーがあります。 matplotlib を使うものと、 qcircuit パッケージ を活用した LaTex を使うものです。これらは draw() メソッドの output キーワード引数に mpl もしくは latex の値をセットすることで指定できます。

[5]:
# Matplotlib Drawing
circuit.draw(output='mpl')
[5]:
../../_images/tutorials_circuits_advanced_3_advanced_circuit_visualization_7_0.png

circuit.draw()からの出力の制御

draw() メソッドは、デフォルトではレンダリングされたイメージをオブジェクトとして返すだけで、何も出力しません。返される正確なクラスは output に指定された値に依ります:'text' (デフォルト) は TextDrawer オブジェクトを、'mpl'matplotlib.Figure オブジェクトを、 latexPIL.Image オブジェクトを返します。 戻り値の型があることで、レンダリングされたイメージを描画システムから修正したり直接相互作用したりできます。Jupyter Notebookはこれらの戻り値型を理解するので、このチュートリアル中でイメージを描画してくれますが、Jupyter Notebookの外ではこの機能は自動的には使用できません。しかし、 draw() メソッドには出力を表示したり保存するためのオプションの引数があります。 filename キーワード引数には、レンダリングされた出力を保存するためのパスを指定します。 mpl もしくは latex 出力を使用している場合は、新しいウィンドウを開いてイメージを表示するために、 interactive キーワード引数を活用できます(Notebook内で必ず動作するとは限りませんが、とにかく実際にやってみます)。

出力のカスタマイズ

出力によっては、回路によって表示される回路図をカスタマイズするオプションもあります。

バリアのプロット無効化とビット順序の反転

最初の2つのオプションは、3つのバックエンドすべてで共有されており、ビット順序とバリアを描画するかどうかの両方を設定することができます。これらは reverse_bits キーワード引数と plot_barriers キーワード引数で、それぞれ設定できます。以下の例はどの出力バックエンドでも動作しますが、簡単のため、ここでは latex だけを使用します。

[8]:
# Draw a new circuit with barriers and more registers

q_a = QuantumRegister(3, name='qa')
q_b = QuantumRegister(5, name='qb')
c_a = ClassicalRegister(3)
c_b = ClassicalRegister(5)

circuit = QuantumCircuit(q_a, q_b, c_a, c_b)

circuit.x(q_a[1])
circuit.x(q_b[1])
circuit.x(q_b[2])
circuit.x(q_b[4])
circuit.barrier()
circuit.h(q_a)
circuit.barrier(q_a)
circuit.h(q_b)
circuit.cswap(q_b[0], q_b[1], q_b[2])
circuit.cswap(q_b[2], q_b[3], q_b[4])
circuit.cswap(q_b[3], q_b[4], q_b[0])
circuit.barrier(q_b)
circuit.measure(q_a, c_a)
circuit.measure(q_b, c_b);
[9]:
# Draw the circuit
circuit.draw(output='mpl')
[9]:
../../_images/tutorials_circuits_advanced_3_advanced_circuit_visualization_11_0.png
[10]:
# Draw the circuit with reversed bit order
circuit.draw(output='mpl', reverse_bits=True)
[10]:
../../_images/tutorials_circuits_advanced_3_advanced_circuit_visualization_12_0.png
[11]:
# Draw the circuit without barriers
circuit.draw(output='mpl', plot_barriers=False)
[11]:
../../_images/tutorials_circuits_advanced_3_advanced_circuit_visualization_13_0.png
[12]:
# Draw the circuit without barriers and reverse bit order
circuit.draw(output='mpl', plot_barriers=False, reverse_bits=True)
[12]:
../../_images/tutorials_circuits_advanced_3_advanced_circuit_visualization_14_0.png

バックエンド特有のカスタマイズ

一部の利用可能なカスタマイズオプションは、バックエンドに固有です。 text バックエンドの line_length キーワード引数は、出力の最大幅を設定するために使用できます。ダイアグラムの幅が指定値より広い場合は、ダイアグラムが下に折り返されます。 mpl バックエンドには、出力をカスタマイズするための style 引数があります。 scale オプションは、 mpllatex バックエンドが出力画像のサイズを調整するのに使われる、倍数調整因子です。 style キーワード引数は、複数のオプションを dict 型で取ることができます。色を変更するための高度な柔軟性の提供や、さまざまなゲートタイプやラインスタイルのためのテキストレンダリングの変更などです。利用可能なオプションは次の通りです。:

  • textcolor (str): テキストのために使用するカラーコード。デフォルトは '#000000' になる。

  • subtextcolor (str) : サブテキストのために使用するカラーコード。デフォルトは '#000000' になる。

  • linecolor (str): ラインのために使用するカラーコード。デフォルトは '#000000' になる。

  • creglinecolor (str): 古典レジスタの線に使用するカラー・コード。デフォルトは '#778899'

  • gatetextcolor (str): ゲート・テキストのカラーコード。デフォルトは '#000000'

  • gatefacecolor (str): ゲートのために使用するカラー・コード。デフォルトは '#ffffff'

  • barrierfacecolor (str): バリアーのために使用するカラーコード。デフォルトは '#bdbdbd' になる。

  • backgroundcolor (str): 背景のために使用するカラーコード。デフォルトは '#ffffff' になる。

  • fontsize (int): テキストのフォント・サイズ。デフォルトは13。

  • subfontsize (int): サブテキストのフォント・サイズ。デフォルトは8。

  • displaytext (dict): 可視化の出力において、個々の要素タイプで使われるテキスト辞書。デフォルト値は以下のとおり:

    'id': 'id',
    'u0': 'U_0',
    'u1': 'U_1',
    'u2': 'U_2',
    'u3': 'U_3',
    'x': 'X',
    'y': 'Y',
    'z': 'Z',
    'h': 'H',
    's': 'S',
    'sdg': 'S^\\dagger',
    't': 'T',
    'tdg': 'T^\\dagger',
    'rx': 'R_x',
    'ry': 'R_y',
    'rz': 'R_z',
    'reset': '\\left|0\\right\\rangle'
    

    これを使用する場合は、必要な値をすべて指定する必要があります。 不完全な辞書を渡すことはできません。

  • displaycolor (dict): 各回路の要素に利用されるカラーコード。デフォルトでは、値は gatefacecolor のデフォルト値、キーは displaytext と同じになります。 displaytext と同様に、不完全な辞書を渡すことはできません。

  • latexdrawerstyle (bool): True に設定すると、LaTex モードが有効になり、ゲートを latex 出力モードで描画する。

  • usepiformat (bool): True にセットすると、ラジアンを出力に利用する。

  • fold (int): 回路を折り返す回路要素の数。デフォルトは20。

  • cregbundle (bool): True にセットすると、古典レジスタをバンドルする。

  • showindex (bool): True にセットすると、インデックスを表示。

  • compress (bool): True にセットすると、圧縮した回路を描画。

  • figwidth (int): 出力図の最大幅(単位はインチ)。

  • dpi (int): 出力イメージに利用される DPI。デフォルトは 150。

  • creglinestyle (str): 古典レジスタの線スタイル。選択値は、 'solid''doublet' 、あるいは matplotlib で有効な linestyle キーワード引数の値。デフォルトは 'doublet'

[13]:
# Set line length to 80 for above circuit
circuit.draw(output='text')
[13]:
            ░ ┌───┐ ░    ┌─┐
qa_0: ──────░─┤ H ├─░────┤M├───────────────────────────
      ┌───┐ ░ ├───┤ ░    └╥┘┌─┐
qa_1: ┤ X ├─░─┤ H ├─░─────╫─┤M├────────────────────────
      └───┘ ░ ├───┤ ░     ║ └╥┘┌─┐
qa_2: ──────░─┤ H ├─░─────╫──╫─┤M├─────────────────────
            ░ ├───┤ ░     ║  ║ └╥┘    ░ ┌─┐
qb_0: ──────░─┤ H ├─■─────╫──╫──╫──X──░─┤M├────────────
      ┌───┐ ░ ├───┤ │     ║  ║  ║  │  ░ └╥┘┌─┐
qb_1: ┤ X ├─░─┤ H ├─X─────╫──╫──╫──┼──░──╫─┤M├─────────
      ├───┤ ░ ├───┤ │     ║  ║  ║  │  ░  ║ └╥┘┌─┐
qb_2: ┤ X ├─░─┤ H ├─X──■──╫──╫──╫──┼──░──╫──╫─┤M├──────
      └───┘ ░ ├───┤    │  ║  ║  ║  │  ░  ║  ║ └╥┘┌─┐
qb_3: ──────░─┤ H ├────X──╫──╫──╫──■──░──╫──╫──╫─┤M├───
      ┌───┐ ░ ├───┤    │  ║  ║  ║  │  ░  ║  ║  ║ └╥┘┌─┐
qb_4: ┤ X ├─░─┤ H ├────X──╫──╫──╫──X──░──╫──╫──╫──╫─┤M├
      └───┘ ░ └───┘       ║  ║  ║     ░  ║  ║  ║  ║ └╥┘
c0_0: ════════════════════╩══╬══╬════════╬══╬══╬══╬══╬═
                             ║  ║        ║  ║  ║  ║  ║
c0_1: ═══════════════════════╩══╬════════╬══╬══╬══╬══╬═
                                ║        ║  ║  ║  ║  ║
c0_2: ══════════════════════════╩════════╬══╬══╬══╬══╬═
                                         ║  ║  ║  ║  ║
c1_0: ═══════════════════════════════════╩══╬══╬══╬══╬═
                                            ║  ║  ║  ║
c1_1: ══════════════════════════════════════╩══╬══╬══╬═
                                               ║  ║  ║
c1_2: ═════════════════════════════════════════╩══╬══╬═
                                                  ║  ║
c1_3: ════════════════════════════════════════════╩══╬═
                                                     ║
c1_4: ═══════════════════════════════════════════════╩═
                                                       
[14]:
# Change the background color in mpl

style = {'backgroundcolor': 'lightgreen'}

circuit.draw(output='mpl', style=style)
[14]:
../../_images/tutorials_circuits_advanced_3_advanced_circuit_visualization_17_0.png
[15]:
# Scale the mpl output to 1/2 the normal size
circuit.draw(output='mpl', scale=0.5)
[15]:
../../_images/tutorials_circuits_advanced_3_advanced_circuit_visualization_18_0.png

関数としてのcircuit_drawer()

circuit オブジェクトのメソッドではなく、自己完結型の関数を利用して回路を描画したいアプリケーションを持っている場合、 qiskit.tools.visualization からの public stable interface の一つである、 circuit_drawer() 関数を直接利用することができます。この関数は、 circuit.draw() メソッドと全く同様に振る舞いますが、circuit オブジェクトを引数として受け取るという点のみ異なります。

注記: Qiskit Terra <= 0.7 における circuit_drawer() 関数のデフォルト動作は latext 出力バックエンドの使用になります。0.6.x では、latex がなんらかの事情で失敗した場合、mpl で代替するようになっています。release > 0.7 からのデフォルトは、text 出力に変わっています。

[17]:
from qiskit.tools.visualization import circuit_drawer
[18]:
circuit_drawer(circuit, output='mpl', plot_barriers=False)
[18]:
../../_images/tutorials_circuits_advanced_3_advanced_circuit_visualization_21_0.png
[19]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
QiskitNone
Terra0.15.0
Aer0.5.1
IgnisNone
AquaNone
IBM Q Provider0.7.0
System information
Python3.8.2 (default, Mar 26 2020, 10:43:30) [Clang 4.0.1 (tags/RELEASE_401/final)]
OSDarwin
CPUs4
Memory (Gb)16.0
Fri May 08 08:43:36 2020 EDT

This code is a part of Qiskit

© Copyright IBM 2017, 2020.

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.

[ ]: