in safe_rl/pg/agents.py [0:0]
def update_pi(self, inputs):
flat_g = self.training_package['flat_g']
v_ph = self.training_package['v_ph']
hvp = self.training_package['hvp']
get_pi_params = self.training_package['get_pi_params']
set_pi_params = self.training_package['set_pi_params']
pi_loss = self.training_package['pi_loss']
d_kl = self.training_package['d_kl']
target_kl = self.training_package['target_kl']
Hx = lambda x : mpi_avg(self.sess.run(hvp, feed_dict={**inputs, v_ph: x}))
g, pi_l_old = self.sess.run([flat_g, pi_loss], feed_dict=inputs)
g, pi_l_old = mpi_avg(g), mpi_avg(pi_l_old)
# Core calculations for TRPO or NPG
x = tro.cg(Hx, g)
alpha = np.sqrt(2*target_kl/(np.dot(x, Hx(x))+EPS))
old_params = self.sess.run(get_pi_params)
# Save lagrange multiplier
self.logger.store(Alpha=alpha)
def set_and_eval(step):
self.sess.run(set_pi_params, feed_dict={v_ph: old_params - alpha * x * step})
return mpi_avg(self.sess.run([d_kl, pi_loss], feed_dict=inputs))
# TRPO augments NPG with backtracking line search, hard kl constraint
for j in range(self.backtrack_iters):
kl, pi_l_new = set_and_eval(step=self.backtrack_coeff**j)
if kl <= target_kl and pi_l_new <= pi_l_old:
self.logger.log('Accepting new params at step %d of line search.'%j)
self.logger.store(BacktrackIters=j)
break
if j==self.backtrack_iters-1:
self.logger.log('Line search failed! Keeping old params.')
self.logger.store(BacktrackIters=j)
kl, pi_l_new = set_and_eval(step=0.)