code: def _update(self):
          r
  
          # Calculate gradient for current iteration.
          self._grad.get_grad(self._x_old)
  
          # Update z values.
          for i in range(self._prox_list.size):
              z_temp = (2 * self._x_old - self._z[i] - self._gamma *
                        self._grad.grad)
              z_prox = self._prox_list[i].op(z_temp, extra_factor=self._gamma /
                                             self._weights[i])
              self._z[i] += self._lambda_param * (z_prox - self._x_old)
  
          # Update current reconstruction.
          self._x_new = np.sum([z_i * w_i for z_i, w_i in
                                zip(self._z, self._weights)], axis=0)
  
          # Update old values for next iteration.
          np.copyto(self._x_old, self._x_new)
  
          # Update parameter values for next iteration.
          self._update_param()
  
          # Test cost function for convergence.
          if self._cost_func:
              self.converge = self._cost_func.get_cost(self._x_new)
docs: r"""Update
  
          This method updates the current reconstruction
  
          Notes
          -----
          Implements algorithm 1 from [R2012]_