{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f7d9993f",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Iskay Quantum Optimizer - Kipu QuantumによるQiskit関数\"\n",
        "description: \"Kipu QuantumのIskay Quantum Optimizerで最適化問題を効率的に解決。 IBM で利用可能 Qiskit Functions Catalog\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore Kipu, DCQO, QUBO, HUBO, counterdiabatic, Iskay, bitflips, Cadavid, Chandarana */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "dde95705",
      "metadata": {},
      "source": [
        "<span id=\"iskay-quantum-optimizer---a-qiskit-function-by-kipu-quantum\" />\n",
        "\n",
        "# Iskay Quantum Optimizer - Kipu QuantumによるQiskit関数\n",
        "\n",
        "*[APIリファレンス](/docs/api/functions/kipu-optimization)を参照してください*\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "61da1dd5",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c60ba821",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\" title=\"注\">\n",
        "  * Qiskit 関数は、 IBM Quantum® Premium Plan、Flex Plan、およびオンプレム ( IBM Quantum Platform API 経由) Plan ユーザーだけが利用できる実験的な機能です。 これらはプレビューリリースの状態であり、変更される可能性がある。\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"overview\" />\n",
        "\n",
        "## 概要\n",
        "\n",
        "Kipu Quantum社のIskay Quantum Optimizerを使えば、 IBM® 量子コンピュータを使って複雑な最適化問題に取り組むことができる。 このソルバーは、キプの最先端の [bf-DCQOアルゴリズムを](https://doi.org/10.48550/arXiv.2409.04477)活用し、目的関数のみを入力として問題の解を自動的に提供します。 最大156量子ビットを含む最適化問題を扱うことができ、 IBM 量子デバイスのすべての量子ビットを使用することができる。 オプティマイザーは、古典的変数と量子ビット間の 1-to-1 マッピングを使用し、最大156個のバイナリ変数を持つ最適化問題に取り組むことができます。\n",
        "\n",
        "オプティマイザーは、制約のない2値最適化問題を解くことができます。 一般的に使用されているQUBO（2次制約なし2値最適化）定式化に加え、高次（HUBO）最適化問題もサポートしています。 ソルバーは非変数量子アルゴリズムを利用し、計算のほとんどを量子デバイス上で実行する。\n",
        "\n",
        "以下では、使用したアルゴリズムの詳細と、関数の使用方法に関する簡単なガイド、およびサイズや複雑さの異なる様々な問題インスタンスに関するベンチマーク結果を提供する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5f761442",
      "metadata": {},
      "source": [
        "<span id=\"description\" />\n",
        "\n",
        "## 説明\n",
        "\n",
        "オプティマイザーは、最先端の量子最適化アルゴリズムをすぐに使えるように実装したものです。 量子ハードウェア上で高度に圧縮された量子回路を実行することで、最適化問題を解決する。 この圧縮は、量子系の基本的な時間発展に対断熱項を導入することで達成される。 このアルゴリズムは、最終的な解を得るためにハードウェアの実行を何度か繰り返し、後処理と組み合わせる。 これらのステップは、オプティマイザーのワークフローにシームレスに統合され、自動的に実行される。\n",
        "\n",
        "<span id=\"how-does-the-quantum-optimizer-work\" />\n",
        "\n",
        "### 量子オプティマイザーはどのように機能しますか？\n",
        "\n",
        "このセクションでは、実装されたbf-DCQOアルゴリズムの基本概要を説明する。 アルゴリズムの概要は[、Qiskitの YouTube チャンネル](https://www.youtube.com/watch?v=33QmsXhIlpU\\&t=1223s)でもご覧いただけます。\n",
        "\n",
        "このアルゴリズムは、時間と共に変換される量子系の時間発展に基づいており、問題解決は、時間発展の終わりにおける量子系の基底状態に符号化される。 [断熱定理に](https://en.wikipedia.org/wiki/Adiabatic_theorem)よれば、系が基底状態に留まるためには、この進化はゆっくりでなければならない。 この進化をデジタル化することが、デジタル化量子断熱計算（DQA）と悪名高いQAOAアルゴリズムの基礎となっている。 しかし、問題サイズが大きくなると、回路の深さが大きくなるため、必要な低速進化は実現不可能である。 対断熱プロトコルを使用することで、基底状態を維持したまま、短い進化時間で発生する不要な励起を抑制することができる。 ここでは、この短い進化時間をデジタル化することで、量子回路の奥行きが短くなり、エンタングルゲートの数が少なくなる。\n",
        "\n",
        "bf-DCQOアルゴリズムの回路は、通常、DQAよりも最大10倍、標準的なQAOA実装よりも3～4倍少ないエンタングルゲートを使用する。 ゲート数が少ないため、ハードウェア上での回路実行中に発生するエラーは少ない。 したがって、オプティマイザはエラー抑制やエラー緩和のような技術を使う必要がない。 将来のバージョンでこれらを実装すれば、ソリューションの質をさらに高めることができる。\n",
        "\n",
        "bf-DCQOアルゴリズムは反復を用いるが、非変数的である。 アルゴリズムの各反復の後、状態の分布が測定される。 得られた分布は、いわゆるバイアス磁場を計算するのに使われる。 バイアス・フィールドは、次の反復を、以前に発見された解に近いエネルギー状態から開始することを可能にする。 このようにして、アルゴリズムは反復するごとに、よりエネルギーの低い解へと移動する。 通常、解に収束するには約10回の反復で十分であり、合計で約100回の反復を必要とする変分アルゴリズムよりもはるかに少ない反復回数で済む。\n",
        "\n",
        "このオプティマイザは、bf-DCQOアルゴリズムと古典的な後処理を組み合わせたものである。 状態の分布を測定した後、局所的な探索が行われる。 局所探索の間、測定された解のビットはランダムに反転される。 フリップの後、新しいビット列のエネルギーが評価される。 エネルギーが小さければ、そのビット列は新しい解として保存される。 局所探索は量子ビット数に対して線形にスケールするだけである。 後処理は局所的なビット反転を修正するため、ハードウェアの不完全性や読み出しエラーに起因するビット反転エラーを補正することができる。\n",
        "\n",
        "<span id=\"workflow\" />\n",
        "\n",
        "### ワークフロー\n",
        "\n",
        "量子オプティマイザーのワークフローの概略図を以下に示す。\n",
        "\n",
        "![ワークフロー](https://quantum.cloud.ibm.com/docs/images/guides/kipu-optimization/workflow.svg \"量子オプティマイザーのワークフロー\")\n",
        "\n",
        "量子オプティマイザーを使用することで、量子ハードウェア上で最適化問題を解くのは以下のようになります\n",
        "\n",
        "* 問題の目的関数を定式化する\n",
        "* Qiskitファンクションからオプティマイザにアクセスする\n",
        "* オプティマイザを実行し、結果を収集する\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b34fe075",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "## ベンチマーク\n",
        "\n",
        "以下のベンチマーク・メトリクスは、オプティマイザーが最大156量子ビットを含む問題に効果的に対処していることを示しており、さまざまな問題タイプにおけるオプティマイザーの精度とスケーラビリティの概要を示しています。 実際の性能指標は、変数の数、目的関数の項の密度や局所性、多項式の次数など、特定の問題特性によって異なる可能性があることに注意してください。\n",
        "\n",
        "以下の表には、以下のように定義された指標である近似比（AR）が含まれている：\n",
        "\n",
        "$$\n",
        "AR = \\frac{C^{*} - C_\\textrm{max}}{C_{\\textrm{min}} - C_{\\textrm{max}}},\n",
        "$$\n",
        "\n",
        "ここで、 $C$ は目的関数、 $C_{\\textrm{min}}$、 $C_{\\textrm{max}}$ はその最小値と最大値、 $C^{*}$ はそれぞれ見つかった最適解のコストである。 したがって、 AR=100%、問題の基底状態が得られたことを意味する。\n",
        "\n",
        "| 例           | 量子ビット数 |  近似比 | 合計回数 | ランタイム使用量 (s) | 合計ショット数 | 反復数 |\n",
        "| ----------- | :----: | :--: | :--: | :----------: | :-----: | :-: |\n",
        "| 加重なし MaxCut |   28   | 100％ |  180 |    30時間まで    |   30k   |  5  |\n",
        "| 加重なし MaxCut | 30時間まで | 100％ |  180 |    30時間まで    |   30k   |  5  |\n",
        "| 加重なし MaxCut |   32   | 100％ |  180 |    30時間まで    |   30k   |  5  |\n",
        "| 加重なし MaxCut |   80   | 100％ |  480 |      60      |   90k   |  9  |\n",
        "| 加重なし MaxCut |   100  | 100％ |  330 |      60      |   60k   |  6  |\n",
        "| 加重なし MaxCut |   120  | 100％ |  370 |      60      |   60k   |  6  |\n",
        "| ヒューボ1       |   156  | 100％ |  600 |      70      |   100k  |  10 |\n",
        "| ヒューボ2       |   156  | 100％ |  600 |      70      |   100k  |  10 |\n",
        "\n",
        "* 28、30、32量子ビットの MaxCut インスタンスがibm\\_sherbrookeで実行された。 80、100、120のインスタンスがHeron r2 プロセッサで実行された。\n",
        "* HUBOインスタンスもHeron r2 プロセッサ上で実行された。\n",
        "\n",
        "すべてのベンチマーク・インスタンスは GitHub （ [Kipu benchmark instancesを](https://github.com/Kipu-Quantum-GmbH/benchmark-instances)参照）でアクセスできる。 これらのインスタンスを実行する例は、 [例3：ベンチマーク・インスタンスに](#example-3-benchmark-instances)ある。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "73390a19",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "## 使用を開始する\n",
        "\n",
        "このドキュメントでは、Iskay Quantum Optimizerの使用手順について説明します。 この過程で、カタログから関数をロードする方法と、問題を有効な入力に変換する方法を素早く示しつつ、さまざまなオプションパラメータを試す方法も説明します。\n",
        "\n",
        "より詳細な例については、チュートリアル 「[Kipu QuantumのIskay Quantum Optimizerで市場分割問題を解決する](/docs/tutorials/solve-market-split-problem-with-iskay-quantum-optimizer) 」をご覧ください。ここでは、Iskay Solverを使用して市場分割問題に取り組む全プロセスを解説します。この問題は、需要目標を正確に満たすために市場をバランスの取れた販売地域に分割しなければならないという、現実世界の資源配分課題を表現しています。\n",
        "\n",
        "[IBM Quantum Platformダッシュボードに](http://quantum.cloud.ibm.com/)あるAPIキーを使用して認証し、以下のようにQiskit Functionを選択します：\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e5cd4ac8",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\">\n",
        "  以下のコードは、認証情報を保存済みであることを前提としています。 まだ行っていない場合は、「 [IBM Cloud アカウントの保存](/docs/guides/functions-get-started#install-qiskit-functions-catalog-client) 」の手順に従って、APIキーによる認証を行ってください。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "68d3ecea-f7e3-4b4b-b299-1670abc72415",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[QiskitFunction(qunova/hivqe-chemistry),\n",
              " QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),\n",
              " QiskitFunction(algorithmiq/tem),\n",
              " QiskitFunction(qedma/qesem),\n",
              " QiskitFunction(multiverse/singularity),\n",
              " QiskitFunction(ibm/circuit-function),\n",
              " QiskitFunction(q-ctrl/optimization-solver),\n",
              " QiskitFunction(colibritd/quick-pde),\n",
              " QiskitFunction(q-ctrl/performance-management),\n",
              " QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "catalog = QiskitFunctionsCatalog(\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",
        "# verify that you have access to the function\n",
        "catalog.list()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "95a715d2",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Access Function\n",
        "optimizer = catalog.load(\"kipu-quantum/iskay-quantum-optimizer\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4a8e24f7",
      "metadata": {},
      "source": [
        "<span id=\"custom-configuration-example\" />\n",
        "\n",
        "## カスタム設定の例\n",
        "\n",
        "Iskayをさまざまな設定で構成する方法は以下の通りです：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "712dbae3",
      "metadata": {},
      "outputs": [],
      "source": [
        "custom_options = {\n",
        "    \"shots\": 15_000,  # Higher shot count for better statistics\n",
        "    \"num_iterations\": 12,  # More iterations for solution refinement\n",
        "    \"preprocessing_level\": 1,  # Light preprocessing for problem simplification\n",
        "    \"postprocessing_level\": 2,  # Maximum postprocessing for solution quality\n",
        "    \"transpilation_level\": 3,  # Use higher transpilation level to optimize circuit\n",
        "    \"seed_transpiler\": 42,  # Fixed seed for reproducible results\n",
        "    \"job_tags\": [\"custom_config\"],  # Custom tracking tags\n",
        "}"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "50690350",
      "metadata": {},
      "source": [
        "**シード最適化** : 注記: はデフォルト `seed_transpiler``None` で に設定されています。 これによりトランスパイラの自動最適化プロセスが可能になります。 システムは複数のシードで試行を開始し `None`、各トランスパイレーションレベルにおいてパラメータ `max_trials` の全能力を活用しながら、最適な回路深さを生み出すシードを選択します。\n",
        "\n",
        "**トランスパイル時のパフォーマンス** : の値を高く設定して `max_trials` の数を増やすと `transpilation_level` 、トランスパイル時間は必然的に増加しますが、最終的な回路が必ずしも変化するとは限りません。これは回路の構造と複雑さに大きく依存します。 ただし、一部の回路や問題では、10回の試行（レベル1）と50回の試行（レベル5）の差が劇的になる場合があり、これらのパラメータを探索することが解決策を成功裏に見つける鍵となる可能性があります。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d4ca2590",
      "metadata": {},
      "source": [
        "<span id=\"example-1-simple-cost-function\" />\n",
        "\n",
        "## 例1: 単純なコスト関数\n",
        "\n",
        "スピン定式化のコスト関数を考えてみよう：\n",
        "\n",
        "$$\n",
        "C(x_0, x_1, x_2, x_3, x_4) = 1 + 1.5x_0 + 2x_1 + 1.3x_2 + 2.5x_0x_3 + 3.5x_1x_4 + 4x_0x_1x_2\n",
        "$$\n",
        "\n",
        "ここで $(x_0, ..., x_4) \\in \\{-1, 1\\}^5$。\n",
        "\n",
        "この単純なコスト関数の解は\n",
        "\n",
        "$$\n",
        "(x_0, x_1, x_2, x_3, x_4) = (-1, -1, -1, 1, 1)\n",
        "$$\n",
        "\n",
        "最小値 $C^{*} = -6$\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a98e8232",
      "metadata": {},
      "source": [
        "<span id=\"1-create-the-objective-function\" />\n",
        "\n",
        "### 1. 目的関数を作成する\n",
        "\n",
        "まず、目的関数の係数を持つ辞書を以下のように作成する：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "3b4a58b1",
      "metadata": {},
      "outputs": [],
      "source": [
        "objective_func = {\n",
        "    \"()\": 1,\n",
        "    \"(0,)\": 1.5,\n",
        "    \"(1,)\": 2,\n",
        "    \"(2,)\": 1.3,\n",
        "    \"(0, 3)\": 2.5,\n",
        "    \"(1, 4)\": 3.5,\n",
        "    \"(0, 1, 2)\": 4,\n",
        "}"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ab63b08f",
      "metadata": {},
      "source": [
        "<span id=\"2-run-the-optimizer\" />\n",
        "\n",
        "### 2. オプティマイザを実行する\n",
        "\n",
        "オプティマイザーを実行することで問題を解決する。 $(x_0, ..., x_4) \\in \\{-1, 1\\}^5$ なので、 `problem_type=spin` を設定しなければならない。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "469ae361",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Setup options to run the optimizer\n",
        "options = {\"shots\": 5000, \"num_iterations\": 5, \"use_session\": True}\n",
        "\n",
        "arguments = {\n",
        "    \"problem\": objective_func,\n",
        "    \"problem_type\": \"spin\",\n",
        "    \"backend_name\": backend_name,  # such as \"ibm_fez\"\n",
        "    \"options\": options,\n",
        "}\n",
        "\n",
        "job = optimizer.run(**arguments)\n",
        "\n",
        "# Print the ID so you can use it later, if necessary\n",
        "print(job.job_id)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1e3a8542",
      "metadata": {},
      "source": [
        "<span id=\"3-retrieve-the-result\" />\n",
        "\n",
        "### 3. 結果を取得する\n",
        "\n",
        "最適化問題の解は、オプティマイザーから直接提供される。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "2f74d7e2",
      "metadata": {},
      "outputs": [],
      "source": [
        "print(job.result())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c4d0a0f8",
      "metadata": {},
      "source": [
        "これで辞書が表示される：\n",
        "\n",
        "```\n",
        "{'solution': {'0': -1, '1': -1, '2': -1, '3': 1, '4': 1},\n",
        " 'solution_info': {'bitstring': '11100',\n",
        "  'cost': -13.8,\n",
        "  'seed_transpiler': 42,\n",
        "  'mapping': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}},\n",
        " 'prob_type': 'spin'}\n",
        "```\n",
        "\n",
        "辞書 `solution` は、結果ベクトル $(x_0, x_1, x_2, x_3, x_4) = (-1, -1, -1, 1, 1)$ を表示していることに注目されたい。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7eaa5cac",
      "metadata": {},
      "source": [
        "<span id=\"example-2-maxcut\" />\n",
        "\n",
        "## 例2: MaxCut\n",
        "\n",
        "MaxCut や最大独立集合のような多くのグラフ問題はNP困難問題であり、量子アルゴリズムやハードウェアのテストに理想的な候補である。 この例では、3-正則グラフの MaxCut 問題を Quantum Optimizer で解く例を示します。\n",
        "\n",
        "この例を実行するには、 `qiskit-ibm-catalog` に加えて、 `networkx` パッケージをインストールする必要があります。 インストールするには、以下のコマンドを実行します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "9ea6d138",
      "metadata": {},
      "outputs": [],
      "source": [
        "# %pip install networkx numpy"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0c63487f",
      "metadata": {},
      "source": [
        "<span id=\"1-create-the-objective-function\" />\n",
        "\n",
        "### 1. 目的関数を作成する\n",
        "\n",
        "ランダムな3-正則グラフを生成することから始める。 このグラフについて、 MaxCut 問題の目的関数を定義する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "d1d4017f",
      "metadata": {},
      "outputs": [],
      "source": [
        "import networkx as nx\n",
        "\n",
        "# Create a random 3-regular graph\n",
        "G = nx.random_regular_graph(3, 10, seed=42)\n",
        "\n",
        "\n",
        "# Create the objective function for MaxCut in Ising formulation\n",
        "def graph_to_ising_maxcut(G):\n",
        "    \"\"\"\n",
        "    Convert a NetworkX graph to an Ising Hamiltonian for the max-cut problem.\n",
        "    Args:\n",
        "        G (networkx.Graph): The input graph.\n",
        "    Returns:\n",
        "        dict: The objective function of the Ising model\n",
        "    \"\"\"\n",
        "    # Initialize the linear and quadratic coefficients\n",
        "    objective_func = {}\n",
        "    # Populate the coefficients\n",
        "    for i, j in G.edges:\n",
        "        objective_func[f\"({i}, {j})\"] = 0.5\n",
        "    return objective_func\n",
        "\n",
        "\n",
        "objective_func = graph_to_ising_maxcut(G)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3be09664",
      "metadata": {},
      "source": [
        "<span id=\"2-run-the-optimizer\" />\n",
        "\n",
        "### 2. オプティマイザを実行する\n",
        "\n",
        "オプティマイザを実行して問題を解決する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "2499ab67",
      "metadata": {},
      "outputs": [],
      "source": [
        "options = {\"shots\": 5000, \"num_iterations\": 5, \"use_session\": True}\n",
        "\n",
        "arguments = {\n",
        "    \"problem\": objective_func,\n",
        "    \"problem_type\": \"spin\",\n",
        "    \"backend_name\": backend_name,  # such as \"ibm_fez\"\n",
        "    \"options\": options,\n",
        "}\n",
        "\n",
        "job = optimizer.run(**arguments)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3548f6dc",
      "metadata": {},
      "source": [
        "<span id=\"3-retrieve-the-result\" />\n",
        "\n",
        "### 3. 結果を取得する\n",
        "\n",
        "結果を取得し、解のビット列を元のグラフ・ノードにマップする。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "169cbd6e",
      "metadata": {},
      "outputs": [],
      "source": [
        "print(job.result())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7f22d66a",
      "metadata": {},
      "source": [
        "マックスカット問題の解は、結果オブジェクトの `solution` サブディクショナリに直接含まれる\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "38309554",
      "metadata": {},
      "outputs": [],
      "source": [
        "maxcut_solution = job.result()[\"solution\"]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "19a664c4",
      "metadata": {},
      "source": [
        "<span id=\"example-3-benchmark-instances\" />\n",
        "\n",
        "## 例3: ベンチマークインスタンス\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "98545ce3",
      "metadata": {},
      "source": [
        "ベンチマークインスタンスは、 GitHub: [Kipu benchmark instances](https://github.com/Kipu-Quantum-GmbH/benchmark-instances) で利用可能です。\n",
        "\n",
        "インスタンスは、 `pygithub` ライブラリを使ってロードできる。 インストールするには、以下のコマンドを実行します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "1d8777e4",
      "metadata": {},
      "outputs": [],
      "source": [
        "# %pip install pygithub"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e3a03447",
      "metadata": {},
      "source": [
        "ベンチマーク・インスタンスのパスは以下の通り：\n",
        "\n",
        "**マックスカット**\n",
        "\n",
        "* `'maxcut/maxcut_regular_3_100_nodes_weighted.json'`\n",
        "* `'maxcut/maxcut_regular_3_140_nodes_weighted.json'`\n",
        "* `'maxcut/maxcut_regular_3_150_nodes_weighted.json'`\n",
        "* `'maxcut/maxcut_regular_4_130_nodes_weighted.json'`\n",
        "\n",
        "**HUBO**\n",
        "\n",
        "* `'HUBO/hubo1_marrakesh.json'`\n",
        "* `'HUBO/hubo2_marrakesh.json'`\n",
        "\n",
        "HUBOインスタンスのベンチマークのパフォーマンスを再現するには、バックエンド `ibm_marrakesh` を選択し、 `options` サブディクショナリで `direct_qubit_mapping` を `True` に設定する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "adbed9be",
      "metadata": {},
      "source": [
        "次の例では、150ノードのMaxcutインスタンスを実行します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "da681a18",
      "metadata": {},
      "outputs": [],
      "source": [
        "from github import Github\n",
        "import urllib\n",
        "import json\n",
        "import ast\n",
        "\n",
        "repo = \"Kipu-Quantum-GmbH/benchmark-instances\"\n",
        "path = \"maxcut/maxcut_regular_3_150_nodes_weighted.json\"\n",
        "gh = Github()\n",
        "repo = gh.get_repo(repo)\n",
        "branch = \"main\"\n",
        "file = repo.get_contents(urllib.parse.quote(path), ref=branch)\n",
        "\n",
        "# load json file with benchmark problem\n",
        "problem_json = json.loads(file.decoded_content)\n",
        "\n",
        "# convert objective function to compatible format\n",
        "objective_func = {\n",
        "    key: ast.literal_eval(value) for key, value in problem_json.items()\n",
        "}\n",
        "\n",
        "\n",
        "# Setup configuration to run the optimizer\n",
        "options = {\n",
        "    \"shots\": 5_000,\n",
        "    \"num_iterations\": 5,\n",
        "    \"use_session\": True,\n",
        "    \"direct_qubit_mapping\": False,\n",
        "}\n",
        "\n",
        "arguments = {\n",
        "    \"problem\": objective_func,\n",
        "    \"problem_type\": \"spin\",\n",
        "    \"backend_name\": \"<BACKEND-NAME>\",\n",
        "    \"options\": options,\n",
        "}\n",
        "\n",
        "job = optimizer.run(**arguments)\n",
        "\n",
        "result = job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "664476ff",
      "metadata": {},
      "source": [
        "<span id=\"use-cases\" />\n",
        "\n",
        "## ユース・ケース\n",
        "\n",
        "Optimizationソルバーの典型的な使用例は、組み合わせ最適化問題です。 金融、製薬、物流など、さまざまな業界の問題を解決することができます。 いくつか例を挙げよう。\n",
        "\n",
        "* ポートフォリオ最適化（QUBO）： [科学的発表と](https://doi.org/10.1103/PhysRevApplied.22.054037) [ホワイトペーパー](https://kipu-quantum.com/zope64/kipu_2024/content/e3915/e3916/e4187/White-Paper-2-Financial-modeling-on-quantum-computers-using-digitally-compressed-algorithms-1.pdf)\n",
        "* タンパク質フォールディング（HUBO）： [科学的発表](https://doi.org/10.1103/PhysRevApplied.20.014024)\n",
        "* ロジスティクス・スケジューリング（QUBO）： [科学的発表](https://doi.org/10.1103/PhysRevApplied.22.064068)\n",
        "* ネットワーク最適化： [ウェビナー](https://www.youtube.com/watch?v=w5SrCIK88No)\n",
        "* 市場分割（QUBO）： [チュートリアル](/docs/tutorials/solve-market-split-problem-with-iskay-quantum-optimizer)\n",
        "\n",
        "特定のユースケースに取り組み、専用のマッピングを開発することにご興味があれば、当社が支援いたします。 [お問い合わせください](https://share-eu1.hsforms.com/2Ff8cgWvTR9ukT_fPoaNhDw2dqpz5)。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e9ec2e67",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "## サポートの利用\n",
        "\n",
        "サポートに関するお問い合わせ [support@kipu-quantum.com](mailto:support@kipu-quantum.com).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a6a25c8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "* [Kipu Quantum社のQuantum Optimizerへのアクセス権を申請してください](https://share-eu1.hsforms.com/2Ff8cgWvTR9ukT_fPoaNhDw2dqpz5)。\n",
        "* このQiskit関数の [APIリファレンス](/docs/api/functions/kipu-optimization)をご覧ください。\n",
        "* [キプ・クォンタムの「Iskay Quantum Optimizer](/docs/tutorials/solve-market-split-problem-with-iskay-quantum-optimizer) 」チュートリアルで、市場分割問題を解いてみましょう。\n",
        "* レビュー [ロメロ, S. V., et al. (2025).  高次二項最適化のためのバイアス場デジタル化対抗的量子アルゴリズム arXiv プレプリント arXiv:2409.04477](https://arxiv.org/abs/2409.04477).\n",
        "* レビュー [カダヴィッド, A. G., et al. (2024).  バイアス場デジタル化対熱力学量子最適化 arXiv プレプリント arXiv:2405.13898](https://arxiv.org/abs/2405.13898).\n",
        "* チャンドラナ、 [P. をレビューする et al. (2025).  デジタル量子最適化による実行時量子優位性 arXiv プレプリント arXiv:2505.08663](https://arxiv.org/abs/2505.08663).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f73ef6c4",
      "metadata": {},
      "source": [
        "<span id=\"additional-information\" />\n",
        "\n",
        "## 詳細情報\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "52b5221c",
      "metadata": {},
      "source": [
        "イスカイ」は、私たちの社名「キプ・クァンタム」と同じく、ペルーの言葉だ。 私たちはドイツ発のスタートアップですが、この言葉は共同創業者の一人の祖国に由来しています。クイップーは紀元前2000年に人類が開発した最初の計算機のひとつです。\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
}