V0.5 で問題を解決#

概要#

Qiskit Nature v0.5のリファクタリングの主な焦点は、第二量子化された演算子と問題の記述と表現でした。しかしながら、algorithms モジュールとそれをサポートするモジュールもまた、重要なアップデートを受けました。最も重要なことは、Natureのすべてのアルゴリズムが新しいQiskit Terraアルゴリズムに依存するようになったことです。これらは現在、Qiskit Primitives に基づいており、Qiskit Terra 0.22 で追加されたものです。この移行ガイドでPrimitive の詳細な説明を提供することは意図していません。代わりにQiskit Terraドキュメントの 対応するリソース を読むことをお勧めします。

その他のリソース#

詳細は、対応するチュートリアルを参照してください。

qiskit_nature.mappers#

Qiskit Nature のマッパーは、API の変更を 受け取りませんでした (特定の引数をキーワードにする必要がある可能性を除いて。: 「多すぎる位置指定引数」セクション も参照してください)。 しかし、モジュール qiskit_nature.mappers.second_quantization はすべて qiskit_nature.second_q.mappers に移動されました。そのため、インポートを更新するだけでよいのです。

qiskit_nature.converters#

このモジュールには、QubitConverter というコンポーネントが1つだけ含まれていました。これは qiskit_nature.second_q.mappers.QubitConverter に移動されたので、インポートパスを更新するだけでよいでしょう。

API の変更は最小限に抑えられましたが、このクラスによって変換される演算子は、従来の SecondQuantizedOp ではなく、新しい SparseLabelOp オブジェクトに変更されました。

qiskit_nature.circuit#

qiskit_nature.circuit モジュール全体が qiskit_nature.second_q.circuit に移行されました。その理由は、既存の回路は実際には第2量子化アプリケーションにしか適用できないのに、APIにそれが反映されていなかったからです。インポートを更新することで、 ほとんど の問題を解決できるはずです。

しかし、もう2つ注意すべき点があります。

軌道の数#

我々は、パッケージ全体を通して、一貫して num_spin_orbitals を介して軌道の数を記述してきました。しかし、スピン軌道の数は 空間 軌道の数の2倍と仮定されているため、(厳密なチェックなしで)しばしば 偶数 の数が供給されることを意味します。

より厳密に、そして num_spin_orbitals奇数 を指定した場合の非定義な動作を避けるために、代わりに num_spatial_orbitals を使用するようにスタック全体を切り替えたのです。これは、任意の正の整数値に対してうまく定義されています(負の値もガードされています)。

このことが実際に何を意味するかというと、これまで num_spin_orbitals を手動で指定していた場合は、num_spatial_orbitals を表すために 半分の値 を指定する必要がある、ということです。

以前#

from qiskit_nature.circuit.library import UCCSD

ansatz = UCCSD()
ansatz.num_spin_orbitals = 10

新規#

from qiskit_nature.second_q.circuit.library import UCCSD

ansatz = UCCSD()
ansatz.num_spatial_orbitals = 5

UCC/UVCC __init__ 引数#

UCCUVCC のサブクラスは、これまで __init__ に次のような引数を取っていました。

以前#

from qiskit_nature.circuit.library import UCC, UVCC

ucc = UCC(qubit_converter=None, num_particles=None, num_spin_orbitals=None, excitations=None)
uvcc = UVCC(qubit_converter=None, num_modals=None, excitations=None)

新規#

これは HartreeFockVSCF の初期状態のAPIをミスマッチさせていました。これらのAPIを以下のように揃えました。

from qiskit_nature.second_q.circuit.library import UCC, UVCC

ucc = UCC(num_spatial_orbitals=None, num_particles=None, excitations=None, qubit_converter=None)
uvcc = UVCC(num_modals=None, excitations=None, qubit_converter=None)

HartreeFock/VSCF 初期状態#

HartreeFockVSCF の初期状態回路は、 BlueprintCircuit として実装されました。つまり、以下のように引数なしで初期化し、後で情報を与えることができます。

以前#

from qiskit_nature.circuit.library import HartreeFock, VSCF
from qiskit_nature.converters.second_quantization import QubitConverter
from qiskit_nature.mappers.second_quantization import DirectMapper, JordanWignerMapper

hf = HartreeFock(
    num_spin_orbitals=4, num_particles=(1, 1), qubit_converter=QubitConverter(JordanWignerMapper())
)
vscf = VSCF(num_modals=[2, 2])

新規#

from qiskit_nature.second_q.circuit.library import HartreeFock, VSCF
from qiskit_nature.second_q.mappers import DirectMapper, JordanWignerMapper, QubitConverter

hf = HartreeFock()
hf.num_spatial_orbitals = 2
hf.num_particles = (1, 1)
hf.qubit_converter = QubitConverter(JordanWignerMapper())

vscf = VSCF()
vscf.num_modals = [2, 2]

qiskit_nature.algorithms#

Qiskit Natureのアルゴリズムは、Qiskit Terra 0.22から qiskit.primitives をベースにした新しいコンポーネント qiskit.algorithms を使用するように更新されました。

ほとんどの変更は、インポートパスを qiskit_nature.algorithms から qiskit_nature.second_q.algorithms に更新するだけで適用されます。しかし、Qiskit Terraのprimitiveアルゴリズムが変更されたため、注意しなければならない点がいくつかあります。これらの詳細については、以下で説明します。

qiskit_nature.algorithms.initial_points#

このモジュールは qiskit_nature.second_q.algorithms.initial_points へと移動しました。必要なことは、インポートを更新することだけです。

qiskit_nature.algorithms.pes_samplers#

このモジュールは置き換えられることなく、 削除 されました。その理由は、私達はQiskit Natureのドライバーレス設計に取り組んでいるため、ポテンシャルエネルギー面のサンプリングはQiskit Natureではなく、古典的なコードの責任となるためです。

qiskit_nature.algorithms.ground_state_solvers#

このモジュールは qiskit_nature.second_q.algorithms.ground_state_solvers へと移動しました。インポートの更新の他に、以下のことに注意する必要があります。

  • AdaptVQE は Qiskit Terra: qiskit.algorithms.minimum_eigensolver.AdaptVQE に移行されました。つまり、他の VQE と同様に使用し、Qiskit Nature の GroundStateSolver インジェクションできるようになりました。新しい AdaptVQE の動作を見るには、``AdaptVQEの使用方法 <../howtos/adapt_vqe.rst>`__ をチェックしてください。

  • VQEUCCFactoryVQEUVCCFactory の API は、新しいprimitiveベースの VQE API と一致するようになりました。

以前#

from qiskit.providers.basicaer import BasicAer
from qiskit.utils import QuantumInstance
from qiskit_nature.algorithms.ground_state_solvers import VQEUCCFactory

quantum_instance = QuantumInstance(BasicAer.get_backend("statevector_simulator"))
vqe_factory = VQEUCCFactory(quantum_instance=quantum_instance)

新規#

from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import Estimator
from qiskit_nature.second_q.circuit.library import UCCSD
from qiskit_nature.second_q.algorithms.ground_state_solvers import VQEUCCFactory

estimator = Estimator()
ansatz = UCCSD()
optimizer = SLSQP()

vqe_factory = VQEUCCFactory(estimator, ansatz, optimizer)

qiskit_nature.algorithms.excited_states_solvers#

このモジュールは qiskit_nature.second_q.algorithms.excited_states_solvers へと移動しました。インポートの更新の他に、以下のことに注意する必要があります。

以前#

from qiskit_nature.algorithms.ground_state_solvers import GroundStateEigensolver, VQEUCCFactory
from qiskit_nature.algorithms.excited_states_solvers import QEOM
from qiskit_nature.converters.second_quantization import QubitConverter
from qiskit_nature.mappers.second_quantization import JordanWignerMapper

vqe_factory = VQEUCCFactory()
converter = QubitConverter(JordanWignerMapper())
ground_state_solver = GroundStateEigensolver(converter, vqe_factory)

qeom = QEOM(ground_state_solver)

新規#

from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import Estimator
from qiskit_nature.second_q.circuit.library import UCCSD
from qiskit_nature.second_q.algorithms.ground_state_solvers import (
    GroundStateEigensolver,
    VQEUCCFactory,
)
from qiskit_nature.second_q.algorithms.excited_states_solvers import QEOM
from qiskit_nature.second_q.mappers import JordanWignerMapper, QubitConverter

estimator = Estimator()
ansatz = UCCSD()
optimizer = SLSQP()

vqe_factory = VQEUCCFactory(estimator, ansatz, optimizer)
converter = QubitConverter(JordanWignerMapper())
ground_state_solver = GroundStateEigensolver(converter, vqe_factory)

qeom = QEOM(ground_state_solver, estimator)