Skip to main content
IBM Quantum Platform

Qiskit 0.35 リリースノート


0.35.0

Terra 0.20.0

前奏曲

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

  • Rustで書かれたマルチスレッドモジュールを導入することで、Qiskit Terraの特定の部分のパフォーマンスを高速化し、より多くの量子ビット数でのスケーリングを改善する。 しかし、Qiskitをソースからビルドする場合、 Rust コンパイラが必要になりました。
  • トランスパイラで Target をよりネイティブにサポートしました。 いくつかのパスが Target オブジェクトを直接扱えるようになり、トランスパイラがターゲットにできるバックエンドの種類が増えました。
  • モジュールの紹介 qiskit.primitives モジュールを導入した。 これらのAPIは、バックエンドから関心のある出力を計算するための異なる抽象化レベルを提供する。 QuantumCircuit を計算し、バックエンドを使用するための異なる抽象化レベルを提供します。 例えば BaseEstimator は観測値の期待値を推定するための抽象インターフェースを定義している。 これは、期待値を計算する実装を気にすることなく、期待値の推定を使用して構築されたより高度なアルゴリズムやアプリケーションを構築するために使用することができます。 このデカップリングによって、定義された抽象インターフェースを守りながら、実装のスピードと品質を向上させることができる。 同様に BaseSampler は回路の測定値から準確率分布を計算する。 他のプリミティブも将来導入される予定である。

このリリースでは、 Python 3.6 をサポートしていません。 このリリースでは、 Python 3.7、 Python 3.10。

新機能

  • クラスに新しいコンストラクタ・メソッドを追加した。 Operator クラスに新しいコンストラクタ・メソッドを追加しました、 Operator.from_circuit() 新しい Operator メソッドを追加した。 QuantumCircuit. これはデフォルトのコンストラクタを使えば普通に可能だったが、この Operator.from_circuit() メソッドには、演算子の作成方法を調整するための追加オプションが用意されています。 主に、次のセットに基づいて量子ビットの順序を並べ替えることができる。 Layout. 例えば、こうだ:

    from qiskit.circuit import QuantumCircuit
    from qiskit import transpile
    from qiskit.transpiler import CouplingMap
    from qiskit.quantum_info import Operator
    
    circuit = QuantumCircuit(3)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.cx(1, 2)
    
    cmap = CouplingMap.from_line(3)
    out_circuit = transpile(circuit, initial_layout=[2, 1, 0], coupling_map=cmap)
    operator = Operator.from_circuit(out_circuit)

    operator 変数では、レイアウトに基づいて量子ビットが並べ替えられ、転置前の Operator(circuit) が返すものと同じになる。

  • 新しいメソッド DAGCircuit.copy_empty_like() を追加した。 DAGCircuit クラスに新しいメソッドを追加しました。 このメソッドは、既存のオブジェクトの新しいコピーを作成するために使われる。 DAGCircuit オブジェクトの新しいコピーを作成します。 このメソッドはプライベート・メソッド _copy_circuit_metadata() と同じだが、代わりにクラスのパブリックAPIの一部となった。

  • 以前は qiskit.test.mock で利用可能だった偽のバックエンドと偽のプロバイダ・クラスが、新しいモジュールでも利用できるようになりました: qiskit.providers.fake_provider. この新しいモジュールは、Qiskit 0.21.0 で非推奨となる以前のモジュール qiskit.test.mock に取って代わるものです。

  • 新しいゲート・クラスを追加、 LinearFunctionのシーケンスで表現できる関数)を効率的にエンコードする新しいゲート・クラスを追加した。 CXGateSwapGate ゲートのシーケンスで表現できる関数)を効率的にエンコードする

  • 新しいトランスパイラー・パスを追加 CollectLinearFunctions 連続する CXGateSwapGate ゲートを収集し、各ブロックを LinearFunction ゲートに置き換えます。

  • 新しいトランスパイラパスを追加しました LinearFunctionsSynthesis あらゆるものを合成する LinearFunction Patel-Markov-Hayes アルゴリズムを使用するゲート。 トランスパイラーパスと組み合わせると CollectLinearFunctions トランスパイラー・パスと組み合わせると、連続した CXGateSwapGate ゲートを収集し、 Patel-Markov-Hayes アルゴリズムを使用して再合成することができます。

  • 新しいトランスパイラー・パスを追加 LinearFunctionsToPermutations ゲートを LinearFunction ゲートを Permutation パスが追加された。

  • FlowController クラス(たとえば ConditionalControllerなど)を PassManager インスタンス内にネストできるようになりました。 PassManager.append() メソッドを使用する際に これによって、ネストされたロジックを使用して、パス実行を制御することができる。 PassManager. 例:

    from qiskit.transpiler import ConditionalController, PassManager
    from qiskit.transpiler.passes import (
      BasisTranslator, GatesInBasis, Optimize1qGatesDecomposition, FixedPoint, Depth
    )
    from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
    
    pm = PassManager()
    
    def opt_control(property_set):
        return not property_set["depth_fixed_point"]
    
    def unroll_condition(property_set):
        return not property_set["all_gates_in_basis"]
    
    depth_check = [Depth(), FixedPoint("depth")]
    opt = [Optimize1qGatesDecomposition(['rx', 'ry', 'rz', 'rxx'])]
    unroll = [BasisTranslator(sel, ['rx', 'ry', 'rz', 'rxx'])]
    unroll_check = [GatesInBasis(['rx', 'ry', 'rz', 'rxx'])]
    flow_unroll = [ConditionalController(unroll, condition=unroll_condition)]
    
    pm.append(depth_check + opt + unroll_check + flow_unroll, do_while=opt_control)

    pmPassManager オブジェクトは BasisTranslatorunroll_condition パス( unroll ステップ)を実行する。

  • のコンストラクタは ZFeatureMapZZFeatureMap クラスのコンストラクタには、新しいキーワード引数 parameter_prefix があります。 この新しい引数は、データ符号化回路のパラメータの接頭辞を設定するために使用される。 例:

    from qiskit.circuit.library import ZFeatureMap
    
    feature_map = ZFeatureMap(feature_dimension=4, parameter_prefix="my_prefix")
    feature_map.decompose().draw('mpl')

    生成された ZFeatureMap 生成された回路は、すべての内部パラメータに接頭辞 "my_prefix" を付けている。

  • トランス TemplateOptimization トランスパイラ・パスは Gate パラメータを持つ ParameterExpression パラメータを持つ の使用例 ParameterTemplateOptimization を使った例を以下に示す:

    from qiskit import QuantumCircuit, transpile, schedule
    from qiskit.circuit import Parameter
    
    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import TemplateOptimization
    
    # New contributions to the template optimization
    from qiskit.transpiler.passes.calibration import RZXCalibrationBuilder, rzx_templates
    
    from qiskit.test.mock import FakeCasablanca
    backend = FakeCasablanca()
    
    phi = Parameter('φ')
    
    qc = QuantumCircuit(2)
    qc.cx(0,1)
    qc.p(2*phi, 1)
    qc.cx(0,1)
    print('Original circuit:')
    print(qc)
    
    pass_ = TemplateOptimization(**rzx_templates.rzx_templates(['zz2']))
    qc_cz = PassManager(pass_).run(qc)
    print('ZX based circuit:')
    print(qc_cz)
    
    # Add the calibrations
    pass_ = RZXCalibrationBuilder(backend)
    cal_qc = PassManager(pass_).run(qc_cz.bind_parameters({phi: 0.12}))
    
    # Transpile to the backend basis gates
    cal_qct = transpile(cal_qc, backend)
    qct = transpile(qc.bind_parameters({phi: 0.12}), backend)
    
    # Compare the schedule durations
    print('Duration of schedule with the calibration:')
    print(schedule(cal_qct, backend).duration)
    print('Duration of standard with two CNOT gates:')
    print(schedule(qct, backend).duration)

    出力

    Original circuit:
    
    q_0: ──■──────────────■──
         ┌─┴─┐┌────────┐┌─┴─┐
    q_1: ┤ X ├┤ P(2*φ) ├┤ X ├
         └───┘└────────┘└───┘
    ZX based circuit:
                                             ┌─────────────┐            »
    q_0: ────────────────────────────────────┤0            ├────────────»
         ┌──────────┐┌──────────┐┌──────────┐│  Rzx(2.0*φ) │┌──────────┐»
    q_1:Rz(-π/2) ├┤ Rx(-π/2) ├┤ Rz(-π/2) ├┤1            ├┤ Rx(-2*φ) ├»
         └──────────┘└──────────┘└──────────┘└─────────────┘└──────────┘»
    «
    «q_0: ────────────────────────────────────────────────
    «     ┌──────────┐┌──────────┐┌──────────┐┌──────────┐
    «q_1:Rz(-π/2) ├┤ Rx(-π/2) ├┤ Rz(-π/2) ├┤ P(2.0*φ)
    «     └──────────┘└──────────┘└──────────┘└──────────┘
    Duration of schedule with the calibration:
    1600
    Duration of standard with two CNOT gates:
    6848
  • その DAGOpNode, DAGInNode および DAGOutNode クラスは、表現を出力するカスタム __repr__ メソッドを定義しています。 Python のドキュメントによると、出力は、同等のオブジェクトを作成するために使用される Python 文字列とほぼ同等の文字列表現である。

  • メソッドのパフォーマンスは SparsePauliOp.simplify() メソッドは、 numpy.unique を使って配列の一意な要素を計算する代わりに、Rust で実装された新しい同様の関数で配列を事前にソートしないようにしたことで、パフォーマンスが大幅に向上しました。

  • 新しいメソッド equiv() メソッドを追加した。 SparsePauliOp クラスに新しいメソッドを追加した。 SparsePauliOp と別の SparsePauliOp オブジェクトとの等価性をテストするための新しいメソッドを追加しました。 演算子を要素ごとに比較する == 演算子とは異なります、 equiv() は2つの演算子が等価かどうかを比較します。 例:

    op = SparsePauliOp.from_list([("X", 1), ("Y", 1)])
    op2 = SparsePauliOp.from_list([("X", 1), ("Y", 1), ("Z", 0)])
    op3 = SparsePauliOp.from_list([("Y", 1), ("X", 1)])
    
    print(op == op2)  # False
    print(op == op3)  # False
    print(op.equiv(op2))  # True
    print(op.equiv(op3))  # True
  • インターフェイスに基づき、 IBM Quantum システムのスナップショットから新しい偽のバックエンド・クラスを追加した。 BackendV2 インターフェイスを提供し Target を提供しました。 BackendV2 をベースにした新しい偽のバックエンドクラスを作成するのに必要なスナップショットファイルがないため、 FakeRueschlikonFakeTenerifeFakeTokyo の3つの古いバックエンドを除いて、すべての既存のバックエンドをベースにしたバージョンが追加されている。 BackendV2.

    これらの新しい V2 偽のバックエンドは、次のように導入された新機能のテストと開発を可能にします。 BackendV2 そして Target トランスパイラの改良などである。

  • 新しいゲート・クラスを追加 XXMinusYYGate を回路ライブラリ(qiskit.circuit.library)に新しいゲートクラスを追加した。 このゲートを使って、 bSwap ゲートとその累乗を実装することができる。 また、超伝導フェルミオンモデルのシミュレーションでも発生する。

  • 新しいゲート・クラスを追加、 XXPlusYYGate回路ライブラリ(qiskit.circuit.library).このゲートは2量子ビットのパラメータ化XX+YY相互作用で、XYゲートとしても知られています。 https://arxiv.org/abs/1912.04424.

  • qiskit.providers.fake_provider モジュールにある FakeBogotaFakeManilaFakeRomeFakeSantiago 偽のバックエンドが、Pulse 実験のバックエンドとして使えるようになった。 PulseDefaults 等価な IBM Quantum マシンのプロパティのスナップショットから作成されます。

  • パスは、コンストラクタに新しいキーワード引数を持つ。 ConsolidateBlocks パスのコンストラクタには、新しいキーワード引数 target がある。 この引数は Target オブジェクトを指定する。 指定された場合は、 basis_gates kwargに優先する。 ターゲットが指定された場合、パスはそのターゲットで定義された命令のゲートと量子ビットを尊重する。 Target で定義された命令のゲートと量子ビットを尊重します。

  • この Target クラスに新しいメソッドが追加されました、 instruction_supported() によってモデル化されたバックエンドで命令(操作とそれが実行される量子ビットの組み合わせ)がサポートされているかどうかをターゲットに問い合わせるために使われます。 Target.

  • に新しいクワーグ metadata_serializer を追加した。 qpy.dump()JSONEncoder 関数を追加しました。 QuantumCircuit.metadata 属性を直列化するときに使用するカスタム metadata_deserializer サブクラスを指定するための関数と qpy.load()JSONDecoder 関数を追加しました。 デフォルトでは dump()load() 関数は、stdlib デフォルトの json エンコーダーとデコーダーを使って JSON のシリアライズとデシリアライズを試みます。 であるため QuantumCircuit.metadata にはどんな Python 辞書でも入れることができるので、デフォルトのエンコーダーではJSONシリアライズできない内容のものでも、シリアライズできない回路になります。 の新しい引数 metadata_serializerdump() に対する新しい引数で、ユーザは、辞書をシリアライズするための内部 json.dump() 呼び出しで使用されるカスタム JSONEncoder を指定できる。 QuantumCircuit.metadata 辞書をシリアライズするための内部コールで使用されるカスタム。 これは、 metadata_deserializer の新しい引数と組み合わせることができます。 qpy.load() 関数の新しい引数と組み合わせて、カスタムJSONエンコーディングをデコードすることができます。 で metadata_serializer が指定されているが dump() に指定されているが、 metadata_deserializer load() に指定されていない場合、QPYはロードされますが、回路のメタデータは完全に再構築されない可能性があります。

    例えば、メタデータのカスタムシリアライズを定義し、それをロードしたい場合、次のようにすることができる:

    from qiskit.qpy import dump, load
    from qiskit.circuit import QuantumCircuit, Parameter
    import json
    import io
    
    class CustomObject:
        """Custom string container object."""
    
        def __init__(self, string):
            self.string = string
    
        def __eq__(self, other):
            return self.string == other.string
    
    class CustomSerializer(json.JSONEncoder):
        """Custom json encoder to handle CustomObject."""
    
        def default(self, o):
            if isinstance(o, CustomObject):
                return {"__type__": "Custom", "value": o.string}
            return json.JSONEncoder.default(self, o)
    
    class CustomDeserializer(json.JSONDecoder):
        """Custom json decoder to handle CustomObject."""
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, object_hook=self.object_hook, **kwargs)
    
        def object_hook(self, o):
            """Hook to override default decoder."""
            if "__type__" in o:
                obj_type = o["__type__"]
                if obj_type == "Custom":
                    return CustomObject(o["value"])
            return o
    
    theta = Parameter("theta")
    qc = QuantumCircuit(2, global_phase=theta)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    circuits = [qc, qc.copy()]
    circuits[0].metadata = {"key": CustomObject("Circuit 1")}
    circuits[1].metadata = {"key": CustomObject("Circuit 2")}
    with io.BytesIO() as qpy_buf:
        dump(circuits, qpy_buf, metadata_serializer=CustomSerializer)
        qpy_buf.seek(0)
        new_circuits = load(qpy_buf, metadata_deserializer=CustomDeserializer)
  • パスは、コンストラクタに新しいキーワード引数を持つ。 DenseLayout パスのコンストラクタには、新しいキーワード引数 target がある。 この引数は Target オブジェクトを指定する。 これが指定された場合、コンストラクタの他の引数、 coupling_mapbackend_prop に優先する。

  • この Target クラスに新しいメソッドが追加された、 operation_names_for_qargs(). このメソッドは、指定された qargs タプルに対する操作の操作名(つまりターゲット内のルックアップ・キー)を取得するために使用される。

  • 新しいパス DynamicalDecouplingPaddingqiskit.transpiler.passes モジュールに追加されました。 この新しいパスは、トランスパイラの新しいスケジューリング・ワークフローに対応するため DynamicalDecoupling この新しいパスは、トランスパイラの新しいスケジューリング・ワークフローに対応するために、既存のパスに取って代わるものです。 これは BasePadding パスのサブクラスであり、その前に実行されるスケジューリングとアライメント解析のパスに依存する。 PassManager. この新しいパスは、波形開始タイミングのハードウェア制約を表す pulse_alignment 引数を取ることができます。 動的デカップリング・シーケンスを構成するゲート間の間隔は、この制約を満たすように調整され、この制約を持つハードウェア上で回路を実行できるようになる。 この値は通常、 BackendConfiguration.timing_constraints に記載されている。 さらに、このパスには extra_slack_distribution オプションもあり、作成されたダイナミック・デカップリング・シーケンスの持続時間が、シーケンスで満たしたい回路のアイドル時間よりも短い場合に、余分なスラックをどのように分配するかを制御することができる。 デフォルトは middle 、従来の動作と同じである。 新しい戦略 split_edges 、余分なスラックをシーケンスの途中のインターバルに加えるのではなく、シーケンスの最初と最後に均等に分割する。 この結果、特に pulse_alignment > 1の場合、ノイズキャンセルが向上する可能性がある。

  • この Z2Symmetries クラスは、係数の小さな実数部と虚数部を切り刻むために使われるしきい値の許容誤差を公開します。 これによって、テーパー演算子の係数をどのように簡略化するかをコントロールすることができる。 例:

    from qiskit.opflow import Z2Symmetries
    from qiskit.quantum_info import Pauli
    
    z2_symmetries = Z2Symmetries(
        symmetries=[Pauli("IIZI"), Pauli("IZIZ"), Pauli("ZIII")],
        sq_paulis=[Pauli("IIXI"), Pauli("IIIX"), Pauli("XIII")],
        sq_list=[1, 0, 3],
        tapering_values=[1, -1, -1],
        tol=1e-10,
    )

    デフォルトでは、係数は tol=1e-14 の公差で刻まれる。

  • メソッドを追加した。 chop() メソッドを SparsePauliOp クラスに、係数の実部と虚部を個別に切り捨てるメソッドを追加した。 これは SparsePauliOp.simplify() これは、絶対値が0に近い場合にのみ係数を削除する方法とは異なる。 例:

    >>> from qiskit.quantum_info import SparsePauliOp
    >>> op = SparsePauliOp(["X", "Y", "Z"], coeffs=[1+1e-17j, 1e-17+1j, 1e-17])
    >>> op.simplify()
    SparsePauliOp(['X', 'Y'],
                  coeffs=[1.e+00+1.e-17j, 1.e-17+1.e+00j])
    >>> op.chop()
    SparsePauliOp(['X', 'Y'],
                  coeffs=[1.+0.j, 0.+1.j])

    チョップ法は同じポーリスの係数を累積しないことに注意。

    >>> op = SparsePauliOp(["X", "X"], coeffs=[1+1e-17j, 1e-17+1j)
    >>> op.chop()
    SparsePauliOp(['X', 'X'],
                  coeffs=[1.+0.j, 0.+1.j])
  • トランスパイラー・パスのコンストラクターに新しいクワーグ、 target を追加。 GatesInBasis を追加した。 この新しい引数は、バックエンドを表す Target オブジェクトを指定することができます。 これを設定すると Target が基底セット外のゲートを含むかどうかの判定に使用される。 DAGCircuit に使用され、 basis_gates 引数は使用されない。

  • ppc64le および s390x Linux プラットフォームでの動作を部分的にサポート。 このリリースでは、 ppc64le および s390x Linux プラットフォーム用のコンパイル済みバイナリを、すべての Python バージョンで公開する予定です。 しかし、他のサポートされているプラットフォームとは異なり、Qiskitの上流の依存関係のすべてがまだこれらのプラットフォームをサポートしているわけではありません。 そのため、これらの依存関係をビルドしてインストールするには、C/C++コンパイラが必要になる場合があります。また、 Python 環境が動作するだけのシンプルな pip install qiskit-terra では、Qiskit をインストールするのに十分ではありません。 さらに、これらの同じ制約により、コンパイル済みのホイールを公開する前にテストすることができないため、他のプラットフォームに存在するようなプラットフォーム・サポートに関する保証はここでは適用されない。

  • その GradientQFI クラスは期待値勾配の虚部を計算できる。 異なる測定基準を使用する場合、すなわち -Y Z の代わりに、勾配の虚部を測定することができる。測定基底は 引数で設定できる。 aux_meas_op

    勾配については、 aux_meas_op = Z0.5Re[(⟨ψ(ω)|)O(θ)|dωψ(ω)〉] を計算し、 aux_meas_op = -Y0.5Im[(⟨ψ(ω)|)O(θ)|dωψ(ω)〉] を計算する。 QFIについては、 aux_meas_op = Z4Re[(dω⟨<ψ(ω)|)(dω|ψ(ω)〉)] を、 aux_meas_op = -Y4Im[(dω⟨<ψ(ω)|)(dω|ψ(ω)〉)] を計算する。 例:

    from qiskit import QuantumRegister, QuantumCircuit
    from qiskit.opflow import CircuitStateFn, Y
    from qiskit.opflow.gradients.circuit_gradients import LinComb
    from qiskit.circuit import Parameter
    
    a = Parameter("a")
    b = Parameter("b")
    params = [a, b]
    
    q = QuantumRegister(1)
    qc = QuantumCircuit(q)
    qc.h(q)
    qc.rz(params[0], q[0])
    qc.rx(params[1], q[0])
    op = CircuitStateFn(primitive=qc, coeff=1.0)
    
    aux_meas_op = -Y
    
    prob_grad = LinComb(aux_meas_op=aux_meas_op).convert(operator=op, params=params)
  • この InstructionDurations クラスは命令のパラメータを扱えるようになった。 オブジェクトの各エントリーは InstructionDurations オブジェクトの各エントリーは、 (inst_name, qubits, duration, parameters, unit) のタプルで構成される。 これにより InstructionDurations これにより、数値パラメータを取る命令において、異なるパラメータ値で異なる継続時間を考慮するために、あるパラメータ値が与えられた命令の継続時間を定義することができます。

  • 回路引き出し関数の style キーワード引数に新しい値を追加。 circuit_drawer() および QuantumCircuit.draw() メソッド、 iqx_darkmpl ドローワーバックエンドで styleiqx_dark に設定された場合、出力される可視化は IBM Quantum composer で使用されるダークモードの配色に似た配色を使用します。 例:

    from qiskit.circuit import QuantumCircuit
    from matplotlib.pyplot import show
    
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.p(0.2, 1)
    
    circuit.draw("mpl", style="iqx-dark")
  • いくつかの遅延依存性チェッカーが新しいモジュールに追加されました。 qiskit.utils.optionalsに追加されました。 例えば、Qiskitが matplotlib の存在を検出したかどうかを尋ねるには、 if qiskit.utils.optionals.HAS_MATPLOTLIB。 これらのオブジェクトは、クエリーされたときにのみ依存関係をインポートしようとするので、インポート時間に影響を与えることなく、実行時コードで使用することができる。

  • のインポート時間が大幅に改善されました。 qiskit は、特にQiskit Terraのオプション依存パッケージの多くをインストールしている場合、大幅に改善されました。

  • この marginal_counts() 関数は、入力オブジェクトの memory フィールドのマージナル化をサポートするようになった。 Result オブジェクトの 例えば、入力 result の引数が、4量子ビットの測定から得られたqiskit Result オブジェクトが4量子ビットの測定から得られた場合、最初の量子ビットをマージナル化することができます:

    print(result.results[0].data.memory)
    marginal_result = marginal_counts(result, [0])
    print(marginal_result.results[0].data.memory)

    出力は以下のとおりです:

    ['0x0', '0x1', '0x2', '0x3', '0x4', '0x5', '0x6', '0x7']
    ['0x0', '0x1', '0x0', '0x1', '0x0', '0x1', '0x0', '0x1']
  • アルゴリズムの内部は StochasticSwap アルゴリズム内部はマルチスレッドに再実装され、Cythonの代わりに Rust プログラミング言語で書かれている。 これにより、コンパイラー・パスのランタイム性能が大幅に向上し、ひいては、 0,1,2で実行した場合の性能も向上する。 transpile()optimization_level 0, 1, 2で実行されたときのパフォーマンスが大幅に向上する。 デフォルトでは、パスはローカルシステムの論理CPU数まで使用しますが、環境変数 RAYON_NUM_THREADS を整数値に設定することで、パスが使用するスレッド数を制御することができます。 たとえば、 RAYON_NUM_THREADS=4 を設定すると StochasticSwap を4スレッドで実行する。

  • 新しい環境変数 QISKIT_FORCE_THREADS 、Qiskitのコードの潜在的なマルチスレッド部分をマルチスレッドで実行するかどうかをユーザーが直接コントロールできるようになりました。 現在これは StochasticSwap トランスパイラパスのみで使用されていますが、将来的にはQiskitの他の部分でも使用される可能性があります。 このenv変数を TRUE に設定すると、Qiskit Terraでマルチスレッド化されたコードは、その関数がシングルスレッド化されたバリアントを使用する原因となったかもしれない他の実行時の条件に関係なく、常にマルチスレッドを使用するようになります。 例えば StochasticSwap パスが transpile() を経由して multiprocessing と並列に実行されている > 1回路のコールの一部として実行されている場合。 parallel_map() で並列実行されている。 StochasticSwap は、CPUリソースの過剰供給を避けるため、複数のスレッドを使用しない。 しかし、複数のスレッドを複数のプロセスとともに使用したい場合は、 QISKIT_FORCE_THREADS=TRUE.

  • 新しい偽のバックエンド・クラスは、 qiskit.providers.fake_provider。 これらには、 ibm_cairoibm_hanoiibmq_kolkataibm_nairobiibm_washington のモック版が含まれる。 他の偽のバックエンドと同様に、これらには実際のシステムから取得したキャリブレーションとエラーデータのスナップショットが含まれており、ローカルテスト、コンパイル、シミュレーションに使用することができる。

  • 新クラス導入 StatePreparation. このクラスは、リセットを自動的に適用することなく、 Initialize

    例えば、 (01)/2(|0\rangle - |1\rangle) / \sqrt{2} の状態の量子ビットを用意する:

    import numpy as np
    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(1)
    circuit.prepare_state([1/np.sqrt(2), -1/np.sqrt(2)], 0)
    circuit.draw()

    出力はこうだ:

         ┌─────────────────────────────────────┐
    q_0: ┤ State Preparation(0.70711,-0.70711)
         └─────────────────────────────────────┘
  • トランスパイラ・パスは Optimize1qGates トランスパイラ・パスは、以下の最適化をサポートするようになった。 U1Gate, U2Gateおよび PhaseGate ゲートの最適化がサポートされました。 以前は、これらのゲートにバインドされていないパラメータがある場合、パスはそれらを使用しなかった。 例:

    from qiskit import QuantumCircuit
    from qiskit.circuit import Parameter
    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import Optimize1qGates, Unroller
    
    phi = Parameter('φ')
    alpha = Parameter('α')
    
    qc = QuantumCircuit(1)
    qc.u1(2*phi, 0)
    qc.u1(alpha, 0)
    qc.u1(0.1, 0)
    qc.u1(0.2, 0)
    
    pm = PassManager([Unroller(['u1', 'cx']), Optimize1qGates()])
    nqc = pm.run(qc)

    は、単一量子ビットゲートを1つだけ持つ回路に結合される:

    qc = QuantumCircuit(1)
    qc.u1(2*phi + alpha + 0.3, 0)
  • 方法 Pauli.evolve()PauliList.evolve() メソッドに新しいキーワード引数 frame が加わった。 もし frame='h' (デフォルト)であれば、クリフォード( P=CPCP' = C^\dagger P C )によるパウリのハイゼンベルグ像進化を行い、もし frame='s' であれば、クリフォード( P=CPCP' = C P C^\dagger )によるパウリのシュレーディンガー像進化を行います。後者のオプションの方が計算が速く、ある種の場合にも有用です。 この新しいオプションは、 decompose_clifford における貪欲なクリフォード分解法の計算を大幅に高速化する。

  • Qiskitに新しいモジュールを追加: qiskit.primitives. プリミティブ・モジュールは、APIが定義される場所であり、 QuantumCircuit から特定の共通関数の計算に関するさまざまな抽象化を提供し、 Backend における基本的な実行の詳細を抽象化する。 これにより、より高度なアルゴリズムやアプリケーションは、計算の実行に集中することができ、結果の実行や処理について心配する必要がなくなり、一般的な計算のための標準化されたインターフェイスを持つことができる。 例えば、量子回路と観測値の期待値を推定することは、そのクラスを実装した任意のクラスで実行することができます。 BaseEstimator を実装した任意のクラスで実行でき、基本的な実装に関係なく標準化された方法で消費されます。 アプリケーションは、プリミティブ・インターフェースを直接使って書くことができる。

    モジュールは2種類のプリミティブを含んでいます。 Sampler (抽象クラスの定義については BaseSampler 抽象クラスの定義を参照)と Estimator (抽象クラスの定義については BaseEstimator を参照)。 リファレンス実装は qiskit.primitives モジュールに含まれており qiskit.quantum_info モジュールを使って構築される。 期待されるのは、プロバイダ・パッケージが、(典型的には古典的なランタイムを使用して)プロトコルをネイティブに効率的に実装できるプロバイダに対して、これらのインターフェースの独自の実装を提供することである。 さらに将来的には、プリミティブのネイティブな実装を提供しないプロバイダに対して、プリミティブオブジェクトを Backend.

  • 新しいモジュールを追加した、 qiskit.qpyこのモジュールには、これまで qiskit.circuit.qpy_serialization で公開されていた機能が含まれている。 qiskit.circuit.qpy_serializationdump() および load() で公開されていたパブリック関数は、この新しいモジュールから利用できるようになりました(ただし、 qiskit.circuit.qpy_serialization からもアクセス可能ですが、これは将来のリリースで廃止される予定です)。 この新しいモジュールは、QPYファイルフォーマットの将来的な方向性を考慮して追加されたもので、将来のバージョンでは、以下のような表現をサポートする予定である。 pulseScheduleScheduleBlock オブジェクトをサポートします。 QuantumCircuit オブジェクトをサポートします。

  • 新しい属性を追加しました、 qubit_properties を追加した。 Target クラスに追加されました。 この属性には QubitProperties オブジェクトのリストが含まれます。 例:

    target.qubit_properties[2]

    を含む。 QubitProperties を含む。

    著者にとって BackendV2 著者にとって QubitProperties を直接 BackendV2 をオーバーライドすることで直接定義していた場合 BackendV2.qubit_properties() をオーバーライドすることで、実装上で直接定義していたとしても、これは問題なく機能する。 しかし、もしその定義を基礎となる Target オブジェクトに移し BackendV2.qubit_properties() の実装を削除すれば、トランスパイラでqubitプロパティを使用できるようになり、以前の実装とのAPIの互換性も保たれます。

  • 新しい関数を追加した、 qiskit.algorithms.eval_observables()を追加した。 QuantumCircuit. このメソッドはクラスのプライベート・メソッド、 _eval_aux_ops() に由来する。 qiskit.algorithms.VQE クラスの eval_observables() 関数はより一般的になり、例えば時間発展アルゴリズムなど、他のアルゴリズムでも使えるようになりました。

  • の基底探索戦略が BasisTranslator transpilerパスの基底探索戦略がDijkstra探索の変形に変更され、到達不可能な基底をターゲットとする際のパスの実行性能が大幅に改善された。

  • トランス DenseLayout トランスパイラー・パスがマルチスレッド化され、パスの実行時パフォーマンスが大幅に向上した。 デフォルトでは、ローカルシステムの論理CPU数を使用するが、環境変数 RAYON_NUM_THREADS を整数値に設定することで、パスが使用するスレッド数を制御することができる。 たとえば、 RAYON_NUM_THREADS=4 を設定すると DenseLayout パスを4スレッドで実行する。

  • の内部計算を行う。 Statevector.expectation_value()DensityMatrix.expectation_value() メソッドはRustプログラミング言語で再実装されている。 この新しい実装はマルチスレッドで、デフォルトでは Statevector または DensityMatrix >= 19qubitsの場合、ローカルシステムで利用可能な論理CPUの数だけスレッドプールが生成される。 環境変数 RAYON_NUM_THREADS を整数値に設定することで、使用するスレッド数を制御できる。 例えば、 RAYON_NUM_THREADS=4 を設定すると、スレッドプールでは4スレッドしか使われない。

  • 新しい SparsePauliOp.from_sparse_list() イテレート可能なコンストラクタを追加した。このコンストラクタの要素はパウリ項を表し、それ自体がスパースであるため、 "XIIIIIIIIIIIIIIIX"("XX", [0, 16]) と書くことができる。 例えば

H=X0Z3+2Y1Y4H = X_0 Z_3 + 2 Y_1 Y_4

は次のように組み立てられる

op = SparsePauliOp.from_sparse_list([("XZ", [0, 3], 1), ("YY", [1, 4], 2)], num_qubits=5)
# or equivalently, as previously
op = SparsePauliOp.from_list([("IZIIX", 1), ("YIIYI", 2)])

これにより、イジング・ハミルトニアンでよく見られるような、多数の量子ビット上の非常にスパースな演算子の構築が容易になる。

  • トランス UnitarySynthesis トランスパイラー・パスのコンストラクターには、新しいキーワード引数 target がある。 これは、オプションで Target オブジェクトを指定することができる。 これを指定すると、 basis_gatescoupling_mapbackend_props に設定された値に優先する。

  • 抽象プラグイン・クラスには UnitarySynthesisPlugin 抽象プラグインクラスには、実装者が追加できる新しいオプション属性がある、 supports_target. プラグインのこの属性が True に設定されている場合、 ペイロードの フィールドの下にオブジェクトが渡される。 Target オブジェクトが options ペイロードの target フィールドに渡されます。 期待されるのは、この Target オブジェクトは、 coupling_mapgate_lengthsbasis_gatesgate_errors の代わりに使用されることが期待される。

  • 新しいトランスパイラー・パス・ワークフローを導入。 PassManager ワークフローを導入。 QuantumCircuit オブジェクトを構築するための新しいトランスパイラ・パス・ワークフローを導入した。 新しいワークフローでは、スケジューリングパスとアライメントパスはすべて AnalysisPass オブジェクトであり、パス・マネージャのプロパティ・セット、特に各オプノードの絶対開始時刻を保持する新しいプロパティ・セット項目 node_start_time のみを更新します。 別個の TransformationPass のような PadDelay などは、その後DAGにスケジューリングを適用するために使われる。 この新しいワークフローは、より効率的であり、バックエンドによって公開される追加のタイミング制約を修正することができる。

    以前は、パスチェーンは scheduling -> alignment として実装されていました。 DAGCircuit インスタンスが再作成されていました。 さらに、各パスでスケジューリングが行われ、インストラクションの開始時刻が決定される。 これで、必要なパスチェーンは scheduling -> alignment -> paddingDAGCircuit 更新は最後に padding

    カスタムオブジェクトを作成する場合 PassManager 回路スケジューリングを含むカスタム・オブジェクトを作成する場合は、次のように調整する必要がある。 PassManager を調整し、 BasePadding パス(現在は PadDelay または PadDynamicalDecoupling をスケジューリングパス・チェインの最後に挿入するように調整する必要があります。 パディング・パスがないと、スケジューリング・パスは、カスタムの run() メソッドの出力回路には反映されません。 PassManager.

    例えば、以前は PassManager を構築していたとする:

    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import TimeUnitConversion, ALAPSchedule, ValidatePulseGates, AlignMeasures
    
    pm = PassManager()
    scheduling = [
        ALAPSchedule(instruction_durations), PadDelay()),
        ValidatePulseGates(granularity=timing_constraints.granularity, min_length=timing_constraints.min_length),
        AlignMeasures(alignment=timing_constraints.acquire_alignment),
    ]
    pm.append(scheduling)

    を使うことができる:

    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import TimeUnitConversion, ALAPScheduleAnalysis, ValidatePulseGates, AlignMeasures, PadDelay
    
    pm = PassManager()
    scheduling = [
        ALAPScheduleAnalysis(instruction_durations), PadDelay()),
        ConstrainedReschedule(acquire_alignment=timing_constraints.acquire_alignment, pulse_alignment=timing_constraints.pulse_alignment),
        ValidatePulseGates(granularity=timing_constraints.granularity, min_length=timing_constraints.min_length),
        PadDelay()
    ]
    pm.append(scheduling)

    これは、より効率的であると同時に、ハードウェアの制約に基づいて命令を整列させる。

  • 新しいトランスパイラー・パスを追加 ConstrainedReschedule パスを追加しました。 パスでは ConstrainedReschedule パスでは、ハードウェアのアライメント制約の両方を考慮する。 BackendConfigurationpulse_alignmentacquire_alignment。 この新しいクラスは、従来の AlignMeasures この新しいクラスは、一般的な命令アライメントに加えて、測定命令に対しても(プロパティセットを介して)同じアライメントを実行するためです。 の引数に acquire_alignment 制約を設定することで ConstrainedReschedule パスの代わりに AlignMeasures 新しいパス( BasePadding )と組み合わせると、このパスと置き換わる。

  • トランスパイラー・パスを2つ追加 ALAPScheduleAnalysisASAPScheduleAnalysis に優先する ALAPScheduleASAPSchedule を追加した。 新しいパスは、同じスケジューリングを実行するが、プロパティセットで、すべてのスケジューリングアライメント分析に基づいて回路を調整する BasePadding パスに依存している。

    これらのパスの標準的な動作は、タイミング順序をDAGノードのトポロジー順序に合わせる。 この変更は、条件演算を含む場合や、同じ古典レジスタ(エッジケース)で2つの量子ビットを同時に測定する場合、スケジューリング結果に影響を与える可能性がある。 従来の動作を再現するには、 clbit_write_latency を測定命令長と同じに設定する。

    例えば、このような入力回路のスケジューリングを考えてみよう:

         ┌───┐┌─┐
    q_0: ┤ X ├┤M├──────────────
         └───┘└╥┘   ┌───┐
    q_1: ──────╫────┤ X ├──────
               ║    └─╥─┘   ┌─┐
    q_2: ──────╫──────╫─────┤M├
               ║ ┌────╨────┐└╥┘
    c: 1/══════╩═╡ c_0=0x1 ╞═╩═
               0 └─────────┘ 0
    from qiskit import QuantumCircuit
    from qiskit.transpiler import InstructionDurations, PassManager
    from qiskit.transpiler.passes import ALAPScheduleAnalysis, PadDelay, SetIOLatency
    from qiskit.visualization.timeline import draw
    
    circuit = QuantumCircuit(3, 1)
    circuit.x(0)
    circuit.measure(0, 0)
    circuit.x(1).c_if(0, 1)
    circuit.measure(2, 0)
    
    durations = InstructionDurations([("x", None, 160), ("measure", None, 800)])
    
    pm = PassManager(
        [
          SetIOLatency(clbit_write_latency=800, conditional_latency=0),
          ALAPScheduleAnalysis(durations),
          PadDelay(),
        ]
    )
    draw(pm.run(circuit))

    タイムライン表示でわかるように、 q_2 の測定は、 q_1 の条件付きXゲートの前に開始される。これは、ノードのトポロジー的順序とは逆のようだ。 clbitのライト・アクセスはメジャー命令の終了エッジで起こり、条件ゲートのリード・アクセスは命令の開始エッジで起こるため、これも予想された動作である。 このように、古典的なレジスタのタイムスロットでは、トポロジカルな順序が保持されるが、これはタイムラインビューでは捉えられない。 しかし、これは特定のマイクロアーキテクチャー設計を前提としており、回路がこのようにスケジュールされている必要はない。

    パスのデフォルト設定を使用すると、回路は以下のようなスケジュールになる。

    from qiskit import QuantumCircuit
    from qiskit.transpiler import InstructionDurations, PassManager
    from qiskit.transpiler.passes import ALAPScheduleAnalysis, PadDelay
    from qiskit.visualization.timeline import draw
    
    circuit = QuantumCircuit(3, 1)
    circuit.x(0)
    circuit.measure(0, 0)
    circuit.x(1).c_if(0, 1)
    circuit.measure(2, 0)
    
    durations = InstructionDurations([("x", None, 160), ("measure", None, 800)])
    
    pm = PassManager([ALAPScheduleAnalysis(durations), PadDelay()])
    draw(pm.run(circuit))

    clbitは、測定指示の間隔を通してロックされていることに注意。 この動作はQiskit Pulseに基づいて設計されており、acquire命令は AcquireChannelMemorySlot 、他の命令と重複することは許されていない。つまり、異なる命令からの同時メモリアクセスは禁止されている。 これはまた、常にタイミング順序をトポロジカル・ノード順序と一致させる。

  • 新しいトランスパイラー・パスを追加 PadDynamicalDecoupling パスが追加された。 DynamicalDecoupling パスが追加された。 この新しいパスでは、以前のパスで行われたスケジューリングとアラインメント解析に従って、回路に動的デカップリングシーケンスが挿入される。

  • ビジュアライゼーション機能と plot_gate_map() 可視化関数とその上に構築された関数、 plot_error_map()plot_circuit_layout()には、新しいキーワード引数 qubit_coordinates がある。 この引数は、可視化されているバックエンドの各クオビットをプロットするために使用する 2D 座標のシーケンスを取ります。 このシーケンスが指定された場合、バックエンドの量子ビット数と同じ長さでなければならず、デフォルトの動作の代わりに使用される。

  • ビジュアライゼーション機能と plot_gate_map() 可視化関数とその上に構築された関数、 plot_error_map()plot_circuit_layout()は、 IBM のバックエンドと等しい量子ビット数を持つバックエンドだけでなく、どのバックエンドでもプロットできるようになりました。 これは、ビジュアライゼーションのレイアウトを生成するretworkx spring_layout() 関数に依存しています。 デフォルトのレイアウトがバックエンドの特定のカップリンググラフで動作しない場合は、 qubit_coordinates 関数を使用してカスタムレイアウトを設定できます。

  • ビジュアライゼーション機能と plot_gate_map() 可視化関数とその上に構築された関数、 plot_error_map()plot_circuit_layout()をベースにしたバックエンドで機能するようになった。 BackendV2 ベースのバックエンドで機能するようになった。 以前は、これらの関数は BaseBackend または BackendV1 ベースのバックエンドでのみ動作していました。

  • 新しいトランスパイラー・パスを追加、 SetIOLatency. このパスは2つの引数 clbit_write_latencyconditional_latency を取り、バックエンドの古典的ビットと古典的条件のI/Oレイテンシを定義する。 このパスは、後続のスケジューリングとアライメントのパスがこれらのレイテンシを補正し、ダイナミック回路のより正確なスケジューリング出力を提供できるように、パスマネージャのプロパティセットにこれらの値を定義する。

  • 新しいトランスパイラー・パス PadDelay が追加された。 このパスは、量子ビットワイヤーのアイドルタイムを次の命令で埋める。 Delay で埋める。 このパスは、トランスパイラにおけるパスのスケジューリングのための新しいワークフローの一部であり、スケジューリング分析パス(たとえば ALAPScheduleAnalysisASAPScheduleAnalysis )とアライメントパス(例えば ConstrainedRescheduleなど)が PadDelay.

  • トランス VF2Layout トランスパイラー・パスは、新しいキーワード引数 targetTarget オブジェクトを提供するために使われます。 指定された場合 Target はターゲット・デバイスに関するすべての情報に対してパスによって使用される。 これを指定すると、 target オプションが、 coupling_mapproperties 引数より優先される。

  • で、オプティマイザとして呼び出し可能ファイルを許可する。 VQE および QAOA. さて、オプティマイザはQiskitのオプティマイザのひとつ、たとえば SPSA のようなオプティマイザか、 以下のシグネチャを持つ callable のいずれかです:

    from qiskit.algorithms.optimizers import OptimizerResult
    
    def my_optimizer(fun, x0, jac=None, bounds=None) -> OptimizerResult:
        # Args:
        #     fun (callable): the function to minimize
        #     x0 (np.ndarray): the initial point for the optimization
        #     jac (callable, optional): the gradient of the objective function
        #     bounds (list, optional): a list of tuples specifying the parameter bounds
    
        result = OptimizerResult()
        result.x = # optimal parameters
        result.fun = # optimal function value
        return result

    上記のシグネチャは、任意の SciPy ミニマイザを直接渡すこともできます

    from functools import partial
    from scipy.optimize import minimize
    
    optimizer = partial(minimize, method="L-BFGS-B")

既知の問題

  • 実行時 parallel_map() (を実行しているとき(これは、パフォーマンスを重視する transpile()assemble()の外部で起動されたサブプロセスで実行される)場合、内部で実行される並列ディスパッチが parallel_map()の外部で起動されたサブプロセスで実行されると、内部で実行された並列ディスパッチが parallel_map() の外部で起動されたサブプロセスで実行されると(これはパフォーマンスに敏感な これは、 Linux と macOS のサブプロセスを Python 3.7 で起動するデフォルトの方法に関する CPython のアップストリームの問題によるものです(詳しくは https://bugs.python.org/issue40379 を参照)。 メインプロセスからの呼び出しは問題なく動作するはずなので、 入れ子になった並列プロセスを削除するか、 CPython 標準ライブラリ モジュールを手動で呼び出して、 サブプロセスから同様の並列ディスパッチを行うことができます。 parallel_map() を呼び出すか、 CPython 標準ライブラリ multiprocessing モジュールを手動で呼び出して、 サブプロセスから同様の並列ディスパッチを実行するか、 "spawn""forkserver" の launch メソッドを使って、スタックして戻らなくなるのを避けるかです。

アップグレードの注意

  • クラス Qubit, Clbit そして AncillaQubit__slots__ 属性を持つようになった。 これはメモリ使用量を減らすためだ。 副次的な効果として、属性として任意のデータを付加することができなくなった。 これは、パフォーマンス上の利点以外に、下流のコードに影響を与えることはほとんどないだろう。

  • コアの依存関係 retworkx のバージョン要件が 0.10.1 から 0.11.0 に引き上げられた。 これにより、トランスピレーション・パスのパフォーマンスが向上する。 ConsolidateBlocks.

  • symengine の最小サポートバージョンは 0.9.0 になりました。 との並列ディスパッチの一部として内部的に使用される Python の pickle モジュールとの互換性を向上させるために必要でした。 parallel_map().

  • Python 3.9 Linux で実行した場合の QISKIT_PARALLEL のデフォルト値が TRUE に設定されました。 つまり parallel_map() またはそれを内部的に呼び出す関数、たとえば transpile()assemble()などの関数を実行する場合、その関数は複数のプロセスで実行され、実行時のパフォーマンスが向上するはずです。 この変更は、並列ディスパッチの信頼性に関する問題が解決されたと思われるためです(詳細は #6188を参照)。 それでも問題が発生する場合は、環境変数 QISKIT_PARALLELFALSE に設定するか、ユーザー設定ファイルの parallel オプションを False に設定することで、マルチプロセッシングを無効にし、以前のデフォルトの動作に戻すことができます(また、マルチプロセッシングに関する問題を追跡できるよう、issue を提出してください)。

  • にあった非推奨の MSGate ゲート・クラスは削除された。 qiskit.circuit.library は削除されました。 これはもともと、 0.16.0 リリースで非推奨となっていた。 代わりに GMS クラスを使うべきである。これによって、任意の数の量子ビットに対応する MSGate に加えて、同等の2量子ビットMSゲートを作成できるからである。

  • クラスの mirror() メソッドは削除されました。 Instruction メソッドは削除されました。 元々、 0.15.0 リリースでは非推奨だった。 代わりに Instruction.reverse_ops().

  • num_ancilla_qubits() メソッドは、以前は非推奨だった。 qiskit.circuit.library.PiecewiseLinearPauliRotationsqiskit.circuit.library.WeightedAdder クラスのメソッドは削除されました。 これはもともと、 0.16.0 リリースで非推奨となっていた。 代わりに PiecewiseLinearPauliRotations.num_ancillas()WeightedAdder.num_ancillas()

  • クラスのコンストラクタの reverse 引数は廃止されました。 PolynomialPauliRotations クラスのコンストラクタの引数は削除されました。 これはもともと、 0.15.0 リリースで非推奨となっていた。 代わりに QuantumCircuit.reverse_bits() メソッドを使って PolynomialPauliRotations を使うべきである。

  • のコンストラクタの angleC3SXGateC3XGate ゲートクラスのコンストラクタの引数は削除されました。 これはもともと、 0.17.0 リリースで非推奨となっていた。 その代わり、分数3制御Xゲートには C3XGate.power()

  • np.ndarrayparams オブジェクトの Gate オブジェクトの属性の一部として これはQiskit Terra 0.16.0 以降非推奨となり、現在は動作しません。 その代わりに Gate メソッドをオーバーロードして、 np.ndarray 入力を明示的に許可する必要がある。 validate_parameter() メソッドをオーバーロードすることで明示的に入力を許可する必要があります。

  • pip install qiskit-terra のインストール・ターゲットに新しいエクストラ csp-layout-pass が追加され、 all のエクストラにも含まれています。 これはQiskit Terra 0.20 では影響しませんが、Qiskit Terra 0.21 からは、トランスパイラパスのみに必要な依存関係は、要件からオプションに格下げされます。 CSPLayout トランスパイラパスのみに必要な依存関係は要件からオプションに格下げされ、この追加でインストールされます。 このパスに依存するパッケージは、その要件 (または pip install コマンド) をターゲット qiskit-terra[csp-layout-pass] に設定することで準備できます。

  • Python 3.6。 Qiskit を実行するには、最低 Python バージョンの 3.7 が必要です。

  • を継承している。 AmplitudeEstimator は Python 標準ライブラリの ABC クラスを継承している。 これによって、以前は必要なかった estimate() メソッドを実装する必要がある。 これは、このクラスの本来の意図が、 ABC の子クラスとして常に存在することであったためである。 estimate() オブジェクトの操作に必要だからです。 AmplitudeEstimator オブジェクトの操作に必要だからです。 しかし AmplitudeEstimator を実装していないサブクラスを定義していた場合 estimate() を実装していないサブクラスを定義していた場合はエラーになります。

  • で発生するエラーは HoareOptimizer オプションの依存関係 z3 が利用できない場合に TranspilerError から MissingOptionalLibraryError (これは QiskitError であり、 ImportError)。 これは、他のオプションの依存関係との一貫性を保つために行われた。

  • Linux では、ライブラリの最小サポート数が manylinux2010 VM から次のように引き上げられた。 manylinux2014. これはNumpyとScipyの同様の変更と同じである。 システムにまだ非常に古いバージョンの glibc が入っていない限り、ほとんどのユーザーにとって意味のある影響はないはずだ。

  • この marginal_counts() 関数は Result オブジェクトの入力で呼び出された場合、実験データの memory フィールドが入力に設定されていれば、そのフィールドをマージナル化する。 Result. 以前は、入力の memory 。 が呼び出された後、 counts フィールドが memory フィールドと一致しなくなることがあったため、この変更が行われた。 marginal_counts() が呼び出された後に 以前の動作に戻したい場合は、 marginalize_memory=Nonemarginal_counts() の引数に memory

  • トランスパイラー・パスは StochasticSwap トランスパイラ・パスは、同じシード値を設定しても異なる結果を返すことがある。 これは、実行時のパフォーマンスを向上させるために、トランスパイラー・パスの内部書き換えが行われたためである。 しかしこれは、 0(デフォルト)、1(デフォルト)、2(デフォルト)を transpile()optimization_level seed_transpiler 0, 1 (デフォルト), 2 で実行した場合、 Qiskit Terra にアップグレードすると、 異なるスワップマッピングが出力される可能性があります。 0.20.0

  • Qiskit Terraをソースからビルドするには、 Rust コンパイラが必要です。 これは、トランスパイラー・パスの内部的な書き換えによるものです。 StochasticSwap トランスパイラ・パスの内部的な書き換えによるもので、これによりトランスパイラのランタイム・パフォーマンスが大幅に向上している。 rustコンパイラーは、ここにあるrustupを使って簡単にインストールできる: https://rustup.rs/

  • name クラスの PauliEvolutionGate クラスの属性は常に "PauliEvolution" に変更されました。 この変更は、Qiskitの他のゲートと一貫性を持たせるために行われ、Qiskitの他の部分が、回路内の特定の操作が PauliEvolutionGate. 例えば、パウリ進化ゲートへの展開が可能になる。

    以前は、名前に進化した演算子が含まれていたが、現在は PauliEvolutionGate.label 属性で利用できるようになりました。 を持つ回路が描かれても PauliEvolutionGate が描かれていても、ゲートはどのゲートが進化しているかという同じ情報を示す。

  • 以前は非推奨だったメソッド:

    • qiskit.algorithms.VQE.get_optimal_cost
    • qiskit.algorithms.VQE.get_optimal_circuit
    • qiskit.algorithms.VQE.get_optimal_vector
    • qiskit.algorithms.VQE.optimal_params
    • qiskit.algorithms.HamiltonianPhaseEstimationResult.most_likely_phase
    • qiskit.algorithms.PhaseEstimationResult.most_likely_phase

    Qiskit Terra 0.18.0 リリースで非推奨とされていたものは削除され、今後は動作しません。

  • qiskit.algorithms.VariationalAlgorithm クラスは抽象ベース・クラス (ABC) として定義され、これを継承するクラスは VariationalAlgorithm.initial_point ゲッター・メソッドとセッター・メソッドの両方を定義する必要があります。

  • pass_manager kwargは削除された。 transpile() 関数は削除された。 これはもともと、 0.13.0 リリースで非推奨となっていた。 カスタム・オブジェクトで回路をトランスパイルする好ましい方法は PassManager オブジェクトの run() オブジェクトの PassManager オブジェクトのメソッドを使用することです。

  • 以前は非推奨だった ParametrizedSchedule クラスは削除され、現在は存在しない。 このクラスは、 0.17.0 のリリースの一部として非推奨となった。 このクラスを使用する代わりに、直接パラメータを指定することができます。 Schedule または ScheduleBlock オブジェクトを直接パラメトリック化することができる。 Parameter オブジェクトを直接パラメトリック化することができます。

  • qiskit-terra 0.17.0 (2021年4月1日リリース) の非推奨通知に従い、モジュール qiskit.circuit.library.probability_distributions は削除され、もはや存在しません。 影響を受けるクラスは UniformDistributionNormalDistributionLogNormalDistribution である。 これらはすべて qiskit-finance ライブラリの回路ライブラリモジュールに移動される: qiskit_finance.circuit.library.probability_distributions.

  • 以前の qiskit.test.mock.fake_mumbai_v2.FakeMumbaiV2 クラスは、 FakeMumbaiFractionalCX に改名された。 BackendV2 ムンバイ・デバイス IBM の偽バックエンド qiskit.test.mock.backends.FakeMumbaiV2 と区別するためです。 の小数アプリケーションを持つ偽のバックエンドを取得するために、 FakeMumbaiV2 クラスを使用していた場合、 クラスを使用する必要があります。 CXGateFakeMumbaiV2 が定義されている偽のバックエンドを取得するために FakeMumbaiFractionalCX クラスを使用する必要があります。 Target.

  • で使用されるリゾルバは QuantumCircuit.append() (で使用されるリゾルバが変更された。 QuantumCircuitで使用されるリゾルバは、より高速で信頼性の高いものに変更された。 というような特定の構図がある:

    import numpy as np
    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(1, 1)
    qc.measure(np.array([0]), np.array([0]))

    のような特定の病的な入力は、以前はエラーとなっていたが、現在では動作する:

    from sympy import E, I, pi
    qc.x(E ** (I * pi))

    がエラーを出すようになった。 ほとんどすべての正しい使い方において、一般的なスピードアップを除けば、目立った変化はないはずだ。

  • 準パブリック内部メソッド QuantumCircuit._append() は、入力の型をチェックしなくなり、引数リストに無効な重複がないと仮定する。 この関数はQiskitや他のライブラリの特定の内部部分で使用され、 QuantumCircuit データが既に正しいことがわかっている場合はエラー チェックをスキップして、インスタンスをできるだけ早く処理します。 一般的に、ユーザーデータを取り込むユーザーや関数は、public QuantumCircuit.append() メソッドを使うべきです。このメソッドは整数のビット指定子を解決し、引数をブロードキャストし、入力が正しいかどうかをチェックします。

  • CythonはQiskit Terraのビルド依存ではなくなり、Qiskit Terraをソースからビルドする際にインストールする必要がなくなりました。

  • でプリセットされたパスマネージ qiskit.transpiler.preset_passmanagers によって生成されたすべての最適化レベル2と3に対して level_2_pass_manager()level_3_pass_manager() を実行するように変更されました。 VF2Layout を実行するように変更されました。 この VF2Layout パスは、完璧なレイアウトが見つかるかどうかを素早くチェックし、これまで最適化レベル2と3に対して行われていた TrivialLayoutCSPLayout を組み合わせて完璧なレイアウトを見つけようとしていました。 をデフォルトで呼び出した場合、異なる動作になる可能性があります。 transpile() をデフォルトで呼び出すと、些細なレイアウト( circuit.qubits[0] が物理qubit 0にマップされ、 circuit.qubits[1] が物理qubit 1にマップされるなど)が完璧であると仮定して、些細なレイアウトを使用するすべての最適化レベル >=2 のデフォルトパスが削除されるためです。 もしあなたのユースケースがトリビアル・レイアウトに依存しているのであれば、トランスパイル時に layout_method="trivial"transpile().

  • 最適化レベル1のプリセット・パス・マネージャー( で呼び出した場合、または transpile() によって生成される最適化レベル1( optimization_level=1 で呼び出した場合、または optimization_level 引数が設定されていない場合)用のプリセットパスマネージャが変更されました。 level_1_pass_manager() がデフォルトで呼び出されるように変更されました。 VF2Layout が呼び出される前に、完璧なレイアウトが見つかるかどうかを素早くチェックするように変更されました。 DenseLayout. しかし、最適化レベル2および3とは異なり、実行前に些細なレイアウトが試みられる。 VF2Layout の出力が使われる。 VF2Layout の出力が使われる。

非推奨のメモ

  • の引数 max_creditsexecute()と、 Qobj のすべてのコンフィギュレーション(たとえば QasmQobjConfigPulseQobjConfig) は非推奨であり、将来のリリースで削除される予定です。 クレジットシステムは、 IBM Quantum バックエンドでは2年間使用されておらず、このオプションは何の効果もない。 代替案は必要ない。 例えば execute() として

    job = execute(qc, backend, shots=4321, max_credits=10)

    の場合は、 max_credits の引数を省略すればよい:

    job = execute(qc, backend, shots=4321)
  • クラスのコンストラクタの order 引数に奇数整数を使用することは、今後のリリースでは使えなくなります。 SuzukiTrotter クラスのコンストラクタの引数に奇数整数を使うことは非推奨です。 で使用される積公式は、鈴木の積公式が対称であるように、次数が偶数の場合にのみ定義される。 SuzukiTrotter で使用される積の公式は、鈴木の積の公式が対称であるように、順序が偶数である場合にのみ定義される。

  • MatplotlibDrawerTextDrawingQCircuitImage クラスへの qregscregslayoutglobal_phase クワーグと、 MatplotlibDrawer クラスへの calibrations クワーグは、現在非推奨であり、今後のリリースで削除される予定である。

バグ修正

  • 回路変換関数のエラーを修正 circuit_to_gate()circuit_to_instruction() (および関連する回路メソッド QuantumCircuit.to_gate() および QuantumCircuit.to_instruction())が、レジスタのないビット、または複数のレジスタのビットを持つ回路に作用するときのエラーを修正しました。

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

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    
    qreg = QuantumRegister(4)
    creg = ClassicalRegister(1)
    circ = QuantumCircuit(qreg, creg)
    
    with circ.if_test((creg, 0)):
        circ.h(0)
    
    if_else_instruction, _, _ = circ.data[0]
    true_body = if_else_instruction.params[0]
    true_body.copy()
  • 標準セッション等価ライブラリーに欠けていたエントリーを CXGateCPhaseGateCXGateCRZGate.

  • 2つのオブジェクト間で == 演算子を実行するとエラーが発生する問題を修正しました。 SparsePauliOp 演算子を実行するとエラーになる問題を修正した。 例:

    op = SparsePauliOp.from_list([("X", 1), ("Y", 1)])
    op2 = SparsePauliOp.from_list([("X", 1), ("Y", 1), ("Z", 0)])
    print(op == op2)

    これまでは、 False を返す代わりに、 ValueError を返していた。

  • のサポートを修正した。 transpile() のサポートを修正した。 InstructionScheduleMap オブジェクトを PassManager をベースに Target バックエンドの BackendV2 ベースのバックエンドに 以前は transpile() 関数はこの処理を行わず、まだ Target オブジェクトでの作業をサポートしていないトランスパイラ・パスは、バックエンドからの命令に対するデフォルトのパルス較正にアクセスすることができません。 BackendV2 バックエンドからの命令に対するデフォルトのパルス較正にアクセスできない。

  • を使用できるようになりました。 AmplitudeAmplifier がルート qiskit.algorithms モジュールから直接利用できるようになった。 以前はルート・モジュールから再エクスポートされたクラスには含まれておらず、 qiskit.algorithms.amplitude_amplifiers からしかアクセスできませんでした。 修正 #7751

  • サーキットドロワー機能の mpl バックエンドの問題を修正しました。 circuit_drawer() および QuantumCircuit.draw() メソッドのバックエンドで、十分な数のゲートがドロワーを2列目に折り返す際に、条件を持つゲートが正しく表示されない問題を修正しました。 修正しました: #7752.

  • 特定の条件下で HHL.construct_circuit() メソッドが正しい値を返さない問題を修正。 QuantumCircuit. 以前は、固有値を表現するのに必要な量子ビットの数を計算する際に丸め誤差があり、これが誤った回路出力の原因となっていた。

  • のエンディアンのバグを修正した。 BaseReadoutMitigator.expectation_value()diagonal のエンディアンのバグを修正した。 これでQiskit Terraの他の部分と同じように、ビッグエンディアンではなくリトルエンディアンと正しく解釈されるようになりました。

  • の問題を修正しました。 quantum_info.partial_trace()* を*返すようになりました。 DensityMatrix を返すようになりました。 7613を修正

  • サーキットドロワー機能の text バックエンドの問題を修正しました。 circuit_drawer() および QuantumCircuit.draw() メソッドのバックエンドの問題を修正しました。 CPhaseGateRZZGate のようなサイドテキストを使用するゲートに古典的な条件が設定されている場合、正しく表示されない問題を修正しました。 修正 #7532

  • の問題を修正しました。 circuit_drawer() 関数と draw() メソッドの QuantumCircuit. reverse_bits オプションを mpllatextext オプションと併用した場合、レジスタのないビットが正しい順序で表示されなかった。 修正 #7303

  • メソッドの問題を修正した。 LocalReadoutMitigator.assignment_matrix() メソッドで、 qubits 引数の入力値が、 [0, 1, 2, ..., n-1]. これは修正され、測定される量子ビットのインデックスがどのようなリストでもメソッドに受け入れられるようになった。

  • メソッドの期待値計算における問題を修正した。 StabilizerState.expectation_value() メソッドの期待値計算における問題を修正した。 Paulioper 演算子が自明でない位相を持っていた場合に、出力期待値が不正確になる問題を修正しました。 #7441 を修正。

  • パウリ恒等式 opflow.I を含む opflow 式は、回路に変換されたときに IGate を生成しなくなりました。 回路のIDゲートは遅延を示すが、opflowでは数学的なIDを期待する。

  • そのため PauliGate はもはや IGate"I" を挿入しなくなった。

  • PauliSumOp 等値性テストは、比較されるアイテムの1つが単一である場合を処理するようになった。 PauliOp. 例えば、 0 * X + I == I はTrueと評価されるようになったが、このリリース以前はFalseだった。

  • の問題を修正しました。 ALAPScheduleASAPSchedule トランスパイラ・パスの問題を修正しました。 以前は、スケジューリングパスがカスタムパルスキャリブレーションからの継続時間をこれらの命令に使用しなかったため、回路に対して誤ったスケジューリングが生成されていました。 この問題が修正され、スケジューリング・パスは、カスタム・キャリブレーションを持つ回路内のすべての命令に対して、カスタム・パルス・キャリブレーションの期間を使用するようになりました。

  • での ParameterExpression 命令パラメーターを RZXCalibrationBuilder トランスパイラ・パスに 以前は、インストラクション・パラメーターにバウンド ParameterExpression を含む場合、パスはこれを正しく処理できなかった。

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

  • OpenQASM 3 エクスポーター、 qasm3.Exporterは、予約された OpenQASM 3 キーワードと衝突するレジスタ名やパラメータ名を、新しい一意な名前を生成することでエスケープするようになった。 OpenQASM 3 エクスポーターから出力されるコードで、同じ名前のレジスタやパラメータが名前の衝突を起こすことがなくなりました。 修正 #7742

エア 0.10.3

変更なし

イグニス 0.7.0

変更なし

IBM Q プロバイダー 0.18.3

変更なし

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