Skip to content

Instantly share code, notes, and snippets.

@mthomure
Last active May 25, 2017 18:13
Show Gist options
  • Save mthomure/4155c1702edba267ca3d79dee2a8e364 to your computer and use it in GitHub Desktop.
Save mthomure/4155c1702edba267ca3d79dee2a8e364 to your computer and use it in GitHub Desktop.
LBFGS via JNR
#include "lbfgs.h" // see https://github.com/stephenbeckr/L-BFGS-B-C/blob/master/src/lbfgsb.h
#include <stdio.h>
int test_setulb(integer *n, integer *m, double *x, double *l,
double *u, integer *nbd, double *f,
double *g, double *factr, double *pgtol, double *wa,
integer *iwa, integer *task,
integer *iprint, integer *csave,
logical *lsave, integer *isave, double *dsave) {
printf("test_setulb()\n");
printf("n: %ld\n", *n);
printf("m: %ld\n", *m);
printf("x:");
for (int i=0; i < *n; i++) {
printf(" %.2f", x[i]);
}
printf("\n");
printf("l:");
for (int i=0; i < *n; i++) {
printf(" %.2f", l[i]);
}
printf("\n");
printf("u:");
for (int i=0; i < *n; i++) {
printf(" %.2f", u[i]);
}
printf("\n");
printf("nbd:");
for (int i=0; i < *n; i++) {
printf(" %ld", nbd[i]);
}
printf("\n");
printf("f: %.2f\n", *f);
printf("g:"); for (int i=0; i < *n; i++) printf(" %.2f", g[i]); printf("\n");
printf("factr: %.2f\n", *factr);
printf("pgtol: %.2f\n", *pgtol);
printf("wa:"); for (int i=0; i < 4; i++) printf(" %.2f", wa[i]); printf("\n");
printf("iwa:"); for (int i=0; i < 4; i++) printf(" %.2ld", iwa[i]); printf("\n");
printf("task:"); for (int i=0; i < 4; i++) printf(" %ld", task[i]); printf("\n");
printf("iprint: %ld\n", *iprint);
printf("csave:"); for (int i=0; i < 4; i++) printf(" %ld", csave[i]); printf("\n");
printf("lsave:"); for (int i=0; i < 4; i++) printf(" %ld", lsave[i]); printf("\n");
printf("isave:"); for (int i=0; i < 4; i++) printf(" %ld", isave[i]); printf("\n");
printf("dsave:"); for (int i=0; i < 4; i++) printf(" %.2f", dsave[i]); printf("\n");
return 0;
}
(ns zeus.lbfgs
(:import [jnr.ffi LibraryLoader]
[jnr.ffi.byref IntByReference DoubleByReference NativeLongByReference]))
(definterface LibLbfgs
(^int
test_setulb
[^jnr.ffi.byref.NativeLongByReference n
^jnr.ffi.byref.NativeLongByReference m
^doubles x ;; [n]
^doubles l ;; [n]
^doubles u ;; [n]
^longs nbd ;; [n]
^jnr.ffi.byref.DoubleByReference f
^doubles g ;; [n]
^jnr.ffi.byref.DoubleByReference factr
^jnr.ffi.byref.DoubleByReference pgtol
^doubles wa
^longs iwa
^longs task ;; [60]
^jnr.ffi.byref.NativeLongByReference iprint
^longs csave ;; [60]
^longs lsave ;; [4]
^longs isave ;; [44]
^doubles dsave ;; [29]
]))
(defn -main [& args]
(let [lib (.load (LibraryLoader/create LibLbfgs) "lbfgsb")
n 25
m 5
x (range n)
l (range 100 (+ n 100))
u (range 200 (+ n 200))
nbd (range 300 (+ n 300))
f 13.5
g (range 400 (+ n 400))
factr 20.1
pgtol 31.2
wa (range 500 (+ n 500))
iwa (range 600 (+ n 600))
task (range 700 (+ n 700))
iprint -1
csave (range 800 (+ n 800))
lsave (range 900 (+ n 900))
isave (range 1000 (+ n 1000))
dsave (range 1100 (+ n 1100))
]
(.test_setulb lib
(NativeLongByReference. n)
(NativeLongByReference. m)
(into-array Double/TYPE x)
(into-array Double/TYPE l)
(into-array Double/TYPE u)
(into-array Long/TYPE nbd)
(DoubleByReference. f)
(into-array Double/TYPE g)
(DoubleByReference. factr)
(DoubleByReference. pgtol)
(into-array Double/TYPE wa)
(into-array Long/TYPE iwa)
(into-array Long/TYPE task)
(NativeLongByReference. iprint)
(into-array Long/TYPE csave)
(into-array Long/TYPE lsave)
(into-array Long/TYPE isave)
(into-array Double/TYPE dsave)
)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment