Skip to content

Instantly share code, notes, and snippets.

@tanemaki
Created January 6, 2025 01:53
Show Gist options
  • Save tanemaki/79ac80803c1270a2650d9f4888486ce0 to your computer and use it in GitHub Desktop.
Save tanemaki/79ac80803c1270a2650d9f4888486ce0 to your computer and use it in GitHub Desktop.
comparison_of_neal_and_openjij_128.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyPIraCye278f2+FTHMSQmLK",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/tanemaki/79ac80803c1270a2650d9f4888486ce0/comparison_of_neal_and_openjij_128.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"\n",
"https://github.com/OpenJij/OpenJij/blob/main/benchmark/benchmark.py"
],
"metadata": {
"id": "-eKbLLlvK5EX"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "yMDuFlixKCiK",
"outputId": "690606b5-6854-42ec-bb8a-c0db62e019c6"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Collecting openjij==0.9.2\n",
" Downloading openjij-0.9.2-cp310-cp310-manylinux_2_28_x86_64.whl.metadata (9.4 kB)\n",
"Requirement already satisfied: numpy<1.27.0,>=1.17.3 in /usr/local/lib/python3.10/dist-packages (from openjij==0.9.2) (1.26.4)\n",
"Collecting dimod<0.13.0 (from openjij==0.9.2)\n",
" Downloading dimod-0.12.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.0 kB)\n",
"Collecting scipy<1.12.0,>=1.7.3 (from openjij==0.9.2)\n",
" Downloading scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (60 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m60.4/60.4 kB\u001b[0m \u001b[31m3.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hCollecting requests<2.32.0,>=2.28.0 (from openjij==0.9.2)\n",
" Downloading requests-2.31.0-py3-none-any.whl.metadata (4.6 kB)\n",
"Collecting jij-cimod<1.7.0,>=1.6.0 (from openjij==0.9.2)\n",
" Downloading jij_cimod-1.6.2-cp310-cp310-manylinux_2_28_x86_64.whl.metadata (10 kB)\n",
"Requirement already satisfied: typing-extensions>=4.2.0 in /usr/local/lib/python3.10/dist-packages (from openjij==0.9.2) (4.12.2)\n",
"Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<2.32.0,>=2.28.0->openjij==0.9.2) (3.4.0)\n",
"Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<2.32.0,>=2.28.0->openjij==0.9.2) (3.10)\n",
"Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<2.32.0,>=2.28.0->openjij==0.9.2) (2.2.3)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<2.32.0,>=2.28.0->openjij==0.9.2) (2024.12.14)\n",
"Downloading openjij-0.9.2-cp310-cp310-manylinux_2_28_x86_64.whl (11.8 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m11.8/11.8 MB\u001b[0m \u001b[31m17.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading dimod-0.12.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.0 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.0/9.0 MB\u001b[0m \u001b[31m41.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading jij_cimod-1.6.2-cp310-cp310-manylinux_2_28_x86_64.whl (11.6 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m11.6/11.6 MB\u001b[0m \u001b[31m23.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading requests-2.31.0-py3-none-any.whl (62 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.6/62.6 kB\u001b[0m \u001b[31m4.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (36.4 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m36.4/36.4 MB\u001b[0m \u001b[31m16.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hInstalling collected packages: scipy, requests, dimod, jij-cimod, openjij\n",
" Attempting uninstall: scipy\n",
" Found existing installation: scipy 1.13.1\n",
" Uninstalling scipy-1.13.1:\n",
" Successfully uninstalled scipy-1.13.1\n",
" Attempting uninstall: requests\n",
" Found existing installation: requests 2.32.3\n",
" Uninstalling requests-2.32.3:\n",
" Successfully uninstalled requests-2.32.3\n",
"\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
"google-colab 1.0.0 requires requests==2.32.3, but you have requests 2.31.0 which is incompatible.\u001b[0m\u001b[31m\n",
"\u001b[0mSuccessfully installed dimod-0.12.18 jij-cimod-1.6.2 openjij-0.9.2 requests-2.31.0 scipy-1.11.4\n"
]
}
],
"source": [
"!pip install openjij==\"0.9.2\""
]
},
{
"cell_type": "code",
"source": [
"!pip install dwave-ocean-sdk==\"6.10.0\""
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "08guyEuaKSpR",
"outputId": "e0bfd43d-94c8-4b06-f8f4-1607f1837bec"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Collecting dwave-ocean-sdk==6.10.0\n",
" Downloading dwave_ocean_sdk-6.10.0-py3-none-any.whl.metadata (5.7 kB)\n",
"Collecting dimod==0.12.14 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dimod-0.12.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.0 kB)\n",
"Collecting dwave-cloud-client==0.11.4 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dwave_cloud_client-0.11.4-py3-none-any.whl.metadata (5.3 kB)\n",
"Collecting dwave-greedy==0.3.0 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dwave_greedy-0.3.0-py3-none-any.whl.metadata (4.6 kB)\n",
"Collecting dwave-hybrid==0.6.11 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dwave_hybrid-0.6.11-py3-none-any.whl.metadata (4.4 kB)\n",
"Collecting dwave-inspector==0.5.0 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dwave_inspector-0.5.0-py3-none-any.whl.metadata (4.4 kB)\n",
"Collecting dwave-neal==0.6.0 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dwave_neal-0.6.0-py3-none-any.whl.metadata (3.0 kB)\n",
"Collecting dwave-networkx==0.8.14 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dwave_networkx-0.8.14-py3-none-any.whl.metadata (2.6 kB)\n",
"Collecting dwave-preprocessing==0.6.5 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dwave_preprocessing-0.6.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.3 kB)\n",
"Collecting dwave-samplers==1.2.0 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dwave_samplers-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (9.8 kB)\n",
"Collecting dwave-system==1.24.0 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dwave_system-1.24.0-py3-none-any.whl.metadata (3.8 kB)\n",
"Collecting dwave-tabu==0.5.0 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dwave_tabu-0.5.0-py3-none-any.whl.metadata (3.3 kB)\n",
"Collecting dwavebinarycsp==0.3.0 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading dwavebinarycsp-0.3.0-py3-none-any.whl.metadata (3.0 kB)\n",
"Collecting minorminer==0.2.13 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading minorminer-0.2.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.4 kB)\n",
"Collecting penaltymodel==1.1.0 (from dwave-ocean-sdk==6.10.0)\n",
" Downloading penaltymodel-1.1.0-py3-none-any.whl.metadata (6.5 kB)\n",
"Requirement already satisfied: numpy<2.0.0,>=1.17.3 in /usr/local/lib/python3.10/dist-packages (from dimod==0.12.14->dwave-ocean-sdk==6.10.0) (1.26.4)\n",
"Requirement already satisfied: requests<3,>=2.25 in /usr/local/lib/python3.10/dist-packages (from requests[socks]<3,>=2.25->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (2.31.0)\n",
"Requirement already satisfied: urllib3<3,>=1.26 in /usr/local/lib/python3.10/dist-packages (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (2.2.3)\n",
"Requirement already satisfied: pydantic<3,>=2 in /usr/local/lib/python3.10/dist-packages (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (2.10.3)\n",
"Collecting homebase<2,>=1.0 (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0)\n",
" Downloading homebase-1.0.1-py2.py3-none-any.whl.metadata (3.3 kB)\n",
"Requirement already satisfied: click<9,>=7.0 in /usr/local/lib/python3.10/dist-packages (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (8.1.7)\n",
"Requirement already satisfied: python-dateutil<3,>=2.7 in /usr/local/lib/python3.10/dist-packages (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (2.8.2)\n",
"Collecting plucky<0.5,>=0.4.3 (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0)\n",
" Downloading plucky-0.4.3-py2.py3-none-any.whl.metadata (4.4 kB)\n",
"Collecting diskcache<6,>=5.2.1 (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0)\n",
" Downloading diskcache-5.6.3-py3-none-any.whl.metadata (20 kB)\n",
"Requirement already satisfied: packaging>=19 in /usr/local/lib/python3.10/dist-packages (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (24.2)\n",
"Requirement already satisfied: werkzeug<4,>=2.2 in /usr/local/lib/python3.10/dist-packages (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (3.1.3)\n",
"Requirement already satisfied: typing-extensions<5,>=4.5.0 in /usr/local/lib/python3.10/dist-packages (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (4.12.2)\n",
"Collecting authlib<2,>=1.2 (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0)\n",
" Downloading Authlib-1.4.0-py2.py3-none-any.whl.metadata (3.9 kB)\n",
"Requirement already satisfied: importlib-metadata>=5.0.0 in /usr/local/lib/python3.10/dist-packages (from dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (8.5.0)\n",
"Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from dwave-hybrid==0.6.11->dwave-ocean-sdk==6.10.0) (3.4.2)\n",
"Requirement already satisfied: Flask<4,>=2.2 in /usr/local/lib/python3.10/dist-packages (from dwave-inspector==0.5.0->dwave-ocean-sdk==6.10.0) (3.1.0)\n",
"Requirement already satisfied: orjson>=3.10.0 in /usr/local/lib/python3.10/dist-packages (from dwave-inspector==0.5.0->dwave-ocean-sdk==6.10.0) (3.10.12)\n",
"Requirement already satisfied: scipy>=1.7.3 in /usr/local/lib/python3.10/dist-packages (from dwave-system==1.24.0->dwave-ocean-sdk==6.10.0) (1.11.4)\n",
"Collecting fasteners>=0.15 (from minorminer==0.2.13->dwave-ocean-sdk==6.10.0)\n",
" Downloading fasteners-0.19-py3-none-any.whl.metadata (4.9 kB)\n",
"Collecting rectangle-packer>=2.0.1 (from minorminer==0.2.13->dwave-ocean-sdk==6.10.0)\n",
" Downloading rectangle_packer-2.0.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.4 kB)\n",
"Requirement already satisfied: cryptography in /usr/local/lib/python3.10/dist-packages (from authlib<2,>=1.2->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (43.0.3)\n",
"Requirement already satisfied: Jinja2>=3.1.2 in /usr/local/lib/python3.10/dist-packages (from Flask<4,>=2.2->dwave-inspector==0.5.0->dwave-ocean-sdk==6.10.0) (3.1.4)\n",
"Requirement already satisfied: itsdangerous>=2.2 in /usr/local/lib/python3.10/dist-packages (from Flask<4,>=2.2->dwave-inspector==0.5.0->dwave-ocean-sdk==6.10.0) (2.2.0)\n",
"Requirement already satisfied: blinker>=1.9 in /usr/local/lib/python3.10/dist-packages (from Flask<4,>=2.2->dwave-inspector==0.5.0->dwave-ocean-sdk==6.10.0) (1.9.0)\n",
"Requirement already satisfied: zipp>=3.20 in /usr/local/lib/python3.10/dist-packages (from importlib-metadata>=5.0.0->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (3.21.0)\n",
"Requirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.10/dist-packages (from pydantic<3,>=2->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (0.7.0)\n",
"Requirement already satisfied: pydantic-core==2.27.1 in /usr/local/lib/python3.10/dist-packages (from pydantic<3,>=2->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (2.27.1)\n",
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil<3,>=2.7->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (1.17.0)\n",
"Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.25->requests[socks]<3,>=2.25->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (3.4.0)\n",
"Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.25->requests[socks]<3,>=2.25->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (3.10)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.25->requests[socks]<3,>=2.25->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (2024.12.14)\n",
"Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.10/dist-packages (from requests[socks]<3,>=2.25->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (1.7.1)\n",
"Requirement already satisfied: MarkupSafe>=2.1.1 in /usr/local/lib/python3.10/dist-packages (from werkzeug<4,>=2.2->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (3.0.2)\n",
"Requirement already satisfied: cffi>=1.12 in /usr/local/lib/python3.10/dist-packages (from cryptography->authlib<2,>=1.2->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (1.17.1)\n",
"Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi>=1.12->cryptography->authlib<2,>=1.2->dwave-cloud-client==0.11.4->dwave-ocean-sdk==6.10.0) (2.22)\n",
"Downloading dwave_ocean_sdk-6.10.0-py3-none-any.whl (8.4 kB)\n",
"Downloading dimod-0.12.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.7 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m18.7/18.7 MB\u001b[0m \u001b[31m22.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading dwave_cloud_client-0.11.4-py3-none-any.whl (139 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m139.2/139.2 kB\u001b[0m \u001b[31m11.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading dwave_greedy-0.3.0-py3-none-any.whl (10 kB)\n",
"Downloading dwave_hybrid-0.6.11-py3-none-any.whl (77 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m77.1/77.1 kB\u001b[0m \u001b[31m4.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading dwave_inspector-0.5.0-py3-none-any.whl (30 kB)\n",
"Downloading dwave_neal-0.6.0-py3-none-any.whl (8.7 kB)\n",
"Downloading dwave_networkx-0.8.14-py3-none-any.whl (102 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m102.4/102.4 kB\u001b[0m \u001b[31m6.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading dwave_preprocessing-0.6.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.4/3.4 MB\u001b[0m \u001b[31m14.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading dwave_samplers-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.7 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.7/6.7 MB\u001b[0m \u001b[31m56.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading dwave_system-1.24.0-py3-none-any.whl (105 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m105.3/105.3 kB\u001b[0m \u001b[31m8.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading dwave_tabu-0.5.0-py3-none-any.whl (9.2 kB)\n",
"Downloading dwavebinarycsp-0.3.0-py3-none-any.whl (35 kB)\n",
"Downloading minorminer-0.2.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.3 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.3/10.3 MB\u001b[0m \u001b[31m21.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading penaltymodel-1.1.0-py3-none-any.whl (36 kB)\n",
"Downloading Authlib-1.4.0-py2.py3-none-any.whl (225 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m225.5/225.5 kB\u001b[0m \u001b[31m17.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading diskcache-5.6.3-py3-none-any.whl (45 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m45.5/45.5 kB\u001b[0m \u001b[31m3.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading fasteners-0.19-py3-none-any.whl (18 kB)\n",
"Downloading homebase-1.0.1-py2.py3-none-any.whl (11 kB)\n",
"Downloading plucky-0.4.3-py2.py3-none-any.whl (10 kB)\n",
"Downloading rectangle_packer-2.0.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (305 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m305.6/305.6 kB\u001b[0m \u001b[31m18.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hInstalling collected packages: rectangle-packer, plucky, homebase, fasteners, diskcache, dimod, penaltymodel, dwave-samplers, dwave-preprocessing, dwave-networkx, minorminer, dwavebinarycsp, dwave-tabu, dwave-neal, dwave-greedy, authlib, dwave-cloud-client, dwave-system, dwave-inspector, dwave-hybrid, dwave-ocean-sdk\n",
" Attempting uninstall: dimod\n",
" Found existing installation: dimod 0.12.18\n",
" Uninstalling dimod-0.12.18:\n",
" Successfully uninstalled dimod-0.12.18\n",
"Successfully installed authlib-1.4.0 dimod-0.12.14 diskcache-5.6.3 dwave-cloud-client-0.11.4 dwave-greedy-0.3.0 dwave-hybrid-0.6.11 dwave-inspector-0.5.0 dwave-neal-0.6.0 dwave-networkx-0.8.14 dwave-ocean-sdk-6.10.0 dwave-preprocessing-0.6.5 dwave-samplers-1.2.0 dwave-system-1.24.0 dwave-tabu-0.5.0 dwavebinarycsp-0.3.0 fasteners-0.19 homebase-1.0.1 minorminer-0.2.13 penaltymodel-1.1.0 plucky-0.4.3 rectangle-packer-2.0.2\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# openjij-dense, openjij-sparse, neal\n",
"# でのベンチマーク用のスクリプト\n",
"# sparse は遅すぎるのでベンチマーク測定できない\n",
"\n",
"import openjij as oj\n",
"import neal\n",
"import numpy as np\n",
"import time"
],
"metadata": {
"id": "269gUMNcKgey"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"np.random.seed(1293)"
],
"metadata": {
"id": "gEScsvGDRv-h"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# n = 1000\n",
"# n = 200\n",
"n = 128\n",
"h, J = {}, {}\n",
"\n",
"for i in range(n-1):\n",
" for j in range(i+1, n):\n",
" if np.random.random() <= 0.3:\n",
" J[i, j] = np.random.uniform(-1, 1)"
],
"metadata": {
"id": "wAUnhe57LBEv"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"NUM_READS = 10\n",
"\n",
"BETA_MAX = 14000000\n",
"BETA_MIN = 0.0015"
],
"metadata": {
"id": "z4AHQn9TLEVR"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# Benchmark OpenJij Dense\n",
"print('OpenJij Dense')\n",
"sampler = oj.SASampler()\n",
"steps_openjij = [1000, 3000, 6000, 12000]\n",
"openjij_time = []\n",
"openjij_energy = []\n",
"for step in steps_openjij:\n",
" print('num_sweeps:', step)\n",
" start = time.time()\n",
" response = sampler.sample_ising(h, J, num_sweeps=step, num_reads=NUM_READS, beta_max=BETA_MAX, beta_min=BETA_MIN)\n",
" elapsed_time = time.time() - start\n",
"\n",
" openjij_time.append(elapsed_time)\n",
" openjij_energy.append(np.mean(response.energies))\n",
"\n",
" print(\"\\telapsed_time:{0}\".format(elapsed_time) + \"[sec]\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "CftSvHtALHNu",
"outputId": "ed10dde0-023e-4fa5-e519-7b63ca4411b1"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"OpenJij Dense\n",
"num_sweeps: 1000\n",
"\telapsed_time:0.09903836250305176[sec]\n",
"num_sweeps: 3000\n",
"\telapsed_time:0.237701416015625[sec]\n",
"num_sweeps: 6000\n",
"\telapsed_time:0.3412766456604004[sec]\n",
"num_sweeps: 12000\n",
"\telapsed_time:0.8597958087921143[sec]\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# Benchmark OpenJij Sparse\n",
"print('OpenJij Sparse')\n",
"sampler = oj.SASampler()\n",
"openjij_sparse_time = []\n",
"openjij_sparse_energy = []\n",
"for step in steps_openjij:\n",
" print('num_sweeps:', step)\n",
" start = time.time()\n",
" response = sampler.sample_ising(h, J, num_sweeps=step, num_reads=NUM_READS, beta_max=BETA_MAX, beta_min=BETA_MIN, sparse=True)\n",
" elapsed_time = time.time() - start\n",
"\n",
" openjij_sparse_time.append(elapsed_time)\n",
" openjij_sparse_energy.append(np.mean(response.energies))\n",
"\n",
" print(\"\\telapsed_time:{0}\".format(elapsed_time) + \"[sec]\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "OwBtxPiTLJM3",
"outputId": "c1a47289-2800-4d50-8105-1792cd20737e"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"OpenJij Sparse\n",
"num_sweeps: 1000\n",
"\telapsed_time:0.10389542579650879[sec]\n",
"num_sweeps: 3000\n",
"\telapsed_time:0.3741936683654785[sec]\n",
"num_sweeps: 6000\n",
"\telapsed_time:1.3097007274627686[sec]\n",
"num_sweeps: 12000\n",
"\telapsed_time:1.9702765941619873[sec]\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# Benchmark OpenJij SQA\n",
"print('OpenJij SQA Dense')\n",
"sampler = oj.SQASampler()\n",
" # beta=10, trotter=8)\n",
"openjij_sql_time = []\n",
"openjij_sql_energy = []\n",
"for step in steps_openjij:\n",
" print('num_sweeps:', step)\n",
" start = time.time()\n",
" response = sampler.sample_ising(h, J, num_sweeps=step, num_reads=NUM_READS, beta=10, trotter=8)\n",
" elapsed_time = time.time() - start\n",
"\n",
" openjij_sql_time.append(elapsed_time)\n",
" openjij_sql_energy.append(np.mean(response.energies))\n",
"\n",
" print(\"\\telapsed_time:{0}\".format(elapsed_time) + \"[sec]\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "EWKLI9g0LM0c",
"outputId": "48ff9350-a914-4749-8634-433720893bb9"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"OpenJij SQA Dense\n",
"num_sweeps: 1000\n",
"\telapsed_time:1.7681083679199219[sec]\n",
"num_sweeps: 3000\n",
"\telapsed_time:4.912996292114258[sec]\n",
"num_sweeps: 6000\n",
"\telapsed_time:3.0250625610351562[sec]\n",
"num_sweeps: 12000\n",
"\telapsed_time:7.9180543422698975[sec]\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"print('OpenJij SQA Sparse')\n",
"sampler = oj.SQASampler()\n",
"openjij_sqs_time = []\n",
"openjij_sqs_energy = []\n",
"for step in steps_openjij:\n",
" print('num_sweeps:', step)\n",
" start = time.time()\n",
" response = sampler.sample_ising(h, J, num_sweeps=step, num_reads=NUM_READS, sparse=True, beta=10, trotter=8)\n",
" elapsed_time = time.time() - start\n",
"\n",
" openjij_sqs_time.append(elapsed_time)\n",
" openjij_sqs_energy.append(np.mean(response.energies))\n",
"\n",
" print(\"\\telapsed_time:{0}\".format(elapsed_time) + \"[sec]\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "LCQHAyqwLPjE",
"outputId": "327cbe15-0dcb-4f94-8cb0-3baff6dafb23"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"OpenJij SQA Sparse\n",
"num_sweeps: 1000\n",
"\telapsed_time:0.5640890598297119[sec]\n",
"num_sweeps: 3000\n",
"\telapsed_time:2.2006478309631348[sec]\n",
"num_sweeps: 6000\n",
"\telapsed_time:4.292657852172852[sec]\n",
"num_sweeps: 12000\n",
"\telapsed_time:6.641767978668213[sec]\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# Benchmark neal\n",
"print('dwave-neal')\n",
"sampler = neal.SimulatedAnnealingSampler()\n",
"steps_openjij = [1000, 3000, 6000, 12000]\n",
"neal_time = []\n",
"neal_energy = []\n",
"for step in steps_openjij:\n",
" print('num_sweeps:', step)\n",
" start = time.time()\n",
" response = sampler.sample_ising(h, J, num_sweeps=step, num_reads=NUM_READS, beta_range=(BETA_MIN, BETA_MAX))\n",
" elapsed_time = time.time() - start\n",
"\n",
" neal_time.append(elapsed_time)\n",
" neal_energy.append(np.mean([r[1] for r in response.record]))\n",
"\n",
" print(\"\\telapsed_time:{0}\".format(elapsed_time) + \"[sec]\")\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "yosH8yvBLyEl",
"outputId": "1bbdb2e6-1f69-4436-f25c-b9ffe7825083"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"dwave-neal\n",
"num_sweeps: 1000\n",
"\telapsed_time:0.07091259956359863[sec]\n",
"num_sweeps: 3000\n",
"\telapsed_time:0.11543893814086914[sec]\n",
"num_sweeps: 6000\n",
"\telapsed_time:0.16292095184326172[sec]\n",
"num_sweeps: 12000\n",
"\telapsed_time:0.31098103523254395[sec]\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"import matplotlib.pyplot as plt\n",
"plt.plot(openjij_time, openjij_energy, '-o', label='openjij-dense')\n",
"plt.plot(openjij_sparse_time, openjij_sparse_energy, '-o', label='openjij-sparse')\n",
"plt.plot(openjij_sql_time, openjij_sql_energy, '-o', label='openjij-sqa-dense')\n",
"plt.plot(openjij_sqs_time, openjij_sqs_energy, '-o', label='openjij-sqa-sparse')\n",
"plt.plot(neal_time, neal_energy, '-o', label='neal')\n",
"plt.xlabel('time [sec]')\n",
"plt.ylabel('Energy')\n",
"plt.legend()\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 449
},
"id": "0iWAHqpuL4xn",
"outputId": "6987f79d-24e8-4bb3-d955-e11ee8d8a43f"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "6kaR096GL8Hn"
},
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment