from qudas.core.output_base import QdOutputBase, QdOutputBaseData
from qudas.core.statistics import probability_statistics
from dataclasses import dataclass
from typing import Dict, Any, Optional
@dataclass
class QdGateOutputData(QdOutputBaseData):
counts: Dict[str, int]
expectation_value: Optional[float] = None
shots: Optional[int] = None
statistics: Optional[Dict[str, Any]] = None
[docs]class QdGateOutput(QdOutputBase):
"""量子ゲート方式の計算結果を保持するアウトプットクラス。
1 ブロックにつき 1 つの結果辞書を保持し、複数ブロック分を
`results` という大域辞書で管理する設計とする。
Example
-------
>>> results = {
... "blockA": {
... "solution": {"x0": 1, "x1": 0},
... "counts": {"00": 100, "11": 200},
... "expectation_value": 0.5,
... "shots": 300,
... "device": "aer_simulator",
... },
... "blockB": {
... "solution": {"x0": 0, "x1": 1},
... "counts": {"00": 150, "11": 150},
... "expectation_value": 0.2,
... "shots": 300,
... "device": "braket_ionq",
... },
... }
>>> qd_out = QdGateOutput(results)
>>> qd_out.get_block_solution("blockA")
{'x0': 1, 'x1': 0}
"""
def __init__(self, results: Optional[Dict[str, QdGateOutputData]] = None):
self.results = results or {}
self._attach_statistics()
[docs] def to_dict(self):
return self.results
# ------------------------------------------------------------------
# 統計付与
# ------------------------------------------------------------------
def _attach_statistics(self):
for res in self.results.values():
counts = res.get("counts")
if not counts:
continue
stats = {
"probability": probability_statistics(counts),
"bitstring": {"unique": len(counts)},
}
res["statistics"] = stats
# --------------------------------------------------------------
# 抽象メソッド実装
# --------------------------------------------------------------
[docs] def visualize(self): # noqa: D401 – simple method name
"""結果を簡易可視化 (テキスト出力)。"""
try:
import matplotlib.pyplot as plt
for label, res in self.results.items():
counts = res.get("counts")
if not counts:
continue
plt.figure()
plt.bar(counts.keys(), counts.values())
stats = res.get("statistics", {}).get("probability")
title = label
if stats:
title += f" (std={stats['std']:.3f})"
plt.title(title)
plt.show()
except Exception:
print("Gate visualize fallback:")
print(self.results)
QdGateOut = QdGateOutput