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

qiskit_nature.second_q.drivers.BaseDriver

VibrationalStructureDriver

qiskit_nature.second_q.drivers.VibrationalStructureDriver

VibrationalStructureDriverType

削除

VibrationalStructureMoleculeDriver

削除

GaussianForcesDriver

qiskit_nature.second_q.drivers.GaussianForcesDriver

GaussianLogDriver

qiskit_nature.second_q.drivers.GaussiaLogDriver

GaussianLogResult

qiskit_nature.second_q.drivers.GaussianLogResult

さらに、qiskit_nature.drivers の2つのコンポーネントは、以下のように移動されました:

レガシー・コンポーネント

新しい場所

Molecule

qiskit_nature.second_q.formats.molecule_info.MoleculeInfo

UnitsType

qiskit_nature.units.DistanceUnit

いくつか注釈を加えておきます:

  • 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 モジュールの振動成分を要約し、これらの部分が古いコードのどこに由来しているかを示しています。

新規コンポーネント

従来の場所

BaseProblem

qiskit_nature.problems.second_quantization.BaseProblem

EigenstateResult

qiskit_nature.results.EigenstateResult

PropertiesContainer

qiskit_nature.properties.GroupedProperty と同様

VibrationalBasis

qiskit_nature.properties.second_quantization.vibrational.bases.VibrationalBasis

HarmonicBasis

qiskit_nature.properties.second_quantization.vibrational.bases.HarmonicBasis

VibrationalStructureProblem

qiskit_nature.problems.second_quantization.vibrational.VibrationalStructureProblem

VibrationalPropertiesContainer

存在しません

VibrationalStructureResult

qiskit_nature.results.VibrationalStructureResult

以前#

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 の各コンポーネントがどこに移動したかを示したものです。

レガシー・コンポーネント

新しい場所

Property

qiskit_nature.second_q.properties.SparseLabelOpsFactory

GroupedProperty

qiskit_nature.second_q.problems.PropertiesContainer に引き継がれました。

second_quantization.DriverMetadata

削除

second_quantization.vibrational.VibrationalEnergy

qiskit_nature.second_q.hamiltonians.VibrationalEnergy

second_quantization.vibrational.OccupiedModals

qiskit_nature.second_q.properties.OccupiedModals

second_quantization.vibrational.bases.VibrationalBasis

qiskit_nature.second_q.problems.VibrationalBasis

second_quantization.vibrational.bases.HarmonicBasis

qiskit_nature.second_q.problems.HarmonicBasis

second_quantization.vibrational.integrals.VibrationalIntegrals

qiskit_nature.second_q.operators.VibrationalIntegrals に引き継がれました。

より詳しい説明は、`振動構造のチュートリアル <../tutorials/02_vibrational_structure.ipynb>`__を見ていただくとして、ここではいくつかのコメントを残します。

  • VibrationalBasis は、VibrationalStructureProblem に対してのみ追跡され、各オペレーターに対して個別に追跡されないようになりました。

  • VibrationalEnergy (これは常に a_special_ Property である) は、この特別な役割を強調するために新しい second_q.hamiltonians モジュールに含まれるようになりました。