Source code for examples.banksim.model.model_user_gen
"""Author: Changbeom Choi (@cbchoi)Copyright (c) 2014-2020 Handong Global UniversityCopyright (c) 2021-2024 Hanbat National UniversityLicense: MIT. The full license text is available at:https://github.com/eventsim/pyjevsim/blob/main/LICENSEThis module contains Banksim User Generator Model """frompyjevsim.behavior_modelimportBehaviorModelfrompyjevsim.definitionimport*frompyjevsim.system_messageimportSysMessagefrompyjevsim.system_executorimportSysExecutorimportrandom
[docs]classBankUser:def__init__(self,_id:int,s_t:float):""" Args: _id (int): User ID s_t (float): Service time """self.user_id=_id# User IDself.wait_t=0.0# Wait timeself.done_t=0.0# Done timeself.arrival_t=0.0# Arrival timeself.service_t=s_t# Service timeself.drop_t=0
[docs]defget_id(self)->int:""" Returns: int: User ID """returnself.user_id
[docs]defget_wait_time(self)->float:""" Returns: float: Wait time """returnself.wait_t
[docs]defget_arrival_time(self)->float:""" Returns: float: Arrival time """returnself.arrival_t
[docs]defget_service_time(self)->float:""" Returns: float: Service time """returnself.service_t
[docs]defset_arrival_time(self,a_t:float)->None:""" Args: a_t (float): Arrival time """self.arrival_t=a_t
[docs]defcalc_wait_time(self,w_t:float)->None:""" Calculates the wait time. Args: w_t (float): Done time """self.done_t=w_tself.wait_t=w_t-self.arrival_t
[docs]defset_drop_time(self,d_t:float)->None:""" Args: a_t (float): Arrival time """self.drop_t=d_t
def__str__(self):""" Returns a string representation of the BankUser. Returns: str: String representation """returnf"{self.get_id()}, {self.service_t}, {self.arrival_t}, {self.done_t}, {self.wait_t}"
[docs]classBankUserGenerator(BehaviorModel):"""A Model representing a bank user generator."""def__init__(self,name):""" Args: name (str): Name of Model cycle (float): Generation cycle time max_user (int): Maximum number of users to generate proc_time (float): Processing time for each user """BehaviorModel.__init__(self,name)self.init_state("WAIT")# Initialize initial stateself.insert_state("WAIT",Infinite)# Add "WAIT" stateself.insert_state("GEN",random.randint(1,10))# Add "GEN" state with cycle timeself.insert_input_port("start")# Add input port "start"self.insert_output_port("user_out")# Add output port "user_out"#self.cycle = cycle # Generation cycle timeself.generated_user=0# Counter for generated users#self.max_user = max_user # Maximum number of users to generate#self.proc_time = proc_time # Processing time for each user
[docs]defext_trans(self,port,msg):""" Handles external transitions based on the input port. Args: port (str): The port that received the message msg (SysMessage): The received message """ifport=="start":#print(f"[Gen][IN]: started")self._cur_state="GEN"# Transition state to "GEN" self.update_state("GEN",random.randint(1,10))ifport=="stop":self._cur_satate="WAIT"
[docs]defoutput(self,msg_deliver):""" Generates the output message when in the "GEN" state. Returns: SysMessage: The output message """_time=self.global_time#print(f"[G] ID:{self.get_name()}-{self.generated_user} Time:{_time}")msg=SysMessage(self.get_name(),"user_out")bu=BankUser(f"{self.get_name()}-{self.generated_user}",random.randint(1,10))bu.set_arrival_time(_time)msg.insert(bu)# Insert BankUser into messageself.generated_user+=1# Increment generated user countmsg_deliver.insert_message(msg)returnmsg_deliver
[docs]defint_trans(self):"""Handles internal transitions based on the current state."""self.update_state("GEN",random.randint(1,10))# Update "GEN" state with cycle time