Skip to main content
IBM Quantum Platform

Qiskit 0.28 リリースノート


0.28.0

Terra 0.18.0

前奏曲

このリリースには多くの新機能とバグ修正が含まれています。 今回のリリースの目玉は、2つの新しいトランスパイラー・パス、 BIPMappingDynamicalDecouplingパスの新しい pulse_optimize kwargと組み合わせると、次のようになります。 UnitarySynthesis パス上の新しい kwarg と組み合わせると、Quantum Volume 64 の結果を、: https://arxiv.org/abs/2008.08571. これらの新しいトランスパイラー・パスとオプションは、あらゆる回路の最適化にも一般的に適用できる。

新機能

  • measurement_error_mitgation kwargが QuantumInstance コンストラクタのkwargは、すでにサポートされていた CompleteMeasFitter に加えて、qiskit-ignisの TensoredMeasFitter クラスに設定できるようになりました。 TensoredMeasFitter を使用する場合、 TensoredMeasFitter を使用する量子ビットを指定するために、新しい mit_pattern kwarg を設定することもできます。 TensoredMeasFitter のドキュメンテーションにある mit_pattern のドキュメンテーションを参照すると、期待されるフォーマットがわかります。

  • basis kwargで指定される単一量子ビットゲートの分解法は、 基底も含むように拡張された。 OneQubitEulerDecomposerX\sqrt{X} kwargで指定された単一量子ビットゲートの分解法は、 'ZSXX' 基底も含むように拡張されました。 ゲートだけでなく、直接 XX ゲートも利用できます。

  • 新しいパスを2つ追加 AlignMeasuresValidatePulseGates を追加した。 qiskit.transpiler.passes モジュールに追加した。 これらのパスは、ハードウェアを意識した最適化と、バックエンドの命令の時間割り当てに関するアライメント制限を管理するために使用される検証ルーチンである。

    バックエンドが Measure 命令のアライメントに制約を持つ場合(時間的な量子化という意味で)、パスが使用されます。 AlignMeasures パスがスケジュールされた回路の遅延を調整するために使用され、回路内のすべての Measure 命令がバックエンドの制約に従って整列されるようにします。 パスは ValidatePulseGates パスは、カスタムパルスゲート(カスタムパルス定義を calibrations オブジェクトの QuantumCircuit オブジェクトの属性にカスタムパルス定義を持つゲート)がターゲットバックエンドのアライメント制約を与えられたときに有効かどうかをチェックするために使われます。

    で使用される組み込み preset_passmangerstranspile() 関数では、アラインメント制約が、 timing_constraints kwarg on transpile()timing_constraints を使うか BackendConfiguration 属性を持つ場合、これらのパスは自動的にトリガーされます。

    IBM Quantum Services のバックエンド( qiskit-ibmq-provider パッケージ経由でアクセス可能)は、近い将来アライメント情報を提供する予定である。

    例:

    from qiskit import circuit, transpile
    from qiskit.test.mock import FakeArmonk
    
    backend = FakeArmonk()
    
    qc = circuit.QuantumCircuit(1, 1)
    qc.x(0)
    qc.delay(110, 0, unit="dt")
    qc.measure(0, 0)
    qc.draw('mpl')
    qct = transpile(qc, backend, scheduling_method='alap',
                    timing_constraints={'acquire_alignment': 16})
    qct.draw('mpl')
  • で説明されているようなBIP(2値整数計画)問題を解くことによって、最適なレイアウトとルーティングを一度に見つけようとする新しいトランスパイラ・パスクラス qiskit.transpiler.passes.BIPMappingarXiv:2106.06446 が追加されました。

    BIPMapping パス("レイアウトとルーティング "を意味する "マッピング "という名前)は、マッピング問題をBIP(2値整数計画)問題として表現し、BIP問題を解くためにCPLEX (cplex)に依存している。 CPLEXを含む依存ライブラリはqiskit-terraと一緒にインストールできます:

    pip install qiskit-terra[bip-mapper]

    CPLEXの無料版では、小規模なBIP問題、すなわち約5量子ビット未満の回路のマッピングしか解くことができないため、より大規模な回路のマッピングにはCPLEXの有料版が必要になる可能性がある。

    BIPマッパーは、量子ビットやゲートの数に対してひどくスケールする。 例えば、10量子ビットを超える coupling_map 、BIPソルバー(CPLEX)はデフォルトの制限時間内に解を見つけることができないため、動作しない。

    マッピングで使用する物理量子ビットを固定したい場合(量子ボリューム(QV)回路の実行など)、使用する量子ビットのみを含む coupling_map

    以下は、QV回路をトランスパイルするためのパス・マネージャーを構築する最小限のサンプル・コードである:

    num_qubits = 4  # QV16
    circ = QuantumVolume(num_qubits=num_qubits)
    
    backend = ...
    basis_gates = backend.configuration().basis_gates
    coupling_map = CouplingMap.from_line(num_qubits)  # supply your own coupling map
    
    def _not_mapped(property_set):
        return not property_set["is_swap_mapped"]
    
    def _opt_control(property_set):
        return not property_set["depth_fixed_point"]
    
    from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
    pm = PassManager()
    # preparation
    pm.append([
        Unroll3qOrMore(),
        TrivialLayout(coupling_map),
        FullAncillaAllocation(coupling_map),
        EnlargeWithAncilla(),
        BarrierBeforeFinalMeasurements()
    ])
    # mapping
    pm.append(BIPMapping(coupling_map))
    pm.append(CheckMap(coupling_map))
    pm.append(Error(msg="BIP mapper failed to map", action="raise"),
              condition=_not_mapped)
    # post optimization
    pm.append([
        Depth(),
        FixedPoint("depth"),
        Collect2qBlocks(),
        ConsolidateBlocks(basis_gates=basis_gates),
        UnitarySynthesis(basis_gates),
        Optimize1qGatesDecomposition(basis_gates),
        CommutativeCancellation(),
        UnrollCustomDefinitions(sel, basis_gates),
        BasisTranslator(sel, basis_gates)
    ], do_while=_opt_control)
    
    transpile_circ = pm.run(circ)
  • に新しいコンストラクタ・メソッド initialize_from() が追加された。 ScheduleScheduleBlock クラスに追加された。 このメソッドは、他のスケジュールから属性を取得する新しい空のスケジュールを初期化します。 例:

    sched = Schedule(name='my_sched')
    new_sched = Schedule.initialize_from(sched)
    
    assert sched.name == new_sched.name
  • 関数に新しいクワーグ、 line_discipline が追加された。 job_monitor() 関数に追加された。 このkwargは、 job_monitor 出力で使用されるキャリッジ・リターン文字を変更することができる。 line_discipline kwargのデフォルトは '\r'

  • 抽象的な Pulse クラス(これは、次のようなクラスの親クラスです。 Waveform, Constantそして Gaussian コンストラクタに新しいkwarg、 limit_amplitude が追加されました。 False に設定することで、これまでハードコードされていた振幅制限 1 を無効にすることができます。 これは、パルス・クラスのグローバル・デフォルトを変更するために、クラス属性として直接設定することもできます。 例:

    from qiskit.pulse.library import Waveform
    
    # Change the default value of limit_amplitude to False
    Waveform.limit_amplitude = False
    wave = Waveform(2.0 * np.exp(1j * 2 * np.pi * np.linspace(0, 1, 1000)))
  • 新しいクラス PauliListqiskit.quantum_info モジュールに追加された。 このクラスは、演算子のリストを効率的に表現するために使われます。 Pauli 演算子のリストを効率的に表現するために使用されます。 この新しいクラスは、既存の PauliTable と同じ親クラスから派生したものである(したがって、ほとんど互換性をもって使用できる)が、 PauliTable と異なるのは、このクラスが のフェーズを扱えることである。 qiskit.quantum_info.PauliList クラスは Z4 フェーズを扱うことができるからです。

  • 新しいトランスパイラー・パスを追加、 RemoveBarriersを追加した。 qiskit.transpiler.passes. このパスは、回路内のすべての障壁を取り除くために使用される。

  • 新しいオプティマイザー・クラスを追加する、 SciPyOptimizerを追加する。 qiskit.algorithms.optimizers モジュールに追加します。 このクラスは、 scipy.optimize.minimize 関数 (ドキュメント )のシンプルなラッパークラスで、 scipy.optimize.minimize でサポートされているすべての最適化ソルバーとすべてのパラメータ(コールバックなど)を使用することができます。 例:

    from qiskit.algorithms.optimizers import SciPyOptimizer
    
    values = []
    
    def callback(x):
        values.append(x)
    
    optimizer = SciPyOptimizer("BFGS", options={"maxiter": 1000}, callback=callback)
  • パスは HoareOptimizer パスが改良され、すべての制御量子ビットが 状態の場合、ベース・ゲートと回路内の ControlledGate1|1\rangle に置き換えることができるように改良されました。

  • つの新しいメソッドを追加、 is_successor() そして is_predecessor()を追加した。 DAGCircuit クラスに追加した。 これらの関数は、あるノードが他のノードの後継か前任かをチェックするのに使われる。 DAGCircuit.

  • 新しいトランスパイラー・パスが追加された、 RZXCalibrationBuilderNoEchoモジュールが追加された。 qiskit.transpiler.passes モジュールに追加された。 このパスは、既存の RZXCalibrationBuilderRZXGate(theta) の校正を作成するという点で、既存のパスと類似している。 RZXCalibrationBuilderNoEcho は、パルス・スケジュールにエコー・パルスを挿入することなくこれを行う。 これにより、クロス共振シーケンスのエコーをゲートとして露出させ、トランスパイラで簡略化することができる。 パスは RZXCalibrationBuilderNoEcho パスは、ハードウェア・ネイティブの方向である CXGate.

  • のメソッドに新しいクワーグ、 wrap が追加された。 compose() メソッドに追加された。 QuantumCircuit. これにより、構成された回路を命令にラップするかどうかを選択することができる。 デフォルトでは False、つまりラッピングはしない。 例:

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(2)
    circuit.h([0, 1])
    other = QuantumCircuit(2)
    other.x([0, 1])
    print(circuit.compose(other, wrap=True))  # wrapped
    print(circuit.compose(other, wrap=False))  # not wrapped
  • 新しい属性、 control_channelsが追加された。 PulseBackendConfiguration クラスに追加されました。 この属性は、バックエンドの制御チャンネルを、オブジェクトのリストへの量子ビットのマッピングとして表します。 ControlChannel オブジェクトへのマッピングとして表します。

  • Isometry クラスのコンストラクタに新しいクワーグ epsilon が追加された。 QuantumCircuit メソッド isometry(). このkwargは、 Isometry ゲートで使用されるεトレランスをオプションで設定できる。 例:

    import numpy as np
    from qiskit import QuantumRegister, QuantumCircuit
    
    tolerance = 1e-8
    iso = np.eye(2,2)
    num_q_output = int(np.log2(iso.shape[0]))
    num_q_input = int(np.log2(iso.shape[1]))
    q = QuantumRegister(num_q_output)
    qc = QuantumCircuit(q)
    
    qc.isometry(iso, q[:num_q_input], q[num_q_input:], epsilon=tolerance)
  • トランスパイラー・パスを追加、 DynamicalDecouplingを追加しました。 qiskit.transpiler.passes を追加しました(物理量子ビットへのマッピングとスケジューリングの後)。 このパスにより、DDゲートのシーケンス、ゲート間の間隔、適用する量子ビットを制御することができる。 例:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import XGate
    from qiskit.transpiler import PassManager, InstructionDurations
    from qiskit.transpiler.passes import ALAPSchedule, DynamicalDecoupling
    from qiskit.visualization import timeline_drawer
    
    circ = QuantumCircuit(4)
    circ.h(0)
    circ.cx(0, 1)
    circ.cx(1, 2)
    circ.cx(2, 3)
    circ.measure_all()
    
    durations = InstructionDurations(
        [("h", 0, 50), ("cx", [0, 1], 700), ("reset", None, 10),
         ("cx", [1, 2], 200), ("cx", [2, 3], 300),
         ("x", None, 50), ("measure", None, 1000)]
    )
    
    dd_sequence = [XGate(), XGate()]
    
    pm = PassManager([ALAPSchedule(durations),
                      DynamicalDecoupling(durations, dd_sequence)])
    circ_dd = pm.run(circ)
    timeline_drawer(circ_dd)
  • その QuantumCircuit メソッド qasm() メソッドには新しいkwarg、 encoding があり、これを使うと関数が生成する出力QASMファイルの文字エンコーディングを任意に設定することができます。 これは、 Python 標準ライブラリのコーデック・モジュールの有効なコーデックまたはエイリアス文字列に設定できる。

  • 新しいクラスを追加、 EvolvedOperatorAnsatzを追加した。 qiskit.circuit.library モジュールを追加した。 このライブラリ回路は、以前は Qiskit Natureにあったもので、進化時間が変分パラメータである時間発展演算子で構成されるアンサッツ回路を構築するのに使うことができる。 このようなアナザッツ回路の例としては、Qiskit Natureの chemistry モジュールにある UCCSD クラスや QAOAAnsatz クラスがある。

  • 新しい偽のバックエンド・クラスが ibmq_guadalupe バックエンドのために qiskit.test.mock で利用可能です。 他のフェイクバックエンドと同様、これにはキャリブレーションデータのスナップショットが含まれる(すなわち、 backend.defaults() ) およびエラーデータ(すなわち backend.properties() ) 実際のシステムから取得したもので、ローカルテスト、コンパイル、シミュレーションに使用できる。

  • 新しい方法 children() クラス用の Schedule クラスの新しいメソッドが追加されました。 このメソッドは、オブジェクトの子スケジュールコンポーネントをタプルとして返すために使用されます。 Schedule オブジェクトの子スケジュールコンポーネントをタプルとして返すために使用されます。 ネストされたスケジュールをフラット化せずに返す。 このメソッドは、プライベートな _children() メソッドと同等だが、パブリックで安定したインターフェースを持っている。

  • 新しいオプティマイザ・クラス GradientDescentクラスが qiskit.algorithms.optimizers モジュールに追加された。 このオプティマイザクラスは、次のような量子変分アルゴリズムで使用される標準的な勾配降下最適化アルゴリズムを実装しています。 VQE. このクラスの詳しい説明と使用例については GradientDescent クラスのドキュメントを参照してください。

  • 新しいオプティマイザ・クラス QNSPSAクラスが qiskit.algorithms.optimizers モジュールに追加された。 このクラスは、2-SPSAアルゴリズムの一般化である量子自然SPSA(QN-SPSA) アルゴリズムを実装し、量子自然勾配の確率的推定を得るために、ヘシアンの代わりに量子フィッシャー情報行列を推定します。 この新しいオプティマイザの使い方の例については QNSPSA クラスのドキュメントを参照してください。

  • のコンストラクタに新しいクワーグ、 second_order が追加された。 SPSA クラスのコンストラクタに qiskit.algorithms.optimizers モジュールのクラスのコンストラクタに追加されました。 True に設定すると、 2次SPSAが有効になる。 2次SPSA(2-SPSA)は、通常のSPSAアルゴリズムを拡張したもので、勾配と同時にヘシアンを推定することができ、パラメータ更新ステップの前に勾配の事前調整に使用される。 2次の方法として、これはSPSAの収束を改善しようとするものである。 このオプションの使用例については SPSA クラスのドキュメントを参照してください。

  • latex または latex_source 出力モードを使用する場合。 circuit_drawer() または draw()QuantumCircuit を使用する場合、 mpl 出力書式と同様に style kwarg を使用することができます。 ただし、 mpl 出力モードとは異なり、 latex または latex_source 出力モードを使用する場合は、 displaytext フィールドのみが使用されます(どちらもカラーをサポートしていないため)。

  • mpl 、または latexcircuit_drawer() 関数または draw()QuantumCircuitの出力メソッドを使う場合、 style kwargをユーザー生成の名前やラベルを持つdictとして設定することで、テキストに数学モードの書式を使ったり、色の書式を設定したりできるようになりました(mpl のみ)。 例えば、添え字の追加やゲートの色の変更など:

    from qiskit import QuantumCircuit
    from qiskit.circuit.library import HGate
    qc = QuantumCircuit(3)
    qc.append(HGate(label='h1'), [0])
    qc.append(HGate(label='h2'), [1])
    qc.append(HGate(label='h3'), [2])
    qc.draw('mpl', style={'displaytext': {'h1': 'H_1', 'h2': 'H_2', 'h3': 'H_3'},
        'displaycolor': {'h2': ('#EEDD00', '#FF0000')}})
  • 新しいクラスを3つ追加、 CDKMRippleCarryAdderClassicalAdderDraperQFTAdder を追加した。 qiskit.circuit.library モジュールに追加した。 これらの新しい回路クラスは、2つの等しい大きさの量子ビットレジスタの古典的な加算を実行するために使用される。 nn 量子ビットの2つのレジスタ an|a\rangle_nbn|b\rangle_n、3つの新しいクラスが演算を行う:

anbnana+bn+1.|a\rangle_n |b\rangle_n \mapsto |a\rangle_n |a + b\rangle_{n + 1}.

例:

from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import CDKMRippleCarryAdder
from qiskit.quantum_info import Statevector

# a encodes |01> = 1
a = QuantumCircuit(2)
a.x(0)

# b encodes |10> = 2
b = QuantumCircuit(2)
b.x(1)

# adder on 2-bit numbers
adder = CDKMRippleCarryAdder(2)

# add the state preparations to the front of the circuit
adder.compose(a, [0, 1], inplace=True, front=True)
adder.compose(b, [2, 3], inplace=True, front=True)

# simulate and get the state of all qubits
sv = Statevector(adder)
counts = sv.probabilities_dict()
state = list(counts.keys())[0]  # we only have a single state

# skip the input carry (first bit) and the register |a> (last two bits)
result = state[1:-2]
print(result)  # '011' = 3 = 1 + 2
  • 新しいクラスを2つ追加、 RGQFTMultiplierHRSCumulativeMultiplierを追加した。 qiskit.circuit.library モジュールを追加した。 これらのクラスは、2つの等しいサイズの量子ビットレジスタの古典的な乗算を実行するために使用される。 nn クビット上の2つのレジスタ an|a\rangle_nbn|b\rangle_n に対して、2つの新しいクラスは次の操作を実行する
anbn02nanbnab2n.|a\rangle_n |b\rangle_n |0\rangle_{2n} \mapsto |a\rangle_n |b\rangle_n |a \cdot b\rangle_{2n}.

例:

from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import RGQFTMultiplier
from qiskit.quantum_info import Statevector

num_state_qubits = 2

# a encodes |11> = 3
a = QuantumCircuit(num_state_qubits)
a.x(range(num_state_qubits))

# b encodes |11> = 3
b = QuantumCircuit(num_state_qubits)
b.x(range(num_state_qubits))

# multiplier on 2-bit numbers
multiplier = RGQFTMultiplier(num_state_qubits)

# add the state preparations to the front of the circuit
multiplier.compose(a, [0, 1], inplace=True, front=True)
multiplier.compose(b, [2, 3], inplace=True, front=True)

# simulate and get the state of all qubits
sv = Statevector(multiplier)
counts = sv.probabilities_dict(decimals=10)
state = list(counts.keys())[0]  # we only have a single state

# skip both input registers
result = state[:-2*num_state_qubits]
print(result)  # '1001' = 9 = 3 * 3
  • この Delay クラスは ParameterExpression または Parameterduration 値が使えるようになりました。 duration 属性に

    例:

    idle_dur = Parameter('t')
    qc = QuantumCircuit(1, 1)
    qc.x(0)
    qc.delay(idle_dur, 0, 'us')
    qc.measure(0, 0)
    print(qc)  # parameterized delay in us (micro seconds)
    
    # assign before transpilation
    assigned = qc.assign_parameters({idle_dur: 0.1})
    print(assigned)  # delay in us
    transpiled = transpile(assigned, some_backend_with_dt)
    print(transpiled)  # delay in dt
    
    # assign after transpilation
    transpiled = transpile(qc, some_backend_with_dt)
    print(transpiled)  # parameterized delay in dt
    assigned = transpiled.assign_parameters({idle_dur: 0.1})
    print(assigned)  # delay in dt
  • 新しいバイナリー・シリアライズ・フォーマット、QPYが導入された。 これは、Qiskitにネイティブな後方互換性のある(Qiskitの古いバージョンで生成されたQPYファイルをQiskitの新しいバージョンで読み込むことができる)高速バイナリシリアライゼーションフォーマットとして設計されています。 QPYシリアライゼーション・ツールは qiskit.circuit.qpy_serialization 。 例えば、QPYファイルを生成する場合:

    from datetime import datetime
    
    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit import qpy_serialization
    
    qc = QuantumCircuit(
      2, metadata={'created_at': datetime.utcnow().isoformat()}
    )
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    circuits = [qc] * 5
    
    with open('five_bells.qpy', 'wb') as qpy_file:
        qpy_serialization.dump(circuits, qpy_file)

    そして、QPYファイルに保存された5つの回路をロードすることができる:

    from qiskit.circuit.qpy_serialization
    
    with open('five_bells.qpy', 'rb') as qpy_file:
        circuits = qpy_serialization.load(qpy_file)

    QPYファイル・フォーマットの仕様は、モジュールのドキュメントに掲載されている。

  • この TwoQubitBasisDecomposer クラスは、CX、√X、仮想Rzゲートを持つ基底に対してパルス最適分解を行うように更新された。 https://arxiv.org/pdf/2008.08571. ここでいうパルス最適化とは、分解されたCXゲート間のゲートの持続時間が短縮される代わりに、すべてのCXゲートの前または後に、より多くのローカルゲートが配置される可能性があり、回路に構成されたときに、隣接するゲートによって全体のシーケンス持続時間が短縮される単一量子ビット圧縮の可能性があることを意味する。

    のコンストラクタに新しいキーワード引数 `pulse_optimize が追加された。 TwoQubitBasisDecomposer のコンストラクタに追加された:

    • None:パルス最適分解を試みる。 パルス最適分解が分解者の基底に対して未知の場合、警告なしに標準分解に戻る。 これはデフォルトの設定です。
    • True:パルス最適分解を試みる。 パルス最適分解が分解者の基底に対して未知の場合、 QiskitError を上げる。
    • False:パルス最適分解を試みてはならない。

    例:

    from qiskit.quantum_info import TwoQubitBasisDecomposer
    from qiskit.circuit.library import CXGate
    from qiskit.quantum_info import random_unitary
    
    unitary_matrix = random_unitary(4)
    
    decomposer = TwoQubitBasisDecomposer(CXGate(), euler_basis="ZSX", pulse_optimize=True)
    circuit = decomposer(unitary_matrix)
  • にあるトランスパイラー・パス UnitarySynthesis が更新されました。 qiskit.transpiler.passes が更新され、パルス最適分解の実行がサポートされました。 これは主に、コンストラクタに追加されたキーワード引数 pulse_optimize 、パルス最適合成を実行するかどうかを制御するために使われる。 このkwargの動作は、クラスのコンストラクタの pulse_optimize kwargを反映している。 TwoQubitBasisDecomposer クラスのコンストラクタの さらに、コンストラクタにはもう1つの新しいキーワード引数、 synth_gates があり、合成を試みるゲート名のリストを指定するのに使われる。 Nonepulse_optimizeFalse または None の場合は、 "unitary" を使用する。 None で pulse_optimize が True の場合、 "unitary""swap" を使用する。 合成におけるCXゲートの方向は任意であるため、もう1つのキーワード引数 natural_direction、最初にカップリング・マップを考慮し、次にデュレーションを考慮する。 CXGate デュレーションを考慮します。

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler import PassManager, CouplingMap
    from qiskit.transpiler.passes import TrivialLayout, UnitarySynthesis
    from qiskit.test.mock import FakeVigo
    from qiskit.quantum_info.random import random_unitary
    
    backend = FakeVigo()
    conf = backend.configuration()
    coupling_map = CouplingMap(conf.coupling_map)
    triv_layout_pass = TrivialLayout(coupling_map)
    circ = QuantumCircuit(2)
    circ.unitary(random_unitary(4), [0, 1])
    unisynth_pass = UnitarySynthesis(
        basis_gates=conf.basis_gates,
        coupling_map=None,
        backend_props=backend.properties(),
        pulse_optimize=True,
        natural_direction=True,
        synth_gates=['unitary'])
    pm = PassManager([triv_layout_pass, unisynth_pass])
    optimal_circ = pm.run(circ)
  • basis の引数に新しい基本オプション 'XZX' が追加された。 OneQubitEulerDecomposer クラスに追加された。

  • 新しいメソッドを追加しました、 get_instructions()が追加された。 QuantumCircuit クラスに追加されました。 このメソッドは Instruction オブジェクトを返します。 namename qargs cargs を持つすべてのオブジェクトを返します。 QubitClbit オブジェクトを返します。

  • qiskit-terraパッケージに新しいオプション追加 all 。 これにより、例えば、1つのエクストラですべてのオプション要件をインストールすることができます: pip install 'qiskit-terra[all]'以前は、すべてのオプションの依存関係を同時にインストールするために、すべてのエクストラを個別にリストする必要がありました。

  • 新しいクラスを2つ追加 ProbDistributionQuasiDistribution クラスが追加された。 これらのオブジェクトはどちらも辞書のサブクラスで、確率分布と準確率分布を扱うためのメソッドが追加されています。

  • 新しい settings プロパティを追加した。 Optimizer 抽象ベース・クラスに新しいプロパティを追加した。 qiskit.algorithms.optimizers に新しいプロパティを追加しました。 このプロパティは、同じオプティマイザ・クラスの別のインスタンスをインスタンス化するために使用できる、オプティマイザの設定の Python 辞書を返します。 例:

    from qiskit.algorithms.optimizers import GradientDescent
    
    optimizer = GradientDescent(maxiter=10, learning_rate=0.01)
    settings = optimizer.settings
    new_optimizer = GradientDescent(**settings)

    settings ディクショナリは、JSON や他のシリアライズ形式を使用してオプティマイザー・オブジェクトをシリアライズする際にも役立つ可能性があります。

  • qiskit.user_config モジュールに新関数 set_config() が追加された。 QiskitのAPIからユーザーコンフィグに値を設定する機能。 例:

    from qiskit.user_config import set_config
    set_config("circuit_drawer", "mpl", section="default", file="settings.conf")

    その結果、 settings.conf ファイルの default セクションに circuit_drawer = mpl の値が追加される。

    引数 file_path が指定されない場合、現在使用されているユーザー設定ファイルへのパス(設定されていれば環境変数 QISKIT_SETTINGS の値、またはデフォルトの場所 ~/.qiskit/settings.conf )が更新される。 しかし、既存のコンフィグファイルへの変更は、インポート時にコンフィグファイルが解析されるため、現在のセッションには反映されない。

  • 新しいステート・クラスを追加、 StabilizerStateを追加した。 qiskit.quantum_info モジュールを追加しました。 このクラスは、 Aaronson and Gottesman (2004 )の慣例を用いて、スタビライザー・シミュレーターの状態を表します。

  • 関数の sort kwargに 'value''value_desc' の2つの新しいオプションが追加された。 qiskit.visualization.plot_histogram() 関数に追加された。 sort がこれらのオプションのいずれかに設定されている場合、出力の可視化は、各ビット文字列の最大確率に基づいてX軸を並べ替えます。 例:

    from qiskit.visualization import plot_histogram
    
    counts = {
      '000': 5,
      '001': 25,
      '010': 125,
      '011': 625,
      '100': 3125,
      '101': 15625,
      '110': 78125,
      '111': 390625,
    }
    plot_histogram(counts, sort='value')

既知の問題

  • 実行時 parallel_map() (および内部的に parallel_map()transpile() および assemble()などを内部的に呼び出す関数)を実行すると、 QISKIT_PARALLEL が True に設定された Python 3.9 上でプログラムがデッドロックに陥り、実行が終了しないことがあります。 このような事態を避けるため、 Python 3.9 のデフォルトは並列実行しないように変更されたが、 QISKIT_PARALLEL が明示的に有効化されている場合は、まだこのような事態が発生する可能性がある。

アップグレードの注意

  • retworkxの依存関係の最小バージョンは、バージョン 0.9.0 に増加した。 これは、このリリースで導入された新しいAPIを使用するために行われたもので、トランスパイラ・パスのパフォーマンスが向上している。

  • Python 3.9 環境での QISKIT_PARALLEL のデフォルト値が False に変更された。これは、 Python 3.9 で実行する場合、デフォルトではマルチプロセッシングが使用されないことを意味する。 これは、 Python 3.9 (詳細は既知の問題セクションを参照)上でマルチプロセッシングを実行する際に発生する可能性のあるデッドロック/ハングアップの問題を回避するために行われた。 環境変数 QISKIT_PARALLEL を明示的に TRUE に設定することで、手動で有効にすることも可能です。

  • qiskit.test.mock の既存の偽のバックエンド・クラスは、現在では厳密に BackendV1 インターフェイスを実装するようになりました。 つまり、手動で QasmQobj または PulseQobj オブジェクトを手動で構築していた場合、 run() メソッドで使用することはできません。 run() メソッドは QuantumCircuit または Schedule オブジェクトしか受け付けない。 これは、qobjなしで実装された新しいバックエンドのテストを可能にするために必要でした。 偽のバックエンドを活用する必要がある場合は QasmQobj または PulseQobj 新しい偽のレガシー・バックエンド・オブジェクトが追加され、レガシー・プロバイダー・インターフェースを明示的にテストできるようになりました。 これは、レガシーインターフェースが非推奨となり削除された後に削除される。 今後、新しい偽のバックエンドは BackendV1 インターフェイスのみを実装し、新しい偽のバックエンドのために新しいレガシーバックエンドクラスを追加することはありません。

  • 無効な文字列ラベルを持つ Pauli オブジェクトを無効な文字列ラベルで作成すると QiskitError が発生するようになった。 これは、無効な文字列ラベルに対して AttributeError を発生させていた以前のリリースからの変更である。 この変更は、エラーメッセージをより分かりやすく、一般的な AttributeError と区別できるようにするために行われた。

  • パルスビルダー(qiskit.pulse.builder.build())からの出力プログラムの表現が Schedule から ScheduleBlock. この新しい表現は、シフトやインサートなど、タイミングに関連するいくつかの操作を無効にする。 しかし、これによってビルダー・コンテキスト内で命令時間をパラメータ化することができる。 例:

    from qiskit import pulse
    from qiskit.circuit import Parameter
    
    dur = Parameter('duration')
    
    with pulse.build() as sched:
        with pulse.align_sequential():
            pulse.delay(dur, pulse.DriveChannel(1))
            pulse.play(pulse.Gaussian(dur, 0.1, dur/4), pulse.DriveChannel(0))
    
    assigned0 = sched.assign_parameters({dur: 100})
    assigned1 = sched.assign_parameters({dur: 200})

    持続時間を割り当てたスケジュールを直接アセンブラ(またはバックエンド)に渡すこともできるし、パルスゲートとして量子回路に取り付けることもできる。

  • これまでオプショナルな依存関係であった tweedledum ライブラリが必須となった。 が広く使われているためである。 PhaseOracle (これはtweedledumがインストールされているかどうかに依存する)のアルゴリズムが広く使われているためである。 qiskit.algorithms.

  • 以前は pip install qiskit-terra[full-featured-simulators] のようなもので qiskit-aer をインストールするために使用できたオプションの追加 full-featured-simulators はqiskit-terraパッケージから削除されました。 もしこれが qiskit-terra の代わりに qiskit-aer をインストールするために使用されているのであれば、 qiskit メタパッケージに依存するか、qiskit-terra と qiskit-aer を pip install qiskit-terra qiskit-aer と一緒にインストールする必要があります。

  • Linux ( x86_64, aarch64, ppc64le ) および macOS ユーザー ( x86_64 および arm64 ) 向けに、新しい要件 symengine が追加されました。 Windows(および 64bit Windows用のプリコンパイルパッケージとして PyPi で入手可能)やその他のアーキテクチャでは、オプションで依存する。 このシステムを導入することで、次のような評価のパフォーマンスが大幅に向上する。 Parameter および ParameterExpression オブジェクトの評価のパフォーマンスが大幅に向上します。

  • すべてのライブラリ回路クラス、すなわち QuantumCircuit の派生クラスはすべて qiskit.circuit.libraryでラップされる。 Instruction (でラップされる(あるいは Gateでラップされるようになった。) 例えば QFT 回路を

    以前は

                                              ┌───┐
    q_0: ────────────────────■────────■───────┤ H ├─X─
                       ┌───┐ │        │P/2) └───┘ │
    q_1: ──────■───────┤ H ├─┼────────■─────────────┼─
         ┌───┐ │P/2) └───┘ │P/4)
    q_2: ┤ H ├─■─────────────■──────────────────────X─
         └───┘

    そして今は次のように見える

         ┌──────┐
    q_0:0
         │      │
    q_1:1 QFT ├
         │      │
    q_2:2
         └──────┘

    古い回路を取得するには、回路上の decompose() メソッドを呼び出す

    この変更は主に一貫性を保つために行われました。 qiskit.circuit.library の一部の回路クラスが Instruction または Gate でラップされていましたが、すべてではありませんでした。

非推奨のメモ

  • qiskit.exceptions.QiskitIndexError クラスは非推奨であり、将来のリリースで削除される予定です。 この例外はQiskitの何かで積極的に使用されているわけではありません。もし使用していたのであれば、カスタム例外クラスを作成して置き換えることができます。
  • のkwargs epsilonfactrqiskit.algorithms.optimizers.L_BFGS_B のkwarg factr と は非推奨です。 P_BFGS は非推奨であり、将来のリリースで削除される予定です。 epsilon の代わりに eps karg をお使いください。 factr kwarg は ftol に置き換えられる。 両者の関係は ftol = factr * numpy.finfo(float).eps。 この変更は、 scipy.optimize.minimize 関数 'L-BFGS-B' メソッドの使用方法との一貫性を保つために行われた。 これらの新しいパラメーターの使用方法については、: scipy.optimize.minimize(method='L-BFGS-B')ドキュメントを参照。
  • qiskit.providers.BaseBackendqiskit.providers.BaseJobqiskit.providers.BaseProvider の抽象クラスで構成されていたレガシー・プロバイダー・インターフェイスは非推奨となり、将来のリリースで削除される予定である。 代わりに、バージョン管理されたインターフェイスを使用する必要があります。 qiskit.providers.BackendV1, qiskit.providers.JobV1そして qiskit.providers.ProviderV1. V1 オブジェクトは、レガシー・インターフェイスからバージョンアップされたものへの移行を容易にするため、ほとんどが後方互換性を持っている。 しかし、抽象的なインターフェースの将来のバージョンでは、もっと分岐が多くなることが予想される。 バージョン管理されたインターフェイスの詳細については qiskit.providers バージョン管理されたインターフェイスの詳細については、ドキュメントを参照してください。
  • conditionDAGDepNode の対応する condition 属性とともに、コンストラクタへの kwarg は非推奨となり、将来のリリースでは削除される予定です。 DAGDepNode は非推奨となり、将来のリリースで削除される予定です。 代わりに、ノードが op 型の場合、 DAGDepNode.op.condition を使って DAGDepNodecondition にアクセスすることができる。
  • クラスの conditionDAGNode クラスの属性は非推奨となり、将来のリリースで削除される予定です。 代わりに、ノードが op 型であれば、 DAGNode.op.condition を使って DAGNode オブジェクトの condition にアクセスすることができます。
  • パルスビルダー(qiskit.pulse.builder.build()) 構文 qiskit.pulse.builder.inline() は非推奨であり、将来のリリースで削除される予定である。 このコンテキストを使う代わりに、インライン・コンテキスト内のアライメント・コンテキストを削除することができる。
  • パルスビルダー(qiskit.pulse.builder.build()) 構文 qiskit.pulse.builder.pad() は非推奨であり、将来のリリースで削除される予定である。 これは ScheduleBlock これは、パルスビルダーが返す .insert メソッドがサポートされていない(ビルダーには挿入構文がない)ためです。 他の命令の挿入をブロックするためのタイムスロット・プレースホルダの使用は、もはや必要ない。

バグ修正

  • その OneQubitEulerDecomposerTwoQubitBasisDecomposer クラスが改良され、公差の厳格化、再現性の向上、単純化、およびグローバル位相追跡のバグが修正されました。

  • 属性の割り当てに関する問題を修正しました。 name 属性の Gateinverse`() の割り当てに関する問題を修正しました。 この修正以前は、 inverse`() が呼び出されると、inverse が呼び出されるたびに無条件に _dg が追加されていた。 この問題は修正され、 inverse`() を2回呼び出すと、 _dg の接尾辞が削除されるようになった。

  • のトリビアル・チェック条件を固定する。 CZGate, CRZGate, CU1Gate および MCU1Gate HoareOptimizer の些細なチェック条件を修正した。 以前は、場合によってはオプティマイザがこれらのゲートを削除し、変換の意味的等価性を壊していた。

  • のオブジェクトを ListOp オブジェクトの PauliSumOp オブジェクトを PauliExpectation または AerPauliExpectation. 以前は、パウリ表現に変換すると警告が出ましたが、これは高くつく可能性があります。 を内部的に ListOpSummedOp オブジェクトの PauliOp オブジェクトに変換する代わりに PauliSumOp を生成するようになった。 修正 #6159

  • NLocal クラスの問題を修正しました。 qiskit.circuit.library モジュールのクラスの問題を修正しました。 reps kwarg に無効な型が使われた場合、オブジェクトの初期化時に正しく例外が発生せず、後で予期しない実行時エラーになることがありました。 reps kwargが int の値でない場合、 TypeError が適切に発生するようになった。 6515を修正

  • TwoLocal クラスが qiskit.circuit.library モジュールのクラスが、 entanglement kwargの有効な入力としてnumpy整数型(例: numpy.int32, numpy.int64, etc)を受け付けなかった問題を修正した。 修正 #6455

  • クラスの from_qasm_file() または from_qasm_str() コンストラクタで OpenQASM2 ファイルまたは文字列をロードするとき。 QuantumCircuit クラス用のコンストラクタで delay または ファイルまたは文字列をロードするとき、 OpenQASM2 回路に という名前の命令がある場合、この命令は クラス用のコンストラクタにマップされます。 qiskit.circuit.Delay 命令にマップされます。 例:

    from qiskit import QuantumCircuit
    
    qasm = """OPENQASM 2.0;
    include "qelib1.inc";
    opaque delay(time) q;
    qreg q[1];
    delay(172) q[0];
    u3(0.1,0.2,0.3) q[0];
    """
    circuit = QuantumCircuit.from_qasm_str(qasm)
    circuit.draw()

    6510を修正

  • オブジェクト間の追加に関する問題を修正しました。 PauliSumOp 係数を持つ ParameterExpression 係数を持つオブジェクト間の加算に関する問題を修正した。 以前はこの場合、 QiskitError 例外が発生した。 ParameterExpression が正しく処理されなかったため、例外が発生した。 を持つオブジェクト間で足し算ができるように修正されました。 PauliSumOp 係数を持つ ParameterExpression 係数を持つオブジェクト間で加算が実行できるように修正されました。

  • クラスの初期化に関する問題を修正。 AmplificationProblem クラスの初期化に関する問題を修正しました。 is_good_state kwargは必須項目であったが、誤って任意項目として扱われていた(そのように文書化されていた)。 これは修正され、入力 oraclePhaseOracle オブジェクト(これは評価メソッドを提供する)でない限り、フィールドは必須であり、 is_good_state なしで構築された場合は TypeError が発生する。

  • にコントロールを追加すると、内部で開いているコントロールが解除される問題を修正しました。 ControlledGate にコントロールを追加すると、内部のオープンコントロールがアンセットされる問題を修正しました。 5857を修正

  • convert() クラスの PauliExpectation クラスのメソッドで、エルミートでない演算子に対してこのメソッドを呼び出すと正しくない結果が返される問題を修正しました。 修正 #6307

  • の問題を修正しました。 qiskit.pulse.transforms.inline_subroutines() 関数の問題を修正しました。 修正 #6321

  • Python 標準ライブラリーの functools.partial() 関数で作成された部分的にバインドされた callable を schedule kwarg として add() メソッドに渡す際の問題を修正しました。 InstructionScheduleMap クラスのメソッドに渡すとエラーになる問題を修正した。 6278を修正

  • の問題を修正しました。 PiecewiseChebyshev の問題を修正しました。 breakpointsNone に設定すると、既存のオブジェクトが誤ってブレークポイントとして扱われる問題を修正しました。 これを修正し、 None に設定すると、全区間で近似するデフォルトの動作に戻るようにした。 6198を修正

  • の問題を修正しました。 num_connected_components() メソッドの問題を修正しました。 QuantumCircuit このメソッドは、回路が古典レジスタを条件とする2つ以上のゲートを含む場合に、不正なコンポーネント数を返していました。 6477を修正

  • モジュールの問題を修正しました。 qiskit.opflow.expectations モジュールの問題を修正しました。 を使用した場合のグラデーションとQFIの計算も修正されました。 PauliExpectation または AerPauliExpectation クラスを使用した場合の 例えば、以前は:

    from qiskit.opflow import StateFn, I, One
    
    exp = ~StateFn(I) @ (2 * One)

    については 2 、その他の期待値変換器については。 AerPauliExpectation その他の期待値変換器については 4 に評価される。 ~StateFn(I) @ (2 * One)~(2 * One) @ I @ (2 * One) の省略記法であるため、すべての期待値変換器に対して 4 の正しい係数が返される。 修正 #6497

  • PauliOp がフェイズを持つときに to_circuit() が失敗するバグを修正。 同時に、 PauliGate の使用効率も高まった。

  • メソッドによって生成されたQASM出力が、QASMの qasm() メソッドによって生成される QuantumCircuit のような複合ゲートに対して MCXGate およびその変種( MCXGrayCode, MCXRecursiveおよび MCXVChain) は正しくない。 回路内の Gateqelib1.inc に存在しない場合、その定義は出力QASM文字列に追加される。 #4943と #3945を修正

  • の問題を修正しました。 circuit_drawer() 関数と draw() メソッドの QuantumCircuit. mpl または latex 出力モードを使用する場合、 cregbundle kwarg を False に設定し、 reverse_bits kwarg を True に設定すると、 reverse_bitsFalse に設定したときと同じ順序で古典レジスタのビットが表示される。

  • qiskit.extensions.Initialize 命令を使用した場合に、合成された定義のグローバル位相が正しく設定されない問題を修正しました。 5320を修正

  • のビット順序が測定されたビット列の順序と一致していなかった問題を修正。 qiskit.circuit.library.PhaseOracle.evaluate_bitstring() のビット順序が測定されたビット列の順序と一致していなかった問題を修正した。 この修正は Grover アルゴリズム・クラスの実行にも影響します。 PhaseOracleとして指定された場合のアルゴリズム・クラスの実行にも影響します。 修正 #6314

  • のバグを修正した。 Optimize1qGatesDecomposition() のバグを修正した。

  • qiskit.opflow.gradients.Gradient.gradient_wrapper() メソッドにおける勾配計算の問題を修正。 以前は、演算子が対角でない場合、状況によっては正しくない結果が返されていた。 これは、結果が常に正しいことを保証するために期待値コンバーターを使用することで修正された。

  • の問題を修正しました。 circuit_drawer() 関数と draw() メソッドの問題を修正しました。 QuantumCircuit の関数とメソッドで、古典ビットを含むカスタム命令が正しくレンダリングされない場合がある問題を修正しました。 3201 、#3202 、#6178を修正

  • の問題を修正した。 circuit_drawer()draw() メソッドの問題を修正しました。 QuantumCircuit クラスの問題を修正しました。 mpl 出力モードを使用すると、制御された Z ゲートが誤って非対称に描画されました。 5981を修正

  • OptimizeSwapBeforeMeasure トランスパイラー・パスの問題を修正。 SwapGate が削除されてしまう問題を修正した。 修正 #6192

  • クラスのフェーズに関する問題を修正しました。 qiskit.opflow.gradients.QFI クラスのフェーズに関する問題を修正しました。 qfi_methodlin_comb_full に設定されている場合、不正な observable が評価される原因となっていました。

  • での問題を修正しました。 VQE アルゴリズム・クラスを L_BFGS_B または P_BFGS オプティマイザクラスで勾配を使用する場合、勾配が期待される浮動小数点数のリストではなく、numpyの配列として誤って渡され、エラーになる問題を修正しました。 でグラデーションを使用できるようになりました。 VQEL_BFGS_B または P_BFGS オプティマイザで使用できるようになりました。

その他の注意事項

  • Instruction クラスの parameters() メソッドの非推奨が取り消された。 この方法は元々、 0.17.0 で非推奨とされていたものだが、校正実験を行う場合など、いくつかの用途では今でも必要である。 この方法は今後もサポートされ、削除されることはない。

エア 0.8.2

変更なし

イグニス 0.6.0

変更なし

アクア 0.9.4

変更なし

IBM Q プロバイダー 0.15.0

新機能

  • ジョブが失敗した場合にその理由を表す文字列を返す新しいメソッド qiskit.providers.ibmq.runtime.RuntimeJob.error_message() のサポートを追加。

  • qiskit.providers.ibmq.runtime.IBMRuntimeService.run() メソッドの inputs パラメータに、オートコンプリート機能をサポートする qiskit.providers.ibmq.runtime.ParameterNamespace インスタンスを指定できるようになりました。 ParameterNamespace のインスタンスを取得するには qiskit.providers.ibmq.runtime.RuntimeProgram.parameters() を使う。

    例:

    from qiskit import IBMQ
    
    provider = IBMQ.load_account()
    
    # Set the "sample-program" program parameters.
    params = provider.runtime.program(program_id="sample-program").parameters()
    params.iterations = 2
    
    # Configure backend options
    options = {'backend_name': 'ibmq_qasm_simulator'}
    
    # Execute the circuit using the "circuit-runner" program.
    job = provider.runtime.run(program_id="sample-program",
                               options=options,
                               inputs=params)
  • qiskit.providers.ibmq.runtime.IBMRuntimeService.set_program_visibility() を使って、 Qiskit Runtime プログラムの可視性(プライベート/パブリック)を設定できるようになった。

  • qiskit.providers.ibmq.runtime.IBMRuntimeService.jobs() にオプションのブール値パラメータ pending が追加され、ジョブをステータスでフィルタリングできるようになりました。 pendingが指定されていない場合は、すべてのジョブが返される。 pending が True に設定されている場合、'QUEUED' および 'RUNNING' ジョブが返される。 pendingをFalseに設定すると、'DONE'、'ERROR'、'CANCELLED'のジョブが返される。

  • qiskit.providers.ibmq.IBMQBackend.run() メソッドに use_measure_esp フラグのサポートを追加。 True の場合、バックエンドはその量子ビットの終端命令である全ての測定にESP読み出しを使用する。 バックエンドが ESP 読み出しをサポートしていない場合に使用すると、エラーが発生します。

アップグレードの注意

  • qiskit.providers.ibmq.runtime.RuntimeProgram.parameters() は、 qiskit.providers.ibmq.runtime.ParameterNamespace インスタンスを返すメソッドになりました。このインスタンスを使って、実行時プログラムのパラメータ値を入力し、 qiskit.providers.ibmq.runtime.IBMRuntimeService.run() に渡すことができます。
  • バックエンド設定の open_pulse フラグは、バックエンドがパルスレベル制御をサポートしているかどうかを示さなくなった。 その結果、 qiskit.providers.ibmq.IBMQBackend.configuration()PulseBackendConfigurationopen_pulse Falseインスタンスを返すかもしれない。
  • ジョブシェアレベルは普及率が低いためサポートされなくなり、対応するインターフェースは将来のリリースで削除される予定です。 つまり、ジョブの作成時にshare_levelを渡したり、ジョブの共有レベルを取得するために qiskit.providers.ibmq.job.IBMQJob.share_level()

非推奨のメモ

  • IBM ハードウェアバックエンドでは、 id 命令は廃止された。 代わりに、 dt 単位で指定される可変長遅延を実装する delay 命令を使用してください。 id 命令を含む回路を実行する場合、ジョブ送信時に警告が発せられ、ジョブ内の id 命令は自動的に同等の delay 命令に置き換えられます。
このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。