V0.5による電子構造の問題#

その他のリソース#

新しいコードの使用方法については、以下のチュートリアルを必ずご確認ください。

概要#

このセクションでは、v0.4のコードを持つセルと、v0.5のコードを持つセルが、同じことを行っていることを示します。これで、あなたが探しているすべての情報が得られると思います。

以前#

from qiskit_nature.drivers import Molecule
from qiskit_nature.drivers.second_quantization import (
    ElectronicStructureDriverType,
    ElectronicStructureMoleculeDriver,
    PySCFDriver,
)
from qiskit_nature.problems.second_quantization import ElectronicStructureProblem
from qiskit_nature.transformers.second_quantization.electronic import FreezeCoreTransformer
from qiskit_nature.settings import settings

settings.dict_aux_operators = True

molecule = Molecule(
    geometry=[["H", [0.0, 0.0, 0.0]], ["H", [0.0, 0.0, 0.735]]], charge=0, multiplicity=1
)

driver = ElectronicStructureMoleculeDriver(
    molecule, basis="sto3g", driver_type=ElectronicStructureDriverType.PYSCF
)
# or equivalently:
driver = PySCFDriver.from_molecule(molecule, basis="sto3g")

transformer = FreezeCoreTransformer()

problem = ElectronicStructureProblem(driver, transformers=[transformer])

# 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["ElectronicEnergy"]
print(hamiltonian)
Fermionic Operator
register length=4, number terms=36
  -1.2563390730032498 * ( +_0 -_0 )
+ -0.47189600728114245 * ( +_1 -_1 )
+ -1.2563390730032498 * ( +_2 -_2 )
+ -0.47189600728114245 * ( +_3 -_3 )
+ -0.33785507740175813 * ( +_0 +_0 -_0 -_0 )
+ -0. ...

新規#

from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.formats.molecule_info import MoleculeInfo
from qiskit_nature.second_q.transformers import FreezeCoreTransformer

molecule = MoleculeInfo(["H", "H"], [(0.0, 0.0, 0.0), (0.0, 0.0, 0.735)], charge=0, multiplicity=1)

driver = PySCFDriver.from_molecule(molecule, basis="sto3g")

# this is now done explicitly
problem = driver.run()

transformer = FreezeCoreTransformer()

# and you also apply transformers explicitly
problem = transformer.transform(problem)

hamiltonian = problem.hamiltonian.second_q_op()
print("\n".join(str(hamiltonian).splitlines()[:10] + ["..."]))
Fermionic Operator
number spin orbitals=4, number terms=36
  0.33785507740175813 * ( +_0 +_0 -_0 -_0 )
+ 0.09046559989211565 * ( +_0 +_0 -_1 -_1 )
+ 0.09046559989211556 * ( +_0 +_1 -_0 -_1 )
+ 0.33229086512764827 * ( +_0 +_1 -_1 -_0 )
+ 0.33785507740175813 * ( +_0 +_2 -_2 -_0 )
+ 0.09046559989211564 * ( +_0 +_2 -_3 -_1 )
+ 0.09046559989211556 * ( +_0 +_3 -_2 -_1 )
+ 0.33229086512764816 * ( +_0 +_3 -_3 -_0 )
...

qiskit_nature.drivers#

このセクションでは、ドライバーの移行についてのみ扱います。

drivers サブモジュールの内容は複数の場所に分割されています。qiskit_nature.drivers.second_quantization の各コンポーネントの移行先は、以下の表のとおりです。

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

新しい場所

BaseDriver

qiskit_nature.second_q.drivers.BaseDriver

BasisType

削除

ElectronicStructureDriver

qiskit_nature.second_q.drivers.ElectronicStructureDriver

ElectronicStructureDriverType

削除

ElectronicStructureMoleculeDriver

削除

FCIDumpDriver

qiskit_nature.second_q.formats.fcidump.FCIDump

GaussianDriver

qiskit_nature.second_q.drivers.GaussianDriver

HDF5Driver

削除

InitialGuess

qiskit_nature.second_q.drivers.InitialGuess

MethodType

qiskit_nature.second_q.drivers.MethodType

PSI4Driver

qiskit_nature.second_q.drivers.Psi4Driver

PyQuanteDriver

削除

PySCFDriver

qiskit_nature.second_q.drivers.PySCFDriver

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

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

新しい場所

Molecule

qiskit_nature.second_q.formats.molecule_info.MoleculeInfo

UnitsType

qiskit_nature.units.DistanceUnit

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

  • ソース コードが 3 年以上更新されていないため、pyquante2 のドライバーは削除されました。 当初は、Windows で Qiskit Nature を使用できるようにするためにサポートされていましたが、その後 psi4 も Windows サポートを追加し、Linux 用の Windows サブシステムを統合しました。 <https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux>`__ により、さらなる開発の可能性が開かれました。

  • HDF5Driver は標準化された QCSchema (qiskit_nature.second_q.formats.qcschema 参照) をサポートするため、削除されました。

  • ElectronicStructureMoleculeDriver は削除されました。これは、Qiskit が古典的なシミュレーションを開始するドライバの概念を時代遅れにする、プラグインのような古典的なコードとのより緊密な統合を将来に向けて進めているためです。 MoleculeInfo クラスと組み合わせて、残りのドライバーの .from_molecule(...) メソッドを引き続き使用できます。

  • MoleculeInfo は純粋なデータコンテナーになり、degree of freedom をサポートしなくなりました。

  • MoleculeInfoatomscoords (座標) を別々に定義するようになり、以前に結合された geometry アプローチが採用されました。

qiskit_nature.second_q.drivers に移行されたドライバの使用#

以前#

from qiskit_nature.drivers import Molecule
from qiskit_nature.drivers.second_quantization import PySCFDriver

molecule = Molecule(
    geometry=[["H", [0.0, 0.0, 0.0]], ["H", [0.0, 0.0, 0.735]]], charge=0, multiplicity=1
)

driver = PySCFDriver.from_molecule(molecule)

result = driver.run()
print(type(result))
<class 'qiskit_nature.properties.second_quantization.electronic.electronic_structure_driver_result.ElectronicStructureDriverResult'>

新規#

from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.formats.molecule_info import MoleculeInfo

molecule = MoleculeInfo(["H", "H"], [(0.0, 0.0, 0.0), (0.0, 0.0, 0.735)], charge=0, multiplicity=1)

driver = PySCFDriver.from_molecule(molecule, basis="sto3g")

result = driver.run()
print(type(result))
<class 'qiskit_nature.second_q.problems.electronic_structure_problem.ElectronicStructureProblem'>

戻り値の型が大きく異なることに注意してください。 詳細については、 qiskit_nature.problems のセクションを必ずお読みください。

qiskit_nature.second_q.formats に移行されたドライバの使用#

以前#

from qiskit_nature.drivers.second_quantization import FCIDumpDriver

path_to_fcidump = "aux_files/h2.fcidump"
driver = FCIDumpDriver(path_to_fcidump)

result = driver.run()
print(type(result))
<class 'qiskit_nature.properties.second_quantization.electronic.electronic_structure_driver_result.ElectronicStructureDriverResult'>

新規#

from qiskit_nature.second_q.formats.fcidump import FCIDump

path_to_fcidump = "aux_files/h2.fcidump"
fcidump = FCIDump.from_file(path_to_fcidump)
print(type(fcidump))

from qiskit_nature.second_q.formats.fcidump_translator import fcidump_to_problem

problem = fcidump_to_problem(fcidump)
print(type(problem))
<class 'qiskit_nature.second_q.formats.fcidump.fcidump.FCIDump'>
<class 'qiskit_nature.second_q.problems.electronic_structure_problem.ElectronicStructureProblem'>

driversformats を区別する理由は、drivers (Qiskit Nature が別のプログラムを介して古典的なシミュレーションを開始する) の概念が時代遅れになるという事実に動機付けられています。

ただし、さまざまな formats をサポートし、それらを Qiskit Nature のネイティブ・オブジェクトまたは表現に変換することは、他の従来のコードとの迅速な採用と統合を可能にするために重要です。 形式から問題をロードしても別のコードは実行されず、ディスクからデータがロードされるだけなので、概念的な違いも反映されます。

qiskit_nature.transformers#

このセクションでは、トランスフォーマーの移行のみを扱います。

以下の表は、 qiskit_nature.transformers の各コンポーネントがどこに行き着いたかをまとめたものです。

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

新しい場所

BaseTransformer

qiskit_nature.second_q.transformers.BaseTransformer

ActiveSpaceTransformer

qiskit_nature.second_q.transformers.ActiveSpaceTransformer

FreezeCoreTransformer

qiskit_nature.second_q.transformers.FreezeCoreTransformer

トランスフォーマーには、ドライバーの結果を変換する機能が残っています。しかし、 drivers の出力型が変わったので(上記参照)、私たちの transformers の入力型と出力型も変わりました。

現実的には、以下のようにimport文を更新するだけでよいでしょう。

以前#

from qiskit_nature.drivers.second_quantization import PySCFDriver
from qiskit_nature.transformers.second_quantization.electronic import FreezeCoreTransformer

transformer = FreezeCoreTransformer()
driver = PySCFDriver()

transformed_result = transformer.transform(driver.run())
print(type(transformed_result))
<class 'qiskit_nature.properties.second_quantization.electronic.electronic_structure_driver_result.ElectronicStructureDriverResult'>

新規#

from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.transformers import FreezeCoreTransformer

transformer = FreezeCoreTransformer()
driver = PySCFDriver()

transformed_result = transformer.transform(driver.run())
print(type(transformed_result))
<class 'qiskit_nature.second_q.problems.electronic_structure_problem.ElectronicStructureProblem'>

ElectronicStructureProblem (qiskit_nature.problems)#

このセクションでは ElectronicStructureProblem に関する全ての変更点を詳しく説明します。

おそらく、 ElectronicStructureProblem は、このリファクタリングの主な動機であったため、最も重要な変更を受けたクラスです。 手始めに、以下の表は 新しい qiskit_nature.second_q.problems モジュールの電子コンポーネントを要約し、これらの部品が古いコードのどこから来たのかを示しています:

新規コンポーネント

従来の場所

BaseProblem

qiskit_nature.problems.second_quantization.BaseProblem

EigenstateResult

qiskit_nature.results.EigenstateResult

PropertiesContainer

qiskit_nature.properties.GroupedProperty と同様

ElectronicBasis

qiskit_nature.properties.second_quantization.electronic.bases.ElectronicBasis

ElectronicStructureProblem

qiskit_nature.problems.second_quantization.electronic.ElectronicStructureProblem

ElectronicPropertiesContainer

存在しません

ElectronicStructureResult

qiskit_nature.results.ElectronicStructureResult

以前#

from qiskit_nature.drivers.second_quantization import PySCFDriver
from qiskit_nature.problems.second_quantization.electronic import ElectronicStructureProblem
from qiskit_nature.transformers.second_quantization.electronic import FreezeCoreTransformer

driver = PySCFDriver()
transformer = FreezeCoreTransformer()
problem = ElectronicStructureProblem(driver, transformers=[transformer])

# we trigger driver.run() implicitly like so:
second_q_ops = problem.second_q_ops()

hamiltonian_op = second_q_ops.pop("ElectronicEnergy")
aux_ops = second_q_ops

新規#

from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.transformers import FreezeCoreTransformer

driver = PySCFDriver()

problem = driver.run()

transformer = FreezeCoreTransformer()

problem = transformer.transform(problem)

hamiltonian_op, aux_ops = problem.second_q_ops()

新しくなった ElectronicStructureProblem の詳細については、``電子構造のチュートリアル <../tutorials/01_electronic_structure.ipynb>`__ を参照してください。

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.electronic.ElectronicEnergy

qiskit_nature.second_q.hamiltonians.ElectronicEnergy

second_quantization.electronic.ElectronicDipoleMoment

qiskit_nature.second_q.properties.ElectronicDipoleMoment

second_quantization.electronic.AngularMomentum

qiskit_nature.second_q.properties.AngularMomentum

second_quantization.electronic.Magnetization

qiskit_nature.second_q.properties.Magnetization

second_quantization.electronic.ParticleNumber

qiskit_nature.second_q.properties.ParticleNumber

second_quantization.electronic.bases.ElectronicBasis

qiskit_nature.second_q.problems.ElectronicBasis

second_quantization.electronic.bases.ElectronicBasisTransform

qiskit_nature.second_q.transformers.BasisTransformer

second_quantization.electronic.integrals.IntegralProperty

削除

second_quantization.electronic.integrals.ElectronicIntegrals

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

second_quantization.electronic.integrals.OneBodyElectronicIntegrals

削除

second_quantization.electronic.integrals.TwoBodyElectronicIntegrals

削除

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

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

  • BasisTransformer``は ``second_q.transformers モジュールから基底変換を一元的に処理します。

  • 新しい second_q.properties コンポーネントは、演算子の構築に必要ないデータは保存されま ** せん。**

  • この特別な役割を強調するために ElectronicEnergy (これは常に 特別) が新しい second_q.hamiltonians モジュールに含まれています。

もし、あなたが以前、独自の1体や2体積分などを使ってカスタム Property インスタンスを構築していたなら、新しい qiskit_nature.second_q.operators.ElectronicIntegrals のドキュメントをチェックすることをお勧めします。Qiskit Nature v0.5でこれを行うための例を示しています。