Skip to main content
IBM Quantum Platform

Qiskit 0.13 リリースノート


0.13.0

Terra 0.10.0

前奏曲

0.10.0 リリースにはいくつかの新機能とバグ修正が含まれている。 このリリースの最大の変更点は、Qiskitをトラップ型イオントラップ・バックエンドで使用するための初期サポートが追加されたことです。

新機能

  • QuantumCircuit に新しいメソッドを導入し、回路の末端での測定値のシームレスな追加や削除を可能にした。


    measure_all()

    回路内のすべての量子ビットに barrier 、続いて measure 操作を加える。 回路内の量子ビット数に等しいサイズの ClassicalRegister


    measure_active()

    回路内のすべてのアクティブな量子ビットに barrier 、続いて measure 操作を追加する。 量子ビットは、少なくとも1つの他の演算が作用していればアクティブである。 回路内のアクティブな量子ビットの数に等しいサイズの ClassicalRegister


    remove_final_measurements()

    回路からすべての最終測定値とその前の barrier を削除する。 計測は、バリアや他の計測を除き、他の操作が続かない場合、"最終 "とみなされる。 測定値が取り除かれた後、 ClassicalRegister のクラシックビットがすべてアイドル(オペレーションが付加されていない)であれば、 ClassicalRegister

    例:

    # Using measure_all()
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.measure_all()
    circuit.draw()
    
    # A ClassicalRegister with prefix measure was created.
    # It has 2 clbits because there are 2 qubits to measure
    
                 ┌───┐ ░ ┌─┐
         q_0: |0>┤ H ├─░─┤M├───
                 └───┘ ░ └╥┘┌─┐
         q_1: |0>──────░──╫─┤M├
                       ░  ║ └╥┘
    measure_0: 0 ═════════╩══╬═
    
    measure_1: 0 ════════════╩═
    
    
    # Using measure_active()
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.measure_active()
    circuit.draw()
    
    # This ClassicalRegister only has 1 clbit because only 1 qubit is active
    
                 ┌───┐ ░ ┌─┐
         q_0: |0>┤ H ├─░─┤M├
                 └───┘ ░ └╥┘
         q_1: |0>──────░──╫─
                       ░  ║
    measure_0: 0 ═════════╩═
    
    
    # Using remove_final_measurements()
    # Assuming circuit_all and circuit_active are the circuits from the measure_all and
    # measure_active examples above respectively
    
    circuit_all.remove_final_measurements()
    circuit_all.draw()
    # The ClassicalRegister is removed because, after the measurements were removed,
    # all of its clbits were idle
    
            ┌───┐
    q_0: |0>┤ H ├
            └───┘
    q_1: |0>─────
    
    
    circuit_active.remove_final_measurements()
    circuit_active.draw()
    # This will result in the same circuit
    
            ┌───┐
    q_0: |0>┤ H ├
            └───┘
    q_1: |0>─────
  • イオントラップ・バックエンドでの実験実行の初期サポートが追加されました。

  • Rxxゲート(rxx)とグローバルMølmer-Sørensenゲート(ms)が標準ゲートセットに追加された。

  • CnotからRxx/Rx/Ryへのデコンポーザー cnot_rxx_decompose 、シングル量子ビットのオイラー角デコンポーザー OneQubitEulerDecomposerquantum_info.synthesis モジュールに追加された。

  • U3、Cnotゲートで定義された回路をRxx,Ry,Rxで定義された回路に展開するトランスパイラパス MSBasisDecomposer 。 このパスは、サポートされる基本ゲートに「rxx」ゲートを含むバックエンドのプリセット・パスマネージャーに含まれる。

  • qiskit.test.mock のバックエンドには、実際のデバイス較正データのスナップショットが含まれるようになりました。 各バックエンドの properties() 。 これは、ノイズ適応トランスパイラパスやシミュレーション用デバイスノイズモデルなど、バックエンドプロパティに依存するあらゆるコードのテストに使用できる。 これにより、ライブ・バックエンドに行く必要なく、より迅速なテストと開発サイクルが実現する。

  • Result クラスが部分的な結果を返すことを許可します。 成功した実験と失敗した実験を含む有効な結果スキーマがロードされた場合、成功した実験からのデータへのアクセスを可能にする一方、失敗した実験に対しては例外を発生させ、失敗した結果に対して適切なエラーメッセージを表示する。

  • 以下の可視化機能に ax kwarg が追加されました:

    • qiskit.visualization.plot_histogram
    • qiskit.visualization.plot_state_paulivec
    • qiskit.visualization.plot_state_qsphere
    • qiskit.visualization.circuit_drawer (mpl バックエンドのみ)
    • qiskit.QuantumCircuit.draw (mpl バックエンドのみ)

    このkwargは、 matplotlib.axes.Axes オブジェクトを可視化関数に渡すために使われます。 これにより、これらの視覚化機能をより大きな視覚化ワークフローに統合することができる。 また、ax kwargが指定された場合、可視化関数からの戻りはない。

  • 以下の可視化機能に、 ax_real および ax_imag kwarg が追加されました:

    • qiskit.visualization.plot_state_hinton
    • qiskit.visualization.plot_state_city

    これらの新しいkargは、他の可視化関数に新しく追加された ax kwargと同じ働きをします。 しかし、これらのプロットは2つの軸(1つは実数成分用、もう1つは虚数成分用)を使っている。 また、2つのkwargsを持つことで、常に両方のビジュアライゼーションを行うのではなく、どちらか一方のコンポーネントのビジュアライゼーションのみを生成する柔軟性も提供する。 例:

    from matplotlib import pyplot as plt
    from qiskit.visualization import plot_state_hinton
    
    ax = plt.gca()
    
    plot_state_hinton(psi, ax_real=ax)

    は実コンポーネントのプロットのみを生成する。

  • 指定したパス・マネージャーを新しいメソッドreplaceで編集できるようになった。 この方法は、パスマネージャー内の特定のステージを置き換えることができ、プリセットのパスマネージャーを扱うときに便利です。 例えば、最適化レベル0で使用されるパス・マネージャーのレイアウト・セレクターを編集してみましょう:

    from qiskit.transpiler.preset_passmanagers.level0 import level_0_pass_manager
    from qiskit.transpiler.transpile_config import TranspileConfig
    
    pass_manager = level_0_pass_manager(TranspileConfig(coupling_map=CouplingMap([[0,1]])))
    
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] Conditional: TrivialLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller

    レイアウトの選択はステージ [1で]設定される。 と置き換えてみよう。 DenseLayout:

    from qiskit.transpiler.passes import DenseLayout
    
    pass_manager.replace(1, DenseLayout(coupling_map), condition=lambda property_set: not property_set['layout'])
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] Conditional: DenseLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller

    無条件に置き換えたい場合は、set-itemショートカットを使うことができる:

    pass_manager[1] = DenseLayout(coupling_map)
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] FlowLinear: DenseLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller
  • 新しいパルス・コマンドを導入 Delay パルスに挿入可能 Schedule。 このコマンドは duration を受け付け、任意の Channel に追加することができる。 ディレイの間、他のコマンドをチャンネルにスケジュールすることはできない。

    ディレイは他のパルス・コマンドと同様に追加できる。 例:

    from qiskit import pulse
    from qiskit.pulse.utils import pad
    
    dc0 = pulse.DriveChannel(0)
    
    delay = pulse.Delay(1)
    test_pulse = pulse.SamplePulse([1.0])
    
    sched = pulse.Schedule()
    sched += test_pulse(dc0).shift(1)
    
    # build padded schedule by hand
    ref_sched = delay(dc0) | sched
    
    # pad schedule
    padded_sched = pad(sched)
    
    assert padded_sched == ref_sched

    また、パディングするチャンネルを追加したり、パディングする時間を指定したりすることもできる:

    from qiskit import pulse
    from qiskit.pulse.utils import pad
    
    dc0 = pulse.DriveChannel(0)
    dc1 = pulse.DriveChannel(1)
    
    delay = pulse.Delay(1)
    test_pulse = pulse.SamplePulse([1.0])
    
    sched = pulse.Schedule()
    sched += test_pulse(dc0).shift(1)
    
    # build padded schedule by hand
    ref_sched = delay(dc0) | delay(dc1) |  sched
    
    # pad schedule across both channels until up until the first time step
    padded_sched = pad(sched, channels=[dc0, dc1], until=1)
    
    assert padded_sched == ref_sched

アップグレードの注意

  • qiskit.QuantumCircuit オブジェクトの data 属性への割り当てと変更は、 QuantumCircuit API 全体で使用されているのと同じルールに従って検証されるようになった。 これは、 data 属性が既知のフォーマットであると仮定できるようになったため、回路APIのパフォーマンスを向上させるために行われた。 以前、回路オブジェクトの data 属性を手動で変更していた場合、その変更によって、コンテキストを持つ命令リスト以外のデータ構造が次のような形式になった場合、この方法は使えなくなる可能性がある。 [(instruction, qargs, cargs)]

  • トランスパイラの最適化レベル 2 用のデフォルトのパスマ ネージャが、 NoiseAdaptiveLayout の代わりに DenseLayout のレイアウト選択メカニズムをデフォルトで使用するようになりました。 Denselayout パスもノイズを考慮したものに変更されている。

  • 非推奨の DeviceSpecification クラスは削除されました。 代わりに、 PulseChannelSpec。 例えば、次のように実行できる:

    device = pulse.PulseChannelSpec.from_backend(backend)
    device.drives[0]    # for DeviceSpecification, this was device.q[0].drive
    device.memoryslots  # this was device.mem
  • 非推奨モジュール qiskit.pulse.ops は削除されました。 ScheduleInstruction メソッドを直接使う。 例えば

    ops.union(schedule_0, schedule_1)
    ops.union(instruction, schedule)  # etc

    その代わりに、以下のように使ってください:

    schedule_0.union(schedule_1)
    instruction.union(schedule)

    これと同じパターンが、他の ops 関数にも当てはまる: insert shiftappendflatten

非推奨のメモ

  • qiskit.circuit.Instructioncontrol プロパティを古典的なコントロールに使用することは非推奨となりました。 将来的には、この特性は量子制御に利用されるだろう。 古典的な条件付き操作は、代わりに qiskit.circuit.Instructioncondition プロパティで処理される。
  • qiskit.qasm.node.Node 型のオブジェクトで qiskit.circuit.Instruction パラメータを設定するサポートは廃止されました。 Node 以前にパラメータとして使われていたオブジェクトは、新しい Instruction オブジェクトを初期化する前、あるいは Instruction.params セッターを呼び出す前に、サポートされている型に変換する必要があります。 サポートされるタイプは、 intfloatcomplexstrqiskit.circuit.ParameterExpressionnumpy.ndarray
  • qiskit 0.9.0 リリースでは、ビット(量子ビットと古典ビットの両方)の表現が、 (register, index) 形式のタプルから、 qiskit.circuit.Qubit および qiskit.circuit.Clbit クラスのインスタンスに変更されました。 後方互換性のため、タプルからオブジェクトへの移行に伴い、レガシー・タプルとビット・クラスの等価比較がサポートされた。 このサポートは現在非推奨であり、将来的に削除される予定である。 今後はタプルの代わりにビットクラスを使うべきだ。
  • qiskit.QuantumCircuit.draw()qiskit.visualization.circuit_drawer() のいずれかに mpl 出力が使用され、 style kwarg が使用される場合、 style` 辞書の一部としてサポートされていない辞書キーを渡すことは非推奨となった。 これまではこれらの未知の引数は黙って無視されていたが、今後はサポートされていないキーは例外を発生させる。
  • テキスト出力モードの qiskit.QuantumCircuit.draw() メソッドおよび qiskit.visualization.circuit_drawer() 関数の line length kwarg は非推奨。 これは、 fold kwargに置き換わりました。このkwargは、テキスト出力モードでは同じように動作します(しかし、mpl出力モードもサポートするようになりました)。 line_length 将来のリリースでは削除される予定なので、代わりに fold
  • qiskit.QuantumCircuit.draw() メソッドと qiskit.visualization.circuit_drawer() 関数の style dict kwarg の fold フィールドは非推奨となった。 両機能とも fold kwarg に置き換えられている。 このクワーグはstyle dictのフィールドと同じように振る舞う。

バグ修正

  • あらゆる種類の回路図の基礎となる命令レイヤーは、右/左のジャスティフィケーションに対応するように変更された。 その結果、トポロジー的には以前のバージョンのレンダリングと同等だが、視覚的には以前のレンダリングとは異なる出力が得られることがある。 問題 #2802 を修正
  • パルスQobjの QobjExperimentHeadermemory_slots を追加する。 これは、 meas_level=2 パルス実験の結果のデータフォーマットのバグを修正したものである。 測定された量子状態は、 memory_slots に設定された数値に基づき、ゼロパディングされたビット列として返される。
  • rzzゲートの対称性を反映させるため、ラテックス回路引き出しのrzzゲートの視覚化を修正し、 cu1 ゲートと一致するようにした。 この修正はqcircuit latexパッケージのcdsコマンドに基づいている。 問題 #1957 を修正

その他の注意事項

  • matplotlib.figure.Figure 可視化関数から返されるオブジェクトは、デフォルトでは常に閉じられなくなりました。 その代わり、返される図オブジェクトは、設定されたmatplotlibバックエンドがインラインjupyterバックエンドである場合にのみクローズされます( %matplotlib inline または %matplotlib notebook で設定)。 出力図オブジェクトは、jupyterノートブックでの出力の重複を避けるために、これらのバックエンドではまだ閉じられています(これが、 Figure.close() が最初に追加された理由です)。

エア 0.3

変更なし

イグニス 0.2

変更なし

アクア 0.6

変更なし

IBM Q プロバイダー 0.3

変更なし

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。