Skip to content

Commit 2a87126

Browse files
committed
Increment number_of_individuals, remove len(all_individuals)
1 parent da6364f commit 2a87126

5 files changed

Lines changed: 100 additions & 35 deletions

File tree

ciw/exit_node.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ def __init__(self):
99
Initialise a node.
1010
"""
1111
self.all_individuals = []
12+
self.number_of_individuals = 0
1213
self.id_number = -1
1314
self.next_event_date = float("Inf")
1415
self.node_capacity = float("Inf")
15-
self.number_completed = 0
1616

1717
def __repr__(self):
1818
"""
@@ -25,7 +25,7 @@ def accept(self, next_individual, current_time):
2525
Adds customer to the list of completed customers
2626
"""
2727
self.all_individuals.append(next_individual)
28-
self.number_completed += 1
28+
self.number_of_individuals += 1
2929

3030
def update_next_event_date(self):
3131
"""

ciw/node.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def __init__(self, id_, simulation):
4242
self.class_change = node.class_change_matrix
4343
self.individuals = [[] for _ in
4444
range(simulation.number_of_priority_classes)]
45+
self.number_of_individuals = 0
4546
self.id_number = id_
4647
self.baulking_functions = [self.simulation.network.customer_classes[
4748
clss].baulking_functions[id_-1] for clss in range(
@@ -66,9 +67,9 @@ def all_individuals(self):
6667
return [i for priority_class in self.individuals
6768
for i in priority_class]
6869

69-
@property
70-
def number_of_individuals(self):
71-
return len(self.all_individuals)
70+
# @property
71+
# def number_of_individuals(self):
72+
# return len(self.all_individuals)
7273

7374

7475
def __repr__(self):
@@ -87,6 +88,7 @@ def accept(self, next_individual, current_time):
8788
next_individual, current_time)
8889
next_individual.queue_size_at_arrival = self.number_of_individuals
8990
self.individuals[next_individual.priority_class].append(next_individual)
91+
self.number_of_individuals += 1
9092
self.simulation.statetracker.change_state_accept(
9193
self.id_number, next_individual.customer_class)
9294

@@ -299,7 +301,7 @@ def finish_service(self):
299301
self.change_customer_class(next_individual)
300302
next_node = self.next_node(next_individual.customer_class)
301303
next_individual.destination = next_node.id_number
302-
if len(next_node.all_individuals) < next_node.node_capacity:
304+
if next_node.number_of_individuals < next_node.node_capacity:
303305
self.release(next_individual_index, next_node,
304306
self.next_event_date)
305307
else:
@@ -352,6 +354,7 @@ def release(self, next_individual_index, next_node, current_time):
352354
"""
353355
next_individual = self.all_individuals[next_individual_index]
354356
self.individuals[next_individual.prev_priority_class].remove(next_individual)
357+
self.number_of_individuals -= 1
355358
next_individual.queue_size_at_departure = len(self.all_individuals)
356359
next_individual.exit_date = current_time
357360
if self.c < float('Inf'):

ciw/simulation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ def simulate_until_max_customers(self, max_customers,
322322
self.progress_bar = tqdm.tqdm(total=max_customers)
323323

324324
if method == 'Finish':
325-
check = lambda : self.nodes[-1].number_completed
325+
check = lambda : self.nodes[-1].number_of_individuals
326326
elif method == 'Arrive':
327327
check = lambda : self.nodes[0].number_of_individuals
328328
elif method == 'Accept':

ciw/tests/test_node.py

Lines changed: 88 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,16 @@ def test_finish_service_method(self):
6161
N.accept(inds[int(current_time*100 - 1)], current_time)
6262
self.assertEqual([str(obs) for obs in N.all_individuals],
6363
['Individual 1', 'Individual 2', 'Individual 3'])
64-
self.assertEqual([[str(obs) for obs in pr_cls] for pr_cls in N.individuals],
64+
self.assertEqual(
65+
[[str(obs) for obs in pr_cls] for pr_cls in N.individuals],
6566
[['Individual 1', 'Individual 2', 'Individual 3']])
6667
N.update_next_event_date(0.03)
6768
self.assertEqual(round(N.next_event_date, 5), 0.03604)
6869
N.finish_service()
6970
self.assertEqual([str(obs) for obs in N.all_individuals],
7071
['Individual 1', 'Individual 3'])
71-
self.assertEqual([[str(obs) for obs in pr_cls] for pr_cls in N.individuals],
72+
self.assertEqual(
73+
[[str(obs) for obs in pr_cls] for pr_cls in N.individuals],
7274
[['Individual 1', 'Individual 3']])
7375

7476
def test_change_customer_class_method(self):
@@ -187,7 +189,8 @@ def test_release_method(self):
187189
N.accept(inds[int(current_time*100 - 1)], current_time)
188190
self.assertEqual([str(obs) for obs in N.all_individuals],
189191
['Individual 1', 'Individual 2', 'Individual 3'])
190-
self.assertEqual([[str(obs) for obs in pr_cls] for pr_cls in N.individuals],
192+
self.assertEqual(
193+
[[str(obs) for obs in pr_cls] for pr_cls in N.individuals],
191194
[['Individual 1', 'Individual 2', 'Individual 3']])
192195
N.update_next_event_date(0.03)
193196
self.assertEqual(round(N.next_event_date, 5), 0.03604)
@@ -197,7 +200,8 @@ def test_release_method(self):
197200
N.release(1, Q.transitive_nodes[1], N.next_event_date)
198201
self.assertEqual([str(obs) for obs in N.all_individuals],
199202
['Individual 1', 'Individual 3'])
200-
self.assertEqual([[str(obs) for obs in pr_cls] for pr_cls in N.individuals],
203+
self.assertEqual(
204+
[[str(obs) for obs in pr_cls] for pr_cls in N.individuals],
201205
[['Individual 1', 'Individual 3']])
202206
N.update_next_event_date(N.next_event_date + 0.00001)
203207
self.assertEqual(round(N.next_event_date, 5), 0.06447)
@@ -539,46 +543,78 @@ def test_if_putting_individuals_in_correct_priority_queue(self):
539543
N1 = Q.transitive_nodes[0]
540544
N2 = Q.transitive_nodes[1]
541545

542-
self.assertEqual([[str(obs) for obs in lst] for lst in N1.individuals], [[], []])
543-
self.assertEqual([str(obs) for obs in N1.all_individuals], [])
544-
self.assertEqual([[str(obs) for obs in lst] for lst in N2.individuals], [[], []])
545-
self.assertEqual([str(obs) for obs in N2.all_individuals], [])
546+
self.assertEqual(
547+
[[str(obs) for obs in lst] for lst in N1.individuals], [[], []])
548+
self.assertEqual(
549+
[str(obs) for obs in N1.all_individuals], [])
550+
self.assertEqual(
551+
[[str(obs) for obs in lst] for lst in N2.individuals], [[], []])
552+
self.assertEqual(
553+
[str(obs) for obs in N2.all_individuals], [])
546554

547555
Q.nodes[0].next_node = 1
548556
Q.nodes[0].next_class = 0
549557
Q.nodes[0].have_event()
550558

551-
self.assertEqual([[str(obs) for obs in lst] for lst in N1.individuals], [['Individual 1'], []])
552-
self.assertEqual([str(obs) for obs in N1.all_individuals], ['Individual 1'])
553-
self.assertEqual([[str(obs) for obs in lst] for lst in N2.individuals], [[], []])
554-
self.assertEqual([str(obs) for obs in N2.all_individuals], [])
559+
self.assertEqual(
560+
[[str(obs) for obs in lst] for lst in N1.individuals],
561+
[['Individual 1'], []])
562+
self.assertEqual(
563+
[str(obs) for obs in N1.all_individuals],
564+
['Individual 1'])
565+
self.assertEqual(
566+
[[str(obs) for obs in lst] for lst in N2.individuals], [[], []])
567+
self.assertEqual(
568+
[str(obs) for obs in N2.all_individuals], [])
555569

556570
Q.nodes[0].next_node = 1
557571
Q.nodes[0].next_class = 1
558572
Q.nodes[0].have_event()
559573

560-
self.assertEqual([[str(obs) for obs in lst] for lst in N1.individuals], [['Individual 1'], ['Individual 2']])
561-
self.assertEqual([str(obs) for obs in N1.all_individuals], ['Individual 1', 'Individual 2'])
562-
self.assertEqual([[str(obs) for obs in lst] for lst in N2.individuals], [[], []])
563-
self.assertEqual([str(obs) for obs in N2.all_individuals], [])
574+
self.assertEqual(
575+
[[str(obs) for obs in lst] for lst in N1.individuals],
576+
[['Individual 1'], ['Individual 2']])
577+
self.assertEqual(
578+
[str(obs) for obs in N1.all_individuals],
579+
['Individual 1', 'Individual 2'])
580+
self.assertEqual(
581+
[[str(obs) for obs in lst] for lst in N2.individuals], [[], []])
582+
self.assertEqual(
583+
[str(obs) for obs in N2.all_individuals], [])
564584

565585
Q.nodes[0].next_node = 2
566586
Q.nodes[0].next_class = 0
567587
Q.nodes[0].have_event()
568588

569-
self.assertEqual([[str(obs) for obs in lst] for lst in N1.individuals], [['Individual 1'], ['Individual 2']])
570-
self.assertEqual([str(obs) for obs in N1.all_individuals], ['Individual 1', 'Individual 2'])
571-
self.assertEqual([[str(obs) for obs in lst] for lst in N2.individuals], [['Individual 3'], []])
572-
self.assertEqual([str(obs) for obs in N2.all_individuals], ['Individual 3'])
589+
self.assertEqual(
590+
[[str(obs) for obs in lst] for lst in N1.individuals],
591+
[['Individual 1'], ['Individual 2']])
592+
self.assertEqual(
593+
[str(obs) for obs in N1.all_individuals],
594+
['Individual 1', 'Individual 2'])
595+
self.assertEqual(
596+
[[str(obs) for obs in lst] for lst in N2.individuals],
597+
[['Individual 3'], []])
598+
self.assertEqual(
599+
[str(obs) for obs in N2.all_individuals],
600+
['Individual 3'])
573601

574602
Q.nodes[0].next_node = 2
575603
Q.nodes[0].next_class = 1
576604
Q.nodes[0].have_event()
577605

578-
self.assertEqual([[str(obs) for obs in lst] for lst in N1.individuals], [['Individual 1'], ['Individual 2']])
579-
self.assertEqual([str(obs) for obs in N1.all_individuals], ['Individual 1', 'Individual 2'])
580-
self.assertEqual([[str(obs) for obs in lst] for lst in N2.individuals], [['Individual 3'], ['Individual 4']])
581-
self.assertEqual([str(obs) for obs in N2.all_individuals], ['Individual 3', 'Individual 4'])
606+
self.assertEqual(
607+
[[str(obs) for obs in lst] for lst in N1.individuals],
608+
[['Individual 1'], ['Individual 2']])
609+
self.assertEqual(
610+
[str(obs) for obs in N1.all_individuals],
611+
['Individual 1', 'Individual 2'])
612+
self.assertEqual(
613+
[[str(obs) for obs in lst] for lst in N2.individuals],
614+
[['Individual 3'], ['Individual 4']])
615+
self.assertEqual(
616+
[str(obs) for obs in N2.all_individuals],
617+
['Individual 3', 'Individual 4'])
582618

583619
def test_server_utilisation(self):
584620
# Single server
@@ -603,11 +639,37 @@ def test_server_utilisation(self):
603639

604640
def test_server_utilisation_with_schedules(self):
605641
N = ciw.create_network(
606-
Arrival_distributions=[['Sequential', [2.0, 4.0, 4.0, 0.0, 7.0, 1000.0]]],
607-
Service_distributions=[['Sequential', [4.0, 2.0, 6.0, 6.0, 3.0]]],
642+
Arrival_distributions=[['Sequential',
643+
[2.0, 4.0, 4.0, 0.0, 7.0, 1000.0]]],
644+
Service_distributions=[['Sequential',
645+
[4.0, 2.0, 6.0, 6.0, 3.0]]],
608646
Number_of_servers=[[[1, 9], [2, 23]]]
609647
)
610648
Q = ciw.Simulation(N)
611649
Q.simulate_until_max_time(23)
612650
recs = Q.get_all_records()
613651
self.assertEqual(Q.transitive_nodes[0].server_utilisation, 21.0/37.0)
652+
653+
def test_num_inds_equal_len_all_inds(self):
654+
# Create a Simulatin class that inherits form ciw.Simulation so that
655+
# an assertion than number_of_individuals == len(all_individuals)
656+
# every time self.event_and_return_nextnode is called.
657+
class AssertSim(ciw.Simulation):
658+
def event_and_return_nextnode(simself, next_active_node, current_time):
659+
"""
660+
Carries out the event of current next_active_node, and return the next
661+
next_active_node
662+
"""
663+
next_active_node.have_event()
664+
for node in simself.transitive_nodes:
665+
node.update_next_event_date(current_time)
666+
self.assertEqual(
667+
node.number_of_individuals, len(node.all_individuals))
668+
return simself.find_next_active_node()
669+
670+
# Now carry out the tests by running a simulation with this new
671+
# inherited Node class.
672+
N = ciw.create_network_from_yml(
673+
'ciw/tests/testing_parameters/params.yml')
674+
Q = AssertSim(N)
675+
Q.simulate_until_max_time(100)

ciw/tests/test_simulation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,14 @@ def test_simulate_until_max_customers_finish(self):
124124
ciw.seed(2)
125125
Q1 = ciw.Simulation(N)
126126
Q1.simulate_until_max_customers(10, method='Finish')
127-
self.assertEqual(Q1.nodes[-1].number_completed, 10)
127+
self.assertEqual(Q1.nodes[-1].number_of_individuals, 10)
128128
self.assertEqual(len(Q1.nodes[-1].all_individuals), 10)
129129

130130
# Test 'Finish' method
131131
ciw.seed(2)
132132
Q2 = ciw.Simulation(N)
133133
Q2.simulate_until_max_customers(10)
134-
self.assertEqual(Q2.nodes[-1].number_completed, 10)
134+
self.assertEqual(Q2.nodes[-1].number_of_individuals, 10)
135135
self.assertEqual(len(Q2.nodes[-1].all_individuals), 10)
136136

137137
next_active_node = Q2.find_next_active_node()

0 commit comments

Comments
 (0)