from typing import Any, Dict, List
import numpy as np
import stim
from tesseract_decoder import tesseract
class TesseractDecoder:
def __init__(self, vertex_num: int, num_hyperedges: int, solver: Any):
self._vertex_num = vertex_num
self._num_hyperedges = num_hyperedges
self._solver = solver
def decode(self, syndrome: List[int]) -> List[int]:
assert isinstance(syndrome, list)
dense = np.zeros(self._vertex_num, dtype=bool)
for index in syndrome:
dense[int(index)] = True
self._solver.decode_to_errors(dense)
return [int(i) for i in self._solver.predicted_errors_buffer]
def reset(self) -> None:
return None
def _build_dem(vertex_num: int, hyperedges) -> stim.DetectorErrorModel:
lines = []
for hyperedge in hyperedges:
detectors = " ".join(f"D{int(v)}" for v in hyperedge.vertices)
lines.append(f"error({float(hyperedge.probability)}) {detectors}")
text = "\n".join(lines) + "\n"
return stim.DetectorErrorModel(text)
def new(hypergraph: Any, config: Dict[str, Any]) -> Any:
vertex_num = int(hypergraph.vertex_num)
hyperedges = list(hypergraph.hyperedges)
num_hyperedges = len(hyperedges)
dem = _build_dem(vertex_num, hyperedges)
kwargs = dict(config or {})
solver = tesseract.TesseractConfig(dem=dem, **kwargs).compile_decoder()
return TesseractDecoder(vertex_num, num_hyperedges, solver)