{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "8cfa587b",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"化学シミュレーションのためのQiskit関数を作成する\"\n",
        "description: \"化学ワークフローテンプレートのデプロイと実行方法を学ぶ\"\n",
        "---\n",
        "\n",
        "<span id=\"build-and-run-a-qiskit-function-template-for-electronic-structure-simulation-with-an-implicit-solvent-model\" />\n",
        "\n",
        "# 暗黙的溶媒モデルを用いた電子構造シミュレーションのためのQiskit Functionテンプレートを作成して実行する\n",
        "\n",
        "{/* cspell:ignore pvdz, fcisolver, avas, ncas, nelecas, ecore, chkfile, fcivec, hcore, ncore, myci, sqdvec, myeps, mymethod, mysolvmethod, myavas, mcscf, MCSCF, chkfile, prqs */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f9bfec87",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f3a337d1",
      "metadata": {},
      "source": [
        "クリーブランド・クリニックと共同で開発されたこのテンプレートは、陰溶媒中の分子の基底状態エネルギーと溶媒和自由エネルギーを計算するワークフローで構成されている [\\[1\\]](#references)。 これらのシミュレーションは、サンプルベースの量子対角化（SQD）法 [\\[2-6\\]](#references) と溶媒の積分方程式形式極性連続体モデル（IEF-PCM） [\\[7\\]](#references) に基づいている。\n",
        "\n",
        "このワークフローの手順を具体例を交えて詳しく解説した内容については、「 [Qiskit Serverless を使用した暗黙的溶媒計算](/docs/tutorials/implicit-solvent-calculations) 」のチュートリアルをご覧ください。\n",
        "\n",
        "このガイドでは、溶質としてメタノール分子を用い、その電子構造を明示的にシミュレートし、溶媒として連続的な誘電媒質として近似された水をテンプレートとして利用しています。 計算コストと精度のバランスを保ちながらメタノール中の[電子相関効果を](https://onlinelibrary.wiley.com/doi/epdf/10.1002/ijch.202100111)考慮するため、SQD IEF-PCMでシミュレートした活性空間には、 $\\sigma$、 $\\sigma^{*}$、ローンペア軌道のみを含めた。 この軌道選択は、C2s\\[,2p],O2s\\[,2p],H \\[1] s原子軌道成分を用いた[原子価活性空間(AVAS)](https://github.com/pyscf/pyscf.github.io/blob/master/examples/mcscf/43-avas.py) 法で行われ、14個の電子と12個の軌道からなる活性空間が得られる( 14e,12o )。 参照軌道はcc-pvdz基底セットを用いて閉殻ハートリーフォックで計算した。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "25d18ba5",
      "metadata": {},
      "source": [
        "<span id=\"workflow-introduction\" />\n",
        "\n",
        "## ワークフロー導入\n",
        "\n",
        "この対話型ガイドでは、この関数テンプレートをQiskit Serverlessにアップロードし、サンプルワークロードを実行する方法を示します。 テンプレートは4つのステップからなるQiskitパターンとして構成されている：\n",
        "\n",
        "<span id=\"1-collect-input-and-map-the-problem\" />\n",
        "\n",
        "#### 1. 情報を収集し、問題を整理する\n",
        "\n",
        "このステップでは、分子の形状、選択された活性空間、溶媒和モデル、LUCJオプション、およびSQDオプションを入力として受け取ります。 そして、 PySCF チェックポイントファイルを作成します。このファイルには、ハートリーフォック（HF）IEF-PCM データが含まれています。 このデータはワークフローのSQD部分で使用される。 ワークフローの LUCJ 部分について、入力セクションは気相 HF データも生成し、これは PySCF FCIDUMP フォーマットで内部に保存される。\n",
        "\n",
        "高周波気相シミュレーションからの情報と、アクティブスペースの定義が入力として取り込まれる。 重要なのは、エラー抑制、ショット数、回路トランスパイラ最適化レベル、量子ビットレイアウトに関する入力セクションからのユーザー定義情報も使用することです。\n",
        "\n",
        "定義された活性空間内で1電子積分と2電子積分を生成する。 この積分を用いて古典的なCCSD計算を行い、LUCJ回路のパラメトリック化に用いる t2。\n",
        "\n",
        "<span id=\"2-optimize-the-circuit\" />\n",
        "\n",
        "#### 2. 回路を最適化する\n",
        "\n",
        "LUCJ回路はその後、ターゲット・ハードウェア用のISA回路にトランスパイルされる。 次に、実行を管理するためのエラー緩和オプションのデフォルトセットとともに、サンプラープリミティブがインスタンス化される。\n",
        "\n",
        "<span id=\"3-execute-the-circuit\" />\n",
        "\n",
        "#### 3. 回路を実行する\n",
        "\n",
        "LUCJの計算は、各測定のビット列を返し、これらのビット列は研究対象の系の電子配置に対応する。 ビット列は後処理の入力として使われる。\n",
        "\n",
        "<span id=\"4-post-process-by-using-sqd\" />\n",
        "\n",
        "#### 4. SQDを使用して後処理を行う\n",
        "\n",
        "この最後のステップでは、HF IEF-PCM情報を含む PySCF チェックポイントファイル、LUCJによって予測された電子配置を表すビット列、および入力セクションで選択されたユーザー定義のSQDオプションを入力として受け取ります。 出力として、最もエネルギーの低いバッチのSQD IEF-PCM総エネルギーと、対応する溶媒和自由エネルギーが得られます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4832ef18",
      "metadata": {},
      "source": [
        "<span id=\"options\" />\n",
        "\n",
        "### オプション\n",
        "\n",
        "このテンプレートでは、LUCJ回路を生成するためのオプションと、SQD実行パラメータを指定する必要がある。\n",
        "\n",
        "<span id=\"lucj-options\" />\n",
        "\n",
        "#### LUCJ オプション\n",
        "\n",
        "LUCJ量子回路が実行されると、分子系の確率分布から計算基底状態を表すサンプルの集合が生成される。 LUCJ回路の深さと表現力のバランスをとるため、反対スピンを持つスピン軌道に対応する量子ビットは、これらの量子ビットが1つのアンシラ量子ビットを介して隣接している場合、それらの間に2量子ビットゲートが適用される。 このアプローチをヘビーヘキストポロジーを持つ IBM ハードウェア上に実装するために、同じスピンを持つスピン軌道を表す量子ビットは、ターゲットハードウェアのヘビーヘックス接続性により、各線がジグザグ形状をとるライントポロジーで接続され、反対スピンを持つスピン軌道を表す量子ビットは、4番目の量子ビットごとにのみ接続されます。\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"必要なオプションの詳細を表示するにはクリックしてください：\">\n",
        "    ユーザーは、SQD IEF-PCM関数の `lucj_options` セクションで、この[*ジグザグ*パターンを](https://pubs.rsc.org/en/content/articlehtml/2023/sc/d3sc02516k)満たす量子ビットに対応する `initial_layout` 配列を提供する必要があります。 メタノールのSQD IEF-PCM ( 14e,12o )/cc-pvdzシミュレーションの場合、Eagle R3 QPUの主対角線に対応する初期量子ビットレイアウトを選択しました。 ここで、 `initial_layout` 配列の最初の12要素 `[0, 14, 18, 19, 20, 33, 39, 40, 41, 53, 60, 61, ...]` はアルファスピン軌道に対応する。 最後の12元素 `[... 2, 3, 4, 15, 22, 23, 24, 34, 43, 44, 45, 54]` はベータ・スピン軌道に対応する。\n",
        "\n",
        "    重要なのは、LUCJ 回路の測定回数に相当する `number_of_shots` を決定することである。 S-COREの最初のステップでは、基底状態の占有数分布の初期近似を得るために右粒子セクターのサンプルに依存するため、ショット数は十分に大きくする必要があります。\n",
        "\n",
        "    ショット数はシステムやハードウェアに大きく依存するが、 [非共有結合](https://arxiv.org/abs/2410.09209)、 [フラグメントベース](https://arxiv.org/abs/2411.09861)、 [陰溶媒の](https://pubs.acs.org/doi/10.1021/acs.jpcb.5c01030) SQD研究では、これらのガイドラインに従うことで化学的精度に到達できることが示唆されている：\n",
        "\n",
        "    * 20,000～200,000ショット（分子軌道16個未満（スピン軌道32個）の場合\n",
        "    * 200,000ショット（16～18個の分子軌道を持つ系について\n",
        "    * 200,000～2,000,000ショット（18個以上の分子軌道を持つ系について\n",
        "\n",
        "    必要なショット数は、対象とする系におけるスピン軌道数のほか、その系内で選択されたアクティブ空間に対応するヒルベルト空間の大きさに影響を受ける。 一般的に、ヒルベルト空間が小さいインスタンスほど、必要なショット数は少なくなります。 LUCJには、他にも[回路トランスパイラ最適化レベル](https://docs.quantum.ibm.com/guides/set-optimization)や[エラー抑制オプション](https://docs.quantum.ibm.com/guides/error-mitigation-and-suppression-techniques)などの機能があります。 なお、これらの設定は、必要な撮影枚数や撮影結果の精度にも影響します。\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e2b46498",
      "metadata": {},
      "source": [
        "<span id=\"sqd-options\" />\n",
        "\n",
        "#### SQDオプション\n",
        "\n",
        "SQD シミュレーションで重要なオプションには、 `sqd_iterations`、 `number_of_batches`、 `samples_per_batch` があります。 一般的に、バッチあたりのサンプル数が少ないことは、より多くのバッチ(`number_of_batches`)やS-CORE(`sqd_iterations`)を反復することで打ち消すことができる。バッチ数を増やせば、構成部分空間のより多くのバリエーションをサンプリングすることができる。 最も低エネルギーのバッチが系の基底状態エネルギーの解とされるので、より多くのバッチがより良い統計によって結果を改善することができる。 S-COREの追加反復により、正しい粒子セクターのサンプル数が少ない場合、元のLUCJ分布からより多くの構成を回復することができます。 これにより、バッチあたりのサンプル数を減らすことができる。\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"SQDオプションの設定に関する詳細情報を見るにはクリックしてください：\">\n",
        "    代替的な戦略としては、バッチごとにより多くのサンプルを使用することで、正しい粒子空間の初期LUCJサンプルのほとんどがS-CORE手順中に使用され、個々の部分空間が十分な種類の電子配置を包含するようにします。 その結果、必要なS-COREステップの数が減り、バッチあたりのサンプル数が十分に多ければ、SQDの反復は2～3回で済む。 しかし、バッチあたりのサンプル数が多くなると、各対角化ステップの計算コストが高くなる。 したがって、SQDシミュレーションにおける精度と計算コストのバランスは、 `sqd_iterations`、 `number_of_batches`、 `samples_per_batch` を最適に選択することで達成できる。\n",
        "\n",
        "    [SQD IEF-PCM研究では](https://pubs.acs.org/doi/10.1021/acs.jpcb.5c01030)、S-COREを3回反復使用する場合、これらのガイドラインに従うことで化学的精度に到達できることが示された：\n",
        "\n",
        "    * メタノールでバッチあたり 600 サンプル SQD IEF-PCM ( 14e,12o ) シミュレーション\n",
        "    * メチルアミン SQD IEF-PCM ( 14e,13o ) シミュレーションでバッチ当たり 1500 サンプル\n",
        "    * 6000サンプル/バッチ（水） SQD IEF-PCM ( 8e,23o ) シミュレーション\n",
        "    * エタノールでバッチあたり16000サンプル SQD IEF-PCM ( 20e,18o ) シミュレーション\n",
        "\n",
        "    LUCJにおける必要ショット数と同様に、S-CORE手順で使用されるバッチあたりの必要サンプル数は、システムやハードウェアに大きく依存する。 上記の例は、バッチあたりの必要サンプル数のベンチマークの初期点を推定するために使用できる。 バッチごとに必要なサンプル数の系統的ベンチマークに関するチュートリアルは[こちらを](https://qiskit.github.io/qiskit-addon-sqd/how_tos/choose_subspace_dimension.html)ご覧ください。\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "998a0f25",
      "metadata": {},
      "source": [
        "<span id=\"deploy-and-execute-the-template-sqd-ief-pcm-function\" />\n",
        "\n",
        "## テンプレートSQD IEF-PCM関数をデプロイし実行する\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6c92ac84",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "<span id=\"authentication\" />\n",
        "\n",
        "### 認証\n",
        "\n",
        "`qiskit-ibm-catalog` [IBM Quantum Platformの]()ダッシュボードに表示されるAPIキー（トークン）を使って、。 `QiskitServerless`  これにより、サーバーレス・クライアントをインスタンス化して、選択した関数をアップロードまたは実行できるようになる：\n",
        "\n",
        "```python\n",
        "from qiskit_ibm_catalog import QiskitServerless\n",
        "\n",
        "serverless = QiskitServerless(\n",
        "    channel=\"ibm_quantum_platform\",\n",
        "    instance=\"INSTANCE_CRN\",\n",
        "    # For `token`, use the 44-character API_KEY you created\n",
        "    # and saved from the IBM Quantum Platform Home dashboard\n",
        "    token=\"YOUR_API_KEY\"\n",
        ")\n",
        "```\n",
        "\n",
        "オプションとして、 `save_account()` を使用してローカル環境に認証情報を保存します（ [IBM Cloud アカウントの設定](/docs/guides/cloud-setup#cloud-save)ガイドを参照）。 と同じファイルに認証情報を書き込むことに注意。 [`QiskitRuntimeService.save_account()`](/docs/api/qiskit-ibm-runtime/qiskit-runtime-service#save_account):\n",
        "\n",
        "```python\n",
        "QiskitServerless.save_account(token=\"YOUR_API_KEY\",\n",
        "    channel=\"ibm_quantum_platform\", instance=\"INSTANCE_CRN\")\n",
        "```\n",
        "\n",
        "[アカウント](/docs/guides/save-credentials)が保存されている場合、認証のためにトークンを提供する必要はありません：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "9276e2d4",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_catalog import QiskitServerless\n",
        "\n",
        "serverless = QiskitServerless()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e1f99d80",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "<span id=\"upload-the-template\" />\n",
        "\n",
        "### テンプレートをアップロードする\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3e0e8cc8",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "カスタムQiskit関数をアップロードするには、まず関数のソースコードを定義する `QiskitFunction` オブジェクトをインスタンス化する必要があります。 タイトルがあれば、リモートクラスタにある機能を識別できます。 主なエントリーポイントは、 `if __name__ == \"__main__\"` を含むファイルである。 ワークフローで追加のソースファイルが必要な場合は、エントリーポイントと一緒にアップロードされる作業ディレクトリを定義することができます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "77b2b9b6",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "QiskitFunction(sqd_pcm_template)\n"
          ]
        }
      ],
      "source": [
        "from qiskit_ibm_catalog import QiskitFunction\n",
        "\n",
        "template = QiskitFunction(\n",
        "    title=\"sqd_pcm_template\",\n",
        "    entrypoint=\"sqd_pcm_entrypoint.py\",\n",
        "    # all files in `working_dir` will be uploaded\n",
        "    working_dir=\"./source_files/\",\n",
        "    dependencies=[\n",
        "        \"ffsim==0.0.54\",\n",
        "        \"pyscf==2.9.0\",\n",
        "        \"qiskit_addon_sqd==0.10.0\",\n",
        "    ],\n",
        ")\n",
        "print(template)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "72854f5a",
      "metadata": {},
      "source": [
        "インスタンスの準備ができたら、サーバーレスにアップロードする：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "59e7fdb5",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "QiskitFunction(sqd_pcm_template)"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "serverless.upload(template)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ac7d8764",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "プログラムが正常にアップロードされたかどうかを確認するには、 `serverless.list()` ：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "03a91030",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[QiskitFunction(sqd_pcm_template),\n",
              " QiskitFunction(hamiltonian_simulation_template)]"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "serverless.list()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "99408586",
      "metadata": {},
      "source": [
        "<span id=\"load-and-run-the-template-remotely\" />\n",
        "\n",
        "## テンプレートをリモートで読み込み実行する\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "62b37d7a",
      "metadata": {},
      "source": [
        "関数テンプレートがアップロードされたので、Qiskit Serverlessでリモート実行できる。 まず、テンプレートを名前で読み込む：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "854d12cf",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "QiskitFunction(sqd_pcm_template)\n"
          ]
        }
      ],
      "source": [
        "template = serverless.load(\"sqd_pcm_template\")\n",
        "print(template)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fa2dc721",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "次に、SQD-IEF PCMのドメインレベル入力でテンプレートを実行します。 この例では、メタノールベースの作業負荷を指定している。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a1719ab1",
      "metadata": {},
      "outputs": [],
      "source": [
        "molecule = {\n",
        "    \"atom\": \"\"\"\n",
        "    O -0.04559 -0.75076 -0.00000;\n",
        "    C -0.04844 0.65398 -0.00000;\n",
        "    H 0.85330 -1.05128 -0.00000;\n",
        "    H -1.08779 0.98076 -0.00000;\n",
        "    H 0.44171 1.06337 0.88811;\n",
        "    H 0.44171 1.06337 -0.88811\n",
        "    \"\"\",  # Must be specified\n",
        "    \"basis\": \"cc-pvdz\",  # default is \"sto-3g\"\n",
        "    \"spin\": 0,  # default is 0\n",
        "    \"charge\": 0,  # default is 0\n",
        "    \"verbosity\": 0,  # default is 0\n",
        "    \"number_of_active_orb\": 12,  # Must be specified\n",
        "    \"number_of_active_alpha_elec\": 7,  # Must be specified\n",
        "    \"number_of_active_beta_elec\": 7,  # Must be specified\n",
        "    \"avas_selection\": [\n",
        "        \"%d O %s\" % (k, x) for k in [0] for x in [\"2s\", \"2px\", \"2py\", \"2pz\"]\n",
        "    ]\n",
        "    + [\"%d C %s\" % (k, x) for k in [1] for x in [\"2s\", \"2px\", \"2py\", \"2pz\"]]\n",
        "    + [\"%d H 1s\" % k for k in [2, 3, 4, 5]],  # default is None\n",
        "}\n",
        "\n",
        "solvent_options = {\n",
        "    # See https://manual.q-chem.com/5.4/topic_pcm-em.html for all methods\n",
        "    \"method\": \"IEF-PCM\",  # other available methods are COSMO, C-PCM, SS(V)PE\n",
        "    \"eps\": 78.3553,  # value for water\n",
        "}\n",
        "\n",
        "lucj_options = {\n",
        "    \"initial_layout\": [\n",
        "        0,\n",
        "        14,\n",
        "        18,\n",
        "        19,\n",
        "        20,\n",
        "        33,\n",
        "        39,\n",
        "        40,\n",
        "        41,\n",
        "        53,\n",
        "        60,\n",
        "        61,\n",
        "        2,\n",
        "        3,\n",
        "        4,\n",
        "        15,\n",
        "        22,\n",
        "        23,\n",
        "        24,\n",
        "        34,\n",
        "        43,\n",
        "        44,\n",
        "        45,\n",
        "        54,\n",
        "    ],\n",
        "    \"dynamical_decoupling_choice\": True,\n",
        "    \"twirling_choice\": True,\n",
        "    \"number_of_shots\": 200000,\n",
        "    \"optimization_level\": 2,\n",
        "}\n",
        "\n",
        "sqd_options = {\n",
        "    \"sqd_iterations\": 3,\n",
        "    \"number_of_batches\": 10,\n",
        "    \"samples_per_batch\": 1000,\n",
        "    \"max_davidson_cycles\": 200,\n",
        "}\n",
        "\n",
        "backend_name = \"ibm_sherbrooke\""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "01c0667c",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "39f8fb70-79b2-43ca-b723-84e6b6135821\n"
          ]
        }
      ],
      "source": [
        "job = template.run(\n",
        "    backend_name=backend_name,\n",
        "    molecule=molecule,\n",
        "    solvent_options=solvent_options,\n",
        "    lucj_options=lucj_options,\n",
        "    sqd_options=sqd_options,\n",
        ")\n",
        "print(job.job_id)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a9101a94",
      "metadata": {},
      "source": [
        "ジョブの詳細なステータスを確認する：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "id": "4385a34f",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "time = 2.35, status = DONE\n"
          ]
        }
      ],
      "source": [
        "import time\n",
        "\n",
        "t0 = time.time()\n",
        "status = job.status()\n",
        "if status == \"QUEUED\":\n",
        "    print(f\"time = {time.time()-t0:.2f}, status = QUEUED\")\n",
        "while True:\n",
        "    status = job.status()\n",
        "    if status == \"QUEUED\":\n",
        "        continue\n",
        "    print(f\"time = {time.time()-t0:.2f}, status = {status}\")\n",
        "    if status == \"DONE\" or status == \"ERROR\":\n",
        "        break"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4adc5293",
      "metadata": {},
      "source": [
        "ジョブの実行中に、 `logger.info` 出力から作成されたログをフェッチすることができる。 これらは、SQD IEF-PCMワークフローの進捗状況について実用的な情報を提供することができる。 例えば、同じスピン軌道の接続や、ハードウェア上での実行を意図した最終的なISA回路の2量子ビットの深さなどである。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a5b1f190",
      "metadata": {},
      "outputs": [],
      "source": [
        "print(job.logs())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ba179114",
      "metadata": {},
      "source": [
        "ジョブ結果を呼び出すと、結果が得られるまで残りのプログラムがブロックされる。 仕事が終わったら、結果を取り出すことができる。 これらには、溶媒和自由エネルギー、最低エネルギーバッチ、最低エネルギー値、およびソルバーの合計時間などのその他の有用な情報が含まれます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "id": "3500adce",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'total_energy_hist': array([[-115.14768518, -115.1368396 , -114.19181692, -115.13745429,\n",
              "         -115.1445012 , -114.19673326, -115.1547003 , -114.20563866,\n",
              "         -115.13748344, -115.14764974],\n",
              "        [-115.15768392, -115.15850126, -115.15857275, -115.15770916,\n",
              "         -115.15801684, -115.15822125, -115.15833521, -115.15844051,\n",
              "         -115.15735538, -115.15862354],\n",
              "        [-115.15795148, -115.15847925, -115.15856677, -115.15811156,\n",
              "         -115.15815602, -115.15785171, -115.1583672 , -115.1585533 ,\n",
              "         -115.15833528, -115.15808791]]),\n",
              " 'spin_squared_value_hist': array([[5.37327508e-03, 1.32981759e-02, 1.36214922e-02, 8.84413615e-03,\n",
              "         7.26723578e-03, 1.94875195e-02, 3.03153152e-03, 6.07543106e-03,\n",
              "         1.04951849e-02, 5.36529204e-03],\n",
              "        [6.39397528e-04, 1.36814350e-04, 9.09054260e-05, 5.99361358e-04,\n",
              "         3.64261739e-04, 2.54905866e-04, 2.32540370e-04, 1.53181990e-04,\n",
              "         7.23519739e-04, 6.80737671e-05],\n",
              "        [4.53776416e-04, 1.63043449e-04, 1.05317263e-04, 3.82912836e-04,\n",
              "         3.41047803e-04, 5.18620393e-04, 2.06819142e-04, 1.17086537e-04,\n",
              "         2.32357159e-04, 4.26071537e-04]]),\n",
              " 'solvation_free_energy_hist': array([[-0.00725018, -0.00743955, -0.01132905, -0.0073377 , -0.00722221,\n",
              "         -0.01136705, -0.00719279, -0.01072829, -0.00733404, -0.00725961],\n",
              "        [-0.00719252, -0.00718315, -0.00718074, -0.00719325, -0.00717703,\n",
              "         -0.00718391, -0.00718354, -0.00717928, -0.00719887, -0.0071801 ],\n",
              "        [-0.00719351, -0.00718255, -0.00718198, -0.00718429, -0.00718349,\n",
              "         -0.00718329, -0.0071882 , -0.00718363, -0.00718549, -0.00718814]]),\n",
              " 'occupancy_hist': [[array([0.99712298, 0.99278936, 0.99083163, 0.97328469, 0.98959809,\n",
              "          0.98922134, 0.720333  , 0.25683194, 0.01939338, 0.02840332,\n",
              "          0.00946988, 0.0327204 ]),\n",
              "   array([0.99712298, 0.99278936, 0.99083163, 0.97328469, 0.98959809,\n",
              "          0.98922134, 0.720333  , 0.25683194, 0.01939338, 0.02840332,\n",
              "          0.00946988, 0.0327204 ])],\n",
              "  [array([0.9959042 , 0.9922607 , 0.99018862, 0.99265843, 0.98927447,\n",
              "          0.9900833 , 0.99403876, 0.00989025, 0.01120814, 0.01137717,\n",
              "          0.01152871, 0.01158725]),\n",
              "   array([0.9959042 , 0.9922607 , 0.99018862, 0.99265843, 0.98927447,\n",
              "          0.9900833 , 0.99403876, 0.00989025, 0.01120814, 0.01137717,\n",
              "          0.01152871, 0.01158725])],\n",
              "  [array([0.99590079, 0.99222193, 0.99016753, 0.99265045, 0.98927264,\n",
              "          0.99007179, 0.99407207, 0.00986684, 0.01125181, 0.01141439,\n",
              "          0.01150733, 0.01160243]),\n",
              "   array([0.99590079, 0.99222193, 0.99016753, 0.99265045, 0.98927264,\n",
              "          0.99007179, 0.99407207, 0.00986684, 0.01125181, 0.01141439,\n",
              "          0.01150733, 0.01160243])]],\n",
              " 'lowest_energy_batch': 2,\n",
              " 'lowest_energy_value': -115.1585667736213,\n",
              " 'solvation_free_energy': -0.007181981952470838,\n",
              " 'sci_solver_total_duration': 493.997501373291,\n",
              " 'metadata': {'resources_usage': {'RUNNING: MAPPING': {'CPU_TIME': 6.080063343048096},\n",
              "   'RUNNING: OPTIMIZING_FOR_HARDWARE': {'CPU_TIME': 1.999896764755249},\n",
              "   'RUNNING: WAITING_FOR_QPU': {'CPU_TIME': 6.2850868701934814},\n",
              "   'RUNNING: EXECUTING_QPU': {'QPU_TIME': 21.639373540878296},\n",
              "   'RUNNING: POST_PROCESSING': {'CPU_TIME': 495.40831995010376}},\n",
              "  'num_iterations_executed': 3}}"
            ]
          },
          "execution_count": 16,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "result = job.result()\n",
        "\n",
        "result"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "94a2c921",
      "metadata": {},
      "source": [
        "結果のメタデータには、各ワークロードに必要なQPUとCPU時間をより適切に見積もることができるリソース使用サマリーが含まれていることに注意してください（この例はダミーデバイスで実行されたため、実際のリソース使用時間は異なる場合があります）。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "49d0b26d",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "ジョブが完了すると、ログ出力全体が利用可能になる。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "id": "ddcba564",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "2025-06-27 08:42:41,358\tINFO job_manager.py:531 -- Runtime env is setting up.\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:45,015: Starting runtime service\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:45,621: Backend: ibm_sherbrooke\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:46,809: Initializing molecule object\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:51,599: Performing CCSD\n",
            "Parsing /tmp/ray/session_2025-06-27_08-42-13_898146_1/runtime_resources/working_dir_files/_ray_pkg_4bc93dcc58c04b91/output_sqd_pcm/2025-06-27_08-42-45.fcidump.txt\n",
            "Overwritten attributes  get_ovlp get_hcore  of <class 'pyscf.scf.hf_symm.SymAdaptedRHF'>\n",
            "/usr/local/lib/python3.11/site-packages/pyscf/gto/mole.py:1293: UserWarning: Function mol.dumps drops attribute energy_nuc because it is not JSON-serializable\n",
            "  warnings.warn(msg)\n",
            "/usr/local/lib/python3.11/site-packages/pyscf/gto/mole.py:1293: UserWarning: Function mol.dumps drops attribute intor_symmetric because it is not JSON-serializable\n",
            "  warnings.warn(msg)\n",
            "converged SCF energy = -115.049680672847\n",
            "E(CCSD) = -115.1519910037652  E_corr = -0.1023103309180226\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:51,694: Same spin orbital connections: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11)]\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:51,694: Opposite spin orbital connections: [(0, 0), (4, 4), (8, 8)]\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:53,718: Optimization level: 2, ops: OrderedDict([('rz', 2438), ('sx', 1496), ('ecr', 766), ('x', 185), ('measure', 24), ('barrier', 1)]), depth: 391\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:53,736: Two-qubit gate depth: 94\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:53,737: Submitting sampler job\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:54,273: Job ID: d1f5j3lqbivc73ebqpj0\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:54,313: Job Status: QUEUED\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,813: Starting configuration recovery iteration 0\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,841: Batch 0 subspace dimension: 531441\n",
            "2025-06-27 08:43:24,844\tINFO worker.py:1588 -- Using address 172.17.16.124:6379 set in the environment variable RAY_ADDRESS\n",
            "2025-06-27 08:43:24,847\tINFO worker.py:1723 -- Connecting to existing Ray cluster at address: 172.17.16.124:6379...\n",
            "2025-06-27 08:43:24,876\tINFO worker.py:1908 -- Connected to Ray cluster. View the dashboard at \u001b[1m\u001b[32mhttp://172.17.16.124:8265 \u001b[39m\u001b[22m\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,945: Batch 1 subspace dimension: 519841\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,950: Batch 2 subspace dimension: 543169\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,955: Batch 3 subspace dimension: 532900\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,960: Batch 4 subspace dimension: 534361\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,964: Batch 5 subspace dimension: 531441\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,969: Batch 6 subspace dimension: 540225\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,974: Batch 7 subspace dimension: 524176\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,979: Batch 8 subspace dimension: 537289\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,983: Batch 9 subspace dimension: 540225\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:09,006: Lowest energy batch: 6\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:09,007: Lowest energy value: -115.15470029849135\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:09,007: Corresponding g_solv value: -0.0071927910374866375\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:09,007: -----------------------------------\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:09,007: Starting configuration recovery iteration 1\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,564: Batch 0 subspace dimension: 413449\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,572: Batch 1 subspace dimension: 399424\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,578: Batch 2 subspace dimension: 438244\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,583: Batch 3 subspace dimension: 422500\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,589: Batch 4 subspace dimension: 409600\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,596: Batch 5 subspace dimension: 404496\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,601: Batch 6 subspace dimension: 410881\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,605: Batch 7 subspace dimension: 442225\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,611: Batch 8 subspace dimension: 409600\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,618: Batch 9 subspace dimension: 405769\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:49:54,917: Lowest energy batch: 9\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:49:54,917: Lowest energy value: -115.15862353596414\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:49:54,917: Corresponding g_solv value: -0.0071800982859467006\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:49:54,918: -----------------------------------\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:49:54,918: Starting configuration recovery iteration 2\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,501: Batch 0 subspace dimension: 399424\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,508: Batch 1 subspace dimension: 412164\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,514: Batch 2 subspace dimension: 432964\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,519: Batch 3 subspace dimension: 400689\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,524: Batch 4 subspace dimension: 432964\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,529: Batch 5 subspace dimension: 418609\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,533: Batch 6 subspace dimension: 418609\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,538: Batch 7 subspace dimension: 425104\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,543: Batch 8 subspace dimension: 404496\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,548: Batch 9 subspace dimension: 429025\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:51:37,900: Lowest energy batch: 2\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:51:37,900: Lowest energy value: -115.1585667736213\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:51:37,901: Corresponding g_solv value: -0.007181981952470838\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:51:37,901: -----------------------------------\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:51:37,901: SCI_solver totally takes: 493.997501373291 seconds\n",
            "\n"
          ]
        }
      ],
      "source": [
        "print(job.logs())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bf0750f3",
      "metadata": {},
      "source": [
        "<span id=\"cite-this-project\" />\n",
        "\n",
        "## このプロジェクトを引用する\n",
        "\n",
        "研究でSQD IEF-PCMテンプレートをご利用になる場合は、詳細な引用情報について[リポジトリ](https://github.com/qiskit-community/qiskit-function-templates/tree/main/chemistry/sqd_pcm#citing-this-project)をご参照ください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d7cc1cb2",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"info\" title=\"推奨事項\">\n",
        "  * このワークフローの実例については、「 [Qiskit Serverless を使用した暗黙的溶媒計算](/docs/tutorials/implicit-solvent-calculations)」 のチュートリアルをご覧ください\n",
        "  * [ハミルトニアン](/docs/guides/function-template-hamiltonian-simulation)シミュレーション用の関数テンプレートの作成に関するガイドを確認してください\n",
        "  * このテンプレートのソースファイルは [GitHub](https://github.com/qiskit-community/qiskit-function-templates/tree/main/chemistry/sqd_pcm)\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "aabba015",
      "metadata": {},
      "source": [
        "<span id=\"references\" />\n",
        "\n",
        "#### 参照\n",
        "\n",
        "\\[1] Danil Kaliakin, Akhil Shajan, Fangchun Liang, and Kenneth M Merz Jr. [Implicit Solvent Sample-Based Quantum Diagonalization](https://pubs.acs.org/doi/10.1021/acs.jpcb.5c01030), The Journal of Physical Chemistry B, 2025, DOI： 10.1021/acs.jpcb.5c01030\n",
        "\n",
        "\\[2] ハビエル・ロブレド-モレノ、他、 [Chemistry Beyond Exact Solutions on Quantum-Centric Supercomputer](https://arxiv.org/abs/2405.05068), arXiv:2405.05068 \\[quant-ph].\n",
        "\n",
        "\\[3] ジェフェリー・ユー、他 [Quantum-Centric Algorithm for Sample-Based Krylov Diagonalization](https://arxiv.org/abs/2501.09702), arXiv:2501.09702 \\[quant-ph].\n",
        "\n",
        "\\[4] 菅野恵太、他、 [量子選択配置相互作用：量子コンピュータによって選択された部分空間におけるハミルトニアンの古典的対角化](https://arxiv.org/abs/2302.11320), arXiv:2302.11320 \\[quant-ph].\n",
        "\n",
        "\\[5] 杉崎健次、他、 [Hamiltonian simulation-based quantum-selected configuration interaction for large-scale electronic structure calculations with quantum computer](https://arxiv.org/abs/2412.07218), arXiv:2412.07218 \\[quant-ph].\n",
        "\n",
        "\\[6] Mathias Mikkelsen, Yuya O. Nakagawa, [Quantum-selected configuration interaction with time-evolved state](https://arxiv.org/abs/2412.13839), arXiv:2412.13839 \\[quant-ph].\n",
        "\n",
        "\\[7] Herbert, John M. [量子化学のための誘電体連続体法。 WIREs Computational Molecular Science](https://wires.onlinelibrary.wiley.com/doi/10.1002/wcms.1519), 2021, 11, 1759-0876.\n",
        "\n",
        "\\[8] サキ、A． バリソン、S； フラー、B； ギャリソン J. R； グリック J. R； ジョンソン、C； メッツァカポ、A； ロブレド-モレノ、J； ロスマネク、M； Schweigert, P. et al. Qiskitアドオン：サンプルベースの量子対角化、2024年； [https://github.com/Qiskit/qiskit-addon-sqd](https://github.com/Qiskit/qiskit-addon-sqd)\n",
        "\n",
        "\\[9] Asun, Q； Zhang, X； バネルジー、S； バオ、P； バーバリー、M； ブラント、N． ボグダノフ、N. A； ブース、G． チェン、J； Cui, Z.-H. PySCF: Python -化学フレームワークのシミュレーション、2025年 [https://github.com/pyscf/pyscf](https://github.com/pyscf/pyscf)\n",
        "\n",
        "\\[10] Kevin J. Sung; et al、 FFSIM：フェルミオン量子回路のシミュレーションの高速化、2024年 [https://github.com/qiskit-community/ffsim](https://github.com/qiskit-community/ffsim)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}