-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimulation.py
60 lines (48 loc) · 1.97 KB
/
simulation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import numpy as np
import analysis as an
import toolkit
class Simulation(object):
"""Stores all simulation and world parameters"""
units = [
'sec',
'sec',
'sec',
'N/A'
]
def __init__(self, duration, minNCompletedUsers, timeStep, seed, verbose, dbName=None, computeInteractions=False):
self.duration = duration
self.minNCompletedUsers = minNCompletedUsers
self.timeStep = timeStep
self.seed = seed
self.verbose = verbose
self.dbName = dbName
self.computeInteractions = computeInteractions
def save(self, filename):
toolkit.saveYaml(filename, self)
@staticmethod
def load(filename):
return toolkit.loadYaml(filename)
def run(self, world, surface=None):
np.random.seed(self.seed)
# preparing simulation
world.prepare(self.timeStep, self.duration)
if surface is not None:
analysisZone = an.AnalysisZone(world.intersections[0], surface)
else:
analysisZone = None
# main loop
userNum = 0
instant = 0
while instant*self.timeStep < self.duration or len(world.completed) < self.minNCompletedUsers:
if self.verbose:
print('simulation step {}: {} users ({} completed), {} interactions ({} completed)'.format(instant, len(world.users), len(world.completed), len(world.interactions), len(world.completedInteractions)))
world.updateControlDevices(self.timeStep)
# print(world.controlDevices[0].state, world.controlDevices[1].state, instant)
userNum = world.initUsers(instant, userNum, self.safetyDistance)
world.updateUsers(instant, analysisZone)
world.updateFirstUsers()
world.updateInteractions(instant, self.computeInteractions)
instant += 1
world.duplicateLastVelocities()
world.computePET(self)
world.computeMeanVelocities(self.timeStep)