docstr: input:
  batch: dict(o, s, u, r, u_onehot, avail_u, padded, isover, actor_inputs, critic_inputs)
  epsilon (float): e-greedy discount
docstr_tok: ["input",":","batch",":","dict","(","o",",","s",",","u",",","r",",","u_onehot",",","avail_u",",","padded",",","isover",",","actor_inputs",",","critic_inputs",")","epsilon","(","float",")",":","e-greedy","discount"]
code: def learn(self, batch, epsilon):
      """input:
      batch: dict(o, s, u, r, u_onehot, avail_u, padded, isover, actor_inputs, critic_inputs)
      epsilon (float): e-greedy discount
      """
      ep_num = batch["r"].shape[0]
      self.train_rnn_h = self.init_hidden(ep_num)
      self.train_rnn_h = self.train_rnn_h.to(self.device)
  
      q_values = self._critic_learn(batch)
      self._actor_learn(batch, epsilon, q_values)
  
file_path: PARL/parl/algorithms/torch/coma.py
imports: import torch
  import os
  from copy import deepcopy
  import parl
  from parl.utils.utils import check_model_method
  import numpy
label_desc: Use image node_id 9 for calling the COMA obj's underlying member method code with example usage: obj.learn(batch, epsilon) without return types