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のシーケンスで表現できる関数)を効率的にエンコードする新しいゲート・クラスを追加した。CXGateとSwapGateゲートのシーケンスで表現できる関数)を効率的にエンコードする -
新しいトランスパイラー・パスを追加
CollectLinearFunctions連続するCXGateとSwapGateゲートを収集し、各ブロックをLinearFunctionゲートに置き換えます。 -
新しいトランスパイラパスを追加しました
LinearFunctionsSynthesisあらゆるものを合成するLinearFunctionPatel-Markov-Hayes アルゴリズムを使用するゲート。 トランスパイラーパスと組み合わせるとCollectLinearFunctionsトランスパイラー・パスと組み合わせると、連続したCXGateとSwapGateゲートを収集し、 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ステップ)を実行する。 -
のコンストラクタは
ZFeatureMapとZZFeatureMapクラスのコンストラクタには、新しいキーワード引数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パラメータを持つ の使用例ParameterをTemplateOptimizationを使った例を以下に示す: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をベースにした新しい偽のバックエンドクラスを作成するのに必要なスナップショットファイルがないため、FakeRueschlikon、FakeTenerife、FakeTokyoの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モジュールにあるFakeBogota、FakeManila、FakeRome、FakeSantiago偽のバックエンドが、Pulse 実験のバックエンドとして使えるようになった。PulseDefaults等価な IBM Quantum マシンのプロパティのスナップショットから作成されます。 -
パスは、コンストラクタに新しいキーワード引数を持つ。
ConsolidateBlocksパスのコンストラクタには、新しいキーワード引数targetがある。 この引数はTargetオブジェクトを指定する。 指定された場合は、basis_gateskwargに優先する。 ターゲットが指定された場合、パスはそのターゲットで定義された命令のゲートと量子ビットを尊重する。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_serializer。dump()に対する新しい引数で、ユーザは、辞書をシリアライズするための内部json.dump()呼び出しで使用されるカスタムJSONEncoderを指定できる。QuantumCircuit.metadata辞書をシリアライズするための内部コールで使用されるカスタム。 これは、metadata_deserializerの新しい引数と組み合わせることができます。qpy.load()関数の新しい引数と組み合わせて、カスタムJSONエンコーディングをデコードすることができます。 でmetadata_serializerが指定されているがdump()に指定されているが、metadata_deserializerload()に指定されていない場合、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_mapとbackend_propに優先する。 -
この
Targetクラスに新しいメソッドが追加された、operation_names_for_qargs(). このメソッドは、指定されたqargsタプルに対する操作の操作名(つまりターゲット内のルックアップ・キー)を取得するために使用される。 -
新しいパス
DynamicalDecouplingPadding。qiskit.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 をインストールするのに十分ではありません。 さらに、これらの同じ制約により、コンパイル済みのホイールを公開する前にテストすることができないため、他のプラットフォームに存在するようなプラットフォーム・サポートに関する保証はここでは適用されない。 -
その
GradientとQFIクラスは期待値勾配の虚部を計算できる。 異なる測定基準を使用する場合、すなわち-YZの代わりに、勾配の虚部を測定することができる。測定基底は 引数で設定できる。aux_meas_op勾配については、
aux_meas_op = Zが0.5Re[(⟨ψ(ω)|)O(θ)|dωψ(ω)〉]を計算し、aux_meas_op = -Yが0.5Im[(⟨ψ(ω)|)O(θ)|dωψ(ω)〉]を計算する。 QFIについては、aux_meas_op = Zが4Re[(dω⟨<ψ(ω)|)(dω|ψ(ω)〉)]を、aux_meas_op = -Yが4Im[(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_dark。mplドローワーバックエンドでstyleがiqx_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量子ビットの測定から得られたqiskitResultオブジェクトが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_level0, 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_cairo、ibm_hanoi、ibmq_kolkata、ibm_nairobi、ibm_washingtonのモック版が含まれる。 他の偽のバックエンドと同様に、これらには実際のシステムから取得したキャリブレーションとエラーデータのスナップショットが含まれており、ローカルテスト、コンパイル、シミュレーションに使用することができる。 -
新クラス導入
StatePreparation. このクラスは、リセットを自動的に適用することなく、Initialize。例えば、 の状態の量子ビットを用意する:
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'(デフォルト)であれば、クリフォード( )によるパウリのハイゼンベルグ像進化を行い、もしframe='s'であれば、クリフォード( )によるパウリのシュレーディンガー像進化を行います。後者のオプションの方が計算が速く、ある種の場合にも有用です。 この新しいオプションは、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_serialization、dump()およびload()で公開されていたパブリック関数は、この新しいモジュールから利用できるようになりました(ただし、qiskit.circuit.qpy_serializationからもアクセス可能ですが、これは将来のリリースで廃止される予定です)。 この新しいモジュールは、QPYファイルフォーマットの将来的な方向性を考慮して追加されたもので、将来のバージョンでは、以下のような表現をサポートする予定である。pulseScheduleとScheduleBlockオブジェクトをサポートします。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()関数はより一般的になり、例えば時間発展アルゴリズムなど、他のアルゴリズムでも使えるようになりました。 -
の基底探索戦略が
BasisTranslatortranspilerパスの基底探索戦略が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])と書くことができる。 例えば
は次のように組み立てられる
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_gates、coupling_map、backend_propsに設定された値に優先する。 -
抽象プラグイン・クラスには
UnitarySynthesisPlugin抽象プラグインクラスには、実装者が追加できる新しいオプション属性がある、supports_target. プラグインのこの属性がTrueに設定されている場合、 ペイロードの フィールドの下にオブジェクトが渡される。Targetオブジェクトがoptionsペイロードのtargetフィールドに渡されます。 期待されるのは、このTargetオブジェクトは、coupling_map、gate_lengths、basis_gates、gate_errorsの代わりに使用されることが期待される。 -
新しいトランスパイラー・パス・ワークフローを導入。
PassManagerワークフローを導入。QuantumCircuitオブジェクトを構築するための新しいトランスパイラ・パス・ワークフローを導入した。 新しいワークフローでは、スケジューリングパスとアライメントパスはすべてAnalysisPassオブジェクトであり、パス・マネージャのプロパティ・セット、特に各オプノードの絶対開始時刻を保持する新しいプロパティ・セット項目node_start_timeのみを更新します。 別個のTransformationPassのようなPadDelayなどは、その後DAGにスケジューリングを適用するために使われる。 この新しいワークフローは、より効率的であり、バックエンドによって公開される追加のタイミング制約を修正することができる。以前は、パスチェーンは
scheduling -> alignmentとして実装されていました。DAGCircuitインスタンスが再作成されていました。 さらに、各パスでスケジューリングが行われ、インストラクションの開始時刻が決定される。 これで、必要なパスチェーンはscheduling -> alignment -> padding。DAGCircuit更新は最後に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_alignment、acquire_alignment。 この新しいクラスは、従来のAlignMeasuresこの新しいクラスは、一般的な命令アライメントに加えて、測定命令に対しても(プロパティセットを介して)同じアライメントを実行するためです。 の引数にacquire_alignment制約を設定することでConstrainedRescheduleパスの代わりにAlignMeasures新しいパス(BasePadding)と組み合わせると、このパスと置き換わる。 -
トランスパイラー・パスを2つ追加
ALAPScheduleAnalysisとASAPScheduleAnalysisに優先するALAPScheduleとASAPScheduleを追加した。 新しいパスは、同じスケジューリングを実行するが、プロパティセットで、すべてのスケジューリングアライメント分析に基づいて回路を調整するBasePaddingパスに依存している。これらのパスの標準的な動作は、タイミング順序をDAGノードのトポロジー順序に合わせる。 この変更は、条件演算を含む場合や、同じ古典レジスタ(エッジケース)で2つの量子ビットを同時に測定する場合、スケジューリング結果に影響を与える可能性がある。 従来の動作を再現するには、
clbit_write_latencyを測定命令長と同じに設定する。例えば、このような入力回路のスケジューリングを考えてみよう:
┌───┐┌─┐ q_0: ┤ X ├┤M├────────────── └───┘└╥┘ ┌───┐ q_1: ──────╫────┤ X ├────── ║ └─╥─┘ ┌─┐ q_2: ──────╫──────╫─────┤M├ ║ ┌────╨────┐└╥┘ c: 1/══════╩═╡ c_0=0x1 ╞═╩═ 0 └─────────┘ 0from 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命令は
AcquireChannel、MemorySlot、他の命令と重複することは許されていない。つまり、異なる命令からの同時メモリアクセスは禁止されている。 これはまた、常にタイミング順序をトポロジカル・ノード順序と一致させる。 -
新しいトランスパイラー・パスを追加
PadDynamicalDecouplingパスが追加された。DynamicalDecouplingパスが追加された。 この新しいパスでは、以前のパスで行われたスケジューリングとアラインメント解析に従って、回路に動的デカップリングシーケンスが挿入される。 -
ビジュアライゼーション機能と
plot_gate_map()可視化関数とその上に構築された関数、plot_error_map()とplot_circuit_layout()には、新しいキーワード引数qubit_coordinatesがある。 この引数は、可視化されているバックエンドの各クオビットをプロットするために使用する 2D 座標のシーケンスを取ります。 このシーケンスが指定された場合、バックエンドの量子ビット数と同じ長さでなければならず、デフォルトの動作の代わりに使用される。 -
ビジュアライゼーション機能と
plot_gate_map()可視化関数とその上に構築された関数、plot_error_map()とplot_circuit_layout()は、 IBM のバックエンドと等しい量子ビット数を持つバックエンドだけでなく、どのバックエンドでもプロットできるようになりました。 これは、ビジュアライゼーションのレイアウトを生成するretworkxspring_layout()関数に依存しています。 デフォルトのレイアウトがバックエンドの特定のカップリンググラフで動作しない場合は、qubit_coordinates関数を使用してカスタムレイアウトを設定できます。 -
ビジュアライゼーション機能と
plot_gate_map()可視化関数とその上に構築された関数、plot_error_map()とplot_circuit_layout()をベースにしたバックエンドで機能するようになった。BackendV2ベースのバックエンドで機能するようになった。 以前は、これらの関数はBaseBackendまたはBackendV1ベースのバックエンドでのみ動作していました。 -
新しいトランスパイラー・パスを追加、
SetIOLatency. このパスは2つの引数clbit_write_latencyとconditional_latencyを取り、バックエンドの古典的ビットと古典的条件のI/Oレイテンシを定義する。 このパスは、後続のスケジューリングとアライメントのパスがこれらのレイテンシを補正し、ダイナミック回路のより正確なスケジューリング出力を提供できるように、パスマネージャのプロパティセットにこれらの値を定義する。 -
新しいトランスパイラー・パス
PadDelayが追加された。 このパスは、量子ビットワイヤーのアイドルタイムを次の命令で埋める。Delayで埋める。 このパスは、トランスパイラにおけるパスのスケジューリングのための新しいワークフローの一部であり、スケジューリング分析パス(たとえばALAPScheduleAnalysisやASAPScheduleAnalysis)とアライメントパス(例えばConstrainedRescheduleなど)がPadDelay. -
トランス
VF2Layoutトランスパイラー・パスは、新しいキーワード引数target。Targetオブジェクトを提供するために使われます。 指定された場合Targetはターゲット・デバイスに関するすべての情報に対してパスによって使用される。 これを指定すると、targetオプションが、coupling_mapとproperties引数より優先される。 -
で、オプティマイザとして呼び出し可能ファイルを許可する。
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_PARALLELをFALSEに設定するか、ユーザー設定ファイルの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.PiecewiseLinearPauliRotationsとqiskit.circuit.library.WeightedAdderクラスのメソッドは削除されました。 これはもともと、 0.16.0 リリースで非推奨となっていた。 代わりにPiecewiseLinearPauliRotations.num_ancillas()、WeightedAdder.num_ancillas()。 -
クラスのコンストラクタの
reverse引数は廃止されました。PolynomialPauliRotationsクラスのコンストラクタの引数は削除されました。 これはもともと、 0.15.0 リリースで非推奨となっていた。 代わりにQuantumCircuit.reverse_bits()メソッドを使ってPolynomialPauliRotationsを使うべきである。 -
のコンストラクタの
angle。C3SXGateとC3XGateゲートクラスのコンストラクタの引数は削除されました。 これはもともと、 0.17.0 リリースで非推奨となっていた。 その代わり、分数3制御XゲートにはC3XGate.power()。 -
np.ndarray。paramsオブジェクトの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=Noneをmarginal_counts()の引数にmemory。 -
トランスパイラー・パスは
StochasticSwapトランスパイラ・パスは、同じシード値を設定しても異なる結果を返すことがある。 これは、実行時のパフォーマンスを向上させるために、トランスパイラー・パスの内部書き換えが行われたためである。 しかしこれは、 0(デフォルト)、1(デフォルト)、2(デフォルト)をtranspile()optimization_levelseed_transpiler0, 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_costqiskit.algorithms.VQE.get_optimal_circuitqiskit.algorithms.VQE.get_optimal_vectorqiskit.algorithms.VQE.optimal_paramsqiskit.algorithms.HamiltonianPhaseEstimationResult.most_likely_phaseqiskit.algorithms.PhaseEstimationResult.most_likely_phase
Qiskit Terra 0.18.0 リリースで非推奨とされていたものは削除され、今後は動作しません。
-
qiskit.algorithms.VariationalAlgorithmクラスは抽象ベース・クラス (ABC) として定義され、これを継承するクラスはVariationalAlgorithm.initial_pointゲッター・メソッドとセッター・メソッドの両方を定義する必要があります。 -
の
pass_managerkwargは削除された。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は削除され、もはや存在しません。 影響を受けるクラスはUniformDistribution、NormalDistribution、LogNormalDistributionである。 これらはすべて 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データが既に正しいことがわかっている場合はエラー チェックをスキップして、インスタンスをできるだけ早く処理します。 一般的に、ユーザーデータを取り込むユーザーや関数は、publicQuantumCircuit.append()メソッドを使うべきです。このメソッドは整数のビット指定子を解決し、引数をブロードキャストし、入力が正しいかどうかをチェックします。 -
CythonはQiskit Terraのビルド依存ではなくなり、Qiskit Terraをソースからビルドする際にインストールする必要がなくなりました。
-
でプリセットされたパスマネージ
qiskit.transpiler.preset_passmanagersによって生成されたすべての最適化レベル2と3に対してlevel_2_pass_manager()とlevel_3_pass_manager()を実行するように変更されました。VF2Layoutを実行するように変更されました。 このVF2Layoutパスは、完璧なレイアウトが見つかるかどうかを素早くチェックし、これまで最適化レベル2と3に対して行われていたTrivialLayoutとCSPLayoutを組み合わせて完璧なレイアウトを見つけようとしていました。 をデフォルトで呼び出した場合、異なる動作になる可能性があります。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_credits。execute()と、Qobjのすべてのコンフィギュレーション(たとえばQasmQobjConfigとPulseQobjConfig) は非推奨であり、将来のリリースで削除される予定です。 クレジットシステムは、 IBM Quantum バックエンドでは2年間使用されておらず、このオプションは何の効果もない。 代替案は必要ない。 例えばexecute()としてjob = execute(qc, backend, shots=4321, max_credits=10)の場合は、
max_creditsの引数を省略すればよい:job = execute(qc, backend, shots=4321) -
クラスのコンストラクタの
order引数に奇数整数を使用することは、今後のリリースでは使えなくなります。SuzukiTrotterクラスのコンストラクタの引数に奇数整数を使うことは非推奨です。 で使用される積公式は、鈴木の積公式が対称であるように、次数が偶数の場合にのみ定義される。SuzukiTrotterで使用される積の公式は、鈴木の積の公式が対称であるように、順序が偶数である場合にのみ定義される。 -
MatplotlibDrawer、TextDrawing、QCircuitImageクラスへのqregs、cregs、layout、global_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() -
標準セッション等価ライブラリーに欠けていたエントリーを
CXGateとCPhaseGateとCXGateとCRZGate. -
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()メソッドのバックエンドの問題を修正しました。CPhaseGateやRZZGateのようなサイドテキストを使用するゲートに古典的な条件が設定されている場合、正しく表示されない問題を修正しました。 修正 #7532。 -
の問題を修正しました。
circuit_drawer()関数とdraw()メソッドのQuantumCircuit.reverse_bitsオプションをmpl、latex、textオプションと併用した場合、レジスタのないビットが正しい順序で表示されなかった。 修正 #7303。 -
メソッドの問題を修正した。
LocalReadoutMitigator.assignment_matrix()メソッドで、qubits引数の入力値が、[0, 1, 2, ..., n-1]. これは修正され、測定される量子ビットのインデックスがどのようなリストでもメソッドに受け入れられるようになった。 -
メソッドの期待値計算における問題を修正した。
StabilizerState.expectation_value()メソッドの期待値計算における問題を修正した。Paulioper演算子が自明でない位相を持っていた場合に、出力期待値が不正確になる問題を修正しました。 #7441 を修正。 -
パウリ恒等式
opflow.Iを含む opflow 式は、回路に変換されたときにIGateを生成しなくなりました。 回路のIDゲートは遅延を示すが、opflowでは数学的なIDを期待する。 -
PauliSumOp等値性テストは、比較されるアイテムの1つが単一である場合を処理するようになった。PauliOp. 例えば、0 * X + I == IはTrueと評価されるようになったが、このリリース以前はFalseだった。 -
の問題を修正しました。
ALAPScheduleとASAPScheduleトランスパイラ・パスの問題を修正しました。 以前は、スケジューリングパスがカスタムパルスキャリブレーションからの継続時間をこれらの命令に使用しなかったため、回路に対して誤ったスケジューリングが生成されていました。 この問題が修正され、スケジューリング・パスは、カスタム・キャリブレーションを持つ回路内のすべての命令に対して、カスタム・パルス・キャリブレーションの期間を使用するようになりました。 -
での
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
変更なし