Skip to main content
IBM Quantum Platform

Qiskit 0.34 リリースノート


0.34.2

Terra 0.19.2

前奏曲

Qiskit Terra 0.19.2 は主にバグフィクスリリースですが、すべての主要プラットフォームの Python 3.10 用に作られたホイールも付属しています。

新機能

  • Python 3.10。 これには、対応プラットフォーム上の Python 3.10 用に、 PyPI にコンパイル済みバイナリを公開することも含まれる。

アップグレードの注意

バグ修正

  • を変換しようとするバグを修正した。 CVaRMeasurement を密行列に変換しようとするバグを修正した。 PauliSumOp を密行列に変換しようとするバグを修正。 大きな演算子(> 16 qubits)の場合、この計算は非常に高価であり、 qiskit.utils.algorithm_globals.massive = True を使用して明示的に有効にしないとエラーが発生した。 このチェックは、大量の量子ビットに対しても効率的である。

  • DAGCircuit.draw() と関連する関数 dag_drawer() は、提供されたファイル名が有効でない場合、より有用なエラーメッセージを表示するようになりました。

  • QuantumCircuit.add_register() が与えられても、回路内で AncillaQubit ビットがすでに存在する AncillaRegister ビットが既に存在する場合

  • の固定変換 QuantumCircuitへの変換を固定した。 ClbitInstructionへの変換を修正した。 circuit_to_instruction() 関数または QuantumCircuit.to_instruction() メソッドを使用する際に 例えば、以下のようになります:

    from qiskit.circuit import QuantumCircuit, Qubit, Clbit
    
    qc = QuantumCircuit([Qubit(), Clbit()])
    qc.h(0).c_if(qc.clbits[0], 0)
    qc.to_instruction()
  • レジスタが重複ビットを正しく拒否するようになった。 7446を修正。

  • FakeOpenPulse2Q モック・バックエンドは、その量子ビットの T2 時間と読み出しエラーが保存されるようになった。 これらは任意の値であり、作成時の実際のバックエンドとほぼ一致している。

  • の2量子ビット進化の量子ビット次数を固定する。 PauliEvolutionGateもし積公式合成で使うなら 例えば、以前は IIZ + IZI + IZZ

    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.opflow import I, Z
    operator = (I ^ I ^ Z) + (I ^ Z ^ I) + (I ^ Z ^ Z)
    print(PauliEvolutionGate(operator).definition.decompose())

    生成

         ┌───────┐
    q_0:Rz(2) ├────────
         ├───────┤
    q_1:Rz(2) ├─■──────
         └───────┘ │ZZ(2)
    q_2: ──────────■──────

    であるのに対して、今は正しくこうなる

         ┌───────┐
    q_0:Rz(2) ├─■──────
         ├───────┤ │ZZ(2)
    q_1:Rz(2) ├─■──────
         └───────┘
    q_2: ─────────────────
  • latex および mpl の回路ドロワーで、名前に複数のアンダースコアを含むレジスタ名が正しく表示されない問題を修正。

  • ドロワーからの配列出力における負の数は、巨大な分子と分母を持つ分数ではなく、10進数として表示されるようになりました。 正の数と同様に、比率が小さい数同士であれば、分数であることに変わりはない。

  • ターゲット上で Target.get_non_global_operation_names() メソッドをターゲット上で実行すると、理想的なグローバルオペレーションを持つターゲット上で例外が不正に発生する問題を修正しました。 以前は、このメソッドが、命令のプロパティが None に設定されている、理想的なグローバルに定義された操作を含むターゲット上で呼び出された場合、このメソッドは、その命令をグローバルとして扱う代わりに例外を発生させていた。

  • 関数に transpile() 関数の問題を修正しました。 Target オブジェクトを target kwarg で直接渡された場合に失敗することがある関数の問題を修正した。

  • の問題を修正した。 transpile() 関数で、 backend 引数が BackendV2 または Targettarget であった場合に失敗することがあった問題を修正した。

  • ブロッホ球をプロットすると、Jupyterで AttributeError が発生する問題を修正。また、 Matplotlib 3.3 または 3.4 ( 3.5 は不可)で図をトリミングしようとすると、 が発生する問題を修正。 例えば、以下のコードは以前はメッセージとともにクラッシュしていた:

    AttributeError: 'Arrow3D' object has no attribute '_path2d'

    が、現在サポートされているすべてのバージョンの Matplotlib で成功する:

    from qiskit.visualization import plot_bloch_vector
    plot_bloch_vector([0, 1, 0]).savefig("tmp.png", bbox_inches='tight')
  • のバグを修正した。 PauliSumOp.permute() のバグを修正しました。 このバグは、演算子の量子ビット数を変更しない順列でのみ発生した。

  • PauliEvolutionGate.inverse() 、以前は進化時間を逆算して逆数を計算していたのを修正。 これは、演算子を正確に進化させた場合にのみ正しい逆数となる。 特に、トロッター化に基づく時間発展の逆数が正しくなかった。

  • この QuantumInstance.execute() メソッドは、回路のリストが与えられると、もはやその入力を変異させない。

  • 明示的なno-op定義があったカスタム命令のQPYシリアライズを修正。 これまでは、(定義が与えられていない)不透明なゲートと同じように書き込まれ、その後読み込まれていた。 これで、空の定義を正しくラウンドトリップできるようになった。 例えば、以下のようになります:

    import io
    from qiskit.circuit import Instruction, QuantumCircuit, qpy_serialization
    
    # This instruction is explicitly defined as a one-qubit gate with no
    # operations.
    empty = QuantumCircuit(1, name="empty").to_instruction()
    # This instruction will perform some operations that are only known
    # by the hardware backend.
    opaque = Instruction("opaque", 1, 0, [])
    
    circuit = QuantumCircuit(2)
    circuit.append(empty, [0], [])
    circuit.append(opaque, [1], [])
    
    qpy_file = io.BytesIO()
    qpy_serialization.dump(circuit, qpy_file)
    qpy_file.seek(0)
    new_circuit = qpy_serialization.load(qpy_file)[0]
    
    # Previously both instructions in `new_circuit` would now be opaque, but
    # there is now a correct distinction.
    circuit == new_circuit
  • 不足していた BackendV2.provider 抽象クラスの実装に BackendV2 の実装に欠落していた属性を追加した。 以前は BackendV2 バックエンドはプロバイダーで初期化することができたが、ユーザーからはアクセスできなかった。

  • のサポートを修正した。 QuantumInstance クラスのサポートを修正しました。 BackendV2 バックエンドで 以前は QuantumInstanceBackendV2 を使おうとするとエラーになっていた。

  • のバグを修正。 VQE において、ansatzのサイズが変更された場合に、ansatzのパラメータが明示的にASCIIソートされたままになっていたバグを修正した。 このため、結果オブジェクトの optimal_point 属性で最適化された値の順序が不一致になった。

    特に、ユーザーによってansatzが設定されず、VQEが11以上の自由パラメータを持つデフォルトを選択した場合に、このバグが発生した。

  • でパーサーを停止した。 QuantumCircuit.from_qasm_str()from_qasm_file() のパーサーは、 2.0 以外の言語バージョンであることを示す OpenQASM プログラムを受け入れないようにした。 このパーサーは OpenQASM 2.0 にのみ対応している。 OpenQASM 3.0 からインポートされた回路のサポートは、今後のリリースで追加される予定である。

  • 制御フロー命令を含む QuantumCircuit オブジェクトのシリアライズを修正しました。 以前は、以下を含む回路をシリアライズしようとすると IfElseOp, WhileLoopOpまたは ForLoopOp を含む回路をシリアライズしようとすると、シリアライズに失敗していました。 7583を修正。

  • のQPYシリアライズを修正。 QuantumCircuit ビットのサブセットを含む QuantumRegister または ClassicalRegister. 以前は、このような回路をシリアライズしようとすると、これらのビットをスタンドアロンとして誤って扱っていました。 Qubit または Clbit レジスタがセットされていない 例えば、このような回路を直列化しようとした場合:

    import io
    from qiskit import QuantumCircuit, QuantumRegister
    from qiskit.circuit.qpy_serialization import load, dump
    
    qr = QuantumRegister(2)
    qc = QuantumCircuit([qr[0]])
    qc.x(0)
    with open('file.qpy', 'wb') as fd:
        dump(qc, fd)

    この回路がロードされると、回路がレジスタのビットのサブセットしか含んでいなくても、レジスタは正しくフルに入力される。

  • QFT インスタンス化されたり、精度が落ちるような設定でビルドされた場合は、 OverflowError を上げるのではなく、警告を出すようになりました。 これは、量子ビット数が非常に大きい場合(1000をわずかに超える)、近似度が同様に大きくなくても起こりうる。 これで回路は正常に構築されるが、倍精度浮動小数点数の制限により、いくつかの角度はゼロと区別できないかもしれない。

エア 0.10.3

前奏曲

Qiskit Aer 0.10.3 は主にバグフィクスリリースで、 0.10.2 リリース以降に発見されたいくつかのバグを修正しています。 しかし、このリリースでは、すべての主要プラットフォームでプリコンパイルされたバイナリホイールを含む Python 3.10 での実行のサポートも導入されている。 このリリースには、 macOS の arm64 用のコンパイル済みバイナリ・ホイールも含まれています。

新機能

  • Python 3.10。 これには、対応プラットフォーム上の Python 3.10 用に、 PyPI にコンパイル済みバイナリを公開することも含まれる。

  • M1 macOS システムのサポートを追加。 arm64 macOS でサポートされている Python バージョン >= 3.8 用のプリコンパイル済みバイナリは、今回および今後のリリースについては PyPI で公開される予定です。

アップグレードの注意

バグ修正

  • RelaxationNoisePass 、実際の命令の単位に関係なく、命令の持続時間が常に dt 時間単位であると仮定されていたバグが修正された。 すべての命令継続時間単位で単位変換が正しく処理されるようになりました。

    詳細は #1453を参照のこと。

  • を返すノイズ関数の LocalNoisePass に関する問題を修正。 QuantumCircuit を返すノイズ関数の問題を修正しました。 これらは、シミュレートするためにアンロールする必要がある不透明な回路命令としてDAGに追加された。 この修正により、回路命令が新しいDAGに追加され、すべての回路命令がシミュレータでサポートされていれば、追加のアンロールなしでシミュレーションできるようになります。

    詳細は #1447を参照。

  • 回路のゲート数が fusion_parallelization_threshold を超える場合、対角ゲートを生成するためのマルチスレッド・トランスピレーションが正しく動作するようになった。 以前は、異なるスレッドが同じ要素を複数のブロックに融合させることがあり、不正確な結果が生じていた。

  • パラメータ化されたQobjにおける回路の切り捨てに関するバグを修正しました。 以前は、パラメータ化されたQObjのパラメータは、その回路の未使用の量子ビットが切り捨てられた場合に間違って解決されることがありました。

    詳細は #1427を参照のこと。

イグニス 0.7.0

変更なし

IBM Q プロバイダー 0.18.3

変更なし


0.34.1

Terra 0.19.1

変更なし

エア 0.10.2

バグ修正

  • ループ・パラメーターがループ本体で使用されていない for ループのシミュレーションを修正。 例えば、以前はこのコードは失敗していたが、今は成功する:

    import qiskit
    from qiskit.providers.aer import AerSimulator
    
    qc = qiskit.QuantumCircuit(2)
    with qc.for_loop(range(4)) as i:
        qc.h(0)
        qc.cx(0, 1)
    
    AerSimulator(method="statevector").run(qc)
  • QuantumError.to_dict() 、N量子ビット回路命令において、アセンブルされた命令が命令量子ビットではなく、常に量子ビット [0, ..., N-1] に適用されるバグを修正。 このバグは、デバイスと偽のバックエンドノイズモデルにも影響した。

    詳細は 1415号を参照。

イグニス 0.7.0

変更なし

IBM Q プロバイダー 0.18.3

変更なし


0.34.0

Qiskit 0.34.0 にはQiskit Aerのポイントリリースが含まれています: バージョン 0.10.1、これはリリース直後に発見されたバージョン 0.10.0 のパフォーマンスの不具合を修正したものです。 Qiskit Aer 0.10.0 および 0.10.1 のリリースノートは以下をご参照ください。

Terra 0.19.1

変更なし

エア 0.10.1

前奏曲

Qiskit Aer 0.10.1 パッチは、Qiskit Aer 0.10.0 で発生したパフォーマンスの不具合を修正します。

バグ修正

  • Python multiprocessing呼び出しが意図せずネストされた結果、 Python からC++にノイズ・モデルをロードする際のシリアライゼーション・オーバーヘッドが大幅に増加したことによるノイズ・シミュレーションのパフォーマンス低下を修正しました。 詳細は 1407号を参照。

エア 0.10.0

前奏曲

Qiskit Aer 0.10 リリースには、いくつかのパフォーマンスとノイズモデルの改善が含まれています。 ハイライトをいくつか挙げる:

  • パラレルショットGPUおよびHPCシミュレーションの性能向上
  • QASM 3.0 制御フロー命令を含む回路のシミュレーションをサポート
  • バックエンドのノイズモデルでスケジュール回路の緩和ノイズをサポート
  • カスタムのゲートエラーやノイズモデルを定義し、回路に挿入するためのユーザー作成のトランスパイラパスをサポート。

新機能

  • Qiskit-Terra 0.19.0 で導入された QASM 3.0 制御フロー命令のサポートを追加。 サポートされている命令は以下の通り。 ForLoopOp, WhileLoopOp, ContinueLoopOp, BreakLoopOp, IfElseOp.

  • GPUシミュレーションのためのバッチショットシミュレーションの最適化が追加されました。 このオプション機能は、1つまたは複数のGPUで利用可能なメモリを使用して複数のシミュレーションショットを並列に実行し、ノイズモデルや中間測定値を含むマルチショットシミュレーションのパフォーマンスを大幅に向上させます。

    このオプションは、 device="GPU" と、 "statevector" または "density_matrix" のシミュレーション methodAerSimulator と併用する場合に、デフォルトで有効になります。 シミュレーターのオプションで batched_shots_gpu=False

    この最適化は、複数のシミュレーションを並行して実行するのに十分なGPUメモリがある、小から中程度の数の量子ビットに最も有効です。 この最適化を有効にするための最大アクティブ回路量子ビット数は、 batch_shots_gpu_max_qubits シミュレータ・オプションを使用して設定できます。 このオプションのデフォルト値は16である。

  • カスタムエクゼキュータに、ノイズの多い回路の複数ショットを並列に実行するための新しい max_shot_size オプションを追加。

    例えば、カスタムエグゼキューターで max_shot_size

    backend = AerSimulator(
       max_shot_size=1, max_job_size=1, executor=custom_executor)
    job = backend.run(circuits)

    は、ノイズの多い回路のショットを複数の回路に分割する。 個々のショットの実行がすべて終了すると、ジョブの結果は自動的に1つのオブジェクトにまとめられ、 によって返される。 Result オブジェクトにまとめられ、 job.result() によって返される。

  • mps_swap_direction 、2qubitゲートの内部スワップの方向を決定できるシミュレータオプションを追加。 可能な値は"mps_swap_right"および"mps_swap_left"です。 回路によっては、スワップの方向が性能に影響することもある。

  • AerSimulator"matrix_product_state" シミュレーション手法に新しい測定サンプリング最適化を実装。 現在のところ、このアルゴリズムは、すべての量子ビットが測定され、シミュレータ mps_sample_measure_algorithm シミュレータ・オプションが "mps_probabilities" に設定されている場合にのみ使用されます。

  • AerSimulator"matrix_product_state" シミュレーショ ン法の対策命令のパフォーマンスを改善した。

  • スタビライザー・シミュレーション・メソッドの状態をオブジェクトとして保存するための SaveClifford 命令を追加。 Clifford オブジェクトとして保存する命令を追加。

    ただし、この命令は保存された状態を、 SaveStabilizerStabilizerState オブジェクトの代わりに Clifford オブジェクトとして返す。

  • 命令依存の量子エラーを回路に挿入するためのトランスパイラ・パスを2つ追加:

    • qiskit.providers.aer.noise.LocalNoisePass
    • qiskit.providers.aer.noise.RelaxationNoisePass

    LocalNoisePass パスは、以下の形式のノイズ生成関数を定義することで、カスタムパラメータ化されたノイズモデルを実装するために使用できます

    def fn(
        inst: Instruction,
        qubits: Optional[List[int]] = None,
    ) -> InstructionLike

    これは、命令と量子ビットの引数のプロパティやパラメータに依存するノイズ命令(例えば、 QuantumError または他の命令)を返します。

    この関数は、回路内のすべての命令、または指定されたサブセットに適用することができます(詳細については、 LocalNoisePass のドキュメントを参照してください)

    RelaxationNoisePass は、 LocalNoisePass の特殊なケースであり、あらかじめ定義されたノイズ関数を使用する。このノイズ関数は、命令の各クビットに対して、 thermal_relaxation_error() のテンソル積を返す。この積は、命令の持続時間と、パスの緩和時定数パラメータに依存する。

  • NoiseModel.from_backend() および AerSimulator.from_backend() によって実装された基本的なデバイス・ノイズ・モデルは、 RelaxationNoisePass を使用して、回路遅延ゲートの持続時間依存緩和誤差を追加できるようにアップグレードされました。

    ノイズの多いシミュレーションを実行するときにこのノイズを有効にするには、まず、次のように回路をスケジュールしてスケジュールされた遅延命令を挿入する必要があります:

    backend = AerSimulator.from_backend(ibmq_backend)
    scheduled_circuit = qiskit.transpile(
        circuit, backend=backend, scheduling_method='asap')
    result = backend.run(scheduled_circuit).result()

    回路がスケジューリングされずにトランスパイルされた場合(また、遅延命令が含まれていない場合)、ノイズの多いシミュレーションは遅延緩和エラーの影響を含みません。 この場合、シミュレーションは以前のqiskit-aer 0.9 シミュレーションと同等になり、緩和ノイズはバックエンドのプロパティから得られる持続時間に基づいてゲート命令に追加されるだけです。

  • 例えば、 QuantumError のコンストラクタは、 noise_ops の引数としていくつかの新しいタイプの入力を受け付けるようになった:

    import numpy as np
    
    from qiskit import QuantumCircuit
    from qiskit.circuit.library import IGate, XGate, Reset
    from qiskit.quantum_info import Kraus
    from qiskit.providers.aer.noise import QuantumError
    
    # Quantum channels
    kraus = Kraus([
        np.array([[1, 0], [0, np.sqrt(1 - 0.9)]], dtype=complex),
        np.array([[0, 0], [0, np.sqrt(0.9)]], dtype=complex)
    ])
    print(QuantumError(kraus))
    
    # Construction from a QuantumCircuit
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    error = QuantumError(qc)
    
    # Construction from a tuple of (Instruction, List[int]), where the list of
    # integers represents the qubits.
    error = QuantumError((Reset(), [0]))
    
    # Construction from an iterable of objects in the same form as above, but
    # where each also has an associated probability.
    error = QuantumError([
        ((IGate(), [0]), 0.9),
        ((XGate(), [0]), 0.1),
    ])
    
    # A short-hand for the iterable form above, where the qubits are implicit,
    # and each instruction is over all qubits.
    error = QuantumError([(IGate(), 0.9), (XGate(), 0.1)])

    元のJSONベースの入力フォーマットは非推奨であることに注意。

  • 与えられた関数をノイズモデル内のすべての QuantumErrorsに適用してノイズモデルを構築するためのユーティリティ関数 qiskit.providers.aer.utils.transform_noise_model() を追加。

  • QuantumError に含まれる回路と NoiseModel に含まれるすべてのエラーをトランスパイルするための2つのユーティリティ関数 qiskit.providers.aer.utils.transpile_quantum_error()qiskit.providers.aer.utils.transpile_noise_model() を追加。

  • に変換することなく、 QuantumError オブジェクトを直接追加する機能を追加。 QuantumCircuit 命令に変換することなく Kraus 命令に変換することなく

    ノイズの多い回路命令を定義するための NoiseModel を構築する代わりに、あるいはそれに加えて、量子エラーを含む回路を AerSimulator および QasmSimulator シミュレータで実行できるようになった。

    例:

    from qiskit import QuantumCircuit
    from qiskit.providers.aer import AerSimulator
    from qiskit.providers.aer.noise import pauli_error
    
    error_h = pauli_error([('I', 0.95), ('X', 0.05)])
    error_cx = pauli_error([('II', 0.9), ('XX', 0.1)])
    
    qc = QuantumCircuit(3)
    qc.h(0)
    qc.append(error_h, [0])
    qc.cx(0, 1)
    qc.append(error_cx, [0, 1])
    qc.cx(0, 2)
    qc.append(error_cx, [0, 2])
    qc.measure_all()
    
    backend = AerSimulator(method='stabilizer')
    result = backend.run(qc).result()
    result.get_counts(0)

    量子エラーを含む回路は、量子チャネルを使用して評価することもできる。 quantum_info 量子チャネルと DensityMatrix クラス。

アップグレードの注意

  • いくつかの保存命令の戻り値の型が、生の NumPy 配列や辞書ではなく、対応するQiskit Terraクラスに変更されました。 変更されたタイプは以下の通り

    • save_statevector() として返すようになりました。 Statevector
    • save_density_matrix() として返すようになりました。 DensityMatrix
    • save_stabilizer() として返すようになった。 StabilizerState
    • save_unitary() として返すようになった。 Operator
    • save_superop() として返すようになった。 SuperOp
    • save_probabilities_dict() として返すようになりました。 ProbDistribution
  • qiskit.providers.aer.noise.errors.standard_errors に含まれるすべての関数がデフォルトで標準ゲートを使用するように更新されたため、 standard_gates のデフォルト値を None に変更。

  • サポートされていない引数が approximate_quantum_error() に与えられると、 RuntimeError の代わりに NoiseError が発生するようになった。

非推奨のメモ

  • save_statevector(), save_density_matrix(), save_unitary(), save_superop() の戻り値の型に NumPy ndarray のメソッドと属性を使用することは非推奨となり、将来のリリースでは機能しなくなります。 これらの命令は現在 qiskit.quantum_info クラスを返します。 これらのオブジェクトを NumPy 配列として扱う部分的な後方互換性は、非推奨期間中に内部配列にメソッドを転送することによって実装されています。

  • の引数に BackendPropertiesbackend NoiseModel.from_backend() オブジェクトを渡すことは、継続時間に依存する遅延ノイズと互換性がないため、非推奨となりました。 代わりにQiskit Terra BackendV1 オブジェクトを渡す。

  • QuantumError コンストラクタの number_of_qubits オプションを非推奨とし、寸法を自動的に決定するようにした。

  • QuantumError コンストラクタの standard_gates オプションを非推奨とし、基底変更機能を外部化することにした。 多くの場合、 approximate_quantum_error() を使えば、どんなエラーでも、特定のゲートのみで定義されたエラーに変換することができる。

  • qiskit.providers.aer.noise.errors.standard_errors の全関数の standard_gates オプションを非推奨とし、デフォルトではできるだけ標準ゲートを混ぜた形でエラーを返すようにした。

  • errorutils にあるすべての関数は、 qiskit.providers.aer.noise.errors.standard_errors の関数を実装するためだけに使われるヘルパー関数であり、プライベート関数として提供されるべきであったため、非推奨とした。

  • NoiseModel.from_backend()standard_gates オプションを非推奨とし、このような基底変更機能を外部化することにした。

  • Qobj (JSON) フォーマットに依存しないノイズモデルを作るために、 NoiseModel.from_dict() は廃止されました。

  • approximate_quantum_error()approximate_noise_model() を除く qiskit.providers.aer.noise.utils.noise_transformation のすべてのパブリック変数、関数、クラスを非推奨とした。なぜなら、これらは approximate_* 関数の実装にのみ使用されることを意図したヘルパー関数であり、プライベート関数として提供されるべきであったからである。

  • C++コードが回路を切り捨てた場合、ノイズモデルを自動的に切り捨て、再マップするようになったため、 remap_noise_model()

その他の注意事項

  • 関数 approximate_quantum_error() の実装を変更すると、Qiskit Aer 0.9 と比較した結果の近似誤差が変わる可能性があります。

イグニス 0.7.0

変更なし

IBM Q プロバイダー 0.18.3

バグ修正

  • Qiskit Terra 0.19.1 以上で ParameterExpressions を使用した場合の JSON エンコードおよびデコードに関する問題を #1100 で修正。 以前は、JSON出力から再構築された Parameter インスタンスは、異なる一意の識別子を持ち、入力と不同に見えることがあった。 これで彼らは正しいバック・アイデンティティを持つことになる。
このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。