-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdemand_generator.py
121 lines (96 loc) · 3.7 KB
/
demand_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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
from NetConfig import *
class CSplitRequest:
def __init__(self, src, sinks, size):
self.sinks = sinks
self.size = size
self.src = src
class CRequest:
def __init__(self, src, release_time, size, sinks):
self.release_time = release_time
self.src = src
self.sinks = sinks
self.unfinish_sinks = sinks
self.completion_time = release_time
self._receiver_fct = {}
self.active_receiver = sinks
for sink in sinks:
if sink not in self._receiver_fct.keys():
self._receiver_fct[sink] = release_time
self.size = size
self.score = - float(size)/(len(sinks))
self.sizeofsinks = {}
for sink in sinks:
if sink not in self.sizeofsinks.keys():
self.sizeofsinks[sink] = size
self.subrequests = []
firstreq = CSplitRequest(src, sinks, size)
self.subrequests.append(firstreq)
self.schedulable_subrequests = []
self.maxsubflownum = 1
self.weight = 1.0 # for sorting
def get_receiver_idx(self):
return self.sinks
def get_sender_idx(self):
return self.src
def DemandCreator():
demand_writer = open("demand.txt", "w")
#src_rack, release_time, demand_size, sinknum, sink_id1, sink_id2,...
reqnum = 0
current_time = 0
reqperSlot = [0 for t in range(SIMULATE_TIME)]
while current_time < SIMULATE_TIME:
for slotid in range(reqArrivalRatio):
# Poisson process,the arrival rate is 0.5
arrivaltime = int(random.expovariate(1.0 / reqArrivalRatio))
if (current_time + arrivaltime) < SIMULATE_TIME:
reqperSlot[current_time + arrivaltime] += maxtransferpereq
reqnum += reqperSlot[current_time]
m_reqcount = 0
while m_reqcount < reqperSlot[current_time]:
release_time = current_time
demand_size = random.randint(1, SIZE_CAP) # simulate fixed size
src_rack = random.randint(0, RACKNUM - 1)
sinknum = random.randint(1, RACKNUM * RECEIVER_FACTION)
demand_writer.writelines("%d %d %d %d " % (src_rack, release_time, demand_size, sinknum))
sink_rack = []
while len(sink_rack) < sinknum:
newsink = random.randint(0, RACKNUM - 1)
if newsink != src_rack and newsink not in sink_rack:
sink_rack.append(newsink)
demand_writer.writelines(" %d " %(newsink))
demand_writer.writelines("\n")
m_reqcount += 1
current_time += SLOT_DURATION
demand_writer.close()
def DemandReader(demandFilePath):
RequestList = []
demand_reader = open(demandFilePath+"demand.txt", "r")
line = demand_reader.readline()
line = line.split()
while line:
src = int(line[0])
release_time = int(line[1])
size = int(line[2])
sinknum = int(line[3])
sinklist = []
for j in range(sinknum):
sinklist.append((int(line[4+j])))
new_request = CRequest(src, release_time, size, sinklist)
#print "releas_time", release_time
RequestList.append(new_request)
line = demand_reader.readline()
line = line.split()
demand_reader.close()
#RequestList.sort(key=lambda d: d.release_time)
return RequestList
class Epoch:
def __init__(self, idx, start_time, duration, sentsize, circuit_util):
self._idx = idx
self._start_time = start_time
self._duration = duration
self._sent_size = sentsize
self._circuit_util = circuit_util
self._throughput = sentsize/duration