Release for liblbfgs 1.6.
git-svn-id: file:///home/svnrepos/software/liblbfgs/trunk@25 ecf4c44f-38d1-4fa4-9757-a0b4dd0349fc
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = \
 | 
			
		||||
	sample.cpp \
 | 
			
		||||
	sample.vcproj
 | 
			
		||||
 | 
			
		||||
noinst_PROGRAMS = sample
 | 
			
		||||
 
 | 
			
		||||
@@ -49,6 +49,7 @@ int main(int argc, char *argv)
 | 
			
		||||
    int i, ret = 0;
 | 
			
		||||
    lbfgsfloatval_t fx;
 | 
			
		||||
    lbfgsfloatval_t *x = lbfgs_malloc(N);
 | 
			
		||||
    lbfgs_parameter_t param;
 | 
			
		||||
 | 
			
		||||
    if (x == NULL) {
 | 
			
		||||
        printf("ERROR: Failed to allocate a memory block for variables.\n");
 | 
			
		||||
@@ -61,11 +62,15 @@ int main(int argc, char *argv)
 | 
			
		||||
        x[i+1] = 1.0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Initialize the parameters for the L-BFGS optimization. */
 | 
			
		||||
    lbfgs_parameter_init(¶m);
 | 
			
		||||
    /* param.linesearch = LBFGS_LINESEARCH_BACKTRACKING; */
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
        Start the L-BFGS optimization; this will invoke the callback functions
 | 
			
		||||
        evaluate() and progress() when necessary.
 | 
			
		||||
     */
 | 
			
		||||
    ret = lbfgs(N, x, &fx, evaluate, progress, NULL, NULL);
 | 
			
		||||
    ret = lbfgs(N, x, &fx, evaluate, progress, NULL, ¶m);
 | 
			
		||||
 | 
			
		||||
    /* Report the result. */
 | 
			
		||||
    printf("L-BFGS optimization terminated with status code = %d\n", ret);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										126
									
								
								sample/sample.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								sample/sample.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,126 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <lbfgs.h>
 | 
			
		||||
 | 
			
		||||
class objective_function
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
    lbfgsfloatval_t *m_x;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    objective_function() : m_x(NULL)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~objective_function()
 | 
			
		||||
    {
 | 
			
		||||
        if (m_x != NULL) {
 | 
			
		||||
            lbfgs_free(m_x);
 | 
			
		||||
            m_x = NULL;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int run(int N)
 | 
			
		||||
    {
 | 
			
		||||
        lbfgsfloatval_t fx;
 | 
			
		||||
        lbfgsfloatval_t *m_x = lbfgs_malloc(N);
 | 
			
		||||
 | 
			
		||||
        if (m_x == NULL) {
 | 
			
		||||
            printf("ERROR: Failed to allocate a memory block for variables.\n");
 | 
			
		||||
            return 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* Initialize the variables. */
 | 
			
		||||
        for (int i = 0;i < N;i += 2) {
 | 
			
		||||
            m_x[i] = -1.2;
 | 
			
		||||
            m_x[i+1] = 1.0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
            Start the L-BFGS optimization; this will invoke the callback functions
 | 
			
		||||
            evaluate() and progress() when necessary.
 | 
			
		||||
         */
 | 
			
		||||
        int ret = lbfgs(N, m_x, &fx, _evaluate, _progress, this, NULL);
 | 
			
		||||
 | 
			
		||||
        /* Report the result. */
 | 
			
		||||
        printf("L-BFGS optimization terminated with status code = %d\n", ret);
 | 
			
		||||
        printf("  fx = %f, x[0] = %f, x[1] = %f\n", fx, m_x[0], m_x[1]);
 | 
			
		||||
        
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    static lbfgsfloatval_t _evaluate(
 | 
			
		||||
        void *instance,
 | 
			
		||||
        const lbfgsfloatval_t *x,
 | 
			
		||||
        lbfgsfloatval_t *g,
 | 
			
		||||
        const int n,
 | 
			
		||||
        const lbfgsfloatval_t step
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
        return reinterpret_cast<objective_function*>(instance)->evaluate(x, g, n, step);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    lbfgsfloatval_t evaluate(
 | 
			
		||||
        const lbfgsfloatval_t *x,
 | 
			
		||||
        lbfgsfloatval_t *g,
 | 
			
		||||
        const int n,
 | 
			
		||||
        const lbfgsfloatval_t step
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
        lbfgsfloatval_t fx = 0.0;
 | 
			
		||||
 | 
			
		||||
        for (int i = 0;i < n;i += 2) {
 | 
			
		||||
            lbfgsfloatval_t t1 = 1.0 - x[i];
 | 
			
		||||
            lbfgsfloatval_t t2 = 10.0 * (x[i+1] - x[i] * x[i]);
 | 
			
		||||
            g[i+1] = 20.0 * t2;
 | 
			
		||||
            g[i] = -2.0 * (x[i] * g[i+1] + t1);
 | 
			
		||||
            fx += t1 * t1 + t2 * t2;
 | 
			
		||||
        }
 | 
			
		||||
        return fx;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static int _progress(
 | 
			
		||||
        void *instance,
 | 
			
		||||
        const lbfgsfloatval_t *x,
 | 
			
		||||
        const lbfgsfloatval_t *g,
 | 
			
		||||
        const lbfgsfloatval_t fx,
 | 
			
		||||
        const lbfgsfloatval_t xnorm,
 | 
			
		||||
        const lbfgsfloatval_t gnorm,
 | 
			
		||||
        const lbfgsfloatval_t step,
 | 
			
		||||
        int n,
 | 
			
		||||
        int k,
 | 
			
		||||
        int ls
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
        return reinterpret_cast<objective_function*>(instance)->progress(x, g, fx, xnorm, gnorm, step, n, k, ls);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int progress(
 | 
			
		||||
        const lbfgsfloatval_t *x,
 | 
			
		||||
        const lbfgsfloatval_t *g,
 | 
			
		||||
        const lbfgsfloatval_t fx,
 | 
			
		||||
        const lbfgsfloatval_t xnorm,
 | 
			
		||||
        const lbfgsfloatval_t gnorm,
 | 
			
		||||
        const lbfgsfloatval_t step,
 | 
			
		||||
        int n,
 | 
			
		||||
        int k,
 | 
			
		||||
        int ls
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
        printf("Iteration %d:\n", k);
 | 
			
		||||
        printf("  fx = %f, x[0] = %f, x[1] = %f\n", fx, x[0], x[1]);
 | 
			
		||||
        printf("  xnorm = %f, gnorm = %f, step = %f\n", xnorm, gnorm, step);
 | 
			
		||||
        printf("\n");
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define N   100
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv)
 | 
			
		||||
{
 | 
			
		||||
    objective_function obj;
 | 
			
		||||
    return obj.run(N);
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user