-
Notifications
You must be signed in to change notification settings - Fork 0
/
bursty_workload_generator.py
150 lines (112 loc) · 6 KB
/
bursty_workload_generator.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
## bursty_workload_generator.py
# This script generates requests to run models at quasi-random bursts to simulate the requests generated by autonomous navigation models for aerial robots.
import numpy as np
import json
import matplotlib.pyplot as plt
def poisson_process_with_rate_variation(total_time, rates, change_points):
"""
Generate bursty arrival times using a Poisson process with rate variation.
Parameters:
- total_time: Total simulation time.
- rates: List of rates corresponding to different time intervals.
- change_points: List of time points where the rate changes.
Returns:
- arrival_times: List of arrival times.
"""
arrival_times = [] # list of arrival times
current_time = 0 # current time, initialized to 0
for i in range(len(change_points)):
rate = rates[i]
duration = change_points[i] - current_time
# Generate arrivals based on Poisson process
arrivals = np.random.poisson(rate * duration)
arrival_times.extend(np.sort(np.random.uniform(current_time, current_time + duration, arrivals)))
current_time = change_points[i]
# Handle the last interval
rate = rates[-1]
duration = total_time - current_time
arrivals = np.random.poisson(rate * duration)
arrival_times.extend(np.sort(np.random.uniform(current_time, current_time + duration, arrivals)))
return arrival_times
# to do: quantify the burstiness of the arrival times
# add a parameter to the function to control the burstiness of the arrival times
# add a parameter to the function to control the number of models
# add a parameter to the function to control the number of requests per model
# add a parameter to the function to control the number of requests per second
# add function to plot arrival times
def generate_bursty_arrival_times(option):
"""
Generate bursty arrival times using a Poisson process with rate variation for each model.
Ask user for input for total_time, rates, and change_points.
Parameters:
- option: Option to enter values manually, read values from JSON file, or use traces from autonomous UAV missions provided in workloadLibrary folder.
Returns:
- arrival_times_dict: Dictionary of arrival times for each model.
"""
# initialize variables
arrival_times_dict = {} # dictionary to store arrival times for each model
# option 1: enter values manually
if option == 1:
print("Ok, please enter your values manually to generate bursty workloads.")
model_count = int(input("Enter number of models: ")) # example: 1
total_time = int(input("Enter total simulation time: ")) # example: 150 seconds
# create dictionary to store arrival times for each model
for i in range(model_count):
model = input("Enter model name: ") # example: "M1"
# read in rates and change_points as lists
rates = list(map(float, input("Enter list of rates corresponding to different time intervals: ").strip().split())) # example: [0.5, 1, 0.2]
change_points = list(map(int, input("Enter list of time points where the rate changes: ").strip().split())) # example: [50, 100]
arrivals = poisson_process_with_rate_variation(total_time, rates, change_points) # generate arrival times for each model
arrival_times_dict[model] = [arrivals]
# option 2: read values from JSON file
elif option == 2:
print("Ok, please enter the location of your json file.")
location = input("Enter file location: ")
try:
with open(location) as file:
model_constants = json.load(file)
except FileNotFoundError:
print("File not found. Please try again.")
# Read JSON file
with open('model_constants.json') as file:
model_constants = json.load(file)
total_time = model_constants['total_time']
models = model_constants['models']
for m in models.keys():
rates = models[m]['rates']
change_points = models[m]['change_points']
arrivals = poisson_process_with_rate_variation(total_time, rates, change_points)
arrival_times_dict[m] = [arrivals]
# option 3: use traces from autonomous UAV missions provided in workloadLibrary folder
else:
print("Ok, please enter the name of the workload json file you would like to use.")
file = input("Enter file name: ")
try:
with open('burstyWorkloadGenerator/workloadLibrary/'+file) as file:
model_constants = json.load(file)
except FileNotFoundError:
print("File not found. Please try again.")
total_time = model_constants['total_time']
models = model_constants['models']
for m in models.keys():
rates = models[m]['rates']
change_points = models[m]['change_points']
arrivals = poisson_process_with_rate_variation(total_time, rates, change_points)
arrival_times_dict[m] = [arrivals]
# write arrival times to
with open('outputs/bursty_arrival_times.json', 'w') as file:
# write arrival times to json file
json.dump(arrival_times_dict, file)
# output message to console
print("Bursty arrival times have been generated and written to bursty_arrival_times.json.")
return arrival_times_dict, total_time
if __name__ == "__main__":
# print to console
print("This script generates requests to run models at quasi-random bursts to simulate the requests generated by autonomous navigation models for aerial robots.")
# ask user for input
print("Enter values manually or read values from JSON file?")
print("1. Enter values manually")
print("2. Read values from JSON file")
print("3. Use traces from autonomous UAV missions provided in workloadLibrary folder")
option = int(input("Enter option #: ")) # example: 1
arrival_times, total_time = generate_bursty_arrival_times(option)