続けて Simulating Molecules using VQE を見ていこうと思ったが、これは断念。以下、途中まで Qiskit 0.34.2 対応(のつもり)を施した内容を記録しておく:
pip install pyscf
して
from qiskit.algorithms import VQE, NumPyEigensolver ... from qiskit.algorithms.optimizers import COBYLA, SPSA, SLSQP from qiskit.opflow.converters import TwoQubitReduction ... from qiskit.utils import QuantumInstance
して
def get_qubit_op(dist): ... qubitOp = TwoQubitReduction(num_particles).convert(qubitOp) shift = energy_shift + repulsion_energy return qubitOp, num_particles, num_spin_orbitals, shift
して
backend = BasicAer.get_backend("statevector_simulator") distances = np.arange(0.5, 4.0, 0.1) exact_energies = [] vqe_energies = [] optimizer = SLSQP(maxiter=5) for dist in distances: qubitOp, num_particles, num_spin_orbitals, shift = get_qubit_op(dist) result = NumPyEigensolver().compute_eigenvalues(qubitOp) ...
したところで、
AttributeError: 'WeightedPauliOperator' object has no attribute 'to_spmatrix'
で断念。似たようなメソッドも WeightedPauliOperator
は持っていないし、何か変換してから compute_eigenvalues
に渡すにしてもどうして良いか分からない。メンテが追いついていないようなので諦める。
An Introduction to Algorithms in Qiskit — Qiskit 0.34.2 documentation だと動くのだが、
but for now I am not going to say anything further about it since the goal is to run the algorithm,
ということで詳細は全部割愛されていてよく分からない。現時点で VQE にこれ以上踏み込むのは難しそうだ・・・。
これ以上はチュートリアルや textbook を見ても踏み込める話題がなさそうなので暫く本を読むなどにうつることにして、Qiskit で何かするのは一旦ここまでとしたい。
或いは、Welcome to Quantum Native Dojo! — Quantum Native Dojo ドキュメント を読むか。[1304.3061] A variational eigenvalue solver on a quantum processor というのもありかもしれない。それにしても量子化学計算の方面のことを知らない状態で眺めるのは無謀にも程があるかもしれない。
水素分子なんかアタックしたことがないし Introduction to Transmon Physics で出てくる量子調和振動子のほうが手計算で固有値求まるし安心感のある題材だな・・・。
分子の量子論 もざっと眺めて雰囲気だけだけど参考になった。
量子化学ライブラリの概要 - Azure Quantum | Microsoft Docs も良さそう。ざっと見た感じ、
- 分子に対する Hamiltonian を Born–Oppenheimer 近似して原子核を固定した状態で記述。
- “第二量子化” と呼ばれる手続きを経たあとで Hamiltonian は生成・消滅演算子を用いて記述できる。
- これはそのままではネイティブ量子ゲートではないので、Jordan-Wigner 変換をかまして書き直す。すると X, Y, Z ゲートで書ける。
- あまりよく分からないけど、Trotter 分解も関与してくる。
といった辺りがキーワードだろうか?Trotter 分解なんて随分昔から知られている概念だと思うけど、何でいきなり出てくるんだろうという不思議さはある。40〜50 年前くらいの概念だろうに・・・。とりあえず、水素分子の基底状態を求めるプログラムの意味を理解するのには結構道のりがありそうだなということは分かった・・・。