docstr: compute return for each step
          
code: def compute_returns(self, next_value, value_normalizer=None):
      """compute return for each step"""
      self.value_preds[-1] = next_value
      gae = 0
      for step in reversed(range(self.rewards.shape[0])):
          if self._use_popart:
              delta = (
                  self.rewards[step]
                  + self.gamma
                  * value_normalizer.denormalize(
                      self.value_preds[step + 1]
                  )
                  * self.masks[step + 1]
                  - value_normalizer.denormalize(self.value_preds[step])
              )
              gae = (
                  delta
                  + self.gamma
                  * self.gae_lambda
                  * self.masks[step + 1]
                  * gae
              )
              self.returns[step] = gae + value_normalizer.denormalize(
                  self.value_preds[step]
              )
          else:
              delta = (
                  self.rewards[step]
                  + self.gamma
                  * self.value_preds[step + 1]
                  * self.masks[step + 1]
                  - self.value_preds[step]
              )
              gae = (
                  delta
                  + self.gamma
                  * self.gae_lambda
                  * self.masks[step + 1]
                  * gae
              )
              self.returns[step] = gae + self.value_preds[step]
  
file_path: PARL/benchmark/torch/mappo/mappo_buffer.py
imports: import torch
  import numpy
label_desc: Use image node_id 4 for calling the SeparatedReplayBuffer obj's underlying member method code with example usage: obj.compute_returns(next_value, value_normalizer) without return types