Repository navigation
Expand file tree
/
Copy pathtest.py
More file actions
140 lines (108 loc) · 4.24 KB
/
Copy pathtest.py
File metadata and controls
140 lines (108 loc) · 4.24 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
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
import json
import numpy as np
from env.env import *
from algo.ddpg import DDPG
import torch
from utils import generate_channels
def whiten(state):
return (state - np.mean(state)) / np.std(state)
# test policy
#TODO: add save rewards & loss & rates
def test_policy(policy, env, eps, upload_channels=False, channels=None, filename=None): #same dataset as train
print("****************Evaluation********************")
episode_rewards = np.zeros(eps) #same number of eps as training
eves_rate = []
users_rate = []
max_rewards = []
for i in range(eps):
max_reward = 0
if upload_channels:
s, _ = env.reset(data=True, channels=channels, eps_num=i)
else :
s, _ = env.reset()
s = whiten(s)
done = False
while not done:
#get action from policy
a = policy.select_action(s, test=True)
#observe new state, reward and whether the episode is done
s_new, r, done, _, _ = env.step(a)
#add reward to episode reward
episode_rewards[i] += r
#max rewards
if r > max_reward:
max_reward = r
users_rate.append([env.user_list[i].rate for i in range(env.K)])
eves_rate.append([env.attacker_list[i].rate for i in range(env.P)])
#update states
s = s_new
s = whiten(s)
max_rewards.append(max_reward)
print("Episode: "+str(i)+ " Episode Reward: "+str(episode_rewards[i])+" Max Reward: "+str(max_reward))
np.save(f"{filename}/Learning Curves/test/training_episodes", episode_rewards)
np.save(f"{filename}/Learning Curves/test/users_rate", users_rate)
np.save(f"{filename}/Learning Curves/test/eves_rate", eves_rate)
#calculate average episode reward over eps tests
print("evaluation score all episodes", np.mean(episode_rewards)) #all episodes
print("evaluation mean reward", np.mean(episode_rewards)/env._max_episode_steps)
return episode_rewards, users_rate, eves_rate,
#stupid :))
def test_one(agent, env, eps_num, upload_channels=False, channels=None):
if upload_channels:
s, _ = env.reset(data=True, channels=channels, eps_num=eps_num)
else :
s, _ = env.reset()
s = whiten(s)
a = agent.select_action(s, test=True)
s_new, r, done, _, _ = env.step(a)
print(r)
return r
def test(params):
# environment setup
params = json.loads(params)
env_config = params["env"]
ddpg_config = params["algo"]
buffer_config = params["buffer"]
experiment = params["experiment"]
# Initialize experiment params
load_channels = experiment["save_channels"]
load_model = experiment["load_model"]
filename = experiment["filename"]
seed = experiment["seed"]
num_eps = experiment["num_eps"]
num_steps_per_ep = experiment["num_steps"]
total_steps = num_eps * num_steps_per_ep
# if load_channels/matlab
if load_channels:
pass #for now work with the same seed , later import matlab channels
channels = generate_channels(env_config, num_eps,seed)
# Create environment
env = Environment(
env_config,
steps_per_ep=num_steps_per_ep,
seed=seed)
# Set seeds
env.seed(seed)
torch.manual_seed(seed)
np.random.seed(seed)
# Initialize agent
state_dim = env._get_state_dim()
action_dim = env._get_action_dim()
ddpg_config["state_dim"]= state_dim
ddpg_config["action_dim"] = action_dim
ddpg_config["device"] = torch.device(f"cuda:0" if torch.cuda.is_available() else "cpu")
ddpg_config["max_action"] = 1
agent = DDPG(**ddpg_config)
#Init DDPG & load model
agent.load(f"{filename}/Models/")
# test_scores
print('..........................................')
print('Running Tests of: '+ filename)
print('..........................................')
print("Total Steps :",total_steps)
instant_rewards, users_rate, eves_rate = test_policy(
policy=agent, env=env, eps=num_eps, upload_channels=True ,channels=channels, filename=filename)
# save test scores
np.save(f"{filename}/Learning Curves/test/training_episodes", instant_rewards)
np.save(f"{filename}/Learning Curves/test/users_rate", users_rate)
np.save(f"{filename}/Learning Curves/test/eves_rate", eves_rate)