⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lbfgs.h

📁 This library is a C port of the implementation of Limited-memory Broyden-Fletcher-Goldfarb-Shanno (L
💻 H
📖 第 1 页 / 共 2 页
字号:
/* *      C library of Limited memory BFGS (L-BFGS). * * Copyright (c) 1990, Jorge Nocedal * Copyright (c) 2007,2008,2009 Naoaki Okazaki * All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. *//* $Id: lbfgs.h 56 2009-02-28 09:41:21Z naoaki $ */#ifndef __LBFGS_H__#define __LBFGS_H__#ifdef  __cplusplusextern "C" {#endif/*__cplusplus*//* * The default precision of floating point values is 64bit (double). */#ifndef LBFGS_FLOAT#define LBFGS_FLOAT     64#endif/*LBFGS_FLOAT*//* * Activate optimization routines for IEEE754 floating point values. */#ifndef LBFGS_IEEE_FLOAT#define LBFGS_IEEE_FLOAT    1#endif/*LBFGS_IEEE_FLOAT*/#if     LBFGS_FLOAT == 32typedef float lbfgsfloatval_t;#elif   LBFGS_FLOAT == 64typedef double lbfgsfloatval_t;#else#error "libLBFGS supports single (float; LBFGS_FLOAT = 32) or double (double; LBFGS_FLOAT=64) precision only."#endif/**  * \addtogroup liblbfgs_api libLBFGS API * @{ * *  The libLBFGS API. *//** * Return values of lbfgs(). *  *  Roughly speaking, a negative value indicates an error. */enum {    /** L-BFGS reaches convergence. */    LBFGS_SUCCESS = 0,    LBFGS_CONVERGENCE = 0,    LBFGS_STOP,    /** The initial variables already minimize the objective function. */    LBFGS_ALREADY_MINIMIZED,    /** Unknown error. */    LBFGSERR_UNKNOWNERROR = -1024,    /** Logic error. */    LBFGSERR_LOGICERROR,    /** Insufficient memory. */    LBFGSERR_OUTOFMEMORY,    /** The minimization process has been canceled. */    LBFGSERR_CANCELED,    /** Invalid number of variables specified. */    LBFGSERR_INVALID_N,    /** Invalid number of variables (for SSE) specified. */    LBFGSERR_INVALID_N_SSE,    /** The array x must be aligned to 16 (for SSE). */    LBFGSERR_INVALID_X_SSE,    /** Invalid parameter lbfgs_parameter_t::epsilon specified. */    LBFGSERR_INVALID_EPSILON,    /** Invalid parameter lbfgs_parameter_t::past specified. */    LBFGSERR_INVALID_TESTPERIOD,    /** Invalid parameter lbfgs_parameter_t::delta specified. */    LBFGSERR_INVALID_DELTA,    /** Invalid parameter lbfgs_parameter_t::linesearch specified. */    LBFGSERR_INVALID_LINESEARCH,    /** Invalid parameter lbfgs_parameter_t::max_step specified. */    LBFGSERR_INVALID_MINSTEP,    /** Invalid parameter lbfgs_parameter_t::max_step specified. */    LBFGSERR_INVALID_MAXSTEP,    /** Invalid parameter lbfgs_parameter_t::ftol specified. */    LBFGSERR_INVALID_FTOL,    /** Invalid parameter lbfgs_parameter_t::gtol specified. */    LBFGSERR_INVALID_GTOL,    /** Invalid parameter lbfgs_parameter_t::xtol specified. */    LBFGSERR_INVALID_XTOL,    /** Invalid parameter lbfgs_parameter_t::max_linesearch specified. */    LBFGSERR_INVALID_MAXLINESEARCH,    /** Invalid parameter lbfgs_parameter_t::orthantwise_c specified. */    LBFGSERR_INVALID_ORTHANTWISE,    /** Invalid parameter lbfgs_parameter_t::orthantwise_start specified. */    LBFGSERR_INVALID_ORTHANTWISE_START,    /** Invalid parameter lbfgs_parameter_t::orthantwise_end specified. */    LBFGSERR_INVALID_ORTHANTWISE_END,    /** The line-search step went out of the interval of uncertainty. */    LBFGSERR_OUTOFINTERVAL,    /** A logic error occurred; alternatively, the interval of uncertainty        became too small. */    LBFGSERR_INCORRECT_TMINMAX,    /** A rounding error occurred; alternatively, no line-search step        satisfies the sufficient decrease and curvature conditions. */    LBFGSERR_ROUNDING_ERROR,    /** The line-search step became smaller than lbfgs_parameter_t::min_step. */    LBFGSERR_MINIMUMSTEP,    /** The line-search step became larger than lbfgs_parameter_t::max_step. */    LBFGSERR_MAXIMUMSTEP,    /** The line-search routine reaches the maximum number of evaluations. */    LBFGSERR_MAXIMUMLINESEARCH,    /** The algorithm routine reaches the maximum number of iterations. */    LBFGSERR_MAXIMUMITERATION,    /** Relative width of the interval of uncertainty is at most        lbfgs_parameter_t::xtol. */    LBFGSERR_WIDTHTOOSMALL,    /** A logic error (negative line-search step) occurred. */    LBFGSERR_INVALIDPARAMETERS,    /** The current search direction increases the objective function value. */    LBFGSERR_INCREASEGRADIENT,};/** * Line search algorithms. */enum {    /** The default algorithm (MoreThuente method). */    LBFGS_LINESEARCH_DEFAULT = 0,    /** MoreThuente method proposd by More and Thuente. */    LBFGS_LINESEARCH_MORETHUENTE = 0,    /** Backtracking method with strong Wolfe condition. */    LBFGS_LINESEARCH_BACKTRACKING_STRONG = 1,    /** Backtracking method with regular Wolfe condition. */    LBFGS_LINESEARCH_BACKTRACKING = 2,    /** Backtracking method with regular Wolfe condition. */    LBFGS_LINESEARCH_BACKTRACKING_LOOSE = 2,};/** * L-BFGS optimization parameters. *  Call lbfgs_parameter_init() function to initialize parameters to the *  default values. */typedef struct {    /**     * The number of corrections to approximate the inverse hessian matrix.     *  The L-BFGS routine stores the computation results of previous \ref m     *  iterations to approximate the inverse hessian matrix of the current     *  iteration. This parameter controls the size of the limited memories     *  (corrections). The default value is \c 6. Values less than \c 3 are     *  not recommended. Large values will result in excessive computing time.     */    int             m;    /**     * Epsilon for convergence test.     *  This parameter determines the accuracy with which the solution is to     *  be found. A minimization terminates when     *      ||g|| < \ref epsilon * max(1, ||x||),     *  where ||.|| denotes the Euclidean (L2) norm. The default value is     *  \c 1e-5.     */    lbfgsfloatval_t epsilon;    /**     * Distance for delta-based convergence test.     *  This parameter determines the distance, in iterations, to compute     *  the rate of decrease of the objective function. If the value of this     *  parameter is zero, the library does not perform the delta-based     *  convergence test. The default value is \c 0.     */    int             past;    /**     * Delta for convergence test.     *  This parameter determines the minimum rate of decrease of the     *  objective function. The library stops iterations when the     *  following condition is met:     *      (f' - f) / f < \ref delta,     *  where f' is the objective value of \ref past iterations ago, and f is     *  the objective value of the current iteration.     *  The default value is \c 0.     */    lbfgsfloatval_t delta;    /**     * The maximum number of iterations.     *  The lbfgs() function terminates an optimization process with     *  ::LBFGSERR_MAXIMUMITERATION status code when the iteration count     *  exceedes this parameter. Setting this parameter to zero continues an     *  optimization process until a convergence or error. The default value     *  is \c 0.     */    int             max_iterations;    /**     * The line search algorithm.     *  This parameter specifies a line search algorithm to be used by the     *  L-BFGS routine.     */    int             linesearch;    /**     * The maximum number of trials for the line search.     *  This parameter controls the number of function and gradients evaluations     *  per iteration for the line search routine. The default value is \c 20.     */    int             max_linesearch;    /**     * The minimum step of the line search routine.     *  The default value is \c 1e-20. This value need not be modified unless     *  the exponents are too large for the machine being used, or unless the     *  problem is extremely badly scaled (in which case the exponents should     *  be increased).     */    lbfgsfloatval_t min_step;    /**     * The maximum step of the line search.     *  The default value is \c 1e+20. This value need not be modified unless     *  the exponents are too large for the machine being used, or unless the     *  problem is extremely badly scaled (in which case the exponents should     *  be increased).     */    lbfgsfloatval_t max_step;    /**     * A parameter to control the accuracy of the line search routine.     *  The default value is \c 1e-4. This parameter should be greater     *  than zero and smaller than \c 0.5.     */    lbfgsfloatval_t ftol;    /**     * A parameter to control the accuracy of the line search routine.     *  The default value is \c 0.9. If the function and gradient     *  evaluations are inexpensive with respect to the cost of the     *  iteration (which is sometimes the case when solving very large     *  problems) it may be advantageous to set this parameter to a small     *  value. A typical small value is \c 0.1. This parameter shuold be     *  greater than the \ref ftol parameter (\c 1e-4) and smaller than     *  \c 1.0.     */    lbfgsfloatval_t gtol;    /**     * The machine precision for floating-point values.     *  This parameter must be a positive value set by a client program to     *  estimate the machine precision. The line search routine will terminate     *  with the status code (::LBFGSERR_ROUNDING_ERROR) if the relative width     *  of the interval of uncertainty is less than this parameter.     */    lbfgsfloatval_t xtol;    /**     * Coeefficient for the L1 norm of variables.     *  This parameter should be set to zero for standard minimization     *  problems. Setting this parameter to a positive value activates     *  Orthant-Wise Limited-memory Quasi-Newton (OWL-QN) method, which     *  minimizes the objective function F(x) combined with the L1 norm |x|     *  of the variables, {F(x) + C |x|}. This parameter is the coeefficient     *  for the |x|, i.e., C. As the L1 norm |x| is not differentiable at     *  zero, the library modifies function and gradient evaluations from     *  a client program suitably; a client program thus have only to return     *  the function value F(x) and gradients G(x) as usual. The default value     *  is zero.     */    lbfgsfloatval_t orthantwise_c;    /**     * Start index for computing L1 norm of the variables.     *  This parameter is valid only for OWL-QN method     *  (i.e., \ref orthantwise_c != 0). This parameter b (0 <= b < N)     *  specifies the index number from which the library computes the     *  L1 norm of the variables x,     *      |x| := |x_{b}| + |x_{b+1}| + ... + |x_{N}| .     *  In other words, variables x_1, ..., x_{b-1} are not used for     *  computing the L1 norm. Setting b (0 < b < N), one can protect     *  variables, x_1, ..., x_{b-1} (e.g., a bias term of logistic     *  regression) from being regularized. The default value is zero.     */    int             orthantwise_start;    /**     * End index for computing L1 norm of the variables.     *  This parameter is valid only for OWL-QN method     *  (i.e., \ref orthantwise_c != 0). This parameter e (0 < e <= N)     *  specifies the index number at which the library stops computing the     *  L1 norm of the variables x,     */    int             orthantwise_end;} lbfgs_parameter_t;/** * Callback interface to provide objective function and gradient evaluations. * *  The lbfgs() function call this function to obtain the values of objective *  function and its gradients when needed. A client program must implement *  this function to evaluate the values of the objective function and its *  gradients, given current values of variables. *   *  @param  instance    The user data sent for lbfgs() function by the client. *  @param  x           The current values of variables. *  @param  g           The gradient vector. The callback function must compute *                      the gradient values for the current variables. *  @param  n           The number of variables. *  @param  step        The current step of the line search routine. *  @retval lbfgsfloatval_t The value of the objective function for the current *                          variables. */typedef lbfgsfloatval_t (*lbfgs_evaluate_t)(    void *instance,    const lbfgsfloatval_t *x,    lbfgsfloatval_t *g,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -