Skip to main content
IBM Quantum Platform

Qiskit 1.0 リリースノート


1.0.2

前奏曲

Qiskit 1.0.2 は 1.0 シリーズのマイナーバグフィックスリリースです。

バグ修正

  • の問題を修正しました。 convert_to_target() コンバーターが、 BackendConfiguration.supported_instructions 属性に制御フロー命令を指定すると、制御フロー命令を誤って無視してしまう問題を修正しました。 BackendConfiguration オブジェクトで指定される典型的な場所です。 #11872 を修正。

  • を呼び出すと EquivalenceLibrary.set_entry() を呼び出すと、ライブラリーの内部グラフ・オブジェクトが正しく更新されるようになった。 以前は、メタデータは更新されたが、グラフ構造は変更されなかった。 BasisTranslator のようなユーザーは古いルールを使い続けることになる。 #11958 を修正。

  • これにより EvolvedOperatorAnsatz は、 operators 引数が空リストの場合を正しく処理するようになった。 以前はエラーになっていた。

  • の一貫性の問題を修正しました。 EvolvedOperatorAnsatz インスタンスの整合性の問題を修正しました。 以前は、このようなインスタンスには QuantumRegisterqregs を含んでいたが、現在はレジスタは作成されない。 この動作は、スーパークラスとより一貫しています。 QuantumCircuit.

  • のクラッシュを修正しました。 convert_to_target() このクラッシュは、qubitプロパティ( T1, T2 or frequency)が欠落している場合に発生します。 の欠落しているプロパティ値は QubitPropertiesNone で埋められている。

  • のパフォーマンスに関する問題を修正しました。 qpy.load() 関数のパフォーマンスの問題を修正しました。

  • EstimatorPub.coerce()SamplerPub.coerce()BindingsArray 型のパラメータを不適切に扱っていたバグを修正。 以前は ValueError 例外が誤って発生した。

  • で使用されるプリセット・パス・マネージャは、ハードウェア・ターゲットまたはベーシス・ゲート・セットが指定されていない場合でも、制御フロー回路で失敗しなくなった。 transpile() によって使用されるプリセット・パス・マネージャは、ハードウェア・ターゲットまたはベーシス・ゲート・セットが指定されていない場合、制御フローを持つ回路で失敗しなくなりました。 このような抽象的なターゲットは、すべてのコントロールフロー操作を許可するものとして扱われる。 #11906 を修正。

  • coerce() 、入力が1つの、入れ子になっていないobservableの場合に、0-dの配列を返すように修正しました。 以前は、誤ってシングルディメンジョンにアップグレードされ、シェイプ (1,)

  • Parameter が更新され、比較するインスタンスが常に同じハッシュを持つようになった。 以前は Parameter.uuid だけが比較されていた。 Parameter のインスタンスが、 uuid パラメータ(通常は明示的に渡されない)に共通の値を使用して構築されていた場合、異なる名前のインスタンスを等しく比較することができました。

  • のバグを修正。 QuantumCircuit.draw() を修正しました。 Matplotlib ドロワーのカスタムスタイル辞書が実行時に変更される原因となっていました。


1.0.1

前奏曲

Qiskit 1.0.1 は、Qiskit 1.0.0 リリースで確認された少数のバグを修正したパッチリリースです。

バグ修正

  • カスタム・パルス命令のレガシー形式への変換におけるバグを修正。 qiskit.qobj フォーマットへの変換のバグを修正しました。 このバグはQiskit 1.0.0 で導入されたもので、カスタムパルス形状の命令を変換するとエラーが発生する。 修正後、変換は正しく行われ、カスタム・パルスは本来の pulse.Waveform#11828 を修正。

  • の問題を修正しました。 InverseCancellation トランスパイラ・パスの問題で、パラメータ値が一致していなくても、自己逆パラメータ化されたゲートを誤ってキャンセルしてしまう場合がある問題を修正しました。 修正 #11815

  • BasePassManager.run() は、以前の PropertySet を複数回呼び出した場合でも、新しいワークフローに前のワークフローが漏れることはなくなった。 以前は PropertySet を使用していたため、無効なプロパティ情報がタスクに与えられていた可能性があった。 Qiskit 0.44 の動作と一致するようになった。 #11784 を修正。

  • convert_durations_to_dt() 、関数が実際の単位を読み取るのではなく、入力がすべて秒単位であると仮定していたバグが修正された。 これは、報告された回路の持続時間に誤った桁をもたらす可能性がある。


1.0.0

前奏曲

Qiskit 1.0.0 をリリースできることを大変嬉しく思います。 このリリースは、Qiskitを安定した高性能な量子コンピューティングSDKに成熟させるための7年間の開発の集大成であり、Qiskitプロジェクトとコミュニティにとって新しい時代の幕開けです。 一般的なパフォーマンスと安定性の改善に加えて、 1.0.0 リリースで最も重要な変更は、安定性ポリシー、リリースサイクル、およびバージョン管理に関するものです。 Qiskitは現在、正式にセマンティック・バージョニングを使用しており、これは、 1.x リリースシリーズのライフサイクル全体において、プロジェクトが、その公開ドキュメント化されたAPIにおいて後方互換性を維持することにコミットしていることを意味する。 また、メジャー・バージョンに対するバグフィックス・サポートも開始し、次のメジャー・バージョンのリリースから6ヶ月間、サポート対象のブランチを利用できるようになりました。 これは 1.x と 0.x のメジャーシリーズから始まります。 0.46.x のリリースは、 1.0 のリリースから6ヶ月間、バグフィックスを含む定期的なパッチリリースとともにサポートが継続されます。 つまり、 0.46.x、2024-08年までサポートされる。 新ポリシーの詳細はこちらでご覧いただけます:

開始/インストール#qiskit-versioning

また、今回のリリースで重要なのはパッケージの変更である。 Qiskitがエレメントモデルを導入した2018-12年のQiskit 0.7 リリース以来、インストールする qiskit パッケージは、Qiskitを構成するエレメントを組み合わせたものをインストールするメタパッケージ(またはパッケージのパッケージ)になっています。 以前のリリースで発表されたように(詳細は 0.44.0, 0.45.3 および 0.46.0 リリースノート、およびこのブログ記事をご覧ください)、 1.0 のリリースで、コアSDK(以前は qiskit-terra )のみを公開する単一の qiskit パッケージへの移行を完了しました。 つまり、リリース >= 1.0.0 については、 qiskit-terra パッケージの使用を中止し、 qiskit のみを公開することになります。 このパッケージ構造の変更は Python パッケージインストーラ pip では完全にはサポートされていないため、 pip install -U qiskit を使って qiskit 0.46.0 から 1.0.0 へアップグレードすることはできません。 Qiskit 1.0.0 へのアップグレードには、別の仮想環境を作成してインストールを分離することを強くお勧めします。 パッケージングの変更と、さまざまなシナリオにおけるQiskit 1.0.0 のインストール方法について説明した、詳細な移行ガイドがあります:

https://qisk.it/1-0-packaging-migration

Qiskit 1.0.0 には、他のメジャーリリースと同様、数多くの新機能が搭載されています:

  • この QuantumCircuit クラスの内部 data クラスの内部構造はRustで書き直され、命令の引数をキャッシュすることでオブジェクトのメモリ効率を大幅に改善した。 QuantumCircuit 命令の引数をキャッシュすることで、オブジェクトのメモリ効率を大幅に改善しました。
  • のプリミティブ・インターフェイス定義の新バージョン。 qiskit.primitivesBaseSamplerV2BaseEstimatorV2 抽象クラスが追加されました。 このインターフェイスの新バージョンでは、プリミティブへのベクトル化呼び出しのサポートが追加され、パラメータ値セットやオブザーバブルに対するスイープを効率的に指定できるようになった。
  • 新しい実験的なネイティブ・パーサー OpenQASM 3 qiskit.qasm3.loads_experimental()qiskit.qasm3.load_experimental(). この新しいパーサーはまだ開発中で、いくつかの制限があり、実験的なものである。 しかし、使えるところでは、新しいパーサーは格段に速くなり、 OpenQASM 3 プログラムが無効な箇所をデバッグできるよう、診断エラーメッセージも改善されている。 この新しいパーサーはRustで書かれており、 OpenQASM3 をパースするために新しく開発されたRustライブラリに基づいている: https://github.com/Qiskit/openqasm3_parser

最後に、Qiskit 1.0.0 のリリースは、過去7年間の開発で蓄積された技術的負債を一掃する機会となりました。 Qiskit 1.0.0 リリースでは、 DeprecationWarningがほとんど出ていないことにお気づきでしょう。同時に、 1.0.0 リリースノートのアップグレードセクションが通常より長くなっています。 これらは技術的負債の一掃がもたらした直接的な結果である。 0.46.x から 1.0.0 への移行を支援するため、リリースノートの他に、専用の移行ガイドを発行しました:

Qiskit 1.0 機能変更

このガイドは、リリースノートを補足し、 0.46.0 リリースから非推奨の機能が削除された後、API の変更を移行する方法について的を絞ったアドバイスを提供することを目的としています。

回路の特徴

  • メソッドに新しい引数 annotated を追加。 QuantumCircuit.inverse(), circuit.Instruction.inverse() および .inverse() Instruction サブクラス(たとえば SwapGate または SGateを返すようにした。 AnnotatedOperation. annotated のデフォルト値は False 、メソッドの既存の動作に対応している。 さらに、 inverse メソッドが明示的に定義されている標準的なゲートの場合、引数 annotated は何の効果もない:

    SwapGate().inverse(annotated=False)
    SwapGate().inverse(annotated=True)

    を返す。 SwapGateを返す:

    SGate().inverse(annotated=False)
    SGate().inverse(annotated=True)

    を返す SdgGate. この違いは、逆数が明示的に定義されていないカスタム命令の場合に現れる。 annotated=False では、このメソッドは再帰的に反転された定義を持つ新しい命令を返す。 一方、 annotated=TrueAnnotatedOperation で変更された命令を表す InverseModifier.

  • に整流ライブラリを追加した。 CommutationChecker. このライブラリは、パラメータ化できない標準ゲートのすべての整流関係を辞書に格納し、実行時に効率的に検索できるようにする。 これにより CommutationChecker クラスの実行を高速化し、ひいては CommutationAnalysis なぜなら、パラメータ化できない2つの標準的なゲートが共通かどうかを計算する代わりに、ライブラリからそれを調べるだけでいいからです。

    さらに CommutationChecker はリファクタリングされ、現在では整流ライブラリにない整流関係のキャッシュ数に上限が設定されている。 これに対応した: #8020と #7101

  • QuantumCircuit.assign_parameters() は、マッピング形式の入力で文字列キーを受け付けるようになった。 これらの名前は Parameter インスタンスを検索するために使われる。 get_parameter(). これによってできるようになる:

    from qiskit.circuit import QuantumCircuit, Parameter
    
    a = Parameter("a")
    qc = QuantumCircuit(1)
    qc.rx(a, 0)
    
    qc.assign_parameters({"a": 1}) == qc.assign_parameters({a: 1})
  • QuantumCircuit には2つの新しいメソッドがある、 get_parameter()has_parameter()があります。 Parameter インスタンスを取得し、一致する名前のパラメータ(または指定されたインスタンス)が回路で使用されているかどうかをブール値で返します。

  • A uuid プロパティが qiskit.circuit.Parameter クラスに追加されました。 高度な使用例では、このプロパティは、互いに等しいインスタンスを作成するために使用することができます。 qiskit.circuit.Parameter インスタンスを作成するために使用できます。

  • 新しいメソッドが追加された、 ParameterExpression.numeric()このメソッドは、完全に束縛されたパラメータ式を、記号評価の結果を正確に記述する最も制限の多い組み込みの Python 数値型に変換します。 例えば、記号整数は intになり、記号実数は float となり、複素数は complex. このメソッドには、 symengine の評価コンテキストの特殊性に対するいくつかの回避策が含まれている。 complex または float を直接呼び出すと、偽の結果になることがあります。

プリミティブ機能

  • プリミティブのバージョン2は、サンプラーとエスティメーターの両方に新しい基本クラスが導入され、入力と出力に新しい型が追加された。 この新バージョンは、プリミティブな run() メソッドをベクトル化して呼び出すことに重点を置いており、パラメータ値セットや観測値に対するスイープを効率的に指定できるようになっている。 参照 StatevectorSampler および StatevectorEstimatorV2 を参照されたい。

    さらに,この推定量には, precision の引数が追加されている。 run() メソッドに,期待値推定値の目標精度を指定する引数が追加された。 同様に、サンプラーは shots 、オプションからメソッドの引数に移動した。 run() メソッドの引数に移動した。 また、サンプラーも変更され、各ショットからの出力(ビット列など)を返すようになった。 Counts-を返すように変更された。 ClassicalRegisters. これにより派生クラスは、古典的な制御フローを持つ回路に対してサンプラー・サポートを実装することができる。

    プリミティブな V2 ベースクラスは以下の通り:

    入力と出力に使用される新しいタイプは以下の通りである:

    • SamplerPubLike: サンプラー入力のプリミティブな統一ブロック( PUB )
    • EstimatorPubLike:推定量入力の原始的な統一ブロック ( PUB ); 推定量に許容される入力の結合型
    • PubResult: PUB の実行から得られるデータとメタデータ
    • DataBin: PUB の実行データを保持する名前空間
    • BitArray:密なフォーマットのビット値の配列値コレクション
    • PrimitiveResultのイテレート可能 PubResultメタデータ
  • リファレンス実装 StatevectorEstimatorBaseEstimatorV2 の参照実装が追加された。 以下の例に見られるように、この推定器(およびすべての V2 推定器)は、特定の回路に接続される観測値の配列および/またはパラメータ値セットの配列を提供することをサポートする。

    推定プリミティブ統一ブロック( PUB )と呼ばれる (circuit, observables, <optional> parameter values, <optional> precision) の各タプルは、それ自身の配列ベースの結果を生成する。 run() 、一度に多くのパブを回ることができる。

    from qiskit.circuit import Parameter, QuantumCircuit
    from qiskit.primitives import StatevectorEstimator
    from qiskit.quantum_info import Pauli, SparsePauliOp
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define a circuit with two parameters.
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.ry(Parameter("a"), 0)
    circuit.rz(Parameter("b"), 0)
    circuit.cx(0, 1)
    circuit.h(0)
    
    # Define a sweep over parameter values, where the second axis is over
    # the two parameters in the circuit.
    params = np.vstack([
        np.linspace(-np.pi, np.pi, 100),
        np.linspace(-4 * np.pi, 4 * np.pi, 100)
    ]).T
    
    # Define three observables. Many formats are supported here including
    # classes such as qiskit.quantum_info.SparsePauliOp. The inner length-1
    # lists cause this array of observables to have shape (3, 1), rather
    # than shape (3,) if they were omitted.
    observables = [
        [SparsePauliOp(["XX", "IY"], [0.5, 0.5])],
        [Pauli("XX")],
        [Pauli("IY")]
    ]
    
    # Instantiate a new statevector simulation based estimator object.
    estimator = StatevectorEstimator()
    
    # Estimate the expectation value for all 300 combinations of
    # observables and parameter values, where the pub result will have
    # shape (3, 100). This shape is due to our array of parameter
    # bindings having shape (100,), combined with our array of observables
    # having shape (3, 1)
    pub = (circuit, observables, params)
    job = estimator.run([pub])
    
    # Extract the result for the 0th pub (this example only has one pub).
    result = job.result()[0]
    
    # Error-bar information is also available, but the error is 0
    # for this StatevectorEstimator.
    result.data.stds
    
    # Pull out the array-based expectation value estimate data from the
    # result and plot a trace for each observable.
    for idx, pauli in enumerate(observables):
        plt.plot(result.data.evs[idx], label=pauli)
    plt.legend()
  • リファレンス実装 StatevectorSamplerBaseSamplerV2 の参照実装が追加された。 以下の例に見られるように、このサンプラー(およびすべての V2 )は、1つの回路に対してバインドするパラメータ値セットの配列を提供することに対応している。

    サンプラープリミティブ統一ブロック( PUB )と呼ばれる (circuit, <optional> parameter values, <optional> shots) の各タプルは、それ自身の配列ベースの結果を生成する。 run() 、一度に多くのパブを回ることができる。

    from qiskit.circuit import (
        Parameter, QuantumCircuit, ClassicalRegister, QuantumRegister
    )
    from qiskit.primitives import StatevectorSampler
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define our circuit registers, including classical registers
    # called 'alpha' and 'beta'.
    qreg = QuantumRegister(3)
    alpha = ClassicalRegister(2, "alpha")
    beta = ClassicalRegister(1, "beta")
    
    # Define a quantum circuit with two parameters.
    circuit = QuantumCircuit(qreg, alpha, beta)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.cx(1, 2)
    circuit.ry(Parameter("a"), 0)
    circuit.rz(Parameter("b"), 0)
    circuit.cx(1, 2)
    circuit.cx(0, 1)
    circuit.h(0)
    circuit.measure([0, 1], alpha)
    circuit.measure([2], beta)
    
    # Define a sweep over parameter values, where the second axis is over.
    # the two parameters in the circuit.
    params = np.vstack([
        np.linspace(-np.pi, np.pi, 100),
        np.linspace(-4 * np.pi, 4 * np.pi, 100)
    ]).T
    
    # Instantiate a new statevector simulation based sampler object.
    sampler = StatevectorSampler()
    
    # Start a job that will return shots for all 100 parameter value sets.
    pub = (circuit, params)
    job = sampler.run([pub], shots=256)
    
    # Extract the result for the 0th pub (this example only has one pub).
    result = job.result()[0]
    
    # There is one BitArray object for each ClassicalRegister in the
    # circuit. Here, we can see that the BitArray for alpha contains data
    # for all 100 sweep points, and that it is indeed storing data for 2
    # bits over 256 shots.
    assert result.data.alpha.shape == (100,)
    assert result.data.alpha.num_bits == 2
    assert result.data.alpha.num_shots == 256
    
    # We can work directly with a binary array in performant applications.
    raw = result.data.alpha.array
    
    # For small registers where it is anticipated to have many counts
    # associated with the same bitstrings, we can turn the data from,
    # for example, the 22nd sweep index into a dictionary of counts.
    counts = result.data.alpha.get_counts(22)
    
    # Or, convert into a list of bitstrings that preserve shot order.
    bitstrings = result.data.alpha.get_bitstrings(22)
    print(bitstrings)

プロバイダー機能

  • 新しいクラスを追加、 GenericBackendV2を追加した。 qiskit.providers.fake_provider モジュールを追加した。 このクラスは設定可能で、ローカルで実行可能な BackendV2 バックエンドのインスタンスを構築します。 ユーザーは、手動でターゲットを構築することなく、バックエンドの量子ビット数、基底ゲート数、カップリングマップ、ダイナミック回路(制御フロー命令)の実行能力、命令キャリブレーション、測定タイムステップを設定することができる。 Qubitとゲートのプロパティ(持続時間、エラー)は、デフォルトの範囲からランダムにサンプリングして生成されます。 このランダム生成のシードは、バックエンド出力の再現性を確保するために固定することができる。 このバックエンドは、標準ライブラリーのゲートしかサポートしていないことに注意することが重要だ。 より柔軟なバックエンドが必要な場合は、変換に使用する Target オブジェクトを直接インスタンス化するオプションがあります。

    使用例 1:

    from qiskit import QuantumCircuit, transpile
    from qiskit.providers.fake_provider import GenericBackendV2
    
    # Create a simple circuit
    circuit = QuantumCircuit(3)
    circuit.h(0)
    circuit.cx(0,1)
    circuit.cx(0,2)
    circuit.measure_all()
    circuit.draw('mpl')
    
    # Define backend with 3 qubits
    backend = GenericBackendV2(num_qubits=3)
    
    # Transpile and run
    transpiled_circuit = transpile(circuit, backend)
    result = backend.run(transpiled_circuit).result()

    使用例 2:

    from qiskit import QuantumCircuit, ClassicalRegister, transpile
    from qiskit.providers.fake_provider import GenericBackendV2
    
    # Create a circuit with classical control
    creg = ClassicalRegister(19)
    qc = QuantumCircuit(25)
    qc.add_register(creg)
    qc.h(0)
    for i in range(18):
        qc.cx(0, i + 1)
    for i in range(18):
        qc.measure(i, creg[i])
    with qc.if_test((creg, 0)):
        qc.ecr(20, 21)
    
    # Define backend with custom basis gates and control flow instructions
    backend = GenericBackendV2(
        num_qubits=25,
        basis_gates=["ecr", "id", "rz", "sx", "x"],
        control_flow=True,
      )
    
    #Transpile
    transpiled_qc = transpile(qc, backend)

    これらのクラスで生成されるノイズ特性は、具体的な量子デバイスを模倣したものではなく、具体的な動作の測定に使用されるべきものではない。 これは "合理的なデフォルト "であり、実際の量子システムの特定のノイズ値に縛られることなく、バックエンド・インターフェースの機能をテストするために使用できる。 既存のデバイスのより正確なシミュレーションを行うには、以下の機能を使用して、実際のバックエンドからノイズモデルを手動で構築することができます。 qiskit_aer.

  • この qiskit.providers.fake_provider モジュールには、以下のような一連の一般的な偽のバックエンドが含まれている。 BackendV1 インターフェイスが追加されました。 これらは、非推奨の FakeProviderFakeVigo, FakeTokyo など)で公開されているスナップショットベースの偽バックエンドの代替として導入された。 新しい偽のバックエンドのリストは以下の通り:

    from qiskit.providers.fake_provider import Fake5QV1. バックエンドのプロパティの詳細については、各バックエンドのAPIドキュメントを参照してください。

OpenQASM 特徴

  • この qiskit.qasm3 パッケージには、 OpenQASM 3 プログラムを QuantumCircuitに読み込む qiskit.qasm3.load_experimental()loads_experimental(). これらは通常、既存の純粋な Python よりも数倍速い。 load()loads() 関数の数倍速い。さらに、 qiskit-qasm3-import をインストールする必要がある。

    例えば、20,000命令のエンタングリングを作ることができる。 QuantumCircuit:

    import numpy as np
    import qiskit.qasm3
    from qiskit.circuit.library import RealAmplitudes
    
    qc = RealAmplitudes(100, reps=100, flatten=True)
    qc = qc.assign_parameters(np.random.rand(qc.num_parameters))
    oq3 = qiskit.qasm3.dumps(qc)

    古い qasm3.loads() が OpenQASM 3 プログラムをロードするのに約 7.3s を要したのに対し qasm3.loads_experimental() コンシューマー向けMacbook Pro ( i7, 2020)では 300ms 以下であり、 25x のスピードアップである!

    実験的パーサーのサポート機能セットは、このプレビューバージョンでは非常に限定的ですが、Qiskit側とネイティブのRustベースのパーサーの両方が改善されるにつれて拡張されるでしょう。

    この新しいパーサーの主な目標のひとつは、スピードの大幅な向上と並んで、最高品質のエラー診断を提供することです。 パーサーの他の部分と同様に、これらは進行中ですが、実験的なパーサーで無効な OpenQASM 3プログラムをパースするときに表示されるエラーメッセージの質が格段に向上しています。

  • OpenQASM 3 エクスポーター ( dump() および dumps() の関数を参照)。 qiskit.qasm3を参照)は、デフォルトで OpenQASM 3 の switch ステートメントの安定化された構文をサポートするようになった。 switch ステートメントの認証前シンタックスは、エクスポーターの 引数で ExperimentalFeatures.SWITCH_CASE_V1experimental フラグを使用することで利用可能です。 安定化した構文には機能フラグは必要ないが、まだ更新されていない他のツールと連動する場合は、experimentalフラグを渡す必要があるかもしれない。

    安定化フォームの構文は、 break ステートメントの終了に関して若干異なっており(もはや必須でも許可もされていない)、複数のケースは、Cスタイルのフォールスルーではなく、単一の case 行にまとめられるようになった。 詳しくは、 OpenQASM 3のswitch-case構文に関するドキュメントを参照されたい。

QPYの特長

  • 新しい警告クラスを追加、 QPYLoadingDeprecatedFeatureWarningをQPYモジュールに追加しました。 このクラスは、再帰的に呼び出される多くのQPYローディング関数の場合のように、非推奨機能がコールスタックの可変ポイントでアクセスされる場合でも、非推奨警告を表示できるようにする。

  • 新しいフラグ、 versionqpy.dump() 関数を追加した。 これにより qpy.dump() には、オプションで QPYフォーマットのバージョンを表す整数値を取ることができます。 これは、古いバージョンのQiskitで読み込まれるQPYファイルを生成する必要がある場合に便利です。 ただし、使用できるバージョンは限られており、最新のQPYバージョン(これがデフォルトです)と互換性のあるQPYバージョンである Version 10 (これはQiskit 0.45.0 で導入されました)の間のバージョンしか使用できません。 互換バージョンは、 1.x.y メジャーバージョンリリースシリーズ全体にわたって固定されたままとなる。 を呼び出す際のQPYフォーマットの後方互換性の保証は変更されない。 qpy.load()これは、 0.x と 1.x リリース・シリーズ間の互換性と相互運用性を維持するために、ユーザーが古いバージョンのQPYを発行できるようにするだけである。

量子情報の特徴

  • を追加した。 qiskit.quantum_info.StabilizerState.from_stabilizer_list() スタビライザーのリストからスタビライザーの状態を生成するメソッドを追加した:

    from qiskit.quantum_info import StabilizerState
    
    stabilizer_list = ["ZXX", "-XYX", "+ZYY"]
    stab = StabilizerState.from_stabilizer_list(stabilizer_list)
  • SparsePauliOp.from_operator() では、 Hatznko, Binkowski and Gupta (2023) で発表された「テンソル化パウリ分解アルゴリズム」の実装を使用している。 例えば、コンシューマー向けのMacbook Pro(Intel i7、2020年)では、ランダムな10量子ビットの演算子を 250ms。

合成機能

  • を追加した。 qiskit.synthesis.synth_circuit_from_stabilizers() この関数は、与えられた一連のスタビライザーによって安定化された状態を出力する回路を返す。

  • AQCユニタリー合成プラグイン法は、デフォルトでより高速な目的関数評価を使用するようになり、合成時間が大幅に改善されました。

  • 新しい合成法を追加 synth_qft_line() SABREと比較して、多数の量子ビットに対するSWAPの数を大幅に削減します。

  • クラス TwoQubitWeylDecomposition クラスは qiskit.synthesis. このクラスは、2量子ビットのユニタリーのWeyl分解を適用することができる。 以前、このクラスが qiskit.quantum_info.synthesis (現在は削除されている)モジュールの非公開クラスだったときにインポートしていた場合は、インポートパスを更新する必要がある。

トランスパイラ機能

  • 新しい例外クラスを追加: InvalidLayoutError. これは TranspilerError ユーザが提供したレイアウトが無効な場合に発生するサブクラスです(サイズの不一致、量子ビットの重複など)。

  • に新しいキーワード引数 num_processes を追加。 transpile()PassManager.run() メソッドを追加した。 これにより、ユーザー設定ファイルの QISKIT_NUM_PROCSnum_processes フィールドの両方を、トランスパイルごとに上書きすることができる。 例:

    from qiskit import transpile, QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    transpile([qc]*10, basis_gates=['u', 'cz'], num_processes=2)

    を呼び出すと、2つのプロセスだけを使用して10個の入力回路に対してトランスパイルを実行し、システムのデフォルト、環境変数、またはユーザー設定ファイルを上書きします。 transpile() 呼び出しを上書きする。

  • 新しいトランスパイラー・パスを追加、 OptimizeAnnotated量子回路の注釈付き演算を最適化します。

    次の例を考えてみましょう。

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.annotated_operation import (
        AnnotatedOperation,
        InverseModifier,
        ControlModifier,
    )
    from qiskit.circuit.library import CXGate, SwapGate
    from qiskit.transpiler.passes import OptimizeAnnotated
    
    # Create a quantum circuit with multiple annotated gates
    gate1 = AnnotatedOperation(
        SwapGate(),
        [InverseModifier(), ControlModifier(2), InverseModifier(), ControlModifier(1)],
    )
    gate2 = AnnotatedOperation(
        SwapGate(),
        [InverseModifier(), InverseModifier()]
    )
    gate3 = AnnotatedOperation(
        AnnotatedOperation(CXGate(), ControlModifier(2)),
        ControlModifier(1)
    )
    qc = QuantumCircuit(6)
    qc.append(gate1, [3, 2, 4, 0, 5])
    qc.append(gate2, [1, 5])
    qc.append(gate3, [5, 4, 3, 2, 1])
    
    # Optimize the circuit using OptimizeAnnotated transpiler pass
    qc_optimized = OptimizeAnnotated()(qc)
    
    # This is how the optimized circuit should look like
    gate1_expected = AnnotatedOperation(SwapGate(), ControlModifier(3))
    gate2_expected = SwapGate()
    gate3_expected = AnnotatedOperation(CXGate(), ControlModifier(3))
    qc_expected = QuantumCircuit(6)
    qc_expected.append(gate1_expected, [3, 2, 4, 0, 5])
    qc_expected.append(gate2_expected, [1, 5])
    qc_expected.append(gate3_expected, [5, 4, 3, 2, 1])
    
    assert qc_optimized == qc_expected

    gate1 の場合、注釈付きスワップ・ゲートの修飾語は正規形となる。 InverseModifierが相殺され、2つの ControlModifierが結合される。 gate2 の場合、すべての修飾子は削除され、注釈付き操作はその基本操作に置き換えられる。 gate3 の場合、複数の注釈のレイヤーが1つにまとめられる。

    パスのコンストラクタは OptimizeAnnotated パスのコンストラクタは、オプションの引数 targetequivalence_librarybasis_gatesrecurse を受け付けます。 recurse (デフォルト値)が True (デフォルト値)であり、 target (デフォルト値)または basis_gates (デフォルト値)のいずれかが指定されている場合、パスは、ターゲットによって既にサポートされているか、等価ライブラリに属するゲートを除いて、ゲートの definition 回路に再帰的に下降する。 一方、 targetbasis_gates も指定されていない場合、または recurseFalse に設定されている場合、パスは「トップレベル」の注釈付き操作のみを合成する、つまり definition 回路に再帰的に降下しない。 この動作は HighLevelSynthesis トランスパイラ・パスは、注釈付き演算を1qubitゲートと2qubitゲートに "展開 "するために呼び出される必要がある。

  • 新しい HighLevelSynthesisPlugin を追加。 PermutationGate オブジェクトを追加した。 このプラグインを使用するには、ハイレベル合成コンフィグを定義する際に token_swapper を指定する。

    この合成プラグインは、レイアウトを設定する前でも後でも実行できる。 合成に成功すると、スワップ・ゲートだけで構成される量子回路が出力される。 合成が成功しなかった場合、プラグインは None を出力する。

    次のコードは、新しいプラグインの実行方法を示している:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import PermutationGate
    from qiskit.transpiler import PassManager, CouplingMap
    from qiskit.transpiler.passes.synthesis.high_level_synthesis import HighLevelSynthesis, HLSConfig
    
    # This creates a circuit with a permutation gate.
    qc = QuantumCircuit(8)
    perm_gate = PermutationGate([0, 1, 4, 3, 2])
    qc.append(perm_gate, [3, 4, 5, 6, 7])
    
    # This defines the coupling map.
    coupling_map = CouplingMap.from_ring(8)
    
    # This high-level-synthesis config specifies that we want to use
    # the "token_swapper" plugin for synthesizing permutation gates,
    # with the option to use 10 trials.
    synthesis_config = HLSConfig(permutation=[("token_swapper", {"trials": 10})])
    
    # This creates the pass manager that runs high-level-synthesis on our circuit.
    # The option use_qubit_indices=True indicates that synthesis is run after the layout is set,
    # and hence should preserve the specified coupling map.
    pm = PassManager(
        HighLevelSynthesis(
            synthesis_config, coupling_map=coupling_map, target=None, use_qubit_indices=True
        )
    )
    
    qc_transpiled = pm.run(qc)
  • トランスパイラー・パスのコンストラクターに2つの新しい引数、 matrix_basedmax_qubits を追加。 CommutativeInverseCancellation を追加した。 matrix_basedTrue の場合、パスは行列表現を使って、2つの演算が互いに逆であるかどうかをチェックする。 これにより、チェックがより強力になり、さらに、位相まで逆である演算のペアをキャンセルし、それに応じて回路のグローバル位相を更新することができる。 これは一般的に、実行時間の増加を犠牲にして、より多くの削減をもたらす。 引数 max_qubits は、行列ベースの可換性チェックと逆チェックにおける量子ビット数を制限する。 例:

    import numpy as np
    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import CommutativeInverseCancellation
    
    circuit = QuantumCircuit(1)
    circuit.rz(np.pi / 4, 0)
    circuit.p(-np.pi / 4, 0)
    
    passmanager = PassManager(CommutativeInverseCancellation(matrix_based=True))
    new_circuit = passmanager.run(circuit)

    パスは、 RZP ゲートをキャンセルすることができ、同時に回路のグローバル位相を 15π8\frac{15 \pi}{8} に調整する。

  • 新しい関数を追加した、 high_level_synthesis_plugin_names()この関数は、与えられた操作名に対してインストールされている高位合成プラグインのリストを取得するために使用できます。

可視化機能

  • textmpl 出力は、以下の通りである。 QuantumCircuit.draw() および circuit_drawer() の操作の詳細情報が表示されます。 AnnotatedOperation. AnnotatedOperation.modifiersControlModifierを含む場合、操作内容はコントロールされたゲートと同じように表示される。 もし InverseModifier または PowerModifier が使われている場合、これらは基本操作名で示される。 例:

    from qiskit.circuit import (
        AnnotatedOperation,
        ControlModifier,
        PowerModifier,
        InverseModifier,
        QuantumCircuit
    )
    from qiskit.circuit.library import SGate
    
    annotated_op = AnnotatedOperation(SGate(), [PowerModifier(3.4), ControlModifier(3), InverseModifier()])
    qc = QuantumCircuit(4)
    qc.append(annotated_op, range(4))
    qc.draw("mpl")
    _images/release_notes-1.png

各種 機能

  • 新しい警告基本クラスを追加、 QiskitWarning. Qiskitは組み込みの Python 警告(たとえば DeprecationWarningなど) を使い続けますが、Qiskit に特有なケースでは、警告は QiskitWarning.

  • オプション機能テスター (qiskit.utils.optionals)は、完全に見つからなかったオプションの依存関係(通常の状況)と、見つかったがインポート中にエラーを引き起こした依存関係を区別するようになりました。 後者の場合、インストールに失敗したか、互換性のないバージョンである可能性があるため、何が起きたかを知らせる OptionalDependencyImportWarning を発行する。インストールに失敗したか、互換性のないバージョンであった可能性があるからだ。

アップグレードの注意

  • Qiskit 1.0 は現在、 rustworkx のバージョン 0.14.0 を必要とします。 新しい token_swapperPermutationGate の合成プラグインをサポートするために、最低バージョンが引き上げられた。 HighLevelSynthesisPlugin.

  • Qiskit をソースからビルドするためにサポートされる Rust の最小バージョンは 1.70 になりました。 これは、Qiskit 0.45.x および 0.46.0 リリースシリーズの 1.64 の最小サポート Rust バージョンから引き上げられています。

  • psutilへの依存が削除された。 psutil ライブラリは、以前は物理 CPU の数とシステム・メモリの合計を検出するためだけに使用されていましたが、この提供される情報は、追加の依存関係とオーバーヘッドを正当化するのに十分な価値をもたらさないため、削除されました。 によって使用されるデフォルトのプロセス数、および内部的に parallel_map() および内部的に parallel_map() など transpile()PassManager.run() などが内部的に使用できる関数で使用されるデフォルトの並列プロセス数が、以前のリリースよりも多くなったり少なくなったりする可能性があるということです。 Qiskitが潜在的に使用するプロセス数を調整したい場合は、これらの関数への新しい引数 num_processes 、または環境変数 QISKIT_NUM_PROCS 、またはユーザー設定ファイルの num_processes フィールド(詳細はローカル設定ガイドを参照)を使用できます。

  • scoped_parameterssearch_parameters メソッドは ScheduleBlock クラスから削除されました。 これらのメソッドは Parameter オブジェクトを返します。 ScheduleBlock インスタンスに部分的にリンクしたオブジェクトを返しますが、これらのオブジェクトを使った値の代入は正しく機能しませんでした。 代わりに ScheduleBlock.parameters を繰り返し ScheduleBlock.references を繰り返し Schedule.parameters 属性と比較する必要があります。 詳細は #11654を参照。

  • を注入するロジックを削除した。 QuantumCircuitGate 演算をパルスコンテキストに注入するロジックを削除しました。 pulse.builder.call()など)。これはQiskit 0.46 で非推奨となったレガシーな動作です。 パルス・スケジュールは、完全なスケジュール・コンテキストとして構築されるべきである。回路とゲートは、より抽象度の高いものである。

    これには関連機能の削除も含まれる:

    • pulse.builder.call_gate
    • pulse.builder.cx
    • pulse.builder.u1
    • pulse.builder.u2
    • pulse.builder.u3
    • pulse.builder.x
    • pulse.builder.active_transpiler_settings
    • pulse.builder.active_circuit_scheduler_settings
    • pulse.builder.transpiler_settings
    • pulse.builder.circuit_scheduler_settings

    default_transpiler_settingsdefault_circuit_scheduler_settings 引数も同様に削除された。 pulse.builder.build() の引数も同様に削除される。

    from qiskit import transpile, schedule, QuantumCircuit, pulse
    from qiskit.providers.fake_provider import Fake7QPulseV1
    
    backend = Fake7QPulseV1()
    
    # Create a schedule from a hardware-based circuit.
    qc = QuantumCircuit(2)
    qc.cx(0, 1)
    qc = transpile(qc, backend)
    sched = schedule(qc, backend)
    
    # These pulse schedules can still be called in builder contexts.
    with pulse.build(backend) as qc_sched:
      pulse.call(sched)
    
    # Schedules for certain operations can also be directly retrieved
    # from BackendV1 instances:
    sched = backend.defaults().instruction_schedule_map.get('x', (0,))
    
    # ... and from BackendV2 instances:
    sched = backend.target['x'][(0,)].calibration
  • symengine に必要な最小バージョンは >= 0.11 に変更されました。

回路アップグレードに関する注意事項

  • Qiskit 0.45.0 で非推奨となった Instruction.qasm メソッドを削除した。 使用方法 qiskit.qasm2.dump() を完全な QuantumCircuit 代わりに

  • プロパティ Bit.registerBit.index は削除された。 これらはQiskit 0.25 (2021-04リリース)で非推奨となった。 量子ビットとビットは、現在では、"量子ビット "と "量子ビット "の文脈の中でしか生きていない。 QuantumCircuit. プロパティの代わりに QuantumCircuit.find_bit() を使って、回路内のすべてのレジスタと、回路内のビットのインデックスを見つけることです。

  • Qiskit 0.45 で非推奨となったため、 QuantumCircuit.bind_parameters メソッドは削除されました。 あなたは QuantumCircuit.assign_parameters() をデフォルトのまま、そのまま置き換えられる。

  • から Int1, Int2, BooleanFunction, classical_function() をインポートする。 qiskit.circuit からのインポートは無効になりました。 代わりに qiskit.circuit.classicalfunctiontweedledum サブモジュールからオブジェクトをインポートする。

  • header および extension_lib データ専用属性は、 Qiskit での非推奨に伴い削除されました。 QuantumCircuit は、Qiskit 0.45 で非推奨となったため削除されました。 これらは、 OpenQASM 2 エクスポーターの内部詳細で、現在は使用されていない。

  • 0.45 リリースから非推奨となり、 0.46 リリースで完全に非推奨となった qiskit.extensions モジュールを削除。 このモジュールの以下の操作は qiskit.circuit.library:

    以下のオブジェクトが削除されました:

    • SingleQubitUnitary (代わりに library.UnitaryGate),
    • Snapshot (エアのセーブ指示に取って代わられた)、
    • ExtensionError,

    とともに、以下の回路方式を採用した:

    • QuantumCircuit.snapshot,
    • QuantumCircuit.squ,
    • QuantumCircuit.diagonal,
    • QuantumCircuit.hamiltonian,
    • QuantumCircuit.isometryQuantumCircuit.iso
    • QuantumCircuit.uc,
    • QuantumCircuit.ucrx,
    • QuantumCircuit.ucry,
    • QuantumCircuit.ucrz.

    これらの演算は、量子回路に適切な命令を追加することで実行できる。

  • 非推奨の重複する QuantumCircuit メソッドを削除しました。 次のものが含まれます。

  • もはや QuantumCircuit.metadata0.43.0 を None に設定することはできなくなりました。 そのタイプは dictなので、これをクリアするには、 {} に設定します。

  • 属性 .Register.name_format は Qiskit 0.40.0 で非推奨となったため削除されました。 レジスター名にはもう制限はなく、正規表現は単に [a-z][a-zA-Z0-9_]*.

プリミティブのアップグレードに関する注意事項

プロバイダー向けアップグレードノート

  • 関数の2つの引数(add_delayfilter_faulty)のデフォルト値を変更。 convert_to_target() 関数の この変換機能は、デフォルトで遅延命令を追加し、欠陥命令を削除するようになった。

  • その BackendPropertiesPulseDefaults モデル・オブジェクト FakeOpenPulse2Q が更新され、内部的な一貫性が保たれ、不足していた命令が追加された。 コンパイルターゲットとして以前のモデルオブジェクトに依存していた場合、Qiskit 0.46 でバックエンドを使用することができます。 QuantumCircuit で生成し transpile() を使ってエクスポートし、 qpy.dump を使ってシリアライズすることで、このリリースでアクセスできるようになります。

  • qiskit.BasicAer として公開されていた qiskit.providers.basicaer モジュールは、 0.46 リリースで非推奨となったため、削除された。 その機能は qiskit.quantum_info モジュールと新しい qiskit.providers.basic_provider モジュールに置き換えられました。

    qiskit.providers.basicaer (qiskit.BasicAer) を使用することから、次のように移行することができる。 qiskit.providers.basic_provider への移行は以下のように行うことができる:

    からの移行
    置換
    qiskit.BasicAer新しいプロバイダーはグローバル・インスタンスを持っていない。 qiskit.providers.basic_provider
    qiskit.providers.basicaerbasic_provider
    BasicAerProviderBasicProvider
    BasicAerJobBasicProviderJob
    QasmSimulatorPyBasicSimulator
    UnitarySimulatorPy使用 Operator
    StatevectorSimulatorPy使用 Statevector

    特筆すべき違いは、新しいプロバイダーは( BasicAer のような)グローバル・インスタンスを通じて公開されなくなったため、 from qiskit import BasicProvider。 その代わりに、プロバイダー・クラスをサブモジュールからインポートし、手動でインスタンス化する必要がある:

    from qiskit.providers.basic_provider import BasicProvider
    
    provider = BasicProvider()
    backend = provider.get_backend("basic_simulator")

    以下の例は、 BasicAer における3つのシミュレーターの移行経路を示している。

    1. 状態ベクトルシミュレータ:

      from qiskit import QuantumCircuit
      qc = QuantumCircuit(3)
      qc.h(0)
      qc.h(1)
      qc.cx(1,2)
      
      # Former path
      from qiskit import BasicAer
      backend = BasicAer.get_backend("statevector_simulator")
      statevector = backend.run(qc).result().get_statevector()
      
      # New path
      from qiskit.quantum_info import Statevector
      statevector = Statevector(qc)
    2. 単一シミュレーター:

      from qiskit import QuantumCircuit
      qc = QuantumCircuit(3)
      qc.h(0)
      qc.h(1)
      qc.cx(1,2)
      
      # Former path
      from qiskit import BasicAer
      backend = BasicAer.get_backend("unitary_simulator")
      result = backend.run(qc).result()
      
      # New path
      from qiskit.quantum_info import Operator
      result = Operator(qc).data
    3. Qasmシミュレーター:

      from qiskit import QuantumCircuit
      qc = QuantumCircuit(3)
      qc.h(0)
      qc.h(1)
      qc.cx(1,2)
      qc.measure_all()
      
      # Former path
      from qiskit import BasicAer
      backend = BasicAer.get_backend("qasm_simulator")
      result = backend.run(qc).result()
      
      # New path
      from qiskit.providers.basic_provider import BasicProvider
      backend = BasicProvider().get_backend("basic_simulator")
      result = backend.run(qc).result()
      # or, directly
      from qiskit.providers.basic_provider import BasicSimulator
      backend = BasicSimulator()
      result = backend.run(qc).result()
  • Qiskit 0.46.0 で非推奨とされた ConfigurableFakeBackend クラスを削除した。 代わりに、適切な FakeBackend を使うことができる。

  • 非推奨の qiskit.providers.fake_provider モジュールは qiskit-ibm-runtime Python パッケージに移行されました。 このため qiskit.providers.fake_provider の以下の要素はQiskitで非推奨となったため削除されました。 0.46:

    • qiskit.providers.fake_provider.FakeProvider
    • qiskit.providers.fake_provider.FakeProviderForBackendV2
    • qiskit.providers.fake_provider.FakeProviderFactory
    • qiskit.providers.fake_provider.fake_backends.FakeBackendV2
    • qiskit.providers.fake_provider.backends に含まれる偽のバックエンド(プロバイダーを通してアクセスできる)
    • qiskit.providers.fake_provider.FakeQasmSimulator
    • qiskit.providers.fake_provider.FakeJob
    • qiskit.providers.fake_provider.FakeQobj

    新しい偽プロバイダモジュールを使用するには、 pip install qiskit-ibm-runtime を実行し、qiskit のインポートパス (qiskit.providers.fake_provider) を新しいインポートパス (qiskit_ibm_runtime.fake_provider) に置き換えます。移行例:

    # Legacy path
    from qiskit.providers.fake_provider import FakeProvider, FakeSherbrooke
    backend1 = FakeProvider().get_backend("fake_ourense")
    backend2 = FakeSherbrooke()
    
    # New path
    # run "pip install qiskit-ibm-runtime"
    from qiskit_ibm_runtime.fake_provider import FakeProvider, FakeSherbrooke
    backend1 = FakeProvider().get_backend("fake_ourense")
    backend2 = FakeSherbrooke()

    さらに、特別なテスト目的で設計された以下の偽のバックエンドは、新しい GenericBackendV2 クラスに取って代わられ、Qiskit では非推奨となったため削除されました。 0.46:

    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2
    • `qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2LegacyQubitProps
    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackend5QV2
    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackendSimple

    新しいクラスへの移行例 GenericBackendV2 クラスへの移行例です:

    # Legacy path
    from qiskit.providers.fake_provider import FakeBackend5QV2
    backend = FakeBackend5QV2()
    
    # New path
    from qiskit.providers.fake_provider import GenericBackendV2
    backend = GenericBackendV2(num_qubits=5)
    # note that this class will generate 5q backend with generic
    # properties that serves the same purpose as FakeBackend5QV2
    # but will generate different results

パルス アップグレード ノート

  • 非推奨クラス qiskit.pulse.instructions.Call を削除。代替パルス命令は提供されない。

  • InstructionToQobjConverterQobjToInstructionConverter の非推奨メソッドを削除した。 これには以下が含まれる

    • InstructionToQobjConverter.convert_acquire()
    • InstructionToQobjConverter.convert_bundled_acquires()
    • InstructionToQobjConverter.convert_set_frequency()
    • InstructionToQobjConverter.convert_shift_frequency()
    • InstructionToQobjConverter.convert_set_phase()
    • InstructionToQobjConverter.convert_shift_phase()
    • InstructionToQobjConverter.convert_delay()
    • InstructionToQobjConverter.convert_play()
    • InstructionToQobjConverter.convert_snapshot()
    • QobjToInstructionConverter.convert_acquire()
    • QobjToInstructionConverter.convert_set_phase()
    • QobjToInstructionConverter.convert_shift_phase()
    • QobjToInstructionConverter.convert_set_frequency()
    • QobjToInstructionConverter.convert_shift_frequency()
    • QobjToInstructionConverter.convert_delay()
    • QobjToInstructionConverter.bind_pulse()
    • QobjToInstructionConverter.convert_parametric()
    • QobjToInstructionConverter.convert_snapshot()

    これらのパブリック・メソッドはすべて、単一のエントリー・ポイントから暗黙的に呼び出されるプロテクト・メソッドに置き換えられる。

  • クラス qiskit.pulse.library.ParametricPulse 、すべてのサブクラスが削除される。 これらは2022-10にリリースされたQiskit 0.39 (with qiskit-terra 0.22 )から非推奨となった。 代わりに SymbolicPulse を使用し、詳細についてはそのドキュメントを確認すること。

OpenQASM アップグレードに関する注意事項

  • クラスの qasm() メソッド QuantumRegisterClassicalRegister のメソッドは削除された。 これらは、 OpenQASM 2 エクスポーターのレガシー実装の内部詳細であった。 プログラムを OpenQASM 2 にエクスポートするには qasm2.dump() または qasm2.dumps().

QPY アップグレードに関する注意事項

  • QPYの最新フォーマットバージョンは現在 Version 11で、デフォルトでは次のように実行される。 qpy.dump().

  • Qiskit 0.40.0 で非推奨となったため、モジュールパス qiskit.circuit.qpy_serialization が削除されました。 QPYシリアライズの場合は qiskit.qpyを使用します。

量子情報アップグレードに関する注意事項

  • の非推奨 __getitem__/__setitem__ マジックメソッドを削除した。 Clifford. これらのメソッドは、2023-07にリリースされたQiskit 0.44 以降、非推奨となりました。 その代わりに、 Clifford.tableau 属性にインデックスを付けるか、反復処理を行う。

  • 0.46 リリース以降非推奨となった qiskit.quantum_info.synthesis モジュールを削除。 以下のオブジェクトは qiskit.synthesis:

    この関数は 0.46 リリースですでに非推奨となったため、削除された:* cnot_rxx_decompose

    これらの関数は以前のリリースで既に非推奨となったため、削除されました:* decompose_clifford (代わりに synth_clifford_full()decompose_cnotdihedral 代わりに synth_cnotdihedral_full() 代わりに使用)

  • 関数 process_fidelity(), average_gate_fidelity(), gate_error() および diamond_norm() は、 Qiskit 0.25.0 での非推奨に従い、任意の入力をそのマークされた期待型に強制しようとしなくなりました。 マークされた型の入力を各引数に直接渡す。

合成アップグレードに関する注意事項

トランスパイラ アップグレード ノート

  • 非推奨のメソッド Target.aquire_alignment は削除されました。 Qiskit 0.43 (released 2023-05)で非推奨とされました。 代わりに Target.acquire_alignment()

  • 非推奨の関数 qiskit.transpiler.preset_passmanagers.common.get_vf2_call_limit を削除した。 代わりに get_vf2_limits()を使用してください

  • デフォルトで approximation_degree!=1.0generate_preset_pass_manager() 関数の暗黙の使用は無効化されている。 以前のデフォルトは、特に、トロッター化や、同一性に近いが等しくはない類似の演算の実行を含む作業負荷において、過度の予期せぬ近似を引き起こす可能性があった。

    この変更により、内部のパスマネージャー生成のデフォルトが transpile()これは常に意図されていたことである。 詳細は #8595を参照。

  • qiskit.transpiler.passes.basis の非推奨 Unroller クラスを削除した。 このクラスは Qiskit 0.45 で非推奨となり、その代わりに BasisTranslatorUnrollCustomDefinitions.

    なお BasisTranslatorUnrollCustomDefinitionsEquivalenceLibrary は、 Unroller とは異なる引数を取る。

    これまで Unroller(basis_gates)

    from qiskit.circuit.library.standard_gates.equivalence_library import (
        StandardEquivalenceLibrary as std_eqlib,
    )
    pm = PassManager([
        UnrollCustomDefinitions(std_eqlib, basis_gates)
        BasisTranslator(std_eqlib, basis_gates),
    ])
    translated = pm.run(circuit)
  • 非推奨の NoiseAdaptiveLayout トランスパイラー・パスは削除されました。 Qiskit 0.46.0 で非推奨とされた。 に取って代わられた。 VF2LayoutVF2PostLayout に取って代わられ、バックエンドの報告されたノイズ特性に基づいてレイアウトを設定するようになった。 パスに伴い、 layout_method プラグイン "noise_adaptive" は削除された。

  • 非推奨の CrosstalkAdaptiveSchedule トランスパイラー・パスは削除されました。 Qiskit 0.46.0 で非推奨とされた。 このパスの内部動作は、カスタムプロパティが BackendProperties インスタンスのペイロードに BackendV1 インスタンスのペイロードに設定されているカスタムプロパティに依存していたためです。 どのバックエンドもこれらのフィールドを設定していないため、このパスは削除された。 カスタムワークフローでパスに依存する場合は、Qiskit 0.46.x のバージョンを使用できます。

  • 0.46 リリース以降非推奨となった qiskit.transpiler.synthesis モジュールを削除。 以下のオブジェクトが移動しました:

  • target キーワードエイリアス TwoQubitBasisDecomposer インスタンスを関数として呼び出す際のエイリアスキーワードは、 Qiskit 0.40.0 で非推奨となったため削除されました。 第一引数として位置的に引数を渡すか、新しい名前 unitary を使うべきである。

  • Qiskit 0.40.0 で非推奨となったため、専用のトランスパイラパス LinearFunctionsSynthesis は削除されました。 非推奨となって以来、このラッパーは HighLevelSynthesisの非常に薄いラッパーになっている。

  • インポートパス qiskit.transpiler.passes.scheduling.calibration_creators が削除される。 トランスパイラーがそれを収容する、 RZXCalibrationBuilder そして RZXCalibrationBuilderNoEcho から直接インポートできる。 qiskit.transpiler.passes.

  • インポートパス qiskit.transpiler.passes.scheduling.rzx_templates が削除される。 からインポートする必要があります。 rzx_templates() から qiskit.transpiler.passes から直接インポートしてください。

  • パスのパイライン構造のパターンを改良した。 フロー・コントローラーのインスタンス化について、以下に示す構文上の糖分は削除された。

    from qiskit.transpiler import PassManager
    
    pm = PassManager()
    pm.append(my_pass, condition=condition_callable, do_while=do_while_callable)

    このキーワード引数パターンを使用する代わりに、明示的にフローコントローラをインスタンス化する必要がある。

    from qiskit.passmanager import ConditionalController, DoWhileController
    from qiskit.transpiler import PassManager
    
    pm = PassManager()
    pm.append(
      ConditionalController(
        DoWhileController(my_pass, do_while=do_while_callable),
        condition=condition_callable,
      )
    )

    キーワード引数では不可能だった、コントローラをネストさせる際の序列を管理できることに注意してほしい。 以下のように、パス・マネージャーのコンストラクターでパイプラインを構築することもできます。

    pm = PassManager(
      ConditionalController(
        DoWhileController(my_pass, do_while=do_while_callable),
        condition=condition_callable,
      )
    )
  • 内蔵フローコントローラの append メソッドが削除された。 これには以下が含まれる

    • ConditionalController.append
    • DoWhileController.append
    • FlowControllerLinear.append

    フローコントローラのタスクパイプラインは凍結され、コントローラインスタンスの作成時に渡される必要がある。

  • passess メソッドを削除した。 PassManagerStagedPassManager メソッドを削除しました。 しかしこの形式では、条件分岐やネストされた条件など、より複雑なパス・パイプラインを効率的に表現することはできない。 この表現を使用する代わりに、次のパターンを使用してください

    pm = PassManager(...)
    pm.to_flow_controller().tasks

    これはタプル形式で線形化された基本タスクインスタンスを直接返す。

  • から max_iteration 引数が削除された。 PassManager.append() そして PassManager.replace().

  • 以下のレガシークラスは、Qiskitで非推奨となったため、パスマネージャとトランスパイラモジュールから削除されました。 0.46:

    • qiskit.passmanager.flow_controllers.FlowController
    • qiskit.transpiler.fencedobjs.FencedObject
    • qiskit.transpiler.fencedobjs.FencedPropertySet
    • qiskit.transpiler.fencedobjs.FencedDAGCircuit
    • qiskit.transpiler.runningpassmanager.RunningPassManager

可視化アップグレードに関する注意事項

  • Matplotlib を使用した回路可視化のデフォルトスタイルが "iqp" に変更され、 IBM Quantum Platform と一致するようになりました。

  • 非推奨モジュール qiskit.visualization.qcstyle は削除されました。 このモジュールは Qiskit 0.39.0 以降、非推奨となりました。 代わりに、 qiskit.visualization.circuit.qcstyle

  • を渡すサポートは廃止されました。 QuasiDistribution, ProbDistributiondata またはディストリビューション・ディクショナリを plot_histogram() を渡すサポートは廃止されました。 この機能はQiskit 0.39.0 リリース(2022-10)で非推奨とされました。 からのヒストグラムをプロットしたい場合は、代わりに QuasiDistribution, ProbDistributionまたは分布辞書からヒストグラムをプロットしたい場合は plot_distribution() 関数を使うべきである。

  • QiskitTimelineStylelink_interval_dt キーが削除された。 新しい名前 link_interval_percent を使うべきだ。

各種 アップグレードの注意

  • オブジェクト qiskit.Aer は Qiskit 0.46 で非推奨となったため削除されました。 その代わりに、 qiskit_aer.Aer

  • Qiskit 0.46 で非推奨となったため、 qiskit.providers.aer からのインポートは機能しなくなりました。 代わりに、 qiskit_aer からインポートする必要がある。

  • パルスジョブは、Aerのシミュレーション機能の廃止に伴い、偽のバックエンドではサポートされなくなりました。 回路オブジェクト以外のパルスレベルのシミュレーションには、 Qiskit Dynamicsのような専用ライブラリの使用を検討してください。

  • Qiskitの execute() 機能が削除されました。 この関数は、いくつかのtranspileオプションを使って回路をトランスパイルし、いくつかのrunオプションを使ってバックエンドでそれを実行するための高レベルのラッパーとして機能した。 同じことをするには、明示的に transpile() 関数(適切なtranspileオプション付き)の後に backend.run() (適切なrunオプション付き)を続ける。

    例えば、走る代わりに:

    from qiskit import execute
    job = execute(circuit, backend)

    走ることができる:

    from qiskit import transpile
    new_circuit = transpile(circuit, backend)
    job = backend.run(new_circuit)

    あるいは、 Sampler プリミティブは、非推奨の execute() 関数と意味的に等価である。 クラス BackendSampler はプリミティブをサポートしないバックエンドのための汎用ラッパーです:

    from qiskit.primitives import BackendSampler
    sampler = BackendSampler(backend)
    job = sampler.run(circuit)
  • 非推奨の qiskit.IBMQ オブジェクトは削除されました。 このエイリアスオブジェクトはQiskit 0.40.0 リリースで非推奨とされました。 このエイリアス・オブジェクトは、属性へのアクセスを qiskit.providers.ibmq.IBMQ にリダイレクトする。 現在、 qiskit-ibmq-provider パッケージは引退し、独自の名前空間を維持する qiskit-ibm-provider パッケージに取って代わられているため、このエイリアスを維持することはもはや意味がない。 qiskit.IBMQ のエイリアスに依存していた場合は、使用方法を qiskit-ibm-provider パッケージに移行する必要があります。詳細は移行ガイドを参照してください。

  • 以前はQiskitからいくつかのデータをインタラクティブに視覚化するためのJupyterマジックとウィジェットを含んでいた、非推奨のモジュール qiskit.tools.jupyter 。 このモジュールは Qiskit 0.46.0 で非推奨となった。 この機能のほとんどは、レガシーの qiskit-ibmq-provider パッケージと直接結びついており、もはや有効ではなかったため、このモジュールは削除された。 同様の機能は qiskit-ibm-provider パッケージの qiskit_ibm_provider.jupyter モジュールからも利用できます。

  • 非推奨モジュール qiskit.tools.monitor を削除した。 JobV1 このモジュールには、主にレガシーな qiskit-ibm-provider パッケージのジョブインスタンスを追跡するためのツールが含まれていました。 このモジュールは Qiskit 0.46.0 で非推奨とされた。 レガシーパッケージ( qiskit-ibm-provider )と直接結びついていたため、削除されることになった。

  • 非推奨のインポートパス qiskit.test.mock を削除しました。これは、モック・バックエンド用のインポートを qiskit.providers.fake_provider. このモジュールは Qiskit 0.37.0 で非推奨とされた。 このモジュールを使っている場合は、インポートを qiskit.test.mock から qiskit.providers.fake_provider に更新してください。

  • qiskit.test モジュールは公開モジュールではなくなった。 これは決して公開されることを意図したものではなく、Qiskit自身のテストスイート以外で使用されることもない。 すべての機能は Qiskit 固有のものであり、代替機能は提供されていません。同様の機能が必要な場合は、独自のテストハーネスに含める必要があります。

  • 非推奨の qiskit.tools.visualization モジュールは削除された。 このモジュールはQiskit 0.46.0 リリースで非推奨となりました。 このモジュールはQiskitの視覚化モジュールの元の場所からレガシーリダイレクトされたもので、Qiskitの。 qiskit.visualization0.8.0 に移動されました。 もしまだこのパスを使っているのであれば、インポートを qiskit.tools.visualization から qiskit.visualization.

  • 非推奨の qiskit.tools.events モジュールと、それが公開していた対応する qiskit.tools.progressbar ユーティリティは削除された。 Qiskit 0.46.0 リリースで非推奨となりました。 このモジュールの機能はあまり使われておらず、 tqdmのような専用パッケージの方がよくカバーされていた。

  • qiskit.tools モジュールが取り外された。 このモジュールは Qiskit 0.46.0 で非推奨となった。 このモジュールの内容は、 qiskit.tools.parallel_map 関数を除いてすべて削除された。 qiskit.utils.parallel_map() から使えるようになりました。

プリミティブの非推奨化

  • Qiskit 0.46 で非推奨となったため、 PrimitiveJob.submit()PrimitiveJob.wait_for_final_state() のメソッドは削除されました。 これらはパブリック・メソッドとして意図されたものではなく、誤った継承構造の遺産だった。

バグ修正

  • 量子ビットのサブセットのみが要求された場合、不適切な測定スケジュールが返されるのを修正しました。 以前は、すべての量子ビットの測定スケジュールが返されていた。

  • text の回路ドロワーで、クラスでない操作を表示する際の問題を修正。 circuit.instruction.Instruction クラスではありません。 これらの操作は引き出しを故障させる原因となる。 例としては Clifford そして AnnotatedOperation.

  • トランスパイラ・パスの問題を修正しました。 SetLayout トランスパイラ・パスの問題を修正しました。重複したエントリを含む無効な整数リストが入力されると、無効な Layout が生成され、その後のトランスパイラ・パスが暗号化されたエラーで失敗する問題を修正しました。 が呼び出されたときにキャッチされるようになった。 SetLayout.run() が呼び出されると InvalidLayoutError エラーが発生し、整数リストに重複したエントリがあることを示します。

  • QPY qpy.dump()qpy.load()を使用)は、アノテーション付き操作(AnnotatedOperation).

  • 電話 copy() または copy_empty_like() を呼び出すと、 BlueprintCircuitglobal_phase をコピーに正しく伝搬するようになった。 以前は、コピー後のグローバル位相は常にゼロだった。

  • QuantumCircuit.compose() が正しく発生するようになった。 CircuitErrorqubits clbits を正しく発生させるようになった。

  • QPY qpy.dump()qpy.load())はクリフォード演算子(Clifford).

  • mpl の回路ドロワーで、デフォルトのケースが空の場合、テキストがボックスの端を越えて印刷される問題を修正。 SwitchCaseOp デフォルトのケースが空の場合、テキストが

  • の量子ビット引数ブロードキャストでは QuantumCircuit.delay() は、意図した通り、個々の Delay を生成するようになった。 以前は、特定の反復記号(例えば setのような)が与えられた場合、代わりに無言で無効な回路を生成し、異常な場所で失敗する可能性があった。

  • プリセット・パス・マネージャー transpile() で生成されたような)プリセットパスマネージャを実行するときに発生する問題を修正しました。 generate_preset_pass_manager()によって生成されたような)を使ったり実行したりする際に、出力に余分なバリアが追加されてしまう問題を修正しました。 QuantumCircuit. 場合によっては、いくつかの単一量子ビット Barrier ディレクティブが出力回路に含まれることもある。 これは、不連続接続のための内部処理によって生成された内部状態で、誤って出力回路に加えられていた。 #11649を修正

  • からのゲートのキャリブレーションデータをロードしようとしたときのエラーを修正しました。 Target からゲートのキャリブレーション・データをロードしようとしたときのエラーを修正しました。 これは、バックエンドが部分的な較正データしか報告しない場合に発生します。たとえば、コマンド定義で波形パルスを参照しても、その波形パルスがパルス・ライブラリに含まれていない場合などです。 この状況では、Qiskitパルスオブジェクトを構築することができず、結果としてキャリブレーション用のパルススケジュールを構築することができませんでした。 校正データが不完全な場合 Target 較正データが不完全な場合、較正がまったく報告されていないのと同じように扱われ、例外は発生しません。

  • この Operator.power() メソッドは浮動小数点指数で動作するようになった。

  • OptimizeSwapBeforeMeasure パスにおいて、スワップ命令とメジャー命令を含む回路が誤って最適化される問題を修正。 例:

    from qiskit import QuantumCircuit
    from qiskit.transpiler.passes import OptimizeSwapBeforeMeasure
    pass_ = OptimizeSwapBeforeMeasure()
    qc = QuantumCircuit(2, 1)
    qc.swap(0, 1)
    qc.measure(0, 0)
    qc.measure(0, 0)
    print(qc.draw())
    print(pass_(qc).draw())

    は以前は印刷されていた:

            ┌─┐┌─┐
    q_0: ─X─┤M├┤M├
          │ └╥┘└╥┘
    q_1: ─X──╫──╫─
             ║  ║
    c: 1/════╩══╩═
             0  0
         ┌─┐
    q_0: ┤M├───
         └╥┘┌─┐
    q_1: ─╫─┤M├
          ║ └╥┘
    c: 1/═╩══╩═
          0  0

    そして今、2番目の回路は正しく最適化されている:

    q_0: ──────
         ┌─┐┌─┐
    q_1: ┤M├┤M├
         └╥┘└╥┘
    c: 1/═╩══╩═
          0  0
  • QPYシリアライゼーションで、以下のような問題が修正されました。 QuantumCircuit に同じ属性を持つ複数のカスタム命令インスタンスが含まれていた場合の QPY シリアル化の問題を修正しました。 name 属性を持つ複数のカスタム命令インスタンスが含まれる場合のQPYシリアライズの問題を修正しました。 Version11 以前のQPYフォーマットのバージョンでは、QPYペイロードはこれらのインスタンスを区別せず、回路内の最初のインスタンスのプロパティのみをシリアライズしていた。 このため、カスタム命令の他のプロパティが異なっていても名前が同じであれば、デシリアライズが正しく行われない可能性がある。 これはQPY Version 11で修正され、カスタム命令の各インスタンスが個別にシリアライズされるようになり、重複した名前による潜在的な衝突はなくなりました。 8941を修正。

  • 関数の問題を修正した。 qpy.dump() 関数の問題を修正しました。 use_symengine フラグが True と評価される真理値オブジェクトに設定されていますが、実際にはブール値 True ではない場合、生成される QPY ペイロードが破損していました。 例えば、 use_symengineHAS_SYMENGINEに設定すると、このオブジェクトはboolとしてキャストされたときに True と評価されるが、実際には True

  • のバグを修正。 StabilizerState 文字列表現のバグを修正。

  • バグ convert_to_target()BackendV2Converter が予期せぬエラーを発生させるバグが解決された。 このバグは、変換するバックエンドに、バックエンドのプロパティに定義がないゲートの検量線が含まれていた場合に発生した。 このようなゲートは、有限の量子ビットの校正が報告された場合でも、理想的なエラーのない命令としてすべての量子ビットにブロードキャストされる。

  • の問題を修正しました。 circuit_drawer() 関数と QuantumCircuit.draw() メソッドの問題を修正しました。

  • InstructionDurations.from_backend() のサブクラスのインスタンスを返すようになった。 InstructionDurations のインスタンスを返すようになりました。

  • トランスパイラ・パスは UnitarySynthesis トランスパイラ・パスは、存在しない合成プラグインが指定された場合、実行時まで待たずに初期化時にエラーを発生するようになりました。 #11355 を修正。

  • OpenQASM 3輸出業者 qasm3.dump()dumps() は、 OpenQASM 3 プロジェクトがバージョン管理を標準化したため、 3 という非修飾ではなく、 3.0 というバージョンを主張するファイルを正しく出力するようになりました。

  • のパラメトリック形式は XXPlusYYGateXXMinusYYGateget_standard_gate_name_mapping() から返されるパラメータは、 β\beta のパラメータだけでなく、 θ\theta の初期回転も含むようになりました。

  • パスは TemplateOptimization のネイティブな記号式フォーマットを使ってパラメトリック式を返すようになりました。 ParameterExpressionを使うようになりました。 ほとんどのサポートされているプラットフォームでは、これは式がSymengineオブジェクトになることを意味する。 以前は、パスが不一致のオブジェクトを返すことがあり、パラメータ処理コードで後で失敗する可能性があった。

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