{
"cells": [
{
"cell_type": "markdown",
"id": "f45c6ac2",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
}
},
"source": [
"# 実習の準備\n",
"\n",
"```{contents} 目次\n",
"---\n",
"local: true\n",
"---\n",
"```"
]
},
{
"cell_type": "markdown",
"id": "13333bb0",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
}
},
"source": [
"## IBM Quantum\n",
"\n",
"### IBMidを取得し、IBM Quantumにログインする\n",
"\n",
"IBM Quantumを利用するには、IBMidというアカウントを作り、サービストークンを取得する必要があります。IBM QuantumウェブサイトからIDを取得し、サービスにログインしてください。\n",
"\n",
"(install_token)=\n",
"### (ローカル環境)IBM Quantum APIトークンを取得し、Qiskit設定に保存する\n",
"\n",
"IBM Quantum Lab(IBM Quantumウェブサイト上のJupyter Lab)でプログラムを実行する場合、以下の手続きは不要です。\n",
"\n",
"ログインしたらホーム画面のYour API tokenという欄からトークンをコピーできます。\n",
"```{image} figs/ibmq_home.png\n",
":height: 400px\n",
":name: My Account\n",
"```\n",
"\n",
"アカウントごとに発行されるサービストークンは、ユーザー名+パスワードの代わりとしてPythonプログラム中でIBMQに接続するために使用されます。ローカルディスクに書き込める環境にある場合は、一度トークンを設定ファイルに保存することで、以降の認証を自動化できます。下のコードセルの`__paste_your_token_here__`のところにIBM Quantumからコピーしたトークンを貼り付け、実行してください。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "73a7a26c",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": [
"raises-exception",
"remove-output"
]
},
"outputs": [
{
"ename": "InvalidAccountError",
"evalue": "\"Invalid `instance` value. Expected a non-empty string, got 'None'.\"",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mInvalidAccountError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[1], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mqiskit_ibm_runtime\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m QiskitRuntimeService\n\u001b[0;32m----> 3\u001b[0m \u001b[43mQiskitRuntimeService\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave_account\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m__paste_your_token_here__\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m/usr/local/lib/python3.10/dist-packages/qiskit_ibm_runtime/qiskit_runtime_service.py:713\u001b[0m, in \u001b[0;36mQiskitRuntimeService.save_account\u001b[0;34m(token, url, instance, channel, filename, name, proxies, verify, overwrite, channel_strategy, set_as_default)\u001b[0m\n\u001b[1;32m 676\u001b[0m \u001b[38;5;129m@staticmethod\u001b[39m\n\u001b[1;32m 677\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msave_account\u001b[39m(\n\u001b[1;32m 678\u001b[0m token: Optional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 688\u001b[0m set_as_default: Optional[\u001b[38;5;28mbool\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 689\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 690\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Save the account to disk for future use.\u001b[39;00m\n\u001b[1;32m 691\u001b[0m \n\u001b[1;32m 692\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 710\u001b[0m \u001b[38;5;124;03m as the default account.\u001b[39;00m\n\u001b[1;32m 711\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 713\u001b[0m \u001b[43mAccountManager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 714\u001b[0m \u001b[43m \u001b[49m\u001b[43mtoken\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtoken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 715\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 716\u001b[0m \u001b[43m \u001b[49m\u001b[43minstance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minstance\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 717\u001b[0m \u001b[43m \u001b[49m\u001b[43mchannel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchannel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 718\u001b[0m \u001b[43m \u001b[49m\u001b[43mfilename\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfilename\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 719\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 720\u001b[0m \u001b[43m \u001b[49m\u001b[43mproxies\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mProxyConfiguration\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mproxies\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 721\u001b[0m \u001b[43m \u001b[49m\u001b[43mverify\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mverify\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 722\u001b[0m \u001b[43m \u001b[49m\u001b[43moverwrite\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moverwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 723\u001b[0m \u001b[43m \u001b[49m\u001b[43mchannel_strategy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchannel_strategy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 724\u001b[0m \u001b[43m \u001b[49m\u001b[43mset_as_default\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mset_as_default\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 725\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m/usr/local/lib/python3.10/dist-packages/qiskit_ibm_runtime/accounts/management.py:71\u001b[0m, in \u001b[0;36mAccountManager.save\u001b[0;34m(cls, token, url, instance, channel, filename, name, proxies, verify, overwrite, channel_strategy, set_as_default)\u001b[0m\n\u001b[1;32m 55\u001b[0m filename \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mexpanduser(filename)\n\u001b[1;32m 56\u001b[0m config \u001b[38;5;241m=\u001b[39m Account\u001b[38;5;241m.\u001b[39mcreate_account(\n\u001b[1;32m 57\u001b[0m channel\u001b[38;5;241m=\u001b[39mchannel,\n\u001b[1;32m 58\u001b[0m token\u001b[38;5;241m=\u001b[39mtoken,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 63\u001b[0m channel_strategy\u001b[38;5;241m=\u001b[39mchannel_strategy,\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m save_config(\n\u001b[1;32m 66\u001b[0m filename\u001b[38;5;241m=\u001b[39mfilename,\n\u001b[1;32m 67\u001b[0m name\u001b[38;5;241m=\u001b[39mname,\n\u001b[1;32m 68\u001b[0m overwrite\u001b[38;5;241m=\u001b[39moverwrite,\n\u001b[1;32m 69\u001b[0m config\u001b[38;5;241m=\u001b[39m\u001b[43mconfig\u001b[49m\n\u001b[1;32m 70\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# avoid storing invalid accounts\u001b[39;49;00m\n\u001b[0;32m---> 71\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mto_saved_format(),\n\u001b[1;32m 72\u001b[0m set_as_default\u001b[38;5;241m=\u001b[39mset_as_default,\n\u001b[1;32m 73\u001b[0m )\n",
"File \u001b[0;32m/usr/local/lib/python3.10/dist-packages/qiskit_ibm_runtime/accounts/account.py:163\u001b[0m, in \u001b[0;36mAccount.validate\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 161\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_assert_valid_token(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoken)\n\u001b[1;32m 162\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_assert_valid_url(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39murl)\n\u001b[0;32m--> 163\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_assert_valid_instance\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minstance\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 164\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_assert_valid_proxies(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mproxies)\n\u001b[1;32m 165\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_assert_valid_channel_strategy(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mchannel_strategy)\n",
"File \u001b[0;32m/usr/local/lib/python3.10/dist-packages/qiskit_ibm_runtime/accounts/account.py:326\u001b[0m, in \u001b[0;36mCloudAccount._assert_valid_instance\u001b[0;34m(instance)\u001b[0m\n\u001b[1;32m 324\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Assert that the instance name is valid for the given account type.\"\"\"\u001b[39;00m\n\u001b[1;32m 325\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28misinstance\u001b[39m(instance, \u001b[38;5;28mstr\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(instance) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m):\n\u001b[0;32m--> 326\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m InvalidAccountError(\n\u001b[1;32m 327\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid `instance` value. Expected a non-empty string, got \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00minstance\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 328\u001b[0m )\n",
"\u001b[0;31mInvalidAccountError\u001b[0m: \"Invalid `instance` value. Expected a non-empty string, got 'None'.\""
]
}
],
"source": [
"from qiskit_ibm_runtime import QiskitRuntimeService\n",
"\n",
"QiskitRuntimeService.save_account('__paste_your_token_here__')"
]
},
{
"cell_type": "markdown",
"id": "3cd0b3e3",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
}
},
"source": [
"トークンを保存することで、プログラム中でのIBM Quantumへの認証(QiskitRuntimeServiceの取得)は\n",
"\n",
"```{code-block} python\n",
"from qiskit_ibm_runtime import QiskitRuntimeService\n",
"\n",
"service = QiskitRuntimeService(channel='ibm_quantum')\n",
"```\n",
"\n",
"のようになります。ちなみにIBM Quantum Labでは最初からトークンが保存されている状態なので、このコードで認証が行なえます。\n",
"\n",
"ローカルディスクに書き込める環境でない場合(このワークブックをインタラクティブに使っている場合など)は、Pythonプログラムを実行するたびに(Jupyterのカーネルを再起動するたびに)手動で認証を行う必要があります。\n",
"\n",
"```{code-block} python\n",
"from qiskit_ibm_runtime import QiskitRuntimeService\n",
"\n",
"service = QiskitRuntimeService(channel='ibm_quantum', token='__paste_your_token_here__')\n",
"```\n",
"\n",
"## ワークブックの使い方\n",
"\n",
"### インタラクティブHTML\n",
"\n",
"このワークブックの各ページにあるプログラムの書かれたセルは、そのままJupyter Notebookのようにブラウザ上で実行することができます。ページの右上のにカーソルを乗せ、現れるメニューから Live Codeをクリックしてください。ページのタイトルの下にステータス表示が現れるので、readyと表示されるまで待ちます。\n",
"\n",
"```{image} figs/toggle_interactive.jpg\n",
":height: 400px\n",
":name: Turn interactive contents on\n",
"```\n",
"\n",
"ページがインタラクティブになると、コード・セルにrunおよびrestartというボタンが現れ、直下にセルの出力が表示されるようになります。\n",
"\n",
"```{image} figs/interactive_cell.jpg\n",
":height: 200px\n",
":name: Interactive code cell\n",
"```\n",
"\n",
"この状態になったら、入力セルの内容を自由に書き換えて、runボタンをクリックして(もしくはShift + Enterで)Pythonコードを実行することができます。このときいくつか注意すべき点があります。\n",
"\n",
"- restartを押すまでページ全体が一つのプログラムになっているので、定義された変数などはセルをまたいで利用される。\n",
"- しばらく何もしないでページを放置していると、実行サーバーとの接続が切れてしまう。その場合ページを再度読み込んで、改めてインタラクティブコンテンツを起動する必要がある。\n",
"- コードはmybinder.orgという外部サービス上で実行されるので、個人情報等センシティブな内容の送信は極力避ける。
\n",
" (通信は暗号化されていて、mybinder.org中ではそれぞれのユーザーのプログラムは独立のコンテナ中で動くので、情報が外に筒抜けということではないはずですが、念の為。)
\n",
" ただし上で出てきたように、IBM Quantumのサービストークンだけはどうしても送信する必要があります。\n",
"\n",
"### Jupyter Notebook\n",
"\n",
"インタラクティブHTMLのセキュリティの問題が気になったり、編集したコードを保存したいと考えたりする場合は、ページの元になったノートブックファイルをダウンロードし、自分のローカルの環境で実行することもできます。右上ののメニューの.ipynbをクリックするか、もしくはのメニューのrepositoryからリンクされているgithubレポジトリをクローンしてください。\n",
"\n",
"ノートブックをローカルに実行するためには、Pythonバージョン3.10以上が必要です。また、`pip`を使って以下のパッケージをインストールする必要があります。\n",
"\n",
"```{code-block}\n",
"pip install qiskit qiskit-aer qiskit-ibm-runtime qiskit-experiments qiskit-machine-learning qiskit-optimization matplotlib pylatexenc pandas tabulate\n",
"```"
]
}
],
"metadata": {
"jupytext": {
"notebook_metadata_filter": "all",
"text_representation": {
"extension": ".md",
"format_name": "myst",
"format_version": 0.13,
"jupytext_version": "1.16.1"
}
},
"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.10.12"
},
"source_map": [
25,
35,
56,
68
]
},
"nbformat": 4,
"nbformat_minor": 5
}