qlro 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. qlro-0.2.0/PKG-INFO +159 -0
  2. qlro-0.2.0/README.md +126 -0
  3. qlro-0.2.0/pyproject.toml +59 -0
  4. qlro-0.2.0/setup.cfg +4 -0
  5. qlro-0.2.0/src/qlro/__init__.py +37 -0
  6. qlro-0.2.0/src/qlro/api.py +892 -0
  7. qlro-0.2.0/src/qlro/comparison/__init__.py +25 -0
  8. qlro-0.2.0/src/qlro/comparison/normalizer.py +240 -0
  9. qlro-0.2.0/src/qlro/comparison/serialize.py +175 -0
  10. qlro-0.2.0/src/qlro/comparison/suitability.py +156 -0
  11. qlro-0.2.0/src/qlro/data/metriq_snapshot.json +6543 -0
  12. qlro-0.2.0/src/qlro/environments.py +191 -0
  13. qlro-0.2.0/src/qlro/export/__init__.py +5 -0
  14. qlro-0.2.0/src/qlro/export/report.py +453 -0
  15. qlro-0.2.0/src/qlro/jupyter.py +123 -0
  16. qlro-0.2.0/src/qlro/public_api.py +480 -0
  17. qlro-0.2.0/src/qlro/recommendation/__init__.py +5 -0
  18. qlro-0.2.0/src/qlro/recommendation/engine.py +421 -0
  19. qlro-0.2.0/src/qlro/result_parser.py +245 -0
  20. qlro-0.2.0/src/qlro/runner/__init__.py +5 -0
  21. qlro-0.2.0/src/qlro/runner/circuits.py +113 -0
  22. qlro-0.2.0/src/qlro/runner/qiskit_runner.py +221 -0
  23. qlro-0.2.0/src/qlro/schemas/__init__.py +45 -0
  24. qlro-0.2.0/src/qlro/schemas/comparison.py +25 -0
  25. qlro-0.2.0/src/qlro/schemas/comparison_run.py +48 -0
  26. qlro-0.2.0/src/qlro/schemas/environment.py +101 -0
  27. qlro-0.2.0/src/qlro/schemas/evaluation.py +117 -0
  28. qlro-0.2.0/src/qlro/schemas/experiment.py +56 -0
  29. qlro-0.2.0/src/qlro/schemas/fingerprint.py +164 -0
  30. qlro-0.2.0/src/qlro/schemas/recommendation.py +51 -0
  31. qlro-0.2.0/src/qlro/schemas/workload.py +45 -0
  32. qlro-0.2.0/src/qlro/scoring/__init__.py +5 -0
  33. qlro-0.2.0/src/qlro/scoring/axes.py +159 -0
  34. qlro-0.2.0/src/qlro/scoring/composition.py +105 -0
  35. qlro-0.2.0/src/qlro/scoring/data_loader.py +178 -0
  36. qlro-0.2.0/src/qlro/scoring/physics.py +188 -0
  37. qlro-0.2.0/src/qlro/scoring/priors.py +80 -0
  38. qlro-0.2.0/src/qlro/scoring/wcpp.py +374 -0
  39. qlro-0.2.0/src/qlro/storage/__init__.py +5 -0
  40. qlro-0.2.0/src/qlro/storage/database.py +129 -0
  41. qlro-0.2.0/src/qlro.egg-info/PKG-INFO +159 -0
  42. qlro-0.2.0/src/qlro.egg-info/SOURCES.txt +53 -0
  43. qlro-0.2.0/src/qlro.egg-info/dependency_links.txt +1 -0
  44. qlro-0.2.0/src/qlro.egg-info/requires.txt +13 -0
  45. qlro-0.2.0/src/qlro.egg-info/top_level.txt +1 -0
  46. qlro-0.2.0/tests/test_api.py +188 -0
  47. qlro-0.2.0/tests/test_environment_differentiation.py +171 -0
  48. qlro-0.2.0/tests/test_fingerprint.py +71 -0
  49. qlro-0.2.0/tests/test_normalizer.py +219 -0
  50. qlro-0.2.0/tests/test_pipeline.py +155 -0
  51. qlro-0.2.0/tests/test_recommendation.py +365 -0
  52. qlro-0.2.0/tests/test_report.py +214 -0
  53. qlro-0.2.0/tests/test_result_parser.py +120 -0
  54. qlro-0.2.0/tests/test_suitability.py +162 -0
  55. qlro-0.2.0/tests/test_validation.py +322 -0
qlro-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,159 @@
1
+ Metadata-Version: 2.4
2
+ Name: qlro
3
+ Version: 0.2.0
4
+ Summary: Show us your quantum circuit. We tell you where to run it.
5
+ Author-email: Yeonwoo Oh <linslet77@gmail.com>
6
+ Maintainer-email: Yeonwoo Oh <linslet77@gmail.com>
7
+ License: Apache-2.0
8
+ Project-URL: Homepage, https://github.com/linsletoh/qlro
9
+ Project-URL: Documentation, https://github.com/linsletoh/qlro/blob/main/WCPP_SPEC.md
10
+ Project-URL: Paper, https://doi.org/10.5281/zenodo.19601532
11
+ Project-URL: Simulator, https://qlro-three.vercel.app/simulator
12
+ Project-URL: Issues, https://github.com/linsletoh/qlro/issues
13
+ Keywords: quantum,benchmarking,recommendation,qiskit,metriq,wcpp
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: Topic :: Scientific/Engineering :: Physics
17
+ Classifier: License :: OSI Approved :: Apache Software License
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Requires-Python: >=3.11
21
+ Description-Content-Type: text/markdown
22
+ Requires-Dist: pydantic>=2.5.0
23
+ Requires-Dist: qiskit>=1.0.0
24
+ Requires-Dist: qiskit-aer>=0.13.0
25
+ Provides-Extra: server
26
+ Requires-Dist: fastapi>=0.104.0; extra == "server"
27
+ Requires-Dist: uvicorn>=0.24.0; extra == "server"
28
+ Requires-Dist: sqlalchemy>=2.0.0; extra == "server"
29
+ Provides-Extra: dev
30
+ Requires-Dist: pytest>=7.4.0; extra == "dev"
31
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
32
+ Requires-Dist: httpx>=0.25.0; extra == "dev"
33
+
34
+ # Qlro
35
+
36
+ **Show us your quantum circuit. We'll tell you where to run it.**
37
+
38
+ ```python
39
+ from qiskit import QuantumCircuit
40
+ import qlro
41
+
42
+ qc = QuantumCircuit(4)
43
+ qc.h(0); qc.cx(0, 1); qc.cx(1, 2); qc.cx(2, 3)
44
+ qc.measure_all()
45
+
46
+ result = qlro.recommend(qc, category="chemistry")
47
+ result.primary # → 'H2-2'
48
+ result.primary_fit # → 0.8140
49
+ ```
50
+
51
+ Qlro is a quantum device recommendation engine. Give it a circuit and a workload type, and it ranks every available quantum device by how well that device fits *your specific workload* — based on real benchmark data from [Metriq](https://metriq.info) (Unitary Foundation), not vendor marketing.
52
+
53
+ ## Install
54
+
55
+ ```bash
56
+ pip install qlro
57
+ ```
58
+
59
+ Ships with a snapshot of the Metriq benchmark dataset. No API keys, no accounts, no internet required.
60
+
61
+ ## How it works
62
+
63
+ 1. **You have a quantum circuit** (Qiskit `QuantumCircuit` or OpenQASM string).
64
+ 2. **You tell Qlro what kind of workload it is**: `chemistry`, `simulation`, `optimization`, or `ml`.
65
+ 3. **Qlro scores every quantum device** across four capability axes:
66
+ - **Γ (Connectivity)** — verified entanglement coverage across the chip
67
+ - **Φ (Coherence)** — information survival over circuit depth
68
+ - **F (Fidelity)** — per-operation accuracy
69
+ - **T (Throughput)** — effective operations per second
70
+ 4. **You get a ranked list** with scores, uncertainty bands, and the Metriq commit hash so everything is auditable.
71
+
72
+ The scoring framework is called [WCPP (Workload-Conditioned Physical Projection)](WCPP_SPEC.md). Every number comes from physics, not heuristics. See the [full specification](WCPP_SPEC.md) for the math, axioms, and proofs.
73
+
74
+ ## What Qlro does NOT do
75
+
76
+ - **Does not run your circuit.** You run it yourself on IBM Quantum, AWS Braket, Quantinuum, etc.
77
+ - **Does not build or optimize circuits.** That's Classiq, Qiskit transpiler, etc.
78
+ - **Does not measure hardware.** That's [Metriq](https://metriq.info) / Unitary Foundation. We consume their data.
79
+ - **Does not hide uncertainty.** Every score shows what's measured vs. estimated vs. assumed.
80
+
81
+ ## Jupyter integration
82
+
83
+ Qlro auto-renders as an inline HTML table in Jupyter notebooks. For quick interactive use:
84
+
85
+ ```python
86
+ %load_ext qlro.jupyter
87
+ %qlro my_circuit chemistry
88
+ ```
89
+
90
+ See [`examples/vqe_h2_with_qlro.ipynb`](examples/vqe_h2_with_qlro.ipynb) for a complete walkthrough.
91
+
92
+ ## Try the interactive simulator
93
+
94
+ Don't understand the problem Qlro solves? [Play the simulator](https://qlro-three.vercel.app/simulator) — a 5-minute browser game where you play as a quantum engineer under a paper deadline, with and without Qlro.
95
+
96
+ ## Update benchmark data
97
+
98
+ ```bash
99
+ python scripts/sync_metriq.py
100
+ ```
101
+
102
+ Pulls the latest from the [metriq-data](https://github.com/unitaryfoundation/metriq-data) repository. Every recommendation is anchored to a specific Metriq commit for reproducibility.
103
+
104
+ ## Development
105
+
106
+ ```bash
107
+ git clone https://github.com/linsletoh/qlro.git
108
+ cd qlro
109
+ pip install -e ".[dev,server]"
110
+ pytest # 107 tests
111
+ ```
112
+
113
+ ## Architecture
114
+
115
+ ```
116
+ src/qlro/
117
+ ├── scoring/ ← WCPP reference implementation
118
+ │ ├── physics.py ← benchmark → physical value transforms
119
+ │ ├── axes.py ← capability axis aggregation
120
+ │ ├── composition.py← workload-conditioned geometric mean
121
+ │ └── wcpp.py ← qlro_fit() entry point
122
+ ├── public_api.py ← recommend(), log_outcome()
123
+ ├── jupyter.py ← %qlro magic for notebooks
124
+ ├── runner/ ← Qiskit Aer experiment runner
125
+ ├── comparison/ ← normalization pipeline
126
+ ├── recommendation/ ← scoring + explanation engine
127
+ └── api.py ← FastAPI web application
128
+ ```
129
+
130
+ ## Key documents
131
+
132
+ - [**WCPP_SPEC.md**](WCPP_SPEC.md) — Full technical specification of the scoring framework
133
+ - [**ROADMAP.md**](ROADMAP.md) — Product roadmap + positioning copy
134
+ - [**papers/wcpp-draft.md**](papers/wcpp-draft.md) — WCPP preprint (published on Zenodo, [DOI: 10.5281/zenodo.19601379](https://doi.org/10.5281/zenodo.19601379))
135
+ - [**test_results/**](test_results/) — Validation records with external vendor cross-references
136
+
137
+ ## Citation
138
+
139
+ If you use Qlro or WCPP in research, please cite the Zenodo preprint:
140
+
141
+ ```bibtex
142
+ @misc{oh2026wcpp,
143
+ author = {Oh, Yeonwoo},
144
+ title = {{Workload-Conditioned Physical Projection: A Vendor-Neutral Framework for Quantum Device Selection}},
145
+ year = {2026},
146
+ publisher = {Zenodo},
147
+ version = {0.3},
148
+ doi = {10.5281/zenodo.19601532},
149
+ url = {https://doi.org/10.5281/zenodo.19601532}
150
+ }
151
+ ```
152
+
153
+ Latest version DOI: [**10.5281/zenodo.19601532**](https://doi.org/10.5281/zenodo.19601532) (v0.3, includes full technical specification `WCPP_SPEC.md`)
154
+
155
+ Previous version: v0.2 at [10.5281/zenodo.19601379](https://doi.org/10.5281/zenodo.19601379) (archived).
156
+
157
+ ## License
158
+
159
+ Apache 2.0
qlro-0.2.0/README.md ADDED
@@ -0,0 +1,126 @@
1
+ # Qlro
2
+
3
+ **Show us your quantum circuit. We'll tell you where to run it.**
4
+
5
+ ```python
6
+ from qiskit import QuantumCircuit
7
+ import qlro
8
+
9
+ qc = QuantumCircuit(4)
10
+ qc.h(0); qc.cx(0, 1); qc.cx(1, 2); qc.cx(2, 3)
11
+ qc.measure_all()
12
+
13
+ result = qlro.recommend(qc, category="chemistry")
14
+ result.primary # → 'H2-2'
15
+ result.primary_fit # → 0.8140
16
+ ```
17
+
18
+ Qlro is a quantum device recommendation engine. Give it a circuit and a workload type, and it ranks every available quantum device by how well that device fits *your specific workload* — based on real benchmark data from [Metriq](https://metriq.info) (Unitary Foundation), not vendor marketing.
19
+
20
+ ## Install
21
+
22
+ ```bash
23
+ pip install qlro
24
+ ```
25
+
26
+ Ships with a snapshot of the Metriq benchmark dataset. No API keys, no accounts, no internet required.
27
+
28
+ ## How it works
29
+
30
+ 1. **You have a quantum circuit** (Qiskit `QuantumCircuit` or OpenQASM string).
31
+ 2. **You tell Qlro what kind of workload it is**: `chemistry`, `simulation`, `optimization`, or `ml`.
32
+ 3. **Qlro scores every quantum device** across four capability axes:
33
+ - **Γ (Connectivity)** — verified entanglement coverage across the chip
34
+ - **Φ (Coherence)** — information survival over circuit depth
35
+ - **F (Fidelity)** — per-operation accuracy
36
+ - **T (Throughput)** — effective operations per second
37
+ 4. **You get a ranked list** with scores, uncertainty bands, and the Metriq commit hash so everything is auditable.
38
+
39
+ The scoring framework is called [WCPP (Workload-Conditioned Physical Projection)](WCPP_SPEC.md). Every number comes from physics, not heuristics. See the [full specification](WCPP_SPEC.md) for the math, axioms, and proofs.
40
+
41
+ ## What Qlro does NOT do
42
+
43
+ - **Does not run your circuit.** You run it yourself on IBM Quantum, AWS Braket, Quantinuum, etc.
44
+ - **Does not build or optimize circuits.** That's Classiq, Qiskit transpiler, etc.
45
+ - **Does not measure hardware.** That's [Metriq](https://metriq.info) / Unitary Foundation. We consume their data.
46
+ - **Does not hide uncertainty.** Every score shows what's measured vs. estimated vs. assumed.
47
+
48
+ ## Jupyter integration
49
+
50
+ Qlro auto-renders as an inline HTML table in Jupyter notebooks. For quick interactive use:
51
+
52
+ ```python
53
+ %load_ext qlro.jupyter
54
+ %qlro my_circuit chemistry
55
+ ```
56
+
57
+ See [`examples/vqe_h2_with_qlro.ipynb`](examples/vqe_h2_with_qlro.ipynb) for a complete walkthrough.
58
+
59
+ ## Try the interactive simulator
60
+
61
+ Don't understand the problem Qlro solves? [Play the simulator](https://qlro-three.vercel.app/simulator) — a 5-minute browser game where you play as a quantum engineer under a paper deadline, with and without Qlro.
62
+
63
+ ## Update benchmark data
64
+
65
+ ```bash
66
+ python scripts/sync_metriq.py
67
+ ```
68
+
69
+ Pulls the latest from the [metriq-data](https://github.com/unitaryfoundation/metriq-data) repository. Every recommendation is anchored to a specific Metriq commit for reproducibility.
70
+
71
+ ## Development
72
+
73
+ ```bash
74
+ git clone https://github.com/linsletoh/qlro.git
75
+ cd qlro
76
+ pip install -e ".[dev,server]"
77
+ pytest # 107 tests
78
+ ```
79
+
80
+ ## Architecture
81
+
82
+ ```
83
+ src/qlro/
84
+ ├── scoring/ ← WCPP reference implementation
85
+ │ ├── physics.py ← benchmark → physical value transforms
86
+ │ ├── axes.py ← capability axis aggregation
87
+ │ ├── composition.py← workload-conditioned geometric mean
88
+ │ └── wcpp.py ← qlro_fit() entry point
89
+ ├── public_api.py ← recommend(), log_outcome()
90
+ ├── jupyter.py ← %qlro magic for notebooks
91
+ ├── runner/ ← Qiskit Aer experiment runner
92
+ ├── comparison/ ← normalization pipeline
93
+ ├── recommendation/ ← scoring + explanation engine
94
+ └── api.py ← FastAPI web application
95
+ ```
96
+
97
+ ## Key documents
98
+
99
+ - [**WCPP_SPEC.md**](WCPP_SPEC.md) — Full technical specification of the scoring framework
100
+ - [**ROADMAP.md**](ROADMAP.md) — Product roadmap + positioning copy
101
+ - [**papers/wcpp-draft.md**](papers/wcpp-draft.md) — WCPP preprint (published on Zenodo, [DOI: 10.5281/zenodo.19601379](https://doi.org/10.5281/zenodo.19601379))
102
+ - [**test_results/**](test_results/) — Validation records with external vendor cross-references
103
+
104
+ ## Citation
105
+
106
+ If you use Qlro or WCPP in research, please cite the Zenodo preprint:
107
+
108
+ ```bibtex
109
+ @misc{oh2026wcpp,
110
+ author = {Oh, Yeonwoo},
111
+ title = {{Workload-Conditioned Physical Projection: A Vendor-Neutral Framework for Quantum Device Selection}},
112
+ year = {2026},
113
+ publisher = {Zenodo},
114
+ version = {0.3},
115
+ doi = {10.5281/zenodo.19601532},
116
+ url = {https://doi.org/10.5281/zenodo.19601532}
117
+ }
118
+ ```
119
+
120
+ Latest version DOI: [**10.5281/zenodo.19601532**](https://doi.org/10.5281/zenodo.19601532) (v0.3, includes full technical specification `WCPP_SPEC.md`)
121
+
122
+ Previous version: v0.2 at [10.5281/zenodo.19601379](https://doi.org/10.5281/zenodo.19601379) (archived).
123
+
124
+ ## License
125
+
126
+ Apache 2.0
@@ -0,0 +1,59 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "qlro"
7
+ version = "0.2.0"
8
+ description = "Show us your quantum circuit. We tell you where to run it."
9
+ requires-python = ">=3.11"
10
+ license = {text = "Apache-2.0"}
11
+ readme = "README.md"
12
+ authors = [
13
+ {name = "Yeonwoo Oh", email = "linslet77@gmail.com"},
14
+ ]
15
+ maintainers = [
16
+ {name = "Yeonwoo Oh", email = "linslet77@gmail.com"},
17
+ ]
18
+ keywords = ["quantum", "benchmarking", "recommendation", "qiskit", "metriq", "wcpp"]
19
+ classifiers = [
20
+ "Development Status :: 3 - Alpha",
21
+ "Intended Audience :: Science/Research",
22
+ "Topic :: Scientific/Engineering :: Physics",
23
+ "License :: OSI Approved :: Apache Software License",
24
+ "Programming Language :: Python :: 3.11",
25
+ "Programming Language :: Python :: 3.12",
26
+ ]
27
+ dependencies = [
28
+ "pydantic>=2.5.0",
29
+ "qiskit>=1.0.0",
30
+ "qiskit-aer>=0.13.0",
31
+ ]
32
+
33
+ [project.optional-dependencies]
34
+ server = [
35
+ "fastapi>=0.104.0",
36
+ "uvicorn>=0.24.0",
37
+ "sqlalchemy>=2.0.0",
38
+ ]
39
+ dev = [
40
+ "pytest>=7.4.0",
41
+ "pytest-asyncio>=0.23.0",
42
+ "httpx>=0.25.0",
43
+ ]
44
+
45
+ [project.urls]
46
+ Homepage = "https://github.com/linsletoh/qlro"
47
+ Documentation = "https://github.com/linsletoh/qlro/blob/main/WCPP_SPEC.md"
48
+ Paper = "https://doi.org/10.5281/zenodo.19601532"
49
+ Simulator = "https://qlro-three.vercel.app/simulator"
50
+ Issues = "https://github.com/linsletoh/qlro/issues"
51
+
52
+ [tool.setuptools.packages.find]
53
+ where = ["src"]
54
+
55
+ [tool.setuptools.package-data]
56
+ qlro = ["data/*.json"]
57
+
58
+ [tool.pytest.ini_options]
59
+ testpaths = ["tests"]
qlro-0.2.0/setup.cfg ADDED
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,37 @@
1
+ """Qlro: the evaluation layer for quantum pilot decisions.
2
+
3
+ Primary use is as an importable library:
4
+
5
+ >>> from qiskit import QuantumCircuit
6
+ >>> import qlro
7
+ >>>
8
+ >>> qc = QuantumCircuit(4)
9
+ >>> qc.h(0); qc.cx(0, 1); qc.cx(1, 2); qc.cx(2, 3)
10
+ >>> qc.measure_all()
11
+ >>>
12
+ >>> result = qlro.recommend(qc, category="chemistry")
13
+ >>> result.primary
14
+ 'H2-2'
15
+ >>> result # auto-renders in Jupyter
16
+
17
+ See WCPP_SPEC.md and ROADMAP.md at the repo root for the full framework
18
+ and product context.
19
+ """
20
+
21
+ from qlro.public_api import (
22
+ CircuitInfo,
23
+ DeviceRanking,
24
+ Recommendation,
25
+ log_outcome,
26
+ recommend,
27
+ )
28
+ from qlro.scoring.priors import WorkloadCategory
29
+
30
+ __all__ = [
31
+ "recommend",
32
+ "log_outcome",
33
+ "Recommendation",
34
+ "DeviceRanking",
35
+ "CircuitInfo",
36
+ "WorkloadCategory",
37
+ ]