Source code for explauto.evaluation.evaluation
from numpy import linalg
[docs]class Evaluation(object):
def __init__(self, ag, env, testcases, mode='inverse'):
self.ag = ag
self.env = env
self.mode = mode
if mode not in ('inverse', 'forward'):
raise ValueError('mode should be "inverse" or "forward"',
'"general" predictions coming soon)')
self.testcases = testcases
[docs] def evaluate(self, n_tests_forward=None, testcases_forward=None):
mode = self.ag.sensorimotor_model.mode
self.ag.sensorimotor_model.mode = 'exploit'
if self.mode == 'inverse':
errors = []
for s_g in self.testcases:
m = self.ag.infer(self.ag.conf.s_dims, self.ag.conf.m_dims, s_g).flatten()
s = self.env.update(m, log=False)
errors.append(linalg.norm(s_g - s))
elif self.mode == 'forward':
print 'forward prediction tests still in beta version, use with caution'
if n_tests_forward is not None:
print "Generating ", n_tests_forward, " uniform random motor tests ..."
testcases = self.env.random_motors(n=n_tests_forward)
elif testcases_forward is not None:
testcases = testcases_forward
else:
raise ValueError('For forward prediction evaluation',
', call either using n_tests_forward',
'(# of uniform random motor tests) or',
'testcases_forward (motor testcases). Not both.')
errors = []
for m in testcases:
s_p = self.ag.infer(self.ag.conf.m_dims, self.ag.conf.s_dims, m).flatten()
s = self.env.update(m, log=False)
errors.append(linalg.norm(s_p - s))
else:
raise ValueError('mode should be "inverse" or "forward"',
'"general" predictions coming soon)')
self.ag.sensorimotor_model.mode = mode
return errors
[docs] def plot_testcases(self, ax, dims, **kwargs_plot):
plot_specs = {'marker': 'o', 'linestyle': 'None'}
plot_specs.update(kwargs_plot)
# test_array = array([hstack((m, s)) for m, s in self.tester.testcases])
# test_array = test_array[:, dims]
# ax.plot(*(test_array.T), **plot_specs)
ax.plot(*(self.testcases.T), **plot_specs)