diff --git a/src/bloqade/pyqrack/base.py b/src/bloqade/pyqrack/base.py index fdd903a1..07f078fc 100644 --- a/src/bloqade/pyqrack/base.py +++ b/src/bloqade/pyqrack/base.py @@ -26,13 +26,28 @@ class PyQrackOptions(typing.TypedDict): isOpenCL: bool +def _validate_pyqrack_options(options: PyQrackOptions) -> None: + if options["isBinaryDecisionTree"] and options["isStabilizerHybrid"]: + raise ValueError( + "Cannot use both isBinaryDecisionTree and isStabilizerHybrid at the same time." + ) + elif options["isTensorNetwork"] and options["isBinaryDecisionTree"]: + raise ValueError( + "Cannot use both isTensorNetwork and isBinaryDecisionTree at the same time." + ) + elif options["isTensorNetwork"] and options["isStabilizerHybrid"]: + raise ValueError( + "Cannot use both isTensorNetwork and isStabilizerHybrid at the same time." + ) + + def _default_pyqrack_args() -> PyQrackOptions: return PyQrackOptions( qubitCount=-1, isTensorNetwork=False, isSchmidtDecomposeMulti=True, isSchmidtDecompose=True, - isStabilizerHybrid=True, + isStabilizerHybrid=False, isBinaryDecisionTree=True, isPaged=True, isCpuGpuHybrid=True, @@ -45,6 +60,9 @@ class MemoryABC(abc.ABC): pyqrack_options: PyQrackOptions = field(default_factory=_default_pyqrack_args) sim_reg: "QrackSimulator" = field(init=False) + def __post_init__(self): + _validate_pyqrack_options(self.pyqrack_options) + @abc.abstractmethod def allocate(self, n_qubits: int) -> tuple[int, ...]: """Allocate `n_qubits` qubits and return their ids.""" diff --git a/test/pyqrack/test_target.py b/test/pyqrack/test_target.py index b1f23729..a7339781 100644 --- a/test/pyqrack/test_target.py +++ b/test/pyqrack/test_target.py @@ -103,7 +103,9 @@ def multiple_registers(): return q1 - target = PyQrack(6) + target = PyQrack( + 6, pyqrack_options={"isBinaryDecisionTree": False, "isStabilizerHybrid": True} + ) q1 = target.run(multiple_registers) assert isinstance(q1, ilist.IList)