inv_hessian = None
if args.read_inv_hessian is not None:
    print(
        "optimize_metaparameters.py: reading inverse Hessian from {0}".format(
            args.read_inv_hessian),
        file=sys.stderr)
    inv_hessian = np.loadtxt(args.read_inv_hessian)
    if inv_hessian.shape != (len(x0), len(x0)):
        sys.exit("optimize_metaparameters.py: inverse Hessian from {0} "
                 "has wrong shape.".format(args.read_inv_hessian),
                 file=sys.stderr)

(x, value, deriv,
 inv_hessian) = bfgs.Bfgs(x0,
                          GetObjfAndDeriv, (lambda x: True),
                          init_inv_hessian=inv_hessian,
                          gradient_tolerance=args.gradient_tolerance,
                          progress_tolerance=args.progress_tolerance,
                          verbose=True)

y = UnconstrainedToConstrained(x)
print("optimize_metaparameters: final metaparameters are ", y, file=sys.stderr)
if y[-4] < 0.1:
    sys.exit(
        "your dev set is probably in your training set; this is not advisable")

WriteMetaparameters("{0}/final.metaparams".format(args.optimize_dir), y)

old_objf = -1.0 * value0
new_objf = -1.0 * value

print(
iteration = 0
# value0 will store the first evaluated objective function.a
value0 = None

inv_hessian = None
if not args.read_inv_hessian is None:
    print("optimize_metaparameters.py: reading inverse Hessian from {0}".format(
            args.read_inv_hessian), file=sys.stderr)
    inv_hessian = np.loadtxt(args.read_inv_hessian)
    if inv_hessian.shape != (len(x0), len(x0)):
        sys.exit("optimize_metaparameters.py: inverse Hessian from {0} "
                 "has wrong shape.".format(args.read_inv_hessian),
                 file=sys.stderr)

(x, value, deriv, inv_hessian) = bfgs.Bfgs(x0, GetObjfAndDeriv, MetaparametersAreAllowed,
                                           init_inv_hessian = inv_hessian,
                                           gradient_tolerance = args.gradient_tolerance,
                                           progress_tolerance = args.progress_tolerance)

print("optimize_metaparameters: final metaparameters are ", x, file=sys.stderr)

WriteMetaparameters("{0}/final.metaparams".format(args.optimize_dir), x)

old_objf = -1.0 * value0
new_objf = -1.0 * value

print("optimize_metaparameters.py: log-prob on dev data (with barrier function) increased "
      "from %.6f to %.6f over %d passes of derivative estimation (penalized perplexity: %.6f->%.6f" %
      (old_objf, new_objf, iteration, math.exp(-old_objf), math.exp(-new_objf)),
      file=sys.stderr)

print("optimize_metaparameters.py: final perplexity without barrier function was %.6f "