215 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 | 
						|
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 | 
						|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 | 
						|
  <head profile="http://www.w3.org/2005/10/profile">
 | 
						|
    <title>YAP-LBFGS</title>
 | 
						|
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
 | 
						|
    <meta http-equiv="language" content="english,en" />
 | 
						|
    <meta name="robots" content="index,follow" />
 | 
						|
    <meta name="revisit-after" content="14 days" />
 | 
						|
    <link rel="stylesheet" title="Main" type="text/css" href="style.css" />
 | 
						|
 </head>
 | 
						|
  <body>
 | 
						|
 | 
						|
<h1>YAP-LBFGS</h1>
 | 
						|
 | 
						|
<h2>What is YAP-LBFGS</h2>
 | 
						|
<p>YAP-LBFGS is an interface to call <a href="http://www.chokkan.org/software/liblbfgs/">libLBFGS</a> from within
 | 
						|
YAP. libLBFGS is a C library for Limited-memory
 | 
						|
Broyden-Fletcher-Goldfarb-Shanno (L-BFGS) solving the under-constrained
 | 
						|
minimization problem:</p>
 | 
						|
<p> minimize <span class="math">F(X), X=(x1,x2,..., xN)</span></p>
 | 
						|
<p><a href="http://www.dcc.fc.up.pt/~vsc/Yap/">YAP</a> (Yet Another
 | 
						|
Prolog) is a Prolog interpreter</p>
 | 
						|
<h2>Contact</h2>
 | 
						|
<p>YAP-LBFGS has been developed by Bernd Gutmann (<a
 | 
						|
href="http://www.cs.kuleuven.be/cgi-bin/e-post.pl?epost=bernd.gutmann">email</a>,
 | 
						|
<a href="http://www.cs.kuleuven.be/~bernd/">homepage</a>). In case you publish something using YAP-LBFGS, please give credit to me and to libLBFGS. And if you find YAP-LBFGS useful, or if you find a bug, or if you
 | 
						|
port it to another system, ... please send me an email.</p>
 | 
						|
 | 
						|
<h2>Download</h2>
 | 
						|
<p>Latest version (25.04.2009) <a href="yap-lbfgs.tgz">yap-lbfgs.tgz</a></p>
 | 
						|
 | 
						|
<h2>Installation</h2>
 | 
						|
<p>Note: The Make file is currently only working under Mac OS, but with little
 | 
						|
effort it is possible to adapt it to your needs.<br />
 | 
						|
And in case you are a C expert and can produce a better/more general Make file, please let me know.</p>
 | 
						|
<ol>
 | 
						|
  <li>Download and compile <a
 | 
						|
  href="http://www.chokkan.org/software/liblbfgs/">libLBFGS</a>.</li>
 | 
						|
  <li>Download and unpack YAP-LBFGS</li>
 | 
						|
  <li>Edit the Makefile of
 | 
						|
YAP-LBFGS and change the line <span class="code">LIBS= ../lib/lbfgs.o</span> to wherever the
 | 
						|
lbfgs.o file can be found.</li>
 | 
						|
  <li>Execute Make in the YAP-LBFGS folder</li>
 | 
						|
  <li>Run <span class="code">yap -l ex1.pl</span> and run the query
 | 
						|
  <span class="code">:-demo.</span> to see whether everything works fine.</li>
 | 
						|
</ol>
 | 
						|
 | 
						|
 | 
						|
<h2>License</h2>
 | 
						|
<p>  YAP-LBFGS is free software: you can redistribute it and/or modify
 | 
						|
  it under the terms of the GNU General Public License as published by
 | 
						|
  the Free Software Foundation, either version 3 of the License, or
 | 
						|
  (at your option) any later version.</p>
 | 
						|
<p> YAP-LBFGS is distributed in the hope that it will be useful,
 | 
						|
  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
  GNU General Public License for more details.</p>
 | 
						|
 | 
						|
<h2>Usage</h2>
 | 
						|
<p>The module lbfgs provides the following predicates after you loaded
 | 
						|
it by <span class="code">:-use_module(lbfgs).</span></p>
 | 
						|
<h3>optimizer_initialize(+N,+Module,+Evaluate,+Progress)</h3>
 | 
						|
<p>Create space to optimize a function with N variables (N has to be
 | 
						|
integer). <span class="code">Module</span> is the name of the module where the call back
 | 
						|
predicates can be found, <span class="code">Evaluate</span> is the call back predicate (arity 3)
 | 
						|
to evaluate the function math <span class="math">F</span>, <span class="code">Progress</span> is the call back predicate invoked
 | 
						|
(arity 8) after every iteration</p>
 | 
						|
<p>Example <span class="code">
 | 
						|
optimizer_initialize(1,user,evaluate,progress)</span></p>
 | 
						|
 | 
						|
<p>The evaluate call back predicate has to be of the type <span class="code">evaluate(-F,+N,+Step)</span>. It has to calculate the current function value <span class="code">F</span>. <span class="code">N</span> is the size of the parameter vector (the value which was used to initialize LBFGS) and <span class="code">Step</span> is the current state of the line search. The call back predicate can access the current values of <span class="math">x[i]</span> by calling <span class="code">optimizer_get_x(+I,-Xi)</span>. Finally, the call back predicate has to calculate the gradient of <span class="math">F</span> and set its value by calling <span class="code">optimizer_set_g(+I,+Gi)</span> for every <span class="math">1<=I<=N</span>.</p>
 | 
						|
 | 
						|
<p>The progress call back predicate has to be of the type <span class="code">progress(+F,+X_Norm,+G_Norm,+Step,+N,+Iteration,+LS,-Continue)</span>. It is called after every iteration. The call back predicate can access the current values of X and of the gradient by calling <span class="code">optimizer_get_x(+I,-Xi)</span> and <span class="code">optimizer_get_g(+I,-Gi)</span> respectively. Howver, it must not call the setter predicates for <span class="code">X</span> or <span class="code">G</span>. If it tries to do so, the optimizer will terminate with an error. If <span class="code">Continue</span> is set to 0 (int) the optimization process will continue for one more iteration, any other value will terminate the optimization process.</p>
 | 
						|
 | 
						|
<h3>optimizer_initialize(+N,+Evaluate,+Progress)</h3>
 | 
						|
<p>The same as before, except that the user module is the default
 | 
						|
value.</p>
 | 
						|
<p>Example <span class="code">
 | 
						|
optimizer_initialize(1,evaluate,progress)</span></p>
 | 
						|
 | 
						|
<h3>optimizer_run(-F,-Status)</h3>
 | 
						|
<p>Runs the optimization, <span class="code">F</span> is the best (minimal) function value and
 | 
						|
Status (int) is the status code returned by libLBFGS. Anything except
 | 
						|
0 indicates an error, see the <a href="http://www.chokkan.org/software/liblbfgs/group__liblbfgs__api.html#g06fc87d81c62e9abb8790b6e5713c55b">documentation of libLBFGS</a> for the
 | 
						|
meaning.</p>
 | 
						|
 | 
						|
<h3>optimizer_get_x(+I,-X)</h3>
 | 
						|
<p>Get the current value for <span class="math">x[I]</span>. Only possible when the optimizer is
 | 
						|
initialized or running.</p>
 | 
						|
 | 
						|
<h3>optimizer_set_x(+I,+X)</h3>
 | 
						|
<p>Set the current value for <span class="math">x[I]</span>. Only possible when the optimizer is
 | 
						|
initialized but not running.</p>
 | 
						|
 | 
						|
 | 
						|
<h3>optimizer_get_g(+I,-G)</h3>
 | 
						|
<p>Get the current value for <span class="math">g[I]</span> (the partial derivative of <span class="math">F</span> with respect to <span class="math">x[I]</span>). Only possible when the optimizer is
 | 
						|
initialized or running.</p>
 | 
						|
 | 
						|
<h3>optimizer_set_g(+I,+G)</h3>
 | 
						|
<p>Set the current value for <span class="math">g[I]</span> (the partial derivative of <span class="math">F</span> with
 | 
						|
respect to <span class="math">x[I]</span>). Can only be called from the evaluate call back predicate.</p>
 | 
						|
 | 
						|
<h3>  optimizer_finalize/0</h3>
 | 
						|
<p>Clean up the memory.</p>
 | 
						|
 | 
						|
 | 
						|
<h3>  optimizer_parameters/0</h3>
 | 
						|
<p>Prints a table with the current parameters. See the <a href="http://www.chokkan.org/software/liblbfgs/structlbfgs__parameter__t.html#_details">documentation
 | 
						|
of libLBFGS</a> for the meaning of each parameter.</p>
 | 
						|
<pre>
 | 
						|
   ?- optimizer_parameters.
 | 
						|
==========================================================================================
 | 
						|
Type      Name               Value          Description                   
 | 
						|
==========================================================================================
 | 
						|
int       m                  6              The number of corrections to approximate the inverse hessian matrix.
 | 
						|
float     epsilon            1e-05          Epsilon for convergence test. 
 | 
						|
int       past               0              Distance for delta-based convergence test.
 | 
						|
float     delta              1e-05          Delta for convergence test.   
 | 
						|
int       max_iterations     0              The maximum number of iterations
 | 
						|
int       linesearch         0              The line search algorithm.    
 | 
						|
int       max_linesearch     40             The maximum number of trials for the line search.
 | 
						|
float     min_step           1e-20          The minimum step of the line search routine.
 | 
						|
float     max_step           1e+20          The maximum step of the line search.
 | 
						|
float     ftol               0.0001         A parameter to control the accuracy of the line search routine.
 | 
						|
float     gtol               0.9            A parameter to control the accuracy of the line search routine.
 | 
						|
float     xtol               1e-16          The machine precision for floating-point values.
 | 
						|
float     orthantwise_c      0.0            Coefficient for the L1 norm of variables
 | 
						|
int       orthantwise_start  0              Start index for computing the L1 norm of the variables.
 | 
						|
int       orthantwise_end    -1             End index for computing the L1 norm of the variables.
 | 
						|
==========================================================================================
 | 
						|
 use optimizer_set_paramater(Name,Value) to change parameters
 | 
						|
 use optimizer_get_parameter(Name,Value) to see current parameters
 | 
						|
 use optimizer_parameters to print this overview
 | 
						|
</pre>
 | 
						|
 | 
						|
<h3>  optimizer_set_parameter(+Name,+Value)</h3>
 | 
						|
<p>Set the parameter Name to Value. Only possible while the optimizer
 | 
						|
is not running.</p>
 | 
						|
 | 
						|
<h3>  optimizer_get_parameter(+Name,-Value)</h3>
 | 
						|
<p>Get the current Value for Name</p>
 | 
						|
 | 
						|
 | 
						|
<h2>Demo</h2>
 | 
						|
 | 
						|
<p>The following Prolog program (<span class="code">ex1.pl</span>) searches for minimas of the function
 | 
						|
<span class="math">f(x0)=sin(x0)</span>. In order to do so, it provides the call back
 | 
						|
predicate <span class="code">evaluate</span> which calculates <span class="math">f(x0)</span> and the gradient <span class="math">d/dx0 f=cos(x0)</span>.</p>
 | 
						|
<pre>
 | 
						|
:- use_module(lbfgs).
 | 
						|
 | 
						|
% This is the call back function which evaluates F and the gradient of F
 | 
						|
evaluate(FX,_N,_Step) :-
 | 
						|
	optimizer_get_x(0,X0),
 | 
						|
	FX is sin(X0),
 | 
						|
	G0 is cos(X0),
 | 
						|
	optimizer_set_g(0,G0).
 | 
						|
 | 
						|
% This is the call back function which is invoked to report the progress
 | 
						|
% if the last argument is set to anything else than 0, the optimizer will
 | 
						|
% stop right now
 | 
						|
progress(FX,X_Norm,G_Norm,Step,_N,Iteration,Ls,0) :-
 | 
						|
	optimizer_get_x(0,X0),
 | 
						|
	format('~d. Iteration : x0=~4f  f(X)=~4f  |X|=~4f
 | 
						|
                |X\'|=~4f  Step=~4f  Ls=~4f~n',
 | 
						|
                [Iteration,X0,FX,X_Norm,G_Norm,Step,Ls]).
 | 
						|
 | 
						|
 | 
						|
 | 
						|
demo :-
 | 
						|
	format('Optimizing the function f(x0) = sin(x0)~n',[]),
 | 
						|
	optimizer_initialize(1,evaluate,progress),
 | 
						|
 | 
						|
 | 
						|
	StartX is random*10,
 | 
						|
	format('We start the search at the random position x0=~5f~2n',[StartX]),
 | 
						|
	optimizer_set_x(0,StartX),
 | 
						|
	
 | 
						|
	optimizer_run(BestF,Status),
 | 
						|
	optimizer_get_x(0,BestX0),
 | 
						|
	optimizer_finalize,
 | 
						|
	format('~2nOptimization done~nWe found a minimum at
 | 
						|
	f(~f)=~f~2nLBFGS Status=~w~n',[BestX0,BestF,Status]).
 | 
						|
</pre>
 | 
						|
<p>The output of this program is something like:</p>
 | 
						|
<pre>
 | 
						|
   ?- demo.
 | 
						|
Optimizing the function f(x0) = sin(x0)
 | 
						|
We start the search at the random position x0=7.24639
 | 
						|
 | 
						|
1. Iteration : x0=5.0167  f(X)=-0.9541  |X|=5.0167  |X'|=0.2996  Step=3.9057  Ls=3.0000
 | 
						|
2. Iteration : x0=4.7708  f(X)=-0.9983  |X|=4.7708  |X'|=0.0584  Step=0.0998  Ls=2.0000
 | 
						|
3. Iteration : x0=4.7113  f(X)=-1.0000  |X|=4.7113  |X'|=0.0011  Step=1.0000  Ls=1.0000
 | 
						|
4. Iteration : x0=4.7124  f(X)=-1.0000  |X|=4.7124  |X'|=0.0000  Step=1.0000  Ls=1.0000
 | 
						|
 | 
						|
 | 
						|
Optimization done
 | 
						|
We found a minimum at f(4.712390)=-1.000000
 | 
						|
 | 
						|
LBFGS Status=0
 | 
						|
yes
 | 
						|
   ?-
 | 
						|
</pre>
 | 
						|
 | 
						|
<p><a href="http://www.validome.org/referer">
 | 
						|
<img id="valimg"
 | 
						|
    src="http://www.validome.org/images/set3/valid_xhtml_1_0.gif"
 | 
						|
    alt="Valid XHTML 1.0" width="80" height="15" /></a>
 | 
						|
 | 
						|
</p>
 | 
						|
 | 
						|
</body>
 | 
						|
</html> |