量子ミドルウェアの有名どころをまとめてみた

# はじめに
この記事では量子コンピュータを活用したアプリケーションの開発を支援するようなライブラリやSDKなどのソフトウェアを総称して「**量子ミドルウェア**」と呼んでご紹介したいと思います。
ちなみに、今回取り上げる量子ミドルウェアは我々のようなアプリケーション開発者が意識するミドルウェアを対象とし、ハードウェア寄りの技術（例えば量子ハードウェア制御をつかさどるような技術や量子ハードウェアの代替となるシミュレータ）については対象外とします。

# なぜ量子ミドルウェアが必要なのか
量子コンピュータに対してプログラミングをするとき、解きたい問題を

* ゲート型では量子回路に
* アニーリング型ではイジングモデル・QUBOに

それぞれ人の手で表現し直して、さらにマシンに埋め込む処理を行う必要があります。

古典コンピュータにおけるプログラミングでは
 **レジスタを明示的に指定して → 論理ゲートを指定して → プログラムを実行する**
なんてことはまずやりませんが、それに近いことを量子コンピュータにおけるプログラムでは行っているような感覚です。

この中で、量子回路やイジングモデル・QUBOを考えるのは最低限人間の仕事としても、それらを**どうやって表現してあげて、どうやって埋め込むのか**、という部分は量子ハードウェアに対応したSDKを使う必要があるのです。

ただ、開発競争が激しいこの領域において量子ハードウェアごとにSDKを使い分けているようでは、もし仮に自分の支持していた量子ハードウェアが淘汰されてしまったときにまたイチから構成し直す必要が出てきます。
そこで、SDKとして対応できる量子ハードウェアの幅を広げることでそのようなリスクも回避しつつ、**アプリケーションの開発がハードウェアに依存することのないようにしよう**という動きも最近ではあるんじゃないかと思っています。

また、量子回路やイジングモデル・QUBOを人間が考えるとは言いましたが、中にはある程度共通化やパターン化ができるような部分もあります。
そういった共通化やパターン化ができる箇所に適用できるライブラリも開発がされており、そのようなライブラリを使うことで**アプリケーション開発をより簡易化する**ことも可能です。

以上より、量子ミドルウェアには

* 解きたい問題の表現方法を定義し量子ハードウェアにそれを埋め込む
* 様々な量子ハードウェアに対応することでアプリケーションの開発がハードウェアに依存しないようにする
* 共通化やパターン化によってアプリケーション開発を簡易化する

といった役割があると考えています。

# 主な量子ミドルウェアの紹介
## 量子ゲート型 回路生成／計算実行系
### Qiskit
https://qiskit.org/

![2021-12-02_221024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214621/683d91f0-1ffb-658a-db1b-a1582e9efc86.png)

QiskitはIBMが開発するIBM Qでプログラムを実行するためのPython向けSDKとしてIBMから提供されているもので、オープンソースプロジェクトとして開発が進められています。

現在ではIBM QだけでなくIonQやHoneywell、Rigettiにも対応しており裾野を広げています。
（[IonQへの対応](https://github.com/Qiskit-Partners/qiskit-ionq)は[こんな記事](https://ionq.com/docs/get-started-with-qiskit)も出ているので公式っぽい雰囲気ですが、HoneywellやRigettiへの対応は各々独自でモジュールを開発しているような気がします。）

IBM Qで量子計算を実行するとき、Qiskitを使って書かれたPythonプログラムをそのまま実行しているわけではなく、裏でQiskitがプログラムをOpenQASMというアセンブリ言語に変換してIBM Qに実行させています。
それにより開発者はアセンブリ言語であるOpenQASMを意識せずにアプリケーションを開発することができます。

Qiskitでは量子回路の生成や量子計算の実行指示ができるだけでなく、量子状態をシミュレートした結果を様々なバリエーションで可視化する機能があったり、著名な量子アルゴリズムが実装されているといった特徴もあります。
量子状態の可視化の例として、ブロッホ球での表現をする場合はこんな感じです。

```python
from qiskit.visualization import plot_bloch_vector
plot_bloch_vector([0,1,0])
```

![2021-12-02_181808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214621/e7b9199d-b197-b22c-94bf-54fe670c099f.png)

ちなみに、Anaconda環境さえあれば`pip`コマンドでインストールするだけでQiskitを使い始めることができます。

```
pip install qiskit
```

また、量子コンピュータ関連では史上初の開発者資格試験としてQiskitの試験が2021年4月に開始されました。
https://www.ibm.com/blogs/think/jp-ja/quantum-developer-certification/
こういった取り組みをしている点でも類似のSDKとは一線を画するというか本気度が感じられる気がします。

チュートリアルも充実しているので、初心者の方はまずQiskitからマスターするのが無難ではないでしょうか。

### Cirq
https://quantumai.google/cirq

![2021-12-02_221135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214621/a80574a6-a73a-d796-df69-fc9e1212c9ba.png)

CirqはGoogleが提供しているPython向けSDKで、現状Qiskitの有力対抗馬的な存在です。
これもオープンソースプロジェクトとして開発が進められております。

ドキュメントには対応ハードウェアとしてはGoogle Quantum Computing Service、Alpine Quantum Technologies、Pasqal、IonQと書いてあるのですが、この中で2021年末時点に一般公開されているハードウェアはIonQだけだと思います。
（Google Quantum Computing Serviceについては[公式ページ](https://quantumai.google/quantum-computing-service)を読み進めていると[このようなハードスペック資料](https://quantumai.google/hardware/datasheet/weber.pdf)からGoogleがかつて開発を進めていたSycamoreを指している様子なのですが、Sycamoreも一般公開されていないはずです。）
ドキュメントの対応ハードウェアとしては上記4つしか記載されていないのですが、[getting_started](https://quantumai.google/cirq/tutorials/rigetti/getting_started)にはRigettiでも使えるような記載もありました。
また、Azure Quantum経由であればHoneywellにも対応しているようです。

Qiskitのように多機能というわけではないようで、基本的には純粋に回路生成と計算実行ができるというシンプルな作りとなっている模様です。

### Microsoft QDK
https://azure.microsoft.com/ja-jp/resources/development-kit/quantum-computing/

![2021-12-02_221212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214621/9a0b6f86-50da-b76d-09b8-27c46571e5a9.png)

Microsoft QDKはMicrosoftが開発しているSDKで、2019年にオープンソース化されました。
Q#と呼ばれるMicrosoft独自の言語で記述された量子アプリケーションのソースコードをコンパイルする機能がメインなのですが、量子化学計算や量子機械学習を行うためのライブラリも持ち合わせています。
Q#は.NET系の言語ですが、Jupyter Notebookにも統合ができます。

GitHubにはMicrosoft QDKを使った[サンプルのソースコード](https://github.com/microsoft/Quantum)も公開されています。

対応しているハードウェアは、AzureQuantumでサポートしているIonQとHoneywellの2つです。

## 量子ゲート型 目的特化系
### Orquestra
https://www.orquestra.io/

![2021-12-02_222025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214621/f4839567-d936-dde3-09cd-6b64ace7ec17.png)

Zapata Computing社が提供する、量子アプリケーションの開発統合環境です。

ワークフローベースで量子アプリケーションを開発することができ、ソフトウェア側はQiskit、Cirq、PennyLaneなどに対応しつつ、Scikit-learnやTensorFlowとも統合することができます。
言語は基本Pythonですが、JuliaやQ#にも対応可能なようです。
ハードウェアはIBM Q、Rigetti、IonQ、Honeywellに対応しており、量子コンピュータが返した計算結果をPandasやJSON、CSV、PostgreSQLに出力することもできます。

Zapata Computing社は日本にも縁がある企業で、伊藤忠商事が出資しているということの他にも、CEOのChristopher Savoie氏は日本国籍を取得しており九州大学で学んだこともある方のようです。

### tket
https://cambridgequantum.com/our-technology/

![2021-12-02_221337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214621/3deb4da9-c24d-0255-6366-b3046af88982.png)

tketはHoneywell社が買収したCambridge Quantum Computing社が提供する量子コンピュータ用の汎用コンパイラです。
Python、OpenQASM、Q#など様々なプログラミング言語で利用することができ、かつIBM Q、Rigetti、IonQ、Honeywell、Alpine Quantum Technologiesなどのハードウェアに対応しているようです。

2021年10月に完全にオープンソース化され、制限なくtketを利用することが可能になりました。

特徴としては、ハードウェアに依存しない量子回路の最適化が行える点と、量子デバイスに応じた最適なコンパイルを行える点で、ハードウェアの特性を引き出しつつハードウェアごとにコードを書き換える必要を最小限にできます。
まだまだどのハードウェアが覇権を握るか不透明な中で、こういった機能はありがたいかもしれないですね。

### PennyLane
https://pennylane.ai/

![2021-12-02_221418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214621/2faab871-2800-99ff-585b-e9ebb94202d1.png)

PennyLaneは光量子コンピュータを開発するXanadu社が提供している量子機械学習に特化したライブラリです。
対応している言語はPythonです。

量子機械学習のアルゴリズムや回路の設計には専門知識を要するのですが、一般的な機械学習フレームワークであるKerasをベースとしており、Kerasと同じような使い勝手で量子機械学習が実行できます。
これにより、変分回路や勾配降下の表現が簡易的にできるようになります。
ハードウェアの対応としてはやはりここでもIBM Q、Rigetti、IonQ、Honeywellといったマシンに対応できるようになっています。
また、[Amazon BraketでもPennyLaneをサポート](https://aws.amazon.com/jp/about-aws/whats-new/2020/12/amazon-braket-now-supports-pennylane/)しています。

ちなみに量子機械学習ではない普通の量子回路も組むことができます。

### Blueqat
https://blueqat.readthedocs.io/ja/latest/

BlueqatはAWS社とのパートナーシップも締結している日本のBlueqat社（旧名 MDR社）が開発したゲート型量子コンピュータ向けのフレームワークです。
日本語情報が豊富で日本人が概要を捉える際には非常に有用かと思われます。
記述形式が非常にシンプルな点も特筆すべき点で、QiskitやCirqでは回路に組み込むゲートを一行一行かけていく必要があるのに対して、Blueqatではメソッドチェーンでつなげて記述することができます。

## アニーリング型向け
### Ocean SDK
https://docs.ocean.dwavesys.com/en/stable/

D-Wave社が提供している量子アニーリングマシン専用のSDKです。
Python環境で使うことができます。
D-Wave社のゲート型への取り組みも話題となっていますが、今後の動向は引き続きウォッチしたいですね。

### Fixstars Amplify SDK
https://amplify.fixstars.com/ja/sdk

![2021-12-02_221452.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214621/c9367a19-3735-96ce-49a9-6c852d8f3648.png)

Fixstars社が提供するクラウドサービスFixstars AmplifyではD-Waveの量子アニーリングマシンやFixstars社のGPUベースのイジングマシンのほか、日立、富士通、東芝の古典イジングマシンも利用ができます。
そのFixstars Amplifyを利用するためのSDKがFixstars Amplify SDKで、バックエンドのハードウェアを意識せず統一的にソースコードを記述することができます。
また、イジングモデルやQUBOの作成を支援するような機能も備えています。

量子アニーリングマシン（≒D-Wave）のスペックがまだまだ実用段階に達していない現時点では、とりあえず古典イジングマシンにつなげて解きたい問題を解かせておいて、将来量子アニーリングマシンのマシンスペックが充実して量子コンピュータの優位性が証明されたときにそちらへ切り替える、みたいな使い方もできると思います。

# 最後に
（主に筆者の努力と能力の不足により）紹介ができなかった量子ミドルウェアもまだまだたくさんありますが、今回取り上げたものを一通り概要レベルでも抑えておけばそこそこ網羅できるような気はしています。

量子コンピュータを使ったアプリケーションの開発と聞くとややハードルを感じてしまうかもしれませんが、チュートリアルやドキュメントが整備されている量子ミドルウェアを使えば、意外と直感的に開発ができるかと思います。

おそらくこれからも色々の量子ミドルウェアが開発されていくかと思いますが、便利そうなものや自分に合うものを見つけて試しに触ってみるのも面白いかもしれません:smiley:

---

本記事に記載の会社名、製品またはサービスなどの名称は、各社の商号、商標もしくは登録商標です。本文中、および図中では、TM マーク、(R)マークは必ずしも表記しておりません。
なお、個々のコンテンツにおいて、個別に商標が示されている場合には、当該情報が優先されます。