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__
引数#
UCC
と UVCC
のサブクラスは、これまで __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)
新規#
これは HartreeFock
と VSCF
の初期状態の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 初期状態#
HartreeFock
と VSCF
の初期状態回路は、 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>`__ をチェックしてください。VQEUCCFactory
とVQEUVCCFactory
の 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
へと移動しました。インポートの更新の他に、以下のことに注意する必要があります。
QEOM
API は、提供される Estimator primitiver が必要です。
以前#
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)