From d9430e083c1583090271a8fbdd82128a84a56c7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirill=20M=C3=BCller?= Date: Mon, 6 Jan 2025 05:24:09 +0100 Subject: [PATCH] vendor: Update vendored sources to igraph/igraph@2cdc20a37fe048143ac54a3fa8288bb017402e7c chore: update plfit fuzzer: use libxml2 2.13.5 chore(deps): bump codecov/codecov-action from 4 to 5 --- .../cigraph/vendor/plfit/arithmetic_ansi.h | 4 +- .../vendor/plfit/arithmetic_sse_double.h | 22 +- .../vendor/plfit/arithmetic_sse_float.h | 21 +- src/vendor/cigraph/vendor/plfit/lbfgs.c | 192 ++++++++++++++---- src/vendor/cigraph/vendor/plfit/lbfgs.h | 45 ++-- src/vendor/igraph_version.h | 4 +- 6 files changed, 221 insertions(+), 67 deletions(-) diff --git a/src/vendor/cigraph/vendor/plfit/arithmetic_ansi.h b/src/vendor/cigraph/vendor/plfit/arithmetic_ansi.h index 83ed11e6eb..fa390da37c 100644 --- a/src/vendor/cigraph/vendor/plfit/arithmetic_ansi.h +++ b/src/vendor/cigraph/vendor/plfit/arithmetic_ansi.h @@ -23,7 +23,7 @@ * THE SOFTWARE. */ -/* $Id: arithmetic_ansi.h 65 2010-01-29 12:19:16Z naoaki $ */ +/* $Id$ */ #include #include @@ -51,7 +51,7 @@ inline static void vecfree(void *memblock) inline static void vecset(lbfgsfloatval_t *x, const lbfgsfloatval_t c, const int n) { int i; - + for (i = 0;i < n;++i) { x[i] = c; } diff --git a/src/vendor/cigraph/vendor/plfit/arithmetic_sse_double.h b/src/vendor/cigraph/vendor/plfit/arithmetic_sse_double.h index a5575fed14..dcee5a9697 100644 --- a/src/vendor/cigraph/vendor/plfit/arithmetic_sse_double.h +++ b/src/vendor/cigraph/vendor/plfit/arithmetic_sse_double.h @@ -23,14 +23,12 @@ * THE SOFTWARE. */ -/* $Id: arithmetic_sse_double.h 65 2010-01-29 12:19:16Z naoaki $ */ +/* $Id$ */ #include - -#if !defined(__APPLE__) +#ifndef __APPLE__ #include #endif - #include #if 1400 <= _MSC_VER @@ -43,13 +41,15 @@ inline static void* vecalloc(size_t size) { -#ifdef _WIN32 +#if defined(_WIN32) void *memblock = _aligned_malloc(size, 16); -#elif defined(__APPLE__) - /* Memory on Mac OS X is already aligned to 16 bytes */ - void *memblock = malloc(size); +#elif defined(__APPLE__) /* OS X always aligns on 16-byte boundaries */ + void *memblock = malloc(size); #else - void *memblock = memalign(16, size); + void *memblock = NULL, *p = NULL; + if (posix_memalign(&p, 16, size) == 0) { + memblock = p; + } #endif if (memblock != NULL) { memset(memblock, 0, size); @@ -59,7 +59,7 @@ inline static void* vecalloc(size_t size) inline static void vecfree(void *memblock) { -#ifdef _WIN32 +#ifdef _MSC_VER _aligned_free(memblock); #else free(memblock); @@ -199,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) is unused. diff --git a/src/vendor/cigraph/vendor/plfit/arithmetic_sse_float.h b/src/vendor/cigraph/vendor/plfit/arithmetic_sse_float.h index b88f0e2340..f5691b1a1c 100644 --- a/src/vendor/cigraph/vendor/plfit/arithmetic_sse_float.h +++ b/src/vendor/cigraph/vendor/plfit/arithmetic_sse_float.h @@ -23,14 +23,12 @@ * THE SOFTWARE. */ -/* $Id: arithmetic_sse_float.h 65 2010-01-29 12:19:16Z naoaki $ */ +/* $Id$ */ #include - -#if !defined(__APPLE__) +#ifndef __APPLE__ #include #endif - #include #if 1400 <= _MSC_VER @@ -49,7 +47,16 @@ inline static void* vecalloc(size_t size) { +#if defined(_MSC_VER) 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) { memset(memblock, 0, size); } @@ -58,7 +65,11 @@ inline static void* vecalloc(size_t size) inline static void vecfree(void *memblock) { +#ifdef _MSC_VER _aligned_free(memblock); +#else + free(memblock); +#endif } #define vecset(x, c, n) \ @@ -189,7 +200,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) is unused. diff --git a/src/vendor/cigraph/vendor/plfit/lbfgs.c b/src/vendor/cigraph/vendor/plfit/lbfgs.c index 3f670940d5..6472a9aa26 100644 --- a/src/vendor/cigraph/vendor/plfit/lbfgs.c +++ b/src/vendor/cigraph/vendor/plfit/lbfgs.c @@ -24,7 +24,7 @@ * THE SOFTWARE. */ -/* $Id: lbfgs.c 65 2010-01-29 12:19:16Z naoaki $ */ +/* $Id$ */ /* This library is a C port of the FORTRAN implementation of Limited-memory @@ -62,14 +62,19 @@ licence. */ #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif/*HAVE_CONFIG_H*/ #include #include +#include #include -#include "lbfgs.h" +#include + +#ifdef _MSC_VER +#define inline __inline +#endif/*_MSC_VER*/ #if defined(USE_SSE) && defined(__SSE2__) && LBFGS_FLOAT == 64 /* Use SSE2 optimization for 64bit double precision. */ @@ -89,9 +94,6 @@ licence. #define max2(a, b) ((a) >= (b) ? (a) : (b)) #define max3(a, b, c) max2(max2((a), (b)), (c)); -#define is_aligned(p, bytes) \ - (((uintptr_t)(const void*)(p)) % (bytes) == 0) - struct tag_callback_data { int n; void *instance; @@ -130,7 +132,7 @@ typedef int (*line_search_proc)( callback_data_t *cd, const lbfgs_parameter_t *param ); - + static int line_search_backtracking( int n, lbfgsfloatval_t *x, @@ -224,10 +226,14 @@ static int round_out_variables(int n) lbfgsfloatval_t* lbfgs_malloc(int n) { + if (n < 0) { + return NULL; + } + #if defined(USE_SSE) && (defined(__SSE__) || defined(__SSE2__)) n = round_out_variables(n); #endif/*defined(USE_SSE)*/ - return (lbfgsfloatval_t*)vecalloc(sizeof(lbfgsfloatval_t) * (size_t) n); + return (lbfgsfloatval_t*)vecalloc(sizeof(lbfgsfloatval_t) * (size_t)n); } void lbfgs_free(lbfgsfloatval_t *x) @@ -288,7 +294,7 @@ int lbfgs( if (n % 8 != 0) { return LBFGSERR_INVALID_N_SSE; } - if (!is_aligned(x, 16)) { + if ((uintptr_t)(const void*)x % 16 != 0) { return LBFGSERR_INVALID_X_SSE; } #endif/*defined(USE_SSE)*/ @@ -362,11 +368,11 @@ int lbfgs( } /* Allocate working space. */ - xp = (lbfgsfloatval_t*)vecalloc((size_t) n * sizeof(lbfgsfloatval_t)); - g = (lbfgsfloatval_t*)vecalloc((size_t) n * sizeof(lbfgsfloatval_t)); - gp = (lbfgsfloatval_t*)vecalloc((size_t) n * sizeof(lbfgsfloatval_t)); - d = (lbfgsfloatval_t*)vecalloc((size_t) n * sizeof(lbfgsfloatval_t)); - w = (lbfgsfloatval_t*)vecalloc((size_t) n * sizeof(lbfgsfloatval_t)); + xp = (lbfgsfloatval_t*)vecalloc((size_t)n * sizeof(lbfgsfloatval_t)); + g = (lbfgsfloatval_t*)vecalloc((size_t)n * sizeof(lbfgsfloatval_t)); + gp = (lbfgsfloatval_t*)vecalloc((size_t)n * sizeof(lbfgsfloatval_t)); + d = (lbfgsfloatval_t*)vecalloc((size_t)n * sizeof(lbfgsfloatval_t)); + w = (lbfgsfloatval_t*)vecalloc((size_t)n * sizeof(lbfgsfloatval_t)); if (xp == NULL || g == NULL || gp == NULL || d == NULL || w == NULL) { ret = LBFGSERR_OUTOFMEMORY; goto lbfgs_exit; @@ -374,7 +380,7 @@ int lbfgs( if (param.orthantwise_c != 0.) { /* Allocate working space for OW-LQN. */ - pg = (lbfgsfloatval_t*)vecalloc((size_t) n * sizeof(lbfgsfloatval_t)); + pg = (lbfgsfloatval_t*)vecalloc((size_t)n * sizeof(lbfgsfloatval_t)); if (pg == NULL) { ret = LBFGSERR_OUTOFMEMORY; goto lbfgs_exit; @@ -382,7 +388,7 @@ int lbfgs( } /* Allocate limited memory storage. */ - lm = (iteration_data_t*)vecalloc((size_t) m * sizeof(iteration_data_t)); + lm = (iteration_data_t*)vecalloc((size_t)m * sizeof(iteration_data_t)); if (lm == NULL) { ret = LBFGSERR_OUTOFMEMORY; goto lbfgs_exit; @@ -393,8 +399,8 @@ int lbfgs( it = &lm[i]; it->alpha = 0; it->ys = 0; - it->s = (lbfgsfloatval_t*)vecalloc((size_t) n * sizeof(lbfgsfloatval_t)); - it->y = (lbfgsfloatval_t*)vecalloc((size_t) n * sizeof(lbfgsfloatval_t)); + it->s = (lbfgsfloatval_t*)vecalloc((size_t)n * sizeof(lbfgsfloatval_t)); + it->y = (lbfgsfloatval_t*)vecalloc((size_t)n * sizeof(lbfgsfloatval_t)); if (it->s == NULL || it->y == NULL) { ret = LBFGSERR_OUTOFMEMORY; goto lbfgs_exit; @@ -403,7 +409,7 @@ int lbfgs( /* Allocate an array for storing previous values of the objective function. */ if (0 < param.past) { - pf = (lbfgsfloatval_t*)vecalloc((size_t) param.past * sizeof(lbfgsfloatval_t)); + pf = (lbfgsfloatval_t*)vecalloc((size_t)param.past * sizeof(lbfgsfloatval_t)); } /* Evaluate the function value and its gradient. */ @@ -488,8 +494,7 @@ int lbfgs( /* Report the progress. */ if (cd.proc_progress) { - ret = cd.proc_progress(cd.instance, x, g, fx, xnorm, gnorm, step, cd.n, k, ls); - if (ret) { + if ((ret = cd.proc_progress(cd.instance, x, g, fx, xnorm, gnorm, step, cd.n, k, ls))) { goto lbfgs_exit; } } @@ -509,7 +514,7 @@ int lbfgs( /* Test for stopping criterion. The criterion is given by the following formula: - (f(past_x) - f(x)) / f(x) < \delta + |(f(past_x) - f(x))| / f(x) < \delta */ if (pf != NULL) { /* We don't test the stopping criterion while k < past. */ @@ -518,7 +523,7 @@ int lbfgs( rate = (pf[k % param.past] - fx) / fx; /* The stopping criterion. */ - if (rate < param.delta) { + if (fabs(rate) < param.delta) { ret = LBFGS_STOP; break; } @@ -639,6 +644,119 @@ int lbfgs( return ret; } +const char* lbfgs_strerror(int err) +{ + switch(err) { + case LBFGS_SUCCESS: + /* Also handles LBFGS_CONVERGENCE. */ + return "Success: reached convergence (gtol)."; + + case LBFGS_STOP: + return "Success: met stopping criteria (ftol)."; + + case LBFGS_ALREADY_MINIMIZED: + return "The initial variables already minimize the objective function."; + + case LBFGSERR_UNKNOWNERROR: + return "Unknown error."; + + case LBFGSERR_LOGICERROR: + return "Logic error."; + + case LBFGSERR_OUTOFMEMORY: + return "Insufficient memory."; + + case LBFGSERR_CANCELED: + return "The minimization process has been canceled."; + + case LBFGSERR_INVALID_N: + return "Invalid number of variables specified."; + + case LBFGSERR_INVALID_N_SSE: + return "Invalid number of variables (for SSE) specified."; + + case LBFGSERR_INVALID_X_SSE: + return "The array x must be aligned to 16 (for SSE)."; + + case LBFGSERR_INVALID_EPSILON: + return "Invalid parameter lbfgs_parameter_t::epsilon specified."; + + case LBFGSERR_INVALID_TESTPERIOD: + return "Invalid parameter lbfgs_parameter_t::past specified."; + + case LBFGSERR_INVALID_DELTA: + return "Invalid parameter lbfgs_parameter_t::delta specified."; + + case LBFGSERR_INVALID_LINESEARCH: + return "Invalid parameter lbfgs_parameter_t::linesearch specified."; + + case LBFGSERR_INVALID_MINSTEP: + return "Invalid parameter lbfgs_parameter_t::max_step specified."; + + case LBFGSERR_INVALID_MAXSTEP: + return "Invalid parameter lbfgs_parameter_t::max_step specified."; + + case LBFGSERR_INVALID_FTOL: + return "Invalid parameter lbfgs_parameter_t::ftol specified."; + + case LBFGSERR_INVALID_WOLFE: + return "Invalid parameter lbfgs_parameter_t::wolfe specified."; + + case LBFGSERR_INVALID_GTOL: + return "Invalid parameter lbfgs_parameter_t::gtol specified."; + + case LBFGSERR_INVALID_XTOL: + return "Invalid parameter lbfgs_parameter_t::xtol specified."; + + case LBFGSERR_INVALID_MAXLINESEARCH: + return "Invalid parameter lbfgs_parameter_t::max_linesearch specified."; + + case LBFGSERR_INVALID_ORTHANTWISE: + return "Invalid parameter lbfgs_parameter_t::orthantwise_c specified."; + + case LBFGSERR_INVALID_ORTHANTWISE_START: + return "Invalid parameter lbfgs_parameter_t::orthantwise_start specified."; + + case LBFGSERR_INVALID_ORTHANTWISE_END: + return "Invalid parameter lbfgs_parameter_t::orthantwise_end specified."; + + case LBFGSERR_OUTOFINTERVAL: + return "The line-search step went out of the interval of uncertainty."; + + case LBFGSERR_INCORRECT_TMINMAX: + return "A logic error occurred; alternatively, the interval of uncertainty" + " became too small."; + + case LBFGSERR_ROUNDING_ERROR: + return "A rounding error occurred; alternatively, no line-search step" + " satisfies the sufficient decrease and curvature conditions."; + + case LBFGSERR_MINIMUMSTEP: + return "The line-search step became smaller than lbfgs_parameter_t::min_step."; + + case LBFGSERR_MAXIMUMSTEP: + return "The line-search step became larger than lbfgs_parameter_t::max_step."; + + case LBFGSERR_MAXIMUMLINESEARCH: + return "The line-search routine reaches the maximum number of evaluations."; + + case LBFGSERR_MAXIMUMITERATION: + return "The algorithm routine reaches the maximum number of iterations."; + + case LBFGSERR_WIDTHTOOSMALL: + return "Relative width of the interval of uncertainty is at most" + " lbfgs_parameter_t::xtol."; + + case LBFGSERR_INVALIDPARAMETERS: + return "A logic error (negative line-search step) occurred."; + + case LBFGSERR_INCREASEGRADIENT: + return "The current search direction increases the objective function value."; + + default: + return "(unknown)"; + } +} static int line_search_backtracking( @@ -655,6 +773,9 @@ static int line_search_backtracking( const lbfgs_parameter_t *param ) { + (void)gp; + (void)wp; + int count = 0; lbfgsfloatval_t width, dg; lbfgsfloatval_t finit, dginit = 0., dgtest; @@ -822,6 +943,9 @@ static int line_search_morethuente( const lbfgs_parameter_t *param ) { + (void)gp; + (void)wa; + int count = 0; int brackt, stage1, uinfo = 0; lbfgsfloatval_t dg; @@ -1039,9 +1163,9 @@ static int line_search_morethuente( * @param du The value of f'(u). * @param v The value of another point, v. * @param fv The value of f(v). - * @param du The value of f'(v). - * @param xmin The maximum value. + * @param dv The value of f'(v). * @param xmin The minimum value. + * @param xmax The maximum value. */ #define CUBIC_MINIMIZER2(cm, u, fu, du, v, fv, dv, xmin, xmax) \ d = (v) - (u); \ @@ -1059,7 +1183,7 @@ static int line_search_morethuente( r = p / q; \ if (r < 0. && gamma != 0.) { \ (cm) = (v) - r * d; \ - } else if (a < 0) { \ + } else if (d > 0) { \ (cm) = (xmax); \ } else { \ (cm) = (xmin); \ @@ -1074,7 +1198,7 @@ static int line_search_morethuente( * @param v The value of another point, v. * @param fv The value of f(v). */ -#define QUARD_MINIMIZER(qm, u, fu, du, v, fv) \ +#define QUAD_MINIMIZER(qm, u, fu, du, v, fv) \ a = (v) - (u); \ (qm) = (u) + (du) / (((fu) - (fv)) / a + (du)) / 2 * a; @@ -1086,7 +1210,7 @@ static int line_search_morethuente( * @param v The value of another point, v. * @param dv The value of f'(v). */ -#define QUARD_MINIMIZER2(qm, u, du, v, dv) \ +#define QUAD_MINIMIZER2(qm, u, du, v, dv) \ a = (u) - (v); \ (qm) = (v) + (dv) / ((dv) - (du)) * a; @@ -1113,7 +1237,7 @@ static int line_search_morethuente( * @param brackt The pointer to the predicate if the trial value is * bracketed. * @retval int Status value. Zero indicates a normal termination. - * + * * @see * Jorge J. More and David J. Thuente. Line search algorithm with * guaranteed sufficient decrease. ACM Transactions on Mathematical @@ -1139,7 +1263,7 @@ static int update_trial_interval( lbfgsfloatval_t mc; /* minimizer of an interpolated cubic. */ lbfgsfloatval_t mq; /* minimizer of an interpolated quadratic. */ lbfgsfloatval_t newt; /* new trial value. */ - USES_MINIMIZER; /* for CUBIC_MINIMIZER and QUARD_MINIMIZER. */ + USES_MINIMIZER; /* for CUBIC_MINIMIZER and QUAD_MINIMIZER. */ /* Check the input parameters for errors. */ if (*brackt) { @@ -1170,7 +1294,7 @@ static int update_trial_interval( *brackt = 1; bound = 1; CUBIC_MINIMIZER(mc, *x, *fx, *dx, *t, *ft, *dt); - QUARD_MINIMIZER(mq, *x, *fx, *dx, *t, *ft); + QUAD_MINIMIZER(mq, *x, *fx, *dx, *t, *ft); if (fabs(mc - *x) < fabs(mq - *x)) { newt = mc; } else { @@ -1186,7 +1310,7 @@ static int update_trial_interval( *brackt = 1; bound = 0; CUBIC_MINIMIZER(mc, *x, *fx, *dx, *t, *ft, *dt); - QUARD_MINIMIZER2(mq, *x, *dx, *t, *dt); + QUAD_MINIMIZER2(mq, *x, *dx, *t, *dt); if (fabs(mc - *t) > fabs(mq - *t)) { newt = mc; } else { @@ -1206,7 +1330,7 @@ static int update_trial_interval( */ bound = 1; CUBIC_MINIMIZER2(mc, *x, *fx, *dx, *t, *ft, *dt, tmin, tmax); - QUARD_MINIMIZER2(mq, *x, *dx, *t, *dt); + QUAD_MINIMIZER2(mq, *x, *dx, *t, *dt); if (*brackt) { if (fabs(*t - mc) < fabs(*t - mq)) { newt = mc; @@ -1245,7 +1369,7 @@ static int update_trial_interval( x <- x, y <- t. - Case b: if f(t) <= f(x) && f'(t)*f'(x) > 0, x <- t, y <- y. - - Case c: if f(t) <= f(x) && f'(t)*f'(x) < 0, + - Case c: if f(t) <= f(x) && f'(t)*f'(x) < 0, x <- t, y <- x. */ if (*fx < *ft) { diff --git a/src/vendor/cigraph/vendor/plfit/lbfgs.h b/src/vendor/cigraph/vendor/plfit/lbfgs.h index f67277e080..8390ec3c79 100644 --- a/src/vendor/cigraph/vendor/plfit/lbfgs.h +++ b/src/vendor/cigraph/vendor/plfit/lbfgs.h @@ -24,7 +24,7 @@ * THE SOFTWARE. */ -/* $Id: lbfgs.h 65 2010-01-29 12:19:16Z naoaki $ */ +/* $Id$ */ #ifndef __LBFGS_H__ #define __LBFGS_H__ @@ -59,7 +59,7 @@ typedef double lbfgsfloatval_t; #endif -/** +/** * \addtogroup liblbfgs_api libLBFGS API * @{ * @@ -68,7 +68,7 @@ typedef double lbfgsfloatval_t; /** * Return values of lbfgs(). - * + * * Roughly speaking, a negative value indicates an error. */ enum { @@ -233,7 +233,7 @@ typedef struct { * (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. + * The default value is \c 1e-5. */ lbfgsfloatval_t delta; @@ -257,7 +257,7 @@ typedef struct { /** * 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. + * per iteration for the line search routine. The default value is \c 40. */ int max_linesearch; @@ -303,7 +303,7 @@ typedef struct { * 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 + * value. A typical small value is \c 0.1. This parameter should be * greater than the \ref ftol parameter (\c 1e-4) and smaller than * \c 1.0. */ @@ -365,7 +365,7 @@ typedef struct { * 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 @@ -502,19 +502,26 @@ void lbfgs_parameter_init(lbfgs_parameter_t *param); * when libLBFGS is built with SSE/SSE2 optimization routines. A user does * not have to use this function for libLBFGS built without SSE/SSE2 * optimization. - * + * * @param n The number of variables. */ lbfgsfloatval_t* lbfgs_malloc(int n); /** * Free an array of variables. - * + * * @param x The array of variables allocated by ::lbfgs_malloc * function. */ void lbfgs_free(lbfgsfloatval_t *x); +/** + * Get string description of an lbfgs() return code. + * + * @param err A value returned by lbfgs(). + */ +const char* lbfgs_strerror(int err); + /** @} */ __END_DECLS @@ -571,7 +578,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 interface. - Cross platform. The source code can be compiled on Microsoft Visual - Studio 2005, GNU C Compiler (gcc), etc. + Studio 2010, GNU C Compiler (gcc), etc. - Configurable precision: A user can choose single-precision (float) or double-precision (double) accuracy by changing ::LBFGS_FLOAT macro. - SSE/SSE2 optimization: @@ -585,17 +592,28 @@ This library is used by: - Classias: A collection of machine-learning algorithms for classification - mlegp: an R package for maximum likelihood estimates for Gaussian processes - imaging2: the imaging2 class library -- Algorithm::LBFGS - Perl extension for L-BFGS -- YAP-LBFGS (an interface to call libLBFGS from YAP Prolog) @section download Download -- Source code +- Source code +- GitHub repository libLBFGS is distributed under the term of the MIT license. +@section modules Third-party modules +- lbfgs: Limited-memory BFGS Optimization (a wrapper for R) maintained by Antonio Coppola. +- Algorithm::LBFGS - Perl extension for L-BFGS maintained by Lei Sun. +- YAP-LBFGS (an interface to call libLBFGS from YAP Prolog) maintained by Bernd Gutmann. + @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. @@ -716,6 +734,7 @@ Special thanks go to: - 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 distributing the effieicnt and explanatory implementation in an open source diff --git a/src/vendor/igraph_version.h b/src/vendor/igraph_version.h index de3a111a3c..0c4abbb35b 100644 --- a/src/vendor/igraph_version.h +++ b/src/vendor/igraph_version.h @@ -28,11 +28,11 @@ __BEGIN_DECLS -#define IGRAPH_VERSION "0.10.15-29-g082e2c6ba" +#define IGRAPH_VERSION "0.10.15-32-g2cdc20a37" #define IGRAPH_VERSION_MAJOR 0 #define IGRAPH_VERSION_MINOR 10 #define IGRAPH_VERSION_PATCH 15 -#define IGRAPH_VERSION_PRERELEASE "29-g082e2c6ba" +#define IGRAPH_VERSION_PRERELEASE "32-g2cdc20a37" IGRAPH_EXPORT void igraph_version(const char **version_string, int *major,