Skip to main content
IBM Quantum Platform

HI-VQE Chemistry - Qunova ComputingによるQiskit関数

APIリファレンスを参照してください

Note

Qiskit 関数は、 IBM Quantum® Premium Plan、Flex Plan、およびオンプレム ( IBM Quantum Platform API 経由) Plan ユーザーだけが利用できる実験的な機能です。 これらはプレビューリリースの状態であり、変更される可能性がある。

  • このページ上のコードは、以下の要件に基づいて開発されました。 これらのバージョンまたはそれ以降のバージョンを使用することを推奨します。

    qiskit-ibm-runtime~=0.45.0
    

概要

量子化学では、電子構造問題は、電子シュレーディンガー方程式(系の電子の振る舞いを記述する量子波動関数)の解を見つけることに焦点を当てている。 これらの波動関数は複素振幅のベクトルであり、各振幅は可能な電子配置の寄与に対応する。

基底状態は系の最も低いエネルギーの波動関数であり、分子系の研究において特に重要である。 基底状態を計算するための最も正確なアプローチは、すべての可能な電子配置を考慮することであるが、配置の数は系の大きさとともに指数関数的に増加するため、大きな系では実行不可能となる。

Handover Iterative Variational Quantum Eigensolver (HI-VQE)は、分子系の基底状態を正確に推定するための革新的なハイブリッド量子古典的手法である。 量子ハードウェアと古典コンピューティングを統合し、量子プロセッサーを使って候補となる電子配置を効率的に探索し、その結果の波動関数を古典コンピューターで計算する。 コンパクトでありながら化学的に正確な波動関数を生成することで、HI-VQEは量子化学と物質科学の研究と発見を促進します。

QunovaのHI-VQEアルゴリズムの概要を示す画像

HI-VQEは、基底状態を高精度で効率的に推定することにより、電子構造問題の計算量を削減します。 最も関連性の高い電子配置の中から厳選されたサブセットに焦点を当て、精度と効率の両方を最適化します。

HI-VQEは、古典コンピュータと量子コンピュータの両方の長所を組み合わせて、現在の推定波動関数を繰り返し精製し、改善する。 また、独自の部分空間構築技術により、コンフィギュレーション選択をより効率的に行うことができるため、量子化学シミュレーションにおける計算制御の幅が広がり、精度が向上します。

アルゴリズムについてさらに詳しく知りたい場合は、 関連する研究論文をお読みください


説明

分子系の電子配置の数は、系の大きさとともに指数関数的に増加する。 しかし、基底状態のような特定の電子状態では、その状態のエネルギーに大きく寄与する配位はごく一部であるのが普通である。 選択構成相互作用(SCI)法は、このスパース性を利用して、最も関連性の高い構成を特定し、それに集中することで計算コストを削減する。 この構成の部分集合を部分空間と呼ぶ。

HI-VQEは、分子系を表現する量子コンピュータ固有の効率性を活用し、部分空間探索を支援する。 古典と量子のサブルーチンを統合し、電子構造問題を高精度で解く。 既存の量子SCI法とは異なり、HI-VQEは、変分学習、反復部分空間構築、対角化前構成スクリーニングを組み合わせることで、量子測定、反復、古典的対角化コストを削減し、効率を高めている。 したがって、HI-VQEは、より多くの量子ビットを必要とする大規模な分子系に適用することができ、与えられたサイズの問題を同じ精度で解くためのコストを削減することができる。

QunovaのHI-VQEアルゴリズムの各ステップを詳細に説明した図。

系の基底状態を計算するために、HI-VQEはまず古典化学パッケージ( PySCF )を使用して、分子形状やその他の分子情報など、ユーザーから提供された入力から分子表現を生成します。 その後、量子-古典のハイブリッド最適化ループに入り、含まれるコンフィギュレーションの数を最小限に抑えながら、基底状態を最適に表現する部分空間を繰り返し精製する。 ループは、部分空間の大きさやエネルギーの安定性などの収束基準が満たされるまで続けられ、その後、計算された基底状態の波動関数とエネルギーが出力される。 これらの結果は、正確なポテンシャルエネルギー曲面を構築し、システムのさらなる解析を行うために使用することができる。

この最適化ループは、高品質な部分空間を生成するために、量子回路のパラメータを調整することに重点を置いている。 excitation_preservingHI-VQEでは、「 efficient_su2 」および 「LUCJ 」の3つの量子回路オプションを提供しています。 この最適化は、その汎用性の高さから、ハートリー・フォック基準状態の近くで初期化される。 その後、この回路は量子デバイス上で実行され、その結果として得られる量子状態から構成がサンプリングされた後、バイナリ文字列として返されます。 量子デバイスのノイズにより、サンプリングされた構成の中には、電子数やスピンの保存則を満たさないなど、物理的に無効なものがある可能性があります。 HI-VQE では、 qiskit-addon-sqd パッケージの構成復旧プロセスを利用してこの問題に対処しており、ユーザーは不正な構成を修正するか、あるいは破棄するかを選択できます。

その後、有効なコンフィギュレーションは、オプションのスクリーニングステップを経て、最小限の寄与しかしないと予測されるコンフィギュレーションを除外する。 これにより部分空間の次元が小さくなり、対角化ステップのコストが下がる。 スクリーニングが有効であれば、有効なコンフィギュレーションから予備的な部分空間ハミルトニアンが構築され、非常に緩い終了基準で対角化が実行される。 結果として得られる各構成の振幅の精度は低いが、今回の反復でどの構成を部分空間から除外するかを予測するのに有効であり、計算速度も速い。

選択されたコンフィギュレーションは部分空間に追加され、システムのハミルトニアンはこの部分空間に投影される。 部分空間は反復的に更新され、反復の間、最も関連性の高い構成が維持される。 このアプローチは、量子回路が各ステップで完全な基底状態を近似する必要がないため、他の方法とは対照的である。

次に、この部分空間ハミルトニアンを古典的に対角化し、最低固有値とそれに対応する固有ベクトルを求め、基底状態とそのエネルギーの近似を表す。 反復によって部分空間の品質が向上すると、計算された基底状態は真の基底状態をよりよく近似する。 この時点で、計算された基底状態に対して実質的な寄与を持たない部分空間からすべてのコンフィギュレーションを取り除くために、追加のスクリーニングステップを実行することができる。 このステップによって、次の反復に持ち越される部分空間が可能な限りコンパクトになる。 これは対角化によって返される振幅に基づいて評価され、これらは計算された基底状態に対する各配置の重要な寄与を表しているからである。

その後、収束チェックによって、さらなるトレーニングによって結果が改善されるかどうかが判断される。 そうであれば、オプションで古典的な展開ステップが実行され、量子回路のパラメータが更新されて計算エネルギーがさらに最小化され、このプロセスが繰り返される。 古典的な展開ステップは、量子デバイスからサンプリングされた配置を補完して、部分空間の配置を追加生成する。 対角化の結果、振幅が最大となった配置をまず特定し、特定した配置から単励起と二重励振を持つ新しい配置を生成する。 そして、これらのコンフィギュレーションを希望する数だけ、部分空間に追加する。

反復が収束したと判断されると、HI-VQEは計算された基底状態(部分空間の状態と基底状態の波動関数の振幅の形)、そのエネルギー、計算された状態が系のハミルトニアンの固有状態を形成しているかどうかの指標となるエネルギー分散尺度を返す。

ユーザーは、使用する量子回路や各量子回路のショット数を決めることができ、また、部分空間のサイズを制御したり、量子的に生成された構成を補助するために古典的な構成を追加生成できるようにすることもできる。 こうすることで、ユーザーはHI-VQEの挙動を希望する用途に合わせて調整することができる。


使用を開始する

まず、 その関数へのアクセス権をリクエストします。 次に、 IBM Quantum® のAPIキーを使用して認証を行い、 アカウントがすでにローカル環境に保存されていることを前提として、次のようにQiskit Functionを選択します:

import reprlib
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

# Verify that you have access to the function
catalog.list()

Output:

[QiskitFunction(qunova/hivqe-chemistry),
 QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
 QiskitFunction(algorithmiq/tem),
 QiskitFunction(qedma/qesem),
 QiskitFunction(multiverse/singularity),
 QiskitFunction(ibm/circuit-function),
 QiskitFunction(q-ctrl/optimization-solver),
 QiskitFunction(colibritd/quick-pde),
 QiskitFunction(q-ctrl/performance-management),
 QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]
# Load the function
function = catalog.load("qunova/hivqe-chemistry")

最初の例では、HI-VQE アルゴリズムを用いて、 NH3 分子の基底状態エネルギーを計算する方法を示す。

分子の幾何構造とオプションを定義する

NH3 の分子形状は、各原子を"; "で区切ったデカルト座標で提供される。

# Define the molecule geometry
geometry = """
N         -0.85188       -0.02741        0.03141;
H          0.16545        0.00593       -0.01648;
H         -1.16348       -0.39357       -0.86702;
H         -1.16348        0.94228        0.06281;
"""

分子システムには、以下の辞書形式で追加オプションを定義し、提供することができる。

# Configure some options for the job.
molecule_options = {"basis": "sto3g"}
hivqe_options = {"shots": 100, "max_iter": 20}

ジオメトリとオプションを入力して関数を実行します。

# Run HI-VQE
job = function.run(
    geometry=geometry,
    # `backend_name` is the name of a backend with at least 16 qubits,
    # for example, "ibm_marrakesh".
    backend_name=backend_name,
    max_states=2000,
    max_expansion_states=10,
    molecule_options=molecule_options,
    hivqe_options=hivqe_options,
)

ファンクションジョブIDを印刷しておくと、何か問題が発生したときに、サポートリクエストで提供することができます。

print("Job ID:", job.job_id)

Output:

Job ID: e5ced6f2-fd1d-4244-a6aa-bd27cfb0cdee

この例では、 sto3g の8つの軌道を持つ16個の量子ビットを NH3 分子の基底として使用する。

Qiskit Function ワークロードのステータスを確認したり、 結果を返したりするには、次のように操作してください:

print(job.status())

Output:

QUEUED

ジョブの完了後、 result() インスタンスで結果を得ることができる。

result = job.result()

# Output can be long, so we display a shortened representation
shortened_result = reprlib.repr(result)
print(shortened_result)

Output:

{'eigenvector': [0.9824448589364075, 0.009527106392132133, 6.854074372058527e-08, 3.591500190038039e-07, 0.0012975231577544268, 2.310159709002111e-05, ...], 'energy': -55.52108557170985, 'energy_history': [-55.51901898989887, -55.52056881448526, -55.52065046778772, -55.520690696813716, -55.520691108428, -55.520708448092634, ...], 'energy_variance': 3.066239097617371e-10, ...}

基底状態のエネルギーにアクセスするには、"energy "キーを使う。 固有ベクトル "キーは、結果の "状態 "とともに格納された電子配置の対応するビット列表記を持つCI係数を提供する。

fci_energy = -55.521148034704126  # the exact energy using FCI method
hivqe_energy = result["energy"]
print(
    f"|Exact Energy - HI-VQE Energy|: "
    f"{abs(fci_energy - hivqe_energy) * 1000} mHa"
)
print(f"Sampled Number of States: {len(result['states'])}")

Output:

|Exact Energy - HI-VQE Energy|: 0.06246299427914437 mHa
Sampled Number of States: 1936

ライセンス交付

なお、このQiskit関数の使用は、上限を20キュービット以下とする問題に限定されます。ただし、それ以上の上限を認めるライセンスを取得している場合はこの限りではありません。

ライセンスに関するお問い合わせは、 qiskit.support @ qunovacomputing.com までメールでお送りください。

ライセンス付き関数の使用例

ライセンスを取得したユーザーにはライセンストークンが発行され、その後、ラッパーライブラリを使用してそのライセンストークンを関数に送信する必要があります。 このラッパーライブラリは、 PyPI から pip install hivqe-qiskit-function-utils. を使用してインストールできます。 以下の例は、このライブラリを使用して関数を呼び出す際に、ライセンストークンを送信する方法を示しています。

import math
from qiskit_ibm_catalog import QiskitFunctionsCatalog
from hivqe_qiskit_function_utils import FunctionWrapper

catalog = QiskitFunctionsCatalog(
    token="your_qiskit_functions_catalog_token",
    channel="ibm_quantum_platform",
    instance="your_ibm_instance",
)

molecule_geometry = f"""
O 0 0 0;
H {-0.957*math.sin(math.radians(104.5)/2.0)} {0.957*math.cos(math.radians(104.5)/2.0)} 0;
H {0.957*math.sin(math.radians(104.5)/2.0)} {0.957*math.cos(math.radians(104.5)/2.0)} 0
"""

hivqe = FunctionWrapper(
    token="your_hivqe_license_token",
    function=catalog.load("qunova/hivqe-chemistry"),
)
job = hivqe.run(
    geometry=molecule_geometry,
    backend_name="ibm_torino",
    max_states=10000,
    max_expansion_states=1000,
    hivqe_options={"ansatz": "epa", "max_iter": 10},
)
result = job.result()

パフォーマンス

本セクションでは、 Li2S の24qubitケース、 N2 分子の40qubitケース、 FeP-NO システムの44qubitケースを用いたHI-VQEのベンチマーク計算を示す。

Li2S 分子(24量子ビット)の解離ポテンシャルエネルギー面曲線

PES曲線は、FCIリファレンスとRHFからの初期推測値、FCIリファレンスからのエネルギー誤差とともに示されている。

Li2S 系において、HI-VQEが古典的な参照PES曲線の化学的精度内で解を生成することを示す画像

計算は以下の形状とオプションで行われた。

# Define Li2S geometries
Li2S_geoms = {
    "Li2S_1.51": "S        -1.239044    0.671232   -0.030374;Li       -1.506327    0.432403   -1.498949;Li       -0.899996    0.973348    1.826768;",
    "Li2S_2.40": "S        -1.741432    0.680397    0.346702;Li       -0.529307    0.488006   -1.729343;Li       -1.284307    0.989409    2.177209;",
    "Li2S_3.80": "S        -2.707255    0.674298    0.909161;Li        0.079218    0.552012   -1.671656;Li       -0.927010    0.931502    1.557063;",
}

# Configure some options for the job.
molecule_options = {
    "basis": "sto3g",
}
hivqe_options = {
    "shots": 100,
    "max_iter": 20,
}

results = []
for geom in ["Li2S_1.51", "Li2S_2.40", "Li2S_3.80"]:
    # Run HI-VQE
    job = function.run(
        geometry=Li2S_geoms[geom],
        backend_name=backend_name,  # can use any device with at least 38 qubits
        max_states=2000,
        max_expansion_states=10,
        molecule_options=molecule_options,
        hivqe_options=hivqe_options,
    )
    results.append(job.result())

赤い点は6つの異なる形状に対するHI-VQEの計算結果を表し、 1.51、 2.40、 3.80 オングストロームに対応する3つの形状が上記セルの入力として提供されている。

40量子ビットを有する N2 分子の解離ポテンシャルエネルギー曲線

窒素分子は、ハートリーフォック状態を超える大きな相関エネルギー寄与を持つ多参照系として同定された。 cc-pvdz基底( 20o,14e )を用い、ホモ・ルーモ活性軌道選択を用いて、 N2 分子のベンチマーク計算を行った。 この問題を表す完全アクティブ空間(CAS)番号は6,009,350,400である。 強力なデスクトップ( 16cpu/64GB )を使っても、この状態数では(エネルギーと電子構造に関する)固有値問題の解を得ることはできない。 HI-VQEを使えば、計算資源を大幅に節約しながら、CAS状態の部分空間を効率的に探索し、化学的に正確な結果を見つけることができる。 以下のプロットは、40量子ビットのHI-VQE計算による N2 分子解離のPES曲線を示している。

N2 系において、HI-VQE法が古典的な参照ポテンシャルエネルギー面(PES)曲線の化学的精度内で解を生成することを示す画像

44量子ビットを有するNO系を有する五配位鉄(II)ポルフィリンの解離PES曲線

もう一つの興味深い化学系は、配位した一酸化窒素(NO)リガンドを持つ鉄(II)-ポルフィリン( FeP )錯体であり、これは生物学的に関連性のある金属ポルフィリン系を代表し、様々な生理学的プロセスにおいて重要な役割を果たしている。 この例では、HI-VQEを利用して、 FeP とNO間の分子間相互作用の正確なポテンシャルエネルギー曲面(異なる分離形状に対する基底状態エネルギー)を推定した。 結合系は合計で450個の軌道と202個の電子( 450o,202e )( 6-31g(d )基底を持つ。 ホモ・ルーモ活性軌道の選択は、( 22o,22e )で実際のケースから小さいケースを計算するために利用された。 以下のベンチマーク結果から、CASCI(DMRG)( 22o,22e )を参照した最先端の古典的計算機化学計算で、化学的精度(> 1.6 mHa )を達成することができた。

FeP-NO 系において、HI-VQE法が古典的な参照ポテンシャルエネルギー面(PES)曲線の化学的精度内で解を生成することを示す画像

ベンチマーク

  • 厳密行列サイズとは、FCIやCASCIのような厳密解を求める行列式の数である。
  • HI-VQE計算は、サンプルを計算し、その部分空間(HI-VQE行列のサイズ)を計算する。
  • 合計時間には、QPUランタイムおよびCPUによるQiskit Functionの実行が含まれます。
  • 精度は厳密解とのエネルギー差から見積もられる。
化学システム
量子ビット数
正確なマトリックスサイズ
HI-VQEマトリックスサイズ
E(diff) from exact ( mHa )
反復回数
合計時間
QPUランタイム使用量
NH3NH_3 (8o,10e)16313619360.08637 s34 s
Li2SLi_2S (10o,10e)206350439690.605250 s50 秒
NH3NH_3 (15o,10e)30時間まで9018009497290.905354 s54 s
N2N_2 (16o,14e)3213087360017982811.1096531 s121 s
3H2O3H_2O (18o,24e)363446220963994240.90245174 s130 s
N2N_2 (20o,14e)40600935040090120041.202146547 s258 s

エラーメッセージを取得する

ワークロードが失敗した場合、ステータスは ERRORjob.result() を呼び出すと例外が発生する:

job = function.run(
    geometry="invalid-geometry",  # This will cause an error
    backend_name=backend_name,
    max_states=2000,
    max_expansion_states=15,
    molecule_options=molecule_options,
    hivqe_options=hivqe_options,
)

job.result()

Output:

---------------------------------------------------------------------------
QiskitServerlessException                 Traceback (most recent call last)
Cell In[12], line 10
      1 job = function.run(
      2     geometry="invalid-geometry",  # This will cause an error
      3     backend_name=backend_name,
   (...)
      7     hivqe_options=hivqe_options,
      8 )
---> 10 job.result()

File ~/work/documentation/documentation/.tox/py311/lib/python3.11/site-packages/qiskit_serverless/core/job.py:253, in Job.result(self, wait, cadence, verbose, maxwait)
    251 if self.status() == "ERROR":
    252     if results:
--> 253         raise QiskitServerlessException(results)
    255     raise QiskitServerlessException(self.filtered_logs(include=r"(?i)error|exception"))
    257 if isinstance(results, str):

QiskitServerlessException: ["runner.UnknownRuntimeError: 'An unexpected error occurred during job execution. Please make sure that your inputs are valid. If you are still experiencing problems, you can contact the Qunova Computing support service at [email protected] and provide the Function job ID of this job for more assistance. -- https://docs.quantum.ibm.com/errors#1500'\n"]
job.status()

Output:

'ERROR'

サポートの利用

この機能に関するサポートが必要な場合は、 qiskit.support @ qunovacomputing.com に電子メールを送信してください。

特定のエラーのトラブルシューティングのヘルプが必要な場合は、エラーが発生したジョブのファンクション・ジョブIDをお知らせください。


次のステップ

推奨事項
このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。