code: def standard_backtrack(self):
          
  
          gradY = self.eval_grad()  # Given Y(f), this updates computes gradY(f)
  
          maxiter = self.L_maxiter
  
          iterBTrack = 0
          linesearch = 1
          while linesearch and iterBTrack < maxiter:
  
              self.proximal_step(gradY)  # Given gradY(f), L, this updates X(f)
  
              f = self.obfn_f(self.var_x())
              Dxy = self.eval_Dxy()
              Q = self.obfn_f(self.var_y()) + \
                  self.eval_linear_approx(Dxy, gradY) + \
                  (self.L / 2.) * np.linalg.norm(Dxy.flatten(), 2)**2
  
              if f <= Q:
                  linesearch = 0
              else:
                  self.L *= self.L_gamma_u
  
              iterBTrack += 1
  
          self.F = f
          self.Q = Q
          self.iterBTrack = iterBTrack
          # Update auxiliary sequence
          self.combination_step()
docs: Estimate step size L by computing a linesearch that
          guarantees that F <= Q according to the standard FISTA
          backtracking strategy in :cite:`beck-2009-fast`.
          This also updates variable Y.