Source code for pydsol.model.sink
""" """
"""
Created on: 22-7-2021 10:20
@author: IvS
"""
import itertools
from pydsol.model.basic_logger import get_module_logger
logger = get_module_logger(__name__)
__all__ = ["Sink"]
[docs]class Sink(object):
"""This class defines a sink for a discrete event simulation model. A Sink is the end-station of an entity,
meaning the system will end here for the entity. The entity will be destroyed to reduce the number
of objects in the model."""
id_iter = itertools.count(1)
def __init__(self, simulator, transfer_in_time=0, **kwargs):
"""
Parameters
----------
simulator: Simulator object
simulator of the model.
transfer_in_time: [float, int]
time it takes to transfer an object into the sink. Default is 0.
kwargs:
kwargs are the keyword arguments that are used to expand the sink class.
*name: str
user-specified name for the sink.
"""
self.simulator = simulator
self.transfer_in_time = transfer_in_time
if "distribution" in kwargs:
self.distribution = kwargs["distribution"]
self.id = next(self.id_iter)
self.name = "{0} {1}".format(self.__class__.__name__, str(self.id))
if "name" in kwargs:
self.name = kwargs["name"]
self.kwargs = kwargs
self.processing_entity = None
[docs] def enter_input_node(self, entity):
"""Schedules the event to transfer into the sink and exit the input node.
Parameters
----------
entity: object
the target on which a state change is scheduled.
"""
self.processing_entity = entity
if "distribution" in self.__dict__:
try:
transfer_in_time_dist = self.distribution(*self.transfer_in_time)
except TypeError:
try:
transfer_in_time_dist = self.distribution(self.transfer_in_time)
except TypeError:
raise "Wrong types for transfer in time ({1}) and/or distribution ({0}) for scheduling an event".format(
self.transfer_in_time, self.distribution)
else:
transfer_in_time_dist = self.transfer_in_time
self.simulator.schedule_event_rel(transfer_in_time_dist, self, "exit_input_node", entity=entity)
[docs] def exit_input_node(self, entity, **kwargs):
"""Schedules the event to exit the input node and to destroy the entity.
Parameters
----------
entity: object
the target on which a state change is scheduled.
"""
self.simulator.schedule_event_now(self, "destroy_entity", entity=entity)
[docs] def destroy_entity(self, entity, **kwargs):
"""Destroys the entity.
Parameters
----------
entity: object
the target on which a state change is scheduled.
"""
logger.info("Time {0:.2f}: {1} is destroyed".format(self.simulator.simulator_time, entity.name))
# To reduce number of objects in model
del entity