docstr: Sample action
  Args:
      obs (torch.tensor): observation
  Return:
      value (torch.tensor): predicted state value
      action (torch.tensor): actions sampled from a distribution
      action_log_probs (torch.tensor): the log probabilities of action
docstr_tok: ["Sample","action","Args",":","obs","(","torch.tensor",")",":","observation","Return",":","value","(","torch.tensor",")",":","predicted","state","value","action","(","torch.tensor",")",":","actions","sampled","from","a","distribution","action_log_probs","(","torch.tensor",")",":","the","log","probabilities","of","action"]
code: def sample(self, obs):
      """Sample action
      Args:
          obs (torch.tensor): observation
      Return:
          value (torch.tensor): predicted state value
          action (torch.tensor): actions sampled from a distribution
          action_log_probs (torch.tensor): the log probabilities of action
      """
      with torch.no_grad():
          value = self.critic(obs)
          action_probs = self.actor(obs)
          dist = Categorical(action_probs)
          action = dist.sample()
          action_log_probs = dist.log_prob(action)
      return value, action, action_log_probs
  
file_path: PARL/examples/Baselines/Halite_competition/torch/rl_trainer/algorithm.py
imports: import torch
  import torch.nn
  import torch.optim
  import parl
  from torch.distributions import Categorical
label_desc: Use image node_id 3 for calling the PPO obj's underlying member method code with example usage: obj.sample(obs) and returns: value,  action,  action_log_probs