-
Notifications
You must be signed in to change notification settings - Fork 0
/
class_random_def_1D_env.py
228 lines (128 loc) · 5.05 KB
/
class_random_def_1D_env.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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
"""
The goal of this script is to provide the environment simulating a random
deformation of a beam fixed at the endpoints. This is done by drawing
realizations of a Gaussian process with Brownian-Bridge type covariance.
The environment consists of states indicating past measurements and actions
indicating designated next measurements. Rewards are differences between
measured and actual maximum deformations.
For this, do the following:
1. Definitions and imports
2. Class intitalization
3. Auxiliary methods
3. Step method
4. Reset method
5. Render method
The class can be called upon in any script by evoking it e.g. via
import class_random_def_1D_env
random_def_1D_env=class_random_def_1D_env.Env()
"""
"""
1. Definitions and imports
"""
# i) Import standard packages
import numpy as np
import matplotlib
import copy
import matplotlib.pyplot as plt
import gym
from gym import spaces
# ii) Class constructor
class Env(gym.Env):
metadata = {'render.modes': ['human']}
"""
2. Class intitalization
"""
# i) Initialization
def __init__(self):
super(Env, self).__init__()
# ii) Boundary definitions
self.n_meas=4
self.max_epoch=self.n_meas
self.n_state=self.n_meas*2
self.n_disc_x=100
self.x=np.linspace(0,1,self.n_disc_x)
self.K=np.zeros([self.n_disc_x,self.n_disc_x])
for k in range(self.n_disc_x):
for l in range(self.n_disc_x):
self.K[k,l]=self.cov_fun(self.x[k],self.x[l])
# iii) Observation and action spaces
self.action_space = spaces.Box(low=-1, high=1,
shape=(1,), dtype=np.float32)
self.observation_space = spaces.Box(low=-1, high=1,
shape=(self.n_state,), dtype=np.float32)
# iv) Initial properties
self.epoch=0
self.def_fun=np.random.multivariate_normal(np.zeros([self.n_disc_x]), self.K)
self.state=-np.ones([self.n_state])
self.x_measured=self.state[0:self.n_meas]
self.f_measured=self.state[self.n_meas:self.n_state]
"""
3. Auxiliary methods
"""
# i) Round continuous location to index
def round_to_index(self, location):
location_index=np.floor(location*self.n_disc_x).astype(int).item()
if location_index>=self.n_disc_x:
location_index=self.n_disc_x-1
elif location_index<=-1:
location_index=0
return location_index
# ii) Covariance function
# Brownian Bridge-type: Variance is 0 at endpoints, sinusoidals whose
# probabilities decrease with increasing frequency
def cov_fun(self,s,t):
cov_vec=np.zeros([10])
for k in range(10):
cov_vec[k]=(1/(k+1)**4)*(np.sin(1*np.pi*k*s)*np.sin(1*np.pi*k*t))
cov_val=np.sum(cov_vec)
return cov_val
"""
3. Step method
"""
def step(self, action):
# i) Perform action and update state
action_index=self.round_to_index(action*0.5+0.5)
new_state=copy.copy(self.state)
new_state[self.epoch]=self.x[action_index]
new_state[self.epoch+self.n_meas]=self.def_fun[action_index]
self.state=new_state
self.x_measured=self.state[0:self.n_meas]
self.f_measured=self.state[self.n_meas:self.n_state]
reward=-np.abs(np.max(self.def_fun)-np.max(self.f_measured))
# ii) Update epoch, check if done
self.epoch=self.epoch+1
if self.epoch==self.max_epoch:
done=True
else:
done=False
info = {}
return self.state, reward, done, info
"""
4. Reset method
"""
def reset(self):
# i) Reinitialize by simulating again
self.epoch=0
self.def_fun=np.random.multivariate_normal(np.zeros([self.n_disc_x]), self.K)
self.state=-np.ones([self.n_state])
self.x_measured=self.state[0:self.n_meas]
self.f_measured=self.state[self.n_meas:self.n_state]
observation=self.state
return observation
"""
5. Render method and close
"""
# i) Render plot with measured locations
def render(self, reward, mode='console'):
plt.figure(1,dpi=300)
plt.plot(self.x,self.def_fun,linestyle='solid',color='0')
plt.scatter(self.x_measured,self.f_measured)
plt.title('Deformation functions and sample locations')
plt.xlabel('x axis')
plt.ylabel('y axis)')
print('Reward is ', reward)
print('Measured locations are', self.x_measured)
print(' Measurements are', self.f_measured)
# ii) Close method
def close (self):
pass