-
Notifications
You must be signed in to change notification settings - Fork 1
/
feature.py
60 lines (48 loc) · 1.74 KB
/
feature.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
import numpy as np
class FeatureExtractor(object):
"""
Base feature extractor.
"""
def __init__(self, **kwargs):
pass
def get_feature(self, **kwargs):
pass
class CartpoleIdentityFeature(FeatureExtractor):
"""
Return the current state vector.
Return feature directly as the bsuite observation (8-dim)
"""
def __init__(self):
self.dimension = 8
def get_feature(self, observation_history):
return observation_history[-1][0]
class CartpoleNeuralFeature(FeatureExtractor):
def __init__(self):
self.dimension = 6
def get_feature(self, observation_history):
# assume obs = (x, x_dot, theta, theta_dot)
x, x_dot, theta, theta_dot = observation_history[-1][0]
features = [np.cos(theta), np.sin(theta), x, x_dot/10.0, theta_dot/10.0, 1. if abs(x) < 1 else 0.]
return np.array(features)
class DeepSeaIdentityFeature(FeatureExtractor):
"""
Returns the current state vector
"""
def __init__(self, num_steps):
self.dimension = 2
self.feature_space = tuple([(m,n) for m in range(num_steps) for n in range(num_steps)])
def get_feature(self, observation_history):
return observation_history[-1][0]
class DeepseaOneHotFeature(FeatureExtractor):
def __init__(self, num_steps):
self.num_steps = num_steps
self.dimension = num_steps ** 2
def get_feature(self, observation_history):
horizontal, vertical = observation_history[-1][0]
if vertical == self.num_steps:
return None
else:
ind = self.num_steps * horizontal + vertical
one_hot = np.zeros(self.dimension)
one_hot[ind] = 1.0
return one_hot