Qiskit における depth について（通常回路とQuantumVolume）

# Qiskit の depth について

+ とある場で「QuantumVolumeのdepth値って実質どのくらい？」という話題が出たので整理しておく。
+ Qiskitには複数の ```depth``` の使い方がある。
+ 具体的には通常の回路の深さを表すものと、QuantumVolumeの指標となるものがある。
+ これらを順番に確認する。

## ■ 通常の回路の深さを表す```depth```

+ ここでは```random_circuit```で回路を生成し、depthの意味を確認する。
+ [Qiskit document - random_circuit](https://qiskit.org/documentation/stubs/qiskit.circuit.random.random_circuit.html#qiskit.circuit.random.random_circuit)
+ depth値を指定により、どのような回路が生成されるか確認する。


```python
from qiskit.circuit.random import random_circuit
```

### ①量子ビット数：1、depth値：5


```python
circ_r1 = random_circuit(num_qubits=1, depth=5)
print('depth =', circ_r1.depth())
circ_r1.draw(output='mpl')
```

    depth = 5
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/2957c0bf-3d14-9bf5-7dd1-1c830d13b2be.png)




### ②量子ビット数：5、depth値：5


```python
circ_r2 = random_circuit(num_qubits=5, depth=5)
print('depth =', circ_r2.depth())
circ_r2.draw(output='mpl')
```

    depth = 5
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/752657fb-5544-bb55-0fbc-b9d5dc3a8737.png)




### ③量子ビット数：1、depth値：10、


```python
circ_r3 = random_circuit(num_qubits=1, depth=10)
print('depth =', circ_r3.depth())
circ_r3.draw(output='mpl')
```

    depth = 10
    


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/437b2102-8f09-4e90-40d8-109870f238c0.png)




### ④量子ビット数：5、depth値：10


```python
circ_r4 = random_circuit(num_qubits=5, depth=10)
print('depth =', circ_r4.depth())
circ_r4.draw(output='mpl')
```

    depth = 10
    



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/0b2ed47d-3875-193e-b8d3-e61f69da4600.png)




量子ビット数（num_qubits）が複数になるとdepth値が直感的にわかりずらいが、量子ビット数を1に設定すればdepthの数はゲートの数と同じになることがわかる。

## ■ QuantumVolume（QV） における```depth```

+ [Qiskit Document - QuantumVolume](https://qiskit.org/documentation/stubs/qiskit.circuit.library.QuantumVolume.html)
+ QV値の計測は、QuantumVolume計測用の回路を生成して行う。
+ QV用回路の生成時に```depth```値を指定するが、通常の回路の```depth```とは意味合いが異なる。
+ 実際にQV用回路を生成し、```depth```を計測して確認する。


```python
from qiskit.circuit.library import QuantumVolume
```

### ①量子ビット数：5、(QV)depth値：5


```python
circ_q1 = QuantumVolume(num_qubits=5, depth=5)
print('depth =', circ_q1.depth())
circ_q1.draw('mpl')
```

    depth = 1
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/846b0ec2-af04-e7c1-6da3-ca4111a33b66.png)




上図はさまざまなゲートがひとつにまとめられている状態。  
このまま```depth```を計測すると、見た目通りの「１」となる。
このままではよくわからないので、```decompose```（分解＝回路の展開）して確認する。


```python
circ_q1_d1 = circ_q1.decompose()
print('depth =', circ_q1_d1.depth())
circ_q1_d1.draw('mpl')
```

    depth = 5
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/77f36299-98bd-8809-febc-a87458685125.png)




展開はされたものの、まだ複数ゲートがまとめられている。  
少々わかりづらいが、２列目のゲート（su4_83）と３列目のゲート（su4_767）はそれぞれ異なる量子ビットに対して操作を行っているため、前詰めにして「1」と数えることができる。

以下のドキュメントのgifがわかりやすい。  
[Qiskit Document - circuit](https://qiskit.org/documentation/apidoc/circuit.html)  ※Quantum Circuit Properties を展開するとgifがある。

ちなみに、```su4```は４×４のランダムなユニタリ行列のゲートである。

ここからさらに```decompose```して、通常のゲート単位にする。


```python
circ_q1_d2 = circ_q1_d1.decompose()
print('depth =', circ_q1_d2.depth())
circ_q1_d2.draw('mpl')
```

    depth = 35
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/3af14564-3dc4-d7d3-d7de-c412881bc291.png)




su4は、CNOTとU3ゲートから構成されていることがわかる。  
また、QV用のdepth値が5の場合、通常回路でのdepth値は35であることがわかる。

### ②量子ビット数：3、(QV)depth値：5

今度は量子ビット数を減らして（5→3）確認する。


```python
circ_q2 = QuantumVolume(num_qubits=3, depth=5)
print('depth =', circ_q2.depth())
circ_q2.draw('mpl')
```

    depth = 1
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/db56e258-e855-d3ae-6651-7bd9d18a5ea4.png)





```python
circ_q2_d1 = circ_q2.decompose()
print('depth =', circ_q2_d1.depth())
circ_q2_d1.draw('mpl')
```

    depth = 5
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/b41992cd-8b55-4ea5-d428-79bce7ed8e84.png)





```python
circ_q2_d2 = circ_q2_d1.decompose()
print('depth =', circ_q2_d2.depth())
circ_q2_d2.draw('mpl')
```

    depth = 35
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/12acfa90-146f-b2e5-f9f4-038104c230a2.png)




量子ビット数に関わらずQVのdepth値が5の場合は、通常回路のdepth値は35になることがわかる。

### ③量子ビット数：3、(QV)depth値：3

さらにdepth値を減らして（5→3）確認する。


```python
circ_q3 = QuantumVolume(num_qubits=3, depth=3)
print('depth =', circ_q3.depth())
circ_q3.draw('mpl')
```

    depth = 1
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/62df677f-2495-d4ac-f37d-90fade640712.png)





```python
circ_q3_d1 = circ_q3.decompose()
print('depth =', circ_q3_d1.depth())
circ_q3_d1.draw('mpl')
```

    depth = 3
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/8aac7991-81fc-bd20-6460-c9aad2aa54bb.png)




```python
circ_q3_d2 = circ_q3_d1.decompose()
print('depth =', circ_q3_d2.depth())
circ_q3_d2.draw('mpl')
```

    depth = 21
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/f6e31888-ce5b-5457-9e98-6f9fac4743ac.png)




QVのdepth値が変わると、通常回路のdepth値も変わることがわかる。

## QV回路の生成方法

+ ここまでは```QuantumVolume```を利用して回路を生成してきたが、別の生成方法として [qv_circuits](https://qiskit.org/documentation/stubs/qiskit.ignis.verification.qv_circuits.html) の利用がある。
+ ソースを見ればわかるが、[qv_circuits](https://qiskit.org/documentation/stubs/qiskit.ignis.verification.qv_circuits.html) では内部的に [QuantumVolume](https://qiskit.org/documentation/stubs/qiskit.circuit.library.QuantumVolume.html) を利用してQV回路が生成されている。


```python
import qiskit.ignis.verification.quantum_volume as qv
```


```python
qubit_lists = [[0,1,3,5,7]]
ntrials = 50
qv_circs, qv_circs_nomeas = qv.qv_circuits(qubit_lists, ntrials)
```

生成される回路は測定あり（```qv_circs```）と測定なし（```qv_circs_nomeas```）の２種類となる。  
まずは測定ありの回路から確認する。


```python
print("depth =", qv_circs[0][0].decompose().depth())
qv_circs[0][0].decompose().draw('mpl')
```

    depth = 36
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/031c7217-1019-a3b0-81b1-e3fbb1113ae0.png)




depth値が36になっている。  
QVのdepth値が5の場合、通常回路のdepth値は35だが、測定操作が追加されたことにより+1となっている。

続けて、測定なしの回路を確認する。


```python
print("depth =", qv_circs_nomeas[0][0].decompose().depth())
qv_circs_nomeas[0][0].decompose().draw('mpl')
```

    depth = 36
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/7d399fa4-87d0-40a0-29a4-2a4a5e778666.png)




depth値が同様に36となっているが、最後のレイヤーが実質的に操作のないU3ゲートとなっているため、depth値としては35と捉えることができる。

次は、測定なしの回路をトランスパイラで変換してからdepthを確認してみる。



```python
import qiskit.compiler.transpile
```


```python
qv_circs_nomeas[0] = qiskit.compiler.transpile(qv_circs_nomeas[0], basis_gates=['u1','u2','u3','cx'])
print("depth =", qv_circs_nomeas[0].depth())
qv_circs_nomeas[0].draw('mpl')
```

    depth = 31
    




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494282/8683be63-f151-db1b-91d2-8e4f2863af83.png)




depth値は31となった。  
トランスパイラによりゲート数が変わったため当然の結果ではあるが、QV値の測定に通常回路のdepth値は直接的には関係ないということがわかる。

## Reference

+ [Qiskit Tutorial - Quantum Volume](https://qiskit.org/documentation/locale/ja_JP/tutorials/noise/5_quantum_volume.html)
+ [Qiskit Textbook - Measuring Quantum Volume](https://qiskit.org/textbook/ch-quantum-hardware/measuring-quantum-volume.html)
+ [Qiskit Medium - What Is Quantum Volume, Anyway?](https://medium.com/qiskit/what-is-quantum-volume-anyway-a4dff801c36f)