upgrade version
This commit is contained in:
parent
7e1f3009e6
commit
f4ef6702e1
@ -1,4 +1,4 @@
|
|||||||
#
|
#
|
||||||
# default base directory for YAP installation
|
# default base directory for YAP installation
|
||||||
# (EROOT for architecture-dependent files)
|
# (EROOT for architecture-dependent files)
|
||||||
#
|
#
|
||||||
@ -20,7 +20,7 @@ YAPLIBDIR=@libdir@/Yap
|
|||||||
#
|
#
|
||||||
#
|
#
|
||||||
CC=@CC@
|
CC=@CC@
|
||||||
CFLAGS= @SHLIB_CFLAGS@ $(YAP_EXTRAS) $(DEFS) -I$(srcdir) -I../.. -I$(srcdir)/../../include -I$(srcdir)/liblbfgs-1.7/include
|
CFLAGS= @SHLIB_CFLAGS@ $(YAP_EXTRAS) $(DEFS) -I$(srcdir) -I../.. -I$(srcdir)/../../include -I$(srcdir)/liblbfgs-1.10/include
|
||||||
LDFLAGS=@LDFLAGS@
|
LDFLAGS=@LDFLAGS@
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
@ -49,8 +49,8 @@ all: $(SOBJS)
|
|||||||
yap_lbfgs.o: $(srcdir)/yap_lbfgs.c
|
yap_lbfgs.o: $(srcdir)/yap_lbfgs.c
|
||||||
$(CC) -c $(CFLAGS) $(srcdir)/yap_lbfgs.c -o yap_lbfgs.o
|
$(CC) -c $(CFLAGS) $(srcdir)/yap_lbfgs.c -o yap_lbfgs.o
|
||||||
|
|
||||||
lbfgs.o: $(srcdir)/liblbfgs-1.7/lib/lbfgs.c
|
lbfgs.o: $(srcdir)/liblbfgs-1.10/lib/lbfgs.c
|
||||||
$(CC) -c $(CFLAGS) -I $(srcdir)/liblbfgs-1.7/lib $(srcdir)/liblbfgs-1.7/lib/lbfgs.c -o lbfgs.o
|
$(CC) -c $(CFLAGS) -I $(srcdir)/liblbfgs-1.10/lib $(srcdir)/liblbfgs-1.10/lib/lbfgs.c -o lbfgs.o
|
||||||
|
|
||||||
@DO_SECOND_LD@yap_lbfgs.@SO@: yap_lbfgs.o lbfgs.o
|
@DO_SECOND_LD@yap_lbfgs.@SO@: yap_lbfgs.o lbfgs.o
|
||||||
@DO_SECOND_LD@ @SHLIB_LD@ $(LDFLAGS) -o yap_lbfgs.@SO@ yap_lbfgs.o lbfgs.o @EXTRA_LIBS_FOR_DLLS@
|
@DO_SECOND_LD@ @SHLIB_LD@ $(LDFLAGS) -o yap_lbfgs.@SO@ yap_lbfgs.o lbfgs.o @EXTRA_LIBS_FOR_DLLS@
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
The MIT License
|
The MIT License
|
||||||
|
|
||||||
Copyright (c) 1990 Jorge Nocedal
|
Copyright (c) 1990 Jorge Nocedal
|
||||||
Copyright (c) 2007-2009 Naoaki Okazaki
|
Copyright (c) 2007-2010 Naoaki Okazaki
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
@ -1,3 +1,23 @@
|
|||||||
|
2010-xx-xx Naoaki Okazaki <okazaki at chokkan org>
|
||||||
|
|
||||||
|
* libLBFGS 1.10:
|
||||||
|
- Fixed compiling errors on Mac OS X; this patch was kindly submitted by Nic Schraudolph.
|
||||||
|
- Reduced compiling warnings on Mac OS X; this patch was kindly submitted by Tamas Nepusz.
|
||||||
|
|
||||||
|
|
||||||
|
2010-01-29 Naoaki Okazaki <okazaki at chokkan org>
|
||||||
|
|
||||||
|
* libLBFGS 1.9:
|
||||||
|
- Fixed a mistake in checking the validity of the parameters "ftol" and "wolfe"; this mistake was discovered by Kevin S. Van Horn.
|
||||||
|
|
||||||
|
|
||||||
|
2009-07-13 Naoaki Okazaki <okazaki at chokkan org>
|
||||||
|
|
||||||
|
* libLBFGS 1.8:
|
||||||
|
- Accepted the patch submitted by Takashi Imamichi; the backtracking method now has three criteria for choosing the step length.
|
||||||
|
- Updated the documentation to explain the above three criteria.
|
||||||
|
|
||||||
|
|
||||||
2009-02-28 Naoaki Okazaki <okazaki at chokkan org>
|
2009-02-28 Naoaki Okazaki <okazaki at chokkan org>
|
||||||
|
|
||||||
* libLBFGS 1.7:
|
* libLBFGS 1.7:
|
@ -2,7 +2,7 @@
|
|||||||
libLBFGS: C library of limited-memory BFGS (L-BFGS)
|
libLBFGS: C library of limited-memory BFGS (L-BFGS)
|
||||||
|
|
||||||
Copyright (c) 1990, Jorge Nocedal
|
Copyright (c) 1990, Jorge Nocedal
|
||||||
Copyright (c) 2007-2009, Naoaki Okazaki
|
Copyright (c) 2007-2010, Naoaki Okazaki
|
||||||
|
|
||||||
=========================================================================
|
=========================================================================
|
||||||
1. Introduction
|
1. Introduction
|
||||||
@ -68,4 +68,4 @@ SSE/SSE2 instructions are unavailable on CPUs.
|
|||||||
libLBFGS is distributed under the term of the MIT license.
|
libLBFGS is distributed under the term of the MIT license.
|
||||||
Please refer to COPYING file in the distribution.
|
Please refer to COPYING file in the distribution.
|
||||||
|
|
||||||
$Id: README 56 2009-02-28 09:41:21Z naoaki $
|
$Id$
|
@ -2,7 +2,7 @@
|
|||||||
* C library of Limited memory BFGS (L-BFGS).
|
* C library of Limited memory BFGS (L-BFGS).
|
||||||
*
|
*
|
||||||
* Copyright (c) 1990, Jorge Nocedal
|
* Copyright (c) 1990, Jorge Nocedal
|
||||||
* Copyright (c) 2007,2008,2009 Naoaki Okazaki
|
* Copyright (c) 2007-2010 Naoaki Okazaki
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
@ -24,7 +24,7 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: lbfgs.h 56 2009-02-28 09:41:21Z naoaki $ */
|
/* $Id$ */
|
||||||
|
|
||||||
#ifndef __LBFGS_H__
|
#ifndef __LBFGS_H__
|
||||||
#define __LBFGS_H__
|
#define __LBFGS_H__
|
||||||
@ -107,6 +107,8 @@ enum {
|
|||||||
LBFGSERR_INVALID_MAXSTEP,
|
LBFGSERR_INVALID_MAXSTEP,
|
||||||
/** Invalid parameter lbfgs_parameter_t::ftol specified. */
|
/** Invalid parameter lbfgs_parameter_t::ftol specified. */
|
||||||
LBFGSERR_INVALID_FTOL,
|
LBFGSERR_INVALID_FTOL,
|
||||||
|
/** Invalid parameter lbfgs_parameter_t::wolfe specified. */
|
||||||
|
LBFGSERR_INVALID_WOLFE,
|
||||||
/** Invalid parameter lbfgs_parameter_t::gtol specified. */
|
/** Invalid parameter lbfgs_parameter_t::gtol specified. */
|
||||||
LBFGSERR_INVALID_GTOL,
|
LBFGSERR_INVALID_GTOL,
|
||||||
/** Invalid parameter lbfgs_parameter_t::xtol specified. */
|
/** Invalid parameter lbfgs_parameter_t::xtol specified. */
|
||||||
@ -152,12 +154,40 @@ enum {
|
|||||||
LBFGS_LINESEARCH_DEFAULT = 0,
|
LBFGS_LINESEARCH_DEFAULT = 0,
|
||||||
/** MoreThuente method proposd by More and Thuente. */
|
/** MoreThuente method proposd by More and Thuente. */
|
||||||
LBFGS_LINESEARCH_MORETHUENTE = 0,
|
LBFGS_LINESEARCH_MORETHUENTE = 0,
|
||||||
/** Backtracking method with strong Wolfe condition. */
|
/**
|
||||||
LBFGS_LINESEARCH_BACKTRACKING_STRONG = 1,
|
* Backtracking method with the Armijo condition.
|
||||||
/** Backtracking method with regular Wolfe condition. */
|
* The backtracking method finds the step length such that it satisfies
|
||||||
|
* the sufficient decrease (Armijo) condition,
|
||||||
|
* - f(x + a * d) <= f(x) + lbfgs_parameter_t::ftol * a * g(x)^T d,
|
||||||
|
*
|
||||||
|
* where x is the current point, d is the current search direction, and
|
||||||
|
* a is the step length.
|
||||||
|
*/
|
||||||
|
LBFGS_LINESEARCH_BACKTRACKING_ARMIJO = 1,
|
||||||
|
/** The backtracking method with the defualt (regular Wolfe) condition. */
|
||||||
LBFGS_LINESEARCH_BACKTRACKING = 2,
|
LBFGS_LINESEARCH_BACKTRACKING = 2,
|
||||||
/** Backtracking method with regular Wolfe condition. */
|
/**
|
||||||
LBFGS_LINESEARCH_BACKTRACKING_LOOSE = 2,
|
* Backtracking method with regular Wolfe condition.
|
||||||
|
* The backtracking method finds the step length such that it satisfies
|
||||||
|
* both the Armijo condition (LBFGS_LINESEARCH_BACKTRACKING_ARMIJO)
|
||||||
|
* and the curvature condition,
|
||||||
|
* - g(x + a * d)^T d >= lbfgs_parameter_t::wolfe * g(x)^T d,
|
||||||
|
*
|
||||||
|
* where x is the current point, d is the current search direction, and
|
||||||
|
* a is the step length.
|
||||||
|
*/
|
||||||
|
LBFGS_LINESEARCH_BACKTRACKING_WOLFE = 2,
|
||||||
|
/**
|
||||||
|
* Backtracking method with strong Wolfe condition.
|
||||||
|
* The backtracking method finds the step length such that it satisfies
|
||||||
|
* both the Armijo condition (LBFGS_LINESEARCH_BACKTRACKING_ARMIJO)
|
||||||
|
* and the following condition,
|
||||||
|
* - |g(x + a * d)^T d| <= lbfgs_parameter_t::wolfe * |g(x)^T d|,
|
||||||
|
*
|
||||||
|
* where x is the current point, d is the current search direction, and
|
||||||
|
* a is the step length.
|
||||||
|
*/
|
||||||
|
LBFGS_LINESEARCH_BACKTRACKING_STRONG_WOLFE = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -256,6 +286,17 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
lbfgsfloatval_t ftol;
|
lbfgsfloatval_t ftol;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A coefficient for the Wolfe condition.
|
||||||
|
* This parameter is valid only when the backtracking line-search
|
||||||
|
* algorithm is used with the Wolfe condition,
|
||||||
|
* ::LBFGS_LINESEARCH_BACKTRACKING_STRONG_WOLFE or
|
||||||
|
* ::LBFGS_LINESEARCH_BACKTRACKING_WOLFE .
|
||||||
|
* The default value is \c 0.9. This parameter should be greater
|
||||||
|
* the \ref ftol parameter and smaller than \c 1.0.
|
||||||
|
*/
|
||||||
|
lbfgsfloatval_t wolfe;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A parameter to control the accuracy of the line search routine.
|
* A parameter to control the accuracy of the line search routine.
|
||||||
* The default value is \c 0.9. If the function and gradient
|
* The default value is \c 0.9. If the function and gradient
|
||||||
@ -532,7 +573,7 @@ Among the various ports of L-BFGS, this library provides several features:
|
|||||||
The library is thread-safe, which is the secondary gain from the callback
|
The library is thread-safe, which is the secondary gain from the callback
|
||||||
interface.
|
interface.
|
||||||
- <b>Cross platform.</b> The source code can be compiled on Microsoft Visual
|
- <b>Cross platform.</b> The source code can be compiled on Microsoft Visual
|
||||||
Studio 2005, GNU C Compiler (gcc), etc.
|
Studio 2010, GNU C Compiler (gcc), etc.
|
||||||
- <b>Configurable precision</b>: A user can choose single-precision (float)
|
- <b>Configurable precision</b>: A user can choose single-precision (float)
|
||||||
or double-precision (double) accuracy by changing ::LBFGS_FLOAT macro.
|
or double-precision (double) accuracy by changing ::LBFGS_FLOAT macro.
|
||||||
- <b>SSE/SSE2 optimization</b>:
|
- <b>SSE/SSE2 optimization</b>:
|
||||||
@ -543,18 +584,41 @@ Among the various ports of L-BFGS, this library provides several features:
|
|||||||
|
|
||||||
This library is used by:
|
This library is used by:
|
||||||
- <a href="http://www.chokkan.org/software/crfsuite/">CRFsuite: A fast implementation of Conditional Random Fields (CRFs)</a>
|
- <a href="http://www.chokkan.org/software/crfsuite/">CRFsuite: A fast implementation of Conditional Random Fields (CRFs)</a>
|
||||||
|
- <a href="http://www.chokkan.org/software/classias/">Classias: A collection of machine-learning algorithms for classification</a>
|
||||||
- <a href="http://www.public.iastate.edu/~gdancik/mlegp/">mlegp: an R package for maximum likelihood estimates for Gaussian processes</a>
|
- <a href="http://www.public.iastate.edu/~gdancik/mlegp/">mlegp: an R package for maximum likelihood estimates for Gaussian processes</a>
|
||||||
- <a href="http://infmath.uibk.ac.at/~matthiasf/imaging2/">imaging2: the imaging2 class library</a>
|
- <a href="http://infmath.uibk.ac.at/~matthiasf/imaging2/">imaging2: the imaging2 class library</a>
|
||||||
- <a href="http://search.cpan.org/~laye/Algorithm-LBFGS-0.16/">Algorithm::LBFGS - Perl extension for L-BFGS</a>
|
- <a href="http://search.cpan.org/~laye/Algorithm-LBFGS-0.16/">Algorithm::LBFGS - Perl extension for L-BFGS</a>
|
||||||
|
- <a href="http://www.cs.kuleuven.be/~bernd/yap-lbfgs/">YAP-LBFGS (an interface to call libLBFGS from YAP Prolog)</a>
|
||||||
|
|
||||||
@section download Download
|
@section download Download
|
||||||
|
|
||||||
- <a href="http://www.chokkan.org/software/dist/liblbfgs-1.7.tar.gz">Source code</a>
|
- <a href="https://github.com/downloads/chokkan/liblbfgs/liblbfgs-1.10.tar.gz">Source code</a>
|
||||||
|
- <a href="https://github.com/chokkan/liblbfgs">GitHub repository</a>
|
||||||
|
|
||||||
libLBFGS is distributed under the term of the
|
libLBFGS is distributed under the term of the
|
||||||
<a href="http://opensource.org/licenses/mit-license.php">MIT license</a>.
|
<a href="http://opensource.org/licenses/mit-license.php">MIT license</a>.
|
||||||
|
|
||||||
@section changelog History
|
@section changelog History
|
||||||
|
- Version 1.10 (2010-12-22):
|
||||||
|
- Fixed compiling errors on Mac OS X; this patch was kindly submitted by
|
||||||
|
Nic Schraudolph.
|
||||||
|
- Reduced compiling warnings on Mac OS X; this patch was kindly submitted
|
||||||
|
by Tamas Nepusz.
|
||||||
|
- Replaced memalign() with posix_memalign().
|
||||||
|
- Updated solution and project files for Microsoft Visual Studio 2010.
|
||||||
|
- Version 1.9 (2010-01-29):
|
||||||
|
- Fixed a mistake in checking the validity of the parameters "ftol" and
|
||||||
|
"wolfe"; this was discovered by Kevin S. Van Horn.
|
||||||
|
- Version 1.8 (2009-07-13):
|
||||||
|
- Accepted the patch submitted by Takashi Imamichi;
|
||||||
|
the backtracking method now has three criteria for choosing the step
|
||||||
|
length:
|
||||||
|
- ::LBFGS_LINESEARCH_BACKTRACKING_ARMIJO: sufficient decrease (Armijo)
|
||||||
|
condition only
|
||||||
|
- ::LBFGS_LINESEARCH_BACKTRACKING_WOLFE: regular Wolfe condition
|
||||||
|
(sufficient decrease condition + curvature condition)
|
||||||
|
- ::LBFGS_LINESEARCH_BACKTRACKING_STRONG_WOLFE: strong Wolfe condition
|
||||||
|
- Updated the documentation to explain the above three criteria.
|
||||||
- Version 1.7 (2009-02-28):
|
- Version 1.7 (2009-02-28):
|
||||||
- Improved OWL-QN routines for stability.
|
- Improved OWL-QN routines for stability.
|
||||||
- Removed the support of OWL-QN method in MoreThuente algorithm because
|
- Removed the support of OWL-QN method in MoreThuente algorithm because
|
||||||
@ -658,8 +722,11 @@ method presented in:
|
|||||||
In <i>Proceedings of the 24th International Conference on Machine
|
In <i>Proceedings of the 24th International Conference on Machine
|
||||||
Learning (ICML 2007)</i>, pp. 33-40, 2007.
|
Learning (ICML 2007)</i>, pp. 33-40, 2007.
|
||||||
|
|
||||||
Special thanks go to Yoshimasa Tsuruoka and Daisuke Okanohara for technical
|
Special thanks go to:
|
||||||
information about OWL-QN.
|
- Yoshimasa Tsuruoka and Daisuke Okanohara for technical information about
|
||||||
|
OWL-QN
|
||||||
|
- Takashi Imamichi for the useful enhancements of the backtracking method
|
||||||
|
- Kevin S. Van Horn, Nic Schraudolph, and Tamas Nepusz for bug fixes
|
||||||
|
|
||||||
Finally I would like to thank the original author, Jorge Nocedal, who has been
|
Finally I would like to thank the original author, Jorge Nocedal, who has been
|
||||||
distributing the effieicnt and explanatory implementation in an open source
|
distributing the effieicnt and explanatory implementation in an open source
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* ANSI C implementation of vector operations.
|
* ANSI C implementation of vector operations.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007,2008,2009 Naoaki Okazaki
|
* Copyright (c) 2007-2010 Naoaki Okazaki
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
@ -23,7 +23,7 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: arithmetic_ansi.h 50 2009-02-16 15:14:23Z naoaki $ */
|
/* $Id$ */
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <memory.h>
|
#include <memory.h>
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* SSE2 implementation of vector oprations (64bit double).
|
* SSE2 implementation of vector oprations (64bit double).
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007,2008,2009 Naoaki Okazaki
|
* Copyright (c) 2007-2010 Naoaki Okazaki
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
@ -23,10 +23,12 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: arithmetic_sse_double.h 50 2009-02-16 15:14:23Z naoaki $ */
|
/* $Id$ */
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#ifndef __APPLE__
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#endif
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
|
|
||||||
#if 1400 <= _MSC_VER
|
#if 1400 <= _MSC_VER
|
||||||
@ -39,10 +41,15 @@
|
|||||||
|
|
||||||
inline static void* vecalloc(size_t size)
|
inline static void* vecalloc(size_t size)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER)
|
||||||
void *memblock = _aligned_malloc(size, 16);
|
void *memblock = _aligned_malloc(size, 16);
|
||||||
|
#elif defined(__APPLE__) /* OS X always aligns on 16-byte boundaries */
|
||||||
|
void *memblock = malloc(size);
|
||||||
#else
|
#else
|
||||||
void *memblock = memalign(16, size);
|
void *memblock = NULL, *p = NULL;
|
||||||
|
if (posix_memalign(&p, 16, size) == 0) {
|
||||||
|
memblock = p;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (memblock != NULL) {
|
if (memblock != NULL) {
|
||||||
memset(memblock, 0, size);
|
memset(memblock, 0, size);
|
||||||
@ -192,7 +199,7 @@ inline static void vecfree(void *memblock)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if 3 <= __SSE__
|
#if 3 <= __SSE__ || defined(__SSE3__)
|
||||||
/*
|
/*
|
||||||
Horizontal add with haddps SSE3 instruction. The work register (rw)
|
Horizontal add with haddps SSE3 instruction. The work register (rw)
|
||||||
is unused.
|
is unused.
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* SSE/SSE3 implementation of vector oprations (32bit float).
|
* SSE/SSE3 implementation of vector oprations (32bit float).
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007,2008,2009 Naoaki Okazaki
|
* Copyright (c) 2007-2010 Naoaki Okazaki
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
@ -23,10 +23,12 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: arithmetic_sse_float.h 50 2009-02-16 15:14:23Z naoaki $ */
|
/* $Id$ */
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#ifndef __APPLE__
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#endif
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
|
|
||||||
#if 1400 <= _MSC_VER
|
#if 1400 <= _MSC_VER
|
||||||
@ -45,7 +47,16 @@
|
|||||||
|
|
||||||
inline static void* vecalloc(size_t size)
|
inline static void* vecalloc(size_t size)
|
||||||
{
|
{
|
||||||
|
#if defined(_MSC_VER)
|
||||||
void *memblock = _aligned_malloc(size, 16);
|
void *memblock = _aligned_malloc(size, 16);
|
||||||
|
#elif defined(__APPLE__) /* OS X always aligns on 16-byte boundaries */
|
||||||
|
void *memblock = malloc(size);
|
||||||
|
#else
|
||||||
|
void *memblock = NULL, *p = NULL;
|
||||||
|
if (posix_memalign(&p, 16, size) == 0) {
|
||||||
|
memblock = p;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (memblock != NULL) {
|
if (memblock != NULL) {
|
||||||
memset(memblock, 0, size);
|
memset(memblock, 0, size);
|
||||||
}
|
}
|
||||||
@ -185,7 +196,7 @@ inline static void vecfree(void *memblock)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if 3 <= __SSE__
|
#if 3 <= __SSE__ || defined(__SSE3__)
|
||||||
/*
|
/*
|
||||||
Horizontal add with haddps SSE3 instruction. The work register (rw)
|
Horizontal add with haddps SSE3 instruction. The work register (rw)
|
||||||
is unused.
|
is unused.
|
@ -2,7 +2,7 @@
|
|||||||
* Limited memory BFGS (L-BFGS).
|
* Limited memory BFGS (L-BFGS).
|
||||||
*
|
*
|
||||||
* Copyright (c) 1990, Jorge Nocedal
|
* Copyright (c) 1990, Jorge Nocedal
|
||||||
* Copyright (c) 2007,2008,2009 Naoaki Okazaki
|
* Copyright (c) 2007-2010 Naoaki Okazaki
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
@ -24,7 +24,7 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: lbfgs.c 55 2009-02-23 14:51:21Z naoaki $ */
|
/* $Id$ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This library is a C port of the FORTRAN implementation of Limited-memory
|
This library is a C port of the FORTRAN implementation of Limited-memory
|
||||||
@ -65,6 +65,7 @@ licence.
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif/*HAVE_CONFIG_H*/
|
#endif/*HAVE_CONFIG_H*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@ -73,7 +74,6 @@ licence.
|
|||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define inline __inline
|
#define inline __inline
|
||||||
typedef unsigned int uint32_t;
|
|
||||||
#endif/*_MSC_VER*/
|
#endif/*_MSC_VER*/
|
||||||
|
|
||||||
#if defined(USE_SSE) && defined(__SSE2__) && LBFGS_FLOAT == 64
|
#if defined(USE_SSE) && defined(__SSE2__) && LBFGS_FLOAT == 64
|
||||||
@ -113,7 +113,7 @@ typedef struct tag_iteration_data iteration_data_t;
|
|||||||
static const lbfgs_parameter_t _defparam = {
|
static const lbfgs_parameter_t _defparam = {
|
||||||
6, 1e-5, 0, 1e-5,
|
6, 1e-5, 0, 1e-5,
|
||||||
0, LBFGS_LINESEARCH_DEFAULT, 40,
|
0, LBFGS_LINESEARCH_DEFAULT, 40,
|
||||||
1e-20, 1e20, 1e-4, 0.9, 1.0e-16,
|
1e-20, 1e20, 1e-4, 0.9, 0.9, 1.0e-16,
|
||||||
0.0, 0, -1,
|
0.0, 0, -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -290,7 +290,7 @@ int lbfgs(
|
|||||||
if (n % 8 != 0) {
|
if (n % 8 != 0) {
|
||||||
return LBFGSERR_INVALID_N_SSE;
|
return LBFGSERR_INVALID_N_SSE;
|
||||||
}
|
}
|
||||||
if (((unsigned short)x & 0x000F) != 0) {
|
if ((uintptr_t)(const void*)x % 16 != 0) {
|
||||||
return LBFGSERR_INVALID_X_SSE;
|
return LBFGSERR_INVALID_X_SSE;
|
||||||
}
|
}
|
||||||
#endif/*defined(USE_SSE)*/
|
#endif/*defined(USE_SSE)*/
|
||||||
@ -312,6 +312,12 @@ int lbfgs(
|
|||||||
if (param.ftol < 0.) {
|
if (param.ftol < 0.) {
|
||||||
return LBFGSERR_INVALID_FTOL;
|
return LBFGSERR_INVALID_FTOL;
|
||||||
}
|
}
|
||||||
|
if (param.linesearch == LBFGS_LINESEARCH_BACKTRACKING_WOLFE ||
|
||||||
|
param.linesearch == LBFGS_LINESEARCH_BACKTRACKING_STRONG_WOLFE) {
|
||||||
|
if (param.wolfe <= param.ftol || 1. <= param.wolfe) {
|
||||||
|
return LBFGSERR_INVALID_WOLFE;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (param.gtol < 0.) {
|
if (param.gtol < 0.) {
|
||||||
return LBFGSERR_INVALID_GTOL;
|
return LBFGSERR_INVALID_GTOL;
|
||||||
}
|
}
|
||||||
@ -347,8 +353,9 @@ int lbfgs(
|
|||||||
case LBFGS_LINESEARCH_MORETHUENTE:
|
case LBFGS_LINESEARCH_MORETHUENTE:
|
||||||
linesearch = line_search_morethuente;
|
linesearch = line_search_morethuente;
|
||||||
break;
|
break;
|
||||||
case LBFGS_LINESEARCH_BACKTRACKING:
|
case LBFGS_LINESEARCH_BACKTRACKING_ARMIJO:
|
||||||
case LBFGS_LINESEARCH_BACKTRACKING_STRONG:
|
case LBFGS_LINESEARCH_BACKTRACKING_WOLFE:
|
||||||
|
case LBFGS_LINESEARCH_BACKTRACKING_STRONG_WOLFE:
|
||||||
linesearch = line_search_backtracking;
|
linesearch = line_search_backtracking;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -483,7 +490,7 @@ int lbfgs(
|
|||||||
|
|
||||||
/* Report the progress. */
|
/* Report the progress. */
|
||||||
if (cd.proc_progress) {
|
if (cd.proc_progress) {
|
||||||
if (ret = cd.proc_progress(cd.instance, x, g, fx, xnorm, gnorm, step, cd.n, k, ls)) {
|
if ((ret = cd.proc_progress(cd.instance, x, g, fx, xnorm, gnorm, step, cd.n, k, ls))) {
|
||||||
goto lbfgs_exit;
|
goto lbfgs_exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -649,10 +656,10 @@ static int line_search_backtracking(
|
|||||||
const lbfgs_parameter_t *param
|
const lbfgs_parameter_t *param
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int ret = 0, count = 0;
|
int count = 0;
|
||||||
lbfgsfloatval_t width, dg, norm = 0.;
|
lbfgsfloatval_t width, dg;
|
||||||
lbfgsfloatval_t finit, dginit = 0., dgtest;
|
lbfgsfloatval_t finit, dginit = 0., dgtest;
|
||||||
const lbfgsfloatval_t wolfe = 0.9, dec = 0.5, inc = 2.1;
|
const lbfgsfloatval_t dec = 0.5, inc = 2.1;
|
||||||
|
|
||||||
/* Check the input parameters for errors. */
|
/* Check the input parameters for errors. */
|
||||||
if (*stp <= 0.) {
|
if (*stp <= 0.) {
|
||||||
@ -680,26 +687,33 @@ static int line_search_backtracking(
|
|||||||
|
|
||||||
++count;
|
++count;
|
||||||
|
|
||||||
if (*f <= finit + *stp * dgtest) {
|
if (*f > finit + *stp * dgtest) {
|
||||||
/* The sufficient decrease condition. */
|
|
||||||
|
|
||||||
if (param->linesearch == LBFGS_LINESEARCH_BACKTRACKING_STRONG) {
|
|
||||||
/* Check the strong Wolfe condition. */
|
|
||||||
vecdot(&dg, g, s, n);
|
|
||||||
if (dg > -wolfe * dginit) {
|
|
||||||
width = dec;
|
width = dec;
|
||||||
} else if (dg < wolfe * dginit) {
|
} else {
|
||||||
|
/* The sufficient decrease condition (Armijo condition). */
|
||||||
|
if (param->linesearch == LBFGS_LINESEARCH_BACKTRACKING_ARMIJO) {
|
||||||
|
/* Exit with the Armijo condition. */
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the Wolfe condition. */
|
||||||
|
vecdot(&dg, g, s, n);
|
||||||
|
if (dg < param->wolfe * dginit) {
|
||||||
width = inc;
|
width = inc;
|
||||||
} else {
|
} else {
|
||||||
/* Strong Wolfe condition. */
|
if(param->linesearch == LBFGS_LINESEARCH_BACKTRACKING_WOLFE) {
|
||||||
|
/* Exit with the regular Wolfe condition. */
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
/* Exit with the loose Wolfe condition. */
|
/* Check the strong Wolfe condition. */
|
||||||
return count;
|
if(dg > -param->wolfe * dginit) {
|
||||||
}
|
|
||||||
} else {
|
|
||||||
width = dec;
|
width = dec;
|
||||||
|
} else {
|
||||||
|
/* Exit with the strong Wolfe condition. */
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*stp < param->min_step) {
|
if (*stp < param->min_step) {
|
||||||
@ -735,7 +749,7 @@ static int line_search_backtracking_owlqn(
|
|||||||
const lbfgs_parameter_t *param
|
const lbfgs_parameter_t *param
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int i, ret = 0, count = 0;
|
int i, count = 0;
|
||||||
lbfgsfloatval_t width = 0.5, norm = 0.;
|
lbfgsfloatval_t width = 0.5, norm = 0.;
|
||||||
lbfgsfloatval_t finit = *f, dgtest;
|
lbfgsfloatval_t finit = *f, dgtest;
|
||||||
|
|
Reference in New Issue
Block a user