Metadata-Version: 2.4
Name: qcc-device-recommender
Version: 0.2.0.dev0
Summary: Software for finding the best quantum device for subcircuit execution.
License: CC0-1.0
Project-URL: homepage, https://github.com/QuantumCircuitCutting/qcc-device-recommender
Project-URL: repository, https://github.com/QuantumCircuitCutting/qcc-device-recommender
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: numpy>=1.21
Requires-Dist: qiskit>=1.0
Requires-Dist: qiskit-ibm-runtime
Requires-Dist: lightgbm
Requires-Dist: scikit-learn
Provides-Extra: ci
Requires-Dist: flake8==5.*; extra == "ci"
Requires-Dist: isort==5.*; extra == "ci"
Requires-Dist: flake8-pyproject; extra == "ci"
Dynamic: license-file

# qcc-device-recommender

サブ量子回路の実行に適したデバイスを推薦するプログラムです。

## 使い方

ライブラリのインポート
```py
from device_recommender import match_subqc_to_device
```

サブ量子回路のリストを用意する。`"qasm"`はqasmファイルのパスでも、qasm自体(str)でも可能。
```py
subqc_lst = []
subqc_info = {"name": "a",
              "qasm": "data/qasm3_sample/circuit_1.qasm3",
              "nshot": 1000}
subqc_lst.append(subqc_info)
subqc_info = {"name": "bb",
              "qasm": "data/qasm3_sample/circuit_2.qasm3",
              "nshot": 2000}
subqc_lst.append(subqc_info)
subqc_info = {"name": "ccc",
              "qasm": "data/qasm3_sample/circuit_3.qasm3",
              "nshot": 1000}
subqc_lst.append(subqc_info)
```

デバイスのリストを用意する。
```py
device_lst = []
device_info = {"name": "qpu_1",
               "n_qubit": 10,
               "coupling_map": [[0, 1],
                                [1, 0],
                                [1, 2],
                                [2, 1],
                                [2, 3],
                                [3, 2],
                                [3, 4],
                                [4, 3],
                                [4, 5],
                                [5, 4],
                                [5, 6],
                                [6, 5],
                                [6, 7],
                                [7, 6],
                                [7, 8],
                                [8, 7],
                                [8, 9],
                                [9, 8]],
               "gate_speed": 2e-9}
device_lst.append(device_info)
device_info = {"name": "qpu_2",
               "n_qubit": 10,
               "coupling_map": [[0, 1],
                                [1, 0],
                                [3, 4],
                                [4, 3],
                                [6, 7],
                                [7, 6],
                                [1, 2],
                                [2, 1],
                                [4, 5],
                                [5, 4],
                                [7, 8],
                                [8, 7],
                                [0, 3],
                                [3, 0],
                                [3, 6],
                                [6, 3],
                                [6, 9],
                                [9, 6],
                                [1, 4],
                                [4, 1],
                                [4, 7],
                                [7, 4],
                                [2, 5],
                                [5, 2],
                                [5, 8],
                                [8, 5]],
               "gate_speed": 3e-9}
device_lst.append(device_info)
```

関数`match_subqc_to_device`にサブ量子回路のリストとデバイスのリストを渡して実行する
```py
subqc2device = match_subqc_to_device(subqc_lst, device_lst, verbose=True)
```
```py
subqc a
device: qpu_1, expected_time: 6.6e-05
depth: 11, depth_compiled: 33
device: qpu_2, expected_time: 5.9999999999999995e-05
depth: 11, depth_compiled: 20
subqc bb
device: qpu_1, expected_time: 0.00027600000000000004
depth: 20, depth_compiled: 69
device: qpu_2, expected_time: 0.000228
depth: 20, depth_compiled: 38
subqc ccc
device: qpu_1, expected_time: 2.2000000000000003e-05
depth: 11, depth_compiled: 11
device: qpu_2, expected_time: 3.2999999999999996e-05
depth: 11, depth_compiled: 11
```

結果の確認
```py
subqc2device
```
```py
{'a': {'device': 'qpu_2', 'expected_time': 5.9999999999999995e-05},
 'bb': {'device': 'qpu_2', 'expected_time': 0.000228},
 'ccc': {'device': 'qpu_1', 'expected_time': 2.2000000000000003e-05}}
```
サブ回路`"a"`と`"bb"`には`"qpu_2"`が最適、サブ回路`"ccc"`には`"qpu_1"`が最適という結果が得られている。
