え、Q#って量子回路出すようになったんですか？

# 概要:
VScodeでQ#のプロジェクトをいじっている
```operation```の上に色々出てきたのでその結果をJupyterでも表示しておきたかったのでメモ書き

# 環境:
私の環境はWSL2環境下のDocker(Nvidia-docker)上でjupyter-labを立ち上げます。

```dockerfile
FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04
...requirements.inのインストール等は省略...
```

#### Python packages
```
qsharp                    1.5.0
qsharp-jupyterlab         1.5.0
qsharp-widgets            1.5.0
```
# プロジェクト構築
### ディレクトリ構成

```bash
sample-project/
┠ src/
┃   ┠ operations/
┃   ┃   ┗ RandomBit.qs
┃   ┗ Main.qs
┠ qsharp.json
┗ notebook.ipynb # 今回の主役のノート
```

#### qsharp.json:
qsharpプロジェクトのマニフェストファイル
特に記載する必要はないので以下の様にしています。
```json
{}
```

詳細は[こちら](https://learn.microsoft.com/ja-jp/azure/quantum/user-guide/how-to-work-with-qsharp-projects?tabs=tabid-qsharp%2Ctabid-qsharp-run#manifest-file-examples)


#### RandomBit.qs:

こちらはQ#のサンプルのランダムビット操作を出しているだけです。
```C#
namespace Algorithm {

    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Diagnostics as Diag;


    operation RandomBit() : Result {
        // Qubits are only accesible for the duration of the scope where they
        // are allocated and are automatically released at the end of the scope.
        use qubit = Qubit();

        // Set the qubit in superposition by applying a Hadamard transformation.
        H(qubit);

        Diag.DumpMachine();

        // Measure the qubit. There is a 50% probability of measuring either
        // `Zero` or `One`.
        let result = M(qubit);

        Message($"The result of the measurement is {result}.");

        // Reset the qubit so it can be safely released.
        Reset(qubit);
        return result;
    }
    ...
}
```

#### Main.qs:
こちらがエントリーポイントです。
```C#
namespace Sample {

    open Microsoft.Quantum.Canon;
    open Algorithm as Alg;

    @EntryPoint()
    operation Run() : Result {
        let results = Alg.RandomBit();
        return results;
    }
}
```


# Jupyter上でQ#のプロジェクトPathを指定:
```python:notebook.ipynb
import qsharp

qsharp.init(project_root = "/sample-project")
```

# Q#の結果をPythonで取得
```python:notebook.ipynb
# 単一の場合
qsharp.eval("Sample.Run()")
# >>> Zero

# 複数回取得する場合
qsharp.run("Sample.Run()", 10)
# >>> [One, Zero, Zero, One, Zero, Zero, One, One, One, Zero]
```

# ヒストグラムを表示:

```python:notebook.ipynb
import qsharp_widgets as qw

histogram = qw.Histogram()
display(histogram)
histogram.run("Sample.Run()", 10)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/9d35432b-da74-9601-ba40-6339b3a67546.png)

# Jupyter上で量子回路を表示:

```python:notebook.ipynb
qw.Circuit(qsharp.circuit("Sample.Run()"))

# EntryPointでなくても直接指定すれば良い
qw.Circuit(qsharp.circuit("Algorithm.RandomBit()"))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/d722fb62-d199-91bf-1697-23b7a554e3b3.png)

# その他：
上記以外に`qsharp_widgets`には、以下のクラスが存在しするので任意で試してみてね.

`qsharp_widgets`のその他のクラス
- SpaceChart
- EstimateDetails
- EstimatesOverview
- EstimatesPanel

### 最小限のEstimateの例：
```python
from qsharp.estimator  import EstimatorParams
params = EstimatorParams()
estimate = qsharp.estimate("Sample.Run()", params=params)
estimate

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/2e80ec0c-b4d1-0216-4f27-d19c5e19b75e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/3864a0e2-c95f-2ac8-f23e-abf1c8f938eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/a9469cef-f382-5924-11ef-b09911f7d715.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/919d2c05-539e-7372-2156-7c0113f43d3e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/8df06a91-4c5f-ffec-2188-58229d2851c8.png)


その他の例は[こちら](https://learn.microsoft.com/ja-jp/azure/quantum/overview-resources-estimator#error-budget)

# おわりに

Q#のお仕事って日本で出ないかな～

# 参考：

- [Jupyter Notebookを使用した量子回路](https://learn.microsoft.com/ja-jp/azure/quantum/how-to-visualize-circuits?tabs=tabid-vscode#quantum-circuits-with-jupyter-notebooks)
- [Q#のプロジェクト例](https://learn.microsoft.com/ja-jp/azure/quantum/user-guide/how-to-work-with-qsharp-projects?tabs=tabid-qsharp%2Ctabid-notebook-run#example-project)
- [Q#のマニフェスト作成](https://learn.microsoft.com/ja-jp/azure/quantum/user-guide/how-to-work-with-qsharp-projects?tabs=tabid-qsharp%2Ctabid-notebook-run#create-a-manifest-file)