def test_repr_method(self): N1 = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') Q1 = ciw.Simulation(N1) self.assertEqual(str(Q1), 'Simulation') N2 = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') Q = ciw.Simulation(N2, name='My special simulation instance!') self.assertEqual(str(Q), 'My special simulation instance!')
def test_repr_method(self): N1 = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') Q1 = ciw.Simulation(N1) self.assertEqual(str(Q1), 'Simulation') N2 = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') Q = ciw.Simulation(N2, name='My special simulation instance!') self.assertEqual(str(Q), 'My special simulation instance!')
def test_update_next_event_date_method(self): Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = Q.transitive_nodes[0] self.assertEqual(N.next_event_date, float('Inf')) self.assertEqual(N.all_individuals, []) N.update_next_event_date(0.0) self.assertEqual(N.next_event_date, float('Inf')) ind1 = ciw.Individual(1) ind1.arrival_date = 0.3 ind1.service_time = 0.2 ind1.service_end_date = 0.5 N.next_event_date = 0.3 N.individuals = [[ind1]] N.update_next_event_date(N.next_event_date + 0.000001) self.assertEqual(N.next_event_date, 0.5) ind2 = ciw.Individual(2) ind2.arrival_date = 0.4 ind2.service_time = 0.2 ind2.service_end_date = 0.6 ind2.exit_date = False N.individuals = [[ind1, ind2]] N.update_next_event_date(N.next_event_date + 0.000001) self.assertEqual(N.next_event_date, 0.6) ind2.exit_date = 0.9 N.update_next_event_date(N.next_event_date + 0.000001) self.assertEqual(N.next_event_date, float('Inf')) Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml')) N = Q.transitive_nodes[0] self.assertEqual(N.next_event_date, 30) self.assertEqual(N.individuals, [[]]) N.update_next_event_date(0.0) self.assertEqual(N.next_event_date, 30) ind1 = ciw.Individual(1) ind1.arrival_date = 0.3 ind1.service_time = 0.2 ind1.service_end_date = 0.5 N.next_event_date = 0.3 N.individuals = [[ind1]] N.update_next_event_date(N.next_event_date + 0.000001) self.assertEqual(N.next_event_date, 0.5) N.update_next_event_date(N.next_event_date + 0.000001) self.assertEqual(N.next_event_date, 30)
def test_update_next_event_date_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = Q.transitive_nodes[0] self.assertEqual(N.next_event_date, float('Inf')) self.assertEqual(N.all_individuals, []) N.update_next_event_date(0.0) self.assertEqual(N.next_event_date, float('Inf')) ind1 = ciw.Individual(1) ind1.arrival_date = 0.3 ind1.service_time = 0.2 ind1.service_end_date = 0.5 N.next_event_date = 0.3 N.individuals = [[ind1]] N.update_next_event_date(N.next_event_date + 0.000001) self.assertEqual(N.next_event_date, 0.5) ind2 = ciw.Individual(2) ind2.arrival_date = 0.4 ind2.service_time = 0.2 ind2.service_end_date = 0.6 ind2.exit_date = False N.individuals = [[ind1, ind2]] N.update_next_event_date(N.next_event_date + 0.000001) self.assertEqual(N.next_event_date, 0.6) ind2.exit_date = 0.9 N.update_next_event_date(N.next_event_date + 0.000001) self.assertEqual(N.next_event_date, float('Inf')) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml')) N = Q.transitive_nodes[0] self.assertEqual(N.next_event_date, 30) self.assertEqual(N.individuals, [[]]) N.update_next_event_date(0.0) self.assertEqual(N.next_event_date, 30) ind1 = ciw.Individual(1) ind1.arrival_date = 0.3 ind1.service_time = 0.2 ind1.service_end_date = 0.5 N.next_event_date = 0.3 N.individuals = [[ind1]] N.update_next_event_date(N.next_event_date + 0.000001) self.assertEqual(N.next_event_date, 0.5) N.update_next_event_date(N.next_event_date + 0.000001) self.assertEqual(N.next_event_date, 30)
def test_init_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml'), node_class=ciw.PSNode) N = ciw.PSNode(1, Q) self.assertEqual(N.ps_capacity, 9) self.assertEqual(N.c, float('inf')) self.assertEqual(N.transition_row, [[0.1, 0.2, 0.1, 0.4], [0.6, 0.0, 0.0, 0.2], [0.0, 0.0, 0.4, 0.3]]) self.assertEqual(N.next_event_date, float('inf')) self.assertEqual(N.all_individuals, []) self.assertEqual(N.id_number, 1) self.assertEqual(N.interrupted_individuals, []) self.assertEqual(N.last_occupancy, 0) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_change_class.yml'), node_class=ciw.PSNode) N1 = Q.transitive_nodes[0] self.assertEqual(N1.class_change, [[0.5, 0.5], [0.5, 0.5]]) N2 = Q.transitive_nodes[1] self.assertEqual(N2.class_change, [[1.0, 0.0], [0.0, 1.0]]) self.assertEqual(N.interrupted_individuals, []) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml'), node_class=ciw.PSNode) N = Q.transitive_nodes[0] self.assertEqual(N.cyclelength, 100) self.assertEqual(N.ps_capacity, 1) self.assertEqual(N.c, float('inf')) self.assertEqual(N.schedule, [[0, 1], [30, 2], [60, 1], [90, 3]]) self.assertEqual(N.next_event_date, 30) self.assertEqual(N.interrupted_individuals, []) self.assertEqual(N.last_occupancy, 0) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_priorities.yml'), node_class=ciw.PSNode) N = Q.transitive_nodes[0] self.assertEqual(N.ps_capacity, 4) self.assertEqual(N.c, float('inf')) self.assertEqual(Q.network.priority_class_mapping, {0: 0, 1: 1}) self.assertEqual(Q.number_of_priority_classes, 2) self.assertEqual(N.interrupted_individuals, []) self.assertEqual(N.last_occupancy, 0)
def test_repr_method(self): Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = Q.transitive_nodes[0] s = ciw.Server(N, 4) self.assertEqual(str(s), 'Server 4 at Node 1')
def test_infinite_servers_from_file(self): N = ciw.create_network_from_yml('ciw/tests/testing_parameters/params_infservers.yml') Q = ciw.Simulation(N) Q.simulate_until_max_customers(100, method='Finish') recs = Q.get_all_records() waits = [r.waiting_time for r in recs] self.assertEqual(waits, [0.0 for _ in range(100)])
def test_naive_change_state_block_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) B = ciw.NaiveTracker(Q) B.state = [[1, 0], [0, 0], [0, 0], [0, 0]] B.change_state_block(1, 1, 2) self.assertEqual(B.state, [[0, 1], [0, 0], [0, 0], [0, 0]])
def test_base_change_state_release_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) B = ciw.StateTracker(Q) self.assertEqual(B.state, None) B.change_state_release(1, 1, 1, True) self.assertEqual(B.state, None)
def test_matrix_change_state_block_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) B = ciw.MatrixTracker(Q) B.state = [[[[], [], [], []], [[], [], [], []], [[], [], [], []], [[], [], [], []]], [2, 3, 1, 0]] B.change_state_block(1, 3, 2) self.assertEqual(B.state, [[[[], [], [1], []], [[], [], [], []], [[], [], [], []], [[], [], [], []]], [2, 3, 1, 0]]) B.change_state_block(2, 1, 0) self.assertEqual(B.state, [[[[], [], [1], []], [[2], [], [], []], [[], [], [], []], [[], [], [], []]], [2, 3, 1, 0]]) B.change_state_block(1, 3, 0) self.assertEqual(B.state, [[[[], [], [1, 3], []], [[2], [], [], []], [[], [], [], []], [[], [], [], []]], [2, 3, 1, 0]])
def test_create_network_from_yml(self): N = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') self.assertEqual(N.number_of_nodes, 4) self.assertEqual(N.number_of_classes, 3) self.assertEqual(N.service_centres[0].queueing_capacity, 20) self.assertEqual(N.service_centres[1].queueing_capacity, float('Inf')) self.assertEqual(N.service_centres[2].queueing_capacity, 30) self.assertEqual(N.service_centres[3].queueing_capacity, float('Inf')) self.assertEqual(N.service_centres[0].number_of_servers, 9) self.assertEqual(N.service_centres[1].number_of_servers, 10) self.assertEqual(N.service_centres[2].number_of_servers, 8) self.assertEqual(N.service_centres[3].number_of_servers, 8) self.assertEqual(N.service_centres[0].class_change_matrix, None) self.assertEqual(N.service_centres[1].class_change_matrix, None) self.assertEqual(N.service_centres[2].class_change_matrix, None) self.assertEqual(N.service_centres[3].class_change_matrix, None) self.assertEqual(N.service_centres[0].schedule, None) self.assertEqual(N.service_centres[1].schedule, None) self.assertEqual(N.service_centres[2].schedule, None) self.assertEqual(N.service_centres[3].schedule, None) self.assertFalse(N.service_centres[0].preempt) self.assertFalse(N.service_centres[1].preempt) self.assertFalse(N.service_centres[2].preempt) self.assertFalse(N.service_centres[3].preempt) self.assertEqual(N.customer_classes[0].arrival_distributions, [['Exponential', 3.0], ['Exponential', 7.0], ['Exponential', 4.0], ['Exponential', 1.0]]) self.assertEqual(N.customer_classes[1].arrival_distributions, [['Exponential', 2.0], ['Exponential', 3.0], ['Exponential', 6.0], ['Exponential', 4.0]]) self.assertEqual(N.customer_classes[2].arrival_distributions, [['Exponential', 2.0], ['Exponential', 1.0], ['Exponential', 2.0], ['Exponential', 0.5]]) self.assertEqual(N.customer_classes[0].service_distributions, [['Exponential', 7.0], ['Exponential', 7.0], ['Gamma', 0.4, 0.6], ['Deterministic', 0.5]]) self.assertEqual(N.customer_classes[1].service_distributions, [['Exponential', 7.0], ['Triangular', 0.1, 0.85, 0.8], ['Exponential', 8.0], ['Exponential', 5.0]]) self.assertEqual(N.customer_classes[2].service_distributions, [['Deterministic', 0.3], ['Deterministic', 0.2], ['Exponential', 8.0], ['Exponential', 9.0]]) self.assertEqual(N.customer_classes[0].transition_matrix, [[0.1, 0.2, 0.1, 0.4], [0.2, 0.2, 0.0, 0.1], [0.0, 0.8, 0.1, 0.1], [0.4, 0.1, 0.1, 0.0]]) self.assertEqual(N.customer_classes[1].transition_matrix, [[0.6, 0.0, 0.0, 0.2], [0.1, 0.1, 0.2, 0.2], [0.9, 0.0, 0.0, 0.0], [0.2, 0.1, 0.1, 0.1]]) self.assertEqual(N.customer_classes[2].transition_matrix, [[0.0, 0.0, 0.4, 0.3], [0.1, 0.1, 0.1, 0.1], [0.1, 0.3, 0.2, 0.2], [0.0, 0.0, 0.0, 0.3]])
def test_change_shift_method(self): Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml')) N = Q.transitive_nodes[0] N.next_event_date = 30 self.assertEqual([str(obs) for obs in N.servers], ['Server 1 at Node 1']) self.assertEqual([obs.busy for obs in N.servers], [False]) self.assertEqual([obs.offduty for obs in N.servers], [False]) self.assertEqual(N.c, 1) N.change_shift() self.assertEqual([str(obs) for obs in N.servers], ['Server 2 at Node 1', 'Server 3 at Node 1']) self.assertEqual([obs.busy for obs in N.servers], [False, False]) self.assertEqual([obs.offduty for obs in N.servers], [False, False]) self.assertEqual(N.c, 2) N.servers[0].busy = True N.next_event_date = 90 N.change_shift() self.assertEqual([str(obs) for obs in N.servers], [ 'Server 2 at Node 1', 'Server 4 at Node 1', 'Server 5 at Node 1', 'Server 6 at Node 1' ]) self.assertEqual([obs.busy for obs in N.servers], [True, False, False, False]) self.assertEqual([obs.offduty for obs in N.servers], [True, False, False, False]) self.assertEqual(N.c, 3)
def test_add_new_servers_method(self): Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml')) N = Q.transitive_nodes[0] self.assertEqual([str(obs) for obs in N.servers], ['Server 1 at Node 1']) N.add_new_servers(3) self.assertEqual([str(obs) for obs in N.servers], [ 'Server 1 at Node 1', 'Server 2 at Node 1', 'Server 3 at Node 1', 'Server 4 at Node 1' ]) N.add_new_servers(2) self.assertEqual([str(obs) for obs in N.servers], [ 'Server 1 at Node 1', 'Server 2 at Node 1', 'Server 3 at Node 1', 'Server 4 at Node 1', 'Server 5 at Node 1', 'Server 6 at Node 1' ]) N.add_new_servers(10) self.assertEqual([str(obs) for obs in N.servers], [ 'Server 1 at Node 1', 'Server 2 at Node 1', 'Server 3 at Node 1', 'Server 4 at Node 1', 'Server 5 at Node 1', 'Server 6 at Node 1', 'Server 7 at Node 1', 'Server 8 at Node 1', 'Server 9 at Node 1', 'Server 10 at Node 1', 'Server 11 at Node 1', 'Server 12 at Node 1', 'Server 13 at Node 1', 'Server 14 at Node 1', 'Server 15 at Node 1', 'Server 16 at Node 1' ])
def test_simulate_until_max_customers_with_pbar_method(self): N = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') max_custs = 250 ciw.seed(1) Q1 = ciw.Simulation(N) Q1.simulate_until_max_customers(max_custs, progress_bar=True, method='Finish') self.assertEqual(Q1.progress_bar.total, max_custs) self.assertEqual(Q1.progress_bar.n, max_custs) ciw.seed(1) Q2 = ciw.Simulation(N) Q2.simulate_until_max_customers(max_custs, progress_bar=True, method='Arrive') self.assertEqual(Q2.progress_bar.total, max_custs) self.assertEqual(Q2.progress_bar.n, max_custs) ciw.seed(1) Q3 = ciw.Simulation(N) Q3.simulate_until_max_customers(max_custs, progress_bar=True, method='Accept') self.assertEqual(Q3.progress_bar.total, max_custs) self.assertEqual(Q3.progress_bar.n, max_custs)
def test_simulate_until_deadlock_method(self): ciw.seed(3) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_deadlock.yml'), deadlock_detector='StateDigraph') Q.simulate_until_deadlock() self.assertEqual(round(Q.times_to_deadlock[((0, 0), (0, 0))], 8), 7.09795845)
def test_matrix_release_method_within_simulation(self): params = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') Q = ciw.Simulation(params, tracker=ciw.trackers.MatrixTracker()) N = Q.transitive_nodes[2] inds = [ciw.Individual(i) for i in range(5)] N.individuals = [inds] for ind in N.individuals[0]: srvr = N.find_free_server() N.attach_server(srvr, ind) Q.statetracker.state = [[[[], [2], [], []], [[], [], [], []], [[1], [], [], []], [[], [], [], []]], [5, 3, 6, 0]] Q.statetracker.increment = 3 self.assertEqual(Q.statetracker.state, [[[[], [2], [], []], [[], [], [], []], [[1], [], [], []], [[], [], [], []]], [5, 3, 6, 0]]) Q.current_time = 43.11 N.release(0, Q.nodes[1]) self.assertEqual(Q.statetracker.state, [[[[], [2], [], []], [[], [], [], []], [[1], [], [], []], [[], [], [], []]], [6, 3, 5, 0]]) N.all_individuals[1].is_blocked = True Q.current_time = 46.72 N.release(1, Q.nodes[1]) self.assertEqual(Q.statetracker.state, [[[[], [1], [], []], [[], [], [], []], [[], [], [], []], [[], [], [], []]], [7, 3, 4, 0]]) Q.current_time = 48.39 N.release(1, Q.nodes[-1]) self.assertEqual(Q.statetracker.state, [[[[], [1], [], []], [[], [], [], []], [[], [], [], []], [[], [], [], []]], [7, 3, 3, 0]])
def test_begin_service_if_possible_accept_method(self): ciw.seed(50) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_deadlock.yml'), deadlock_detector=ciw.deadlock.StateDigraph()) ind = ciw.Individual(1) self.assertEqual( set(Q.deadlock_detector.statedigraph.nodes()), set([ 'Server 5 at Node 2', 'Server 5 at Node 1', 'Server 3 at Node 2', 'Server 1 at Node 2', 'Server 1 at Node 1', 'Server 2 at Node 1', 'Server 2 at Node 2', 'Server 3 at Node 1', 'Server 4 at Node 1', 'Server 4 at Node 2' ])) self.assertEqual(ind.arrival_date, False) self.assertEqual(ind.service_time, False) self.assertEqual(ind.service_start_date, False) self.assertEqual(ind.service_end_date, False) Q.current_time = 300 Q.transitive_nodes[0].begin_service_if_possible_accept(ind) self.assertEqual(ind.arrival_date, 300) self.assertEqual(round(ind.service_time, 5), 0.03382) self.assertEqual(ind.service_start_date, 300) self.assertEqual(round(ind.service_end_date, 5), 300.03382)
def test_check_if_shiftchange_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml')) N = Q.transitive_nodes[0] N.next_event_date = 12.0 self.assertEqual(N.check_if_shiftchange(), False) N.next_event_date = 30.0 self.assertEqual(N.check_if_shiftchange(), True) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = Q.transitive_nodes[0] N.next_event_date = 12.0 self.assertEqual(N.check_if_shiftchange(), False) N.next_event_date = 30.0 self.assertEqual(N.check_if_shiftchange(), False)
def test_simulate_until_max_time_with_pbar_method(self): Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) Q.simulate_until_max_time(150, progress_bar=True) self.assertEqual(Q.progress_bar.total, 150) self.assertEqual(Q.progress_bar.n, 150)
def test_base_hash_state_method(self): Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) B = ciw.trackers.StateTracker() B.initialise(Q) self.assertEqual(B.hash_state(), None)
def test_check_if_shiftchange_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml')) N = Q.transitive_nodes[0] N.next_event_date = 12.0 self.assertEqual(N.check_if_shiftchange(), False) N.next_event_date = 30.0 self.assertEqual(N.check_if_shiftchange(), True) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = Q.transitive_nodes[0] N.next_event_date = 12.0 self.assertEqual(N.check_if_shiftchange(), False) N.next_event_date = 30.0 self.assertEqual(N.check_if_shiftchange(), False)
def test_release_method(self): ciw.seed(4) Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = Q.transitive_nodes[0] inds = [ciw.Individual(i + 1) for i in range(3)] for current_time in [0.01, 0.02, 0.03]: N.accept(inds[int(current_time * 100 - 1)], current_time) self.assertEqual([str(obs) for obs in N.all_individuals], ['Individual 1', 'Individual 2', 'Individual 3']) self.assertEqual([[str(obs) for obs in pr_cls] for pr_cls in N.individuals], [['Individual 1', 'Individual 2', 'Individual 3']]) N.update_next_event_date(0.03) self.assertEqual(round(N.next_event_date, 5), 0.03604) N.servers[1].next_end_service_date = float('Inf') N.release(1, Q.transitive_nodes[1], N.next_event_date) self.assertEqual([str(obs) for obs in N.all_individuals], ['Individual 1', 'Individual 3']) self.assertEqual([[str(obs) for obs in pr_cls] for pr_cls in N.individuals], [['Individual 1', 'Individual 3']]) N.update_next_event_date(N.next_event_date) self.assertEqual(round(N.next_event_date, 5), 0.03708) N.servers[0].next_end_service_date = float('Inf') N.release(0, Q.transitive_nodes[1], N.next_event_date) self.assertEqual([str(obs) for obs in N.all_individuals], ['Individual 3']) self.assertEqual([[str(obs) for obs in pr_cls] for pr_cls in N.individuals], [['Individual 3']]) N.update_next_event_date(N.next_event_date) self.assertEqual(round(N.next_event_date, 5), 0.06447)
def test_begin_service_if_possible_release_method(self): ciw.seed(50) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_deadlock.yml'), deadlock_detector='StateDigraph') inds = [[ciw.Individual(i) for i in range(30)]] Q.transitive_nodes[0].individuals = inds ind = Q.transitive_nodes[0].individuals[0][0] ind.service_time = 3.14 ind.arrival_date = 100.0 self.assertEqual( set(Q.deadlock_detector.statedigraph.nodes()), set([ 'Server 5 at Node 2', 'Server 5 at Node 1', 'Server 3 at Node 2', 'Server 1 at Node 2', 'Server 1 at Node 1', 'Server 2 at Node 1', 'Server 2 at Node 2', 'Server 3 at Node 1', 'Server 4 at Node 1', 'Server 4 at Node 2' ])) self.assertEqual(ind.arrival_date, 100.0) self.assertEqual(ind.service_time, 3.14) self.assertEqual(ind.service_start_date, False) self.assertEqual(ind.service_end_date, False) Q.transitive_nodes[0].begin_service_if_possible_release(200.0) self.assertEqual(ind.arrival_date, 100.0) self.assertEqual(round(ind.service_time, 5), 3.14) self.assertEqual(ind.service_start_date, 200.0) self.assertEqual(round(ind.service_end_date, 5), 203.14)
def test_repr_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N1 = ciw.Node(1, Q) N2 = ciw.Node(2, Q) self.assertEqual(str(N1), 'Node 1') self.assertEqual(str(N2), 'Node 2')
def test_change_shift_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml')) N = Q.transitive_nodes[0] N.next_event_date = 30 self.assertEqual([str(obs) for obs in N.servers], ['Server 1 at Node 1']) self.assertEqual([obs.busy for obs in N.servers], [False]) self.assertEqual([obs.offduty for obs in N.servers], [False]) self.assertEqual(N.c, 1) N.change_shift() self.assertEqual([str(obs) for obs in N.servers], ['Server 2 at Node 1', 'Server 3 at Node 1']) self.assertEqual([obs.busy for obs in N.servers], [False, False]) self.assertEqual([obs.offduty for obs in N.servers], [False, False]) self.assertEqual(N.c, 2) N.servers[0].busy = True N.next_event_date = 90 N.change_shift() self.assertEqual([str(obs) for obs in N.servers], ['Server 2 at Node 1', 'Server 4 at Node 1', 'Server 5 at Node 1', 'Server 6 at Node 1']) self.assertEqual([obs.busy for obs in N.servers], [True, False, False, False]) self.assertEqual([obs.offduty for obs in N.servers], [True, False, False, False]) self.assertEqual(N.c, 3)
def test_begin_service_if_possible_accept_method(self): ciw.seed(50) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_deadlock.yml'), deadlock_detector='StateDigraph') ind = ciw.Individual(1) self.assertEqual(set(Q.deadlock_detector.statedigraph.nodes()), set(['Server 5 at Node 2', 'Server 5 at Node 1', 'Server 3 at Node 2', 'Server 1 at Node 2', 'Server 1 at Node 1', 'Server 2 at Node 1', 'Server 2 at Node 2', 'Server 3 at Node 1', 'Server 4 at Node 1', 'Server 4 at Node 2'])) self.assertEqual(ind.arrival_date, False) self.assertEqual(ind.service_time, False) self.assertEqual(ind.service_start_date, False) self.assertEqual(ind.service_end_date, False) Q.transitive_nodes[0].begin_service_if_possible_accept(ind, 300) self.assertEqual(ind.arrival_date, 300) self.assertEqual(round(ind.service_time, 5), 0.03382) self.assertEqual(ind.service_start_date, 300) self.assertEqual(round(ind.service_end_date, 5), 300.03382)
def test_begin_service_if_possible_release_method(self): ciw.seed(50) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_deadlock.yml'), deadlock_detector='StateDigraph') inds = [[ciw.Individual(i) for i in range(30)]] Q.transitive_nodes[0].individuals = inds ind = Q.transitive_nodes[0].individuals[0][0] ind.service_time = 3.14 ind.arrival_date = 100.0 self.assertEqual(set(Q.deadlock_detector.statedigraph.nodes()), set(['Server 5 at Node 2', 'Server 5 at Node 1', 'Server 3 at Node 2', 'Server 1 at Node 2', 'Server 1 at Node 1', 'Server 2 at Node 1', 'Server 2 at Node 2', 'Server 3 at Node 1', 'Server 4 at Node 1', 'Server 4 at Node 2'])) self.assertEqual(ind.arrival_date, 100.0) self.assertEqual(ind.service_time, 3.14) self.assertEqual(ind.service_start_date, False) self.assertEqual(ind.service_end_date, False) Q.transitive_nodes[0].begin_service_if_possible_release(200.0) self.assertEqual(ind.arrival_date, 100.0) self.assertEqual(round(ind.service_time ,5), 3.14) self.assertEqual(ind.service_start_date, 200.0) self.assertEqual(round(ind.service_end_date, 5), 203.14)
def test_create_network_from_yml(self): N = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') self.assertEqual(N.number_of_nodes, 4) self.assertEqual(N.number_of_classes, 3) self.assertEqual(N.service_centres[0].queueing_capacity, 20) self.assertEqual(N.service_centres[1].queueing_capacity, float('Inf')) self.assertEqual(N.service_centres[2].queueing_capacity, 30) self.assertEqual(N.service_centres[3].queueing_capacity, float('Inf')) self.assertEqual(N.service_centres[0].number_of_servers, 9) self.assertEqual(N.service_centres[1].number_of_servers, 10) self.assertEqual(N.service_centres[2].number_of_servers, 8) self.assertEqual(N.service_centres[3].number_of_servers, 8) self.assertEqual(N.service_centres[0].class_change_matrix, None) self.assertEqual(N.service_centres[1].class_change_matrix, None) self.assertEqual(N.service_centres[2].class_change_matrix, None) self.assertEqual(N.service_centres[3].class_change_matrix, None) self.assertEqual(N.service_centres[0].schedule, None) self.assertEqual(N.service_centres[1].schedule, None) self.assertEqual(N.service_centres[2].schedule, None) self.assertEqual(N.service_centres[3].schedule, None) self.assertFalse(N.service_centres[0].preempt) self.assertFalse(N.service_centres[1].preempt) self.assertFalse(N.service_centres[2].preempt) self.assertFalse(N.service_centres[3].preempt) self.assertEqual(N.customer_classes[0].arrival_distributions, [['Exponential', 3.0], ['Exponential', 7.0], ['Exponential', 4.0], ['Exponential', 1.0]]) self.assertEqual(N.customer_classes[1].arrival_distributions, [['Exponential', 2.0], ['Exponential', 3.0], ['Exponential', 6.0], ['Exponential', 4.0]]) self.assertEqual(N.customer_classes[2].arrival_distributions, [['Exponential', 2.0], ['Exponential', 1.0], ['Exponential', 2.0], ['Exponential', 0.5]]) self.assertEqual(N.customer_classes[0].service_distributions, [['Exponential', 7.0], ['Exponential', 7.0], ['Gamma', 0.4, 0.6], ['Deterministic', 0.5]]) self.assertEqual(N.customer_classes[1].service_distributions, [['Exponential', 7.0], ['Triangular', 0.1, 0.85, 0.8], ['Exponential', 8.0], ['Exponential', 5.0]]) self.assertEqual(N.customer_classes[2].service_distributions, [['Deterministic', 0.3], ['Deterministic', 0.2], ['Exponential', 8.0], ['Exponential', 9.0]]) self.assertEqual(N.customer_classes[0].transition_matrix, [[0.1, 0.2, 0.1, 0.4], [0.2, 0.2, 0.0, 0.1], [0.0, 0.8, 0.1, 0.1], [0.4, 0.1, 0.1, 0.0]]) self.assertEqual(N.customer_classes[1].transition_matrix, [[0.6, 0.0, 0.0, 0.2], [0.1, 0.1, 0.2, 0.2], [0.9, 0.0, 0.0, 0.0], [0.2, 0.1, 0.1, 0.1]]) self.assertEqual(N.customer_classes[2].transition_matrix, [[0.0, 0.0, 0.4, 0.3], [0.1, 0.1, 0.1, 0.1], [0.1, 0.3, 0.2, 0.2], [0.0, 0.0, 0.0, 0.3]])
def test_find_next_active_node_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) i = 0 for node in Q.nodes[:-1]: node.next_event_date = i i += 1 self.assertEqual(str(Q.find_next_active_node()), 'Arrival Node') Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) i = 10 for node in Q.nodes[:-1]: node.next_event_date = i i -= 1 self.assertEqual(str(Q.find_next_active_node()), 'Node 4')
def test_block_individual_method(self): ciw.seed(4) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_deadlock.yml'), deadlock_detector=ciw.deadlock.StateDigraph()) inds = [ciw.Individual(i + 1) for i in range(7)] N1 = Q.transitive_nodes[0] N1.individuals = [inds[:6]] N2 = Q.transitive_nodes[1] Q.current_time = 2 N2.accept(inds[6]) self.assertEqual(inds[6].is_blocked, False) self.assertEqual(N1.blocked_queue, []) self.assertEqual(set(Q.deadlock_detector.statedigraph.edges()), set([])) N2.block_individual(inds[6], N1) self.assertEqual(inds[6].is_blocked, True) [(2, 7)] self.assertEqual( set(Q.deadlock_detector.statedigraph.edges()), set([('Server 1 at Node 2', 'Server 2 at Node 1'), ('Server 1 at Node 2', 'Server 5 at Node 1'), ('Server 1 at Node 2', 'Server 3 at Node 1'), ('Server 1 at Node 2', 'Server 1 at Node 1'), ('Server 1 at Node 2', 'Server 4 at Node 1')]))
def test_repr_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N1 = ciw.Node(1, Q) N2 = ciw.Node(2, Q) self.assertEqual(str(N1), 'Node 1') self.assertEqual(str(N2), 'Node 2')
def test_accept_method(self): ciw.seed(6) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = Q.transitive_nodes[0] N.next_event_date = 0.0 self.assertEqual(N.all_individuals, []) ind1 = ciw.Individual(1) ind2 = ciw.Individual(2) ind3 = ciw.Individual(3) ind4 = ciw.Individual(4) ind5 = ciw.Individual(5) ind6 = ciw.Individual(6) ind7 = ciw.Individual(7) ind8 = ciw.Individual(8) ind9 = ciw.Individual(9) ind10 = ciw.Individual(10) N.accept(ind1, 0.01) self.assertEqual([str(obs) for obs in N.all_individuals], ['Individual 1']) self.assertEqual(ind1.arrival_date, 0.01) self.assertEqual(ind1.service_start_date, 0.01) self.assertEqual(round(ind1.service_time, 5), 0.18695) self.assertEqual(round(ind1.service_end_date, 5), 0.19695) N.accept(ind2, 0.02) N.accept(ind3, 0.03) N.accept(ind4, 0.04) self.assertEqual([str(obs) for obs in N.all_individuals], ['Individual 1', 'Individual 2', 'Individual 3', 'Individual 4']) self.assertEqual(round(ind4.arrival_date, 5), 0.04) self.assertEqual(round(ind4.service_start_date, 5), 0.04) self.assertEqual(round(ind4.service_time, 5), 0.1637) self.assertEqual(round(ind4.service_end_date, 5), 0.2037) N.accept(ind5, 0.05) N.accept(ind6, 0.06) N.accept(ind7, 0.07) N.accept(ind8, 0.08) N.accept(ind9, 0.09) N.accept(ind10, 0.1) self.assertEqual([str(obs) for obs in N.all_individuals], ['Individual 1', 'Individual 2', 'Individual 3', 'Individual 4', 'Individual 5', 'Individual 6', 'Individual 7', 'Individual 8', 'Individual 9', 'Individual 10']) self.assertEqual(round(ind10.arrival_date, 5), 0.1) self.assertEqual(ind10.service_start_date, False) self.assertEqual(round(ind10.service_time, 5), 0.16534)
def test_accept_method(self): ciw.seed(6) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = Q.transitive_nodes[0] N.next_event_date = 0.0 self.assertEqual(N.all_individuals, []) ind1 = ciw.Individual(1) ind2 = ciw.Individual(2) ind3 = ciw.Individual(3) ind4 = ciw.Individual(4) ind5 = ciw.Individual(5) ind6 = ciw.Individual(6) ind7 = ciw.Individual(7) ind8 = ciw.Individual(8) ind9 = ciw.Individual(9) ind10 = ciw.Individual(10) N.accept(ind1, 0.01) self.assertEqual([str(obs) for obs in N.all_individuals], ['Individual 1']) self.assertEqual(ind1.arrival_date, 0.01) self.assertEqual(ind1.service_start_date, 0.01) self.assertEqual(round(ind1.service_time, 5), 0.18695) self.assertEqual(round(ind1.service_end_date, 5), 0.19695) N.accept(ind2, 0.02) N.accept(ind3, 0.03) N.accept(ind4, 0.04) self.assertEqual([str(obs) for obs in N.all_individuals], ['Individual 1', 'Individual 2', 'Individual 3', 'Individual 4']) self.assertEqual(round(ind4.arrival_date, 5), 0.04) self.assertEqual(round(ind4.service_start_date, 5), 0.04) self.assertEqual(round(ind4.service_time, 5), 0.1637) self.assertEqual(round(ind4.service_end_date, 5), 0.2037) N.accept(ind5, 0.05) N.accept(ind6, 0.06) N.accept(ind7, 0.07) N.accept(ind8, 0.08) N.accept(ind9, 0.09) N.accept(ind10, 0.1) self.assertEqual([str(obs) for obs in N.all_individuals], ['Individual 1', 'Individual 2', 'Individual 3', 'Individual 4', 'Individual 5', 'Individual 6', 'Individual 7', 'Individual 8', 'Individual 9', 'Individual 10']) self.assertEqual(round(ind10.arrival_date, 5), 0.1) self.assertEqual(ind10.service_start_date, False) self.assertEqual(round(ind10.service_time, 5), 0.16534)
def test_base_block_method_within_simulation(self): Net = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') Q = ciw.Simulation(Net) N = Q.transitive_nodes[2] self.assertEqual(Q.statetracker.state, None) N.block_individual(ciw.Individual(1), Q.nodes[1]) self.assertEqual(Q.statetracker.state, None)
def test_naive_hash_state_method(self): Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) B = ciw.trackers.NaiveTracker() B.initialise(Q) B.state = [[3, 4], [1, 2], [0, 1], [0, 0]] self.assertEqual(B.hash_state(), ((3, 4), (1, 2), (0, 1), (0, 0)))
def test_naive_accept_method_within_simulation(self): params = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') Q = ciw.Simulation(params, tracker='Naive') N = Q.transitive_nodes[2] self.assertEqual(Q.statetracker.state, [[0, 0], [0, 0], [0, 0], [0, 0]]) N.accept(ciw.Individual(3, 2), 45.6) self.assertEqual(Q.statetracker.state, [[0, 0], [0, 0], [1, 0], [0, 0]])
def test_naive_init_method(self): Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) B = ciw.trackers.NaiveTracker() B.initialise(Q) self.assertEqual(B.simulation, Q) self.assertEqual(B.state, [[0, 0], [0, 0], [0, 0], [0, 0]])
def test_get_all_records(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) Q.simulate_until_max_time(50) recs = Q.get_all_records() for row in recs: self.assertIsInstance(row, ciw.simulation.Record) self.assertEqual(len(row), len(ciw.simulation.Record._fields))
def test_base_accept_method_within_simulation(self): Net = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') Q = ciw.Simulation(Net) N = Q.transitive_nodes[2] self.assertEqual(Q.statetracker.state, None) N.accept(ciw.Individual(3, 2), 45.6) self.assertEqual(Q.statetracker.state, None)
def test_simulate_until_max_time_method(self): ciw.seed(2) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) Q.simulate_until_max_time(150) L = Q.get_all_records() self.assertEqual(round( L[300].service_start_date, 8), 2.35688581) ciw.seed(60) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_change_class.yml')) Q.simulate_until_max_time(50) L = Q.get_all_individuals() drl = [] for dr in L[0].data_records: drl.append((dr.customer_class, dr.service_time)) self.assertEqual(drl, [(1, 10.0), (0, 5.0), (0, 5.0)])
def test_init_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = Q.transitive_nodes[1] s = ciw.Server(N, 3) self.assertEqual(s.id_number, 3) self.assertEqual(s.node, N) self.assertEqual(s.node.id_number, 2) self.assertEqual(s.cust, False) self.assertEqual(s.busy, False) self.assertEqual(s.offduty, False)
def test_check_userdef_dist(self, positive_float, negative_float, word, rm): assume(negative_float < 0) Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) self.assertEqual( Q.check_userdef_dist(lambda : positive_float), positive_float) self.assertRaises( ValueError, Q.check_userdef_dist, lambda : negative_float) self.assertRaises( ValueError, Q.check_userdef_dist, lambda : word)
def test_date_from_schedule_generator(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) sg = Q.nodes[1].date_from_schedule_generator([30, 60, 90, 100]) self.assertEqual(next(sg), 30) self.assertEqual(next(sg), 60) self.assertEqual(next(sg), 90) self.assertEqual(next(sg), 100) self.assertEqual(next(sg), 130) self.assertEqual(next(sg), 160)
def test_all_individuals_property(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_priorities.yml')) N1 = Q.transitive_nodes[0] self.assertEqual(N1.individuals, [[], []]) self.assertEqual(N1.all_individuals, []) N1.individuals = [[3, 6, 1], [1, 9]] self.assertEqual(N1.all_individuals, [3, 6, 1, 1, 9]) N1.individuals = [[3, 'help', 1], [], [1, 9]] self.assertEqual(N1.all_individuals, [3, 'help', 1, 1, 9])
def test_add_new_servers_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml')) N = Q.transitive_nodes[0] self.assertEqual([str(obs) for obs in N.servers], ['Server 1 at Node 1']) s_indx = 3 N.add_new_servers(s_indx) self.assertEqual([str(obs) for obs in N.servers], ['Server 1 at Node 1', 'Server 2 at Node 1', 'Server 3 at Node 1', 'Server 4 at Node 1'])
def test_init_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = ciw.Node(1, Q) self.assertEqual(N.c, 9) self.assertEqual(N.transition_row, [[0.1, 0.2, 0.1, 0.4], [0.6, 0.0, 0.0, 0.2], [0.0, 0.0, 0.4, 0.3]]) self.assertEqual(N.next_event_date, float('Inf')) self.assertEqual(N.all_individuals, []) self.assertEqual(N.id_number, 1) self.assertEqual(N.interrupted_individuals, []) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_change_class.yml')) N1 = Q.transitive_nodes[0] self.assertEqual(N1.class_change, [[0.5, 0.5], [0.5, 0.5]]) N2 = Q.transitive_nodes[1] self.assertEqual(N2.class_change, [[1.0, 0.0], [0.0, 1.0]]) self.assertEqual(N.interrupted_individuals, []) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml')) N = Q.transitive_nodes[0] self.assertEqual(N.cyclelength, 100) self.assertEqual(N.c, 1) self.assertEqual(N.schedule, [[0, 1], [30, 2], [60, 1], [90, 3]]) self.assertEqual(N.next_event_date, 30) self.assertEqual(N.interrupted_individuals, []) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_priorities.yml')) N = Q.transitive_nodes[0] self.assertEqual(N.c, 4) self.assertEqual(Q.network.priority_class_mapping, {0: 0, 1: 1}) self.assertEqual(Q.number_of_priority_classes, 2) self.assertEqual(N.interrupted_individuals, [])
def test_init_method(self): ciw.seed(5) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = ciw.ArrivalNode(Q) self.assertEqual(round(N.next_event_date, 5), 0.00440) self.assertEqual(N.number_of_individuals, 0) dates_dict = {1: {0: 0.2110410999, 1: 0.1415614623, 2: 0.3923690877}, 2: {0: 0.1218825551, 1: 0.0044003133, 2: 0.2442775601}, 3: {0: 0.0819463473, 1: 0.4135097542, 2: 0.7256307839}, 4: {0: 0.1738823223, 1: 0.3988184145, 2: 0.2987813628}} self.assertEqual({nd: {obs: round(N.event_dates_dict[nd][obs], 10) for obs in N.event_dates_dict[nd]} for nd in N.event_dates_dict}, dates_dict)
def test_detect_deadlock_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_deadlock.yml'), deadlock_detector='StateDigraph') nodes = ['A', 'B', 'C', 'D', 'E'] connections = [('A', 'D'), ('A', 'B'), ('B', 'E'), ('C', 'B'), ('E', 'C')] Q.deadlock_detector.statedigraph = nx.DiGraph() for nd in nodes: Q.deadlock_detector.statedigraph.add_node(nd) for cnctn in connections: Q.deadlock_detector.statedigraph.add_edge(cnctn[0], cnctn[1]) self.assertEqual(Q.deadlock_detector.detect_deadlock(), True) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_deadlock.yml'), deadlock_detector='StateDigraph') nodes = ['A', 'B', 'C', 'D'] connections = [('A', 'B'), ('A', 'C'), ('B', 'C'), ('B', 'D')] Q.deadlock_detector.statedigraph = nx.DiGraph() for nd in nodes: Q.deadlock_detector.statedigraph.add_node(nd) for cnctn in connections: Q.deadlock_detector.statedigraph.add_edge(cnctn[0], cnctn[1]) self.assertEqual(Q.deadlock_detector.detect_deadlock(), False) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_deadlock.yml'), deadlock_detector='StateDigraph') nodes = ['A', 'B'] Q.deadlock_detector.statedigraph = nx.DiGraph() for nd in nodes: Q.deadlock_detector.statedigraph.add_node(nd) self.assertEqual(Q.deadlock_detector.detect_deadlock(), False) connections = [('A', 'A')] for cnctn in connections: Q.deadlock_detector.statedigraph.add_edge(cnctn[0], cnctn[1]) self.assertEqual(Q.deadlock_detector.detect_deadlock(), True)
def test_find_next_event_date_method(self): ciw.seed(1) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = ciw.ArrivalNode(Q) self.assertEqual(round(N.next_event_date, 5), 0.00105) N.find_next_event_date() self.assertEqual(round(N.next_event_date, 5), 0.00105) self.assertEqual(N.next_node, 1) self.assertEqual(N.next_class, 1) N.have_event() self.assertEqual(round(N.next_event_date, 5), 0.00518) self.assertEqual(N.next_node, 3) self.assertEqual(N.next_class, 1)
def test_init_method(self): N = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') Q = ciw.Simulation(N) self.assertEqual(len(Q.transitive_nodes), 4) self.assertEqual(len(Q.nodes), 6) self.assertEqual(str(Q.nodes[0]), 'Arrival Node') self.assertEqual(str(Q.nodes[-1]), 'Exit Node') self.assertEqual([str(n) for n in Q.transitive_nodes], ['Node 1', 'Node 2', 'Node 3', 'Node 4']) self.assertEqual(len(Q.inter_arrival_times), 4) self.assertEqual(len(Q.inter_arrival_times[1]), 3) self.assertEqual(len(Q.service_times), 4) self.assertEqual(len(Q.service_times[1]), 3)
def test_next_node_method(self): ciw.seed(6) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) node = Q.transitive_nodes[0] self.assertEqual(str(node.next_node(0)), 'Node 4') self.assertEqual(str(node.next_node(0)), 'Node 4') self.assertEqual(str(node.next_node(0)), 'Node 4') self.assertEqual(str(node.next_node(0)), 'Node 4') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 4') self.assertEqual(str(node.next_node(0)), 'Exit Node') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Exit Node') self.assertEqual(str(node.next_node(0)), 'Node 4') ciw.seed(54) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) node = Q.transitive_nodes[2] self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 4') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 4') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 4') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 3') self.assertEqual(str(node.next_node(0)), 'Node 2') self.assertEqual(str(node.next_node(0)), 'Node 2')
def test_take_servers_off_duty_preempt_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml')) N = Q.transitive_nodes[0] N.preempt = True N.add_new_servers(3) self.assertEqual([str(obs) for obs in N.servers], ['Server 1 at Node 1', 'Server 2 at Node 1', 'Server 3 at Node 1', 'Server 4 at Node 1']) ind1 = ciw.Individual(5, 1, 1) ind1.service_time = 5.5 ind1.arrival_date = 10 ind1.service_end_date = 7895.876 ind3 = ciw.Individual(7, 1, 1) ind3.service_time = 5.5 ind3.arrival_date = 8 ind3.service_end_date = 8895.876 ind2 = ciw.Individual(2, 0, 0) ind2.service_time = 7.2 ind2.arrival_date = 26 ind2.service_end_date = 0.4321 N.attach_server(N.servers[1], ind1) N.attach_server(N.servers[3], ind3) N.attach_server(N.servers[2], ind2) N.individuals = [[ind2], [ind3, ind1]] self.assertEqual([obs.busy for obs in N.servers], [False, True, True, True]) self.assertEqual([obs.offduty for obs in N.servers], [False, False, False, False]) self.assertEqual(ind1.service_time, 5.5) self.assertEqual(ind1.service_end_date, 7895.876) self.assertEqual(ind2.service_time, 7.2) self.assertEqual(ind2.service_end_date, 0.4321) N.take_servers_off_duty() self.assertEqual([str(obs) for obs in N.servers], []) self.assertEqual([obs.busy for obs in N.servers], []) self.assertEqual([obs.offduty for obs in N.servers], []) self.assertEqual(ind1.service_time, False) self.assertEqual(ind1.service_end_date, False) self.assertEqual(ind2.service_time, False) self.assertEqual(ind2.service_end_date, False) self.assertEqual(N.interrupted_individuals, [ind2, ind3, ind1]) self.assertTrue(ind1 in N.individuals[1]) self.assertTrue(ind3 in N.individuals[1]) self.assertTrue(ind2 in N.individuals[0])
def test_if_putting_individuals_in_correct_priority_queue(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_priorities.yml')) N1 = Q.transitive_nodes[0] N2 = Q.transitive_nodes[1] self.assertEqual([[str(obs) for obs in lst] for lst in N1.individuals], [[], []]) self.assertEqual([str(obs) for obs in N1.all_individuals], []) self.assertEqual([[str(obs) for obs in lst] for lst in N2.individuals], [[], []]) self.assertEqual([str(obs) for obs in N2.all_individuals], []) Q.nodes[0].next_node = 1 Q.nodes[0].next_class = 0 Q.nodes[0].have_event() self.assertEqual([[str(obs) for obs in lst] for lst in N1.individuals], [['Individual 1'], []]) self.assertEqual([str(obs) for obs in N1.all_individuals], ['Individual 1']) self.assertEqual([[str(obs) for obs in lst] for lst in N2.individuals], [[], []]) self.assertEqual([str(obs) for obs in N2.all_individuals], []) Q.nodes[0].next_node = 1 Q.nodes[0].next_class = 1 Q.nodes[0].have_event() self.assertEqual([[str(obs) for obs in lst] for lst in N1.individuals], [['Individual 1'], ['Individual 2']]) self.assertEqual([str(obs) for obs in N1.all_individuals], ['Individual 1', 'Individual 2']) self.assertEqual([[str(obs) for obs in lst] for lst in N2.individuals], [[], []]) self.assertEqual([str(obs) for obs in N2.all_individuals], []) Q.nodes[0].next_node = 2 Q.nodes[0].next_class = 0 Q.nodes[0].have_event() self.assertEqual([[str(obs) for obs in lst] for lst in N1.individuals], [['Individual 1'], ['Individual 2']]) self.assertEqual([str(obs) for obs in N1.all_individuals], ['Individual 1', 'Individual 2']) self.assertEqual([[str(obs) for obs in lst] for lst in N2.individuals], [['Individual 3'], []]) self.assertEqual([str(obs) for obs in N2.all_individuals], ['Individual 3']) Q.nodes[0].next_node = 2 Q.nodes[0].next_class = 1 Q.nodes[0].have_event() self.assertEqual([[str(obs) for obs in lst] for lst in N1.individuals], [['Individual 1'], ['Individual 2']]) self.assertEqual([str(obs) for obs in N1.all_individuals], ['Individual 1', 'Individual 2']) self.assertEqual([[str(obs) for obs in lst] for lst in N2.individuals], [['Individual 3'], ['Individual 4']]) self.assertEqual([str(obs) for obs in N2.all_individuals], ['Individual 3', 'Individual 4'])
def test_finish_service_method(self): ciw.seed(4) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = Q.transitive_nodes[0] inds = [ciw.Individual(i + 1) for i in range(3)] for current_time in [0.01, 0.02, 0.03]: N.accept(inds[int(current_time*100 - 1)], current_time) self.assertEqual([str(obs) for obs in N.all_individuals], ['Individual 1', 'Individual 2', 'Individual 3']) self.assertEqual([[str(obs) for obs in pr_cls] for pr_cls in N.individuals], [['Individual 1', 'Individual 2', 'Individual 3']]) N.update_next_event_date(0.03) self.assertEqual(round(N.next_event_date, 5), 0.03604) N.finish_service() self.assertEqual([str(obs) for obs in N.all_individuals], ['Individual 1', 'Individual 3']) self.assertEqual([[str(obs) for obs in pr_cls] for pr_cls in N.individuals], [['Individual 1', 'Individual 3']])
def test_write_individual_record_method(self): ciw.seed(7) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = Q.transitive_nodes[0] ind = ciw.Individual(6) N.accept(ind, 3) ind.service_start_date = 3.5 ind.service_end_date = 5.5 ind.exit_date = 9 N.write_individual_record(ind) self.assertEqual(ind.data_records[0].arrival_date, 3) self.assertEqual(ind.data_records[0].wait, 0.5) self.assertEqual(ind.data_records[0].service_start_date, 3.5) self.assertEqual(ind.data_records[0].service_time, 2) self.assertEqual(ind.data_records[0].service_end_date, 5.5) self.assertEqual(ind.data_records[0].blocked, 3.5) self.assertEqual(ind.data_records[0].exit_date, 9) self.assertEqual(ind.data_records[0].customer_class, 0)
def test_initialise_event_dates_dict_method(self): ciw.seed(6) Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml')) N = ciw.ArrivalNode(Q) dates_dict_1 = {1: {0: 0.4362282541, 1: 0.2672232406, 2: 0.3864256273}, 2: {0: 0.1636952311, 1: 0.0714709565, 2: 0.8065738414}, 3: {0: 0.4088480190, 1: 0.0514323248, 2: 0.8132038176}, 4: {0: 1.1573751438, 1: 0.4649276714, 2: 0.8176876727}} dates_dict_2 = {1: {0: 0.0325870775, 1: 0.8054262558, 2: 0.8168179515}, 2: {0: 0.0841671381, 1: 0.0328245299, 2: 0.2196023847}, 3: {0: 0.2519089068, 1: 0.0573597814, 2: 1.5117882121}, 4: {0: 0.8881158889, 1: 0.0560592622, 2: 2.1307650868}} self.assertEqual({nd: {obs: round(N.event_dates_dict[nd][obs], 10) for obs in N.event_dates_dict[nd]} for nd in N.event_dates_dict}, dates_dict_1) N.initialise_event_dates_dict() self.assertEqual({nd: {obs: round(N.event_dates_dict[nd][obs], 10) for obs in N.event_dates_dict[nd]} for nd in N.event_dates_dict}, dates_dict_2)
def test_simulate_until_max_customers_with_pbar_method(self): N = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') ciw.seed(1) Q1 = ciw.Simulation(N) Q1.simulate_until_max_customers(10, progress_bar=True, method='Finish') self.assertEqual(Q1.progress_bar.total, 10) self.assertEqual(Q1.progress_bar.n, 10) ciw.seed(1) Q2 = ciw.Simulation(N) Q2.simulate_until_max_customers(10, progress_bar=True, method='Arrive') self.assertEqual(Q2.progress_bar.total, 10) self.assertEqual(Q2.progress_bar.n, 10) ciw.seed(1) Q3 = ciw.Simulation(N) Q3.simulate_until_max_customers(10, progress_bar=True, method='Accept') self.assertEqual(Q3.progress_bar.total, 10) self.assertEqual(Q3.progress_bar.n, 10)