{ "cells": [ { "cell_type": "markdown", "id": "54db101c-0bfd-46b2-9398-62224f69b512", "metadata": {}, "source": [ "# Amazon Braket で Qiskit を実行する" ] }, { "cell_type": "code", "execution_count": 1, "id": "e861abc5-0649-483e-9eac-04130922464b", "metadata": { "tags": [] }, "outputs": [], "source": [ "# このノートブックの実行料金を見積もるために Braket SDK Cost Tracking を使用します\n", "from braket.tracking import Tracker\n", "t = Tracker().start()" ] }, { "cell_type": "markdown", "id": "3d79f556-9a28-4dc3-9bfc-4d0b55be64aa", "metadata": {}, "source": [ "お客様も、ここ数年で量子コンピュータを学んだ多くの方と同じように、2017 年に初めてリリースされたオープンソースの量子ソフトウェア開発キット (SDK) である Qiskit を使って、量子回路をプログラミングする方法を学んだかもしれません。\n", "[Qiskit-Braket provider](https://github.com/qiskit-community/qiskit-braket-provider/blob/main/docs/tutorials/0_tutorial_qiskit-braket-provider_overview.ipynb) を使えば、[Amazon Braket](https://aws.amazon.com/braket/) のゲートベースのデバイスのどれを使っても、Qiskit のコードを実行できます。\n", "\n", "**注意** ローカル環境でこのノートブックを実行している場合 (つまりBraket コンソールから実行していない場合)、Braket デバイスにアクセスするために、最初に AWS アカウントが適切に構成されていることを確認する必要があります。[こちらのチュートリアル](https://aws.amazon.com/blogs/quantum-computing/setting-up-your-local-development-environment-in-amazon-braket/)で、その手順をご確認ください。" ] }, { "cell_type": "markdown", "id": "f4f2f12a-d87a-4f4d-b018-f465b383e19a", "metadata": {}, "source": [ "## Qiskit から Braket デバイスにアクセスする\n", "\n", "Amazon Braket のバックエンドデバイスはかなり種類が多いため、それぞれのおすすめユースケースを 1 つずつ説明していきます。" ] }, { "cell_type": "markdown", "id": "d3df9002-d332-4d31-abdb-eddf1bb27948", "metadata": {}, "source": [ "### 量子シミュレータ\n", "\n", "まず、ローカルシミュレータから始めましょう。これはローカル環境で動作する量子フル状態ベクトルシミュレータです。ローカル環境とは、この Jupyter ノートブックの実行場所 (例えば、ローカル開発環境や Braket コンソール上のノートブックインスタンスなど) を指します。\n", "\n", "**推奨ユースケース:** 最大 12 量子ビットのノイズなし回路" ] }, { "cell_type": "code", "execution_count": 2, "id": "bcb65696-6018-4bbc-aa56-1cfefa0f80fa", "metadata": { "tags": [] }, "outputs": [], "source": [ "from qiskit_braket_provider import BraketLocalBackend\n", "\n", "local_simulator = BraketLocalBackend()" ] }, { "cell_type": "markdown", "id": "413de274-7c4b-402a-9140-6064d8430264", "metadata": {}, "source": [ "次に、ローカル密度行列シミュレータです。このシミュレータもローカル環境で動作しますが、量子回路に対するノイズの影響をシミュレートできます。密度行列は状態ベクトルの 2 倍の大きさなので、効果的にシミュレートできる量子ビット数は、ローカル状態ベクトルシミュレータの半分になります。\n", "\n", "**推奨ユースケース :** 最大 6 量子ビットのノイズあり回路" ] }, { "cell_type": "code", "execution_count": 3, "id": "c16bb05a-925e-4706-ad11-0580181173d9", "metadata": { "tags": [] }, "outputs": [], "source": [ "local_dm_simulator = BraketLocalBackend(name='braket_dm')" ] }, { "cell_type": "markdown", "id": "8b8d88de-8bee-4298-8cc4-89f7b3280ff8", "metadata": {}, "source": [ "Braket オンデマンドシミュレータは、AWS のコンピューティングリソース上で動作し、ローカルシミュレータの機能に加え、いくつかの拡張機能を備えています。以下のコードで、利用可能な Braket のシミュレータをすべてリストアップすることができます。" ] }, { "cell_type": "code", "execution_count": 4, "id": "a0d738da-fb1a-4430-926e-c41608b5b923", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "[BraketBackend[SV1], BraketBackend[TN1], BraketBackend[dm1]]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from qiskit_braket_provider import AWSBraketProvider\n", "\n", "provider = AWSBraketProvider()\n", "\n", "provider.backends(statuses=[\"ONLINE\"], types=[\"SIMULATOR\"])" ] }, { "cell_type": "markdown", "id": "4fd3c5ba-7c3f-42d5-bad4-8688df3f456a", "metadata": {}, "source": [ "オンデマンドシミュレータの 1 つめは SV1 です。これはフル状態ベクトルシミュレータで、ローカルシミュレータよりも大規模な回路のシミュレーションが可能です。また、タスクをバッチ処理して並列実行する機能とともに、変分量子アルゴリズムの adjoint 勾配計算などの応用テクニックも使用できます。\n", "\n", "**推奨ユースケース :** 最大 34 量子ビットのノイズなし変分アルゴリズム" ] }, { "cell_type": "code", "execution_count": 5, "id": "d72c0fee-c643-46e6-b536-922b3d5e1b63", "metadata": { "tags": [] }, "outputs": [], "source": [ "aws_sv1 = provider.get_backend(\"SV1\")" ] }, { "cell_type": "markdown", "id": "022f2518-cbb8-4679-8175-b0347fe41955", "metadata": {}, "source": [ "2 つめのオンデマンドシミュレータは DM1 です。これは密度行列シミュレータで、SV1 と同様に、より多くの量子ビットをシミュレートでき、バッチ実行も可能です。\n", "\n", "**推奨ユースケース :** 最大 17 量子ビットのノイズあり変分アルゴリズム" ] }, { "cell_type": "code", "execution_count": 6, "id": "a1d6a663-7717-40ca-9bd1-4ea0e2591757", "metadata": { "tags": [] }, "outputs": [], "source": [ "aws_dm1 = provider.get_backend(\"dm1\")" ] }, { "cell_type": "markdown", "id": "0b8e5316-46ea-4c81-b855-78d8d2784bc7", "metadata": {}, "source": [ "最後のオンデマンドシミュレータは TN1 です。これはテンソルネットワークシミュレータで、回路内の各ゲートをテンソルとして表現します。TN1 は、局所的なゲートやその他の特殊な構造を持つ回路では、より多くの量子ビットをシミュレートできますが、長距離のゲートや all-to-all のゲート構造を持つ回路に対しては、SV1 や DM1 よりも遅くなるのが普通です。\n", "\n", "**推奨ユースケース :** 局所的な接続性を持ち、最大 50 量子ビットのノイズなし回路" ] }, { "cell_type": "markdown", "id": "3888f97e-fb68-428c-95ba-bff9b1e9fecc", "metadata": {}, "source": [ "**注意:** 各 AWS リソース (ファイル、CPU、QPUなど) は特定のリージョンにのみ存在し、そのリージョンからしかアクセスできない場合があります。例えば、TN1 は `eu-west-2`、 `us-east-1`、 `us-west-2` リージョンでのみ利用可能です。\n", "\n", "マネージドノートブックで実行している場合に AWS リージョンを変更するには、AWS コンソールの右上から新しいリージョンを選択し、Braket コンソールからノートブックを再起動または作成する必要があります。\n", "\n", "ローカル開発環境で実行している場合に AWS リージョンを変更するには、次のコードスニペットを実行します。\n", "```\n", "import os\n", "os.environ[\"AWS_REGION\"] = \"your-desired-region\"\n", "```" ] }, { "cell_type": "code", "execution_count": 9, "id": "c3727ffa-36ea-4d8f-926a-5a7bed46cd57", "metadata": { "tags": [] }, "outputs": [], "source": [ "# TN1 にアクセスできるリージョンの 1 つに切り替えた場合は、次のコードのコメントを自由に解除できます。\n", "# aws_tn1 = provider.get_backend(\"TN1\")" ] }, { "cell_type": "markdown", "id": "37f15848-db35-4a3b-8efb-2790f25f9708", "metadata": {}, "source": [ "### 量子処理ユニット (QPU)\n", "\n", "Amazon Braket では、多くのサードパーティ製量子ハードウェアデバイスへのアクセスも可能です。以下のコードは、現在オンラインの、サポートされている QPU を表示します。" ] }, { "cell_type": "code", "execution_count": 10, "id": "891dbaac-f94f-41f9-947d-bed68342aca9", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "[BraketBackend[Aspen-M-3], BraketBackend[Harmony]]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "provider.backends(statuses=[\"ONLINE\"], types=[\"QPU\"])" ] }, { "cell_type": "markdown", "id": "906cccb3-4893-494a-8718-6b4b4a66621d", "metadata": {}, "source": [ "各量子コンピュータの詳細については、Braket ホームページの [Providers Overview](https://aws.amazon.com/braket/quantum-computers/)、または Braket コンソールの左側にある Devices タブから確認できます。\n", "現在、Qiskit-Braket プロバイダでサポートされているのは、ゲートベースのQPU (IonQ, OQC, Rigetti) のみです。" ] }, { "cell_type": "markdown", "id": "e3af4dfd-d1ba-44aa-a913-18da11b3e520", "metadata": {}, "source": [ "## Braket デバイス上で回路を実行する\n", "\n", "Qiskit-Braket プロバイダで利用可能な量子デバイスについて説明したので、実際に使ってみましょう!今回の例では、Rigetti デバイスで 3 量子 GHZ 状態を作成しますが、以下のコメントアウトされたデバイスから自由に別の QPU を選択できます。" ] }, { "cell_type": "code", "execution_count": 11, "id": "7b870ef3-f2b8-47d4-b571-82ca22925fec", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "BraketBackend[Aspen-M-3]\n" ] } ], "source": [ "qpu_backend = provider.get_backend(\"Aspen-M-3\")\n", "# qpu_backend = provider.get_backend(\"Lucy\")\n", "# qpu_backend = provider.get_backend(\"IonQ Device\")\n", "\n", "print(qpu_backend)" ] }, { "cell_type": "code", "execution_count": 12, "id": "dfa16813-80d8-407c-ac6d-ce7bb1982e17", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
     ┌───┐          \n",
       "q_0: ┤ H ├──■────■──\n",
       "     └───┘┌─┴─┐  │  \n",
       "q_1: ─────┤ X ├──┼──\n",
       "          └───┘┌─┴─┐\n",
       "q_2: ──────────┤ X ├\n",
       "               └───┘
" ], "text/plain": [ " ┌───┐ \n", "q_0: ┤ H ├──■────■──\n", " └───┘┌─┴─┐ │ \n", "q_1: ─────┤ X ├──┼──\n", " └───┘┌─┴─┐\n", "q_2: ──────────┤ X ├\n", " └───┘" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from qiskit import QuantumCircuit\n", "\n", "circuit = QuantumCircuit(3)\n", "circuit.h(0)\n", "circuit.cx(0, 1)\n", "circuit.cx(0, 2)\n", "circuit.draw()" ] }, { "cell_type": "code", "execution_count": 13, "id": "e6237c66-f833-4554-8542-385c92500ace", "metadata": { "tags": [] }, "outputs": [], "source": [ "# run circuit\n", "qpu_task = qpu_backend.run(circuit, shots=10)" ] }, { "cell_type": "markdown", "id": "b9bc9a23-a786-4fbd-8d90-d97a6e1ef972", "metadata": {}, "source": [ "実行したタスクには、それぞれ固有の ARN(Amazon Resource Name)が割り当てられ、これを保存しておくことで、タスク実行後にノートブックを閉じても、タスクのデータを取得することができます。" ] }, { "cell_type": "code", "execution_count": 14, "id": "c0952b4e-0d8c-4f74-859b-50ad53065854", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "'arn:aws:braket:us-west-1:700863243650:quantum-task/1f41ab60-ed25-4352-8d2d-28b6772d94ee'" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "task_id = qpu_task.job_id()\n", "task_id" ] }, { "cell_type": "markdown", "id": "24514bc7-06d1-4a7a-9a20-af1b414fb388", "metadata": {}, "source": [ "**注意 :** Amazon Braket で「タスク (task)」と呼ばれるものを、Qiskit は「ジョブ (job)」という名称で使用しています。`.job_id()` を呼び出すことで、タスクの ARN にアクセスできるのはこのためです。\n", "\n", "一方で、Braket には「ハイブリッドジョブ (Hybrid Jobs)」と呼ばれる別の機能があります。この機能は今回のノートブックの範囲を超えていますが、[開発者ガイド](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs.html)で読むことができます。" ] }, { "cell_type": "code", "execution_count": 15, "id": "b5a183ef-c490-4771-a52b-9f31920115ff", "metadata": { "tags": [] }, "outputs": [], "source": [ "# タスクデータの取得\n", "retrieved_task = qpu_backend.retrieve_job(job_id=task_id)" ] }, { "cell_type": "markdown", "id": "5ba5ad23-cb76-4be4-99f4-c8c90b262470", "metadata": {}, "source": [ "その後、タスクが終了したかどうかステータスで確認できます。" ] }, { "cell_type": "code", "execution_count": 22, "id": "e43a566b-3d67-47d9-bf10-273c02bd569a", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "retrieved_task.status()" ] }, { "cell_type": "markdown", "id": "1f64ea6c-7c70-48a9-921a-924685252fdf", "metadata": {}, "source": [ "**注意:** デバイスによって、利用可能な時間帯は異なります。そのためタスクはすぐに実行されないかもしれませんが、キューに追加され、デバイスがオンラインに戻った時に実行されますので、ご安心ください。" ] }, { "cell_type": "markdown", "id": "a388fb50-73ea-473e-b67b-750ac85a3d71", "metadata": {}, "source": [ "タスクが終了したら、データを取得できます。" ] }, { "cell_type": "code", "execution_count": 23, "id": "45b16834-9e64-4d90-a460-bfb84f0f4425", "metadata": { "tags": [] }, "outputs": [], "source": [ "data = retrieved_task.result()" ] }, { "cell_type": "code", "execution_count": 24, "id": "d12f0cb5-71ac-41ae-8028-3436b4d6c198", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/png": "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qcoVwlavXq1rr71WoaGhZzw3NDRU1157rb7++usKFwcAAFBTlSuE7du3T23btj3r89u0aaOffvqp3EUBAADUdOUKYS6XSwUFBWd9fkFBgVyuCu8HCwAAUGOVKyFFRUUpLS3trM9PS0vThRdeWO6iAAAAarpyhbCrrrpKK1as0M6dO8947s6dO7VixQpdffXVFa0NAACgxipXCEtISFBBQYHi4+N18ODBMs87dOiQbr75ZhUWFur+++8/5yIBAABqmnJt1tq9e3dNnDhRM2fOVExMjO677z7FxcXpoosukiTt3btXX375pebNm6cDBw5o0qRJ6t69+3kpHAAAoDor9475M2bMUJ06dfTyyy9r6tSpmjp1arHjxhi53W5NnjxZzz//fKUVCgAAUJOUO4Q5jqMXXnhBd911lxYsWKDVq1dr//79kqQWLVqob9++GjdunNq1a1fpxQIAANQUFb6Ad7t27ZjpAgAAqCA28QIAALCAEAYAAGABIQwAAMACQhgAAIAFhDAAAAALCGEAAAAWEMIAAAAsIIQBAABYQAgDAACwgBAGAABgASEMAADAAkIYAACABYQwAAAACwhhAAAAFhDCAAAALCCEAQAAWEAIAwAAsIAQBgAAYAEhDAAAwAJCGAAAgAWEMAAAAAsIYQAAABYQwgAAACwghAEAAFhACAMAALCAEAYAAGABIQwAAMACQhgAAIAFhDAAAAALCGEAAAAWEMIAAAAsIIQBAABYQAgDAACwgBAGAABgASEMAADAAkIYAACABYQwAAAACwhhAAAAFhDCAAAALCCEAQAAWEAIAwAAsIAQBgAAYAEhDAAAwAJCGAAAgAWEMAAAAAsIYQAAABYQwgAAACwghAEAAFhACAMAALCAEAYAAGABIQwAAMACQhgAAIAFhDAAAAALCGEAAAAWEMIAAAAsIIQBAABYEHAhbO/evZo5c6YGDRqkli1bKiQkRC1atNBNN92kdevW2S4PAACgUgRcCHv11Vf1yCOPaPv27Ro0aJAeffRRXXnllfroo4/Up08fvf/++7ZLBAAAOGdBtgs4Vc+ePZWcnKx+/foVa1+1apUGDBig+++/XyNGjFBoaKilCgEAAM5dwM2E3XjjjSUCmCRdddVViouL05EjR/T9999bqAwAAKDyBFwIO53g4GBJUlBQwE3gAQAAlEu1STO7d+/W8uXLdcEF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qkGDBmnYsGG64oorir2GFL1V/euvv2revHnq2rWr4uLiLFYOWxgzFVQ1O2GgshTtXv7GG2+UOHbyvmFF+7HccMMNpkOHDmbnzp1VViMCx48//mgaNGhgnnjiCX+b1+stsV9PXl6e+fTTT03btm1NZGSkWb16dVWXigCRlpZmHMcxl19+uRk4cKB/v8EGDRqYwYMHm1mzZpkff/yx2H1WrVplHMcxffv2tVQ1bGLMVBxzg9XMf/zHf+iyyy7T3XffrYceekjffPONjh8/Lunfn2orLCyUy+WSx+NRSEiIjh8/rlatWtksG5YYY9SwYUP/FhNF2wmcOnsaEhKiYcOG6ZVXXtGRI0e0atUqazXDru+//16SdOuttyoxMVGbN2/WSy+9pIsvvliJiYmaOHGirrnmGt166636+9//riNHjiglJUWSNHnyZJulwxLGzDmwHAJRAR9++KH/Ug+XX365ee6550xSUpLZuXOnyc3N9Z/39ttvm6ZNm5p7773XYrWw7YorrjBhYWFm2bJlJY4VzZ4WzYwdOnTItGnTxsTHx1dpjQgcc+fONY7jlDpeUlJSzCOPPGKio6P9sx0dOnQwLVq0MBEREVVfLAICY6biWBNWTZhT1nMdPnxYL774ohYvXqzMzEw1bdpUl112maKiolSvXj3l5uZq8eLFatOmjZYsWaKOHTtarB42FI2ZlJQU3Xjjjdq3b58efvhhjR49Wl26dFGdOnX85xZt6LtmzRrFx8crPj5es2bNslg9bDDGaN26dVq8eLESEhLUrl07f/vJrz/Hjx/Xl19+qQ8++EBLliyRx+NRQkKCXn31VVulwxLGzLkhhFUjRYN6z549ioqKksvlUlpampYuXark5GT9+OOPyszMlCQ1atRIsbGxmj17ti699FLLlcMmr9ert99+W5MnT9b+/fsVExOjQYMGqU+fPoqJiVGnTp3kcrm0d+9ePfbYY/rggw+0bt06de/e3XbpsCQ7O1shISEKCQkpcezUP64PPvig5syZo2+++UaxsbFVWCUCCWOmYghh1UBhYaG+/vprvfnmm0pPT5fjOKpXr5569OihW265Rd26dZMxRpmZmcrNzdX27dvVqVMnRUdHKygoiE9FQpJ04MABvfbaa1q8eLHS09NVr149XXjhhWrQoIEiIyO1efNmHThwQOPHj9ecOXNsl4sAVvSasm3bNo0aNUpZWVnKyMiwXRYCGGOmdISwamD69Ol67rnndOzYMV188cVyu93asmWL/3hMTIweeOABxcfHc7kQlGBOulhubm6uMjIytH79en399ddat26dNm/erKZNmyo6Olp33323br/9dtWvX9922agGli5dquHDh+uxxx7TtGnTbJeDaoAxUxwhLMDt2LFDnTt3Vvfu3bVo0SKFhISoefPm2r9/vz755BN98MEHSk5OliTFxcVp2rRpuvzyy+0WjYDn8/l0/PhxhYSEKCsrS/v37+dta/id7ez5zz//rM8//1zXX3+9IiMjq6AyBCrGTMUQwgLcU089pblz5+rdd9/VgAEDJJUc7N9//72mT5+uxYsXq1WrVnrnnXf0m9/8xlbJsCw3N1e7d+9Wy5YtVbdu3WLHfD6fHMcpdpHuk8fSyZv/ovY43Zg5k9p6zb/ajjFTOXi1DXCbNm1SgwYN1L59e0nyX6bI/P912iSpc+fOWrRokV566SWlp6frtddes1kyLJs1a5Zuv/12zZw5U0lJSdq3b59/rLhcLv/4OTmAHThwwL+/HGqf042ZshSNGf6Y1k6MmcrBTFiAe/755/XUU08pLS1NMTExpZ5z8h/T+Ph4rV+/XklJSWrbtm1VlooAcdFFF2nfvn1yu92KiIhQnz59NGjQIF1xxRVq27ZtiUsX5eTk6Omnn9ahQ4f0+uuvE8RqoXMZM/Pnz+ePai3EmKkcXO4+wBVdU+u2227TjBkzdOWVV5b6EeCi6d2OHTvqs88+U3Z2dlWXigCQnp6urKws9e7dW7feeqv++c9/as2aNVq6dKlatmyp/v3769prr1W3bt104YUXqmHDhkpLS9P8+fPVv39/AlgtdK5jhj+mtQ9jpvIQwgJcr169NGnSJL3yyit68MEHlZCQoPj4eDVv3tx/juM4crvdOnLkiPbs2aP69eurS5cuFquGLenp6Tp+/LgGDRqkhIQE/fa3v9WWLVu0Zs0arVixQv/4xz/0zjvvKCYmRtdcc42GDBmiL7/8Uh6PRxMmTLBdPixgzKC8GDOVh7cjq4m5c+fq5Zdf1vbt2xUVFaWRI0dq6NChio6OltvtVsOGDfXqq69q5syZeuCBBzRjxgzbJcOC//7v/9Ytt9yi9957T7fccou/vaCgQLt27dK3336rVatW+Tf3DQ4OljFGoaGhOnz4sMXKYQtjBuXFmKk8hLBqwhijrVu3av78+Xrvvfe0Z88eSVKzZs0UHBysn376ST6fT6NHj9a0adN00UUXWa4YNhhjtHnzZtWpU0dt2rQp9WPjOTk5Sk9P15YtW7RgwQL985//1IMPPqjZs2dbqho2MWZQXoyZykMIq4ZycnKUkpKijz/+WPv27dMvv/yi8PBw3XLLLbrpppuKXRMQKFLaC+VDDz2k1157TRs2bFC3bt0sVYZAxZhBeTFmyocQVs0VFBQoODjYdhmoRor2Atu5c6duuOEGHTlyRLt377ZdFgIYYwblxZg5O3wUqpojgKG8ij4BuXfvXhUUFOiBBx6wXBECHWMG5cWYOTvMhAG1lDFGe/bsUWRkJNeKxFlhzKC8GDOnRwgDAACwgLcjAQAALCCEAQAAWEAIAwAAsIAQBgAAYAEhDAAAwAJCGAAAgAWEMAAAAAsIYQAAABYQwgAAACz4Pw4bks8N8ywiAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from qiskit.visualization import plot_histogram\n", "plot_histogram(data.get_counts())" ] }, { "cell_type": "markdown", "id": "20ce9b2f-83d1-4f4b-9ac4-7e1f2c351dba", "metadata": {}, "source": [ "## Braket デバイス上でアルゴリズムを実行する\n", "\n", "さらに、Qiskit-Braket provider を使用して、Braket バックエンド上で組み込みの Qiskit アルゴリズムを実行できます。例えば、水素の基底状態を見つけるために VQE アルゴリズムを実行できます。この問題は少ない量子ビットしか必要としない基底で表現でき、素早く実行できるので、ローカルシミュレータを使用します。" ] }, { "cell_type": "code", "execution_count": 26, "id": "45b133dd-d37c-4f53-8385-e8715cdfcccb", "metadata": { "tags": [] }, "outputs": [], "source": [ "from qiskit.opflow import (\n", " I,\n", " X,\n", " Z,\n", ")\n", "\n", "# H2 のハミルトニアン演算子を Pauli スピン演算子で定義します。\n", "H2_op = (\n", " (-1.052373245772859 * I ^ I)\n", " + (0.39793742484318045 * I ^ Z)\n", " + (-0.39793742484318045 * Z ^ I)\n", " + (-0.01128010425623538 * Z ^ Z)\n", " + (0.18093119978423156 * X ^ X)\n", ")" ] }, { "cell_type": "code", "execution_count": 27, "id": "9a4af5ae-b7bc-40c2-b375-176ff54d8cda", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{ 'aux_operator_eigenvalues': None,\n", " 'cost_function_evals': 9,\n", " 'eigenstate': { '00': 0.12103072956898178,\n", " '01': 0.11692679333668567,\n", " '10': 0.10825317547305482,\n", " '11': 0.9797759629119301},\n", " 'eigenvalue': (-1.0889057236530086+0j),\n", " 'optimal_circuit': None,\n", " 'optimal_parameters': { ParameterVectorElement(θ[3]): -5.755436545071434,\n", " ParameterVectorElement(θ[1]): -0.06350247974205825,\n", " ParameterVectorElement(θ[7]): -5.525501547721888,\n", " ParameterVectorElement(θ[4]): -5.425306283034111,\n", " ParameterVectorElement(θ[0]): -2.9712537272548736,\n", " ParameterVectorElement(θ[6]): 4.055161926547246,\n", " ParameterVectorElement(θ[5]): -4.2635679526293035,\n", " ParameterVectorElement(θ[2]): -3.5371159105090197},\n", " 'optimal_point': array([-2.97125373, -0.06350248, -3.53711591, -5.75543655, -5.42530628,\n", " -4.26356795, 4.05516193, -5.52550155]),\n", " 'optimal_value': -1.0889057236530086,\n", " 'optimizer_evals': None,\n", " 'optimizer_result': None,\n", " 'optimizer_time': 0.8830254077911377}\n" ] } ], "source": [ "# ライブラリのインポート\n", "from qiskit.utils import QuantumInstance\n", "from qiskit.circuit.library import TwoLocal\n", "from qiskit.algorithms.optimizers import SLSQP\n", "from qiskit.algorithms import VQE\n", "\n", "# Braket バックエンドで `QuantumInstance` を定義します。\n", "qi = QuantumInstance(local_simulator, seed_transpiler=42, seed_simulator=42)\n", "\n", "# VQE の設定\n", "ansatz = TwoLocal(rotation_blocks=\"ry\", entanglement_blocks=\"cz\")\n", "slsqp = SLSQP(maxiter=1)\n", "vqe = VQE(ansatz, optimizer=slsqp, quantum_instance=qi)\n", "\n", "# 基底状態を見つけます。\n", "result = vqe.compute_minimum_eigenvalue(H2_op)\n", "print(result)" ] }, { "cell_type": "markdown", "id": "db9fd813-d906-4b2e-a9e3-1bef49119f40", "metadata": {}, "source": [ "## 今後のアクション\n", "\n", "可能性は無限大です!Qiskit-Braket provider はまだ新しく実験的なものなので、バグに遭遇した場合や新機能をサポートしたい場合は、[GitHub に issue を提出](https://github.com/qiskit-community/qiskit-braket-provider/issues)し、feature ブランチを作って開発に参加してみてください!" ] }, { "cell_type": "code", "execution_count": 28, "id": "b6c4c957-8621-4a87-abcc-cf52985b7ba1", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Task Summary\n", "{'arn:aws:braket:us-west-1::device/qpu/rigetti/Aspen-M-3': {'shots': 10, 'tasks': {'COMPLETED': 1}}}\n", "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", "Estimated cost to run this example: 0.30 USD\n" ] } ], "source": [ "print(\"Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\")" ] }, { "cell_type": "code", "execution_count": null, "id": "91adb2cf-d9ba-4bca-b4e8-11cc3dcbcff6", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "conda_braket", "language": "python", "name": "conda_braket" }, "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.11" } }, "nbformat": 4, "nbformat_minor": 5 }