From 16b94d08ac1196823d7e3daf787b85813ba33e6e Mon Sep 17 00:00:00 2001 From: astrojhgu Date: Tue, 27 Jul 2010 16:43:48 +0000 Subject: git-svn-id: file:///home/svn/opt_utilities@131 ed2142bd-67ad-457f-ba7c-d818d4011675 --- math/num_diff.hpp | 3 +- methods/lbfgs/arithmetic_ansi.h | 31 +------- methods/lbfgs/lbfgs.cpp | 6 +- methods/lbfgs/lbfgs.hpp | 169 ---------------------------------------- methods/lbfgs/lbfgs_method.hpp | 169 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 175 insertions(+), 203 deletions(-) delete mode 100644 methods/lbfgs/lbfgs.hpp create mode 100644 methods/lbfgs/lbfgs_method.hpp diff --git a/math/num_diff.hpp b/math/num_diff.hpp index 2d2e67d..6f07c27 100644 --- a/math/num_diff.hpp +++ b/math/num_diff.hpp @@ -38,7 +38,6 @@ namespace opt_utilities rT ep=std::sqrt(std::numeric_limits::epsilon()); rT result; - pT p_tmp; typename element_type_trait::element_type old_value=get_element(p,n); @@ -47,7 +46,7 @@ namespace opt_utilities set_element(p,n,old_value+h); rT v2=f(p); set_element(p,n,old_value-h); - rT v1=f(p_tmp); + rT v1=f(p); set_element(p,n,old_value); result=(v2-v1)/h/2; return result; diff --git a/methods/lbfgs/arithmetic_ansi.h b/methods/lbfgs/arithmetic_ansi.h index c58c98a..c071245 100644 --- a/methods/lbfgs/arithmetic_ansi.h +++ b/methods/lbfgs/arithmetic_ansi.h @@ -1,32 +1,5 @@ -/* - * ANSI C implementation of vector operations. - * - * Copyright (c) 2007-2010 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: arithmetic_ansi.h 65 2010-01-29 12:19:16Z naoaki $ */ - -#include -#include +#include +#include #if LBFGS_FLOAT == 32 && LBFGS_IEEE_FLOAT #define fsigndiff(x, y) (((*(uint32_t*)(x)) ^ (*(uint32_t*)(y))) & 0x80000000U) diff --git a/methods/lbfgs/lbfgs.cpp b/methods/lbfgs/lbfgs.cpp index d7b5494..6ce9a3b 100644 --- a/methods/lbfgs/lbfgs.cpp +++ b/methods/lbfgs/lbfgs.cpp @@ -1,6 +1,6 @@ -#include -#include -#include +#include +#include +#include #include "arithmetic_ansi.h" diff --git a/methods/lbfgs/lbfgs.hpp b/methods/lbfgs/lbfgs.hpp deleted file mode 100644 index 112d50e..0000000 --- a/methods/lbfgs/lbfgs.hpp +++ /dev/null @@ -1,169 +0,0 @@ -#ifndef BFGS_METHOD -#define BFGS_METHOD -#define OPT_HEADER -#include -//#include -#include -#include -#include -#include "../linmin/linmin.hpp" -#include -#include -#include -#include -#include -#include -#include "lbfgs.h" -#include "lbfgs.cpp" -/* - * -*/ -#include -using std::cerr; -using std::endl; - -namespace opt_utilities -{ - - template - lbfgsfloatval_t lbfgs_adapter( - void *instance, - const lbfgsfloatval_t *x, - lbfgsfloatval_t *g, - const int n, - const lbfgsfloatval_t step - ) - { - pT px; - resize(px,n); - for(int i=0;i*)instance)->eval(px); - pT grad(gradient(*static_cast*>(instance),px)); - for(int i=0;i - class lbfgs_method - :public opt_method - { - public: - typedef pT array1d_type; - typedef rT T; - private: - func_obj* p_fo; - optimizer* p_optimizer; - - //typedef blitz::Array array2d_type; - - - private: - array1d_type start_point; - array1d_type end_point; - - private: - rT threshold; - private: - rT func(const pT& x) - { - assert(p_fo!=0); - return p_fo->eval(x); - } - - - public: - lbfgs_method() - :threshold(1e-4) - {} - - virtual ~lbfgs_method() - { - }; - - lbfgs_method(const lbfgs_method& rhs) - :p_fo(rhs.p_fo),p_optimizer(rhs.p_optimizer), - start_point(rhs.start_point), - end_point(rhs.end_point), - threshold(rhs.threshold) - { - } - - lbfgs_method& operator=(const lbfgs_method& rhs) - { - threshold=rhs.threshold; - p_fo=rhs.p_fo; - p_optimizer=rhs.p_optimizer; - opt_eq(start_point,rhs.start_point); - opt_eq(end_point,rhs.end_point); - } - - opt_method* do_clone()const - { - return new lbfgs_method(*this); - } - - void do_set_start_point(const array1d_type& p) - { - start_point.resize(get_size(p)); - opt_eq(start_point,p); - - } - - array1d_type do_get_start_point()const - { - return start_point; - } - - void do_set_precision(rT t) - { - threshold=t; - } - - rT do_get_precision()const - { - return threshold; - } - - void do_set_optimizer(optimizer& o) - { - p_optimizer=&o; - p_fo=p_optimizer->ptr_func_obj(); - } - - - - pT do_optimize() - { - lbfgs_parameter_t param; - lbfgs_parameter_init(¶m); - param.ftol=threshold; - std::vector buffer(get_size(start_point)); - for(int i=0;i,0,p_fo,¶m); - for(int i=0;i +//#include +#include +#include +#include +#include "../linmin/linmin.hpp" +#include +#include +#include +#include +#include +#include +#include "lbfgs.h" +#include "lbfgs.cpp" +/* + * +*/ +#include +using std::cerr; +using std::endl; + +namespace opt_utilities +{ + + template + lbfgsfloatval_t lbfgs_adapter( + void *instance, + const lbfgsfloatval_t *x, + lbfgsfloatval_t *g, + const int n, + const lbfgsfloatval_t step + ) + { + pT px; + resize(px,n); + for(int i=0;i*)instance)->eval(px); + pT grad(gradient(*static_cast*>(instance),px)); + for(int i=0;i + class lbfgs_method + :public opt_method + { + public: + typedef pT array1d_type; + typedef rT T; + private: + func_obj* p_fo; + optimizer* p_optimizer; + + //typedef blitz::Array array2d_type; + + + private: + array1d_type start_point; + array1d_type end_point; + + private: + rT threshold; + private: + rT func(const pT& x) + { + assert(p_fo!=0); + return p_fo->eval(x); + } + + + public: + lbfgs_method() + :threshold(1e-4) + {} + + virtual ~lbfgs_method() + { + }; + + lbfgs_method(const lbfgs_method& rhs) + :p_fo(rhs.p_fo),p_optimizer(rhs.p_optimizer), + start_point(rhs.start_point), + end_point(rhs.end_point), + threshold(rhs.threshold) + { + } + + lbfgs_method& operator=(const lbfgs_method& rhs) + { + threshold=rhs.threshold; + p_fo=rhs.p_fo; + p_optimizer=rhs.p_optimizer; + opt_eq(start_point,rhs.start_point); + opt_eq(end_point,rhs.end_point); + } + + opt_method* do_clone()const + { + return new lbfgs_method(*this); + } + + void do_set_start_point(const array1d_type& p) + { + start_point.resize(get_size(p)); + opt_eq(start_point,p); + + } + + array1d_type do_get_start_point()const + { + return start_point; + } + + void do_set_precision(rT t) + { + threshold=t; + } + + rT do_get_precision()const + { + return threshold; + } + + void do_set_optimizer(optimizer& o) + { + p_optimizer=&o; + p_fo=p_optimizer->ptr_func_obj(); + } + + + + pT do_optimize() + { + lbfgs_parameter_t param; + lbfgs_parameter_init(¶m); + param.ftol=threshold; + std::vector buffer(get_size(start_point)); + for(int i=0;i,0,p_fo,¶m); + for(int i=0;i