Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion perceval/components/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@
catalog = Catalog('perceval.components.core_catalog')

# TODO: remove in perceval 1.4
from perceval.runtime import AProcessor, Processor as Proc
from perceval.runtime.abstract_processor import AProcessor
from perceval.runtime.processor import Processor as Proc
from perceval.utils import deprecated, ProcessorType

class Processor(Proc):
Expand Down
29 changes: 2 additions & 27 deletions perceval/components/experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class Experiment:
:param name: The experiment name
"""

_no_copiable_attributes = { '_circuit_changed_observers', '_noise_changed_observers', '_input_changed_observers' }
_no_copiable_attributes = { '_noise_changed_observers' }

def __init__(self, m_circuit: int | ACircuit = None, noise: NoiseModel = None, name: str = "Experiment"):
self._input_state = None
Expand All @@ -84,9 +84,7 @@ def __init__(self, m_circuit: int | ACircuit = None, noise: NoiseModel = None, n
self._min_detected_photons_filter: int | None = None

# TODO: Legacy - Remove when removing Processors
self._circuit_changed_observers: list[Callable[[Experiment | AComponent | None], None]] = []
self._noise_changed_observers: list[Callable[[], None]] = []
self._input_changed_observers: list[Callable[[], None]] = []

self.noise: NoiseModel | None = noise

Expand Down Expand Up @@ -143,21 +141,11 @@ def clear_input_and_circuit(self, new_m=None):
get_logger().debug(f"Clear input and circuit in experiment {self.name}", channel.general)
self._reset_circuit()
self._input_state = None
self._input_changed()
self._circuit_changed()
if new_m is not None:
self.m = new_m

def _circuit_changed(self, component=None):
for observer in self._circuit_changed_observers:
observer_fn = observer()
if observer_fn is not None:
observer_fn(component) # Used to notify the Processors containing this experiment of a new component

def add_observers(self, circuit_observer: callable, noise_observer: callable, input_observer: callable):
self._circuit_changed_observers.append(weakref.WeakMethod(circuit_observer))
def add_observers(self, noise_observer: callable):
self._noise_changed_observers.append(weakref.WeakMethod(noise_observer))
self._input_changed_observers.append(weakref.WeakMethod(input_observer))

def min_detected_photons_filter(self, n: int):
r"""
Expand Down Expand Up @@ -214,12 +202,10 @@ def set_postselection(self, postselect: PostSelect | str):
if not isinstance(postselect, PostSelect):
raise TypeError("Parameter must be a PostSelect object")

self._circuit_changed()
self._postselect = postselect

def clear_postselection(self):
if self._postselect != PostSelect():
self._circuit_changed()
self._postselect = PostSelect()

def __deepcopy__(self, memo):
Expand Down Expand Up @@ -317,7 +303,6 @@ def add(self, mode_mapping, component, keep_port: bool = True):
else:
raise RuntimeError(f"Cannot add {type(component)} object to an Experiment")

self._circuit_changed(component)
return self

def _add_ffconfig(self, modes, component: AFFConfigurator):
Expand Down Expand Up @@ -568,7 +553,6 @@ def _add_herald(self, mode, herald: Herald, location: PortLocation = PortLocatio
if location == PortLocation.OUTPUT or location == PortLocation.IN_OUT:
self._out_ports[herald] = [mode]
self._out_mode_type[mode] = ModeType.HERALD
self._circuit_changed()

def add_herald(self, mode: int, expected: int, name: str = None, location: PortLocation = PortLocation.IN_OUT):
r"""
Expand Down Expand Up @@ -838,12 +822,6 @@ def check_input(self, input_state: FockState):
assert len(input_state) == expected_input_length, \
f"Input length not compatible with circuit (expects {expected_input_length}, got {len(input_state)})"

def _input_changed(self):
for observer in self._input_changed_observers:
observer_fn = observer()
if observer_fn is not None:
observer_fn()

@dispatch(LogicalState)
def with_input(self, input_state: LogicalState):
input_state = get_basic_state_from_ports(list(self._in_ports.keys()), input_state)
Expand All @@ -865,13 +843,11 @@ def with_input(self, input_state: FockState) -> None:
input_idx += 1

self._input_state = FockState(input_list)
self._input_changed()

@dispatch(AnnotatedFockState)
def with_input(self, input_state: AnnotatedFockState) -> None:
if input_state.has_polarization:
self._input_state = input_state
self._input_changed()
else:
raise TypeError("Local simulations only support AnnotatedFockState in case of a polarized input state")

Expand All @@ -895,7 +871,6 @@ def with_input(self, svd: SVDistribution):
assert self.m is not None, "A circuit has to be set before the input distribution"
assert svd.m == self.circuit_size, f'Input distribution contains states with a bad size ({svd.m}), expected {self.circuit_size}'
self._input_state = svd
self._input_changed()

def flatten(self, max_depth=None) -> list[tuple]:
"""
Expand Down
18 changes: 10 additions & 8 deletions perceval/runtime/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,7 @@
# SOFTWARE.

from .job_status import JobStatus, RunningStatus
from .job import Job
from .local_job import LocalJob
from .remote_job import RemoteJob
from .abstract_processor import AProcessor
from .processor import Processor
from .remote_processor import RemoteProcessor, perf_dict_to_noise
from .session import ISession
from .remote_config import RemoteConfig
from .job_group import JobGroup
from .check_cancel import cancel_requested
from .payload_generator import PayloadGenerator
from .payload_updater import PayloadUpdater
Expand All @@ -50,3 +42,13 @@
from .remote_computer import RemoteComputer, CommunicationLayer
from .quandela_computer import QuandelaComputer, QuandelaCommunicationLayer
from .execution import Execution

# Legacy
from .session import ISession
from .job import Job
from .local_job import LocalJob
from .remote_job import RemoteJob
from .job_group import JobGroup
from .abstract_processor import AProcessor
from .processor import Processor
from .remote_processor import RemoteProcessor, perf_dict_to_noise
13 changes: 1 addition & 12 deletions perceval/runtime/abstract_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,24 +50,13 @@ def experiment(self) -> Experiment:
@experiment.setter
def experiment(self, experiment: Experiment):
self._experiment = experiment
experiment.add_observers(self._circuit_change_observer,
self._noise_changed_observer,
self._input_changed_observer)
experiment.add_observers(self._noise_changed_observer)
self._noise_changed_observer()
self._circuit_change_observer()
self._input_changed_observer()

@abstractmethod
def _circuit_change_observer(self, new_component = None):
pass

@abstractmethod
def _noise_changed_observer(self):
pass

def _input_changed_observer(self):
pass

@property
def name(self) -> str:
return self.experiment.name
Expand Down
Loading
Loading