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 |
|
BasisType |
削除 |
ElectronicStructureDriver |
|
ElectronicStructureDriverType |
削除 |
ElectronicStructureMoleculeDriver |
削除 |
FCIDumpDriver |
|
GaussianDriver |
|
HDF5Driver |
削除 |
InitialGuess |
|
MethodType |
|
PSI4Driver |
|
PyQuanteDriver |
削除 |
PySCFDriver |
|
さらに、qiskit_nature.drivers
の2つのコンポーネントは、以下のように移動されました:
レガシー・コンポーネント |
新しい場所 |
---|---|
Molecule |
|
UnitsType |
|
いくつか注釈を加えておきます:
ソース コードが 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 をサポートしなくなりました。MoleculeInfo
はatoms
とcoords
(座標) を別々に定義するようになり、以前に結合された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'>
drivers
と formats
を区別する理由は、drivers
(Qiskit Nature が別のプログラムを介して古典的なシミュレーションを開始する) の概念が時代遅れになるという事実に動機付けられています。
ただし、さまざまな formats
をサポートし、それらを Qiskit Nature のネイティブ・オブジェクトまたは表現に変換することは、他の従来のコードとの迅速な採用と統合を可能にするために重要です。 形式から問題をロードしても別のコードは実行されず、ディスクからデータがロードされるだけなので、概念的な違いも反映されます。
qiskit_nature.transformers
#
このセクションでは、トランスフォーマーの移行のみを扱います。
以下の表は、 qiskit_nature.transformers
の各コンポーネントがどこに行き着いたかをまとめたものです。
レガシー・コンポーネント |
新しい場所 |
---|---|
BaseTransformer |
|
ActiveSpaceTransformer |
|
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
モジュールの電子コンポーネントを要約し、これらの部品が古いコードのどこから来たのかを示しています:
新規コンポーネント |
従来の場所 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
存在しません |
|
|
以前#
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
の各コンポーネントがどこに移動したかを示したものです。
レガシー・コンポーネント |
新しい場所 |
---|---|
|
|
|
|
|
削除 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
削除 |
|
qiskit_nature.second_q.operators.ElectronicIntegrals`` に引き継がれました。 |
|
削除 |
|
削除 |
より詳しい説明は、`電子構造チュートリアル <…/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でこれを行うための例を示しています。