-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsimulation_run.py
More file actions
60 lines (40 loc) · 1.5 KB
/
Copy pathsimulation_run.py
File metadata and controls
60 lines (40 loc) · 1.5 KB
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
59
60
"""simulation of the server"""
from __future__ import annotations
from typing import TYPE_CHECKING
import simpy
from app.core.simulation.requests_generator import requests_generator
from app.schemas.simulation_output import SimulationOutput
if TYPE_CHECKING:
from collections.abc import Generator
import numpy as np
from app.schemas.full_simulation_input import SimulationPayload
def run_simulation(
input_data: SimulationPayload,
*,
rng: np.random.Generator,
) -> SimulationOutput:
"""Simulation executor in Simpy"""
sim_settings = input_data.sim_settings
requests_generator_input = input_data.rqs_input
gaps: Generator[float, None, None] = requests_generator(
requests_generator_input,
sim_settings,
rng=rng)
env = simpy.Environment()
total_request_per_time_period = {
"simulation_time": sim_settings.total_simulation_time,
"total_requests": 0,
}
def arrival_process(
env: simpy.Environment,
) -> Generator[simpy.events.Event, None, None]:
for gap in gaps:
yield env.timeout(gap)
total_request_per_time_period["total_requests"] += 1
env.process(arrival_process(env))
env.run(until=sim_settings.total_simulation_time)
return SimulationOutput(
total_requests=total_request_per_time_period,
metric_2=str(requests_generator_input.avg_request_per_minute_per_user.mean),
metric_n=str(requests_generator_input.avg_active_users.mean),
)