pyqres.core.simulator 源代码
import pysparq
from .utils import merge_controllers
from .metadata import RegisterMetadata
[文档]
class PyQSparseOperationWrapper:
"""Wrapper for pysparq operations with controller and dagger support."""
[文档]
def __init__(self, op):
self.op = op
self.dagger = False
[文档]
def set_controller(self, controllers_ctx):
if 'conditioned_by_nonzero' in controllers_ctx:
self.op.conditioned_by_nonzeros(controllers_ctx['conditioned_by_nonzero'])
if 'conditioned_by_all_ones' in controllers_ctx:
self.op.conditioned_by_all_ones(controllers_ctx['conditioned_by_all_ones'])
if 'conditioned_by_bit' in controllers_ctx:
self.op.conditioned_by_bit(controllers_ctx['conditioned_by_bit'])
if 'conditioned_by_value' in controllers_ctx:
self.op.conditioned_by_value(controllers_ctx['conditioned_by_value'])
[文档]
def set_dagger(self, dagger_ctx):
self.dagger = dagger_ctx
def __call__(self, sparse_state):
if self.dagger:
return self.op.dag(sparse_state)
else:
return self.op(sparse_state)
_TYPE_MAP = {
"General": pysparq.StateStorageType.General,
"UnsignedInteger": pysparq.StateStorageType.UnsignedInteger,
"SignedInteger": pysparq.StateStorageType.SignedInteger,
"Boolean": pysparq.StateStorageType.Boolean,
"Rational": pysparq.StateStorageType.Rational,
}
[文档]
class SimulatorVisitor:
"""Visitor that executes operations on a pysparq sparse state."""
[文档]
def __init__(self, verbose=False):
registers = RegisterMetadata.get_registers()
register_types = RegisterMetadata.get_register_types()
for reg_name, reg_size in registers.items():
if not isinstance(reg_size, int):
raise ValueError(
f"Register size must be integer. Got: {reg_name}: {reg_size}")
reg_type_name = register_types.get(reg_name, "General")
storage_type = _TYPE_MAP.get(reg_type_name, pysparq.StateStorageType.General)
pysparq.System.add_register(reg_name, storage_type, reg_size)
self.state = pysparq.SparseState()
self.skip = None
self.verbose = verbose
[文档]
def enter(self, node):
if self.skip:
return
[文档]
def exit(self, node):
if node == self.skip:
self.skip = None
[文档]
def visit(self, node, dagger_ctx=False, controllers_ctx=None):
controllers_ctx = controllers_ctx or {}
if hasattr(node, "pyqsparse_object"):
obj = node.pyqsparse_object(dagger_ctx, controllers_ctx)
if isinstance(obj, list):
for op in obj:
op(self.state)
if self.verbose:
pysparq.StatePrint(pysparq.StatePrintDisplay.Detail)(self.state)
else:
obj(self.state)
if self.verbose:
pysparq.StatePrint(pysparq.StatePrintDisplay.Detail)(self.state)
self.skip = id(node)
elif len(node.program_list) == 0:
raise NotImplementedError(
f"Node missing pyqsparse_object method: {type(node)}")
[文档]
def print_state(self, option=None, precision=None):
option = option or pysparq.StatePrintDisplay.Default
if precision:
pysparq.StatePrint(option, precision)(self.state)
else:
pysparq.StatePrint(option)(self.state)