Skip to main content
IBM Quantum Platform

Qiskit SDK 2.2 リリースノート


2.2.3

前奏曲

Qiskit 2.2.3 では、複数の回路に対して PassManagerrun() メソッドを使用するときに Qiskit 2.2.2 で導入されたバグが修正されています。

アップグレードの注意

  • ConsolidateBlocks エントリで ConsolidateBlocks_qubit_map キー PropertySet を読み取ります。 このキーとその値は公開されておらず、他のパスによって読み書きされるべきではありません。

バグ修正

  • 複数の回路で同一 ConsolidateBlocks インスタンスを再利用する問題を修正。これには、複数の回路を transpile() 伴う呼び出しやプロセスベースの並列化がないケースも含まれる。 Qiskit 2.2.2 で導入されたバグにより、異なる回路で同じインスタンスが再利用された場合、パスがパニック状態になるか無効な出力を生成する問題が発生しました。

2.2.2

前奏曲

Qiskit 2.2.2 は、 v2.2 マイナーバージョンシリーズのバグフィックスリリースです。

バグ修正

  • 回路パラメータ __deepcopy__() の深部コピーが行われていなかった実装 QuantumCircuit を修正しました。 その結果、コピーされた回路 BoxOp 内の変数を変更しても、元の回路には影響しなくなる。

  • 固定角度パラメータを持つ1量子ビットゲートを含む Target パッシブでパッシブが初期化される際の Optimize1qGatesDecomposition パッシブの問題を修正しました。 以前は、ターゲットに含まれていないゲートを出力する可能性がありました。これは、ターゲット内のゲートが任意のパラメータ値をサポートしているかどうかを確認していなかったためです。 #14743 を修正しました。

  • 修正 BasisTranslator 内容:ブロック ControlFlowOp 内のマルチ量子ビットゲートが、ソース回路からの絶対インデックスではなくローカル量子ビットインデックスを使用して追跡する誤った動作を修正しました。

  • トランスパイラパス ConsolidateBlocks は、制御フロー操作への再帰処理中に、特定のゲートがハードウェアでサポートされているかどうかを正しく評価するようになりました。

  • qpy.dump() QPYバージョン16以降では、標準 gzip ライブラリモジュールで開かれたファイル .gz への書き込みが可能になりました。 詳細は #15157 を参照してください。

  • 開状態制御ゲートを逆演算する際に、その制御状態を保持 MCPhaseGate.inverse() する方法を修正しました。

  • ConsolidateBlocks レガシーの run_list または `` block_listPropertySet キーで無効または期限切れの分析を検出した場合、パニックを起こす代わりに、 Python -space 例外を返すようになります。 #14646 を修正しました。

  • Optimize1qGatesDecomposition が、に対して大きすぎる回路上で Target実行を試みた場合、Rust空間 TranspilerError パニックではなくを発生させるようになります。 #15116 を修正しました。

  • スケジューリングパスは、 ALAPScheduleAnalysis および ASAPScheduleAnalysis、操作を含まない回路を正しく処理するようになりました。 以前、彼らは「期間が提供されていない」と虚偽の主張をして TranspilerError 提起した。 #15145 を修正しました。

  • 回路テキスト描画機能の不具合を修正しました。この不具合は、制御フロー操作内の回路ブロックが、外側の回路とは異なるレジスタ上に定義された場合に発生する可能性がありました。 この状況は、例えば操作を直接 ControlFlowOp 追加する場合や、トランスパイル後の回路において発生する可能性がある。


2.2.1

前奏曲

Qiskit 2.2.1 は、 2.2.0 リリースで確認されたいくつかのバグを修正した小さなパッチリリースです。

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

  • 完全一致実行の最大呼び出し数および試行回数の制限値が VF2PostLayout 、大規模結合マップにマッピングされる高対称性試行回路における過度の実行時間増加を回避するため、 optimization_level=3 削減されました。

バグ修正

  • DAGCircuit.apply_operation_back(), apply_operation_back() そして 新しい辺を確定 circuit_to_dag() 的な順序で追加します。 以前の動作では、特定のトランスパイラ処理(例: SabreSwap)がDAGを非決定的な順序で探索する可能性がありました。

  • DAGCircuit.apply_operation_front() 古典的条件を含むノードを処理する際、無効な自己ループを挿入できなくなった。

  • メソッド SabreSwap.run() 実行後にインスタンス SabreSwapSabreSwap をピクル化するとエラー pickle が発生する問題を修正しました。 #15071 を修正しました。

  • 演算子がユニタリであるかどうかのチェックにおいて、入力許容値が正しく反映されない is_unitary() 問題を修正しました。 このメソッドは、演算子を単純化し、それが恒等演算子と等しいかどうかを確認する際に、提供された atol および rtol パラメータを正しく使用するようになりました。 これは #14107 を修正します。


2.2.0

前奏曲

Qiskit v2.2 は、C APIとトランスパイラのいくつかの機能強化に加え、その他多くの改良とバグ修正を加えています。 この新リリースの主な特徴は以下の通り:

  • C API トランスパイル関数: C API に量子回路をトランスパイルする関数が追加されました: qk_transpile(). この関数は、スタンドアロンのCコンテキストにおける Pythontranspile() 関数と同等です。
  • リティンスキー変換パス: 記述された変換を実装する arXiv:1808.02892 新しい変換パス LitinskiTransformation 。 このパスは、通常、フォールトトレラントアーキテクチャのコンパイル時に使用されます。
  • ターゲットに対する角度境界サポート: この Target クラスは、ターゲットに追加されたパラメータ化操作の許容値に対して境界を指定する機能をサポートするようになりました。 命令が追加されると、オプション引数 angle_bounds を指定して Target パラメータ化された回転ゲートの上限と下限を指定できます。 トランスパイラ処理の新たなパスが WrapAngles 追加され、トランスパイラ処理パイプラインの一環として角度制約を強制するようになりました。

v2.2 リリースシリーズは、 Python 3.9 をサポートする最後のマイナーリリースシリーズです。 Qiskit をソースからビルドする際に使用する Rust の最小サポートバージョンは Rust v1.85 となり、 2.1.0 の 1.79 から引き上げられています。 上記およびその他の変更点の詳細については、以下のリリースノートおよび更新されたドキュメントをご覧ください。

C API の機能

回路の特徴

  • 新しい手法が提供され、回路が物理量子ビット QuantumCircuit.ensure_physical()上で定義され、量子ビットのインデックスが物理量子ビットを指すことを保証する。 メタデータの概念に関する詳細は、 ドキュメント内の抽象回路と物理回路の表現に関する新たな議論を参照してください。 「抽象的」回路と「物理的」回路の概念は、Qiskitにとって全く新しいものではなく、明示的なドキュメントが追加されただけです。

  • Duration クラスは、ピコ秒単位で持続時間を表すことができる新しい ps

  • 改良され PauliEvolutionGate.control()、より効率的な表現 PauliEvolutionGate.power() を返すために PauliEvolutionGate.inverse() 、a に関して PauliEvolutionGate。 この変更により、従来使用されていた汎用的な手法と比較して、制御された進化ゲートおよび指数化された進化ゲートの計算において、回路が大幅に浅くなり、ゲート数が減少する。 逆分解自体は変化しないが、より効率的に生成されるようになり、コンパイラの最適化が向上する。

  • 新しい高速パス方式 ParameterExpression.bind_all() が追加され、同一のマッピング辞書を用いて多数の異なる ParameterExpression インスタンスを数値値にバインドするユースケースをサポートします。 既存の bind() メソッドは、型の一貫 ParameterExpression 性を保つために常に返すため、大量のオーバーヘッドと不要な割り当てが発生している。

OpenQASM 特徴

  • OpenQASM3defcal エクスポーターにおける記号への部分的なサポートを追加しました。 これにより、下流のパッケージは量子ビットと古典ビットの両方に対して動作するカスタム命令を qiskit.qasm3.dumps()エクスポートできるようになります。 ユーザーはカスタム命令(例:量子ビットに対して作用し、古典ビット CustomMeasure を返す命令)を定義し、その動作を指定できるようになりました DefcalInstruction。 これらのデファカルは、引数 implicit_defcals を通じてエクスポーター qiskit.qasm3.dumps()に渡されます。

    例:

    from qiskit.circuit import Instruction, QuantumCircuit
    from qiskit.qasm3 import dumps
    from qiskit.qasm3.exporter import DefcalInstruction, types
    
    custom_measure = Instruction("measure_2", 1, 1, [])
    qc = QuantumCircuit(1, 1)
    qc.h(0)
    qc.append(custom_measure, [0], [0])
    qc.measure(0, 0)
    
    defcals = {
        "measure_2": DefcalInstruction("measure_2", 0, 1, types.Bool()),
    }
    
    out_qasm = dumps(qc, implicit_defcals=defcals)
    print(out_qasm)

    次のような OpenQASM3 :

    OPENQASM 3.0;
    bit[1] c;
    qubit[1] q;
    h q[0];
    c[0] = measure_2 q[0];
    c[0] = measure q[0];

    このアプローチは、defcalの文法定義が外部(例えばヘッダーファイル)で提供されることを前提としているが、エクスポータが機能するためにそのようなファイルが厳密に必要なわけではない。

  • 関数 qasm3.loads()qasm3.load() には、 という名前の追加引数が num_qubits追加されました。 指定された場合、関数は量子ビットが に等しい回路を num_qubits返します。 指定しない場合、返される回路の量子ビット数はシリアル化された回路で観測された最大インデックスに等しくなります。 詳細は#14435 を参照してください

QPYの特長

  • ユーザー設定ファイルに という min_qpy_version 名前の設定を追加しました。 設定すると、. qpy.load()に対して許可される最小の QPY バージョンを定義します。 QPYファイルのフォーマットバージョンが設定 minimum_qpy_versionminimum_qpy_version よりも低い場合、例外が発生します。

  • QPYフォーマット・バージョン16を導入。 この新バージョンでは、QPYファイル内の各回路の開始バイト・オフセットを含む新しい回路開始テーブルがファイル・ヘッダーに導入された。 これにより、QPYファイルから回路をより効率的にロードできる可能性があり、将来的にはRustの実装をマルチスレッド化できる可能性がある。 さらに、新しいフォーマット・バージョンでは、 DURATION ピコ秒の新しいバリアントがサポートされている。

量子情報の特徴

合成機能

  • 補助量子ビットを必要とせず、 ModularAdderGate 従来のアルゴリズムと比較してCXカウントが向上した新たな adder_qft_d00()合成アルゴリズムを追加しました:

  • 補助量子ビットを一切必要と MCXGate しない、 synth_mcx_noaux_hp24()新しい合成アルゴリズムを追加しました。 この手法は、既存の synth_mcx_noaux_v24() アルゴリズムと比較して、CXゲートの数が二次的ではなく線形に増加する。 特に、制御量子ビットの数が5を超える場合、この新しい手法がより優れている。 このアルゴリズムは、HuangとPalsbergによる論文「補助量子ビットを使用せずに条件付き量子ゲートをコンパイルする」に基づいている。 https://dl.acm.org/doi/10.1145/3656436

  • 当初Shendeらに基づく機能を qs_decomposition() 改良した。 al. (https://arxiv.org/abs/quant-ph/0406176). 新しい合成法はKrolとAl-Ars( https://arxiv.org/abs/2403.13692 )に基づくものであり、一般のn量子 CXGateビットユニタリ演算子の総s数を 4n213\frac{4^{n − 2} − 1}{3} CXGates減少させる。 分解法の改良により、一般的な3量子ビットユニタリ演算は19 CXGate秒(従来の20秒ではなく)で分解できる。

  • ベースゲートが. の場合 XGate、マルチ制御マルチターゲットゲートを合成するために synth_mcmt_xgate() 追加された。 これは、高レベル合成プラグインと共に MCMTSynthesisXGate、線形数のCXゲートと0個の補助量子ビットによる分解を持つ。

トランスパイラ機能

  • 新しい高レベル合成プラグインを追加し、以下を合成します ModularAdderGate

    また、以下の順序でモジュラー加算器合成器を実行するように更新 ModularAdderSynthesisDefault されました:量子ビット数が 4\leq 4 "ModularAdder.qft_d00" の場合、それ以外の "ModularAdder.modular_v17" すべてのケースでは。

  • 新しいトランスパイラパスを追加しました LitinskiTransformation 。これはで説明されている変換 arXiv:1808.02892 を実装します。

    このパスの入力は、クリフォードゲートと単一量子ビットRZ回転ゲートを含む回路であり、出力は多量子ビットパウリ回転(ゲート PauliEvolutionGate として実装)に続いてクリフォードゲートを含む回路である。 回路に非対応ゲートが含まれる場合、パスは例外 TranspilerError を発生させる。

    このパスは、 get_clifford_gate_names()によって返されるリスト内のすべてのクリフォードゲート、すなわち をサポート ["id", "x", "y", "z", "h", "s", "sdg", "sx", "sxdg", "cx", "cz", "cy", "swap", "iswap", "ecr", "dcx"]します。 サポートされているRZ回転の一覧は次の通りです ["t", "tdg", "rz"] (TゲートおよびTdgゲートは自動的にRZ回転に変換されます)。

    さらに、コン LitinskiTransformation ストラクタは引数 fix_cliffordを受け取ります。 (デフォルト False 以外の場合)、返される回路にはゲート PauliEvolutionGate のみが含まれ、最終のクリフォードゲートは省略される。 この場合、元の回路と合成回路の演算子は一般的に等価ではないことに注意してください。

    例:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import LitinskiTransformation
    from qiskit.quantum_info import Operator
    
    # The following quantum circuit consists of 5 Clifford gates
    # and two single-qubits RZ-rotation gates (note that Tdg is
    # an RZ-rotation).
    qc = QuantumCircuit(2)
    qc.cx(0, 1)
    qc.rz(0.1, 0)
    qc.cz(0, 1)
    qc.tdg(1)
    qc.h(1)
    qc.s(1)
    qc.cz(1, 0)
    
    # The transformed circuit consists of two PauliEvolution gates
    # and the same Clifford gates as in the original circuit.
    qct = LitinskiTransformation()(qc)
    
    # The circuits before and after the transformation are equivalent
    assert Operator(qc) == Operator(qct)
  • オブジェクト MCXGate 用の新しい MCXSynthesisNoAuxHP24 ハイレベル合成プラグインを追加しました。 さらに、オブジェクト MCXGate のデフォルト合成プラグイン MCXSynthesisDefault は、利用可能な補助量子ビットの数に応じて常に最適な合成方法を選択するように更新されました。

  • 命令の角度制限を Target 指定するためのサポートを追加しました。 このリリース以前は、パラメータを取る操作が、有効な値をすべて許可するか、特定の値のみを許可するかを指定することが Target できました。 例えば、対象に が追加 RZGate(Parameter("theta")) された場合、それは θ の値 RZGate がどのような値であっても が許容されることを示す。 ターゲットに if RZGate(math.pi) が追加された場合、それはターゲット上で許可される値が π\pi のみ RZGate であることを示す。 この新機能により、許容角度を包含境界内の任意の float 値に制限することが可能になります。 たとえば、に RZGate(math.pi)Target を追加し、角度値を0から 2π2\pi の値の範囲に制限することができます。

    ターゲットの角度境界を扱うには、いくつかの方法が利用可能です。 最初のものは Target.add_instruction() 、新しい angle_bounds キーワード引数を持つもので、これはの命令に角度制限を追加するために Target使用されます。 角度境界を扱うには、グローバルレジストリ WRAP_ANGLE_REGISTRY にコールバック関数を登録する必要があります。この関数はトランスパイラに通知し、角度境界の WrapAngles ゲート調整方法を渡します。 コールバック関数は、回路からのゲート角度を表す任意 float の値のリストと、ゲートが作用した回路内の量子ビットインデックスを受け取り、その角度を持つゲートに対して等価な回路を表すオブジェクト DAGCircuit を返します。ただし、角度の境界やその他の Target 制約条件を遵守した形で返します。 例:

    import math
    
    from qiskit.dagcircuit import DAGCircuit
    from qiskit.transpiler import Target
    from qiskit.transpiler.passes.utils.wrap_angles import WRAP_ANGLE_REGISTRY
    
    target = Target(num_qubits=1)
    target.add_instruction(RZGate(Parameter("theta")), angle_bounds=[(-math.pi, math.pi)])
    
    def callback(angles: List[float], qubits: List[int]) -> DAGCircuit:
        """Callback function to wrap RZ gate angles
    
        Args:
            angles: The list of floating point parameter values for the instance of RZGate in
                the circuit
            qubits: The physical qubit indices that this gate is operating on
    
        Returns:
            The DAGCircuit of the equivalent circuit"""
    
        angle = angles[0]
        dag = DAGCircuit()
        dag.add_qubits([Qubit()])
        if angle > 0:
            divisor = math.pi
        else:
            divisor = -math.pi
        gate_counts = int(angles[0] // divisor)
        rem = angles[0] % divisor
        for _ in range(gate_counts):
            dag.apply_operation_back(RZGate(math.pi), [dag.qubits[0]], check=True)
        dag.apply_operation_back(rem, [dag.qubits[0]], check=True)
    
    WRAP_ANGLE_REGISTRY.add_wrapper("rz", callback)

    Target.has_angle_bounds() ターゲットに角度制限が設定されているかどうかを確認するために使用できます。 Target.gate_has_angle_bounds()

    ターゲットの角度制限を回路内の任意のゲートに適用したい場合、この処理には WrapAngles トランスパイラパスを使用すべきです。

  • メソッド Target.instruction_supported() に新しい check_angle_bounds キーワード引数を追加しました。 (デフォルト True 値)に設定された場合、メソッドは指定された値が、照会対象の命令に対して parameters 存在する可能性のある角度制限にも適合するかどうかを確認します。

  • 新しいトランスパイラパスを追加しました WrapAngles 。これは、. Target内のゲートに対して角度制約を適用するために使用されます。 定義された角度境界 Target がある場合、このパスは回路内のゲートに関する全てのパラメータを解析し、ターゲットで指定された境界値との適合性を検証する。 例えば、ターゲットに角度制限を持つカスタムゲートが含まれている場合、パスはそのゲートを制限に適合するゲートに分解します:

    from qiskit.circuit import Gate, Parameter, QuantumCircuit, Qubit
    from qiskit.dagcircuit import DAGCircuit
    from qiskit.transpiler import Target, WrapAngleRegistry
    from qiskit.transpiler.passes import WrapAngles
    
    class MyCustomGate(Gate):
    
        def __init__(self, angle):
            super().__init__("my_custom", 1, [angle])
    
    param = Parameter("a")
    circuit = QuantumCircuit(1)
    circuit.append(MyCustomGate(6.0), [0])
    target = Target(num_qubits=1)
    target.add_instruction(MyCustomGate(param), angle_bounds=[(0, 0.5)])
    
    def callback(angles, _qubits):
        angle = angles[0]
        if angle > 0:
            number_of_gates = angle / 0.5
        else:
            number_of_gates = (6.28 - angle) / 0.5
        dag = DAGCircuit()
        dag.add_qubits([Qubit()])
        for _ in range(int(number_of_gates)):
            dag.apply_operation_back(MyCustomGate(0.5), [dag.qubits[0]])
        return dag
    
    registry = WrapAngleRegistry()
    registry.add_wrapper("my_custom", callback)
    wrap_pass = WrapAngles(target, registry)
    res = wrap_pass(circuit)
    res.draw('mpl')
    _images/release_notes-1.png
  • DAGCircuit 現在は手動実装が用意されています __deepcopy__()。 これは、特に大規模な回路において、pickleプロトコルによる以前の暗黙的な実装よりも桁違いに高速です。 また、これはコンパイル性能にも直接的に寄与する。具体的には、最適化 optimization_level=3 レベル3で内部的に深部コピーを実行 transpile() する場合、最適化ループの各反復において、 DAGCircuit プリセットパスマネージャが返すオブジェクト generate_preset_pass_manager() を処理する際に、コンパイル optimization 時に直接的な恩恵をもたらす。

  • 新たな手法が提供される。これは DAGCircuit.make_physical()、量子ビットを標準的な物理量子ビットレジスタに効率的に DAGCircuit 置換するものであり、拡張を含む可能性がある。 同様の方法も利用可能です QuantumCircuit.ensure_physical()

  • 新しい方法、 DAGCircuit.structurally_equal()は、2 DAGCircuit つのインスタンスが全く同じ順序で作成および変更された場合に、に利用できます。 これは == オーバーロードの標準的な意味的等価性チェックよりもはるかに強力なテストであり、トランスパイラ-パス作成者が自身の変更順序が決定論的であることを検証するために使用できます。

  • カスタムサブクラスは、初期プロパティを初期化するために、自身の _passmanager_frontend() setInitialProperties()メソッド内でinitialPropertiesproperty_set 性を変更できるようになりました BasePassManager 。 これにより対称性が実現される。以前は最終プロパティを.中にのみ読み取ることが可能 _passmanager_backend()であったためである。

  • 最適 HighLevelSynthesis 化パスにおける最適化基準を指定する新しいクラ OptimizationMetric スを追加しました。 現在サポートされている2つのメトリクスは次のとおりです:

    • COUNT_2Q2量子ビットゲートの数を最適化する。
    • COUNT_TClifford+T基底集合に転置する際のTゲートの数を最適化します。

    トランスパイラは基底ゲートセットに基づいて自動的にターゲットメトリックを選択します。例えば、クリフォード+T基底セットが検出された場合、それを COUNT_T 使用します。 ただし、このクラスは現在、 transpile() 実行時またはによって生成されたプリセットパスマネージャを実行 generate_preset_pass_manager()時に手動で設定することはできません。

  • トランスパイラパ HighLevelSynthesis スのコンストラクタに optimization_metric 、オブジェクト OptimizationMetric を受け取る新しい引数を追加しました。 に設定すると COUNT_T、パスはクリフォード+Tゲートセットにより適した分解を選択する。

  • デフォルトの高レベル合成プラグインは ModularAdderGate 、Clifford+T基底セットへのトランスパイル時に優れたTカウントを生成します MultiplierGate

  • デフォルトの高レベル合成プラグインは、少なくとも1つの補助量子ビットが利用可能な場合に限り、Clifford+T基底セットへのトランスパイル時に優れたTカウントを生成する MCXGate

  • トランスパイラパス InverseCancellation 用にデフォルトの反転ゲートセットを追加しました。 以前は、パスオブジェクトのコンストラクタには、キャンセルするゲートまたはゲートペアの明示的なリストが必須引数として必要でした。 このリストはオプションであり、リストが提供されない場合、自己逆ゲートは以下の通りです:

    と逆ペア:

    はパスによってキャンセルされる。

  • コン InverseCancellation ストラクタに新しい引数 を追加しました。 run_defaultこの引数を に設定すると、カスタムゲートに加えて新しい True デフォルトの逆キャンセルゲートリストが実行されます。 これは、デフォルトのゲートに加えてカスタムの逆キャンセルセットを実行したいユースケースを想定しています。

  • TranspileLayout 2つの新しいメソッド、from_property_set()write_into_property_set() と が追加されました。これらは、トランスパイルプロパティの現在のアドホックな構造と、それらが に変換される方法を TranspileLayout形式化します。 これにより、トランスパイラパイプライン内の各パスが、最終 TranspileLayout 的な構造化された形式となる値にアクセスし、それを完全に構造化された形で変更し、その後正規化された形式で書き戻すことが可能になります。

    将来のQiskitバージョン 3.0 では、(またはそれに類似 TranspileLayout したもの)がトランスパイラ DAGCircuit 中間表現の直接属性となり、他の部分と同期を保つために各パスで保持 DAGCircuitが要求される見込みである。

  • ステージ optimization において、関数 transpile() と関数 generate_preset_pass_manager() によって返される生成済みパス管理オブジェクトを用いて optimization_level=3 、実行中の VF2PostLayout トランスパイラパスを再有効化します。 このパスは、ステージで実行された全ての物理最適化の後 strict_direction=True 、最終的な出力回路を用いてレイアウトを改善しようとする試みとして実行される。 これは以前Qiskitで有効化されていました( v2.1.0 )。しかし、初期実装の問題により、 2.1.2 で元に戻されました。 これらの問題は修正済みであり、より良いレイアウトが見つかった場合には適切に適用されます。

可視化機能

  • 回路描画ツール qiskit.visualization.circuit_drawer() および 向けに、 measure_arrows および text``mpl バックエンドに qiskit.circuit.QuantumCircuit.draw()新しいオプション が追加されました。 このオプションが に設定されている True場合、ドロワーは ボックス measure から下部の古典ビット群へ矢印を描画します。 これが以前の引き出しの動作でした。 に設定されている場合、 False矢印は描画されず、代わりに で使用されている古典的なレジスタとビットが ボックス measure 内に measure 示されます。 これにより、ボックスを垂直レイヤー内に measure 積み重ねることが可能になります。

    オプションが設定されていない場合、デフォルトは True。 ユーザーは、デフォルトでは ~/.qiskit ディレクトリにあるユーザー設定ファイルのファイル settings.conf でデフォルトを変更できる。 [Default] の見出しの下で、ユーザーはデフォルトを変更するために circuit_measure_arrows = False を入力することができる。

アップグレードの注意

  • Qiskitをソースからビルドする(スタンドアロンモードでC APIをビルドすることを含む)ための最小サポートRustバージョンが、Rust 1.79 から Rust 1.85 に引き上げられました。 この変更は、Qiskit内部で使用されているRust線形代数ライブラリ faerの新しいバージョンを使用できるようにするために必要でした。 旧バージョンのfaerを使用してWindows上でQiskitを実行すると、問題が確認されました。 これらは新しいリリースで修正されたが、新しいバージョンのfaerをビルドするには新しいバージョンのRustコンパイラが必要である。

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

  • の回路定義が、を使用するように ModularAdderGate アップグレード adder_modular_v17()されました。 以前の動作を得るには、代わりに adder_qft_d00() の定義を使用してください。

  • メソッド XGate.control(), CXGate.control(), CCXGate.control(), C3XGate.control() C4XGate.control(),, および は、引数 annotated が に設定された MCXGate.control() 場合 True、もはや AnnotatedOperation を返さず、代わりに が の場合 annotated に得られるの MCXGate と同じ False明示的な を返します。 これは、標準回路ライブラリ全体で引数が annotated 使用される方法と一致しています。そこでは、ネイティブのゲートクラスが既に利用可能な場合、一般的に AnnotatedOperation ``の導入を避けています。 実際には、これによりMCXファミリにおける制御注釈付きゲートの分解がより効率的になる。

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

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

  • によって発行されるQPYのデフォルトバージョンは qpy.dump() 、現在QPYフォーマットバージョン16です。 異なるフォーマットバージョンが必要な場合は、引数 version を使用して以前のフォーマットバージョンを指定できます。

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

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

  • 引数 opt_a1 および opt_a2 のデフォルト値は、現在 opt_a1 = Noneqs_decomposition() および です opt_a2 = None。 新しいデフォルト設定では、引 mat 数の入力ユニタリーが制御されているか否かに基づき最適な値を選択し、デフォルトで最小の CXGate カウントを実現します。 以前の動作が必要な場合は、明示的に および opt_a2 = True opt_a1 = True を呼び出すことで、以前のリリースと同じ動作を維持できます。

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

  • 回路は PassManager 現在、個々のパスの実行開始前に常に num_input_qubits プロパティ original_circuit_indices とを設定する。 これらは入力回路の特性であり、従来は個々のパスが設定するものであった。多くの場合、その主要な目的の副次的な効果として設定されていた。

回路の廃止予定

バグ修正

  • ApplyLayout ゼロ量子ビットを適用するケースを正しく Layout処理するようになります。 以前は、の "layout" フィールド PropertySet がに等しい場合でも、レイアウトが設定 Layout()されていないと主張していました。

  • インスタンス QkOpCounts の作成時および空のインスタンスが渡される際の呼び出し時に qk_opcounts_clear() 発生するメモリリークの問題を修正しました。

  • 以前は、演算 PauliEvolutionGate 子のリストから無効なものを定義することができた。その演算子は、すべて同じ数の量子ビットに対して定義されているわけではなかった。 この問題は修正され、ゲートが定義された際にエラーを発生させるようになりました:

    from qiskit.quantum_info import Pauli, SparsePauliOp
    from qiskit.circuit.library import PauliEvolutionGate
    
    pauli = Pauli("XYZ")  # 3 qubits
    op = SparsePauliOp(["XYIZ"], [1])  # 4 qubits
    evo = PauliEvolutionGate([pauli, op], time=1)
  • トランスパイラ・パス VF2Layout における問題を修正しました。固定シードが設定されている場合でも、パスの出力が非決定論的になる可能性がありました。具体的には、入力回路に単一量子ビット操作のみを含むアクティブな量子ビットが存在する場合に発生していました。 修正済み #14729

  • 複数の回路で実行した際に関 callback 数が呼び出されないバグを修正しました PassManager.run() 。 各回路の全パスにおいて、並列実行時も含め、コールバックが正しくトリガーされるようになりました。

  • トランスパイラパス CommutativeInverseCancellation における複数の問題を修正しました。 このパスは現在、演算、制御フロー操作、および Clifford 非可逆操作(例 Initialize:)を含む回路で正しく動作します。

    さらに、パスは逆ゲート・ペアを識別する際、常に最初に(マトリックス・ベースでない)構文チェックを行うようになった。 ゲートが構文的に等しくなく、引数 matrix_basedTrue に設定され、操作が max_qubits を超える量子ビットに作用しない場合、行列ベースのチェックも実行される。 これにより、峠の削減ポテンシャルが若干向上する。

    14407 、#14635 、#14645を修正。

  • トランスパイラパス CommutativeCancellation (およびそれにより transpile())における複数の問題を修正しました。回路のグローバルフェーズが正しく更新されていませんでした。 特に、XゲートとRXゲートを結合すると位相不一致が生じた一方、 (2+4k)π(2 + 4k)\pikZk \in \mathbb Z という形式の角度を持つパウリ回転ゲートを除去すると、誤って 1-1 という位相シフトが生成された。

  • 標準制御ゲートが全1状態以外の状態で制御された場合に正しく処理されない問題を修正しました CommutationChecker。 修正済み #14974

  • . における非決定性を修正 CommutativeCancellationしました。 これは、ノード順序の決定性が重要な場合に通常使用されるべきである、 topological_op_nodes()または DAGCircuit.topological_nodes() が返す順序には影響しなかった。これは、それらの組み込みの正規化ソート関数によるものである。 ただし、ノードを任意の順序(DAGCircuit.op_nodes())で検査する場合や辺構造(DAGCircuit.edges())を検査する場合、の呼び出し後は反復順序が CommutativeCancellation決定論的ではなくなる。

  • オープン制御のMCXゲートに制御を追加する MCXGateMCXGate.control()、制御対象のMCXゲートの ctrl_state 状態を考慮していなかったバグを修正しました。これにより、拡張されたMCXゲートの ctrl_state 状態が正しく反映されない問題が発生していました。 明示的なMCXクラス CXGate, CCXGate, C3XGate, および C4XGate は既に正しく処理されていたことに注意してください。

  • Qiskit をインポートする際、 Python 3.9 の非推奨警告がユーザーコードに起因するものとして正しく識別されるように修正。 以前は、ユーザーコードが原因であることが識別されず、 Python のデフォルトの警告フィルターがユーザーに警告を表示しないことを意味した。

  • dimacsファイルからの読み込みを試みた際に発生していた BitFlipOracleGate エラーを修正しました TypeErrorPhaseOraclePhaseOracleGate

  • トランスパイラ・パス ElidePermutations におけるバグを修正しました。s PermutationGateが存在する場合に量子ビットのマッピングが正しく更新されず、誤った回路が生成され、パス管理者のプロパティセットが更新される問題が発生していました。

  • プロパティ final_layout を設定する組み込みトランスパイラは、このフィールドが既に設定されていた場合、その更新を正しく処理するようになりました。 これは、メソッドが をセットする複数回のパス TranspileLayout.routing_permutation を実行した後、正しい final_layout順列を返すようになることで観察できる。

    これは、Qiskitの組み込みプラグインを使用した通常の呼び出しには影響しません。この generate_preset_pass_manager() 形式で構築されたパイプラインは、 transpile()final_layout 複数回設定しようとすることはありません。

  • 回路 HighLevelSynthesis に古典レジスタを持つ高レベルオブジェクトが含まれている場合、それらが外側の回路における対応するインデックスではなく、オブジェクト内の相対インデックスにマッピングされるというバグを修正しました。 古典レジスタは、外部回路インデックスに正しくマッピングされるようになりました。

  • 既存の命令と一致する引数 parametersoperation_name でメソッドが呼び出された場合 Target.instruction_supported() 、命令の量子ビット順序のチェックがスキップされるバグを修正しました。

  • 引数 max_trials が `` または負の数 VF2LayoutNone に設定された場合の動作を修正しました。 パスは、オプションが設定されている場合、検索を回路またはターゲットのサイズに基づくものに制限すると記録されており、無制限の検索を指定するために負の値を受け入れると None 記録されていた。 しかし、 2.1.0 ではこの動作が誤って変更され、無制限の検索を実行 None するようになり、負の数を使用しようとするとエラーが発生するようになりました。 これらの見落としは修正され、パスは文書通り動作し、以前のリリースと一貫性を保つようになりました。

  • 高レベル合成プラグインにおける問題を修正しました。 MCXGateMCXSynthesis2DirtyKG24MCXSynthesis1DirtyKG24 具体的には、利用可能なクリーン補助量子ビットを、利用可能なダーティ補助量子ビットとして考慮していなかった不具合を修正しました。 特に、クリーンな補助量子ビットとダーティな補助量子ビットが1つずつ利用可能な場合、このプラグインは適用 MCXSynthesis2DirtyKG24 されなかった。

  • この PauliEvolutionGate.to_matrix() メソッドは現在、正確な行列指数関数 exp(itH)\exp(-it H) を返します。ここで HH はゲート time に渡された入力 operator tt です。 これは予期せぬ動作を修正します。なぜなら、 PauliEvolutionGate* は正確な*時間発展を表すと文書化されているにもかかわらず、以前は行列がコンパイラによる時間発展の近似方法に依存していたためです。 この to_matrix メソッドは、ドキュメントと整合性が取れています。

  • 多数のサブ式を結合して段階的にビルド ParameterExpression する際に発生していたパフォーマンスの低下を修正しました。 修正済み #14653

  • ps'単位を使用した遅延命令のある回路を QASM3 にエクスポートする際の正しさのバグを修正。

  • 回路 QFT の表示におけるエッジケースを修正しました。 以前、が QFT.inverse() 呼び出され、その後QFT回路の属性が変更されると、QFTはとして表示されました "IQFT_dg"。 これは誤りであり、現在は正しく表示されています "IQFT"#14758 を修正しました。

  • プラグ PauliEvolutionSynthesisRustiq インのバグを修正しました。このバグは、演算 SparseObservable子の操作対象に型 のオブジェクト PauliEvolutionGate が含まれる場合に、誤った回路を生成するものでした。

    例:

    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.quantum_info import SparseObservable, Operator
    from qiskit.transpiler.passes.synthesis.hls_plugins import PauliEvolutionSynthesisRustiq
    
    obs = SparseObservable.from_sparse_list([("1+XY", (0, 1, 2, 3), 1.5)], num_qubits=4)
    evo = PauliEvolutionGate(obs, 1)
    qct = PauliEvolutionSynthesisRustiq().run(evo)
    assert Operator(qct) == Operator(evo)
  • 関数 generate_preset_pass_manager() において、引 backend 数が設定されていない場合に提供 Target されたオブジェクトに含まれるタイミング制約データを誤って無視する問題を修正しました。 修正済み #14329

  • ObservablesArray.coerce_observable() で、observable がエルミートでないという例外が過剰にトリガーされるバグを修正。 zero に等しいオブザーバブルは許可されず、グレースフル・フェイルを引き起こすようになった。

  • qiskit.circuit.library.quantum_volume() その seed 引数として を入力として numpy.random.Generator 扱うように更新されました。 以前は、このようなジェネレータ引数は. TypeErrorを結果として生み出していました。

  • QuantumCircuit.compose()var_remap 数が指定された場合、命令 Delay で使用される変数と区間を正しく再マッピングします。

  • SabreLayout 「高密度部分集合」レイアウトを試験的な手法の一つとして採用し、と同じアルゴリズム DenseLayoutに従う。 しかし従来、Sabreが使用していたバージョンでは、ダミー補助量子ビットを含む全ての仮想量子ビットが物理量子ビットに割り当てられており、アルゴリズムの有効性は損なわれていたものの、その正しさは損なわれていなかった。 Sabreは今回の初期試験において、ユーザーが定義した仮想量子ビットのみを使用します。これにより、大規模な回路クラス全体で平均化した場合、レイアウト選択においてわずかな改善が得られる可能性があります。

  • 重複を結合する前に、係数の絶対値に基づいてパウリ項を除去する SparsePauliOp.simplify() メソッドのバグを修正しました。 これにより、2つの重要なエッジケースで不正な動作が発生しました:

    1. 複数の同一のパウリ項が、個々には単純化しきい値以下であるが、その合計がしきい値を超える小さな係数を持つ場合、それらの項は誤って削除された。
    2. 複数の同じパウリ項の係数がしきい値を超えているが、和がゼロに近い場合、それらは誤って保持された。

    詳細は #14194を参照。

  • TranspileLayout.initial_index_layout() 仮想量子ビットがコンストラクタでインデックス順に initial_layout 指定されていない場合、引 filter_ancillas=True 数を正しく処理するようになりました。

  • VF2Layout そして、完全にアイドル状態の量子ビットに対する( VF2PostLayout 任意の)レイアウト割り当てを正しく含めるようになります。 以前は、コンパイル後に呼び出しが TranspileLayout.initial_index_layout() 失敗することでこれが観察された可能性がある。

  • トランスパイラパス VF2PostLayout における問題を修正しました。 特定の状況において、引数と共にパスが実行される際、回路の相互作用グラフに1量子ビット操作のみを持つ量子 strict_direction=True ビットが含まれている場合、潜在的な実行時間のスケーリング問題が発生する可能性がありました。 これらのマッピング問題は、スコアリングに組み合わせ的複雑さを生じさせ、パスがほぼ常にスコアリングタイムアウトに到達し、レイアウトの改善が通常見られない結果を招く。 モード strict_direction=False ではこれらの問題に対して最適化された探索アルゴリズムが実装されているが、追加の制約条件によりこの手法は strict_direction=True 適用不可能となる。 代わりに、これらのケースでは、レイアウト問題がパスに対して実行 VF2PostLayout 可能でないため、検索をスキップします。

その他の注意事項

  • サブレ・ルーティングの実装 SabreLayout では、 SabreSwap 現在、内部仮想相互作用表現において、同時にルーティング対象となるノードの連続を圧縮する。 これによりルーティングの効率が向上し、中間メモリの使用が削減され、 2qlookahead ゲートの連続配置によるヒューリスティック構成要素へのバイアスが回避される。

2.1.0rc1

非推奨のメモ

  • Python 3.9 で Qiskit を実行するためのサポートは非推奨となり、Qiskit 2.3.0 リリースで削除される予定です。 2.3.0 は、 Python 3.9 がサポート終了となった後の最初のリリースである。 [1] これは、 2.3.0 リリースから、使用している Python バージョンを Python 3.9 以上にアップグレードする必要があることを意味します。

    [1 ]https://devguide.python.org/versions/

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