tst_lbfgs.cpp
来自「最大熵 等模型使用的 lbfgs 训练源代码。」· C++ 代码 · 共 54 行
CPP
54 行
#include <iostream>#include <stdlib.h>#include "lbfgs.h"int main(int argc, const char* argv[]){ int passes = 1; if (argc > 1) { passes = atoi(argv[1]); } //int n = 100; int n=4,m=3; std::vector<double> x(n); double* xb = &(*(x.begin())); std::vector<double> g(n); double* gb = &(*(g.begin())); for (int ipass = 0; ipass < passes; ipass++) { for(int j=0;j<n;j+=2) { x[j] = -1.2; x[j+1] = 1.; } scitbx::lbfgs::minimizer<double, int> minimizer(n,m); //minimizer.write(); scitbx::lbfgs::traditional_convergence_test<double, int> is_converged(n); if (passes == 1) { std::cout << "n: " << minimizer.n() << std::endl; std::cout << "m: " << minimizer.m() << std::endl; std::cout << "xtol: " << minimizer.xtol() << std::endl; } for(;;) { double f = 0.; for(int j=0;j<n;j+=2) { double t1 = 1.e0 - x[j]; double t2 = 1.e1 * (x[j+1] - x[j] * x[j]); g[j+1] = 2.e1 * t2; g[j] = -2.e0 * (x[j] * g[j+1] + t1); f = f + t1 * t1 + t2 * t2; } if (minimizer.run(xb, f, gb)) continue; if (passes == 1) { std::cout << "f: " << f; std::cout << " gnorm: " << minimizer.euclidean_norm(&(*(g.begin()))); std::cout << std::endl; std::cout << " " << minimizer.iter(); std::cout << " " << minimizer.nfun(); std::cout << " " << minimizer.stp(); std::cout << std::endl; } if (is_converged(xb, gb)) break; if (minimizer.nfun() > 2000) break; minimizer.run(xb, f, gb); } } return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?