code: def deltas(predicted_values, rewards, mask, gamma=0.99):
    r
  
    # `d`s are basically one-step TD residuals.
    d = []
    _, T = rewards.shape  # pylint: disable=invalid-name
    for t in range(T):
      d.append(rewards[:, t] + (gamma * predicted_values[:, t + 1]) -
               predicted_values[:, t])
  
    return np.array(d).T * mask
docs: r"""Computes TD-residuals from V(s) and rewards.
  
    Where a `delta`, i.e. a td-residual is defined as:
  
    delta_{b,t} = r_{b,t} + \gamma * v_{b,t+1} - v_{b,t}.
  
    Args:
      predicted_values: ndarray of shape (B, T+1). NOTE: Expects axis 2 was
        squeezed. These represent V(s_bt) for b < B and t < T+1
      rewards: ndarray of shape (B, T) of rewards.
      mask: ndarray of shape (B, T) of mask for rewards.
      gamma: float, discount factor.
  
    Returns:
      ndarray of shape (B, T) of one-step TD-residuals.