OpenJij/OpenJij

View on GitHub
docs/tutorial/ja/physics/QuantumSystem.ipynb

Summary

Maintainability
Test Coverage
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# core interfaceを用いた量子イジング模型の数値シミュレーション"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "view-in-github"
   },
   "source": [
    "このチュートリアルでは、OpenJijのcore interfaceを用いた、量子 (主に横磁場)効果の入ったイジング模型の数値シミュレーションを行います。\n",
    "まずはGraphを定義し、数値シミュレーションを行う系の$J_{ij}, h_i$を定義します。\n",
    "今回は、[古典イジング模型の場合](./A003-LargeScaleMC.ipynb)にも扱った、ランダム相互作用およびランダムな縦磁場をもつ系のシミュレーションを行なっていきます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "import openjij.cxxjij.graph as G\n",
    "#問題サイズを100とします。\n",
    "N = 100\n",
    "\n",
    "graph = G.Dense(N)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "mu, sigma = 0, 1\n",
    "\n",
    "for i in range(N):\n",
    "    for j in range(N):\n",
    "        #Jijの値が大きくなりすぎてしまうので、全体の係数を1/Nしています。\n",
    "        graph[i,j] = 0 if i == j else np.random.normal()/N\n",
    "\n",
    "for i in range(N):\n",
    "    graph[i] = np.random.normal()/N"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "グラフの設定方法は前章の古典イジング模型の場合と同じです。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## システムの設定 横磁場イジング模型\n",
    "\n",
    "今回はシステムに横磁場イジング模型\n",
    "\n",
    "$$\n",
    "H = s \\left(\\sum_{i<j}J_{ij}\\sigma_i^z \\sigma_j^z + \\sum_{i=1}^{N}h_i \\sigma_i^z \\right) - \\sum_{i=1}\\Gamma (1-s) \\sigma_i^x \n",
    "$$\n",
    "\n",
    "を用います。\n",
    "\n",
    "$\\Gamma$は固定されたまま、$\\beta$、$s$を変化させて量子モンテカルロ法を行います。\n",
    "デフォルトでは鈴木・トロッター分解による量子モンテカルロ法が実装されています。\n",
    "\n",
    "> 連続虚時間量子モンテカルロ法も用意してはいますが、現在試験的実装となっています。\n",
    "\n",
    "まずはシステムを生成してみます。`system.make_transverse_ising`で生成できます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import openjij.cxxjij.system as S\n",
    "\n",
    "mysystem = S.make_transverse_ising(graph.gen_spin(), graph, 1.0, 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ここで、1つ目の引数にはスピン列を、2つ目にはグラフ、3つ目には$\\Gamma$の値、4つ目にはtrotterスライスの数を入力します。\n",
    "これで、全てのtrotterスライスが `graph.gen_spin()`で初期化されたシステムができます。\n",
    "\n",
    "`mysystem.trotter_spins`で全てのtrotterスピンを表示します。縦方向が空間方向、横方向がtrotter方向です。\n",
    "全てのtrotterスライスが同じスピンで初期化されていることがわかります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [-1. -1. -1. -1.]\n",
      " [ 1.  1.  1.  1.]]\n"
     ]
    }
   ],
   "source": [
    "print(mysystem.trotter_spins)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> `graph.gen_spin()`の代わりに上の二重Listを入れて直接trotterスピンを初期化することができます。\n",
    "\n",
    "## アルゴリズムの実行 -Updater, Algorithm-\n",
    "\n",
    "### Updater\n",
    "\n",
    "量子モンテカルロ法に対しては、現状\n",
    "\n",
    "* SingleSpinFlip (メトロポリス・ヘイスティング法によるスピン1つずつのアップデート)\n",
    "\n",
    "が使用可能です。\n",
    "\n",
    "### Algorithm\n",
    "\n",
    "#### スケジュールリスト\n",
    "\n",
    "スケジュールリストは`(パラメータ, モンテカルロステップ数)`のリストで与えられ、横磁場イジングモデルに対しては(($\\beta$, $s$), モンテカルロステップ数)で与えます。例として以下のように設定してみましょう。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "schedule_list = [((10, 0.1), 10),((12, 0.3), 80),((10, 0.8), 30)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "この場合、逆温度$\\beta=10, s=0.1$で10モンテカルロステップ、$\\beta=12, s=0.3$で80ステップ、$\\beta=0.1, s=0.8$で30ステップの計120モンテカルロステップを実行することを意味します。  \n",
    "アニーリングを実行するにあたっては、以下のように`utility`にある`make_transeverse_field_schedule_list`を使うとより便利です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[((beta: 10.000000, s: 0.000000) mcs: 20), ((beta: 10.000000, s: 0.111111) mcs: 20), ((beta: 10.000000, s: 0.222222) mcs: 20), ((beta: 10.000000, s: 0.333333) mcs: 20), ((beta: 10.000000, s: 0.444444) mcs: 20), ((beta: 10.000000, s: 0.555556) mcs: 20), ((beta: 10.000000, s: 0.666667) mcs: 20), ((beta: 10.000000, s: 0.777778) mcs: 20), ((beta: 10.000000, s: 0.888889) mcs: 20), ((beta: 10.000000, s: 1.000000) mcs: 20)]\n"
     ]
    }
   ],
   "source": [
    "import openjij.cxxjij.utility as U\n",
    "schedule_list = U.make_transverse_field_schedule_list(10, 20, 10)\n",
    "print(schedule_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上の例では$\\beta=10$で固定しながら$s=0$から$s=1$まで、各パラメータで20モンテカルロステップ計算しながら10段階で$s$を変えていく設定例です。計200モンテカルロステップの計算を行います。\n",
    "$s$の変化については[Morita, Nishimori (2008)](https://aip.scitation.org/doi/10.1063/1.2995837)の手法を適用しています。\n",
    "\n",
    "#### Algorithmの実行\n",
    "\n",
    "続いて、Algorithmを実行します。前章と全く同じように書けます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import openjij.cxxjij.algorithm as A\n",
    "A.Algorithm_SingleSpinFlip_run(mysystem, schedule_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "前章と同じようにcallbackを使ってみましょう。横磁場イジング模型の場合は、システムとパラメータ (逆温度$\\beta$、$s$)を引数を持つ関数を作成すれば良いです。  \n",
    "例として、以下ではシステムのエネルギーの値を記録するcallbackを作っています。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "energies = []\n",
    "\n",
    "def callback_log_energy(system, t):\n",
    "    #graphは以前にGraphモジュールにて定義したオブジェクトです\n",
    "    #各trotterスライスの平均値から、古典スピンの0、1を決めます。\n",
    "    classical_spin = [-1 if np.mean(s)<0 else 1 for s in system.trotter_spins[:-1]] #最後のスピンは補助スピンのため、除く\n",
    "    energies.append(graph.calc_energy(classical_spin))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "このcallbackを用いて同じAlgorithmを実行します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "#スケジュールをもっと長く取ります (計20000モンテカルロステップ)\n",
    "schedule_list = U.make_transverse_field_schedule_list(10, 200, 100)\n",
    "A.Algorithm_SingleSpinFlip_run(mysystem, schedule_list, callback_log_energy)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "記録したシステムのエネルギーを、横軸をモンテカルロステップ、縦軸をエネルギーでプロットすると次のようになります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: matplotlib in /opt/conda/lib/python3.9/site-packages (3.5.2)\n",
      "Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.9/site-packages (from matplotlib) (0.11.0)\n",
      "Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib) (21.3)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in /opt/conda/lib/python3.9/site-packages (from matplotlib) (2.8.2)\n",
      "Requirement already satisfied: pyparsing>=2.2.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib) (2.4.7)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib) (4.37.1)\n",
      "Requirement already satisfied: pillow>=6.2.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib) (9.2.0)\n",
      "Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib) (1.4.4)\n",
      "Requirement already satisfied: numpy>=1.17 in /opt/conda/lib/python3.9/site-packages (from matplotlib) (1.23.2)\n",
      "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.9/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n"
     ]
    }
   ],
   "source": [
    "!pip install matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(range(len(energies)), energies)\n",
    "plt.xlabel('Monte Carlo step')\n",
    "plt.ylabel('energy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 結果の取得 -Result-\n",
    "\n",
    "`result.get_solutions`で計算結果である古典スピンを取得します。この関数は最適化問題を解く観点にフォーカスを当てているため、trotterスライスの中でもっともエネルギーが低いスピン列を返します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-1, -1, -1, -1, 1, 1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, -1]\n"
     ]
    }
   ],
   "source": [
    "import openjij.cxxjij.result as R\n",
    "print(R.get_solution(mysystem))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}