code: function(f, x0, options) {
      options = options || {}
  
      this.f = f
      this.n = x0.length
      // cache the init guess
      this.xInitGuess = x0
      this.x = MathUtils.clone(x0)
  
      this.df = options.df || MathUtils.getApproximateGradientFunction(this.f)
      this.maxIterator = options.maxIterator || 200
      this.err = options.err || 1E-6
  
      // the gradient of the function evaluated at x[k]: g[k]  (x[0] = x0)
      this.g = this.df(this.x)
  
      // the inverse of approximate Hessian matrix: B[k]  (B[0] = I)
      this.B = MathUtils.getIdentityMatrix(this.n)
  
      // direction: p[k]
      this.p = []
  
      this.stepsize = 0
      this.convergence = Infinity
      this.isConverges = false
  
      this.iterator = -1
  }
docs: [BFGSAlgorithm description]