V0.5による振動構造の問題#
その他のリソース#
新しいコードの使い方の詳細は、 振動構造チュートリアル を必ずチェックしてください。
概要#
このセクションでは、v0.4のコードを持つセルと、v0.5のコードを持つセルが、同じことを行っていることを示します。これで、あなたが探しているすべての情報が得られると思います。
以前#
from qiskit_nature.drivers.second_quantization import GaussianForcesDriver
from qiskit_nature.problems.second_quantization import VibrationalStructureProblem
from qiskit_nature.settings import settings
settings.dict_aux_operators = True
driver = GaussianForcesDriver(logfile="aux_files/CO2_freq_B3LYP_631g.log")
problem = VibrationalStructureProblem(driver, num_modals=[2, 2, 3, 4], truncation_order=2)
# Note: at this point, `driver.run()` has NOT been called yet. We can trigger this indirectly like so:
second_q_ops = problem.second_q_ops()
hamiltonian = second_q_ops["VibrationalEnergy"]
print("\n".join(str(hamiltonian).splitlines()[:10] + ["..."]))
NIIIIIIIIII * (1268.0676746875001+0j)
+ INIIIIIIIII * (3813.8767834375008+0j)
+ IINIIIIIIII * (705.8633818750001+0j)
+ II+-IIIIIII * (-46.025705898886045+0j)
+ II-+IIIIIII * (-46.025705898886045+0j)
+ IIINIIIIIII * (2120.1145593750007+0j)
+ IIIINIIIIII * (238.31540750000005+0j)
+ IIII+I-IIII * (19.820422279761104+0j)
+ IIIIINIIIII * (728.9613775000003+0j)
+ IIII-I+IIII * (19.820422279761104+0j)
...
新規#
from qiskit_nature.second_q.drivers import GaussianForcesDriver
from qiskit_nature.second_q.problems import HarmonicBasis
driver = GaussianForcesDriver(logfile="aux_files/CO2_freq_B3LYP_631g.log")
basis = HarmonicBasis(num_modals=[2, 2, 3, 4])
# this is now done explicitly and already requires the basis
problem = driver.run(basis=basis)
problem.hamiltonian.truncation_order = 2
hamiltonian = problem.hamiltonian.second_q_op()
print("\n".join(str(hamiltonian).splitlines()[:10] + ["..."]))
Vibrational Operator
number modes=4, number modals=[2, 2, 3, 4], number terms=177
(1268.0676746875001+0j) * ( +_0_0 -_0_0 )
+ (3813.8767834375008+0j) * ( +_0_1 -_0_1 )
+ (705.8633818750002+0j) * ( +_1_0 -_1_0 )
+ (-46.025705898886045+0j) * ( +_1_0 -_1_1 )
+ (-46.025705898886045+0j) * ( +_1_1 -_1_0 )
+ (2120.1145593750007+0j) * ( +_1_1 -_1_1 )
+ (238.31540750000005+0j) * ( +_2_0 -_2_0 )
+ (19.82042227976109+0j) * ( +_2_0 -_2_2 )
...
qiskit_nature.drivers
#
このセクションでは、振動構造に関連したドライバーの移行についてのみ説明します。
次の表は、qiskit_nature.drivers.second_quantization
の各振動構造体コンポーネントが移動した先をまとめています。
レガシー・コンポーネント |
新しい場所 |
---|---|
BaseDriver |
|
VibrationalStructureDriver |
|
VibrationalStructureDriverType |
削除 |
VibrationalStructureMoleculeDriver |
削除 |
GaussianForcesDriver |
|
GaussianLogDriver |
|
GaussianLogResult |
|
さらに、qiskit_nature.drivers
の2つのコンポーネントは、以下のように移動されました:
レガシー・コンポーネント |
新しい場所 |
---|---|
Molecule |
|
UnitsType |
|
いくつか注釈を加えておきます:
VibrationalStructureMoleculeDriver
は削除されました。これは、Qiskit が古典的なシミュレーションを始めたころのドライバーの概念を時代遅れにする、プラグインのような古典的なコードとのより緊密な統合を将来に向けて進めているためです。MoleculeInfo
クラスと組み合わせて、残りのドライバーの.from_molecule(...)
メソッドを引き続き使用できます。MoleculeInfo
は純粋なデータコンテナーになり、degree of freedom をサポートしなくなりました。
振動構造ドライバー#
振動構造ドライバーは電子構造ドライバーとは若干異なる動作をします。なぜなら、ドライバーを実行する際に、実空間Watsonハミルトニアンを第2量子化空間にマップする 基底 を提供する必要があるからです。これはQiskit Nature v0.4で不整合に扱われ、以下のように説明されています。
以前#
Qiskit Nature v0.4では、VibrationalIntegrals
(これは second_quantization
スタックの一部でした) が実際には実空間のWatson ハミルトニアンの係数を保存していたため、スタックの実装は実際には矛盾していました。この係数は後で指定された基底にマッピングされます。
from qiskit_nature.drivers.second_quantization import GaussianLogResult
from qiskit_nature.properties.second_quantization.vibrational.bases import HarmonicBasis
from qiskit_nature.settings import settings
settings.dict_aux_operators = True
log_result = GaussianLogResult("aux_files/CO2_freq_B3LYP_631g.log")
hamiltonian = log_result.get_vibrational_energy()
print(hamiltonian)
hamiltonian.basis = HarmonicBasis([2, 2, 3, 4])
op = hamiltonian.second_q_ops()["VibrationalEnergy"]
print("\n".join(str(op).splitlines()[:10] + ["..."]))
VibrationalEnergy:
None
1-Body Terms:
<sparse integral list with 13 entries>
(2, 2) = 352.3005875
(-2, -2) = -352.3005875
(1, 1) = 631.6153975
(-1, -1) = -631.6153975
(4, 4) = 115.653915
... skipping 8 entries
2-Body Terms:
<sparse integral list with 11 entries>
(1, 1, 2) = -88.2017421687633
(4, 4, 2) = 42.675273102831454
(3, 3, 2) = 42.675273102831454
(1, 1, 2, 2) = 4.9425425
(4, 4, 2, 2) = -4.194299375
... skipping 6 entries
3-Body Terms:
<sparse integral list with 0 entries>
NIIIIIIIIII * (1268.0676746875001+0j)
+ INIIIIIIIII * (3813.8767834375008+0j)
+ IINIIIIIIII * (705.8633818750001+0j)
+ II+-IIIIIII * (-46.025705898886045+0j)
+ II-+IIIIIII * (-46.025705898886045+0j)
+ IIINIIIIIII * (2120.1145593750007+0j)
+ IIIINIIIIII * (238.31540750000005+0j)
+ IIII+I-IIII * (19.820422279761104+0j)
+ IIIIINIIIII * (728.9613775000003+0j)
+ IIII-I+IIII * (19.820422279761104+0j)
...
新規#
Qiskit Nature v0.5では、実空間のWatsonハミルトニアンと第2量子化係数の取り扱いを一貫して分離するように設計されています。これは WatsonHamiltonian
を格納する専用のデータクラスを導入することで実現されています。
from qiskit_nature.second_q.drivers import GaussianLogResult
from qiskit_nature.second_q.formats import watson_to_problem
from qiskit_nature.second_q.problems import HarmonicBasis
log_result = GaussianLogResult("aux_files/CO2_freq_B3LYP_631g.log")
watson = log_result.get_watson_hamiltonian()
print(watson)
basis = HarmonicBasis(num_modals=[2, 2, 3, 4])
problem = watson_to_problem(watson, basis)
hamiltonian = problem.hamiltonian.second_q_op()
print("\n".join(str(hamiltonian).splitlines()[:10] + ["..."]))
WatsonHamiltonian(quadratic_force_constants=<COO: shape=(4, 4), dtype=float64, nnz=4, fill_value=0.0>, cubic_force_constants=<COO: shape=(4, 4, 4), dtype=float64, nnz=4, fill_value=0.0>, quartic_force_constants=<COO: shape=(4, 4, 4, 4), dtype=float64, nnz=12, fill_value=0.0>, kinetic_coefficients=<COO: shape=(4, 4), dtype=float64, nnz=4, fill_value=-0.0>)
Vibrational Operator
number modes=4, number modals=[2, 2, 3, 4], number terms=177
(1268.0676746875001+0j) * ( +_0_0 -_0_0 )
+ (3813.8767834375008+0j) * ( +_0_1 -_0_1 )
+ (705.8633818750002+0j) * ( +_1_0 -_1_0 )
+ (-46.025705898886045+0j) * ( +_1_0 -_1_1 )
+ (-46.025705898886045+0j) * ( +_1_1 -_1_0 )
+ (2120.1145593750007+0j) * ( +_1_1 -_1_1 )
+ (238.31540750000005+0j) * ( +_2_0 -_2_0 )
+ (19.82042227976109+0j) * ( +_2_0 -_2_2 )
...
VibrationalStructureProblem
(qiskit_nature.problems
)#
このセクションでは VibrationalStructureProblem
に関する全ての変更点を詳しく説明します。
以下の表は、新しい qiskit_nature.second_q.problems
モジュールの振動成分を要約し、これらの部分が古いコードのどこに由来しているかを示しています。
新規コンポーネント |
従来の場所 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
存在しません |
|
|
以前#
from qiskit_nature.drivers.second_quantization import GaussianForcesDriver
from qiskit_nature.problems.second_quantization import VibrationalStructureProblem
driver = GaussianForcesDriver(logfile="aux_files/CO2_freq_B3LYP_631g.log")
problem = VibrationalStructureProblem(driver, num_modals=[2, 2, 3, 4], truncation_order=2)
# we trigger driver.run() implicitly like so:
second_q_ops = problem.second_q_ops()
hamiltonian_op = second_q_ops.pop("VibrationalEnergy")
aux_ops = second_q_ops
新規#
from qiskit_nature.second_q.drivers import GaussianForcesDriver
from qiskit_nature.second_q.problems import HarmonicBasis
driver = GaussianForcesDriver(logfile="aux_files/CO2_freq_B3LYP_631g.log")
basis = HarmonicBasis(num_modals=[2, 2, 3, 4])
problem = driver.run(basis=basis)
problem.hamiltonian.truncation_order = 2
hamiltonian_op, aux_ops = problem.second_q_ops()
新しくなった VibrationalStructureProblem
の詳細については、振動構造のチュートリアル.を参照してください。
qiskit_nature.properties
#
Properties モジュールはリファクタリングされ、複数の場所に分割されました。このセクションでは、その 振動 コンポーネントにのみ焦点を当てます。
以下の表は、qiskit_nature.properties
の各コンポーネントがどこに移動したかを示したものです。
レガシー・コンポーネント |
新しい場所 |
---|---|
|
|
|
|
|
削除 |
|
|
|
|
|
|
|
|
|
|
より詳しい説明は、`振動構造のチュートリアル <../tutorials/02_vibrational_structure.ipynb>`__を見ていただくとして、ここではいくつかのコメントを残します。
VibrationalBasis
は、VibrationalStructureProblem
に対してのみ追跡され、各オペレーターに対して個別に追跡されないようになりました。VibrationalEnergy
(これは常に a_special_Property
である) は、この特別な役割を強調するために新しいsecond_q.hamiltonians
モジュールに含まれるようになりました。