Skip to main content
IBM Quantum Platform

Qiskit 0.40 リリースノート


0.40.0

このリリースでは、Qiskitメタパッケージの一部であるQiskit IBMQプロバイダプロジェクトを正式に非推奨とします。 これは、将来のリリースでは、 pip install qiskit が自動的に qiskit-ibmq-provider を含まないことを意味する。 現在、 qiskit-ibmq-provider を取得するために qiskit を依存関係としてインストールまたはリストアップしている場合は、 qiskit-ibmq-provider も明示的にインクルードするように更新する必要があります。 これは、Qiskitプロジェクトが、 qiskit 、量子回路、プログラム、アプリケーションのビルドとコンパイルのための共通コア機能のみをパッケージ化したモデルへと移行していく中で行われている。 そのコアの上に構築するパッケージや、Qiskitをハードウェアやシミュレータにリンクするパッケージは、別のパッケージとしてインストール可能です。

Terra 0.23.0

前奏曲

Qiskit Terra 0.23.0 は、多数の新機能とバグ修正を含むメジャー機能リリースです。 今回のリリースのハイライトは以下の通り:

このリリースでは、 Python 3.7。 Qiskit を Python 3.7 で実行すると DeprecationWarning が表示されます。 Python 3.7 のサポートは 0.25.0 リリース(現在2023年7月リリース予定)の一部として削除される予定です。その時点で、Qiskitを使用するには Python 3.8 またはそれ以降が必要になります。

新機能

  • のパルスは qiskit.pulse.library

    を新しいパラメータ angle で初期化することで、 ampangle の2つのフロート・パラメータを提供することができる。 複素数 amp を使った初期化も引き続きサポートされている。

  • この AdaptVQE クラスには新しい属性があります、 eigenvalue_historyこれは、 AdaptVQE の反復ごとに達成される最低エネルギーを追跡するために使われます。 例:

    from qiskit.algorithms.minimum_eigensolvers import VQE
    from qiskit.algorithms.minimum_eigensolvers.adapt_vqe import AdaptVQE
    from qiskit.algorithms.optimizers import SLSQP
    from qiskit.circuit.library import EvolvedOperatorAnsatz
    from qiskit.opflow import PauliSumOp
    from qiskit.primitives import Estimator
    from qiskit.quantum_info import SparsePauliOp
    from qiskit.utils import algorithm_globals
    
    excitation_pool = [
        PauliSumOp(
            SparsePauliOp(["IIIY", "IIZY"], coeffs=[0.5 + 0.0j, -0.5 + 0.0j]), coeff=1.0
        ),
        PauliSumOp(
            SparsePauliOp(["ZYII", "IYZI"], coeffs=[-0.5 + 0.0j, 0.5 + 0.0j]), coeff=1.0
        ),
        PauliSumOp(
            SparsePauliOp(
                ["ZXZY", "IXIY", "IYIX", "ZYZX", "IYZX", "ZYIX", "ZXIY", "IXZY"],
                coeffs=[
                    -0.125 + 0.0j,
                    0.125 + 0.0j,
                    -0.125 + 0.0j,
                    0.125 + 0.0j,
                    0.125 + 0.0j,
                    -0.125 + 0.0j,
                    0.125 + 0.0j,
                    -0.125 + 0.0j,
                ],
            ),
            coeff=1.0,
        ),
    ]
    ansatz = EvolvedOperatorAnsatz(excitation_pool, initial_state=self.initial_state)
    optimizer = SLSQP()
    h2_op = PauliSumOp.from_list(
        [
            ("IIII", -0.8105479805373266),
            ("ZZII", -0.2257534922240251),
            ("IIZI", +0.12091263261776641),
            ("ZIZI", +0.12091263261776641),
            ("IZZI", +0.17218393261915543),
            ("IIIZ", +0.17218393261915546),
            ("IZIZ", +0.1661454325638243),
            ("ZZIZ", +0.1661454325638243),
            ("IIZZ", -0.2257534922240251),
            ("IZZZ", +0.16892753870087926),
            ("ZZZZ", +0.17464343068300464),
            ("IXIX", +0.04523279994605788),
            ("ZXIX", +0.04523279994605788),
            ("IXZX", -0.04523279994605788),
            ("ZXZX", -0.04523279994605788),
        ]
    )
    
    algorithm_globals.random_seed = 42
    calc = AdaptVQE(VQE(Estimator(), ansatz, self.optimizer))
    res = calc.compute_minimum_eigenvalue(operator=h2_op)
    
    print(calc.eigenvalue_history)

    calc.history の戻り値は、反復が1回なので、おおよそ [-1.85727503]

  • を実行する際の実行時ロギングが改善されました。 AdaptVQE が改善された。 今このクラスを実行すると、 DEBUGINFO レベルのログ・メッセージがクラスの実行時に出力されます。

  • 回路内のノードのブロックを収集し、統合するための新しいトランスパイラー・パス、 CollectAndCollapse を追加。 このパスは、ブロックの収集と統合を組み合わせた一般的な基本クラスとして設計されている。 完全に一般的に言うと、ブロックの収集と折りたたみの作業は、パスのインスタンス化時に提供される関数によって行われる。 例えば CollectLinearFunctions は、 CollectAndCollapse を継承するように更新され、以下のブロックを収集するようになった。 CXGateSwapGate ゲートのブロックを集め、各ブロックを LinearFunction. を使用している。 CollectCliffordsCollectAndCollapse に基づいており、「クリフォード」ゲートのブロックを収集し、各ブロックを Clifford.

    このインターフェイスは、より大きなノードのブロックを集めるために、ゲート間の可換性を利用できるオプション do_commutative_analysis もサポートしている。 例えば、次の回路でCXゲートのブロックを集める:

    qc = QuantumCircuit(2)
    qc.cx(0, 1)
    qc.z(0)
    qc.cx(1, 0)

    do_commutative_analysis を使用すると、最初のCXゲートとZゲートが通勤するため、2つのCXゲートを統合することができる。

  • 様々なコレクション戦略を実装する新しいクラス BlockCollector 、様々な折りたたみ戦略を実装する新しいクラス BlockCollapser 。 現在、 BlockCollector には、与えられたフィルター関数に従うすべてのゲートを貪欲に収集する戦略(たとえば、すべてのクリフォードゲートを収集する)が含まれており、 BlockCollapser には、ブロック内のすべてのゲートを単一のオブジェクトに統合する戦略が含まれている(たとえば、クリフォードゲートのブロックを単一の Clifford).

  • 新しい CollectCliffords クリフォード・ゲートのブロックを収集し、これらのブロックをオブジェクトに統合する新しいトランスパイラー・パスを追加した。 qiskit.quantum_info.Clifford オブジェクトに統合します。 このパスは CollectAndCollapse を継承し、特に do_commutative_analysis というオプションをサポートしている。 また、 split_blocksmin_block_size の2つのオプションもサポートしている。 詳細は CollectAndCollapse および CollectLinearFunctions のリリースノートを参照のこと。

  • トランス CollectLinearFunctions トランスパイラー・パスのコンストラクターにはいくつかの新しい引数がある:

    • do_commutative_analysisより大きなノードのブロックを集めるために、ゲート間の可換性を利用することができる。

    • split_blocksこれにより、収集したブロックを、量子ビットの不連続な部分集合上のサブブロックに分割することができる。 例えば、次のような回路である:

      qc = QuantumCircuit(4)
      qc.cx(0, 2)
      qc.cx(1, 3)
      qc.cx(2, 0)
      qc.cx(3, 1)
      qc.cx(1, 3)

      量子ビット {0, 1, 2, 3} 上のCXゲートの単一のブロックは、2つの不連続なサブブロック、1つは量子ビット {0, 2} 上の、もう1つは量子ビット {1, 3} 上のブロックに分割することができます。

    • min_block_sizeゲート数が少ないブロックは修正されない。 例えば、次のような回路である:

      qc = QuantumCircuit(4)
      qc.cx(1, 2)
      qc.cx(2, 1)

      2つのCXゲートは、 min_block_size が1または2のときに統合され、 min_block_size が3以上のときは変更されない。

  • 深さ効率の良い合成アルゴリズムを追加 synth_cnot_depth_line_kms() 線形可逆回路のための LinearFunction を追加した: https://arxiv.org/abs/quant-ph/0701194.

  • この DAGCircuit.replace_block_with_op() メソッドは、ブロックを置き換えたときに生成される新しい DAGOpNode を返すようになりました。 以前は、このメソッドを呼んでも何も返されなかった。

  • 深度効率の良い合成アルゴリズムを追加 synth_permutation_depth_lnn_kms() を追加した。 Permutation を追加した: https://arxiv.org/abs/quant-ph/0701194

  • 新しいクラス PermutationGate を追加した。 既存の Permutation この新しいクラスは、宣言時に並べ替え回路を合成しないようにする。 これにより、トランスパイラーへの実際の合成が遅れる。 また、並べ替えを合成するためのいくつかの異なるアルゴリズムを使用することも可能で、これらは高レベル合成並べ替えプラグインとして提供されている。

    のもうひとつの重要な特徴は PermutationGate は、順列のユニタリー行列を効率的に返すための __array__ インターフェイスを実装していることである。

  • パーミュテーションを合成するためのハイレベル合成プラグインをいくつか追加:

    • BasicSynthesisPermutationこれは、完全に接続されたアーキテクチャに適用され、ソートに基づいている。 これは、順列の量子回路を構成するアルゴリズムとして以前から使われているものである。
    • ACGSynthesisPermutationこれは完全接続アーキテクチャに適用されますが、Alon, Chung, Grahamの方法に基づいています。 これは、深さ2(SWAPの観点から測定)の任意の順列を合成する。
    • KMSSynthesisPermutation線形最近傍アーキテクチャに適用され、最近追加されたKutin, Moulton, Smithline法に相当する。

    例:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import PermutationGate
    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis
    from qiskit.transpiler.passes.synthesis.plugin import HighLevelSynthesisPluginManager
    
    # Create a permutation and add it to a quantum circuit
    perm = PermutationGate([4, 6, 3, 7, 1, 2, 0, 5])
    qc = QuantumCircuit(8)
    qc.append(perm, range(8))
    
    # Print available plugin names for synthesizing permutations
    # Returns ['acg', 'basic', 'default', 'kms']
    print(HighLevelSynthesisPluginManager().method_names("permutation"))
    
    # Default plugin for permutations
    # Returns a quantum circuit with size 6 and depth 3
    qct = PassManager(HighLevelSynthesis()).run(qc)
    print(f"Default: {qct.size() = }, {qct.depth() = }")
    
    # KMSSynthesisPermutation plugin for permutations
    # Returns a quantum circuit with size 18 and depth 6
    # but adhering to the linear nearest-neighbor architecture.
    qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("kms", {})]))).run(qc)
    print(f"kms: {qct.size() = }, {qct.depth() = }")
    
    # BasicSynthesisPermutation plugin for permutations
    # Returns a quantum circuit with size 6 and depth 3
    qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("basic", {})]))).run(qc)
    print(f"basic: {qct.size() = }, {qct.depth() = }")
    
    # ACGSynthesisPermutation plugin for permutations
    # Returns a quantum circuit with size 6 and depth 2
    qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("acg", {})]))).run(qc)
    print(f"acg: {qct.size() = }, {qct.depth() = }")
  • 量子フィッシャー情報(QFI)と量子幾何学テンソル(QGT)アルゴリズム用の新しいクラスを追加しました。 primitives, qiskit.algorithms.gradients.QFI および qiskit.algorithms.gradients.LinCombQGT勾配モジュールに追加: qiskit.algorithms.gradients. 例:

    from qiskit.circuit import QuantumCircuit, Parameter
    from qiskit.algorithms.gradients import LinCombQGT, QFI
    
    estimator = Estimator()
    a, b = Parameter("a"), Parameter("b")
    qc = QuantumCircuit(1)
    qc.h(0)
    qc.rz(a, 0)
    qc.rx(b, 0)
    
    parameter_value = [[np.pi / 4, 0]]
    
    qgt = LinCombQGT(estimator)
    qgt_result = qgt.run([qc], parameter_value).result()
    
    qfi = QFI(qgt)
    qfi_result = qfi.run([qc], parameter_value).result()
  • のコンストラクタに新しいキーワード引数 derivative_type を追加。 LinCombEstimatorGradient. この引数は、勾配の実数部または虚数部のみを計算することを指定できる DerivativeType enumを取る。

  • ユーザー設定ファイルに新しいオプション circuit_reverse_bits を追加。 これにより、ユーザーは、回路ドロワの reverse_bits 引数のデフォルトの動作に、好みのブーリアンを設定することができる。 QuantumCircuit.draw() そして circuit_drawer(). 例えば、デフォルトの場所 ~/.qiskit/settings.conf 、ユーザー設定ファイルにセクションを追加する:

    [default]
    circuit_reverse_bits = True

    はビットを逆順に表示するようにデフォルトを変更する。

  • 新しいクラスを追加 Z2Symmetries を追加した。 qiskit.quantum_info これは入力から Z2Z_2 の対称性を識別するために使われる。 SparsePauliOp.

  • 新しいパルス指令の追加 TimeBlockade. この命令はdelay命令とほとんど同じ動作をするが、実行前に削除される。 このディレクティブはパルスビルダー内部で使用され、絶対時間間隔の命令を表現するのに役立ちます。 ScheduleBlock 絶対時間間隔の命令を表現するのに役立ちます。 これにより、パルスビルダーは、 Schedule を、命令でラッピングするのではなく、 ScheduleBlock に変換することができる。 Call に変換することができる。

  • 量子時間発展(Quantum Time Evolution)のインターフェイスを実装した、変分量子時間発展(Variational Quantum Time Evolution)のプリミティブ対応アルゴリズムを追加。 この qiskit.algorithms.VarQRTE クラスは実数、 qiskit.algorithms.VarQITE クラスは変分原理による虚数量子時間進化に使用される。

    各アルゴリズムは、抽象インターフェースを実装する変分原理を受け入れる。 ImaginaryVariationalPrinciple を実装する変分原理を受け入れる。 以下の実装が含まれる:

    例:

    from qiskit.algorithms import TimeEvolutionProblem, VarQITE
    from qiskit.algorithms.time_evolvers.variational import ImaginaryMcLachlanPrinciple
    from qiskit.circuit.library import EfficientSU2
    from qiskit.quantum_info import SparsePauliOp
    import numpy as np
    
    observable = SparsePauliOp.from_list(
        [
            ("II", 0.2252),
            ("ZZ", 0.5716),
            ("IZ", 0.3435),
            ("ZI", -0.4347),
            ("YY", 0.091),
            ("XX", 0.091),
        ]
    )
    
    ansatz = EfficientSU2(observable.num_qubits, reps=1)
    init_param_values = np.zeros(len(ansatz.parameters))
    for i in range(len(ansatz.parameters)):
        init_param_values[i] = np.pi / 2
    var_principle = ImaginaryMcLachlanPrinciple()
    time = 1
    evolution_problem = TimeEvolutionProblem(observable, time)
    var_qite = VarQITE(ansatz, var_principle, init_param_values)
    evolution_result = var_qite.evolve(evolution_problem)
  • 変換ルールを追加 XXPlusYYGateXXMinusYYGateSessionEquivalenceLibrary を他のゲートに変換するルールを追加した。 これにより transpile() バックエンドまたは Target これらのゲートを使用する

  • 2つの新しいフェイクバックエンドを追加、 FakePragueFakeSherbrookeqiskit.providers.fake_provider モジュールに FakePrague は、 IBM Prague Egret R1 のプロパティのスナップショットをバックエンドに提供します。 FakeSherbrooke は、 IBM Sherbrooke Eagle R3 のプロパティのスナップショットを持つバックエンドを提供します。

  • に新しいキーワード引数 allow_unknown_parameters を追加。 ParameterExpression.bind()ParameterExpression.subs() メソッドに追加された。 この新しい引数を設定すると、これらのメソッドに未知のパラメータを含む辞書を渡してもエラーが発生しなくなる。 以前は、この動作を無効にする方法がなく、常にエラーが発生していた。

  • メソッドの BaseEstimator.run() メソッドの引数 observables は、すでに受け付けられている他の型に加えて、 str または str の一連の入力型を受け付けるようになった。 オブジェクトのコンストラクタが受け付けるパウリ文字列表現と一致しなければならない。 Pauli オブジェクトの

  • 新しいコンストラクタ・メソッド QuantumCircuit.from_instructions() メソッドを追加した。 QuantumCircuit オブジェクトを作成できる新しいコンストラクタ・メソッドを追加しました。 例:

    from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
    from qiskit.circuit.quantumcircuitdata import CircuitInstruction
    from qiskit.circuit import Measure
    from qiskit.circuit.library import HGate, CXGate
    
    
    qr = QuantumRegister(2)
    cr = ClassicalRegister(2)
    instructions = [
        CircuitInstruction(HGate(), [qr[0]], []),
        CircuitInstruction(CXGate(), [qr[0], qr[1]], []),
        CircuitInstruction(Measure(), [qr[0]], [cr[0]]),
        CircuitInstruction(Measure(), [qr[1]], [cr[1]]),
    ]
    circuit = QuantumCircuit.from_instructions(instructions)
    circuit.draw("mpl")
    _images/legacy_release_notes-3.png
  • この Clifford クラスは、コンストラクタでオプションの copy キーワード引数を取るようになりました。 False に設定すると、入力として与えられた StabilizerTable はコピーされず、直接使用される。 テーブルのデータが他の手段で変更されることがないのであれば、これはパフォーマンス上有益である。

  • の性能は Clifford.compose() はすべての量子ビット数で大幅に改善された。 20量子ビットの演算子では、100倍のスピードアップとなる。

  • 新しい合成機能を追加 synth_clifford_layers()合成関数 Clifford をレイヤーに合成する アルゴリズムはSに基づいている。 Bravyi、D. Maslov、Hadamard-free circuits expose the structure of Clifford group、 arxiv:2003.09412. これにより、クリフォードは2層のCZゲートと1層のCXゲートを含む8層のゲートに分解される。 例えば、5量子ビットのクリフォード回路は以下のレイヤーに分解される:

         ┌─────┐┌─────┐┌────────┐┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐
    q_0:0    ├┤0    ├┤0       ├┤0    ├┤0    ├┤0    ├┤0    ├┤0
         │     ││     ││        ││     ││     ││     ││     ││        │
    q_1:1    ├┤1    ├┤1       ├┤1    ├┤1    ├┤1    ├┤1    ├┤1
         │     ││     ││        ││     ││     ││     ││     ││        │
    q_2:2 S2 ├┤2 CZ ├┤2 CX_dg ├┤2 H2 ├┤2 S1 ├┤2 CZ ├┤2 H1 ├┤2 Pauli ├
         │     ││     ││        ││     ││     ││     ││     ││        │
    q_3:3    ├┤3    ├┤3       ├┤3    ├┤3    ├┤3    ├┤3    ├┤3
         │     ││     ││        ││     ││     ││     ││     ││        │
    q_4:4    ├┤4    ├┤4       ├┤4    ├┤4    ├┤4    ├┤4    ├┤4
         └─────┘└─────┘└────────┘└─────┘└─────┘└─────┘└─────┘└────────┘

    この方法により Clifford を2qubitの深さで 7n+27n+2

  • いくつかの標準ライブラリ・ゲート・クラスの power() メソッドの戻り値の型が更新され、より特定のゲート・オブジェクトを返すようになりました。 例えば power() を実行すると IGate インスタンスを返すようになった。 UnitaryGate の代わりにインスタンスを返すようになった。

    改善された出力タイプの全リストは以下の通り:

  • を内部的に表現している。 EquivalenceLibrary は内部的に PyDiGraph として表現されるようになった。 graph 属性からアクセスできる。 この属性はQiskit内部で使用されることを意図しているため、内部等価グラフの破損の可能性を防ぐために、ユーザーによって変更される前に常にコピーされるべきである。

  • コンストラクタの Operator.from_circuit() コンストラクタ・メソッドは、トランスパイラのルーティング/スワップ・マッピング・ステージによって引き起こされた出力の並べ替えを逆にするようになった。 デフォルトでは、トランスパイルされた回路にSwapゲートが挿入されていた場合、出力行列はその順列が反転されるため、返される行列はトランスパイルされていない元の回路と等しくなります。 このデフォルトの動作を無効にしたい場合は、 ignore_set_layout キーワード引数を True に設定することで、これを行うことができます(トランスコンパイルによる初期レイアウトを無視する従来の動作に加えて)。 最終的なレイアウトを手動で設定したい場合は、新しい final_layout キーワード引数を使用して、出力順列に使用する Layout オブジェクトを渡すことができます。

  • トランスパイラー・パスに GateDirection を扱うトランスパイラ・パスのサポートを追加した。 RXXGate, RYYGateおよび RZZGate ゲートを扱えるようにした。 これでパスはこれらのゲートを正しく処理し、他の変更を加えることなくqargsの順序を単純に逆にする。

  • Python、指数演算子 **、オブジェクトでの使用がサポートされた。 Gate オブジェクトの使用がサポートされました。 これは Gate.power() メソッドを実行することと同じである。

    例:

    from qiskit.circuit.library import XGate
    
    sx = XGate() ** 0.5
  • モジュールに新しいパルス形状 GaussianSquareDrag を追加。 qiskit.pulse.library モジュールに追加した。 このパルス形状は GaussianSquare に似ているが Drag 形状を使用する。 DRAGパルス形状による補正は、パルスの立ち上がりと立ち下がりの周波数スペクトルの一部を抑制することができ、パルスの駆動周波数と周波数が近い場合に励起される量子ビットを回避するのに役立ちます。

  • のコンストラクタに新しいキーワード引数 method を追加。 FiniteDiffEstimatorGradient および FiniteDiffSamplerGradient クラスのコンストラクタに新しいキーワード引数 method 引数は、勾配に使用する計算方法を示す文字列を受け付ける。 "central""forward""backward" の3つの方法がある。 メソッドの定義は以下の通り:

    メソッド
    計算
    "central"f(x+e)f(xe)2e\frac{f(x+e)-f(x-e)}{2e}
    "forward"f(x+e)f(x)e\frac{f(x+e) - f(x)}{e}
    "backward"f(x)f(xe)e\frac{f(x)-f(x-e)}{e}

    ここで、 ee はオフセットのイプシロンである。

  • のすべてのグラデーション・クラスは、パラメータ化されていない操作を保持するようになった。 qiskit.algorithms.gradients のすべての勾配クラスは、パラメータ化されていない演算を保持するようになった。 これにより、個々のプリミティブが扱えるカスタムで不透明なゲート上で勾配を評価することができ、勾配回路が構築された後も、最適化された合成とコンパイルのために高い抽象度を保つことができる。

  • を追加した。 TranslateParameterizedGates パスが追加され、回路内のパラメータ化されたゲートだけを指定された基底にマップし、パラメータ化されていないゲートはそのままにすることができるようになった。 このパスでは、まずアンロールを試み、パラメータ化されたゲートがそれ以上アンロールできない場合に最終的にトランスレートする。

  • トランスパイラー CollectCliffords トランスパイラー・パスは、"クリフォード・ゲート "のブロックを収集し、オブジェクトに結合するように拡張された。 Clifford ここで、"クリフォードゲート "には、以下の型のオブジェクトも含まれる。 LinearFunction, CliffordPauliGate. 例:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import LinearFunction, PauliGate
    from qiskit.quantum_info.operators import Clifford
    from qiskit.transpiler.passes import CollectCliffords
    from qiskit.transpiler import PassManager
    
    # Create a Clifford
    cliff_circuit = QuantumCircuit(2)
    cliff_circuit.cx(0, 1)
    cliff_circuit.h(0)
    cliff = Clifford(cliff_circuit)
    
    # Create a linear function
    lf = LinearFunction([[0, 1], [1, 0]])
    
    # Create a pauli gate
    pauli_gate = PauliGate("XYZ")
    
    # Create a quantum circuit with the above and also simple clifford gates.
    qc = QuantumCircuit(4)
    qc.cz(0, 1)
    qc.append(cliff, [0, 1])
    qc.h(0)
    qc.append(lf, [0, 2])
    qc.append(pauli_gate, [0, 2, 1])
    qc.x(2)
    
    # Run CollectCliffords transpiler pass
    qct = PassManager(CollectCliffords()).run(qc)

    すべてのゲートが集められ、1つにまとめられる。 Clifford. こうして、最終的な回路は1つのオブジェクトで構成される。 Clifford オブジェクトで構成される。

  • CouplingMap の出力を反復するのと同じである。 CouplingMap.get_edges(). 言い換えれば、"忖度 "である、

    from qiskit.transpiler import CouplingMap
    coupling = CouplingMap.from_line(3)
    list(coupling) == list(coupling.get_edges())

    が期待通りに機能するようになった。 これは純粋に構文上の便宜である。

  • 新しい関数 synth_cnot_count_full_pmh() この関数は、Patel、Markov、Hayesの各手法を使用して、全対全アーキテクチャ用の線形可逆回路を合成するために使用されます。 この関数は、利用可能な qiskit.transpiler.synthesis.cnot_synth() 関数と同じですが、より分かりやすい名前を持っており、パッケージツリーにより論理的に配置されています。 この新しい関数は、おそらく将来のリリースで非推奨となるであろうレガシー関数に取って代わるものである。

  • InstructionScheduleMap は、バックエンドのキャリブレーションデータを PulseQobj JSON形式で保存し、データが初めてアクセスされたときに変換を呼び出す、つまり遅延変換を行うように更新されました。 この内部ロジックの更新により、特に多くの検量線エントリーを持つバックエンドのロードパフォーマンスが劇的に改善されました。

  • 新しいモジュール qiskit.pulse.calibration_entries が追加されました。 これは、異なるパルス・スケジュール表現のためのいくつかのラッパークラスを含んでいます。

    • ScheduleDef
    • CallableDef
    • PulseQobjDef

    これらのクラスは、それぞれパルススケジュールと割り当てるパラメータ名を返す get_schedule()get_signature() メソッドを実装しています。 これらのクラスは InstructionScheduleMap またはバックエンド Targetによって内部的に管理されるため、一般的なユーザ・プログラムには表示されません。

  • のサブクラスとして、新しいサブクラス ScalableSymbolicPulse を導入した。 SymbolicPulse. 新しいサブクラスは SymbolicPulseただし、パルスのエンベロープが ampei×angle\text{amp} * e^{i \times \text{angle}} 形式の複素振幅前係数を含むと仮定します。このエンベロープ形状は、Qiskit Pulseライブラリのすべてのパルスを含む、多くの一般的なパルスにマッチします(このリリースでは、 amp, angle 表現にも変換されました)。

    新しいサブクラスは、 ampangle 表現の非一意性を取り除き、複素振幅に従ってパルスを正しく比較する。

  • メソッドに新しいキーワード引数 dtype を追加。 PauliSumOp.from_list() メソッドに追加した。 この引数を指定すると、構築された配列が内部的に使用するnumpy配列の dtypeSparsePauliOp が内部的に使用する PauliSumOp.

  • Qiskit に OpenQASM 3 プログラムをインポートするためのサポートが追加されました。 これは、関数 qasm3.loads()qasm3.load()関数を使って、それぞれ文字列から直接プログラムをロードしたり、ファイル名から間接的にロードしたりすることができる。 例えば、こんなことができるようになった:

    from qiskit import qasm3
    
    circuit = qasm3.loads("""
      OPENQASM 3.0;
      include "stdgates.inc";
    
      qubit q;
      qubit[5] qr;
      bit c;
      bit[5] cr;
    
      h q;
      c = measure q;
    
      if (c) {
        h qr[0];
        cx qr[0], qr[1];
        cx qr[0], qr[2];
        cx qr[0], qr[3];
        cx qr[0], qr[4];
      } else {
        h qr[4];
        cx qr[4], qr[3];
        cx qr[4], qr[2];
        cx qr[4], qr[1];
        cx qr[4], qr[0];
      }
      cr = measure qr;
    """)

    これでプログラムは QuantumCircuitcircuit インスタンスにロードします。

    Qiskit にはまだ高度な古典的データ処理を表現する方法がないため、最初は OpenQASM 3 のすべての機能がサポートされているわけではない。 輸入業者の能力は、Qiskitの他の部分の能力とともに向上する。 インポーターの初期特徴セットは、エクスポーターが出力する特徴セットとほぼ同じである(qasm3.dump()qasm3.dumps()).

    Qiskitが OpenQASM 3をサポートするのは、sを完全にロスレスで表現するためではないことに注意。 QuantumCircuits. そのためには qiskit.qpy.

  • によって定義された primitives-で定義される勾配クラスに基づく。 BaseEstimatorGradient および BaseSamplerGradient 抽象クラスによって定義されたベース・グラデーション・クラスが更新されました。 _preprocess()_postprocess()_run_unique() の3つの新しい内部オーバーライド可能メソッドがある。 _preprocess() _postprocess 、出力結果をカスタマイズすることができる。、ユニークなパラメータを持つ回路の勾配を計算することができる。 _run_unique

  • トランスパイラー・パスは SabreLayout トランスパイラー・パスはRustで書き直されたため、パフォーマンスが大幅に向上した。 この書き換えの一環として、パスは解析パスから、レイアウトとルーティングの両方を実行する変換パスに変更された。 これは、実行時のパフォーマンスを向上させるだけでなく、結果の質を向上させるために行われた。 手動で routing_pass 引数を設定するか、新しい skip_routing 引数を使用することで、分析パスとしての以前の機能を保持することができる。

  • トランス SabreLayout トランスパイラー・パスは、新しいコンストラクター引数 layout_trials を持つ。 この引数は、乱数ジェネレーターの種をいくつ使用するかを制御するために使用される。 SabreLayout を指定します。 設定すると、SABREレイアウト・アルゴリズムが layout_trials 回実行され、最も品質の高い出力(スワップ・ゲートの追加数が最も少ないことで測定)が選択される。 これらのシードトライアルは、レイアウトを複数回実行することによる潜在的なパフォーマンスオーバーヘッドを最小化するために、マルチスレッドを使って並列実行される。 デフォルトでは、これを指定しないと SabreLayout パスのデフォルトは、ローカルシステムで利用可能な物理 CPU の数を使用する。

  • 新しいクラスを2つ追加 SciPyRealEvolverSciPyImaginaryEvolver を追加しました。 観測値の値と標準偏差、およびそれらが評価される時間は、次のように問い合わせることができる。 TimeEvolutionResult.observables そして TimeEvolutionResult.times. 例:

    from qiskit.algorithms.time_evolvers.time_evolution_problem import TimeEvolutionProblem
    from qiskit.quantum_info import SparsePauliOp
    from qiskit.quantum_info.states.statevector import Statevector
    from qiskit.algorithms import SciPyImaginaryEvolver
    
    initial_state = Statevector.from_label("+++++")
    hamiltonian = SparsePauliOp("ZZZZZ")
    evolution_problem = TimeEvolutionProblem(hamiltonian, 100, initial_state, {"Energy":hamiltonian})
    classic_evolver = SciPyImaginaryEvolver(num_timesteps=300)
    result = classic_evolver.evolve(evolution_problem)
    print(result.observables)
  • を追加。 SolovayKitaev 離散ゲートセットを使用した1量子ビットユニタリー近似のためのSolovay-Kitaevアルゴリズムを実行するトランスパイラーパスを追加。 基底変換器と組み合わせることで、あらゆるユニタリー回路を、フォールト・トレラントに実装可能なユニバーサル離散ゲートセットに変換することができる。

    このパスは、例えば、UゲートやCXゲートにコンパイルした後に使うことができる:

    from qiskit import transpile
    from qiskit.circuit.library import QFT
    from qiskit.transpiler.passes.synthesis import SolovayKitaev
    
    qft = QFT(3)
    
    # optimize to general 1-qubit unitaries and CX
    transpiled = transpile(qft, basis_gates=["u", "cx"], optimization_level=1)
    
    skd = SolovayKitaev()  # uses T Tdg and H as default basis
    discretized = skd(transpiled)
    
    print(discretized.count_ops())

    この分解は、ユニタリー合成プラグインでも使用できる。 UnitarySynthesis トランスパイラ・パスの

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import Operator
    from qiskit.transpiler.passes import UnitarySynthesis
    
    circuit = QuantumCircuit(1)
    circuit.rx(0.8, 0)
    unitary = Operator(circuit).data
    
    unitary_circ = QuantumCircuit(1)
    unitary_circ.unitary(unitary, [0])
    
    synth = UnitarySynthesis(basis_gates=["h", "s"], method="sk")
    out = synth(unitary_circ)
    
    out.draw('mpl')
    _images/legacy_release_notes-4.png
  • によるランダム回路生成は qiskit.circuit.random.random_circuit() によるランダム回路生成は、大規模な回路で大幅に高速化されました。

  • によるランダム回路生成 qiskit.circuit.random.random_circuit() はQiskitの回路ライブラリ(qiskit.circuit.library).これには2つの4量子ビットゲート C3SXGateRC3XGatemax_operands の許容値が拡張されました。

  • トランス Optimize1qGatesDecomposition トランスパイラ・パスのコンストラクタには、新しいキーワード引数 target がある。 この引数は Target オブジェクトを指定することができる。 使用する場合は、 basis の引数を優先し、回路内の命令がターゲット・バックエンドに存在するかどうかを判断する。

  • トランス UnrollCustomDefinitions トランスパイラ・パスのコンストラクタには、新しいキーワード引数 target がある。 この引数は Target オブジェクトを指定することができる。 使用する場合は、 basis_gates の引数を優先し、回路内の命令がターゲット・バックエンドに存在するかどうかを判断する。

  • を追加した。 ReverseEstimatorGradient クラスが追加され、バックプロパゲーションまたはリバースモード勾配に基づく期待値勾配の古典的な高速評価が可能になった。 このクラスは状態ベクトルを使用するため、正確な勾配が得られるが、システム・サイズが指数関数的に大きくなる。 これは、より小さなシステム・サイズの高速リファレンス計算用に設計されている。 例えば、次のように使うことができる:

    from qiskit.circuit.library import EfficientSU2
    from qiskit.quantum_info import SparsePauliOp
    from qiskit.algorithms.gradients import ReverseEstimatorGradient
    
    observable = SparsePauliOp.from_sparse_list([("ZZ", [0, 1], 1)], num_qubits=10)
    circuit = EfficientSU2(num_qubits=10)
    values = [i / 100 for i in range(circuit.num_parameters)]
    gradient = ReverseEstimatorGradient()
    
    result = gradient.run([circuit], [observable], [values]).result()
  • クラスのコンストラクタに新しいキーワード引数 use_dagOneQubitEulerDecomposer クラスのコンストラクタに use_dagTrue に設定すると、デコンポーザーからの出力は DAGCircuit オブジェクトになる。 QuantumCircuit オブジェクトになる。 を使用するトランスパイラ・パスに便利です。 OneQubitEulerDecomposer (例えば Optimize1qGatesDecompositionを使うトランスパイラ・パスに便利です。 DAGCircuit との間で変換するオーバーヘッドを回避できるからです。 QuantumCircuitDAGCircuit.

  • 分析パスで VF2Layout および VF2PostLayout トランスパイラ・パスに 分析パスがプロパティセットに vf2_avg_error_map キーを設定した場合、その値はバックエンドの Target (または BackendProperties の場合は BackendV1). 値は ErrorMap インスタンスであるべきで、各値はそれらの量子ビットのすべての1または2量子ビット操作の平均エラーレートを表す。 値が NaN の場合、対応するエッジは理想的なエッジ(または 1q 操作のための量子ビット)として扱われる。 例えば、エラー・マップは次のように作成される:

    from qiskit.transpiler.passes.layout.vf2_utils import ErrorMap
    
    error_map = ErrorMap(3)
    error_map.add_error((0, 0), 0.0024)
    error_map.add_error((0, 1), 0.01)
    error_map.add_error((1, 1), 0.0032)

    1q 0.0024 0.0032 (0,1)で動作するゲートの平均 2q エラー率は 0.01、(1,0)はターゲットでサポートされていない。 これは、 vf2_avg_error_map キーが設定されている場合、採点に使用されます。 VF2LayoutVF2PostLayout が実行されたときに 例:

    from qiskit.transpiler import AnalysisPass, PassManager, Target
    from qiskit.transpiler.passes import VF2Layout
    from qiskit.transpiler.passes.layout.vf2_utils import ErrorMap
    from qiskit.circuit.library import CZGate, UGate
    from qiskit.circuit import Parameter
    
    class CustomVF2Scoring(AnalysisPass):
      """Set custom score for vf2."""
    
      def run(self, dag):
        error_map = ErrorMap(3)
        error_map.add_error((0, 0), 0.0024)
        error_map.add_error((0, 1), 0.01)
        error_map.add_error((1, 1), 0.0032)
        self.property_set["vf2_avg_error_map"] = error_map
    
    
    target = Target(num_qubits=2)
    target.add_instruction(
        UGate(Parameter('theta'), Parameter('phi'), Parameter('lam')),
        {(0,): None, (1,): None}
    )
    target.add_instruction(
        CZGate(), {(0, 1): None}
    )
    
    vf2_pass = VF2Layout(target=target, seed=1234568942)
    pm = PassManager([CustomVF2Scoring(), vf2_pass])

    これは VF2Layouterror_map 、2量子ビットのカスタムスコアで実行されます。 Target で実行されます。

アップグレードの注意

  • のパルス・クラスのいずれかを初期化するとき qiskit.pulse.library:

    複素数 amp の引数に有限 angle を与えると、次のようになる。 PulseError になる。 例えば、 Gaussian(duration=100,sigma=20,amp=0.5j) と呼ぶ代わりに、 Gaussian(duration=100,sigma=20,amp=0.5,angle=np.pi/2) と呼ぶべきだ。 これまで amp * ... と定義されていたパルスエンベロープは、 amp * exp(1j * angle) * ... と定義される。 この変更は、パルスの振幅と角度が別々の実験で校正される Qiskit実験をよりよくサポートするために行われた。

  • Python 3.7 singledispatchmethodが依存関係になった。 これは、 Python の新しいバージョンの標準ライブラリのメソッドディスパッチ機構を活用できるようにするために追加された。 Python >= 3.8 であれば、追加の依存関係は必要ない。

  • 以前は非推奨だった MSBasisDecomposerqiskit.transpiler.passes モジュールは削除されました。 これはもともとQiskit Terra 0.16.0 リリース(10-16-2020)の一部として非推奨となったものです。 代わりに BasisTranslator を持つ適切な基底に回路を変換するために、トランスパイラ・パスを代わりに使うべきである。 RXXGate

  • EquivalenceLibrarybase 属性で初期化されたオブジェクトは、渡された EquivalenceLibrary との共有参照はなくなります。 以前のリリースでは、新しいインスタンスを作成するために baseEquivalenceLibrary インスタンスの両方にその変更が反映されます。 これはもはや事実ではなく、 base のアップデートは新しい EquivalenceLibrary. 例えば、等価ライブラリーを以下のように作成したとする:

    import math
    
    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import XGate
    from qiskit.circuit.equivalence import EquivalenceLibrary
    
    original_lib = EquivalenceLibrary()
    qc = QuantumCircuit(1)
    qc.rx(math.pi, 0)
    original_lib.add_equivalence(XGate(), qc)
    new_lib = EquivalenceLibrary(base=original_lib)

    original_lib

    import from qiskit.circuit.library import SXGate
    
    qc = QuantumCircuit(1)
    qc.rx(math.pi / 2, 0)
    original_lib.add_equivalence(SXGate(), qc)

    以前のリリースでは、 new_lib は、 original_lib に追加された後、 SXGate の定義も含んでいたが、今回のリリースではそうではない。 この変更は、内部データ構造をグラフに変更したためである。 EquivalenceLibrary クラスのパフォーマンスが向上したためです。 BasisTranslator トランスパイラ・パスを複数回実行した場合に特に。

  • クラスのコンストラクタの initial_state 引数は、 属性に直接代入する場合と同様に、 属性でなければならない。 NLocal クラスのコンストラクタの引数は、 NLocal.initial_state 属性に直接代入するのと一緒に QuantumCircuit でなければならない。 この引数および属性に他の型を使用するサポートは終了しました。 その他の型のサポートは、Qiskit Terra 0.18.0 リリース(2021年7月)の一部として非推奨となった。

  • LaTeX 配列ドロワー(例: array_to_latexStatevector.draw('latex') )は、ケット規約ドロワーと同じsympy関数を使用するようになった。 これは、以前のリリースとは異なる数値が表示される可能性があることを意味するが、より一貫したエクスペリエンスを提供する。 例えば、新たな因子を特定したり、以前にはなかった分母を合理化したりする。 デフォルトの precision が5から10に変更された。

  • が発するQPYバージョン・フォーマットのバージョンは、バージョン6に引き上げられた。 dump() はバージョン6に増加した。 この新しいフォーマットのバージョンは以前のバージョンと互換性がなく、QPYバージョン6を扱えないデシリアライザーでロードしようとするとエラーになる。 class_name_size この変更は、 ScalableSymbolicPulse の導入に対応するために必要だった。 SymbolicPulse オブジェクトのヘッダーに

  • __hash__ メソッドが削除された。 SymbolicPulse のメソッドは削除された。 これは、このクラスの(パラメータ割り当てによる)変更可能な性質を反映するためである。 SymbolicPulse を使うとエラーになる可能性があったためです。 つまり、組み込みの hash() メソッドや、キーとして SymbolicPulse を辞書やセット・メンバーのキーとして使うことはできなくなります。

  • インスタンス名 Register インスタンスの名前(これには QuantumRegisterClassicalRegigster のインスタンスも含む) は、もはや有効な OpenQASM 2 識別子に制約されない。 これは、Qiskitが OpenQASM 2からより切り離され、 OpenQASM 3仕様でさえそれほど制限されていないため、制限が厳しすぎるとして行われている。 有効な OpenQASM 2識別子名を持つレジスタに依存していた場合、名前をエスケープする必要がある。 これを単純化すると、例えば次のようになる:

    import re
    import string
    
    def escape(name: str) -> str:
      out = re.sub(r"\W", "_", name, flags=re.ASCII)
      if not out or out[0] not in string.ascii_lowercase:
        return "reg_" + out
      return out
  • メソッド QuantumCircuit メソッド u1, u2, u3, およびそれらの制御された亜種 cu1, cu3 , mcu1 は、 Qiskit Terra 0.16.0 で非推奨となったため削除されました。 これは、通常 IBM -特有のゲート名を削除し、より一般的なメソッドを採用するためである。 p(), u(), cp()cu(). ゲートクラス U1Gate, U2Gate および U3Gate はまだ QuantumCircuit.append()そのため、バックエンドはこれらのゲートを明示的に指定したベースをサポートすることができます。

  • メソッドは削除されました。 QuantumCircuit メソッド combineextend は、Qiskit Terra 0.17.0 で非推奨となったため、削除されました。 これは、これらの関数が単に QuantumCircuit.compose()であるためである。

    extend が削除されたことは、 ++= の演算子も定義されなくなったことを意味する。 QuantumCircuit. 代わりに、 &&= 演算子を使うことができます。 QuantumCircuit.compose().

  • 以前は非推奨だった関数: qiskit.circuit.measure.measure()qiskit.circuit.reset.reset() は削除された。 これらの関数はQiskit Terra 0.19.0 リリース(2021年12月)で非推奨となりました。 代わりに QuantumCircuit.measure()QuantumCircuit.reset() メソッドを使うべきです。 QuantumCircuit オブジェクトの Measure または Reset メソッドを使うべきである。

  • これまで set から継承されていた非推奨の ParameterView メソッドは ParameterView から削除されました。 QuantumCircuit.parameters. 削除された具体的な方法は以下の通り:

    • add()
    • difference()
    • difference_update()
    • discard()
    • intersection()
    • intersection_update()
    • issubset()
    • issuperset()
    • symmetric_difference()
    • symmetric_difference_update()
    • union()
    • update()

    Python :

    • ixor: ^=
    • isub: -=
    • ior: |=

    これらはQiskit Terra 0.17.0 リリース(2021年4月)で非推奨となった。 ParameterView 型は現在、一般的なシーケンス・ビュー型であり、これらの set 操作はサポートされていない。

  • 以前は非推奨だった NetworkX コンバータメソッド DAGCircuitDAGDependency クラスのコンバータ・メソッドは削除されました: DAGCircuit.to_networkx() DAGCircuit.from_networkx() および DAGDependency.to_networkx() の変換メソッドは削除されました。 これらのメソッドはもともと、Qiskit Terra 0.21.0 リリース(2022年6月)の一部として非推奨とされていました。 Qiskitは、qiskit-terra 0.12.0 リリース以来、グラフライブラリとして rustworkxを使用しており、それ以来、 NetworkX コンバータ関数はロッシー処理となっている。 これらはもともと、ユーザーが NetworkX’s アルゴリズム・ライブラリを活用して DAGCircuit やrustworkxにはない機能を利用するために追加された。 しかし、それ以来 DAGCircuit とrustworkxは成熟し、より多くの機能を提供するようになった。 DAGCircuit はrustworkxと緊密に結合して動作しており、これらのコンバーター・メソッドは限られた機能しか提供しないため、削除された。

  • tweedledum はQiskit Terraのコア要件として削除された。 提供されている機能 (qiskit.circuit.classicalfunction)は、 tweedledum を手動でインストールした場合などにも利用可能である:

    pip install tweedledum

    この変更は、 tweedledum の開発が新しい Python や OS のリリースに追いつかないほど遅くなり、一部の Qiskit ユーザーが Qiskit をインストールするのを妨げていたためです。

  • 怠惰なオプショナル・チェッカー HAS_MATPLOTLIB, HAS_PIL, HAS_PYLATEX および HAS_PDFTOCAIRO はもはや qiskit.visualizationQiskit Terra 0.21 で非推奨となりました。 これら(および他の多くの遅延チェッカー)の標準的な場所は qiskit.utils.optionalsで、4つのオブジェクトはすべてそこにある。

  • のコンストラクタへの gate 引数が削除されました。 Decompose トランスパイラ・パスのコンストラクタへの引数、およびそれにマッチする属性 Decompose.gate は削除されました。 この引数と属性は、Qiskit Terra 0.19.0 リリース(2021年12月)の一部として非推奨となりました。 代わりに、コンストラクタの引数 gates_to_decomposeDecompose.gates_to_decompose 属性を使用する。 gates_to_decompose の引数と属性は同じように機能するはずだが、より明示的な名前を持ち、単一のゲートだけをサポートするのではなく、ゲートのリストを指定することもできる。

  • のコンストラクタの label 引数は、以前は非推奨だった。 MCMTMCMTVChain クラスのコンストラクタの引数は削除されました。 Qiskit Terra 0.19.0 リリース(2021年12月)時点で非推奨となりました。 のサブクラスであるため、これらのクラスで labelQuantumCircuit ではなく Instruction. その結果、割り当てられたラベルは一般的に無視されることになる。 のインスタンスに labelMCMT または MCMTVChain のインスタンスに割り当てる必要がある場合は Gate インスタンスに変換して to_gate() でインスタンスに変換し label 属性に割り当てます。 例:

    from qiskit.circuit.library import MCMT, XGate
    
    mcmt_circuit = MCMT(XGate(), 3, 2)
    mcmt_gate = mcmt_circuit.to_gate()
    mcmt_gate.label = "Custom MCMT X"
  • Qiskit 用の retworkx 依存関係は削除され、 rustworkx ライブラリに置き換えられました。 これらは同じパッケージだが、 rustworkxretworkx の新しい名前で、 0.12.0 のリリースの一部として名前が変更された。 以前Qiskitでretworkx 0.12.0 を使用していた場合、すでにrustworkxがインストールされています(retworkx 0.12.0 は後方互換性のための単なるリダイレクトシムでした)。 この変更は、今後サポートされる唯一のパッケージとなる新しいパッケージ名に移行するために行われました。

  • コンパイラー・パスのデフォルト動作 SabreLayout コンパイラパスのデフォルトの動作が変更されました。 パスはもはや AnalysisPass デフォルトでは、初期レイアウトを計算し、それを回路に適用します。 SabreSwap を内部的に実行し、スワップ・マッピングを適用し、スワップ挿入による順列で final_layout プロパティを設定します。 つまり SabreLayout をカスタム PassManager の引数 routing_pass を設定している場合を除く)。 SabreLayout). レイアウトとルーティングの品質は高度に連関している。 SabreLayout どのシードが最良の結果をもたらすかを計算するためには、レイアウトとルーティングの両方を一緒に実行する必要があります。 カスタムパスマネージャーで使用量を調整するには3つの方法があります。 一つ目は、プリセット・パス・マネージャーでエンベッディングを使わないこと。 もしあなたが以前、次のようなことをやっていたとしたら:

    from qiskit.transpiler import PassManager
    from qiskit.transpiler.preset_passmanagers import common
    from qiskit.transpiler.passes.SabreLayout
    
    pm = PassManager()
    pm.append(SabreLayout(coupling_map)
    pm += common.generate_embed_passmanager(coupling_map)

    レイアウトを計算し、それを適用する(これは通常、ルーティングに続いて行われる):

    from qiskit.transpiler import PassManager
    from qiskit.transpiler.preset_passmanagers import common
    from qiskit.transpiler.passes.SabreLayout
    
    pm = PassManager()
    pm.append(SabreLayout(coupling_map)

    として SabreLayout を実行するとレイアウトが適用され、埋め込みステージは必要なくなります。 あるいは、 routing_pass 引数を指定することもできる。 SabreLayout に戻る。 例えば SabreLayout を以前のリリースと同じように実行したい場合は、次のようにすることができる:

    from qiskit.transpiler.passes import SabreSwap, SabreLayout
    routing_pass = SabreSwap(
        coupling_map, "decay", seed=seed, fake_run=True
    )
    layout_pass = SabreLayout(coupling_map, routing_pass=routing_pass, seed=seed)

    これは SabreLayout を分析パスとして実行し、 layout プロパティセットを設定するだけである。 最後のアプローチは、 SabreLayoutskip_routing 引数を活用することである。この引数を True に設定すると、見つかったレイアウトの適用と配線からのスワップ・ゲートの挿入がスキップされる。 しかし、 SabreLayout 、ルーティングを計算することに変わりはなく、このデータを使用しないだけであるため、これを行うとランタイムペナルティが発生する。 最初に説明した2つのアプローチには、追加的なオーバーヘッドはない。

  • によって計算されたレイアウトは、以前のリリースから変更される可能性があります。 SabreLayout パスで計算されたレイアウトは( routing_pass 引数を指定せずに実行した場合)、以前のリリースと変更される可能性があります。 の書き換えの一環として新しい乱数ジェネレーターが使用されたためである。 SabreLayout パスの書き換えの一環として新しい乱数生成器が使われたためである。 一貫性のある出力に依存する場合は、以前のバージョンのQiskitでパスを実行し、回路を保存してから現在のバージョンでロードするために qiskit.qpy を活用して回路を保存し、現在のバージョンでロードすることができます。 routing_pass のインスタンスに明示的に設定することもできる。 SabreSwap のインスタンスに設定することもできる。 SabreLayout:

    from qiskit.transpiler.passes import SabreSwap, SabreLayout
    
    
    routing_pass = SabreSwap(
        coupling_map, "decay", seed=seed, fake_run=True
    )
    layout_pass = SabreLayout(coupling_map, routing_pass=routing_pass, seed=seed)

    これは以前のリリースでのパスの動作を反映したものである。 以前のリリースで swap_trials 引数を SabreLayout 引数 trials を設定する必要があることに注意してください。 SabreSwap 引数を設定する必要があります。

  • 与えられたシードに対して qiskit.circuit.random.random_circuit が返す正確な回路が変更された。 これは、関数内部の乱数生成の効率化によるものである。

  • pip install qiskit-terra[toqm] からインストール可能なオプション機能パッケージ qiskit-toqm のバージョン要件が、バージョン 0.0.4 から 0.1.0 にアップグレードされました。 で toqm ルーティングメソッドを使用するには transpile() を使用するには、qiskit-toqm バージョン 0.1.0 以降を使用する必要があります。 古いバージョンはトランスパイラで検出できなくなった。

  • 出力 QuasiDistributionSampler.run の出力が更新され、確率がゼロの状態がフィルタリングされた。 辞書の出力から有効な状態が欠落している場合、その確率は0であると仮定できる。 以前は、ある状態の確率が0であったとしても、与えられたビット数(例えば、3ビットの結果の場合 000, 001, 010, 011, 100, 101, 110, 111 )に対して起こりうるすべての結果を示していた。 この変更は、ビット数が大きいと出力サイズが非常に大きくなるため、出力サイズを小さくするために行われた。 また、確率ゼロの結果をフィルタリングすることで、他の実装の BaseSampler.

  • が呼び出されたときのパルスビルダーの動作がアップグレードされました。 Schedule が呼び出されたときのパルスビルダの動作がアップグレードされました。 呼び出されたスケジュールは内部的に ScheduleBlock によってラップされたスケジュールを追加するのではなく、常に参照メカニズムが適用されます。 Call 命令でラップされたスケジュールを追加するのではなく、常に参照メカニズムが適用されます。 変換されたブロックは、元のアライメント・コンテキストを回復する必要はないことに注意。 これは、絶対的な時間間隔を持つパルス命令のシーケンスをASAPで整列させただけのものである。 これは、呼び出されたパルス・プログラムの内部表現のアップグレードであり、APIの変更はない。 しかし Call 命令と Schedule は、もはやビルダーのパルス・プログラムには現れない。 この変更により、生成されるスケジュールブロックは常にQPYと互換性があることが保証される。 によって出力スケジュールの指示をフィルタリングしている場合、以下のようにアクセスすることができます。 Callでフィルタリングしている場合は ScheduleBlock.references にアクセスすることができる。

  • RZXCalibrationBuilderRZXCalibrationBuilderNoEcho を生成するようにアップグレードされました。 ScheduleBlock. この変更により、トランスパイルされた回路は常にQPY互換であることが保証される。 を直接使用している場合 rescale_cr_inst()このメソッドはパルスビルダー・マクロになっており、新しいリリースに対応するためにはパルスビルダー・コンテキスト内でこのメソッドを使用する必要があります。 このメソッド呼び出しは、伸張されたパルスを持つ命令を返す代わりに、再生命令をコンテキストパルスプログラムに注入する。 Play 命令は返されない。

非推奨のメモ

  • Python 3.7 サポートでQiskitを実行するためのサポートは非推奨となり、qiskit-terra 0.25.0 リリースで削除される予定です。 つまり、 0.25.0 リリースから、使用している Python バージョンを Python 3.8 以上にアップグレードする必要があります。

  • クラス LinearFunctionsSynthesis クラスは現在非推奨となっており、将来のリリースで削除される予定です。 このクラスは、より一般的な HighLevelSynthesis クラスに取って代わられた。 のインスタンスをインスタンス化することができる。 HighLevelSynthesisLinearFunctionSynthesis のインスタンスをインスタンス化することができます:

    from qiskit.transpiler.passes import HighLevelSynthesis
    from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig
    
    HighLevelSynthesis(
        HLSConfig(
            linear_function=[("default", {})],
            use_default_on_unspecified=False,
        )
    )
  • 関数に引数値のリストを渡すサポートは廃止予定です。 transpile() 関数に引数値のリストを渡すサポートは非推奨であり、 0.25.0 リリースで削除される予定です。 これは、複数の回路を一度にトランスパイルする際の並列実行のオーバーヘッドを大幅に削減するために行われている。 現在この機能を使用している場合は、代わりに transpile() を複数回呼び出すことができます。 例えば、以前はこんなことをしていたとする:

    from qiskit.transpiler import CouplingMap
    from qiskit import QuantumCircuit
    from qiskit import transpile
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)]
    results = transpile([qc] * 6, coupling_map=cmaps)

    代わりに、次のようなものを実行する必要がある:

    from itertools import cycle
    from qiskit.transpiler import CouplingMap
    from qiskit import QuantumCircuit
    from qiskit import transpile
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)]
    
    results = []
    for qc, cmap in zip(cycle([qc]), cmaps):
        results.append(transpile(qc, coupling_map=cmap))

    を活用することもできる。 parallel_map() または Python 標準ライブラリの multiprocessing を利用することもできる。

  • qiskit.visualization.pulse に存在するレガシーバージョンのパルスドローワーは非推奨であり、将来のリリースで削除される予定である。 これには ScheduleDrawer と :class`WaveformDrawer` クラスが含まれる。 このモジュールは、 qiskit.visualization.pulse_v2 引出しに取って代わられ、典型的なユーザーAPI pulse_drawer()PulseBlock.draw() はすでに内部的に qiskit.visualization.pulse_v2 を使うように更新されている。

  • pulse.Instruction.draw() メソッドは非推奨となり、将来のリリースでは削除される予定です。 このメソッドの必要性は、 qiskit.visualization.pulse_v2 のドロワーに取って代わられた。このドロワーでは、 Instrucion オブジェクトが独自の draw メソッドを持つ必要はない。 パルス命令を描画する必要がある場合は、代わりに pulse_drawer() 代わりに

  • QPYがトップレベルに昇格したため、インポート qiskit.circuit.qpy_serialization は非推奨。 同じオブジェクトを qiskit.qpy からインポートすべきである。 古いパスは、将来のQiskit Terraで削除される。

  • qiskit.IBMQ オブジェクトは非推奨。 このエイリアス・オブジェクトは、属性へのアクセスを qiskit.providers.ibmq.IBMQ にリダイレクトする。 qiskit-ibmq-provider パッケージは、独自の名前空間を維持する qiskit-ibm-provider パッケージに取って代わられたため、このエイリアスを維持することは、新しいパッケージではもはや意味をなさない。 qiskit.IBMQ のエイリアスに依存していた場合は、代わりに qiskit.providers.ibmq.IBMQ を直接使用するように使用方法を更新する必要があります(また、 qiskit-ibm-provider への移行も検討してください。詳細は移行ガイドを参照してください)。

  • パルスQobjコンバータのいくつかのパブリック・メソッドは非推奨となり、将来のリリースでは直接呼び出せなくなります。 メソッドのリストは以下の通り:

    InstructionToQobjConverter

    • convert_acquire()
    • convert_bundled_acquires()
    • convert_set_frequency()
    • convert_shift_frequency()
    • convert_set_phase()
    • convert_shift_phase()
    • convert_delay()
    • convert_play()
    • convert_snapshot()

    QobjToInstructionConverter

    • convert_acquire()
    • convert_set_phase()
    • convert_shift_phase()
    • convert_set_frequency()
    • convert_shift_frequency()
    • convert_delay()
    • bind_pulse()
    • convert_parametric()
    • convert_snapshot()

    これらのメソッドを直接呼び出す代わりに、コンバーターのインスタンスが直接呼び出されたときに暗黙的に選択される。 例:

    converter = QobjToInstructionConverter()
    converter(pulse_qobj)
  • qiskit.visualization.state_visualization.num_to_latex_ket()qiskit.visualization.state_visualization.num_to_latex_terms() 関数は非推奨となり、将来のリリースで削除される予定です。 これらの関数は、主に LaTeX からの出力によって内部的に使用されていた。 Statevector.draw()DensityMatrix.draw() の出力で主に内部的に使用されていたもので、現在はこれらの関数を使用しておらず、代わりに sympyを活用している。 これらの関数を使用していた場合は、Sympy の nsimplify() latex() 関数を使用することをお勧めします。

  • Register.qasm() メソッドは非推奨であり、将来のリリースで削除される予定である。 このメソッドは、サブクラス QuantumRegisterClassicalRegister. この非推奨は、 qasm() メソッドが、 OpenQASM 2への安全な変換の責任者についての誤った見方を助長するためである。単一のオブジェクトだけでは、有効な識別子を生成するためにエスケープした後にその名前が衝突するかどうかといった、安全な変換を提供するためのコンテキストを持たない。

  • クラス変数正規表現 Register.name_format は非推奨であり、将来のリリースで削除される予定です。 レジスター名は、有効な Python 文字列であれば何でも許されるようになったので、正規表現はもう使えない。

  • 関数 qiskit.quantum_info.synthesis.decompose_clifford()qiskit.quantum_info.synthesis.decompose_cnot_dihedral() は非推奨であり、将来のリリースで削除される予定である。 これらの関数は qiskit.synthesis.synth_clifford_full()qiskit.synthesis.synth_cnotdihedral_full() に置き換えられる。

バグ修正

  • メソッドの問題を修正しました。 PauliOp.adjoint()PauliOp(Pauli("iX")) メソッドで、複素数の係数を持つポーリスに対して正しい値を返してしまう問題を修正した。 修正 #9433

  • qiskit.algorithms.amplitude_estimators モジュールの振幅推定アルゴリズム ( amplitude_estimators を参照) の問題を修正しました。 BaseSampler プリミティブ(たとえば SamplerBackendSampler). 以前は、測定結果が実際に測定されたビット数よりも多く拡張されていたため、1つ以上の量子ビットを持つオラクルでは、オラクルの "良い "量子状態の検出に誤差が生じる可能性があった。

  • QuantumCircuit.add_calibrations()DAGCircuit.add_calibrations() メソッドで、パラメータ・フォーマット・ロジックの動作に不一致があった問題を修正。 これまでの DAGCircuit.add_calibrations() は、すべてのパラメーターを float にキャストしようとしていた。 QuantumCircuit.add_calibrations() は、与えられたパラメーターをそのまま使っていた。 で実行すると、エラーを引き起こす可能性がある。 transpile() これは QuantumCircuit 較正のパラメーターが ParameterExpresion

  • QPYの(qiskit.qpy) load() 関数のデシリアライズ問題を修正した。 MCXGate, MCXGrayCode, MCXRecursiveおよび MCXVChain を含む回路はデシリアライズに失敗する。 修正 #9390

  • の問題を修正しました。 TensoredOp.to_matrix() 演算子のグローバル係数が最終行列に複数回乗算される問題を修正しました。 これで、テンサードされた演算子やステートの数に関係なく、グローバル係数が正しく適用されるようになった。 修正 #9398

  • メソッドからの出力は run() メソッドからの出力は BackendSamplershots stddev_upper_bound クラスのメソッドからの出力は、返された QuasiDistribution. 以前は、これらの属性が欠落していたため、出力を使用したいくつかの後処理ができなかった。 修正 #9311

  • OpenQASM 2 エクスポーター・メソッド QuantumCircuit.qasm() は、デフォルトでゲート・パラメータにより高精度の浮動小数点数を出力するようになりました。 さらに、与えられたパラメータが π\pi の分数/累乗に近いかどうかを確認する際に、より厳しい境界( 1e121e-12 1e61e-6 )が使用されます。 #7166 を修正しました。

  • のサポートを修正した。 primitives モジュールのサポートを修正した。 QuantumCircuit オブジェクトの実行をサポートした。 IfElseOp). 以前は、 BaseSamplerBaseEstimator の基本クラスは、このような回路を正しく正規化できなかった。 しかし、これらの回路の実行は、制御フロー命令をサポートするプリミティブの特定の実装に依存する。 これは、 BaseSampler または BaseEstimator の特定の実装が制御フロー命令を使用できるようにサポートを修正しただけである。

  • PauliOp.matmul() メソッドで、 iI で正しくない結果を返す問題を修正した。 修正 #8680

  • 近似量子コンパイラ(AQC)クラスで,入力ユニタリーが -1 の行列式を持っている場合に不正な回路を返してしまう問題を修正しました. 修正 #9327

  • メソッドの問題を修正しました。 QuantumCircuit.compose() メソッドが有効なqubitまたはclbit指定子を誤って拒否する問題を修正しました。 これは修正され、このメソッドは他の QuantumCircuit メソッドと同じ append(). 修正 #8691

  • メソッドの問題を修正しました。 QuantumCircuit.compose() メソッドの問題を修正しました。 以前は、マッピングは非常に不正確で、各条件内で使用されるビットはマッピングの対象ではなく、代わりに対応するレジスタを見つける不正確な試みが行われていた。 これはまた、より小さなレジスタ上の条件が、より大きなレジスタ上に展開されることになりかねず、これは有効な変換ではない。 これで、1つのビットまたは1つのレジスタに対する条件は、 clbits の引数で定義されたビットに対して正確に構成されることになる。 必要であれば、これを容易にするために、新しいエイリアシング・レジスタがベース回路に追加される。 修正 #6583

  • の問題を修正しました。 transpile() 関数の問題を修正しました。 optimization_level1, 2, または 3 に設定し、 backend, basis_gates, または target の引数を指定せずに実行した場合。 入力回路に単純化できる単一量子ビットのゲートがあった場合、出力回路はそのような単一量子ビットのゲートが取り除かれていないため、可能な限り最適化されていないことになる。 以前は、 backendbasis_gatestarget のいずれかの引数を呼び出し時に指定することで、これを修正することができた。 transpile() のいずれかを指定することで修正できたが、現在では、許容されるターゲット・ゲートを知らなくても、出力はできる限り簡略化されたものになる。 9217を修正

  • の問題を修正しました。 transpile() 関数を optimization_level=3 、引数 backendbasis_gatestarget を指定せずに実行した場合の問題を修正しました。 もし入力回路に、同一行列と等価な2量子ビットブロックが含まれていれば、出力回路は可能な限り最適化されず、依然としてその同一ブロックを含むことになる。 以前は、 backendbasis_gatestarget のいずれかの引数を呼び出し時に指定することで、これを修正することができた。 transpile() のいずれかを指定することで修正できたが、現在では、許容されるターゲット・ゲートを知らなくても、出力はできる限り簡略化されたものになる。 9217を修正

  • の問題を修正した。 LinCombSamplerGradient で実行するとエラーが発生する可能性がある問題を修正しました。 Sampler クラスを qiskit-aer

  • の問題を修正した。 NumPyEigensolver およびその拡張 NumPyMinimumEigensolver で、 Operator 以外の BaseOperator サブクラスを解くとエラーになる問題を修正した。

  • から出力されるメタデータで、リストが参照によってコピーを作成し、すべての要素が反復ごとに同じ値に更新されていた問題を修正した。 primitives のメタデータ出力で、リストが参照によってコピーを作成し、すべての要素が反復ごとに同じ値で更新される問題を修正しました。

  • QobjToInstructionConverter 、複数のバックエンドが呼び出され、それらが誤ってpulseライブラリで同じpulse名を持っていた場合の問題を修正。 これは、コンバーターのインスタンスが複数のバックエンドで再利用される場合にのみ発生するエッジケースだった(これは典型的な使用パターンではなかった)。

  • クラスの問題を修正した。 PVQD クラスの問題を修正しました。 これは、損失関数が元のアルゴリズム定義の定義と一致するように修正された。

  • QPY()のバグを修正。qiskit.qpy)で、ビットが緩んだ後に回路内で発生するレジスタを含む回路がデシリアライズに失敗するバグを修正した。 9094を参照。

  • TwoQubitWeylDecomposition クラスは pickle プロトコルと互換性がある。 以前は、デシリアライズに失敗し、 TypeError7312を参照。

  • メソッドの問題を修正しました。 LocalReadoutMitigator.quasi_probabilities() メソッドで shots 引数が使われていなかった問題を修正した。 現在は、リターンオブジェクトのショット数を設定するために使用される。

  • の構築におけるリグレッションを修正した。 CliffordQuantumCircuits 、他の Clifford オブジェクトを含む

  • TwoQubitWeylDecomposition クラス(およびそのサブクラス)の問題を修正し、 Python 標準ライブラリ pickle でこれらのクラスをシリアライズできるようにした。 これは #7312 を部分的に修正したものである

  • QuantumCircuit.qasm() は、予約された OpenQASM 2 キーワードと衝突するゲート名やレジスタ名を正しくエスケープするようになった。 5043を修正。

  • の問題を修正した。 RZXCalibrationBuilder ECRパルスシーケンスがずれていた問題を修正。 9013を修正。

  • の問題を修正しました。 pulse_drawer() 場合によっては、出力ビジュアライゼーションがスケジュール内のいくつかのチャンネルを省略してしまう問題を修正しました。 8981を修正。

エア 0.11.2

変更なし

IBM Q プロバイダー 0.19.2

変更なし

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