def server_back(self, *args):
     self.servers_total_available_t += self.available_servers * (
         time_management.clock - self.servers_available_last_clock)
     self.servers_available_last_clock = time_management.clock
     self.available_servers += 1
     if self.queue_list.__len__() > 0:
         self.servers_total_busy_t += self.busy_servers * (
             time_management.clock - self.servers_busy_last_clock)
         self.servers_busy_last_clock = time_management.clock
         self.busy_servers += 1
         event_duration = self.service_time_generator.generate()
         event_notice = (event_duration + time_management.clock,
                         "D" + str(self.position), self.queue_list[0][1],
                         self.departure)
         add_to_fel(
             event_notice
         )  # Generating departure event for next costumer waiting in queue.
         self.service_total_time += event_duration
         self.service_total_count += 1
         self.q_len_cumulative += len(self.queue_list) * (
             time_management.clock - self.q_len_last_clock)
         self.queue_total_time += int(bool(len(self.queue_list))) * (
             time_management.clock - self.q_len_last_clock)
         self.q_len_last_clock = time_management.clock
         self.queue_delay_cumulative += time_management.clock - self.queue_list[
             0][0]
         del self.queue_list[
             0]  # Deleting the costumer which starts getting service, from queue.
 def new_arrival(self, number_of_arrivals):
     for i in range(number_of_arrivals):
         id_tmp = id_generator()
         SystemArrival.costumers_inside_dict[id_tmp] = time_management.clock
         self.m_list[0].move(id_tmp)
     # generating next arrival event
     event_notice = (
         self.time_generator.generate() + time_management.clock, self.name, self.number_generator.generate(),
         self.new_arrival)
     add_to_fel(event_notice)
 def server_rest(self, *args):
     if self.busy_servers < self.available_servers:
         self.servers_total_available_t += self.available_servers * (
             time_management.clock - self.servers_available_last_clock)
         self.servers_available_last_clock = time_management.clock
         self.available_servers -= 1
         event_notice = (self.server_rest_duration + time_management.clock,
                         "B" + str(self.position), self.server_back)
         add_to_fel(
             event_notice
         )  # Generates event notice for server coming back from rest after 10 mins.
     else:
         self.rest_in_waiting = 1  # It's used in departure() method.
         postponed_rest_log_editor()
 def departure(self, costumer_id):
     if not self.rest_in_waiting:  # If there is no server waiting to get rest.
         if self.queue_list.__len__() > 0:
             event_duration = self.service_time_generator.generate()
             event_notice = (event_duration + time_management.clock,
                             "D" + str(self.position),
                             self.queue_list[0][1], self.departure)
             add_to_fel(
                 event_notice
             )  # Generating departure event for next costumer waiting in queue.
             self.service_total_time += event_duration
             self.service_total_count += 1
             self.q_len_cumulative += len(self.queue_list) * (
                 time_management.clock - self.q_len_last_clock)
             self.queue_total_time += int(bool(len(self.queue_list))) * (
                 time_management.clock - self.q_len_last_clock)
             self.q_len_last_clock = time_management.clock
             self.queue_delay_cumulative += time_management.clock - self.queue_list[
                 0][0]
             del self.queue_list[
                 0]  # Deleting the costumer which starts getting service, from queue.
         else:
             self.servers_total_busy_t += self.busy_servers * (
                 time_management.clock - self.servers_busy_last_clock)
             self.servers_busy_last_clock = time_management.clock
             self.busy_servers -= 1
     else:  # If there is a server waiting to get rest
         self.servers_total_busy_t += self.busy_servers * (
             time_management.clock - self.servers_busy_last_clock)
         self.servers_busy_last_clock = time_management.clock
         self.busy_servers -= 1  # The server is no longer busy
         self.rest_in_waiting = 0  # so there is no busy server, waiting to get rest
         event_notice = (time_management.clock, "R" + str(self.position),
                         self.server_rest)
         add_to_fel(
             event_notice)  # Generating the new server rest event notice
         # Adding this new event notice to fel is necessary for fel logging
     self.m_list[self.position].move(costumer_id)
 def arrival(self, costumer_id):
     if self.busy_servers < self.available_servers:  # No waiting in Queue
         self.servers_total_busy_t += self.busy_servers * (
             time_management.clock - self.servers_busy_last_clock)
         self.servers_busy_last_clock = time_management.clock
         self.busy_servers += 1
         event_duration = self.service_time_generator.generate()
         event_notice = (event_duration + time_management.clock,
                         "D" + str(self.position), costumer_id,
                         self.departure)
         add_to_fel(
             event_notice)  # Generating departure event for this costumer.
         self.service_total_time += event_duration
         self.service_total_count += 1
     else:  # Waiting in queue
         self.q_len_cumulative += len(self.queue_list) * (
             time_management.clock - self.q_len_last_clock)
         self.queue_total_time += int(bool(len(self.queue_list))) * (
             time_management.clock - self.q_len_last_clock)
         self.q_len_last_clock = time_management.clock
         self.queue_list.append((time_management.clock,
                                 costumer_id))  # Adding costumer to queue
         if len(self.queue_list) > self.q_len_max:
             self.q_len_max = len(self.queue_list)
 def set_rest_times(self, rest_times_list):
     for t in rest_times_list:
         event_notice = (t, "R" + str(self.position), self.server_rest)
         add_to_fel(event_notice)
 def set_single_arrival(self, beginning_time):
     event_notice = (
         self.time_generator.generate() + beginning_time, self.name, self.number_generator.generate(),
         self.new_single_arrival)
     add_to_fel(event_notice)