@yuichirominato 2019.01.26更新 258views

【化学】高校時代化学赤点だったベンチャーのおっさんが量子化学を極めるため頑張るブログ(その4)


はじめに

量子化学があまりにわからないので気になって眠れなくなってしまい、がんばってやりました。化学と歴史が一番苦手です。その次が国語と数学が苦手で、得意科目は物理と図工です。以前タイトルは極めるでしたが、極めるのは難しそうなのでベストを尽くすに変更しました。

前回までの流れ

最後の方急展開始めましたが最初はやはり前提知識の探索が大変でした。とにかく波動関数がとても大事なので、まずは波動関数を学びましょう。

https://blog.mdrft.com/post/2097

https://blog.mdrft.com/post/2089

https://blog.mdrft.com/post/2086

ツールを調べる

とにかく習うより慣れろということで早速H2の水素分子の基底エネルギーを求めるために頑張りたいと思います。

僕の知ってる限り&教えてもらったところによると、PySCFもしくはPSI4というツールを使って水素分子関連のデータを取り、それをOpenfermionなどにいれてBK変換を行い、さらにそれをBlueqatなどのシミュレーションにかけて答えを探索するようです。順番にみていきたいと思います。

水素分子関連の情報を収集する

見つけました。うちの会社はIBM推しなので、qiskitのリポジトリを検索したらいきなり出てきました。

https://github.com/Qiskit/qiskit-tutorials/tree/master/qiskit/aqua/chemistry/H2

これはpyscfからのデータのようです。pyscfやpsi4はとにかくインストールが大変というので最初から諦めてデータ取得を試みました。これをOpenFermionに入れればいいみたいです。

データはこんな感じになってるようです。多分0.2とか0.3というのは原子間距離でしょう。sto-3gというのは基底のようですが、詳しくはわかりません。機会が来たら学びます。。。頭パンクしてしまうので。

OpenFermionを入れる

こちらから入手できます。

https://github.com/quantumlib/OpenFermion

python -m pip install --user openfermion

おそらく準備は万端のはずです。

量子コンピュータで計算できるように変換する

こっからは得意分野なので早いと思います。前回まで学んだ第二量子化されたハミルトニアンのフェルミオンオペレーターを量子コンピュータのゲートで計算できるようにパウリオペレーターに変換します。そこは簡単です。下記のように決められた通りフェルミオンオペレーターを書いて、変換かけると出ます。

from openfermion.ops import FermionOperator
from openfermion.transforms import jordan_wigner, bravyi_kitaev
from openfermion.utils import eigenspectrum, hermitian_conjugated

# Initialize an operator.
fermion_operator = FermionOperator('2^ 0', 3.17)
fermion_operator += hermitian_conjugated(fermion_operator)
print(fermion_operator)

# Transform to qubits under the Jordan-Wigner transformation and print its spectrum.
jw_operator = jordan_wigner(fermion_operator)
print('')
print(jw_operator)
jw_spectrum = eigenspectrum(jw_operator)
print(jw_spectrum)

# Transform to qubits under the Bravyi-Kitaev transformation and print its spectrum.
bk_operator = bravyi_kitaev(fermion_operator)
print('')
print(bk_operator)
bk_spectrum = eigenspectrum(bk_operator)
print(bk_spectrum)

なので、H2のデータを入手してここからOpenFermionで読み込み変換をかけるところは自動でやってくれるそうです。JW変換でもBK変換でもいいですが、BK変換の方が量子ビット数が少なくて済むようです。

せっかくなのでもちょい簡単にやって見ます。Openfermionの役割はフェルミオンオペレーターと呼ばれるものをパウリオペレーターに変えるらしいです。実際に使うのちょっと面倒ですが、使って見たいと思います。インストール方法は上の方に書いてありますのでみてみてください。

まずはモジュールを読み込みます。こちらはお約束です。

from openfermion.ops import FermionOperator
from openfermion.transforms import jordan_wigner, bravyi_kitaev
from openfermion.utils import eigenspectrum, hermitian_conjugated

どうやら生成消滅演算子とその係数の書き方にコツがあるようです。

https://github.com/quantumlib/OpenFermion/blob/master/examples/openfermion_tutorial.ipynb

記述方法はダガーという十字マークがついたものは^マークで代用します。それで順番にかけられてる演算子と呼ばれるものを順番にスペースでつないで書きます。

my_term = FermionOperator('3^ 1')
print(my_term)

こちらを行うと、、、

1.0 [3^ 1]

このように出力されました。1.0は係数のようです。これでフェルミオンオペレーターが記述できました。係数を書く際にもルールがあります。

good_way_to_initialize = FermionOperator('3^ 1', -1.7)
print(good_way_to_initialize)

-1.7 [3^ 1]

そこからの複数の演算子をつなげるには+記号で繋げます。

term_1 = FermionOperator('4^ 3^ 9 1', 1. + 2.j)
term_2 = FermionOperator('3^ 1', -1.7)
my_operator = term_1 + term_2
print(my_operator)

-1.7 [3^ 1] +
(1+2j) [4^ 3^ 9 1]

いい感じになりました。次にこれを変換です。

jw_operator = jordan_wigner(my_operator)
print(jw_operator)

作ったオペレーターをjordan_wigner(ここ!)にいれると勝手にやってくれるみたいです。

(-0.425+0j) [X1 Z2 X3] +
(-0.0625-0.125j) [X1 Z2 X3 X4 Z5 Z6 Z7 Z8 X9] +
(0.125-0.0625j) [X1 Z2 X3 X4 Z5 Z6 Z7 Z8 Y9] +
(-0.125+0.0625j) [X1 Z2 X3 Y4 Z5 Z6 Z7 Z8 X9] +
(-0.0625-0.125j) [X1 Z2 X3 Y4 Z5 Z6 Z7 Z8 Y9] +
0.425j [X1 Z2 Y3] +
(-0.125+0.0625j) [X1 Z2 Y3 X4 Z5 Z6 Z7 Z8 X9] +
(-0.0625-0.125j) [X1 Z2 Y3 X4 Z5 Z6 Z7 Z8 Y9] +
(0.0625+0.125j) [X1 Z2 Y3 Y4 Z5 Z6 Z7 Z8 X9] +
(-0.125+0.0625j) [X1 Z2 Y3 Y4 Z5 Z6 Z7 Z8 Y9] +
-0.425j [Y1 Z2 X3] +
(0.125-0.0625j) [Y1 Z2 X3 X4 Z5 Z6 Z7 Z8 X9] +
(0.0625+0.125j) [Y1 Z2 X3 X4 Z5 Z6 Z7 Z8 Y9] +
(-0.0625-0.125j) [Y1 Z2 X3 Y4 Z5 Z6 Z7 Z8 X9] +
(0.125-0.0625j) [Y1 Z2 X3 Y4 Z5 Z6 Z7 Z8 Y9] +
(-0.425+0j) [Y1 Z2 Y3] +
(-0.0625-0.125j) [Y1 Z2 Y3 X4 Z5 Z6 Z7 Z8 X9] +
(0.125-0.0625j) [Y1 Z2 Y3 X4 Z5 Z6 Z7 Z8 Y9] +
(-0.125+0.0625j) [Y1 Z2 Y3 Y4 Z5 Z6 Z7 Z8 X9] +
(-0.0625-0.125j) [Y1 Z2 Y3 Y4 Z5 Z6 Z7 Z8 Y9]

よくわからんがこうなりました。ブラビキタエフ変換という効率的なものもあります。

bk_operator = bravyi_kitaev(my_operator)
print(bk_operator)

こうなりました。

(0.425+0j) [Z0 X1 Z3] +
(0.125-0.0625j) [Z0 X1 X4 X5 Y7 Z8 X9] +
(0.0625+0.125j) [Z0 X1 X4 X5 Y7 Y9] +
(-0.0625-0.125j) [Z0 X1 Y4 X5 Y7 Z8 X9] +
(0.125-0.0625j) [Z0 X1 Y4 X5 Y7 Y9] +
-0.425j [Z0 Y1 Z2] +
(-0.0625-0.125j) [Z0 Y1 Z2 Z3 X4 X5 Y7 Z8 X9] +
(0.125-0.0625j) [Z0 Y1 Z2 Z3 X4 X5 Y7 Y9] +
(-0.125+0.0625j) [Z0 Y1 Z2 Z3 Y4 X5 Y7 Z8 X9] +
(-0.0625-0.125j) [Z0 Y1 Z2 Z3 Y4 X5 Y7 Y9] +
(-0.425+0j) [X1 Z2] +
(-0.125+0.0625j) [X1 Z2 Z3 X4 X5 Y7 Z8 X9] +
(-0.0625-0.125j) [X1 Z2 Z3 X4 X5 Y7 Y9] +
(0.0625+0.125j) [X1 Z2 Z3 Y4 X5 Y7 Z8 X9] +
(-0.125+0.0625j) [X1 Z2 Z3 Y4 X5 Y7 Y9] +
0.425j [Y1 Z3] +
(0.0625+0.125j) [Y1 X4 X5 Y7 Z8 X9] +
(-0.125+0.0625j) [Y1 X4 X5 Y7 Y9] +
(0.125-0.0625j) [Y1 Y4 X5 Y7 Z8 X9] +
(0.0625+0.125j) [Y1 Y4 X5 Y7 Y9]

短くなった気がします。難しそうに見えますが、きちんと変換をしていてBK変換の方が効率的のようです。ここで得たパウリオペレーターをゲートマシンもしくはシミュレータにかけます。

コードは動かしましたが、正直全くわかってません。でも大丈夫そうです。大事なところはプロに任せましょう。

シミュレータを準備

今回はBlueqatを準備します。自社製品なので。

https://github.com/mdrft/Blueqat

vqeのモジュールはこの辺りのAPIリファレンスにあります。ただ、現在寝不足で読む元気がありません。先に行きます。

https://blueqat.readthedocs.io/ja/latest/api/blueqat.html#module-blueqat.vqe

基本的にはansatzをルール通り作った上で、vqeにかければいいみたいです。

こちらは量子化学ではないですが、maxcutでのvqeの実行です。パウリ演算子を使ってZZだけで計算をする古典最適化ですが、vqeの実行がなんとなくわかると思います。

from blueqat import vqe, pauli
edges = [(0, 1), (1, 2), (2, 3), (3, 0), (1, 3), (0, 2), (4, 0), (4, 3)]
ansatz = vqe.QaoaAnsatz(sum([pauli.Z(i) * pauli.Z(j) for i, j in edges]), 1)

result = vqe.Vqe(ansatz).run()

print(
"""   {4}
  / \\
 {0}---{3}
 | x |
 {1}---{2}""".format(*result.most_common()[0][0]))

ここではvqeモジュールを使って、vqe.Vqe(ansatz).run()でいけます。ansatzの中にハミルトニアンを導入した波動関数を入れるようです。

ansatzの作り方がよくわかませんが、次回以降開発者に聞いて見ます。

OpenFermion-Blueqatを準備

OpenFermionから毎回データを入力するのが大変なので、勝手に変換してくれるのがあります。それがOpenFermion-Blueqatです。

https://github.com/mdrft/OpenFermion-Blueqat

インストールは下記が楽です。

pip3 install openfermionblueqat

多分さっき手作業でやってた作業を自動的にやってくれるはずです。中のコードを読もうと思いましたがやはりここでも眠いし、難しそうなので見て見ないふりをすることにしてあとでこっそり聞きます。

準備はできた

多分揃ってるはずです。これでなんとか順番に組んで行けばできるはずです。準備はできました。やることは、

1、ときたい分子を選び、既存ライブラリで第二量子化したハミルトニアンのデータを原子間距離に基づいて取得。

2、OpenFermionにそれをいれて変換してさらにシミュレータに入れる。しかし、僕の情報ではここは自動化されているために私たちはやらなくてもいいみたいです。プロに任せましょう。

3、あとはシミュレーションをする。好きなシミュレータを使いましょう。出した結果をプロットなどできるようです。

もう少し情報収集をして次回はいよいよ水素分子の基底状態を解いてプロットして見ます。もうちょいやりたいことがあるので、あと2回くらい続きやる予定です。以上です。

Recommended


CONTACT

info@mdrft.com

ブログトップへ Wikiへ移動

量子コンピュータ一般

量子ゲートアルゴリズム

量子アニーリング一般

量子アニーリングアルゴリズム

BlueqatSDKの使い方