注釈

このページは docs/tutorials/05_problem_transformers.ipynb から生成されました。

問題の変換#

Qiskit Natureに用意されている様々な問題変換ツールについて説明します。

注意: 現在、Qiskit Natureには電子構造問題で動作する変換のみがあります。

BasisTransformer#

この変換器は ElectronicStructureProblem をある基底から別の基底に変換することができます。これは以下のような状況で役に立ちます。- AO基底の問題記述やハミルトニアン係数を外部から取得した場合 - MO基底に変換する前に問題をAO基底で明示的に生成し、手動で修正した場合 - などです。

Qiskit Natureを使用して直接2番目のシナリオを達成できるので、ここではそれを行うことにします。この方法の詳細については、QCSchema <08_qcschema.ipynb>`__ のチュートリアルを読むことをお勧めします。

まず、AO 基底の問題を作り、基底変換のデモンストレーションを行います。

[1]:
from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.problems import ElectronicBasis

driver = PySCFDriver()
driver.run_pyscf()

ao_problem = driver.to_problem(basis=ElectronicBasis.AO)
print(ao_problem.basis)

ao_hamil = ao_problem.hamiltonian
print(ao_hamil.electronic_integrals.alpha)
ElectronicBasis.AO
Polynomial Tensor
 "+-":
[[-1.12421758 -0.9652574 ]
 [-0.9652574  -1.12421758]]
 "++--":
[[[[0.77460594 0.44744572]
   [0.44744572 0.3009177 ]]

  [[0.44744572 0.3009177 ]
   [0.57187698 0.44744572]]]


 [[[0.44744572 0.57187698]
   [0.3009177  0.44744572]]

  [[0.3009177  0.44744572]
   [0.44744572 0.77460594]]]]

次に、AO から MO への変換器を入手します。

[2]:
from qiskit_nature.second_q.formats.qcschema_translator import get_ao_to_mo_from_qcschema

qcschema = driver.to_qcschema()

basis_transformer = get_ao_to_mo_from_qcschema(qcschema)
print(basis_transformer.initial_basis)
print(basis_transformer.final_basis)
ElectronicBasis.AO
ElectronicBasis.MO

そして最後に、変換器を用いて MO 基底の問題を得ることができます。

[3]:
mo_problem = basis_transformer.transform(ao_problem)
print(mo_problem.basis)

mo_hamil = mo_problem.hamiltonian
print(mo_hamil.electronic_integrals.alpha)
ElectronicBasis.MO
Polynomial Tensor
 "+-":
[[-1.25633907e+00 -6.21867875e-17]
 [-7.78036432e-17 -4.71896007e-01]]
 "++--":
[[[[6.75710155e-01 1.12401641e-16]
   [1.56722377e-16 1.80931200e-01]]

  [[1.92605510e-16 1.80931200e-01]
   [6.64581730e-01 2.59298923e-16]]]


 [[[8.68926823e-17 6.64581730e-01]
   [1.80931200e-01 1.82411770e-16]]

  [[1.80931200e-01 2.57172666e-16]
   [7.20426423e-17 6.98573723e-01]]]]

もし、 BasisTransformer を手動で作成する必要がある場合は、以下のようにすることができます。

[4]:
import numpy as np
from qiskit_nature.second_q.operators import ElectronicIntegrals
from qiskit_nature.second_q.problems import ElectronicBasis
from qiskit_nature.second_q.transformers import BasisTransformer

ao2mo_alpha = np.random.random((2, 2))
ao2mo_beta = np.random.random((2, 2))

basis_transformer = BasisTransformer(
    ElectronicBasis.AO,
    ElectronicBasis.MO,
    ElectronicIntegrals.from_raw_integrals(ao2mo_alpha, h1_b=ao2mo_beta),
)

FreezeCoreTransformer#

この変換ツールは、分子系の コア軌道 をフリーズするための非常にシンプルな手段を提供します。この変換器には .molecule 属性が必要で、そこから Hilbert 空間削減を行うために必要な原子情報を抽出することができます。

[5]:
from qiskit_nature.second_q.drivers import PySCFDriver

driver = PySCFDriver(atom="Li 0 0 0; H 0 0 1.5")

full_problem = driver.run()
print(full_problem.molecule)
print(full_problem.num_particles)
print(full_problem.num_spatial_orbitals)
Molecule:
        Multiplicity: 1
        Charge: 0
        Unit: Bohr
        Geometry:
                Li      (0.0, 0.0, 0.0)
                H       (0.0, 0.0, 2.8345891868475928)
        Masses:
                Li      7
                H       1
(2, 2)
6

以下では、FreezeCoreTransformer を適用します。この場合、最もエネルギーの低い軌道を1つ取り除き (空間軌道の総数を6から5に減らす) 、その軌道内の2つの電子も取り除きます (粒子数の変更に反映されます)。

[ ]:

[6]:
from qiskit_nature.second_q.transformers import FreezeCoreTransformer

fc_transformer = FreezeCoreTransformer()

fc_problem = fc_transformer.transform(full_problem)
print(fc_problem.num_particles)
print(fc_problem.num_spatial_orbitals)
(1, 1)
5

この変換により、コア電子が取り除かれた結果、一定のエネルギーオフセットが発生することに注意してください。このオフセットはハミルトニアンの constants 属性に登録され、以下のように確認することができます。

[7]:
print(fc_problem.hamiltonian.constants)
{'nuclear_repulsion_energy': 1.05835442184, 'FreezeCoreTransformer': -7.840306048789075}

さらに、システムから削除する軌道インデックス (0ベース) のリストを提供することができます。

注意: これらの軌道は非占有でなければならず、そうでなければ計算で大きな誤差を生じます (たとえ非占有であっても、どの軌道を削除しているのか知っておくべきです、なぜなら間違ったものを削除すると、システムのダイナミクスが大幅に変更された場合にも大きな誤差を生じさせる可能性があるからです)。提供された軌道インデックスが本当に非占有であるかどうかをチェックするための防御装置はありませんので、これはあなた次第です。

[8]:
fc_transformer = FreezeCoreTransformer(remove_orbitals=[4, 5])

fc_problem = fc_transformer.transform(full_problem)
print(fc_problem.num_particles)
print(fc_problem.num_spatial_orbitals)
(1, 1)
3

ActiveSpaceTransformer#

この変換器は FreezeCoreTransformer によって実行されるヒルベルト空間削減を一般化したものです。簡単に言うと、活性電子の数と活性空間軌道の数を選択することによって、 活性空間 を指定することができます。これらの設定により、活性空間はフェルミ準位の周辺に選ばれます。

[9]:
from qiskit_nature.second_q.drivers import PySCFDriver

driver = PySCFDriver(atom="Li 0 0 0; H 0 0 1.5")

full_problem = driver.run()
print(full_problem.num_particles)
print(full_problem.num_spatial_orbitals)
(2, 2)
6
[10]:
from qiskit_nature.second_q.transformers import ActiveSpaceTransformer

as_transformer = ActiveSpaceTransformer(2, 2)

as_problem = as_transformer.transform(full_problem)
print(as_problem.num_particles)
print(as_problem.num_spatial_orbitals)
print(as_problem.hamiltonian.electronic_integrals.alpha)
(1, 1)
2
Polynomial Tensor
 "+-":
[[-0.78784474  0.0469345 ]
 [ 0.0469345  -0.36211748]]
 "++--":
[[[[ 0.49428349 -0.0469345 ]
   [-0.0469345   0.01213863]]

  [[-0.0469345   0.01213863]
   [ 0.22662427  0.00616268]]]


 [[[-0.0469345   0.22662427]
   [ 0.01213863  0.00616268]]

  [[ 0.01213863  0.00616268]
   [ 0.00616268  0.33881567]]]]

Qiskit Natureの ActiveSpaceTransformer にはもう1つ、活性軌道のインデックスを手動で指定することができます。これにより、フェルミ準位の周囲に連続的に存在しない活性空間を手動で選ぶことができます。

[11]:
as_transformer = ActiveSpaceTransformer(2, 2, active_orbitals=[0, 4])

as_problem = as_transformer.transform(full_problem)
print(as_problem.num_particles)
print(as_problem.num_spatial_orbitals)
print(as_problem.hamiltonian.electronic_integrals.alpha)
(1, 1)
2
Polynomial Tensor
 "+-":
[[-4.00500243e+00 -7.24056534e-19]
 [-7.24056534e-19 -6.19047188e-01]]
 "++--":
[[[[ 1.65816678e+00  4.90223201e-19]
   [ 4.90223201e-19  9.81922731e-03]]

  [[ 4.90223201e-19  9.81922731e-03]
   [ 3.96308164e-01 -1.10622223e-19]]]


 [[[ 4.90223201e-19  3.96308164e-01]
   [ 9.81922731e-03 -1.10622223e-19]]

  [[ 9.81922731e-03 -1.10622223e-19]
   [-1.10622223e-19  3.12945511e-01]]]]
[12]:
import qiskit.tools.jupyter

%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
qiskit-terra0.23.0.dev0+3ce1737
qiskit-aer0.11.1
qiskit-nature0.5.0
System information
Python version3.9.15
Python compilerGCC 12.2.1 20220819 (Red Hat 12.2.1-2)
Python buildmain, Oct 12 2022 00:00:00
OSLinux
CPUs8
Memory (Gb)62.501182556152344
Sat Nov 05 16:41:31 2022 CET

This code is a part of Qiskit

© Copyright IBM 2017, 2022.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.