OpenJij/OpenJij

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

Summary

Maintainability
Test Coverage
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Numerical Simulation of Quantum Ising Model using the Core Interface"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this tutorial, we perform numerical simulations of the Ising model with quantum (mainly transverse magnetic field) effects using the OpenJij core interface.\n",
    "First, define Graph and $J_{ij}, h_i$ of the system to be numerically simulated.\n",
    "We simulate a system with random interactions and random longitudinal magnetic fields as [for the classical Ising model](./A003-LargeScaleMC.ipynb)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import openjij.cxxjij.graph as G\n",
    "# Set the problem size to 100\n",
    "N = 100\n",
    "\n",
    "graph = G.Dense(N)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "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 value would be too large, so we use 1/N for standardization.\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": [
    "The method of setting up the graph is the same as for the classical Ising model simulation."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Set Transverse Magnetic Field Ising Model\n",
    "\n",
    "The system is set up with the transverse magnetic field Ising model:\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",
    "The $\\Gamma$ is fixed and $\\beta$ and $s$ are varied to perform quantum Monte Carlo.\n",
    "By default, the quantum Monte Carlo method with Suzuki and Trotter decomposition is implemented.\n",
    "\n",
    "> A continuous imaginary-time quantum Monte Carlo method is also available, but it is currently eperimental.\n",
    "\n",
    "First, let us generate the system with `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": [
    "The spin configuration is the first argument, the graph is the second, the value of $\\Gamma$ is the third, and the number of trotter slices is the fourth.\n",
    "Now the system is with all trotter slices initialized with `graph.gen_spin()`.\n",
    "\n",
    "Below we display all trotter spins with `mysystem.trotter_spins`. The vertical direction is the spatial direction and the horizontal direction is the trotter direction.\n",
    "All trotter slices are initialized with the same spins."
   ]
  },
  {
   "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": [
    "> Instead of `graph.gen_spin()` we can put the two dimentional list above to initialize the trotter spins directly.\n",
    "\n",
    "## Run Algorithm with Updater\n",
    "\n",
    "### Updater\n",
    "\n",
    "For Quantum Monte Carlo methods, we currently have\n",
    "\n",
    "* SingleSpinFlip (update one spin at a time using the Metropolis-Hasting method)\n",
    "\n",
    "### Algorithm\n",
    "\n",
    "#### Schedule List\n",
    "\n",
    "The schedule list is given as a list of `(parameters, the number of Monte Carlo steps)` and for the transverse field Ising model as (($\\beta$, $s$), the number of Monte Carlo steps). As an example, we do the following setup."
   ]
  },
  {
   "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": [
    "This means 10 Monte Carlo steps at inverse temperature $\\beta=10, s=0.1$,  80 steps at $\\beta=12, s=0.3$, and 30 steps at $\\beta=0.1, s=0.8$ for a total of 120 Monte Carlo steps.\n",
    "In performing annealing, it is more convenient to use the `make_transverse_field_schedule_list` in the `utility` as follows."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "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": [
    "In the example above, $S$ is changed in 10 steps from $S=0$ to $S=1$ while fixing $\\beta=10$ and calculating 20 Monte Carlo steps for each parameter. A total of 200 Monte Carlo steps are calculated.\n",
    "The method of [Morita and Nishimori (2008)](https://aip.scitation.org/doi/10.1063/1.2995837) is applied to changing $s$.\n",
    "\n",
    "#### Run the Algorithm\n",
    "\n",
    "Next, execute Algorithm.\n",
    "It can be written in exactly the same way as  in the classical Ising model simulation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "import openjij.cxxjij.algorithm as A\n",
    "A.Algorithm_SingleSpinFlip_run(mysystem, schedule_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let us use the callback as in the previous chapter.\n",
    "For the transverse magnetic field Ising model, we only need to create a function with the system and parameters (inverse temperature $\\beta$, $s$) as arguments.  \n",
    "As an example, below we create a callback that records the value of the system energy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "energies = []\n",
    "\n",
    "def callback_log_energy(system, t):\n",
    "    # graph is the object defined previously in the Graph module\n",
    "    # Determine the classical spin 0 or 1 from the average value of each trotter slice\n",
    "    classical_spin = [-1 if np.mean(s)<0 else 1 for s in system.trotter_spins[:-1]] # Exclude last spin because it is auxiliary\n",
    "    energies.append(graph.calc_energy(classical_spin))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The same Algorithm is executed using this callback."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Take a longer schedule (total of 20000 Monte Carlo steps)\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": [
    "The recorded system energy is plotted with Monte Carlo steps on the horizontal axis and energy on the vertical axis as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# !pip install matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "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",
    "With `result.get_solutions` we get the classical spins that are the result of the calculation. This function returns the spin configuration with the lowest energy in the trotter slice since the focus is on the perspective of solving an optimization problem."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "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))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.15"
  },
  "vscode": {
   "interpreter": {
    "hash": "2e8d7574d7ec71e14cb1575cf43673432d6fae464c836a7b3733d4f6c20243fb"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}