Example #1
0
    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!')
Example #2
0
    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!')
Example #3
0
    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)
Example #4
0
    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)
Example #6
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')
Example #7
0
 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)])
Example #8
0
 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]])
Example #9
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)
Example #10
0
 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]])
Example #11
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]])
Example #12
0
    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)
Example #13
0
 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'
     ])
Example #14
0
    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)
Example #15
0
 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)
Example #16
0
 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]])
Example #17
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)
Example #18
0
    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)
Example #19
0
 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)
Example #20
0
 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)
Example #21
0
    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)
Example #22
0
    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)
Example #23
0
 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)
Example #24
0
 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')
Example #25
0
    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)
Example #26
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='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)
Example #27
0
 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)
Example #28
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]])
Example #29
0
    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')
Example #30
0
 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')]))
Example #31
0
 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')
Example #32
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)

        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)
Example #33
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)

        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)
Example #34
0
 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)
Example #35
0
 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)))
Example #36
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]])
Example #37
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]])
Example #38
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))
Example #39
0
 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)
Example #40
0
    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)])
Example #41
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)
Example #42
0
 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)
Example #43
0
    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)
Example #44
0
    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])
Example #45
0
 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'])
Example #46
0
    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, [])
Example #47
0
 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)
Example #48
0
    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)
Example #49
0
    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)
Example #50
0
    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)
Example #51
0
    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')
Example #52
0
    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])
Example #53
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'])
Example #54
0
 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']])
Example #55
0
 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)
Example #56
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)
Example #57
0
    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)