asdf + Poetry + VSCode で Qiskit 開発環境を構築する


個人的な興味で量子コンピュータについて学習しており、Qiskitというライブラリを使って量子プログラミングにチャレンジしています。今回はasdfやPoetryのようなバージョン管理ツールを使って、VSCodeのJupyter Notebook拡張機能でQiskitを用いた量子プログラミングを行う環境を構築してみましたので、ご紹介します。

## はじめに

### Qiskit とは
https://www.ibm.com/quantum/qiskit

最近は量子コンピューターの研究が盛んに行われていますが、それに追随して量子ソフトウェア開発キット(SDK)も登場しています。

**Qiskit**は代表的な量子SDKの一つであり、量子回路の構成、回路の最適化、実機またはシミュレーターでの実行、測定結果の分析を実行できるPythonライブラリです。

最近ではRustを採用したこともあり、回路の操作（量子SDKが量子回路の生成と変換を行う作業）、およびトランスパイル（量子実機で実行できるよう変換する作業）におけるパフォーマンスは[他の量子SDKよりも速いです](https://www.ibm.com/blogs/systems/jp-ja/qiskit-performance/)。
Pythonで記述するため量子プログラミング初心者の方でも学習しやすくおすすめです。

### asdf, Poetry について

本記事では、Python言語のバージョンをasdfで、各種ライブラリのバージョンをPoetryで管理します。
理由としては依存関係を簡単に解決してくれたり、追加、削除、切り替えなど簡単にできるためです。
またPoetryはPythonの仮想環境を簡単に作成できます。

* asdf
    * Python, Go, Java, Node.jsなどさまざまな言語のバージョンを管理・切り替え可能なツール

https://asdf-vm.com/

* Poetry
    * Qiskit, matplotlib, NumPyなどさまざまなPythonライブラリのバージョンを管理・切り替え可能なツール
    * 仮想環境の作成もできる

https://python-poetry.org/

Qiskitの公式ドキュメントや他の開発者の方々の記事では`pip`を使用する場合が多いですが、`pip`よりPoetryの方がパッケージ管理しやすいため、ぜひ参考にしてみてください。

## Qiskit の環境構築

* 前提環境
    * macOS Sonoma
    * VSCodeをインストール済み
### 事前準備
#### asdfのインストール
詳しくは[公式サイト](https://asdf-vm.com/ja-jp/guide/getting-started.html)などをご覧ください。
私は以下のようにHomebrew経由でインストールしました。
```sh
# インストール
brew install asdf

# パスを通す
echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
```
終わったらターミナルを閉じて新しく開き直してください。
#### asdfのプラグイン追加
asdfではバージョン管理する言語ごとにプラグインを追加する必要があります。
PythonとPoetryプラグインをインストールします。
```sh
# Python
asdf plugin add python

# Poetry
asdf plugin add poetry
```
#### Python, Poetry のインストール
プラグインが揃ったので、PythonとPoetryをインストールします。
バージョンは以下の通りとしました。（QiskitはPythonの3.8以上が必要です）
```sh
# Python
asdf install python 3.12.4

# Poetry
asdf install poetry 1.8.3
```

### 環境作成
いよいよ環境作成をしていきます。
まずはプロジェクト用のフォルダ(今回は`sample_qiskit`とします)を任意の場所に作り、VSCodeをそのフォルダで開きます。

#### asdfでバージョン指定
VSCodeのターミナルを開き、次を実行すると`.tool-versions`というファイルが作成されます。
```sh
# このプロジェクト内で使用するPythonとPoetryのバージョンを指定する
asdf local python 3.12.4
asdf local poetry 1.8.3
```

#### Poetryでライブラリをインストール
Poetryがプロジェクト内に仮想環境を作るよう設定します。`poetry.toml`ファイルが作成されます。（このプロジェクト以外でもこの設定を適用する場合は`--local`を外してください。）
```sh
# 仮想環境を作るように設定
poetry config --local virtualenvs.create true

# プロジェクト内に仮想環境を作るように設定
poetry config --local virtualenvs.in-project true
```

Poetryから必要なライブラリをインストールします。
```sh
# poetryの初期化
poetry init -n

# 必要なライブラリのインストール
poetry add qiskit qiskit-ibm-runtime matplotlib pylatexenc ipykernel
```

### VSCodeでJupyter Notebook環境を作る
最後にVSCodeのJupyter拡張機能上でPythonプログラミングができるよう設定します。

VSCodeのJupyter拡張機能をインストールしてください。

https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter

#### ノートブックの作成
ノートブックファイルをプロジェクトの任意の場所に作成します。ファイル名は`任意の名前.ipynb`としてください。

右上の「カーネルの選択」ボタンを押し、`.venv(Python 3.12.4)`を選択します。

## 量子プログラムを実行してみる
これで環境構築は終了です。
早速、ノートブックのセルに量子プログラムを書いてみましょう。

```py
from qiskit import QuantumCircuit

# 量子回路を作成
circuit = QuantumCircuit(2)
# Hゲート(アダマールゲート)を0番目の量子ビットに適用
circuit.h(0)
# 0番目の量子ビットを制御量子ビットとして、1番目の量子ビットにCNOTゲートを適用
circuit.cx(0,1)
# 全ての量子ビットを測定
circuit.measure_all()
# 量子回路を描画
circuit.draw("mpl")
```
セルを実行すると以下のような回路が出力されるはずです。
![circuit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767455/cb2e5994-023d-1330-6f5c-95e334469200.png)

新しいセルを追加し、この量子回路をシミュレーション実行してみます。
```py
from qiskit.primitives import StatevectorSampler

# Samplerを初期化
sampler = StatevectorSampler()
# 量子回路を実行（1000回試行）
result = sampler.run([circuit], shots=1000).result()
# 結果を取得
data_pub = result[0].data
# 測定結果ごとにカウント
counts = data_pub.meas.get_counts()
# カウントを表示
print(f"The counts are: {counts}")
```
実行すると以下のように量子回路の出力結果が表示されます。値は毎回ランダムです。試行回数1000回のうち、「00」と「11」がおおよそ半々ずつになるはずです。
```
The counts are: {'00': 513, '11': 487}
```
ちなみにこの量子回路は2つの量子ビットの間に量子もつれ（エンタングルメント）を起こす回路となっています。
* 量子もつれとは
    * 一方の量子ビットを測定すると、もう一方の量子ビットの状態が決まるという関係
    * 今回の場合、0番目の量子ビットを測定値が決まると、1番目の量子ビットも同じ値に決まるため、「00」か「11」しか出現しない（「01」や「10」は一切出現しない）

## まとめ
今回はasdfやPoetryでパッケージ管理をしつつQiskit開発環境を構成してみました。Qiskitでもっと量子プログラミングを勉強していこうと思います。みなさんもぜひやってみてください。