-
Notifications
You must be signed in to change notification settings - Fork 19
/
solver.py
89 lines (65 loc) · 3.71 KB
/
solver.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
import pymzn
import pymzn.config
from service_batch_generator import *
from environment import *
from config import *
pymzn.debug(False)
def solver(network_service, length, env):
chain = network_service
if not isinstance(network_service, (list,)):
chain = network_service.tolist()
chain = chain[:length]
slots = [env.cpu_properties[i]["numSlots"] for i in range(env.num_cpus)]
link_bandwidth = [env.link_properties[i]["bandwidth"] for i in range(env.num_cpus)]
link_latency = [env.link_properties[i]["latency"] for i in range(env.num_cpus)]
vnf_weights = [env.vnfd_properties[i]['size'] for i in range(1, env.num_vnfds + 1)]
vnf_bandwidth = [env.vnfd_properties[i]['bandwidth'] for i in range(1, env.num_vnfds + 1)]
vnf_latency = [env.vnfd_properties[i]['latency'] for i in range(1, env.num_vnfds + 1)]
placement = service_bandwidth = service_net_latency = service_cpu_latency = energy = occupancy = link_used = None
s = pymzn.minizinc('placement.mzn', timeout=30, parallel=4, data={'numServers': env.num_cpus,
'maxSlots': env.max_slots,
'slots': slots,
'link_bandwidth': link_bandwidth,
'link_latency': link_latency,
'chainLen': length,
'chain': chain,
'numVnfds': env.num_vnfds,
'vnf_weights': vnf_weights,
'vnf_bandwidth': vnf_bandwidth,
'vnf_latency': vnf_latency,
'p_min': env.p_min,
'p_slot': env.p_slot
})
try:
placement = s[0]['placement']
placement = [x - 1 for x in placement]
service_bandwidth = s[0]['service_bandwidth']
service_net_latency = s[0]['service_net_latency']
service_cpu_latency = s[0]['service_cpu_latency']
energy = s[0]['energy']
occupancy = s[0]['occupancy']
link_used = s[0]['link_used']
except:
print("Solution not found!")
return placement, service_bandwidth, service_net_latency, service_cpu_latency, energy, occupancy, link_used
if __name__ == "__main__":
""" Configuration """
config, _ = get_config()
""" Environment """
env = Environment(config.num_cpus, config.num_vnfd)
""" Network service generator """
vocab_size = config.num_vnfd + 1
network_services = ServiceBatchGenerator(1, config.min_length, config.max_length, vocab_size)
# New batch of states
network_services.getNewState()
print("Computing... ")
ns = [2, 6, 3, 5, 5, 3, 7, 4, 1, 3, 5, 4]
len = 12
optPlacement, service_bandwidth, service_net_latency, service_cpu_latency, energy, occupancy, link_used = solver(ns, len, env)
print("Optimal placement: ", optPlacement)
print("Service bandwidth: ", service_bandwidth)
print("Service network latency: ", service_net_latency)
print("Service CPU latency: ", service_cpu_latency)
print("Energy: ", energy)
print("Occupancy: ", occupancy)
print("Link bandwidth used: ", link_used)