class_docstr: Implements full-batch or deterministic L-BFGS algorithm. Compatible with
  Powell damping. Can be used when evaluating a deterministic function and
  gradient. Wraps the LBFGS optimizer. Performs the two-loop recursion,
  updating, and curvature updating in a single step.
  
  Implemented by: Hao-Jun Michael Shi and Dheevatsa Mudigere
  Last edited 11/15/18.
  
  Warnings:
    . Does not support per-parameter options and parameter groups.
    . All parameters have to be on a single device.
  
  Inputs:
      lr (float): steplength or learning rate (default: 1)
      history_size (int): update history size (default: 10)
      line_search (str): designates line search to use (default: 'Wolfe')
          Options:
              'None': uses steplength designated in algorithm
              'Armijo': uses Armijo backtracking line search
              'Wolfe': uses Armijo-Wolfe bracketing line search
      dtype: data type (default: torch.float)
      debug (bool): debugging mode
code: def __init__(
      self,
      params,
      lr=1,
      history_size=10,
      line_search="Wolfe",
      dtype=torch.float,
      debug=False,
  ):
      super(FullBatchLBFGS, self).__init__(
          params, lr, history_size, line_search, dtype, debug
      )
  
imports: from copy import deepcopy
  from functools import reduce
  import matplotlib.pyplot
  import numpy
  import torch
  from torch.optim import Optimizer
label_desc: Use image node_id 1 to create a new FullBatchLBFGS object from inherited base classes: LBFGS with example: obj = FullBatchLBFGS(params, lr, history_size, line_search, dtype, debug)