Skip to main content
IBM Quantum Platform

Qiskit 0.33 リリースノート


0.33.1

Terra 0.19.1

前奏曲

Qiskit Terra 0.19.1 はバグフィクスリリースで、 0.19.0 の制御フロービルダーインターフェイスで構築された回路、条件付きゲート、新しい Terra オブジェクトの QPY シリアル化に関するいくつかの問題を解決しています。

非推奨のメモ

  • ルース関数 qiskit.circuit.measure.measure()qiskit.circuit.reset.reset() は非推奨であり、将来のリリースで削除される予定である。 のメソッドとしてアクセスする必要があります。 QuantumCircuit:

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(1, 1)
    
    # Replace this deprecated form ...
    from qiskit.circuit.measure import measure
    measure(circuit, 0, 0)
    
    # ... with either of the next two lines:
    circuit.measure(0, 0)
    QuantumCircuit.measure(circuit, 0, 0)

バグ修正

  • 回路変換関数のエラーを修正 circuit_to_gate()circuit_to_instruction() (および関連する回路メソッド QuantumCircuit.to_gate() および QuantumCircuit.to_instruction())が、レジスタのないビット、または複数のレジスタのビットを持つ回路に作用するときのエラーを修正しました。 以前は、作成されたゲートや命令に必要なビット数が正しく計算されず、しばしば変換中に例外が発生していた。

  • ビルダー・インターフェイスで作成されたコントロール・フロー操作の QuantumCircuit.copy() を呼び出すとエラーが発生する問題を修正した。 例えば、以前はエラーでしたが、現在は正常に返されます:

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    
    qreg = QuantumRegister(4)
    creg = ClassicalRegister(1)
    circ = QuantumCircuit(qreg, creg)
    
    with circ.if_test((creg, 0)):
        circ.h(0)
    
    if_else_instruction, _, _ = circ.data[0]
    true_body = if_else_instruction.params[0]
    true_body.copy()
  • コントロール・フロー・ビルダー・インターフェースが、ネストされたコントロール・フロー・スコープで条件として ClassicalRegisterをネストされた制御フロースコープの条件として使用できるようになった。 以前は、これをやってもすぐにはエラーにならなかったが、内部回路ブロックに正しいレジスタが定義されていなかったため、後で内部ブロックと連動するロジックが失敗していた。

    たとえば、以前は古典的なレジスタを条件とする内部ブロックを描画しようとすると描画が失敗していたが、この例のように成功するようになった:

    from qiskit import QuantumCircuit
    from qiskit.circuit import QuantumRegister, ClassicalRegister
    
    qreg = QuantumRegister(4)
    creg = ClassicalRegister(1)
    circ = QuantumCircuit(qreg, creg)
    
    with circ.for_loop(range(10)) as a:
        circ.ry(a, 0)
        with circ.if_test((creg, 1)):
            circ.break_loop()
    
    print(circ.draw(cregbundle=False))
    print(circ.data[0][0].blocks[0].draw(cregbundle=False))
  • を使用したオブジェクトのシリアライズに関する qpy_serialization サポートを修正した。 QuantumCircuit オブジェクトのシリアライズをサポートした。 ParameterVector または ParameterVectorElement をパラメータとして使用しているオブジェクトのシリアライズをサポートしました。 以前は、 ParameterVectorElement パラメータは、QPYシリアライズでは単に Parameter として扱われていた。 ParameterVector コンテキストがQPYで失われ parameters の出力順序が正しくない可能性がありました。

    この問題を解決するには、新しいQPYフォーマットのバージョン 3が必要だった。 この新フォーマット・バージョンには、 qpy_serialization ドキュメントの PARAMETER_VECTOR_ELEMENTで説明されている ParameterVectorElement クラスの表現が含まれている。

  • オブジェクトをシリアライズするための qpy_serialization サポートを修正した。 PauliEvolutionGate オブジェクトのシリアライズをサポートした。 以前は PauliEvolutionGate オブジェクトとしてデシリアライズされていました。 Gate オブジェクトとしてデシリアライズされていた。 PauliEvolutionGate. しかし、この場合、元の状態は PauliEvolutionGate. これは、このリリースから回路の PauliEvolutionGate が1:1で保持されるように修正されました。 この唯一の制限は、カスタム EvolutionSynthesis クラスをサポートしていないことです。 から利用可能なクラスのみ qiskit.synthesis から利用可能なクラスのみが PauliEvolutionGate で使用できます。

    この問題を解決するには、新しいQPYフォーマットのバージョン 3が必要だった。 この新しいフォーマットのバージョンには PauliEvolutionGate クラスの表現が含まれている。これは qpy_serialization ドキュメント PAULI_EVOLUTION で説明されている。

  • qiskit.circuit.measure.measure()qiskit.circuit.reset.reset() の2つの緩やかな関数が、非推奨期間なしに誤って削除された。 これらは復活したが、メソッド QuantumCircuit.measure()QuantumCircuit.reset()それぞれ非推奨とされ、将来のリリースで削除される予定です。

その他の注意事項

  • 新しいコントロール・フロー・ビルダー・インターフェイスは、さまざまなコンテキスト・マネージャーとヘルパー・オブジェクトを使って仕事をする。 これらは公開APIの一部とみなされるべきではなく、警告なしに変更されたり削除されたりする可能性がある。 ビルダー・インターフェースの使用は、次のように記述される動作が安定性を保証している。 QuantumCircuit.for_loop(), while_loop()if_test() で記述されたビルダー・インターフェースの振る舞いは標準的な非推奨ポリシーに従うが、これを実現するために使われる実際のオブジェクトはそうではないという意味で、ビルダー・インターフェースの使い方には安定性が保証されている。 オブジェクト( IfContextControlFlowBuilderBlock など)が現在の場所に存在したり、メソッドや属性が付加されていることに依存してはならない。

    これは、 0.19.0 のリリースでは以前は明らかではなかった。 このようなオブジェクトはすべて、ドキュメンテーションの文字列でこのことを明示する警告が出るようになった。 将来的には、その場所やバックの実装がまったく異なるものになる可能性が高い。

エア 0.9.1

変更なし

イグニス 0.7.0

変更なし

IBM Q プロバイダー 0.18.2

バグ修正

  • 回路メタデータに Parameter が渡された場合にジョブがクラッシュし続ける問題を #1065 で修正。
  • シリアライズされる回路が BlueprintCircuit の場合、 qiskit.providers.ibmq.runtime.RuntimeEncoder が余計な decompose() を行ってしまう問題を #1094 で修正。

0.33.0

このリリースにより、QiskitにおけるQiskit Aquaプロジェクトのサポートが正式に終了します。 これは元々 0.25.0 リリースで非推奨とされていたもので、そのリリースで文書化されていたように、 qiskit-aqua パッケージは Qiskit メタパッケージから削除されました。つまり、 pip install qiskit はもはや qiskit-aqua を含まないことになります。 しかし、pythonパッケージングの制限のため、 pip install -U qiskit を使ってQiskitの旧バージョンを本リリース(または将来のリリース)にアップグレードする際、 qiskit-aqua の既存インストールを自動的に削除することはできません。 以前のバージョンからアップグレードする場合は、Qiskit Aquaを pip uninstall qiskit-aqua 、手動でアンインストールするか、新しいpython環境にインストールすることをお勧めします。

qiskit-aqua で提供されていたアプリケーション・モジュールは、いくつかの新しいパッケージに分割された: qiskit-optimization qiskit-natureqiskit-machine-learningqiskit-finance。 これらのパッケージは単独でインストールできる(標準のpip installコマンドで、例えば pip install qiskit-nature ) またはQiskitメタパッケージの残りの部分をオプションのエクストラとして(例えば pip install 'qiskit[finance,optimization]' または pip install 'qiskit[all]' )。 コア・アルゴリズムとオペレーター・フローは現在、Qiskit Terra qiskit.algorithmsqiskit.opflow の一部として存在している。 Aquaの既存の使用方法に応じて、アプリケーションパッケージまたはQiskit Terraの新しいモジュールを使用する必要があります。 Qiskit Aquaからの移行方法の詳細については、 Aqua移行ガイドをご参照ください。

このリリースでは、Qiskit Ignisプロジェクトも正式に非推奨となります。 従って、将来のリリースでは、 qiskit-ignis パッケージは Qiskit メタパッケージから削除されます。つまり、その将来のリリースでは、 pip install qiskitqiskit-ignis を含まなくなります。 Qiskit Ignisは Qiskit Experiments プロジェクトに取って代わられ、活発な開発は終了しました。 非推奨ではあるが、ユーザーがIgnisから移行するのに十分な機会を提供するため、重要なバグ修正と互換性の修正は引き続き行われる。 非推奨期間終了後(このリリースから3ヶ月以内)、プロジェクトは引退し、アーカイブされる。 Qiskit IgnisからQiskit Experimentsへの移行方法については移行ガイドをご参照ください。

Terra 0.19.0

前奏曲

Qiskit Terra 0.19 リリースのハイライトは以下の通り:

  • 抽象的なQiskit/ハードウェアインターフェースの新バージョンである BackendV2新しいデータ構造 Target を追加し、バックエンドがトランスパイラの制約をより適切にモデル化できるようにしました。
  • への拡張可能なプラグインインターフェースです。 UnitarySynthesis トランスパイラパスへの拡張可能なプラグインインターフェースで、ユーザーや他のパッケージがQiskit Terraの合成ルーチンを新しいメソッドで拡張できるようにします。
  • forwhile のループと if/else のステートメントを表す制御フロー命令。 QuantumCircuit. Qiskit Aerのシミュレータは間もなくこれらの新しい命令に対応できるようになり、よりダイナミックな量子プログラムを書くことができるようになる。
  • 進化する OpenQASM 3仕様の予備的サポート。 新しい qiskit.qasm3 モジュールを使って QuantumCircuitを OpenQASM 3 にシリアライズすることができる。

このリリースは、Qiskitにおける Python 3.6 のサポートを終了するものです。 Qiskit Terraのこのリリースと、その後の 0.19.x シリーズのバグフィックスリリースは、 Python 3.6 で動作する最後のリリースとなります。 Qiskit Terraの次のマイナーリリース( 0.20.0 )から、最低限必要な Python のバージョンは 3.7 になります。

いつものように、このリリースには他にも多くの機能と修正がある。

新機能

  • QuantumCircuit.decompose() とそれに対応するトランスパイラー・パス Decompose は、オプションでゲート名のコレクションを含むパラメータを受け付けるようになりました。 このパラメーターが与えられると、一致する名前のゲートだけが分解される。 これはUnixシェル・スタイルのワイルドカード・マッチをサポートする。 例:

    qc.decompose(["h", "r[xz]"])

    は、 hrxrz のゲートを分解するが、(たとえば) x のゲートはそのままにしておく。

  • オプティマイザに termination_checker 引数を追加。 SPSA 引数を追加した。 これにより、ユーザーはカスタム終了基準を実装することができる。

    import numpy as np
    from qiskit.algorithms.optimizers import SPSA
    
    def objective(x):
        return np.linalg.norm(x) + .04*np.random.rand(1)
    
    class TerminationChecker:
    
        def __init__(self, N : int):
            """
            Callback to terminate optimization when the average decrease over
            the last N data points is smaller than the specified tolerance.
            """
            self.N = N
            self.values = []
    
        def __call__(self, nfev, parameters, value, stepsize, accepted) -> bool:
            """
            Returns:
                True if the optimization loop should be terminated.
            """
            self.values.append(value)
    
            if len(self.values) > self.N:
                last_values = self.values[-self.N:]
                pp = np.polyfit(range(self.N), last_values, 1)
                slope = pp[0] / self.N
    
                if slope > 0:
                    return True
            return False
    
    maxiter = 400
    spsa = SPSA(maxiter=maxiter, termination_checker=TerminationChecker(10))
    parameters, value, niter = spsa.optimize(2, objective, initial_point=np.array([0.5, 0.5]))
  • 新バージョンの Backend インターフェイスを追加した、 BackendV2. この新しいバージョンは、前のバージョンから大きく変わりました、 BackendV1 バックエンドのプロパティ(量子ビット数など)に対するユーザのアクセスパターンと、バックエンドがトランスパイラに制約を表現する方法の両方を変更します。 メソッドによる)回路の実行は変わらない。 run() メソッドによる)回路の実行に変更はない。 バックエンド BackendV2 バックエンドは configuration(), properties()を構築する defaults() メソッドがある。 BackendConfiguration, BackendPropertiesPulseDefaults オブジェクトをそれぞれ構築する BackendV1 オブジェクトの属性として直接アクセスできる。 BackendV2 オブジェクトの属性として直接アクセスできる。 例えば、バックエンドの量子ビット数を求めるには、次のようにする。 BackendV1 を持つバックエンドの量子ビット数を得るには

    num_qubits = backend.configuration().n_qubits

    一方 BackendV2 である:

    num_qubits = backend.num_qubits

    抽象クラスで公開される属性の数は、ハードウェアやベンダーに依存しないように設計されています。 BackendV2 クラスで公開される属性の数は、ハードウェアやベンダーにとらわれない必須フィールドやオプションフィールドのセットになるように設計されています。 抽象 BackendV2 で定義されている以外の属性やメソッドのサポートを追加することができます。 BackendV2で定義されている以上の属性やメソッドのサポートを追加することができますが、これらはQiskit全体で普遍的にサポートされるわけではありません。

    プロバイダの作者にとって重要なもう1つの重要な変更点は、特定のバックエンドのプロパティをトランスパイラに公開する方法です。 BackendV2 特定のバックエンドのプロパティをどのようにトランスパイラに公開するかです。 これは BackendV2 これは Target オブジェクトで行われます。 その Target属性によって公開されます。 target 属性によって公開されるこの属性は、特定のバックエンドで回路を実行するための制約のセットを表すために使用されます。 によって以前に公開された情報のサブセットが含まれている。 BackendConfiguration, BackendPropertiesおよび PulseDefaults クラスによって公開されていた情報のサブセットが含まれています。 プロバイダーを BackendV2 を使用するようにプロバイダを移行する場合 (あるいは新しいプロバイダパッケージを作成する場合)、 バックエンドオブジェクトの構築は主にバックエンド用の Target オブジェクトを作成することです。

  • 新しい Target クラスを transpiler モジュールを追加した。 この Target クラスは、バックエンドの制約をコンパイラに表現するために設計されています。 この Target クラスは BackendV2 クラスはバックエンドで使用されることを意図しており、バックエンドが今後トランスパイラのために制約をモデル化する方法です。 これは、ターゲット・デバイスを制御するために使用される、以前は別々であったフィールドを1つのデータ構造にまとめたものである。 transpile() ターゲット・デバイス(例: basis_gatescoupling_mapinstruction_durations など)を制御するために使用されていたフィールドを1つのデータ構造にまとめたもの。 また、ヘテロジニアスゲートセット、マルチ量子ビットゲートの接続性、同じゲートのチューニングバリアントなど、これまで利用可能だった機能に加えて、さらなる機能が追加されている。 現在のところ、トランスパイラーはこのような制約をすべて織り込んでいるわけではないが、時間の経過とともに余分な機能を活用するようになるだろう。

  • この Options クラスでバリデータを指定できるようになりました。 これにより Backend オブジェクトのフィールドにユーザーが入力した値に対する基本的なバリデーションをオプションで指定することができます。 Options オブジェクトの 例えば Options オブジェクトが定義されていたとする:

    from qiskit.providers.Options
    options = Options(shots=1024)

    を使えば、ショットのバリデーターを1から4096の間に設定することができる:

    options.set_validator('shots', (1, 4096))

    バリデータを設定すると update_options() メソッドを呼び出すと、 shots が更新される場合、提案された新しい値が有効な範囲内であることがチェックされます。

  • 新しいトランスパイラー分析パスを追加、 ContainsInstructionを追加した。 qiskit.transpiler.passes モジュールを追加した。 このパスは、回路に特定の命令が含まれているかどうかを判断するために使用される。 初期化時に1つのパラメータを受け取り、チェックする命令名を指定し、回路にその命令が含まれているかどうかをプロパティセットにブール値で設定する。 例:

    from qiskit.transpiler.passes import ContainsInstruction
    from qiskit.circuit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.measure_all()
    
    property_set = {}
    # Contains Hadamard
    contains_h = ContainsInstruction("h")
    contains_h(circuit, property_set)
    assert property_set["contains_h"] == True
    # Not contains SX
    contains_sx = ContainsInstruction("sx")
    contains_sx(circuit, property_set)
    assert property_set["contains_sx"] == False
  • ユーティリティ関数 qiskit.utils.detach_prefix() を追加した。 apply_prefix(). 新しい関数は、与えられた浮動小数点値から、スケーリングされた値と接頭辞のタプルを返します。 例えば、値 1.3e8 は、 (130, "M") に変換され、 130 MHz のようなユーザーフレンドリーなフォーマットで値を表示するために使用することができます。

  • BIPMapping オブジェクトの構築において、 objective オプションに "gate_error""balanced" の値が使用できるようになり、 "balanced" がデフォルトになった。

    "gate_error"BackendProperties インスタンスを渡す必要がある。 backend_prop kwargには、目的の計算に使用される 2q-gate ゲートエラーが含まれている。 "balanced" 目標は、そのインスタンスが与えられていれば、それを使用する。 BackendProperties インスタンスが与えられている場合はそれを使用するが、そうでない場合は、新しいパラメータ default_cx_error_rate で与えられたCXエラーレートを仮定する。 バランスド・オブジェクティブのゲートエラー成分と深さ成分の相対的な重みは、新しいパラメータ( depth_obj_weight )で制御できる。

  • 初期化時に設定された VQE クラスのすべての属性が初期化時に設定され、ゲッターとセッターでアクセスできるようになりました。 さらに、VQE属性 ansatzoptimizer のデフォルト値は、 None を割り当てることでリセットできる:

    vqe = VQE(my_ansatz, my_optimizer)
    vqe.ansatz = None   # reset to default: RealAmplitudes ansatz
    vqe.optimizer = None  # reset to default: SLSQP optimizer
  • 新しいメソッド PauliList.group_qubit_wise_commuting()PauliList を相互に量子ビット整合をとる Pauli 演算子を追加した。 例:

    from qiskit.quantum_info import PauliList, Pauli
    pauli_list = PauliList([Pauli("IY"), Pauli("XX"), Pauli("YY"), Pauli("YX")])
    pauli_list.group_qubit_wise_commuting()
  • 新しいカップリング・マップのコンストラクタ・メソッド CouplingMap.from_hexagonal_lattice() を追加した。 例えば、 2x2 六角形の格子結合写像を構築する:

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

  • を追加した。 OperatorBase.is_hermitian() メソッドを追加した。 NumPyEigensolver そして NumPyMinimumEigensolver オペレータがエルミートである場合、 eigh または eigsh を使って固有値問題を解く。

  • 新しいコンストラクタ・メソッドを追加 PassManagerConfig.from_backend(). これは PassManagerConfig オブジェクトを構築します。 この機能を使えば、プリセット・パスマネージャーを簡単に構築できる。 例:

    from qiskit.transpiler.passmanager_config import PassManagerConfig
    from qiskit.transpiler.preset_passmanagers import level_1_pass_manager
    from qiskit.test.mock import FakeMelbourne
    
    pass_manager = level_1_pass_manager(
      PassManagerConfig.from_backend(FakeMelbourne(), seed_transpiler=42)
    )
  • 新しいトランスパイラー・パスが追加されました、 PulseGatesこれは、命令スケジュール・マップからユーザが提供したキャリブレーションを自動的に抽出し、ゲート・スケジュールをパルス・ゲートとして指定された(トランスパイルされた)量子回路にアタッチします。

    トランス PulseGates トランスパイラー・パスは、0から3までのすべての最適化レベルに適用される。 エンドユーザーが明示的に backend.defaults().instruction_schedule_map を上書きしない限り、ゲートの実装は更新されない。 このパスにより、ユーザーは、ハードウェア上で実行されるすべての回路を QuantumCircuit.add_calibration() を個別に呼び出す手間を省くことができる。

    この新しいパスを補足するために、スケジュールが InstructionScheduleMap に追加され、メタデータ・フィールド "publisher" で暗黙的に更新される。 バックエンドで較正されたゲート・スケジュールは、既に知られているスケジュールの較正で回路を上書きすることを避けるために、特別なパブリッシャーの種類を持っている。 通常、このメタデータは自動的に適用されるため、エンドユーザーが管理する必要はない。 地図にカスタムゲート校正があるかどうかは InstructionScheduleMap.has_custom_gate() を呼び出して、マップにカスタムゲート・キャリブレーションがあるかどうかを確認できます。

    実行中のすべての回路にカスタム・ゲート実装を適用する方法については、以下のコード例を参照してください。

    from qiskit.test.mock import FakeGuadalupe
    from qiskit import pulse, circuit, transpile
    
    backend = FakeGuadalupe()
    
    with pulse.build(backend, name="x") as x_q0:
        pulse.play(pulse.Constant(160, 0.1), pulse.drive_channel(0))
    
    backend.defaults().instruction_schedule_map.add("x", (0,), x_q0)
    
    circs = []
    for _ in range(100):
        circ = circuit.QuantumCircuit(1)
        circ.sx(0)
        circ.rz(1.57, 0)
        circ.x(0)
        circ.measure_active()
        circs.append(circ)
    
    circs = transpile(circs, backend)
    circs[0].calibrations  # This returns calibration only for x gate

    命令スケジュール・マップは変更可能なオブジェクトであることに注意。 エントリーの1つをオーバーライドし、そのバックエンドを他の実験に使用すると、誤ってゲートの定義を更新してしまう可能性がある。

    backend = FakeGuadalupe()
    
    instmap = backend.defaults().instruction_schedule_map
    instmap.add("x", (0, ), my_x_gate_schedule)
    
    qc = QuantumCircuit(1, 1)
    qc.x(0)
    qc.measure(0, 0)
    
    qc = transpile(qc, backend)  # This backend uses custom X gate

    特定の実験のゲート定義を更新したい場合は、まず命令スケジュール・マップをディープコピーし、トランスパイラに直接渡す必要がある。

  • BIPMapping のコンストラクタに新しいオプション qubit_subset を導入。 このオプションにより、マッピング時に使用する物理量子ビットを1行で指定することができる(デバイスの coupling_map ):

    mapped_circ = BIPMapping(
        coupling_map=CouplingMap([[0, 1], [1, 2], [1, 3], [3, 4]]),
        qubit_subset=[1, 3, 4]
    )(circ)

    以前は、同じことをするためには、使用する量子ビットだけを含む縮小版 coupling_map を提供し、結果の回路を元の coupling_map に埋め込み、それに応じて QuantumCircuit._layout を更新しなければならなかった:

    reduced_coupling = coupling_map.reduce(qubit_to_use)
    mapped = BIPMapping(reduced_coupling)(circ)
    # skip the definition of fill_with_ancilla()
    # recover circuit on original coupling map
    layout = Layout({q: qubit_to_use[i] for i, q in enumerate(mapped.qubits)})
    for reg in mapped.qregs:
        layout.add_register(reg)
    property_set = {"layout": fill_with_ancilla(layout)}
    recovered = ApplyLayout()(mapped, property_set)
    # recover layout
    overall_layout = Layout({v: qubit_to_use[q] for v, q in mapped._layout.get_virtual_bits().items()})
    for reg in mapped.qregs:
        overall_layout.add_register(reg)
    recovered._layout = fill_with_ancilla(overall_layout)
  • のコンストラクタに ignore_pauli_phasecopy の引数を追加。 SparsePauliOp. ignore_pauli_phasephase 属性が読み込まれないようにする。 PauliList が読み込まれるのを防ぐ。 PauliList がZXの内部規約ですべてのフェーズがゼロであることがすでに知られている場合は、よりパフォーマンスが高くなります。 copy により、 copy=False を明示的に設定した場合、入力データのコピーを避けることができる。

  • 以下のパフォーマンスが向上した。 SparsePauliOp オペレーション

  • を追加した。 SparsePauliOp.sum() メソッドを追加した。 SparsePauliOps. この方法は、ループの中でインスタンスを足し合わせるよりも、かなりパフォーマンスが良い。 例えば SparsePauliOpを足していく:

    from qiskit.quantum_info import SparsePauliOp, random_pauli_list
    sparse_ops = [SparsePauliOp(random_pauli_list(10, 10)) for _ in [None]*1000]
    
    total = sparse_ops[0]
    for op in sparse_ops[1:]:
        total += op

    これで、はるかに効率的に(スピードもタイピングも!)できるようになった として:

    SparsePauliOp.sum(sparse_ops)
  • の基本クラスである ParametricPulse のコンストラクタに引数 limit_amplitude を追加した。 Gaussian, GaussianSquare, Drag および Constantの基本クラスであるコンストラクタに引数 を追加し、パルス単位で振幅制限1を無効にできるようにした。 limit_amplitude=False では、個々のパルスは、"1 "を上げることなく "1 "を超える振幅を持つことができる。 PulseError. 詳細は #6544を参照。

  • 使用 QuantumCircuit.draw() または circuit_drawer()latex を使うと、例えばファイル名の拡張子から推測される画像形式のファイルが生成される:

    import qiskit
    
    circuit = qiskit.QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.draw('latex', filename='./file.jpg')

    これで回路図がJPEG形式で保存される。 以前は、画像は常にPNG形式でした。 詳細は #6448を参照。

    これで、例えばサポートされていないファイル名の拡張子に遭遇した場合:

    circuit.draw('latex', filename='./file.spooky')

    これは、ファイル名の拡張子をサポートされている画像フォーマットに変更するために ValueError

  • パラメータ filenameplot_gate_map()plot_coupling_map()にパラメータを追加した。

  • 近似量子コンパイラとそれに対応するユニタリー合成プラグイン実装を導入。 メインのAQCクラスは AQC で、ユニタリー行列を近似回路にコンパイルするスタンドアロン版です。 このプラグインは transpile()unitary_synthesis_method 'aqc'によって呼び出される。 参照 qiskit.transpiler.synthesis.aqc を参照のこと。

  • filter_function 引数を追加。 QuantumCircuit.depth()QuantumCircuit.size() の引数を追加した。

    例えば、2量子ビットのゲートの数を求めるにはこうする:

    circuit.size(lambda x: x[0].num_qubits == 2)

    あるいは、0番目の量子ビットに作用するT個のゲートの深さを求める:

    circuit.depth(lambda x: x[0].name == 't' and circuit.qubits[0] in x[1])
  • 新しいトランスパイラー・パスを追加、 CollectMultiQBlocksを追加した。 qiskit.transpiler.passes モジュールを追加した。 このパスは、量子ビットのグループに作用する中断のないゲートシーケンスを収集するために使用される。 既存の Collect2qBlocks しかし、そのパスが2量子ビットのブロックを見つけるために設計され、最適化されているのに対し、この新しいパスはどんなサイズのブロックでも見つけることができる。

  • の新しいコントロール・フロー操作のためのビルダー・インターフェースがある。 QuantumCircuit新しい ForLoopOp, IfElseOpそして WhileLoopOp. このインターフェイスは、同じ回路メソッド、 *すなわち *QuantumCircuit.for_loop(), QuantumCircuit.if_test()QuantumCircuit.while_loop()これらはオーバーロードされ、 body パラメータが与えられない場合、コンテキスト・マネージャを返します。 これらのコンテキスト・マネージャーのいずれかに入ると、スコープが回路にプッシュされ、すべてのゲート・コール(および他のスコープ)と、これらが使用するリソースをキャプチャし、最後に関連するオペレーションを構築する。 例えば、こんなことができるようになった:

    qc = QuantumCircuit(2, 2)
    with qc.for_loop(range(5)) as i:
        qc.rx(i * math.pi / 4, 0)

    これにより ForLoopOp を生成する。 qc。これは、qubit 0がループ本体内で使用される唯一のリソースであることを知っている。 これらのコンテキスト・マネージャーは入れ子にすることができ、その幅を正しく決定する。 を使用することができます。 QuantumCircuit.break_loop()QuantumCircuit.continue_loop() を使用すると、それがさらなる QuantumCircuit.if_test() ブロックに入れ子になっていても、ループの幅に合わせて正しく展開されます。

    コンテキスト・マネージャーは if_test() コンテキスト・マネージャは連鎖したマネージャを提供し、必要であれば、 else のようなブロックを作るのに使うことができる:

    qreg = QuantumRegister(2)
    creg = ClassicalRegister(2)
    qc = QuantumCircuit(qreg, creg)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure(0, 0)
    with qc.if_test((creg, 0)) as else_:
        qc.x(1)
    with else_:
        qc.z(1)

    マネージャーは、 ifelse のボディが、同じリソースのセット上で定義されていることを保証する。

  • 新しいトランスパイラー・パスを導入 InverseCancellation を一般化した CXCancellation を一般化する新しいトランスパイラー・パスを導入した。 初期化して InverseCancellation を初期化し、キャンセルするゲートを渡すなどして使用できる:

    from qiskit.transpiler.passes import InverseCancellation
    from qiskit import QuantumCircuit
    from qiskit.circuit.library import HGate
    from qiskit.transpiler import PassManager
    
    qc = QuantumCircuit(2, 2)
    qc.h(0)
    qc.h(0)
    pass_ = InverseCancellation([HGate()])
    pm = PassManager(pass_)
    new_circ = pm.run(qc)
  • のコンストラクタには RZXCalibrationBuilder には2つの新しいkwargs instruction_schedule_mapqubit_channel_mapping があります。 InstructionScheduleMap をそれぞれ取ります。 これらの新しい引数は、バックエンドターゲットから必要な情報を直接指定するために使われる。 これらは、 BaseBackend または BackendV1 オブジェクトを backend 引数で直接渡す代わりに使用する。

  • 量子ビットだけで構成される状態の Statevector量子ビットだけで構成される状態のsは、 LaTeX、ケット記法で描くことができる。 ケット記法では、状態ベクトルのエントリーは、分数や2の平方根のような正確な因数が描かれるように処理される。 特定の規約は、 convention キーワード引数に、 "ket" または "vector" のいずれかを適切に渡すことで選択できる:

    import math
    from qiskit.quantum_info import Statevector
    
    sv = Statevector([math.sqrt(0.5), 0, 0, -math.sqrt(0.5)])
    sv.draw("latex", convention="ket")
    sv.draw("latex", convention="vector")
  • 新しいトランスパイラー EchoRZXWeylDecomposition カルタンの分解を利用して、任意の2量子ビットゲートをエコーRZXゲートで分解できるようにした。 他のトランスパイラー・パスと組み合わせることで、任意の回路を、同じユニタリーを実装するRZXゲートをベースとしたパルス効率の高い回路にトランスパイルすることができる。

  • その SPSAQNSPSA オプティマイザ・クラスは、反復と初期キャリブレーションの両方で、できるだけ多くの回路評価をバッチ処理できるようになりました。 のコンストラクタに max_evals_grouped kwarg を設定することで、これを活用できる。 VQE のコンストラクタに SPSA または QNSPSA のどちらかを optimizer のパラメータとして使用する場合に、コンストラクタにkwargを設定することで活用できる。 例:

    from qiskit.circuit.library import TwoLocal
    from qiskit.algorithms import VQE
    from qiskit.algorithms.optimizers import QNSPSA
    from qiskit.test.mock import FakeMontreal
    
    backend = FakeMontreal()
    ansatz = TwoLocal(2, rotation_blocks=["ry", "rz"], entanglement_blocks="cz")
    qnspsa = QNSPSA(fidelity, maxiter=5)
    vqe = VQE(
        ansatz=ansatz,
        optimizer=qnspsa,
        max_evals_grouped=100,
        quantum_instance=backend,
    )
  • このリリースでは、ユーザー定義のRZXゲートの集合を対象とした、2量子ビット・ゲートの分解手法を紹介します。 トランスパイラのユーザーは、 basis_gates のリストに 'rzx' を含めることで、 {RZX(pi/2), RZX(pi/4), and RZX(pi/6)} の分解を有効にすることができます。 transpile(). 量子情報パッケージのユーザーは、メソッド自体を XXDecomposer クラスで見つけることができる。

  • トランスパイラ・パスを追加 Optimize1qGatesSimpleCommutationこれは、再合成の機会を発見するために、単一量子ビットゲートを転置する戦略に従って回路を最適化する。

  • max_job_tries パラメータを追加した。 QuantumInstanceパラメータを追加しました。 以前は、ジョブがキャンセルされたりバックエンドでエラーが発生したりしても、送信と結果の取得が無限に試行されていました。 デフォルトは50になり、 max_job_tries=-1 を設定することで、以前の動作を実現できる。 6872と #6821を修正。

  • latex 出力メソッド circuit_drawer() 関数と QuantumCircuit.draw() メソッドは1ビット条件のゲートを含む回路を描けるようになった。 これは、ゲートの古典的条件付けを単一の古典的ビットでサポートするという新機能と、ラテックス引き出しの互換性のために追加された。

  • "mpl" 出力メソッド circuit_drawer() 関数と QuantumCircuit.draw() メソッドは1ビット条件のゲートを含む回路を描けるようになった。 これは、 "mpl" の引き出しと、単一古典ビットに対するゲートの古典的条件付けをサポートする新機能との互換性のために追加された。

  • text 出力メソッド circuit_drawer() 関数と QuantumCircuit.draw() メソッドは1ビット条件のゲートを含む回路を描けるようになった。 これは、ゲートの古典的条件付けを単一の古典的ビットでサポートするという新機能と、テキスト引き出しの互換性のために追加された。

  • 新しい分析トランスパイラ・パスが追加されました、 GatesInBasisに追加された。 qiskit.transpiler.passes. このパスは DAGCircuit をチェックする。 のすべてのゲートが設定された基本セットに入っていれば、プロパティセットの属性 "all_gates_in_basis"True に設定し、入っていなければ に設定する。 DAGCircuit のすべてのゲートが設定された基本セットにあれば False 、なければ。 例:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import GatesInBasis
    
    # Instatiate Pass
    basis_gates = ["cx", "h"]
    basis_check_pass = GatesInBasis(basis_gates)
    # Build circuit
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.measure_all()
    # Run pass on circuit
    property_set = {}
    basis_check_pass(circuit, property_set=property_set)
    assert property_set["all_gates_in_basis"]
  • 新しいコンストラクタ・メソッドを2つ追加した、 from_heavy_hex()from_heavy_square()そして CouplingMap クラスに追加した。 これらのコンストラクタ・メソッドは CouplingMap これらのコンストラクタ・メソッドは、 Chamberland et al、 2020.

    例:

    from qiskit.transpiler import CouplingMap
    
    cmap = CouplingMap.from_heavy_hex(5)
    cmap.draw()
    from qiskit.transpiler import CouplingMap
    
    cmap = CouplingMap.from_heavy_square(5)
    cmap.draw()
  • HHL アルゴリズムは、行列が負の固有値を持つ場合に解を見つけることができるようになった。 これを可能にするために、アルゴリズムに値の符号を表す追加の量子ビットが追加され、ヘルパーアルゴリズムはこの新しい情報を処理するように更新された。 ExactReciprocal はこの新しい情報を処理するように更新された。 詳細は #6971を参照。

  • 新しいクラスを2つ追加、 CompleteMeasFitterTensoredMeasFitterqiskit.utils.mitigation モジュールに これらのクラスは、 measurement_error_mitigation_cls の kwarg の値としてのみ使用されます。 QuantumInstance クラスの これらのクラス(あるいは qiskit.utils.mitigation)のインスタンス化と使用は、 measurement_error_mitigation_cls kwargの外部では、内部プライベートAPIとして扱われるべきであり、依存してはならない。

  • その ListOp クラスは qiskit.opflow には coeffs 属性が追加され、演算子リストの係数のリストを返すようになりました。ListOp.coeff)が乗法的にリストに分配されます。 注意 ListOp オブジェクトが入れ子になっている( oplistListOp オブジェクトの中に含まれる)場合があることに注意してください。このような場合、coeffsメソッドが呼ばれると例外が発生します。 この ListOp.coeffscoeffs メソッドは、ネスティングされていない PauliSumOp クラスの

  • この Statevector クラスが添え字で指定できるようになりました。 の n 番目の係数を取り出すことができる。 Statevector のn番目の係数を statevec[n] として取り出すことができる。

  • を追加した。 Statevector.inner インスタンスの内積を計算する Statevector インスタンスの内積を計算するメソッドを追加した。 例:

    statevec_inner_other = statevec.inner(other)

    statevecother の内積を返す。 statevecStatevectorでなければならないが、 otherStatevector例えばNumpy配列のような。

  • 新しいパラメータ、 add_bitsQuantumCircuit.measure_all(). デフォルトでは、 True に設定されている。 ClassicalRegister を追加するという以前の動作を維持するためです。 False に設定すると、測定値はすでに存在するクラシック・ビットに保存される。 例えば、既存の古典的なビットで回路を作ったとする:

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    
    qr = QuantumRegister(2)
    cr = ClassicalRegister(2, "meas")
    circuit = QuantumCircuit(qr, cr)

    circuit.measure_all(add_bits=False) を呼び出すと、回路に追加された Measurement オブジェクトの出力先として、既存のクラシック・レジスタ cr が使用される。

  • ParameterExpression は、潜在的に未束縛のパラメータがある場合でも、数値変換を基礎となるシンボリック・ライブラリに委ねるようになった。 これにより、次のような式の変換が可能になる:

    >>> from qiskit.circuit import Parameter
    >>> x = Parameter('x')
    >>> float(x - x + 2.3)
    2.3

    ここで、基礎となる式は固定値を持つが、パラメータ x はまだ束縛されていない。

  • すべてのオプティマイザに Optimizer.minimize() メソッドを追加した: Optimizer および派生クラスにメソッドを追加した。 このメソッドは、 SciPy’s minimize() 関数のシグネチャを模倣しており、次のように返す。 OptimizerResult.

    例 :

    import numpy as np
    from qiskit.algorithms.optimizers import COBYLA
    
    def loss(x):
        return -(x[0] - 1) ** 2 - (x[1] + 1) ** 3
    
    initial_point = np.array([0, 0])
    optimizer = COBYLA()
    result = optimizer.minimize(loss, initial_point)
    
    optimal_parameters = result.x
    minimum_value = result.fun
    num_function_evals = result.nfev
  • 回路ライブラリに PauliEvolutionGate を回路ライブラリ(qiskit.circuit.library)の時間発展を行うゲートを定義する Paulis. このゲートの合成は EvolutionSynthesis で実行され、ゲート自体から切り離される。 現在利用可能な合成法は以下の通りである:

    例:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.quantum_info import SparsePauliOp
    from qiskit.synthesis import SuzukiTrotter
    
    operator = SparsePauliOp.from_list([
        ("XIZ", 0.5), ("ZZX", 0.5), ("IYY", -1)
    ])
    time = 0.12  # evolution time
    synth = SuzukiTrotter(order=4, reps=2)
    
    evo = PauliEvolutionGate(operator, time=time, synthesis=synth)
    
    circuit = QuantumCircuit(3)
    circuit.append(evo, range(3))
  • 新しい関数 plot_coupling_map() が導入され、既存の関数 plot_gate_map()の機能を拡張した新しい関数が導入されました: num_qubit backend の代わりに) qubit_coordinatescoupling_map の3つのパラメータを受け取り、任意の量子ビット結合マップをプロットすることができます。

  • Qiskit Terraがシリアライズを初期サポートしました。 QuantumCircuitOpenQASM 3

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    from qiskit import qasm3
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    
    print(qasm3.dumps(qc))

    この初期リリースでは、名前付きレジスタ、基本的な組み込み命令(メジャー、バリア、リセットなど)、ユーザー定義ゲート、ユーザー定義命令(サブルーチンとして)、および本リリースで導入された新しい制御フロー構造体のサポートが制限されています:

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    from qiskit import qasm3
    import math
    
    composite_circ_qreg = QuantumRegister(2)
    composite_circ = QuantumCircuit(composite_circ_qreg, name="composite_circ")
    composite_circ.h(0)
    composite_circ.x(1)
    composite_circ.cx(0, 1)
    composite_circ_gate = composite_circ.to_gate()
    
    qr = QuantumRegister(2, "qr")
    cr = ClassicalRegister(2, "cr")
    qc = QuantumCircuit(qr, cr)
    with qc.for_loop(range(4)) as i:
        qc.rx(i * math.pi / 4, 0)
        qc.cx(0, 1)
    qc.barrier()
    qc.append(composite_circ_gate, [0, 1])
    qc.measure([0, 1], [0, 1])
    
    print(qasm3.dumps(qc))
  • この QDrift の合成メソッドとして定式化された。 PauliEvolutionGateから派生した TrotterizationBase.

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.synthesis import QDrift
    from qiskit.opflow import X, Y, Z
    
    qdrift = QDrift(reps=2)
    operator = (X ^ 3) + (Y ^ 3) + (Z ^ 3)
    time = 2.345  # evolution time
    
    evolution_gate = PauliEvolutionGate(operator, time, synthesis=qdrift)
    
    circuit = QuantumCircuit(3)
    circuit.append(evolution_gate, range(3))
  • QPYシリアライゼーションは、以下の属性を表現できるようになりました。 global_phase を表現できるようになりました。 QuantumCircuitint オブジェクトの属性を表現できるようになりました、 Parameter オブジェクト、または ParameterExpression オブジェクトの属性を表現できるようになりました。 以前のバージョンのQPYは global_phasefloat であった。

    このため、追加されたタイプを表現するために、このリリースで導入されたQPYフォーマット Version 2が必要となる。

  • 新しい find_bit() メソッドが追加された。 QuantumCircuit クラスに新しいメソッドが追加された。 Bit のインデックスとレジスタをルックアップできるようになりました。 このメソッドは、 Bit のインデックスを含む2つの要素 namedtuple を返します。 qubits (または Qubitまたは clbits (または Clbit)のインデックスと、1) length-2 を含む各回路 RegisterBit Bit を含む Register タプルのリスト。

    例:

    from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit
    
    reg1 = QuantumRegister(3, 'foo')
    qubit = Qubit()
    reg2 = QuantumRegister(2, 'bar')
    
    qc = QuantumCircuit(reg1, [qubit], reg2)
    
    print(qc.find_bit(reg1[2]))
    print(qc.find_bit(qubit))

    を生み出すだろう:

    BitLocations(index=2, registers=[(QuantumRegister(3, 'foo'), 2)])
    BitLocations(index=3, registers=[])
  • つの新しい Instruction 動的回路の制御フロー操作をサポートするために、3つの新しいサブクラスが追加された: WhileLoopOp, ForLoopOpおよび IfElseOp. さらに、2つのサブクラスがある、 BreakLoopOpContinueLoopOpの2つのサブクラスが追加され、それぞれループ・コンテキストの中断と次の反復をサポートするようになった。

    これらは Instructionとして作成したり、既存の QuantumCircuit インスタンスに追加することもできる、 QuantumCircuit.while_loop(), for_loop(), if_test(), if_else(), break_loop()そして continue_loop().

  • 追加された BaseReadoutMitigator 古典的な測定誤差軽減器を実装するための抽象基底クラスを追加。 これらのオブジェクトは、測定エラーのあるバックエンドでの回路実行から返されるオブジェクトの測定エラーを軽減するためのものである。 Counts これらのオブジェクトは、バックエンドでの回路の実行から返されるオブジェクトの測定エラーを軽減するためのものです。

    読み出しミティゲーター・クラスには、主に2つのメソッドがある:

    現在 qiskit.algorithms モジュールと QuantumInstance クラスでは、Qiskit Ignis から移行したレガシーミティゲータがまだ使われています。 qiskit.utils.mitigation. 将来のリリースでは、新しいミティゲータクラスを使用するようにモジュールをアップグレードし、レガシーミティゲーションコードを非推奨にする予定です。

  • を追加した。 LocalReadoutMitigator クラスが追加されました。 局所的な測定誤差とは、1量子ビットの測定誤差のテンソル積によって記述される誤差のことである。

    このクラスは、 NN 単一量子ビットの測定エラー割り当て行列のリストで初期化することも、バックエンドのプロパティにある読み出しエラー情報を使用してバックエンドから初期化することもできます。

    これは、 NN -qubitのミティゲーションに対して O(2N)O(2^N) の複雑さを持つ。 QuasiDistribution と期待値。

  • を追加した。 CorrelatedReadoutMitigator クラスが追加され、相関する測定誤差の測定読み出し誤差軽減を実行できるようになりました。 このクラスは、エラー確率を記述する 2N×2N2^N \times 2^N 測定エラー割り当て行列で初期化することができます。 緩和は、 O(4N)O(4^N) の緩和複雑度を持つ割り当て行列の逆行列を介して実装される。 QuasiDistribution と期待値を持つ。

  • のコンストラクタに QuasiDistribution.stddev_upper_bound クラスのコンストラクタに属性とkwargを追加した。 QuasiDistribution クラスのコンストラクタに属性とkwargを追加した。 これは BaseReadoutMitigator クラスで使用される。

  • メソッドを追加した。 shots() メソッドを追加した。 qiskit.result.Counts メソッドを追加した。

  • を実行する場合 Grover アルゴリズムクラスを実行する場合、最適な電力が既知であり、単一の回路のみが実行される場合、コールバック関数を設定する必要はなくなり、Grover探索は最も可能性の高いビット列を返します。 AmplificationProblem.is_good_state コールバック関数を設定する必要はなくなり、Grover探索は最も可能性の高いビット列を返します。 一般に、グローバー演算子の最適なべき乗が不明な場合、アルゴリズムは異なるべき乗(すなわち反復)をチェックし、それを適用する。 Grover アルゴリズムが異なるべき乗(すなわち反復)をチェックし、良いビット列が測定されたかどうかをチェックするために is_good_state 関数を適用する。 例えば、次のようなことができるようになった:

    from qiskit.algorithms import Grover, AmplificationProblem
    from qiskit.providers.aer import AerSimulator
    from qiskit.quantum_info import Statevector
    
    # Fixed Grover power: 2.
    grover = Grover(iterations=2, quantum_instance=AerSimulator())
    
    # The ``is_good_state`` argument not required here since Grover search
    # will be run only once, with a power of 2.
    problem = AmplificationProblem(Statevector.from_label("111"))
    
    # Run Grover search and print the best measurement
    result = grover.amplify(problem)
    print(result.top_measurement)  # should print 111
  • メソッド remove_cregs() メソッドを追加した。 DAGCircuit メソッドを追加。

  • メソッド remove_clbits() メソッドを追加した。 DAGCircuit メソッドを追加した。 削除されたビットを参照するクラシック・レジスタもすべて削除される。

  • 新しいメソッドを追加、 replace_block_with_op()メソッドを DAGCircuit クラスを追加しました。 この方法は、DAG内のノードのブロックを1つの操作で置き換えるために使用される。 典型的な例は ConsolidateBlocks パスで、ノードのブロックを同等の UnitaryGate ノードに置き換える。

  • 新しい分析トランスパイラー・パスを追加、 Collect1qRunsqiskit.transpiler.passes モジュールを追加した。 このパスは、1つの量子ビットに作用する中断のないゲートシーケンスを見つけるために使われる。 と似ている。 Collect2qBlocksCollectMultiQBlocks に似ているが、複数量子ビットブロックではなく単一量子ビット実行用に最適化されている。

  • 様々なトランスパイル・インターナルが、内部回路表現を操作する際に、 retworkx 0.10 の新機能を使用するようになりました。 への呼び出しが高速化されることがよくある。 transpile 最適化レベルが高いほど、その効果は大きくなる。 詳細は #6302を参照。

  • を使用します。 UnitarySynthesis のトランスパイラ・パスは qiskit.transpiler.passes はコンストラクタに新しいkwarg、 min_qubits を持つ。 この値を指定すると、 int 、ユニタリー合成を実行する最小サイズの UnitaryGate 。 の UnitaryGateQuantumCircuit の、使用する量子ビットが少なければ、そのパスのインスタンスによってスキップされる。

  • EigensolverMinimumEigensolver インターフェースは、それぞれの compute_eigenvalues()compute_minimum_eigenvalue() メソッドの aux_operators パラメータの型 Dict[str, Optional[OperatorBase]] をサポートするようになった。 この場合、補助固有値も、 aux_operators 辞書が提供する同じキーの下に辞書に格納される。 主演算子と通約しない演算子に対応するキーは削除される。

  • その BasisTranslator, GateDirectionおよび CheckGateDirection トランスパイラ・パスは、コンストラクタに新しい target kwargを持っています。 Target オブジェクトをパスのターゲットとして設定するために使うことができます。 これが設定されていれば、 target_basis (パスの場合)または (パスの場合)の代わりに使用される。 BasisTranslator または coupling_map (パス GateDirectionCheckGateDirection パスの場合)引数の代わりに使用されます。

  • で2つのトランスパイラ・ステージを許可する。 QuantumInstance1つはパラメータ化された回路用で、もう1つは束縛された回路(つまり自由パラメータを持たない)用である。 に、非拘束回路と拘束回路のパスを持つ量子インスタンスが渡された場合、サンプラーは、パラメータ化された回路に非拘束パスを一度だけ適用し、キャッシュします。 CircuitSamplerに渡された場合、サンプラーはパラメータ化された回路に一度だけ非拘束パスを適用し、それをキャッシュします。

    これにより VQE のような変分アルゴリズムでは、パラメータ化された回路に対してカスタム・パス・マネージャを一度実行し、さらに、各反復においてバウンドされた回路に対して異なるカスタム・パス・マネージャでトランスパイラを再度実行することができます。 すべてのパスがパラメータ化された回路をサポートしているわけではないので、異なるパス・マネージャーを実行できることは重要である(例えば Optimize1qGatesDecomposition はバインドされた回路パラメータでしか動作しません)。

    例えば、この機能により、VQEでパルス効率の良いCX分解を使用することができる

    from qiskit.algorithms import VQE
    from qiskit.opflow import Z
    from qiskit.circuit.library.standard_gates.equivalence_library import StandardEquivalenceLibrary as std_eqlib
    from qiskit.transpiler import PassManager, PassManagerConfig, CouplingMap
    from qiskit.transpiler.preset_passmanagers import level_1_pass_manager
    from qiskit.transpiler.passes import (
        Collect2qBlocks, ConsolidateBlocks, Optimize1qGatesDecomposition,
        RZXCalibrationBuilderNoEcho, UnrollCustomDefinitions, BasisTranslator
    )
    from qiskit.transpiler.passes.optimization.echo_rzx_weyl_decomposition import EchoRZXWeylDecomposition
    from qiskit.test.mock import FakeBelem
    from qiskit.utils import QuantumInstance
    
    # Replace by a real backend! If not ensure qiskit-aer is installed to simulate the backend
    backend = FakeBelem()
    
    # Build the pass manager for the parameterized circuit
    rzx_basis = ['rzx', 'rz', 'x', 'sx']
    coupling_map = CouplingMap(backend.configuration().coupling_map)
    config = PassManagerConfig(basis_gates=rzx_basis, coupling_map=coupling_map)
    pre = level_1_pass_manager(config)
    
    # Build a pass manager for the CX decomposition (works only on bound circuits)
    post = PassManager([
        # Consolidate consecutive two-qubit operations.
        Collect2qBlocks(),
        ConsolidateBlocks(basis_gates=['rz', 'sx', 'x', 'rxx']),
    
        # Rewrite circuit in terms of Weyl-decomposed echoed RZX gates.
        EchoRZXWeylDecomposition(backend),
    
        # Attach scaled CR pulse schedules to the RZX gates.
        RZXCalibrationBuilderNoEcho(backend),
    
        # Simplify single-qubit gates.
        UnrollCustomDefinitions(std_eqlib, rzx_basis),
        BasisTranslator(std_eqlib, rzx_basis),
        Optimize1qGatesDecomposition(rzx_basis),
    ])
    
    quantum_instance = QuantumInstance(backend, pass_manager=pre, bound_pass_manager=post)
    
    vqe = VQE(quantum_instance=quantum_instance)
    result = vqe.compute_minimum_eigenvalue(Z ^ Z)
  • 新しいユニタリー・シンセシス・プラグイン・インターフェースを導入。 UnitarySynthesis トランスパイラ・パスにシームレスに を呼び出すときに使用するプラグインを選択できる。 transpile()unitary_synthesis_method kwargをプラグイン名に設定することで、ユーザーは呼び出し時に使用するプラグインを選択できる。 インストールされているプラグインの完全なリストは qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names() 関数を使用して見つけることができます。 例えば、 special_synth という名前の合成プラグインを含むパッケージをインストールした場合、それを使うことができる:

    from qiskit import transpile
    
    transpile(qc, unitary_synthesis_method='special_synth', optimization_level=3)

    これは UnitarySynthesis を、 special_synth プラグインをエクスポートする外部パッケージに含まれるメソッドに置き換えます。

    プラグインインターフェースは、Qiskitの外部パッケージが合成プラグインを含むことを宣伝できるようにするsetuptools エントリーポイントを中心に構築されています。 新しいプラグインの書き方については qiskit.transpiler.passes.synthesis.plugin モジュールのドキュメントを参照してください。

  • 新しいトランスパイラー・パスを追加、 VF2Layout. このパスでは、レイアウト割り当て問題を部分グラフ同型問題としてモデル化し、完璧なレイアウト(追加のルーティングを必要としないレイアウト)が存在する場合に、それを見つけるために rustworkxの VF2 アルゴリズム実装を使用します。 この新しいパスが提供する機能は、既存のパスに非常によく似ています。 CSPLayout しかし VF2Layout は大幅に高速化されている。

既知の問題

  • "latex" の引き出しの "ket" の規約は、純粋に量子ビットからなる状態のみ有効である。 Statevector.draw() の規約は、純粋に量子ビットからなる状態に対してのみ有効です。 もし2つ以上の次元の空白がある状態を使う場合は、 convention="vector" を渡すか、別の引き出しを使うべきである。

  • OpenQASM 3のエクスポート機能はベータ版であり、Qiskit Terraのいくつかの機能はまだサポートされていません。 QuantumCircuit はまだサポートされていません。 特に、古典的なパラメータを持つカスタムサブルーチンをエクスポートしようとするとエラーが表示されることがあります。 OpenPulse.

  • を単独で実行する場合 BasisTranslator を単独で実行する場合、 target 引数を Target オブジェクトに設定され、いくつかの単一量子ビットゲートが量子ビットの非重複セットにのみ適用できる状態で実行された場合、出力回路が誤って Target. 例えば、あなたが走ったとする:

    from qiskit.circuit import QuantumCircuit, Parameter
    from qiskit.circuit.library import UGate, RZGate, XGate, SXGate, CXGate
    from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
    
    from qiskit.transpiler import PassManager, Target, InstructionProperties
    from qiskit.transpiler.passes import BasisTranslator
    
    gmap = Target()
    
    # U gate in qubit 0.
    theta = Parameter('theta')
    phi = Parameter('phi')
    lam = Parameter('lambda')
    u_props = {
        (0,): InstructionProperties(duration=5.23e-8, error=0.00038115),
    }
    gmap.add_instruction(UGate(theta, phi, lam), u_props)
    
    # Rz gate in qubit 1.
    phi = Parameter("phi")
    rz_props = {
        (1,): InstructionProperties(duration=0.0, error=0),
    }
    gmap.add_instruction(RZGate(phi), rz_props)
    
    # X gate in qubit 1.
    x_props = {
        (1,): InstructionProperties(
            duration=3.5555555555555554e-08, error=0.00020056469709026198
        ),
    }
    gmap.add_instruction(XGate(), x_props)
    
    # SX gate in qubit 1.
    sx_props = {
        (1,): InstructionProperties(
            duration=3.5555555555555554e-08, error=0.00020056469709026198
        ),
    }
    gmap.add_instruction(SXGate(), sx_props)
    
    cx_props = {
        (0, 1): InstructionProperties(duration=5.23e-7, error=0.00098115),
        (1, 0): InstructionProperties(duration=4.52e-7, error=0.00132115),
    }
    gmap.add_instruction(CXGate(), cx_props)
    
    bt_pass = BasisTranslator(sel, target_basis=None, target=gmap)
    
    qc = QuantumCircuit(2)
    qc.iswap(0, 1)
    output = bt_pass(qc)

    output があるだろう。 RZGateSXGate を持つことになる。 これを修正するには、通常、basis translatorを2回目(つまり output = bt_pass(output) 上記の例では)を修正する。 これは transpile() 関数を実行したときの出力には影響しないはずであり、パスを単独で実行した場合にのみ問題となる。

アップグレードの注意

  • このバージョンから、 from qiskit import * 、サブモジュールはインポートされず、選択されたオブジェクトのリストのみがインポートされる。 これは、 from qiskit import * 、現在のネームスペースの一部ではないオブジェクトを参照している既存のコードを壊すかもしれない。 注意点として、 import * はバッドプラクティスとみなされ、プロダクションコードでは使用すべきではない。 Qiskitは、このような悪習の影響を軽減する方法として、 qiskit/__init__.py__all__ を設定している。 あなたのコードで name '<something>' is not definedfrom qiskit import <something> を追加して、もう一度試してみてください。

  • によって生成される最適化レベル0、1、2、3のプリセット・パス・マネージャー。 level_0_pass_manager(), level_1_pass_manager(), level_2_pass_manager()および level_3_pass_manager() が無条件に実行されることはない。 TimeUnitConversion. 以前は、プリセット・パス・マネージャーは、トランスパイラーや回路への入力に関係なく、常にこのパスを実行していた。 このパスが実行されるのは、 scheduling_method パラメーターが設定されているか、回路に Delay 命令が含まれており、 instruction_durations パラメータが設定されている場合にのみ実行されます。 この変更は、ランタイム・パフォーマンスの観点から行われた。 transpile() ゲート数が多く、遅延、タイミング、スケジューリングが使用されていない回路で実行する場合、実行時の性能のためにこの変更が行われました。 TimeUnitConversion が最大のボトルネックになる可能性があるためです。

  • BIPMapping のデフォルト・メソッドは depth ではなく balanced となった。 この新しい目的は、回路の深さとゲート誤差の両方を考慮するため、一般に、より良い結果を達成する。

  • クラスの sort_parameters_by_nameVQE クラスはQiskit Terra 0.18 で非推奨となったため、削除されました。 パラメータの新しい並び順は、より自然なソート順であるため、代替案は用意されていない。

  • 回路引き出し QuantumCircuit.draw() および circuit_drawer()latex オプションを使用すると、ファイル拡張子(ファイル名が指定されている場合)を決定する形式で画像が保存されるようになります。 以前は常にPNG形式で保存されていた。 画像フォーマットが不明な場合は、 ValueError 。 これは、画像をさまざまなフォーマットで保存しやすくするためだ。

  • コアの依存関係 retworkx のバージョン要件が 0.9 から 0.10.1 に引き上げられた。 これにより、さまざまなトランスパイルパスにまたがって、いくつかの性能向上が可能になる。

  • 以前は非推奨だった condition kwargは、 0.15.0 リリースの一部として非推奨となった。 DAGCircuit.apply_operation_back() そして DAGCircuit.apply_operation_front(). 代わりに、 condition 属性を Instruction インスタンスに DAGCircuit に追加されるインスタンスに Instruction.c_if().

  • DAGCircuit.extend_back() メソッドが削除されました。 これはもともと、 0.13.0 リリースで非推奨となっていた。 代わりに DAGCircuit.compose() メソッドを使うことができる。

  • DAGCircuit.compose_back() メソッドが削除されました。 これはもともと、 0.13.0 リリースで非推奨となっていた。 代わりに DAGCircuit.compose() メソッドを使うことができる。

  • メソッドの edge_map kwarg DAGCircuit メソッドの compose() は削除された。 これはもともと、 0.14.0 リリースで非推奨となっていた。 このメソッドは、 qubitsclbits kwargs を受け取り、 edge_map が以前に提供した辞書マッピングを使う代わりに、合成するビットの位置順序を指定する。

  • DAGCircuit.twoQ_gates() メソッドが削除されました。 これはもともと、 0.13.0 リリースで非推奨となっていた。 代わりに DAGCircuit.two_qubit_ops() を使うべきである。

  • DAGCircuit.threeQ_or_more_gates() メソッドが削除されました。 これはもともと、 0.13.0 リリースで非推奨となっていた。 代わりに DAGCircuit.multi_qubit_ops() メソッドを使うべきである。

  • のコンストラクタの最初の位置引数の名前付きアクセスが削除された。 SingleQubitUnitaryu クラスのコンストラクタの最初の位置引数の名前付きアクセスが削除されました。 これはもともと、 0.14.0 リリースで非推奨となっていた。 その代わり、最初の位置引数は unitary_matrix (または、名前ではなく位置引数で設定する)。

  • メソッドの最初の位置引数に対する名前付きアクセス。 QuantumCircuit メソッド squu に対する名前付きアクセスが削除されました。 これはもともと、 0.14.0 リリースで非推奨となっていた。 その代わりに、最初の位置引数を unitary_matrix (あるいは、名前ではなく位置引数で設定する)。

  • qiskit.qasm.node モジュールの QASM ノードクラスの qasm() メソッド用の未使用の proc および nested_scope kwargs が削除されました。 これらはもともと、 0.15.0 リリースで非推奨となっていた。

  • qiskit.qasm.node モジュールの QASM ノードクラスの latex() メソッド用の未使用の proc および nested_scope kwargs が削除されました。 これらはもともと、 0.15.0 リリースで非推奨となっていた。

  • qiskit.qasm.node モジュールの QASM ノードクラスの real() メソッド用の未使用の proc および nested_scope kwargs が削除されました。 これらはもともと、 0.15.0 リリースで非推奨となっていた。

  • の出力は Statevector.draw() を使用する場合、 "latex" の出力は、純粋に量子ビットで構成される状態をプロットする場合、新しい "ket" の規約になりました。 これは、ケット・ラベルを表示し、非ゼロ要素のみを表示するため、特に教育的な文脈で、出力を読みやすくするために変更された。

  • 走行中 execute() バックエンドで BackendV1 バックエンドで実行する場合、kwargs shots, max_credits, meas_level, meas_return , memory_slot_size のデフォルト値は、ターゲットとなるバックエンドの options 属性で設定されているデフォルト値になります。 以前は、これらのデフォルト値は、レガシーな バックエンドで execute() をレガシーな BaseBackend バックエンドでコールした場合のデフォルト値と同じに設定されていました。 例:

    from qiskit.test.mock import FakeMumbai
    from qiskit import QuantumCircuit, execute
    
    circuit = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    backend = FakeMumbai()
    backend.set_options(shots=4096)
    execute(qc, backend)

    4096 。 以前のリリースでは、 1024

  • Matplotlib の最小サポートバージョンは 2.1.0 から 3.3.0 に引き上げられた。 関数用の 'mpl' バックエンドなど、 Matplotlib - ベースの可視化関数を使用する場合は、 Matplotlib 3.3.0 をインストールする必要があります。 circuit_drawer() 関数や plot_bloch_vector() 関数をインストールする必要があります。 1つ目は、 Matplotlib の最近のバージョンでは、 3D のビジュアライゼーションに関するAPIの使用が非推奨になり、古いリリースとの互換性がなくなったからです。2つ目は、matplotlib の上流依存関係によって互換性がなくなり、テストが難しくなったため、 Matplotlib の古いバージョンをインストールするのが難しくなったからです。

  • の乱数発生器の内部使用が調整された。 random_circuit() の乱数生成器の内部使用が調整され、固定シードでも以前のバージョンと出力が変わるようになった。 これは、使用される量子ビット数に応じて実行時間のスケーリングを大幅に改善するために行われた。 以前のバージョンと同じ出力に依存していた場合は、 qpy_serialization.dump() を使って以前のバージョンで生成されたランダムな回路を保存し、新しいリリースでそれを再度生成する代わりに、 qpy_serialization.load() を使って保存された回路をロードすることをお勧めします。

  • メソッドには * (__mul__) を使用する。 dot() メソッドに @ (__matmul__) を使用する。 compose()BaseOperator のすべての演算子クラスの親である)。 qiskit.quantum_infoOperatorPauliのようなクラスを含むすべての演算子クラスの親である)はサポートされなくなりました。 これらの演算子の使用は、 0.17.0 リリースで非推奨となっていた。 代わりに dot()compose() メソッドを直接使うか、 & 演算子 (__and__) を使って compose(). 例えば、以前は次のような演算子を使っていたとする:

    from qiskit.quantum_info import random_hermitian
    
    op_a = random_hermitian(4)
    op_b = random_hermitian(4)
    
    new_op = op_a @ op_b

    に変更すべきである:

    from qiskit.quantum_info import random_hermitian
    
    op_a = random_hermitian(4)
    op_b = random_hermitian(4)
    new_op = op_a.compose(op_b)

    または:

    new_op = op_a & op_b
  • パルスプログラム命令のオペランドにパラメータを割り当てるさまざまな方法は、Qiskit Terra 0.17 で非推奨となり、削除されました。 次のものが含まれます。

    • pulse.Instructionassign() メソッド。
    • のベースである Channelassign() メソッドである。 AcquireChannel, SnapshotChannel, MemorySlot そして RegisterSlot.
    • pulse.Gaussianpulse.GaussianSquarepulse.Dragpulse.Constant のベースとなる ParametricPulseassign()assign_parameters() メソッド。

    これらのパラメータは、パルス・プログラム(pulse.Schedule および pulse.ScheduleBlock) から割り当てるべきである。

  • pulse.Instructionflatten() メソッドは削除されました。 qiskit.pulse.Schedule メソッドは削除され、Qiskit Terra 0.17 からの非推奨通知に従って存在しなくなりました。 この変換は、 qiskit.pulse.transforms.canonicalization.flatten() で独立した関数として定義されている。

  • qiskit.pulse.interfaces.ScheduleComponent は削除され、Qiskit Terra 0.15 からの非推奨の通知に従って、もはや存在しません。 代替クラスは用意されない。

  • レガシーのパルスドローワー引数は pulse.Waveform.draw() から削除された、 Schedule.draw() および ScheduleBlock.draw() から削除され、Qiskit Terra 0.16 からの非推奨の通知に従って存在しなくなりました。 これらの描画メソッドは、 V2 パルス描画引数のみをサポートするようになった。 詳細はメソッドのドキュメントを参照。

  • Qiskit Terra 0.14 からの非推奨通知により、 qiskit.pulse.reschedule モジュールは削除され、このインポートパスは存在しなくなりました。 代わりに qiskit.pulse.transforms 代わりに

  • 保護されたメソッド Schedule._children() は削除され、Qiskit Terra 0.17 からの非推奨通知に従って、保護されたインスタンス変数に置き換えられました。 これは現在、パブリック属性として提供されています。 Schedule.children.

  • タイムスロットに関連するメソッドとプロパティは削除され、Qiskit Terra。 ScheduleBlock Qiskit Terra 0.17 からの非推奨通知に従って。 この表現には命令時間( t0 )の概念がないため、タイムスロット情報は、次のように変換された後に利用可能になる。 Schedule. この変換の後、対応する属性が提供されたが、それらはもはやサポートされていない。 以下の属性が削除された:

    • timeslots
    • start_time
    • stop_time
    • ch_start_time
    • ch_stop_time
    • shift
    • insert
  • Qiskit Terra 0.17 からの非推奨通知に従い、アライメントパルススケジュール変換は削除され、もはや存在しません。 これらの変換は、スケジュールブロックの AlignmentKind コンテキストに統合され、実装される。 以下の明示的な変換関数が削除された:

    • qiskit.pulse.transforms.align_equispaced
    • qiskit.pulse.transforms.align_func
    • qiskit.pulse.transforms.align_left
    • qiskit.pulse.transforms.align_right
    • qiskit.pulse.transforms.align_sequential
  • Qiskit Terra 0.17 からの非推奨通知に従い、冗長なパルスビルダーコマンドは削除され、もはや存在しません。 pulse.builder.call_schedulepulse.builder.call_circuit が統合された。 pulse.builder.call().

  • すべてのQiskit非推奨警告を表示する原因となっていた内部フィルターオーバーライドが削除されました。 これは、 Python の非推奨の標準的な動作に戻ることを意味します。 DeprecationWarning が表示されるのは、メインスクリプトファイル、インタプリタセッション、または Jupyter ノートブック内のコードによってトリガーされた場合のみです。 Qiskitの内部関数が非推奨の振る舞いを呼び出した場合、ユーザーに警告が表示されることはなくなりました。 もしライブラリを書くのであれば、デフォルトの警告フィルタを無効にして実行することもあるし、常に無効にして実行するテストもあるはずだ。 その方法については、 Python の警告に関する文書、特に非推奨のテストに関するセクションを参照のこと。

  • 以前は特定の警告は、たとえ複数の場所からトリガーされたとしても、一度しか発せられなかった。 この動作は削除されたため、非推奨の関数を呼び出した場合、以前よりも警告が多く表示される可能性がある。 非推奨の関数呼び出しは、将来のQiskitリリースで削除されるので、推奨バージョンに変更する必要があります。

  • 非推奨の qiskit.schemas モジュールと、スキーマから jsonschema バリデータを構築する qiskit.validation モジュールは削除されました。 これは 0.17.0 リリースで非推奨となり、 IBM Quantum API ペイロードスキーマ専用のリポジトリに置き換えられました。

    以前 qiskit.schemas にパッケージされていたスキーマファイルや、それをもとに作られたバリデータに依存していた場合は、そのリポジトリを使い、そこに含まれるスキーマファイルからバリデータを作る必要があります。

  • 関数 qiskit.qobj.validate_qobj_against_schema および qiskit.qobj.common.validator とメソッドの validate kwarg QasmQobj.to_dict(), PulseQobj.to_dict()Qobj.to_dict() は削除された。 これらは 0.17.0 リリースで非推奨となった。 これらの関数を使用していた場合は、 IBM Quantum API ペイロード・スキーマの専用リポジトリにある jsonschema ファイルを使用して、 Qobj オブジェクト用の jsonschema 検証関数を手動で構築する必要があります。

  • qiskit-terra の要件リストに fastjsonschemajsonschema パッケージがなくなった。 jsonschemaの内部使用は削除され、qiskit-terraを使用する必要はなくなりました。

  • によって発生する例外。 assemble() 関数の構築に無効なパラメータが渡されたときに発生する例外が PulseQobjSchemaValidationError から QiskitError. これは、 SchemaValidationError クラスが非推奨の qiskit.schemasqiskit.validation と共に削除されたためである。 これはまた、他のエラー条件との整合性を保つためでもある。 assemble() をすでに発生させていた QiskitError.

  • トランスパイラ最適化レベル3のデフォルトのルーティングパスとレイアウトパスは、次のように変更されました。 SabreSwapSabreLayout を使用するように変更されました。 これは出力結果の質を向上させるために行われた。 StochasticSwapDenseLayoutを使うよりも良い結果が得られるからである。 この変更により transpile() または execute()optimization_level 3関数を実行する際の結果の質が向上します。 これは一般的に改善されているが、何らかの理由で以前の動作を保持する必要がある場合は、 routing_method="stochastic"layout_method="dense" を明示的に設定することで、これを行うことができる。 transpile()optimization_level=3

  • の戻り値の型は pauli_basis()PauliTable から PauliList に変更されます。 新しい動作に即座に切り替えるには、キーワード引数 pauli_list=True を渡す。

  • name 属性が SingleQubitUnitary の属性が unitary から squ に変更された。 これは、 unitaryUnitaryGate クラスの名前との衝突を避けるために必要だった。2つのゲートは同じではないし、同じインプリメンテーションを持っているわけでもないからだ(そして互換性を持って使うことはできない)。

  • インストールに必要な Symengine の最小バージョンが 0.8.0 に上がりました。 これは、 numpy.float16numpy.float32 の値の処理に関するいくつかの問題を修正するために必要であった。 bind() のパラメータをバインドするために ParameterExpression.

  • 要件リストに新たな従属港湾労働者が追加された。 これはqiskit-terraが必要とするもので、ユニタリー合成プラグイン・インターフェースの構築に使用される。

非推奨のメモ

  • gate 属性と初期化パラメータは非推奨。 qiskit.transpiler.passes.Decompose は非推奨であり、将来のリリースで削除される予定です。 この単一のゲートの代わりに、ゲート名のリストを新しいパラメータ gates_to_decompose に渡す必要がある。 これは、新しいフォームでは分解対象として複数のゲートを選択できるため、より柔軟性が増し、ゲートのセットを分解するために何度もパスを再実行する必要がなくなるためである。

  • キャリブレーションに関して、大幅なトランスパイラー・パスの再編成が行われた。 インポートパス:

    from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilder
    from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilderNoEcho

    は非推奨であり、将来のリリースで削除される予定です。 インポートパス:

    from qiskit.transpiler.passes.scheduling.rzx_templates import rzx_templates

    も非推奨であり、将来のリリースで削除される予定です。 新しいインポートパスを使うべきだ:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.transpiler.passes import RZXCalibrationBuilderNoEcho
    from qiskit.transpiler.passes.calibration.rzx_templates import rzx_templates
  • この DAGNode の親クラスとしてのみ使用されます。 DAGOpNode, DAGInNodeおよび DAGOutNode. この非推奨化の一環として、以下のkwargsと DAGNode の以下のkwargsと関連する属性も非推奨となる: type op および wire

  • のコンストラクタでは RZXCalibrationBuilder のコンストラクタで、バックエンドを最初の位置引数として渡すか、 backend kwarg を指定することは推奨されません。 代わりに InstructionScheduleMapinstruction_schedule_map kwarg に直接渡し、各クォビットのチャンネル名リストのリストを qubit_channel_mapping に直接渡すべきである。 例えば、パスをこう呼ぶとする:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.test.mock import FakeMumbai
    
    backend = FakeMumbai()
    cal_pass = RZXCalibrationBuilder(backend)

    その代わり、こう呼ぶべきだ:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.test.mock import FakeMumbai
    
    backend = FakeMumbai()
    inst_map = backend.defaults().instruction_schedule_map
    channel_map = self.backend.configuration().qubit_channel_mapping
    cal_pass = RZXCalibrationBuilder(
        instruction_schedule_map=inst_map,
        qubit_channel_mapping=channel_map,
    )

    この変更が必要な理由は、一般的なルールとして、バックエンドのオブジェクトはpickleシリアライズ可能ではない。 transpile() の中で複数のプロセスで使用すると壊れてしまうからです。

  • label プロパティは、クラス MCMT およびサブクラス MCMTVChain のプロパティは非推奨となり、将来のリリースで削除される予定です。 その結果、両クラスのコンストラクタの label kwargも、メソッドの label kwargとともに非推奨となる。 MCMT.control(). 現在、 label プロパティは、制御対象が複数のターゲット量子ビットで構成されている場合に、制御対象の名前に使用されます。しかし、これはユーザーが指定できることを意図したものではなく、よく知られた演算の名前が使用された場合、誤ったMCMTゲートになる可能性があります。 非推奨になった後、 label プロパティはユーザーが指定できるものではなくなります。 ただし、生成された制御対象の名前は

    MCMT.data[0][0].base_gate.name
  • クラスの subgraph() メソッドは非推奨です。 CouplingMap クラスのメソッドは非推奨であり、将来のリリースで削除される予定です。 代わりに reduce() メソッドを使うべきである。 CouplingMap ( subgraph() はリストの順序を保持しなかった)。

  • のインスタンスを作成する。 InstructionSetcircuit_cregs のインスタンスを作成することは非推奨です。 一般的に、これらのクラスはユーザーによって構築される必要はありません(内部的に使用されます)が、必要な場合は、 resource_requester キーワード引数として callable を渡す必要があります。 例:

    from qiskit.circuit import Clbit, ClassicalRegister, InstructionSet
    from qiskit.circuit.exceptions import CircuitError
    
    def my_requester(bits, registers):
        bits_set = set(bits)
        bits_flat = tuple(bits)
        registers_set = set(registers)
    
        def requester(specifier):
            if isinstance(specifer, Clbit) and specifier in bits_set:
                return specifier
            if isinstance(specifer, ClassicalRegster) and specifier in register_set:
                return specifier
            if isinstance(specifier, int) and 0 <= specifier < len(bits_flat):
                return bits_flat[specifier]
            raise CircuitError(f"Unknown resource: {specifier}")
    
        return requester
    
    my_bits = [Clbit() for _ in [None]*5]
    my_registers = [ClassicalRegister(n) for n in range(3)]
    
    InstructionSet(resource_requester=my_requester(my_bits, my_registers))
  • クラスのコンストラクタの measurement_error_mitigation_cls kwargの値として、 qiskit-ignis の計測緩和クラス qiskit.ignis.mitigation.CompleteMeasFitterqiskit.ignis.mitigation.TensoredMeasFitter を使用することは非推奨である。 QuantumInstance クラスのコンストラクタの kwarg の値としての使用は非推奨であり、将来のリリースで削除される予定です。 その代わりに qiskit.utils.mitigation, CompleteMeasFitter および TensoredMeasFitter の同等のクラスを使うべきである。 これは、 qiskit-ignis プロジェクトが非推奨となり、近い将来サポートされなくなるため、必要なことだった。 注目に値するのは、 qiskit-ignis の同等クラスとは異なり、以下のバージョンであることだ。 qiskit.utils.mitigation のバージョンは QuantumInstance (つまり、 measurement_error_mitigation_cls kwargを使ったインスタンスではなくクラスとして)使用することのみがサポートされており、スタンドアローンでの使用は意図されていない。

  • Optimizer.optimize() すべてのオプティマイザ (Optimizer および派生クラス) のための メソッドは現在非推奨となっており、将来のリリースで削除される予定です。 代わりに Optimizer.minimize()SciPy’s minimize() 関数のシグネチャを模倣したメソッドを使うべきである。

    現在のoptimizeコールをminimizeに置き換えるには、次のように置き換える

    xopt, fopt, nfev = optimizer.optimize(
        num_vars,
        objective_function,
        gradient_function,
        variable_bounds,
        initial_point,
    )

    への

    result = optimizer.minimize(
        fun=objective_function,
        x0=initial_point,
        jac=gradient_function,
        bounds=variable_bounds,
    )
    xopt, fopt, nfev = result.x, result.fun, result.nfev
  • qiskit.util モジュールをインポートすると、 DeprecationWarning。 その代わりに、同じ機能をすべて qiskit.utils. Terra 0.17 以降、 util モジュールは非推奨となったが、以前は警告は出なかった。 Terra 0.20 で削除される。

  • プロパティ table は非推奨であり、将来のリリースで削除される予定です。 これは SparsePauliOp は内部的に PauliTable の代わりに PauliList を使うように更新されたからである。 これはパフォーマンスを大幅に向上させるためだ。 これで PauliList データには SparsePauliOp.paulis 属性を使用してデータにアクセスする必要があります。

バグ修正

  • 多くのレイアウト・メソッドが3つ以上の量子ビット・ゲートを無視するため、予期しないレイアウト割り当てが決定されるバグを修正。 トランスパイラパス Unroll3qOrMore が呼び出されたとき、すべてのプリセットパスマネージャでレイアウトパスの前に実行されるようになりました。 transpile() が呼び出されたとき、すべてのプリセットパスマネージャでレイアウトパスの前に実行されるようになりました。 修正 #7156

  • 分解された回路は、アセンブルされた回路や実験回路からキャリブレーションを引き継ぐ。 QasmQobj と実験を継承します。 5348を修正。

  • インスタンスの ansatz または optimizer 属性を VQE インスタンスの属性を None に設定すると、バグっぽい動作になるのを修正しました。 詳細は #7093を参照。

  • の追加を修正した。 PauliListqargs。 オペランドの量子ビット数が異なる場合に実行時エラーを発生させる方法。

  • を使用して勾配を計算しようとするとエラーが発生する問題を修正しました。 CircuitGradient クラスで勾配を計算しようとするとエラーが発生する問題を修正しました。 このバグ修正は、指定されたゲートを、要求された勾配法でサポートされるゲートの集合に変換する。 6918を修正。

  • メソッドでエラー軽減を使用した場合の校正結果を削除した。 execute() メソッドで誤差軽減を使用した場合の校正結果を削除しました。 QuantumInstance. 7129を修正。

  • を実行したときに表示される非推奨の警告を修正した。 QuantumCircuit.draw() または circuit_drawer()1.9 expr_free_symbols()を実行しているときに表示される非推奨の警告を修正しました。 回路図作成者は以前、記号定数のインスタンスを見つけるときにこの方法を利用していた。

  • mpl サーキットドロワーの ax kwarg および style kwarg の figwidth オプションが正しく拡大縮小されない問題を修正。 ユーザーは、 Matplotlib サブプロットから mpl 回路ドロワーに ax を渡すことができ、回路はそのサブプロットの境界内に描かれる。 あるいは、 style dict kwargで figwidth をインチ単位で設定すると、図面は設定されたインチ単位の幅に拡大縮小されます。 修正 #6367

  • の問題を修正しました。 circuit_drawer() 関数と draw() メソッドの QuantumCircuit. latex ドロワー・オプションを使用して、レジスタではなくクラシカル・ビットを対象とした measure 命令を表示すると、ドロワーが失敗する。

  • の問題を修正しました。 circuit_drawer() 関数と draw() メソッドの QuantumCircuit. mpllatextext の3つの引き出しオプションのいずれでも、古典的な条件を持つゲートが、レジスタなしで古典的なビットを条件とするゲートに遭遇した場合、引き出しは失敗する。

  • の問題を修正しました。 circuit_drawer() 関数と draw() メソッドの QuantumCircuit. mpllatextext の3つの引き出しオプションのいずれかで、古典的条件を持つゲートが measure と同じ古典的ビットを条件とし、メジャーがターゲットとするビットにレジスタがない場合、引き出しは失敗する。

  • C3SXGate これで正しい分解と行列表現が可能になった。 以前は、意図した SXGate().control(3) ではなく、 SdgXGate().control(3) と同等だった。

  • qiskit.test.mock.utils.ConfigurableFakeBackend のメンバー namebackend_name に変更された。 これは name() メソッドとの衝突を避けるためである。 BackendV1 クラスから継承したメソッドとの衝突を避けるためである。 これにより、 ConfigurableFakeBackend BackendV1 オブジェクトと互換性があります。 しかし、以前 name 属性を直接使用していた場合は、メソッドとして呼び出すか、代わりに backend_name 属性にアクセスする必要があります。

  • が含まれる回路で QuantumCircuit.decompose() を含む回路上で Instruction 属性が空の definition 属性が空である回路を呼び出すと、その命令がゼロオペレーションに分解されず、そのままになってしまう問題を修正しました。 例えば、サーキットがある:

    from qiskit.circuit import QuantumCircuit
    empty = QuantumCircuit(1, name="decompose me!")
    circuit = QuantumCircuit(1)
    circuit.append(empty.to_gate(), [0])

    以前は、 circuit.decompose() 。 これで、 empty をゼロ命令に正しく分解することができる。 詳しくは #6997を参照。

  • の問題を修正しました。 circuit_drawer() 関数と draw() メソッドの QuantumCircuit. mpl または latex オプションを使用して、古典的な condition を含む measure 命令を表示する場合、 condition 情報が measure 表示を上書きすることがあった。

  • の問題を修正しました。 circuit_drawer() 関数と draw() メソッドの QuantumCircuit. mpl のドロワーは、 condition の値を表示するために16進数表記を使用したが、 textlatex のドロワーは10進数表記を使用した。 これで3つの引き出しはすべて16進数表記になった。

  • Hoareオプティマイザーの転置パスのバグを修正。ゲートが前任者と後任者の両方と別々に結合されて同一性を形成できる場合、ゲートを2回削除しようとすることがあった。 詳細は #7271を参照。

  • 標準的な InstructionSet.c_if() メソッドで条件付き命令を作成する場合、整数インデックスは QuantumCircuit で使用されている番号付けと一致するようになった。 以前は ClassicalRegisterが重なった場合 Clbitが重なると、番号付けがおかしくなっていた。 詳細は #7246を参照。

  • 標準的な InstructionSet.c_if() メソッドで条件付き命令を作ると、回路内に ClassicalRegisterがなくても成功するようになった。 詳細は #7250を参照。

  • 標準的な方法で命令を条件付きにする InstructionSet.c_if() メソッドで条件付き命令を作成する。 Clbit サイズ1の ClassicalRegister を使用する場合、標準的な方法で条件付き命令を作成すると、レジスタではなくビットに対する条件が正しく作成されるようになります。 詳細は #7255を参照。

  • 標準の InstructionSet.c_if() メソッドで条件付き命令を作ろうとすると、古典的リソースが回路に存在しない場合、正しくエラーが発生するようになりました。 詳細は #7255を参照。

  • Matplotlib 3.5 との互換性の問題を修正しました。 plot_bloch_vector. 詳細は #7272を参照。

  • メソッドでレイヤーが正しく追加されない問題を修正しました。 NLocal.add_layer() オブジェクトがすでに構築されている場合 NLocal オブジェクトがすでにビルドされている場合に

  • をピックする際の問題を修正しました。 InstructionScheduleMapPython 3.6 を使用している場合に発生する問題を修正した。 詳細は #6944を参照。

  • symengine での複雑な値のパルスパラメータの割り当てが修正されました。 例:

    from qiskit import circuit, pulse
    import numpy as np
    
    amp = circuit.Parameter("amp")
    phase = circuit.Parameter("phase")
    
    with pulse.build() as sched:
        pulse.play(pulse.Gaussian(160, amp * np.exp(1j * phase), 40), pulse.DriveChannel(0))
    sched.assign_parameters({amp: 0.1, phase: 1.57}, inplace=True)

    0.18.0 リリースで symengine の使用が導入された後、割り当てられた振幅は ParameterExpression(0.1*exp(1.57*I)) として表示されている。 これは正しく評価され、 7.96327e-05 + 0.0999999683j として表示される。

  • 以下の問題を修正した。 QAOA.construct_circuit() 同じ量子ビット数で異なる演算子を使用した場合、毎回同じ回路が生成されてしまう問題を修正しました。 詳細は #7223を参照。

  • 以下の問題を修正した。 QAOAAnsatzPauliSumOp.from_list([("III", 1)]) のように、 PauliSumOp のIDが指定された場合、パラメーターの数が不正確になる問題を修正した。 詳細は #7225を参照。

  • メソッドが無効な識別子を返すことがあったバグを修正した。 QuantumCircuit.qasm() メソッドが無効な識別子を持つ OpenQASM 2 命令を返すことがあるバグを修正した。 同じバグが UnitaryGate で修正された。

  • レジスタレスビットを表示しようとすると、 mpllatex 回路ドロワーが故障する問題を修正。 text 、レジスタレス・ビットの番号表示から先頭の _ が削除された。 修正 #6732

  • 1ビット・レジスタでは、すべての回路ドロワがレジスタ名のみを表示し、 0 の添え字を表示しなくなった。 修正 #5784

  • の暗黙レジスタの名前の衝突を修正。 QuantumCircuit.qasm の名前の衝突を修正しました。 以前は、レジスタのない量子ビットと clbits は、衝突があるにもかかわらず、 regless と呼ばれる qregcreg の両方に入れられた。 これらのレジスタは、決定論的に生成された個別の名前を持つことになり、回路内のユーザー定義レジスタ名と衝突することはない。

  • clbits演算を伴う回路(測定、条件ゲート、更新など)のスケジューリングに関する問題を修正。 ASAPSchedule, ALAPScheduleおよび AlignMeasures. 更新されたスケジューラは、すべてのclbitのI/O操作に時間がかからないと仮定し、 measure 、最後に測定値をclbitに書き込み、 c_if 、最初に条件値をclbit(s)で読み込む。 修正 #7006

  • 空のリストに対して transpile を呼び出すと、警告を出さずに正しく空のリストを返すようになった。 7287を修正。

  • の問題を修正した。 PiecewiseChebyshev の問題を修正しました。 このような場合は、次のように関数を使うのではなく、 f_x の引数として定数を直接渡すようにする:

    from qiskit.circuit.library.arithmetic import PiecewiseChebyshev
    
    PiecewiseChebyshev(1.0, degree=3)

    詳細は #6707を参照。

  • もし HHL アルゴリズムのインスタンスが QuantumInstance (デフォルト)なしで構築された場合、後でインスタンスを読み込んだり設定したりするためにゲッターとセッターのプロパティを使用しようとすると失敗します。 ゲッターとセッターは期待通りに動作するようになった。

  • この QuantumCircuit.qasm() メソッドは、 circuit.data に存在する元の命令ではなく、回路に存在する命令のコピーの名前を編集するようになった。 詳細は #6952を参照。

  • のバグを修正した。 PauliSumOp.permute() エラーを引き起こす

    QiskitError: 'Pauli string label "" is not valid.'

    順列が同じ数のパウリ項を持つ場合。 X ^ Y ^ Zpermute([2, 1, 0]) を呼び出してもエラーは発生しなくなり、 Z ^ Y ^ X を返すようになった。

  • のミキサー・パラメーターのパラメーター境界が設定されていなかったバグを修正。 QAOAAnsatz のパラメータ境界が設定されていなかったバグを修正した。

  • パスにおける最終的なオペレーション(障壁と対策)の固定的な決定 RemoveFinalMeasurements とメソッド remove_final_measurements() クラスの QuantumCircuit 以前は出力ノードの直前のノードだけを考慮していました。

  • パスとメソッドにおける最終操作の確定 RemoveFinalMeasurements とメソッド remove_final_measurements() クラスの QuantumCircuit での最終操作の判定を修正した。

  • パスのマルチビット古典レジスタ除去を修正 RemoveFinalMeasurements とメソッド remove_final_measurements() クラスの QuantumCircuit において、他のビットがアイドル状態であっても、各ビットに最終的な対策が施されない限り、古典レジスタが削除されなかった問題を修正した。 現在、最終的な測定とバリアーを取り除いた結果、アイドルになった古典的なレジスタは常に取り除かれる。 古典的なビットは、削除されたレジスタによってのみ参照されるか、まったく参照されず、削除によってアイドルとなった場合に削除される。 この修正により、基礎ビットを共有するレジスタの適切な処理も追加された。

  • の問題を修正した。 RemoveFinalMeasurements の問題を修正しました。 DAGCircuit が無効になってしまう問題を修正しました。 詳細は #7196を参照。

  • メソッドの問題を修正しました。 remove_final_measurements() クラスの QuantumCircuit メソッドの問題を修正しました。 QuantumCircuit.clbits のメソッドが不正になる問題を修正しました。 詳細は #7089を参照。

  • で空のゼロ演算子をテーパリングする際、それがゼロであることを検出すると、コードは警告を記録し、元の演算子を返した。 qiskit.opflowで空のゼロ演算子をテーパリングすると、それがゼロであることを検出したコードは警告を記録し、元の演算子を返した。 このような演算子は、Qiskit Natureを使用する場合、補助演算子で一般的に見られます。上記の動作により、 VQE 、テーパーされた非ゼロ演算子はテーパーされたゼロ演算子とは異なる量子ビット数であったため、例外がスローされました(テーパーは入力演算子を変更せずに返したため)。 コードはゼロ演算子を正しくテーパリングするようになり、予想通り量子ビット数が減少し、テーパリングされた非ゼロ演算子にマッチします。例えば、3量子ビットでテーパリングする場合、 `0*"IIII"`0*"I" になります。

  • メソッドの問題を修正しました。 draw() メソッドと circuit_drawer()settings.conf 関数の問題を修正しました 関数/メソッドの style kwargが設定されていない場合、 circuit_mpl_style フィールドの設定値は無視される。

その他の注意事項

  • に対する文字列キャストは qiskit.circuit.ParameterExpression はもう完全な精度を持たない。 これは、floatにバインドされたパラメータを印刷する際に、末尾の 0s を削除する。 これはQASMのシリアライゼーションと回路テキストドロワーに影響を与えます:

    >>> from qiskit.circuit import Parameter
    >>> x = Parameter('x')
    >>> str(x.bind({x:0.5}))
    '0.5'   # instead of '0.500000000000000'
  • が更新された。 QAOAAnsatz は、QAOA文献の標準的な表記法であるように、コスト演算子にはパラメータ記号 γ 、ミキサー演算子には β を使用するように更新された。

エア 0.9.1

変更なし

イグニス 0.7.0

前奏曲

このリリースはQiskit Ignisプロジェクトを非推奨とし、 Qiskit Experiments プロジェクトに取って代わられ、活発な開発は終了しました。 非推奨ではあるが、ユーザーがIgnisから移行するのに十分な機会を提供するため、重要なバグ修正と互換性の修正は引き続き行われる。 非推奨期間終了後(このリリースから3ヶ月以内)、プロジェクトは引退し、アーカイブされる。

新機能

  • のフィッティング・ルーチンを使用するよう、認定プロトコルを更新した。 https://arxiv.org/abs/2103.06603. AccreditationFitter は、 FullAccreditation (旧プロトコル)と MeanAccreditation (新プロトコル)のメソッドを持つようになった。 データ入力は、結果オブジェクト( AppendResult )または文字列リスト( AppendStrings )を使用するように変更された。 qiskit.ignis.verification.QOTPCorrectString() も追加された。

  • シンドロームグラフの高速分析生成オプションを追加。 RepetitionCode に新しいブール引数 brute が追加され、ブルートフォース法を引き続き使用できるようになった。 これを容易にするためにヘルパークラス RepetitionCodeSyndromeGenerator が追加された。

  • RepetitionCode にキーワード引数 resetsdelay が追加された。 前者は、測定後にリセットゲートを挿入するかどうかを決定する。 後者では、各測定(場合によってはリセット)後の遅延時間(dt)を指定することができる。

    RepetitionCodesyndrome_measurement() メソッドにキーワード引数 finaldelay が追加された。 前者は、グローバル resets に従ってリセットゲートを追加するか、シンドローム測定の最終ラウンドのために適切な動作で上書きするかを決定する。 後者では、各測定(場合によってはリセット)後の遅延時間(dt)を指定することができる。

  • RepetitionCode クラスがx基底状態でのエンコーディングをサポートするようになった。 これは、 RepetitionCode オブジェクトを構築する際に、 xbasis キーワード引数を設定することで使用できる。

アップグレードの注意

  • RepetitionCodesyndrome_measurement() メソッドからキーワード引数 reset が削除された。 これは、クラスに対するグローバルなキーワード引数 resets と、 syndrome_measurement に対するキーワード引数 final で置き換えられる。 以前は最終リセットゲートを避けるために reset=False を使って最終測定ラウンドを追加していた場合、現在は final=True を使うべきである。

  • update_u_gates() から ParametrizedSchedule を削除する。

    ParametrizedSchedule はQiskit-terra 0.17.0 の一部として非推奨となり、次のリリースで削除される予定です。 この関数は、未割り当ての Parameter オブジェクトを含む Schedule プログラムでu ゲートを更新するようになった。

非推奨のメモ

  • AccreditationFitter 、bound_variation_distanceとsingle_protocol_runというメソッドを廃止する

  • Qiskit Ignisプロジェクトは全体として非推奨となり、プロジェクトは今後引退し、アーカイブされる予定です。 非推奨ではありますが、互換性の修正と致命的なバグの修正のみが行われます。 Qiskit Ignisを使用する代わりに、 Qiskit Experimentsを使用するように移行する必要があります。 移行ガイドを参照してください:

    https://github.com/qiskit-community/qiskit-ignis#migration-guide

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