Go L-BFGS-B is software for solving numerical optimization problems using the limited-memory (L) Broyden-Fletcher-Goldfarb-Shanno (BFGS) algorithm with bounds constraints (B). L-BFGS-B is a deterministic, gradient-based algorithm for finding local minima of smooth, continuous objective functions subject to bounds on each variable. The bounds are optional, so this software also solves unconstrained problems. L-BFGS-B is accurate and efficient for problems of 1000s of variables. There is more information about L-BFGS-B on Wikipedia or in your favorite optimization textbook.
This software provides modern, intuitive interfaces to the L-BFGS-B Fortran software by the authors of the algorithm, Jorge Nocedal et al. Interfaces are provided for Go (Golang), C, and Fortran 2003.
This is a fork of go-lbfgsb by @afbarnard. Here I (@idavydov) have fixed a bug related to the change of cgo rules. I hope eventially my fix gets accepted to the mainstream. For now you can use this repository in your imports. Also with go 1.7 or later you can install without make. The rest of the README is mostly kept unchanged.
Go L-BFGS-B is free, open source software. You are permitted to copy
and use it however you wish. It is released under the BSD 2-Clause
License. See the file LICENSE.txt
in your distribution (or on
GitHub)
for details.
The original Fortran code is released under the BSD 3-Clause License
(see lbfgsb/License.txt
in your distribution or on
GitHub).
Since I have not modified the Fortran code, I have decided just to
incorporate it rather than re-license it.
Go L-BFGS-B is version 0.1.0.
This software is young, but has already been useful and reliable in a machine learning application.
-
Simple API allowing Go programs to easily do efficient, accurate optimization. You only need to provide functions (or an object) that evaluate the objective function value and gradient.
-
Bounds constraints allow typical, simple inequality (box) constraints on individual variables without needing a more specialized algorithm.
-
Incorporates recent improvements and corrections to L-BFGS-B algorithm. (Uses L-BFGS-B version 3.0 from March, 2011.)
-
Customizable logging.
-
Modern (Fortran 2003) API for original FORTRAN 77 optimizer.
-
C API for original FORTRAN 77 optimizer.
-
Customizable termination conditions.
The architecture of this software has two main pieces: a library with a C API (but written in modern Fortran), and a Go package providing the functionality of the library as a Go API. The library is designed to be used from both Fortran and C, and so could work with other languages besides Go.
I have endeavored to make this a good Go-Fortran interface example as well as a useful package. Accordingly, I have included my experimental interface prototype code to be used for learning and experimenting with Cgo and interfaces between Go and C (or Fortran). However, let me know about (or contribute!) possible improvements.
Building this software requires:
-
Fortran 2003 compiler with support for procedure pointers, such as GCC 4.4.6 or later (gfortran)
-
Go 1.0 or later
-
Standard development tools: make, ar, ld.
If you are using Go 1.7 or later you can install go-lbfgsb just with
go get
.
[go-wrkspc]$ go get github.com/idavydov/go-lbfgsb
With older versions of Go you have to download, build, and install this package, but it is not quite fully automatic: there is an intervening step to compile the Fortran code. This is needed because the Go compilers before 1.7 did not know Fortran.
-
Download. Using
go get
requiresgit
. If you want to download the latest code after having downloaded this package previously, add the update flag (-u
) to the command. The-d
flag tells Go to only download the code and not build or install the package.[go-wrkspc]$ go get -d github.com/idavydov/go-lbfgsb
-
Build Fortran. Change to the directory containing the downloaded package and run make. The workspace that Go uses to download and install packages is the first workspace in your GOPATH, or the Go installation directory if GOPATH is empty.
[go-wrkspc]$ echo $GOPATH /home/go-pkgs:/home/go-wrkspc [go-wrkspc]$ cd ~/go-pkgs/src/github.com/idavydov/go-lbfgsb [go-lbfgsb]$ make [go-lbfgsb]$ cd ~/go-wrkspc
-
Build, install Go. Run
go get
again to complete the Go installation. This builds and installs the package.[go-wrkspc]$ go get github.com/idavydov/go-lbfgsb
-
Use. Import the
go-lbfgsb
package into your Go program. Build your program normally.import lbfgsb "github.com/idavydov/go-lbfgsb"
[main-prog]$ go build
If you do not want to use go get
, you can download this package
manually and make it part of your Go workspace.
-
Download. Get a project release archive from GitHub.
-
Install. Extract the release archive into your Go workspace.
[go-wrkspc]$ tar -zxf ~/downloads/go-lbfsgb-1.2.3.tar.gz --directory optim
-
Build. Run make in the package directory.
[go-wrkspc]$ cd optim/go-lbfgsb-1.2.3 [go-lbfgsb-1.2.3]$ make [go-lbfgsb-1.2.3]$ cd ~/go-wrkspc
-
Use. Import the package as a local package and build normally.
import lbfgsb "optim/go-lbfgsb-1.2.3"
[main-prog]$ go build
Contributions of all sorts, patches, bugs, issues, questions, etc. are welcome, but are most welcome after due diligence. Contact the author by creating a new issue. Contribute to the project by forking it, hacking, and issuing pull requests.
Copyright (c) 2013 Aubrey Barnard. This is free software. See LICENSE.txt for details.