code: def proximal_step(self, gradf=None):
          
  
          if gradf is None:
              gradf = self.eval_grad()
  
          self.Vf[:] = self.Yf - (1. / self.L) * gradf
          V = sl.irfftn(self.Vf, self.cri.Nv, self.cri.axisN)
  
          self.X[:] = self.eval_proxop(V)
          self.Xf = sl.rfftn(self.X, None, self.cri.axisN)
  
          return gradf
docs: Compute proximal update (gradient descent + constraint).
          Variables are mapped back and forth between input and
          frequency domains.