code: def robust_backtrack(self):
          
  
          self.L *= self.L_gamma_d
          maxiter = self.L_maxiter
  
          iterBTrack = 0
          linesearch = 1
  
          self.store_Yprev()
          while linesearch and iterBTrack < maxiter:
  
              t = float(1. + np.sqrt(1. + 4. * self.L * self.Tk)) / (2. * self.L)
              T = self.Tk + t
              y = (self.Tk * self.var_xprv() + t * self.ZZ) / T
              self.update_var_y(y)
  
              gradY = self.proximal_step()  # Given Y(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.Tk = T
          self.ZZ += (t * self.L * (self.var_x() - self.var_y()))
  
          self.F = f
          self.Q = Q
          self.iterBTrack = iterBTrack
docs: Estimate step size L by computing a linesearch that
          guarantees that F <= Q according to the robust FISTA
          backtracking strategy in :cite:`florea-2017-robust`.
          This also updates all the supporting variables.