{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "V_NR6GiIBDP2" }, "source": [ "# 2-An Evaluation of Annealing Algorithms" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "view-in-github" }, "source": [ "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/OpenJij/OpenJijTutorial/blob/master/source/en/002-Evaluation.ipynb)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "FbP_6wGgBDP6" }, "source": [ "Annealing algorithms are heuristics, so it may not be able to give an optimal solution every time. These are algorithms for approximate solutions. In addition, these are probabilistic algorithm and solutions are also different each time. Therefore, when we evaluate them, we use various averages to evaluate these solution.\n", "\n", "The three following indicators are often used.\n", "\n", "- Success probability\n", "- TTS : Time to solution\n", "- Resudial energy\n", "\n", "In particular, **TTS** is a measure of computation time and is often used in various evaluations. A Residual energy is an average value of how close to an optimal solution we got." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "av11BMPjBDP8" }, "source": [ "## Time to solution\n", "\n", "An annealing algorithm can produce some kind of solution at any computation time. However even if the calculation is fast, it is useless if it gives wrong answers. We set an index (e.g., the time it takes to get the optimal solution with 90% probability) for the computation time it takes for the optimal solution to be calculated with the probability we need.\n", "\n", "As shown in the previous chapter, an annealing algorithm looks for the optimal solution from among multiple runs, therefore multiple runs should be taken into account to evaluate the computation time.\n", "\n", "A Time to Solution (TTS) is computed by taking into account the multiple annealing process.\n", "\n", "We can easily lead TTS as follows." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "kqwBOHdVBDP9" }, "source": [ "One annealing time is defined as $\\tau$. Let the probability of calculating the optimal solution in one annealing session be $p_s(\\tau)$. $p_s(\\tau)$ is the probability of success used to evaluate an algorithm.\n", "\n", "From these definition, a failure probability that the optimal solution is not calculated in one annealing session is\n", "\n", "$$1-p_s(\\tau)$$\n", "\n", "We repeat $R$ times. Then the probability that the optimal solution is not calculated in all these $R$ times is \n", "\n", "$$\\{ 1-p_s(\\tau) \\}^R$$\n", "\n", "Therefore the probability of obtaining the optimal solution at leaset once out of $R$ times $p_R$ is found to be\n", "\n", "$$p_R = 1-\\{ 1-p_s(\\tau)\\}^R$$\n", "\n", "We solve this equation for $R$, and we get immediately\n", "\n", "$$R = \\frac{\\ln(1-p_R)}{\\ln\\{1-p_s(\\tau)\\}}$$\n", "\n", "To get the total computation time, we multiply the time per one annealing calculation by this formula.\n", "\n", "$${\\rm TTS}(\\tau, p_R) = \\tau R = \\tau \\frac{\\ln(1-p_R)}{\\ln\\{1-p_s(\\tau)\\}}$$\n", "\n", "This value means the total computation time for one annealing session, taking into account the computation time of $p_R$ and the number of iterations until the optimal solution is found with probability $p_s(p_R)$ when the algorithm with probability $p_s(\\tau)$ is used to find the optimal solution." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "UH5K7TpfBDP-" }, "source": [ "In an evaluation of the actual computation, $p_R$ is given as a constant. The most common value used in research and other studies is $p_R = 0.99$. Then calculate $p_s(\\tau)$ in various annealing time $\\tau$. We use them to compute ${\\rm TTS}(\\tau, p_R)$." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Y_aOax-OBDP_" }, "source": [ "### Measuring TTS with OpenJij\n", "\n", "In this section, we measure TTS with OpenJij. In the following, We consider a one-dimensional antiferromagnetic Ising model. This is the physical model represented by the following Hamiltonian\n", "\n", "$$H(\\{\\sigma_i\\}) = \\sum_{i=0}^{N-1} J_{i, i+1}\\sigma_i \\sigma_{i+1} + \\sum_{i=0}^{N-1} h_i \\sigma_i$$\n", "\n", "where $J_{ij} \\in [0.1, 1.0]$、$h_0 = -1$ respectively, and other longitudinal fields consider zero.\n", "\n", "From antiferromagnetic condition, $J_{ij} > 0$, each spin faces a differenct direction and its energy is lowered. Therefore, optimal solution looks like $\\{\\sigma_i\\}$は$1, -1, 1, -1, \\cdots$. In addition, from $h_0=-1$ condition, we get the 0-th spin is $\\sigma_0 = 1$. Finally, the optimal solution is $1, -1, 1, -1, \\cdots$.\n", "\n", "In short, the problem of \"compute TTS of this problem\" means total computation time it takes to obtain $1, -1, 1, \\cdots$.\n", "\n", "Let's solve the Ising model above and see how TTS chanegs as the time per calculation is extended." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import random\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# import OpenJij\n", "import openjij as oj " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# make one-dimensional antiferromagnetic Ising model\n", "N = 30\n", "h = {0: -10}\n", "J = {(i, i+1): 1 for i in range(N-1)}" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "63j1bHf1BDQR" }, "source": [ "## Compute TTS\n", "\n", "The response class returned by `sample_ising` or `sample_qubo` of openjij has member variable `info`. This is a dictionary of information for each sampler. Most sampler have an `execution_time` key, which is the execution time of each algorithm (in $\\mu$s). \n", "\n", "In the case of SASampler, the computation time per one cycle of Simulated Annealing is stored." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# set optimal solution\n", "correct_state = [(-1)**i for i in range(N)]\n", "\n", "# define pR for TTS\n", "pR = 0.99\n", "\n", "# define num_sweeps_list, which is argument of Sampler \n", "# num_sweeps means the number of splits for decraesing parameters (temperature, transverse field) during annealing.\n", "# therefore, the more we increase this parameter, the more slowly it is equivalent to annealing.\n", "\n", "num_sweeps_list = list(range(10, 51, 10)) \n", "\n", "TTS_list = [] # define empty list for TTS of each computation\n", "tau_list = [] # define empty list for computation time\n", "\n", "# define empty list for success probability\n", "ps_list = []\n", "\n", "# set the number of times of annealing for computing probability\n", "num_reads = 100\n", "\n", "for num_sweeps in num_sweeps_list:\n", " sampler = oj.SASampler(num_sweeps=num_sweeps, num_reads=num_reads) \n", " response = sampler.sample_ising(h, J)\n", "\n", " # get execution time of each annealing\n", " tau = response.info['execution_time']\n", " \n", " # get ps. \n", " # state is ndarray, and we can compare this list with .all()\n", " ps = sum([1 if (state == correct_state).all() else 0 for state in response.states])/num_reads\n", " \n", " \n", " # When ps = 0, TTS diverges to infinity. We avoid this situation\n", " if ps == 0.0:\n", " continue\n", " \n", " # compute TTS\n", " TTS_list.append(np.log(1-pR)/np.log(1-ps)*tau)\n", " tau_list.append(tau)\n", "\n", " # compute success probability\n", " ps_list.append(ps)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Success probability')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# this cell is for visualization of evaluation\n", "\n", "# configure various settings\n", "fig, (axL, axR) = plt.subplots(ncols=2, figsize=(15,3))\n", "plt.subplots_adjust(wspace=0.4)\n", "fontsize = 10\n", "\n", "# plot TTS\n", "axL.plot(tau_list, TTS_list)\n", "axL.set_xlabel('annealing time', fontsize=fontsize)\n", "axL.set_ylabel('TTS', fontsize=fontsize)\n", "\n", "# plot succss probability ps\n", "axR.plot(tau_list, ps_list)\n", "axR.set_xlabel('annealing time', fontsize=fontsize)\n", "axR.set_ylabel('Success probability', fontsize=fontsize)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ekqnlWy_BDQY" }, "source": [ "We showed you how to compute both TTS and success probability. Both of the two figures above, the horizontal axis is the coumputation time for one annealing session.\n", "\n", "As the annealing time increases, TTS tends to increase as well. From this figure, we can use this value as an indicator of when we want to stop annealing once we have compensated for the required success probability.\n", "\n", "OpenJij has TTS, Residual Energy and Success probability by default the benchmark function `openjij.solver_benchmark`.\n", "\n", "\n", "## solver_benchmark function\n", "\n", "solver_benchmark function compute TTS, residual energy and success probability, and return these values.\n", "\n", "The arguments are listed below.\n", "\n", "- solver: function \n", " This function returns `Response` class. It needs arguments of `time` and `num_reads`\n", " `time` is parameter of computational time. In the case of `SASampler`, it corresponds to `num_sweeps`.\n", " `num_reads` specifies the number of times to sample to calculate TTS and residual energy.\n", " Also, the return value of the function `Response.info` contains the argument `time_name` as keyword.\n", " The value associated with `time_name` should be calculated time per cycle.\n", "- time_list: list \n", " a list of `time` argument of solver.\n", "- solutions: list(list: state) \n", " A list of states tha are the ground staet (optimal solution).\n", " In case of degenerate (multiple identical states that are indistinguishable from each other), \n", " multiple state can be inserted, as in [state1, state2].\n", "- args: dict\n", " Attach to the solver as an option, if required. The default is `args = {}`.\n", "- p_r: 0 < float <= 1 \n", " This value is needed to compute TTS. It is equivalent to p_R.\n", "- ref_energy: float \n", " This means reference energy. Used in conjunction with measure_with_energy.\n", " The default is `ref_energy = 0`.\n", "- measure_with_energy: bool \n", " False: When the spin state matches the ground state, it counts as a success.\n", " True: If the energy is less than or equal to ref_energy, it counts as success.\n", " It is used when ground state is not known. The default is False.\n", "- time_name: str \n", " Specifies the key associated with the execution time of `Response.info`.\n", " The default is `'execution_time'`.\n", " \n", "The return value is the result of the benchmark calculation and is stored in a dictionary format as shown below.\n", "\n", "- time: A list of execution time.\n", "- success_prob: A list of success probability.\n", "- tts: A list of TTS.\n", "- residual_energy: A list of residual energy.\n", "- info: (dict) A parameter information of benchmark function.\n", "\n", "\n", "Let us use this benchmark function to compute TTS and so on." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": {}, "colab_type": "code", "id": "UsT_OrHpBDQZ", "scrolled": true }, "outputs": [], "source": [ "# define optimal solution\n", "correct_state = [(-1)**i for i in range(N)]\n", "\n", "# set num_sweeps & num_reads(the number of repetition)\n", "num_sweeps_list = list(range(10, 51, 10)) # [10, 20, 30, 40, 50]\n", "num_reads = 100\n", "\n", "# compute TTS, residual energy, success probability with benchmark function\n", "result = oj.solver_benchmark(\n", " solver=lambda time, **args: oj.SASampler(num_sweeps=time, num_reads=num_reads).sample_ising(h,J), \n", " time_list=num_sweeps_list, solutions=[correct_state], p_r=0.99\n", " )" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 245 }, "colab_type": "code", "id": "cZ1cs-g1BDQc", "outputId": "faf086d7-83b4-48e8-f75a-d2eefbac563d" }, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Success probability')" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# configure the settings of drawing\n", "fig, (axL,axC,axR) = plt.subplots(ncols=3, figsize=(15,3))\n", "plt.subplots_adjust(wspace=0.4)\n", "fontsize = 10\n", "\n", "# plot TTS\n", "axL.plot(result['time'], result['tts'])\n", "axL.set_xlabel('annealing time', fontsize=fontsize)\n", "axL.set_ylabel('TTS', fontsize=fontsize)\n", "\n", "# plot residual energy\n", "axC.plot(result['time'], result['residual_energy'])\n", "axC.set_xlabel('annealing time', fontsize=fontsize)\n", "axC.set_ylabel('Residual energy', fontsize=fontsize)\n", "\n", "# plot of probability of appearance of optimal solution\n", "axR.plot(result['time'], result['success_prob'])\n", "axR.set_xlabel('annealing time', fontsize=fontsize)\n", "axR.set_ylabel('Success probability', fontsize=fontsize)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "F1MP6xatBDQf" }, "source": [ "We can easily benchmark with OpenJij.\n", "\n", "Since the same antiferromagnetic 1D Ising model is used to solver the same problem as before, we can see that TTS and success probability are monotonically increasing, as in the previous example (because of heuristic solution, therefore exact calculation result changes every time).\n", "\n", "The residual energy is expected to converge as some value if the annealing time increase.\n", "\n", "We can set upt a free custom function if the function in `solver` returns the `Response` class and computation time is stored in `.info['execution_time']`.\n", "\n", "The following is an example of creating and executing an appropriate user function. We can create a function that randomly returns one state from the three spin states of [1, 1, 1, 1,...], [1, -1, 1, -1,...] and [-1, 1, -1, 1,...], and benchmark the annealing algorithm. An Optimal solution is [1, -1, 1, -1,...]." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": {}, "colab_type": "code", "id": "QDHCChaRBDQg" }, "outputs": [], "source": [ "import time \n", "\n", "def anti_ferro_solver(time_param, num_reads, h, J):\n", "# \"\"\"\n", "# set function to choose randomly from three states\n", "# [1, 1, 1,...], [1,-1,1,...] & [-1,1,-1,...]\n", "# \"\"\"\n", " \n", " # set subscript h & J\n", " indices = set(h.keys())\n", " indices = list(indices | set([key for keys in J.keys() for key in keys]))\n", " \n", " # make state of [1, 1, 1,...]\n", " ones_state = list(np.ones(len(indices), dtype=int))\n", " \n", " # make state of [-1, 1, -1,...]\n", " minus_plus_state = np.ones(len(indices), dtype=int)\n", " minus_plus_state[::2] *= -1\n", " \n", " # make state of [1, -1, 1,...]\n", " plus_minus_state = -1 * minus_plus_state\n", " \n", " # start measuring the execution time.\n", " start = time.time()\n", " _states = [ones_state, list(minus_plus_state), list(plus_minus_state)]\n", " \n", " # choose state randomly from three states\n", " state_record = [_states[np.random.randint(3)] for _ in range(num_reads)]\n", " # convert state_record to ndarray\n", " state_record = np.array(state_record)\n", " \n", " # Add the computation time at random\n", " exec_time = (time.time()-start) * 10**6 * time_param\n", " # compute energy at random\n", " energies = [sum(state) for state in state_record]\n", " \n", " # make tuple (state, subscript)\n", " samples_like = (state_record, indices)\n", " \n", " # we refer to from_samples (dimod) and store the state and energy in the Response class.\n", " response = oj.Response.from_samples(samples_like=samples_like, energy=energies, vartype='SPIN')\n", " # substitute computation time to response.info 'execution_time' key\n", " response.info['execution_time'] = exec_time\n", " \n", " return response" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "OpenJij's response is modeled after dimod's SampleSet.\n", "Therefore, the advantage of being familiar with OpenJij is that it makes the transition to using dimod and D-Wave execution easier. \n", "Fom more details of dimod SampleSet, see also link below \n", "[Samples](https://docs.ocean.dwavesys.com/projects/dimod/en/latest/reference/sampleset.html)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": {}, "colab_type": "code", "id": "lO8DpCkyBDQk" }, "outputs": [], "source": [ "# set optimal solution [1, -1, 1,...]\n", "correct_state = [(-1)**i for i in range(N)]\n", "\n", "# set num_sweeps & num_reads\n", "num_sweeps_list = list(range(10, 51, 10))\n", "num_reads = 2000\n", "\n", "# compute TTS, residual energy & success probability with benchmark function\n", "result = oj.solver_benchmark(\n", " solver= lambda time_param, **args: anti_ferro_solver(time_param, num_reads, h, J), \n", " time_list=num_sweeps_list, solutions=[correct_state], p_r=0.99\n", " )" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 245 }, "colab_type": "code", "id": "v8feULpDBDQo", "outputId": "6a4eb208-1795-4aec-ed26-bde92d9c928c", "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Success probability')" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, (axL,axC,axR) = plt.subplots(ncols=3, figsize=(15,3))\n", "plt.subplots_adjust(wspace=0.4)\n", "\n", "fontsize = 10\n", "axL.plot(result['time'], result['tts'])\n", "axL.set_xlabel('annealing time', fontsize=fontsize)\n", "axL.set_ylabel('TTS', fontsize=fontsize)\n", "\n", "axC.plot(result['time'], result['residual_energy'])\n", "axC.set_xlabel('annealing time', fontsize=fontsize)\n", "axC.set_ylabel('Residual energy', fontsize=fontsize)\n", "\n", "axR.plot(result['time'], result['success_prob'])\n", "axR.set_xlabel('annealing time', fontsize=fontsize)\n", "axR.set_ylabel('Success probability', fontsize=fontsize)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "c3T8GiiSBDQr" }, "source": [ "We randomly choose the optimal state for each one of the three states, so the probability of success shold be about 1/3. The above figure of success probability is also about 1/3 value.\n", "\n", "With these solver functions in place, it is possible to compute TTS, residual energy and success probability, not just for OpenJij solvers." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us show you the ability to compute standard errors in the next page." ] } ], "metadata": { "colab": { "collapsed_sections": [], "include_colab_link": true, "name": "2_Evaluation_ver008.ipynb", "provenance": [] }, "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.9.3" } }, "nbformat": 4, "nbformat_minor": 1 }