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) Q.current_time = 3 N.accept(ind) 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].waiting_time, 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].time_blocked, 3.5) self.assertEqual(ind.data_records[0].exit_date, 9) self.assertEqual(ind.data_records[0].customer_class, 0)
def test_block_individual_method(self): seed(4) Q = ciw.Simulation( ciw.load_parameters( 'ciw/tests/datafortesting/logs_test_for_deadlock_sim/parameters.yml' )) inds = [ciw.Individual(i + 1) for i in range(7)] N1 = Q.transitive_nodes[0] N1.individuals = inds[:6] N2 = Q.transitive_nodes[1] N2.accept(inds[6], 2) self.assertEqual(inds[6].is_blocked, False) self.assertEqual(N1.blocked_queue, []) self.assertEqual(Q.digraph.edges(), []) N2.block_individual(inds[6], N1) self.assertEqual(inds[6].is_blocked, True) [(2, 7)] self.assertEqual(Q.digraph.edges(), [('Server 1 at Node 2', 'Server 2 at Node 1'), ('Server 1 at Node 2', 'Server 1 at Node 1')])
def test_finish_service_method(self): ciw.seed(4) Q = ciw.Simulation( ciw.create_network('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_matrix_release_method_within_simulation(self): params = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') Q = ciw.Simulation(params, tracker='Matrix') 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]]) N.release(0, Q.nodes[1], 43.11) self.assertEqual(Q.statetracker.state, [[[[], [2], [], []], [[], [], [], []], [[1], [], [], []], [[], [], [], []]], [6, 3, 5, 0]]) N.all_individuals[1].is_blocked = True N.release(1, Q.nodes[1], 46.72) self.assertEqual(Q.statetracker.state, [[[[], [1], [], []], [[], [], [], []], [[], [], [], []], [[], [], [], []]], [7, 3, 4, 0]]) N.release(1, Q.nodes[-1], 48.39) self.assertEqual(Q.statetracker.state, [[[[], [1], [], []], [[], [], [], []], [[], [], [], []], [[], [], [], []]], [7, 3, 3, 0]])
def test_kill_server_method(self): Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_schedule.yml')) N = Q.transitive_nodes[0] s = N.servers[0] self.assertEqual([str(obs) for obs in N.servers], ['Server 1 at Node 1']) N.kill_server(s) self.assertEqual(N.servers, []) N.next_event_date = 30 N.have_event() self.assertEqual([str(obs) for obs in N.servers], ['Server 2 at Node 1', 'Server 3 at Node 1']) ind = ciw.Individual(666) N.attach_server(N.servers[0], ind) N.servers[0].offduty = True self.assertEqual([obs.busy for obs in N.servers], [True, False]) self.assertEqual([obs.offduty for obs in N.servers], [True, False]) N.detatch_server(N.servers[0], ind) self.assertEqual([str(obs) for obs in N.servers], ['Server 3 at Node 1'])
def test_release_method(self): set_seed(4) Q = ciw.Simulation( ciw.load_parameters( 'ciw/tests/datafortesting/logs_test_for_simulation/parameters.yml' )) N = Q.transitive_nodes[0] inds = [ciw.Individual(i + 1) for i in xrange(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.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.individuals[1].exit_date = 0.04 N.update_next_event_date(N.next_event_date + 0.00001) self.assertEqual(round(N.next_event_date, 5), 0.03708) N.release(1, Q.transitive_nodes[1], N.next_event_date) self.assertEqual([str(obs) for obs in N.individuals], ['Individual 1', 'Individual 3']) N.update_next_event_date(N.next_event_date + 0.00001) self.assertEqual(round(N.next_event_date, 5), 0.06447)
def test_write_individual_record_method(self): set_seed(7) Q = ciw.Simulation( ciw.load_parameters( 'ciw/tests/datafortesting/logs_test_for_simulation/parameters.yml' )) N = Q.transitive_nodes[0] ind = ciw.Individual(6) N.accept(ind, 3) ind.service_start_date = 3.5 ind.exit_date = 9 N.write_individual_record(ind) self.assertEqual(ind.data_records[1][0].arrival_date, 3) self.assertEqual(ind.data_records[1][0].wait, 0.5) self.assertEqual(ind.data_records[1][0].service_start_date, 3.5) self.assertEqual(round(ind.data_records[1][0].service_time, 5), 0.07894) self.assertEqual(round(ind.data_records[1][0].service_end_date, 5), 3.57894) self.assertEqual(round(ind.data_records[1][0].blocked, 5), 5.42106) self.assertEqual(ind.data_records[1][0].exit_date, 9) self.assertEqual(ind.data_records[1][0].customer_class, 0)
def test_change_customer_class_method(self): set_seed(14) Q = ciw.Simulation( ciw.load_parameters( 'ciw/tests/datafortesting/logs_test_for_dynamic_classes/parameters.yml' )) N1 = Q.transitive_nodes[0] ind = ciw.Individual(254, 0) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.previous_class, 1)
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='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] N2.accept(inds[6], 2) self.assertEqual(inds[6].is_blocked, False) self.assertEqual(N1.blocked_queue, []) self.assertEqual(Q.deadlock_detector.statedigraph.edges(), []) 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_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] ind = ciw.Individual(22) self.assertEqual(str(node.next_node(ind)), 'Node 4') self.assertEqual(str(node.next_node(ind)), 'Node 4') self.assertEqual(str(node.next_node(ind)), 'Node 4') self.assertEqual(str(node.next_node(ind)), 'Node 4') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 4') self.assertEqual(str(node.next_node(ind)), 'Exit Node') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Exit Node') self.assertEqual(str(node.next_node(ind)), '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(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 4') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 4') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 4') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 3') self.assertEqual(str(node.next_node(ind)), 'Node 2') self.assertEqual(str(node.next_node(ind)), 'Node 2')
def test_matrix_block_method_within_simulation(self): params = ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params.yml') Q = ciw.Simulation(params, tracker='Matrix') N = Q.transitive_nodes[2] Q.statetracker.state = [[[[], [2], [], []], [[], [], [], []], [[1], [], [], []], [[], [], [], []]], [5, 3, 6, 0]] Q.statetracker.increment = 3 self.assertEqual(Q.statetracker.state, [[[[], [2], [], []], [[], [], [], []], [[1], [], [], []], [[], [], [], []]], [5, 3, 6, 0]]) N.block_individual(ciw.Individual(1), Q.nodes[1]) self.assertEqual(Q.statetracker.state, [[[[], [2], [], []], [[], [], [], []], [[1, 3], [], [], []], [[], [], [], []]], [5, 3, 6, 0]])
def test_begin_service_if_possible_accept_method(self): set_seed(50) Q = ciw.Simulation( ciw.load_parameters( 'ciw/tests/datafortesting/logs_test_for_deadlock_sim/parameters.yml' )) ind = ciw.Individual(1) self.assertEqual(Q.digraph.nodes(), [ '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): seed(50) Q = ciw.Simulation( ciw.load_parameters( 'ciw/tests/datafortesting/logs_test_for_deadlock_sim/parameters.yml' )) inds = [ciw.Individual(i) for i in range(30)] Q.transitive_nodes[0].individuals = inds ind = Q.transitive_nodes[0].individuals[Q.transitive_nodes[0].c - 1] ind.service_time = 3.14 ind.arrival_date = 100.0 self.assertEqual( Q.digraph.nodes(), ['Server 2 at Node 1', 'Server 1 at Node 2', 'Server 1 at Node 1']) 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_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]: Q.current_time = current_time N.accept(inds[int(current_time * 100 - 1)]) 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']]) Q.current_time = 0.03 N.update_next_event_date() 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]) 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() 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]) 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() self.assertEqual(round(N.next_event_date, 5), 0.06447)
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_naive_release_method_within_simulation(self): params = ciw.load_parameters( 'ciw/tests/datafortesting/logs_test_for_simulation/parameters.yml') params['Tracker'] = 'Naive' Q = ciw.Simulation(params) N = Q.transitive_nodes[2] inds = [ciw.Individual(i) for i in xrange(5)] N.individuals = inds for ind in N.individuals: srvr = N.find_free_server() N.attach_server(srvr, ind) Q.statetracker.state = [[4, 1], [3, 0], [5, 1], [0, 0]] self.assertEqual(Q.statetracker.state, [[4, 1], [3, 0], [5, 1], [0, 0]]) N.release(0, Q.nodes[1], 43.11) self.assertEqual(Q.statetracker.state, [[5, 1], [3, 0], [4, 1], [0, 0]]) N.individuals[1].is_blocked = True N.release(1, Q.nodes[1], 46.72) self.assertEqual(Q.statetracker.state, [[6, 1], [3, 0], [4, 0], [0, 0]]) N.release(1, Q.nodes[-1], 46.72) self.assertEqual(Q.statetracker.state, [[6, 1], [3, 0], [3, 0], [0, 0]])
def test_kill_server_method(self): Q = ciw.Simulation( ciw.load_parameters( 'ciw/tests/datafortesting/logs_test_for_server_schedule/parameters.yml' )) N = Q.transitive_nodes[0] s = N.servers[0] self.assertEqual([str(obs) for obs in N.servers], ['Server 1 at Node 1']) N.kill_server(s) N.highest_id += 1 self.assertEqual(N.servers, []) N.next_event_date = 30 N.have_event() self.assertEqual([str(obs) for obs in N.servers], ['Server 2 at Node 1', 'Server 3 at Node 1']) ind = ciw.Individual(666) N.attach_server(N.servers[0], ind) N.servers[0].offduty = True self.assertEqual([obs.busy for obs in N.servers], [True, False]) self.assertEqual([obs.offduty for obs in N.servers], [True, False]) N.detatch_server(N.servers[0], ind) self.assertEqual([str(obs) for obs in N.servers], ['Server 3 at Node 1'])
def test_timedependent_function_dist(self): params = { 'arrival_distributions': [TimeDependentDist1(), TimeDependentDist2()], 'service_distributions': [TimeDependentDist1(), TimeDependentDist2()], 'number_of_servers': [1, 1], 'routing': [[0.1, 0.1], [0.1, 0.1]] } Q = ciw.Simulation(ciw.create_network(**params)) N1 = Q.transitive_nodes[0] N2 = Q.transitive_nodes[1] ind = ciw.Individual(0) ciw.seed(5) samples = [] for t in [3.0, 9.0, 9.0, 11.0, 11.0]: samples.append( round(N1.simulation.service_times[N1.id_number][0]._sample(t), 2)) expected = [3.0, 3.0, 3.0, 5.0, 5.0] self.assertEqual(samples, expected) samples = [] for t in [4.0, 4.0, 17.0, 22.0, 22.0]: samples.append( round(N2.simulation.service_times[N2.id_number][0]._sample(t), 2)) expected = [2.0, 2.0, 8.5, 8.0, 8.0] self.assertEqual(samples, expected) samples = [] for t in [3.0, 9.0, 9.0, 11.0, 11.0]: Q.current_time = t samples.append(round(N1.get_service_time(ind), 2)) expected = [3.0, 3.0, 3.0, 5.0, 5.0] self.assertEqual(samples, expected) samples = [] for t in [4.0, 4.0, 17.0, 22.0, 22.0]: Q.current_time = t samples.append(round(N2.get_service_time(ind), 2)) expected = [2.0, 2.0, 8.5, 8.0, 8.0] self.assertEqual(samples, expected) samples = [] for t in [3.0, 9.0, 9.0, 11.0, 11.0]: samples.append( round( N1.simulation.inter_arrival_times[N1.id_number][0]._sample( t), 2)) expected = [3.0, 3.0, 3.0, 5.0, 5.0] self.assertEqual(samples, expected) samples = [] for t in [4.0, 4.0, 17.0, 22.0, 22.0]: samples.append( round( N2.simulation.inter_arrival_times[N2.id_number][0]._sample( t), 2)) expected = [2.0, 2.0, 8.5, 8.0, 8.0] self.assertEqual(samples, expected)
def test_no_routing(self): ind = ciw.Individual(22) self.assertEqual(ciw.no_routing(ind), [])
def test_change_customer_class_method(self): ciw.seed(14) Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_change_class.yml')) N1 = Q.transitive_nodes[0] ind = ciw.Individual(254, 0) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.previous_class, 0) # Test for case of having priorities ciw.seed(14) parameters_dictionary = ciw.load_parameters( 'ciw/tests/testing_parameters/params_priorities.yml') class_change_matrix = { 'Node 1': [[.5, .5], [.25, .75]], 'Node 2': [[1, 0], [0, 1]] } parameters_dictionary['Class_change_matrices'] = class_change_matrix Q = ciw.Simulation(ciw.create_network(**parameters_dictionary)) N1 = Q.transitive_nodes[0] ind = ciw.Individual(254, 0) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.priority_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.priority_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.priority_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.priority_class, 0) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.priority_class, 0) self.assertEqual(ind.previous_class, 0)
def test_repr_methodh(self, id_num, customer_class): i = ciw.Individual(id_num, customer_class) self.assertEqual(str(i), 'Individual ' + str(id_num))
def test_repr_method(self): i = ciw.Individual(3, 6) self.assertEqual(str(i), 'Individual 3')
def test_limited_processor_sharing(self): N = ciw.create_network( arrival_distributions=[ciw.dists.NoArrivals()], service_distributions=[ciw.dists.Deterministic(1.0)], number_of_servers=[float('inf')] ) Q = ciw.Simulation(N, node_class=ciw.PSNode) ind1 = ciw.Individual(1, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind1) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 1.0) ind2 = ciw.Individual(2, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind2) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 2.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 2.0) ind3 = ciw.Individual(3, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind3) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 3.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 3.0) self.assertEqual(ind3.with_server, True) self.assertEqual(ind3.service_end_date, 3.0) ind4 = ciw.Individual(4, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind4) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 4.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 4.0) self.assertEqual(ind3.with_server, True) self.assertEqual(ind3.service_end_date, 4.0) self.assertEqual(ind4.with_server, True) self.assertEqual(ind4.service_end_date, 4.0) N = ciw.create_network( arrival_distributions=[ciw.dists.NoArrivals()], service_distributions=[ciw.dists.Deterministic(1.0)], number_of_servers=[4] ) Q = ciw.Simulation(N, node_class=ciw.PSNode) ind1 = ciw.Individual(1, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind1) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 1.0) ind2 = ciw.Individual(2, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind2) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 2.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 2.0) ind3 = ciw.Individual(3, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind3) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 3.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 3.0) self.assertEqual(ind3.with_server, True) self.assertEqual(ind3.service_end_date, 3.0) ind4 = ciw.Individual(4, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind4) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 4.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 4.0) self.assertEqual(ind3.with_server, True) self.assertEqual(ind3.service_end_date, 4.0) self.assertEqual(ind4.with_server, True) self.assertEqual(ind4.service_end_date, 4.0) N = ciw.create_network( arrival_distributions=[ciw.dists.NoArrivals()], service_distributions=[ciw.dists.Deterministic(1.0)], number_of_servers=[3] ) Q = ciw.Simulation(N, node_class=ciw.PSNode) ind1 = ciw.Individual(1, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind1) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 1.0) ind2 = ciw.Individual(2, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind2) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 2.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 2.0) ind3 = ciw.Individual(3, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind3) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 3.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 3.0) self.assertEqual(ind3.with_server, True) self.assertEqual(ind3.service_end_date, 3.0) ind4 = ciw.Individual(4, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind4) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 3.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 3.0) self.assertEqual(ind3.with_server, True) self.assertEqual(ind3.service_end_date, 3.0) self.assertEqual(ind4.with_server, False) N = ciw.create_network( arrival_distributions=[ciw.dists.NoArrivals()], service_distributions=[ciw.dists.Deterministic(1.0)], number_of_servers=[2] ) Q = ciw.Simulation(N, node_class=ciw.PSNode) ind1 = ciw.Individual(1, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind1) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 1.0) ind2 = ciw.Individual(2, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind2) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 2.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 2.0) ind3 = ciw.Individual(3, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind3) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 2.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 2.0) self.assertEqual(ind3.with_server, False) ind4 = ciw.Individual(4, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind4) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 2.0) self.assertEqual(ind2.with_server, True) self.assertEqual(ind2.service_end_date, 2.0) self.assertEqual(ind3.with_server, False) self.assertEqual(ind4.with_server, False) N = ciw.create_network( arrival_distributions=[ciw.dists.NoArrivals()], service_distributions=[ciw.dists.Deterministic(1.0)], number_of_servers=[1] ) Q = ciw.Simulation(N, node_class=ciw.PSNode) ind1 = ciw.Individual(1, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind1) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 1.0) ind2 = ciw.Individual(2, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind2) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 1.0) self.assertEqual(ind2.with_server, False) ind3 = ciw.Individual(3, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind3) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 1.0) self.assertEqual(ind2.with_server, False) self.assertEqual(ind3.with_server, False) ind4 = ciw.Individual(4, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind4) self.assertEqual(ind1.with_server, True) self.assertEqual(ind1.service_end_date, 1.0) self.assertEqual(ind2.with_server, False) self.assertEqual(ind3.with_server, False) self.assertEqual(ind4.with_server, False)
def test_change_customer_class_method(self): ciw.seed(14) Q = ciw.Simulation( ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_change_class.yml')) N1 = Q.transitive_nodes[0] ind = ciw.Individual(254, 0) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.previous_class, 0) # Test for case of having priorities ciw.seed(14) parameters_dictionary = { 'arrival_distributions': { 'Class 0': [ciw.dists.Exponential(0.05), ciw.dists.Exponential(0.04)], 'Class 1': [ciw.dists.Exponential(0.04), ciw.dists.Exponential(0.06)] }, 'service_distributions': { 'Class 0': [ciw.dists.Deterministic(5), ciw.dists.Deterministic(5)], 'Class 1': [ciw.dists.Deterministic(10), ciw.dists.Deterministic(10)] }, 'routing': { 'Class 0': [[0.8, 0.1], [0.0, 0.0]], 'Class 1': [[0.8, 0.1], [0.2, 0.0]] }, 'number_of_servers': [4, 3], 'class_change_matrices': { 'Node 1': [[.5, .5], [.25, .75]], 'Node 2': [[1, 0], [0, 1]] }, 'priority_classes': { 'Class 0': 0, 'Class 1': 1 } } Q = ciw.Simulation( ciw.create_network_from_dictionary(parameters_dictionary)) N1 = Q.transitive_nodes[0] ind = ciw.Individual(254, 0) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.priority_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.priority_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.priority_class, 0) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 0) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 1) self.assertEqual(ind.priority_class, 1) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.priority_class, 0) self.assertEqual(ind.previous_class, 1) N1.change_customer_class(ind) self.assertEqual(ind.customer_class, 0) self.assertEqual(ind.priority_class, 0) self.assertEqual(ind.previous_class, 0)
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) Q.current_time = 0.01 N.accept(ind1) 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) Q.current_time = 0.02 N.accept(ind2) Q.current_time = 0.03 N.accept(ind3) Q.current_time = 0.04 N.accept(ind4) 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) Q.current_time = 0.05 N.accept(ind5) Q.current_time = 0.06 N.accept(ind6) Q.current_time = 0.07 N.accept(ind7) Q.current_time = 0.08 N.accept(ind8) Q.current_time = 0.09 N.accept(ind9) Q.current_time = 0.1 N.accept(ind10) 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(ind10.service_time, False)
def test_ps_start_waitingcustomers_service_at_release(self): N = ciw.create_network( arrival_distributions=[ciw.dists.NoArrivals()], service_distributions=[ciw.dists.Sequential([1.0, 2.0, 3.0, 4.0])], number_of_servers=[3] ) Q = ciw.Simulation(N, node_class=ciw.PSNode) self.assertEqual(Q.current_time, 0.0) Q.current_time = 0.5 self.assertEqual(Q.current_time, 0.5) ind1 = ciw.Individual(1, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind1) ind2 = ciw.Individual(2, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind2) ind3 = ciw.Individual(3, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind3) self.assertEqual(round(ind1.arrival_date, 10), 0.5) self.assertEqual(round(ind1.service_time, 10), 1.0) self.assertEqual(round(ind1.time_left, 10), 1.0) self.assertEqual(ind1.with_server, True) self.assertEqual(round(ind1.date_last_update, 10), 0.5) self.assertEqual(round(ind1.service_start_date, 10), 0.5) self.assertEqual(round(ind1.service_end_date, 10), 3.5) self.assertEqual(round(ind2.arrival_date, 10), 0.5) self.assertEqual(round(ind2.service_time, 10), 2.0) self.assertEqual(round(ind2.time_left, 10), 2.0) self.assertEqual(ind2.with_server, True) self.assertEqual(round(ind2.date_last_update, 10), 0.5) self.assertEqual(round(ind2.service_start_date, 10), 0.5) self.assertEqual(round(ind2.service_end_date, 10), 6.5) self.assertEqual(round(ind3.arrival_date, 10), 0.5) self.assertEqual(round(ind3.service_time, 10), 3.0) self.assertEqual(round(ind3.time_left, 10), 3.0) self.assertEqual(ind3.with_server, True) self.assertEqual(round(ind3.date_last_update, 10), 0.5) self.assertEqual(round(ind3.service_start_date, 10), 0.5) self.assertEqual(round(ind3.service_end_date, 10), 9.5) Q.current_time = 1.5 ind4 = ciw.Individual(4, customer_class=0, priority_class=0, simulation=Q) Q.nodes[1].accept(ind4) self.assertEqual(round(ind1.arrival_date, 10), 0.5) self.assertEqual(round(ind1.service_time, 10), 1.0) self.assertEqual(round(ind1.time_left, 10), 1.0) self.assertEqual(ind1.with_server, True) self.assertEqual(round(ind1.date_last_update, 10), 0.5) self.assertEqual(round(ind1.service_start_date, 10), 0.5) self.assertEqual(round(ind1.service_end_date, 10), 3.5) self.assertEqual(round(ind2.arrival_date, 10), 0.5) self.assertEqual(round(ind2.service_time, 10), 2.0) self.assertEqual(round(ind2.time_left, 10), 2.0) self.assertEqual(ind2.with_server, True) self.assertEqual(round(ind2.date_last_update, 10), 0.5) self.assertEqual(round(ind2.service_start_date, 10), 0.5) self.assertEqual(round(ind2.service_end_date, 10), 6.5) self.assertEqual(round(ind3.arrival_date, 10), 0.5) self.assertEqual(round(ind3.service_time, 10), 3.0) self.assertEqual(round(ind3.time_left, 10), 3.0) self.assertEqual(ind3.with_server, True) self.assertEqual(round(ind3.date_last_update, 10), 0.5) self.assertEqual(round(ind3.service_start_date, 10), 0.5) self.assertEqual(round(ind3.service_end_date, 10), 9.5) self.assertEqual(ind4.with_server, False) Q.current_time = 3.5 Q.nodes[1].release(0, Q.nodes[-1]) self.assertEqual(round(ind2.arrival_date, 10), 0.5) self.assertEqual(round(ind2.service_time, 10), 2.0) self.assertEqual(round(ind2.time_left, 10), 1.0) self.assertEqual(ind2.with_server, True) self.assertEqual(round(ind2.date_last_update, 10), 3.5) self.assertEqual(round(ind2.service_start_date, 10), 0.5) self.assertEqual(round(ind2.service_end_date, 10), 6.5) self.assertEqual(round(ind3.arrival_date, 10), 0.5) self.assertEqual(round(ind3.service_time, 10), 3.0) self.assertEqual(round(ind3.time_left, 10), 2.0) self.assertEqual(ind3.with_server, True) self.assertEqual(round(ind3.date_last_update, 10), 3.5) self.assertEqual(round(ind3.service_start_date, 10), 0.5) self.assertEqual(round(ind3.service_end_date, 10), 9.5) self.assertEqual(round(ind4.arrival_date, 10), 1.5) self.assertEqual(round(ind4.service_time, 10), 4.0) self.assertEqual(round(ind4.time_left, 10), 4.0) self.assertEqual(ind4.with_server, True) self.assertEqual(round(ind4.date_last_update, 10), 3.5) self.assertEqual(round(ind4.service_start_date, 10), 3.5) self.assertEqual(round(ind4.service_end_date, 10), 15.5) Q.current_time = 6.5 Q.nodes[1].release(0, Q.nodes[-1]) self.assertEqual(round(ind3.arrival_date, 10), 0.5) self.assertEqual(round(ind3.service_time, 10), 3.0) self.assertEqual(round(ind3.time_left, 10), 1.0) self.assertEqual(ind3.with_server, True) self.assertEqual(round(ind3.date_last_update, 10), 6.5) self.assertEqual(round(ind3.service_start_date, 10), 0.5) self.assertEqual(round(ind3.service_end_date, 10), 8.5) self.assertEqual(round(ind4.arrival_date, 10), 1.5) self.assertEqual(round(ind4.service_time, 10), 4.0) self.assertEqual(round(ind4.time_left, 10), 3.0) self.assertEqual(ind4.with_server, True) self.assertEqual(round(ind4.date_last_update, 10), 6.5) self.assertEqual(round(ind4.service_start_date, 10), 3.5) self.assertEqual(round(ind4.service_end_date, 10), 12.5)
def test_release_blocked_individual_method(self): Q = ciw.Simulation(ciw.create_network_from_yml( 'ciw/tests/testing_parameters/params_deadlock.yml'), deadlock_detector='StateDigraph') N1 = Q.transitive_nodes[0] N2 = Q.transitive_nodes[1] N1.individuals = [[ciw.Individual(i) for i in range(N1.c + 3)]] N2.individuals = [[ciw.Individual(i + 100) for i in range(N2.c + 4)]] for ind in N1.all_individuals[:2]: N1.attach_server(N1.find_free_server(), ind) for ind in N2.all_individuals[:1]: N2.attach_server(N2.find_free_server(), ind) self.assertEqual([str(obs) for obs in N1.all_individuals], ['Individual 0', 'Individual 1', 'Individual 2', 'Individual 3', 'Individual 4', 'Individual 5', 'Individual 6', 'Individual 7']) self.assertEqual([str(obs) for obs in N2.all_individuals], ['Individual 100', 'Individual 101', 'Individual 102', 'Individual 103', 'Individual 104', 'Individual 105', 'Individual 106', 'Individual 107', 'Individual 108']) N1.release_blocked_individual(100) self.assertEqual([str(obs) for obs in N1.all_individuals], ['Individual 0', 'Individual 1', 'Individual 2', 'Individual 3', 'Individual 4', 'Individual 5', 'Individual 6', 'Individual 7']) self.assertEqual([str(obs) for obs in N2.all_individuals], ['Individual 100', 'Individual 101', 'Individual 102', 'Individual 103', 'Individual 104', 'Individual 105', 'Individual 106', 'Individual 107', 'Individual 108']) N1.blocked_queue = [(1, 1), (2, 100)] rel_ind = N1.individuals[0].pop(0) N1.detatch_server(rel_ind.server, rel_ind) N1.release_blocked_individual(110) self.assertEqual([str(obs) for obs in N1.all_individuals], ['Individual 2', 'Individual 3', 'Individual 4', 'Individual 5', 'Individual 6', 'Individual 7', 'Individual 1', 'Individual 100']) self.assertEqual([str(obs) for obs in N2.all_individuals], ['Individual 101', 'Individual 102', 'Individual 103', 'Individual 104', 'Individual 105', 'Individual 106', 'Individual 107', 'Individual 108'])