lbfgsb 0.3.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -0
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/ext/lbfgsb/extconf.rb +12 -3
- data/ext/lbfgsb/lbfgsbext.c +66 -45
- data/ext/lbfgsb/lbfgsbext.h +3 -1
- data/ext/lbfgsb/src/blas.c +27 -31
- data/ext/lbfgsb/src/blas.h +5 -5
- data/ext/lbfgsb/src/common.h +16 -0
- data/ext/lbfgsb/src/lbfgsb.c +305 -406
- data/ext/lbfgsb/src/lbfgsb.h +70 -109
- data/ext/lbfgsb/src/linpack.c +69 -68
- data/ext/lbfgsb/src/linpack.h +3 -3
- data/lib/lbfgsb/version.rb +1 -1
- data/lib/lbfgsb.rb +1 -1
- data/sig/lbfgsb.rbs +31 -0
- metadata +9 -12
- data/.github/workflows/build.yml +0 -21
- data/.gitignore +0 -17
- data/.rspec +0 -3
- data/.yardopts +0 -1
- data/Gemfile +0 -8
- data/Rakefile +0 -15
- data/lbfgsb.gemspec +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0558e429ff4c590e681165e0af885de04e9b78d4d679afc89f9c0bcfc1b2764
|
4
|
+
data.tar.gz: 5e1a8a157614da1a8541fbe28aad8cb04bf4096a4d3022f1b519c35abf071544
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66997d33a6fd0fb750ae236934fa866a94592161cbba49375bd7d46d94a9c98f0177cd207431d24cd1812bbf10be050106c941de9ac972f7699d0687b97a41c8
|
7
|
+
data.tar.gz: d8ba46b919591239180642f9a45fe5f14337f2aa703ac527ba533449c647be4b64de700a49a88616019241010d37e6118904c992c3886ed7e44c620f771cadc9
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,29 @@
|
|
1
|
+
## 0.5.0
|
2
|
+
- Add build option to select FORTRAN integer bit size.
|
3
|
+
|
4
|
+
```
|
5
|
+
$ gem install lbfgsb -- --with-use-int64
|
6
|
+
```
|
7
|
+
|
8
|
+
- Add build option to use any blas library.
|
9
|
+
|
10
|
+
```
|
11
|
+
$ gem install lbfgsb -- --with-blas-dir=/opt/local/openblas/lib --with-blas-lib=openblas
|
12
|
+
```
|
13
|
+
|
14
|
+
- Change to use 32-bit integer for FORTRAN integer in internal functions by default.
|
15
|
+
- Introduce conventional commits.
|
16
|
+
|
17
|
+
## 0.4.1
|
18
|
+
- Remove dependent gem's type declaration file from installation files.
|
19
|
+
|
20
|
+
## 0.4.0
|
21
|
+
- Add type declaration file: sig/lbfgsb.rbs
|
22
|
+
|
23
|
+
## 0.3.2
|
24
|
+
- Refactor native extension codes.
|
25
|
+
- Update documentations.
|
26
|
+
|
1
27
|
## 0.3.1
|
2
28
|
- Add GC guard to narray given to native extension method.
|
3
29
|
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[![Build Status](https://github.com/yoshoku/lbfgsb.rb/workflows/build/badge.svg)](https://github.com/yoshoku/lbfgsb.rb/actions?query=workflow%3Abuild)
|
4
4
|
[![Gem Version](https://badge.fury.io/rb/lbfgsb.svg)](https://badge.fury.io/rb/lbfgsb)
|
5
|
-
[![BSD 3-Clause License](https://img.shields.io/badge/License-BSD%203--Clause-orange.svg)](https://github.com/yoshoku/suika/blob/
|
5
|
+
[![BSD 3-Clause License](https://img.shields.io/badge/License-BSD%203--Clause-orange.svg)](https://github.com/yoshoku/suika/blob/main/LICENSE.txt)
|
6
6
|
[![Documentation](http://img.shields.io/badge/api-reference-blue.svg)](https://yoshoku.github.io/lbfgsb.rb/doc/)
|
7
7
|
|
8
8
|
Lbfgsb.rb is a Ruby binding for [L-BFGS-B](http://users.iems.northwestern.edu/~nocedal/lbfgsb.html)
|
data/ext/lbfgsb/extconf.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
require 'numo/narray'
|
3
3
|
|
4
|
+
$defs << '-DUSE_INT64' if with_config('use-int64', false)
|
5
|
+
|
4
6
|
$LOAD_PATH.each do |lp|
|
5
7
|
if File.exist?(File.join(lp, 'numo/numo/narray.h'))
|
6
8
|
$INCFLAGS = "-I#{lp}/numo #{$INCFLAGS}"
|
@@ -26,10 +28,17 @@ if RUBY_PLATFORM =~ /mswin|cygwin|mingw/
|
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
29
|
-
$srcs = Dir.glob("#{$srcdir}
|
30
|
-
|
31
|
+
$srcs = Dir.glob("#{$srcdir}/**/*.c").map { |path| File.basename(path) }
|
32
|
+
|
33
|
+
blas_dir = with_config('blas-dir')
|
34
|
+
$LDFLAGS = "-L#{blas_dir} #{$LDFLAGS}" unless blas_dir.nil?
|
35
|
+
|
36
|
+
blas_lib = with_config('blas-lib')
|
37
|
+
unless blas_lib.nil?
|
38
|
+
abort "#{blas_lib} not found." unless have_library(blas_lib)
|
39
|
+
$srcs.delete('blas.c')
|
40
|
+
end
|
31
41
|
|
32
|
-
$INCFLAGS << " -I$(srcdir)/src"
|
33
42
|
$VPATH << "$(srcdir)/src"
|
34
43
|
|
35
44
|
create_makefile('lbfgsb/lbfgsbext')
|
data/ext/lbfgsb/lbfgsbext.c
CHANGED
@@ -2,40 +2,46 @@
|
|
2
2
|
|
3
3
|
VALUE rb_mLbfgsb;
|
4
4
|
|
5
|
-
static
|
6
|
-
VALUE
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
long max_iter = NUM2LONG(maxiter);
|
5
|
+
static VALUE lbfgsb_min_l_bfgs_b(VALUE self, VALUE fnc, VALUE x_val, VALUE jcb, VALUE args, VALUE l_val, VALUE u_val,
|
6
|
+
VALUE nbd_val, VALUE maxcor, VALUE ftol, VALUE gtol, VALUE maxiter, VALUE disp) {
|
7
|
+
F77_int n_iter;
|
8
|
+
F77_int n_fev;
|
9
|
+
F77_int n_jev;
|
10
|
+
#ifdef USE_INT64
|
11
|
+
F77_int max_iter = NUM2LONG(maxiter);
|
12
|
+
#else
|
13
|
+
F77_int max_iter = NUM2INT(maxiter);
|
14
|
+
#endif
|
16
15
|
narray_t* x_nary;
|
17
16
|
narray_t* l_nary;
|
18
17
|
narray_t* u_nary;
|
19
18
|
narray_t* nbd_nary;
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
F77_int n;
|
20
|
+
#ifdef USE_INT64
|
21
|
+
F77_int m = NUM2LONG(maxcor);
|
22
|
+
#else
|
23
|
+
F77_int m = NUM2INT(maxcor);
|
24
|
+
#endif
|
25
|
+
double* x_ptr;
|
26
|
+
double* l_ptr;
|
27
|
+
double* u_ptr;
|
28
|
+
F77_int* nbd_ptr;
|
26
29
|
double f;
|
27
|
-
double
|
30
|
+
double* g;
|
28
31
|
double factr = NUM2DBL(ftol);
|
29
32
|
double pgtol = NUM2DBL(gtol);
|
30
33
|
double* wa;
|
31
|
-
|
34
|
+
F77_int* iwa;
|
32
35
|
char task[60];
|
33
|
-
|
36
|
+
#ifdef USE_INT64
|
37
|
+
F77_int iprint = NIL_P(disp) ? -1 : NUM2LONG(disp);
|
38
|
+
#else
|
39
|
+
F77_int iprint = NIL_P(disp) ? -1 : NUM2INT(disp);
|
40
|
+
#endif
|
34
41
|
char csave[60];
|
35
|
-
|
36
|
-
|
42
|
+
F77_int lsave[4];
|
43
|
+
F77_int isave[44];
|
37
44
|
double dsave[29];
|
38
|
-
double* g_ptr;
|
39
45
|
VALUE g_val;
|
40
46
|
VALUE fg_arr;
|
41
47
|
VALUE ret;
|
@@ -45,7 +51,7 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
45
51
|
rb_raise(rb_eArgError, "x must be a 1-D array.");
|
46
52
|
return Qnil;
|
47
53
|
}
|
48
|
-
n = (
|
54
|
+
n = (F77_int)NA_SIZE(x_nary);
|
49
55
|
if (CLASS_OF(x_val) != numo_cDFloat) {
|
50
56
|
x_val = rb_funcall(numo_cDFloat, rb_intern("cast"), 1, x_val);
|
51
57
|
}
|
@@ -58,7 +64,7 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
58
64
|
rb_raise(rb_eArgError, "l must be a 1-D array.");
|
59
65
|
return Qnil;
|
60
66
|
}
|
61
|
-
if ((
|
67
|
+
if ((F77_int)NA_SIZE(l_nary) != n) {
|
62
68
|
rb_raise(rb_eArgError, "The size of l must be equal to that of x.");
|
63
69
|
return Qnil;
|
64
70
|
}
|
@@ -74,7 +80,7 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
74
80
|
rb_raise(rb_eArgError, "u must be a 1-D array.");
|
75
81
|
return Qnil;
|
76
82
|
}
|
77
|
-
if ((
|
83
|
+
if ((F77_int)NA_SIZE(u_nary) != n) {
|
78
84
|
rb_raise(rb_eArgError, "The size of u must be equal to that of x.");
|
79
85
|
return Qnil;
|
80
86
|
}
|
@@ -90,13 +96,19 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
90
96
|
rb_raise(rb_eArgError, "nbd must be a 1-D array.");
|
91
97
|
return Qnil;
|
92
98
|
}
|
93
|
-
if ((
|
99
|
+
if ((F77_int)NA_SIZE(nbd_nary) != n) {
|
94
100
|
rb_raise(rb_eArgError, "The size of nbd must be equal to that of x.");
|
95
101
|
return Qnil;
|
96
102
|
}
|
103
|
+
#ifdef USE_INT64
|
97
104
|
if (CLASS_OF(nbd_val) != numo_cInt64) {
|
98
105
|
nbd_val = rb_funcall(numo_cInt64, rb_intern("cast"), 1, nbd_val);
|
99
106
|
}
|
107
|
+
#else
|
108
|
+
if (CLASS_OF(nbd_val) != numo_cInt32) {
|
109
|
+
nbd_val = rb_funcall(numo_cInt32, rb_intern("cast"), 1, nbd_val);
|
110
|
+
}
|
111
|
+
#endif
|
100
112
|
if (!RTEST(nary_check_contiguous(nbd_val))) {
|
101
113
|
nbd_val = nary_dup(nbd_val);
|
102
114
|
}
|
@@ -104,23 +116,20 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
104
116
|
x_ptr = (double*)na_get_pointer_for_read_write(x_val);
|
105
117
|
l_ptr = (double*)na_get_pointer_for_read(l_val);
|
106
118
|
u_ptr = (double*)na_get_pointer_for_read(u_val);
|
107
|
-
nbd_ptr = (
|
119
|
+
nbd_ptr = (F77_int*)na_get_pointer_for_read(nbd_val);
|
108
120
|
g = ALLOC_N(double, n);
|
109
121
|
wa = ALLOC_N(double, (2 * m + 5) * n + 12 * m * m + 12 * m);
|
110
|
-
iwa = ALLOC_N(
|
122
|
+
iwa = ALLOC_N(F77_int, 3 * n);
|
111
123
|
|
112
124
|
g_val = Qnil;
|
113
125
|
f = 0.0;
|
114
|
-
|
126
|
+
memset(g, 0, n * sizeof(*g));
|
115
127
|
strcpy(task, "START");
|
116
128
|
n_fev = 0;
|
117
129
|
n_jev = 0;
|
118
130
|
|
119
131
|
for (n_iter = 0; n_iter < max_iter;) {
|
120
|
-
setulb_(
|
121
|
-
&n, &m, x_ptr, l_ptr, u_ptr, nbd_ptr, &f, g, &factr, &pgtol, wa, iwa,
|
122
|
-
task, &iprint, csave, lsave, isave, dsave
|
123
|
-
);
|
132
|
+
setulb_(&n, &m, x_ptr, l_ptr, u_ptr, nbd_ptr, &f, g, &factr, &pgtol, wa, iwa, task, &iprint, csave, lsave, isave, dsave);
|
124
133
|
if (strncmp(task, "FG", 2) == 0) {
|
125
134
|
if (RB_TYPE_P(jcb, T_TRUE)) {
|
126
135
|
fg_arr = rb_funcall(self, rb_intern("fnc"), 3, fnc, x_val, args);
|
@@ -130,15 +139,16 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
130
139
|
f = NUM2DBL(rb_funcall(self, rb_intern("fnc"), 3, fnc, x_val, args));
|
131
140
|
g_val = rb_funcall(self, rb_intern("jcb"), 3, jcb, x_val, args);
|
132
141
|
}
|
133
|
-
n_fev
|
134
|
-
n_jev
|
135
|
-
if (CLASS_OF(g_val) != numo_cDFloat)
|
136
|
-
|
137
|
-
|
138
|
-
|
142
|
+
n_fev++;
|
143
|
+
n_jev++;
|
144
|
+
if (CLASS_OF(g_val) != numo_cDFloat)
|
145
|
+
g_val = rb_funcall(numo_cDFloat, rb_intern("cast"), 1, g_val);
|
146
|
+
if (!RTEST(nary_check_contiguous(g_val)))
|
147
|
+
g_val = nary_dup(g_val);
|
148
|
+
memcpy(g, na_get_pointer_for_read(g_val), n * sizeof(*g));
|
149
|
+
RB_GC_GUARD(g_val);
|
139
150
|
} else if (strncmp(task, "NEW_X", 5) == 0) {
|
140
|
-
n_iter
|
141
|
-
continue;
|
151
|
+
n_iter++;
|
142
152
|
} else {
|
143
153
|
break;
|
144
154
|
}
|
@@ -153,9 +163,15 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
153
163
|
rb_hash_aset(ret, ID2SYM(rb_intern("x")), x_val);
|
154
164
|
rb_hash_aset(ret, ID2SYM(rb_intern("fnc")), DBL2NUM(f));
|
155
165
|
rb_hash_aset(ret, ID2SYM(rb_intern("jcb")), g_val);
|
166
|
+
#ifdef USE_INT64
|
156
167
|
rb_hash_aset(ret, ID2SYM(rb_intern("n_iter")), LONG2NUM(n_iter));
|
157
168
|
rb_hash_aset(ret, ID2SYM(rb_intern("n_fev")), LONG2NUM(n_fev));
|
158
169
|
rb_hash_aset(ret, ID2SYM(rb_intern("n_jev")), LONG2NUM(n_jev));
|
170
|
+
#else
|
171
|
+
rb_hash_aset(ret, ID2SYM(rb_intern("n_iter")), INT2NUM(n_iter));
|
172
|
+
rb_hash_aset(ret, ID2SYM(rb_intern("n_fev")), INT2NUM(n_fev));
|
173
|
+
rb_hash_aset(ret, ID2SYM(rb_intern("n_jev")), INT2NUM(n_jev));
|
174
|
+
#endif
|
159
175
|
rb_hash_aset(ret, ID2SYM(rb_intern("success")), strncmp(task, "CONV", 4) == 0 ? Qtrue : Qfalse);
|
160
176
|
|
161
177
|
RB_GC_GUARD(x_val);
|
@@ -166,12 +182,17 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
166
182
|
return ret;
|
167
183
|
}
|
168
184
|
|
169
|
-
void
|
170
|
-
Init_lbfgsbext(void)
|
171
|
-
{
|
185
|
+
void Init_lbfgsbext(void) {
|
172
186
|
rb_mLbfgsb = rb_define_module("Lbfgsb");
|
173
187
|
/* The value of double epsilon used in the native extension. */
|
174
188
|
rb_define_const(rb_mLbfgsb, "DBL_EPSILON", DBL2NUM(DBL_EPSILON));
|
189
|
+
#ifdef USE_INT64
|
190
|
+
/* The bit size of fortran integer. */
|
191
|
+
rb_define_const(rb_mLbfgsb, "SZ_F77_INTEGER", INT2NUM(64));
|
192
|
+
#else
|
193
|
+
/* The bit size of fortran integer. */
|
194
|
+
rb_define_const(rb_mLbfgsb, "SZ_F77_INTEGER", INT2NUM(32));
|
195
|
+
#endif
|
175
196
|
/* @!visibility private */
|
176
197
|
rb_define_module_function(rb_mLbfgsb, "min_l_bfgs_b", lbfgsb_min_l_bfgs_b, 12);
|
177
198
|
}
|
data/ext/lbfgsb/lbfgsbext.h
CHANGED
data/ext/lbfgsb/src/blas.c
CHANGED
@@ -5,10 +5,9 @@
|
|
5
5
|
*/
|
6
6
|
#include "blas.h"
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
static long i__, m, ix, iy, mp1;
|
8
|
+
void daxpy_(F77_int* n, double* da, double* dx, F77_int* incx, double* dy, F77_int* incy) {
|
9
|
+
F77_int i__1;
|
10
|
+
static F77_int i__, m, ix, iy, mp1;
|
12
11
|
|
13
12
|
--dy;
|
14
13
|
--dx;
|
@@ -17,10 +16,10 @@ int lbfgsb_rb_daxpy_(long *n, double *da, double *dx, long *incx, double *dy, lo
|
|
17
16
|
/* uses unrolled loops for increments equal to one. */
|
18
17
|
/* jack dongarra, linpack, 3/11/78. */
|
19
18
|
if (*n <= 0) {
|
20
|
-
return
|
19
|
+
return;
|
21
20
|
}
|
22
21
|
if (*da == 0.) {
|
23
|
-
return
|
22
|
+
return;
|
24
23
|
}
|
25
24
|
if (*incx == 1 && *incy == 1) {
|
26
25
|
goto L20;
|
@@ -42,7 +41,7 @@ int lbfgsb_rb_daxpy_(long *n, double *da, double *dx, long *incx, double *dy, lo
|
|
42
41
|
ix += *incx;
|
43
42
|
iy += *incy;
|
44
43
|
}
|
45
|
-
return
|
44
|
+
return;
|
46
45
|
|
47
46
|
/* code for both increments equal to 1 */
|
48
47
|
/* clean-up loop */
|
@@ -56,7 +55,7 @@ L20:
|
|
56
55
|
dy[i__] += *da * dx[i__];
|
57
56
|
}
|
58
57
|
if (*n < 4) {
|
59
|
-
return
|
58
|
+
return;
|
60
59
|
}
|
61
60
|
L40:
|
62
61
|
mp1 = m + 1;
|
@@ -67,13 +66,12 @@ L40:
|
|
67
66
|
dy[i__ + 2] += *da * dx[i__ + 2];
|
68
67
|
dy[i__ + 3] += *da * dx[i__ + 3];
|
69
68
|
}
|
70
|
-
return
|
69
|
+
return;
|
71
70
|
}
|
72
71
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
static long i__, m, ix, iy, mp1;
|
72
|
+
void dcopy_(F77_int* n, double* dx, F77_int* incx, double* dy, F77_int* incy) {
|
73
|
+
F77_int i__1;
|
74
|
+
static F77_int i__, m, ix, iy, mp1;
|
77
75
|
|
78
76
|
--dy;
|
79
77
|
--dx;
|
@@ -82,7 +80,7 @@ int lbfgsb_rb_dcopy_(long *n, double *dx, long *incx, double *dy, long *incy)
|
|
82
80
|
/* uses unrolled loops for increments equal to one. */
|
83
81
|
/* jack dongarra, linpack, 3/11/78. */
|
84
82
|
if (*n <= 0) {
|
85
|
-
return
|
83
|
+
return;
|
86
84
|
}
|
87
85
|
if (*incx == 1 && *incy == 1) {
|
88
86
|
goto L20;
|
@@ -104,7 +102,7 @@ int lbfgsb_rb_dcopy_(long *n, double *dx, long *incx, double *dy, long *incy)
|
|
104
102
|
ix += *incx;
|
105
103
|
iy += *incy;
|
106
104
|
}
|
107
|
-
return
|
105
|
+
return;
|
108
106
|
|
109
107
|
/* code for both increments equal to 1 */
|
110
108
|
/* clean-up loop */
|
@@ -118,7 +116,7 @@ L20:
|
|
118
116
|
dy[i__] = dx[i__];
|
119
117
|
}
|
120
118
|
if (*n < 7) {
|
121
|
-
return
|
119
|
+
return;
|
122
120
|
}
|
123
121
|
L40:
|
124
122
|
mp1 = m + 1;
|
@@ -132,14 +130,13 @@ L40:
|
|
132
130
|
dy[i__ + 5] = dx[i__ + 5];
|
133
131
|
dy[i__ + 6] = dx[i__ + 6];
|
134
132
|
}
|
135
|
-
return
|
133
|
+
return;
|
136
134
|
}
|
137
135
|
|
138
|
-
double
|
139
|
-
|
140
|
-
long i__1;
|
136
|
+
double ddot_(F77_int* n, double* dx, F77_int* incx, double* dy, F77_int* incy) {
|
137
|
+
F77_int i__1;
|
141
138
|
double ret_val;
|
142
|
-
static
|
139
|
+
static F77_int i__, m, ix, iy, mp1;
|
143
140
|
static double dtemp;
|
144
141
|
|
145
142
|
--dy;
|
@@ -194,18 +191,17 @@ L40:
|
|
194
191
|
mp1 = m + 1;
|
195
192
|
i__1 = *n;
|
196
193
|
for (i__ = mp1; i__ <= i__1; i__ += 5) {
|
197
|
-
dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1]
|
198
|
-
|
194
|
+
dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + dx[i__ + 2] * dy[i__ + 2] + dx[i__ + 3] * dy[i__ + 3] +
|
195
|
+
dx[i__ + 4] * dy[i__ + 4];
|
199
196
|
}
|
200
197
|
L60:
|
201
198
|
ret_val = dtemp;
|
202
199
|
return ret_val;
|
203
200
|
}
|
204
201
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
static long i__, m, mp1, nincx;
|
202
|
+
void dscal_(F77_int* n, double* da, double* dx, F77_int* incx) {
|
203
|
+
F77_int i__1, i__2;
|
204
|
+
static F77_int i__, m, mp1, nincx;
|
209
205
|
|
210
206
|
--dx;
|
211
207
|
|
@@ -214,7 +210,7 @@ int lbfgsb_rb_dscal_(long *n, double *da, double *dx, long *incx)
|
|
214
210
|
/* jack dongarra, linpack, 3/11/78. */
|
215
211
|
/* modified 3/93 to return if incx .le. 0. */
|
216
212
|
if (*n <= 0 || *incx <= 0) {
|
217
|
-
return
|
213
|
+
return;
|
218
214
|
}
|
219
215
|
if (*incx == 1) {
|
220
216
|
goto L20;
|
@@ -227,7 +223,7 @@ int lbfgsb_rb_dscal_(long *n, double *da, double *dx, long *incx)
|
|
227
223
|
for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
|
228
224
|
dx[i__] = *da * dx[i__];
|
229
225
|
}
|
230
|
-
return
|
226
|
+
return;
|
231
227
|
|
232
228
|
/* code for increment equal to 1 */
|
233
229
|
/* clean-up loop */
|
@@ -241,7 +237,7 @@ L20:
|
|
241
237
|
dx[i__] = *da * dx[i__];
|
242
238
|
}
|
243
239
|
if (*n < 5) {
|
244
|
-
return
|
240
|
+
return;
|
245
241
|
}
|
246
242
|
L40:
|
247
243
|
mp1 = m + 1;
|
@@ -253,5 +249,5 @@ L40:
|
|
253
249
|
dx[i__ + 3] = *da * dx[i__ + 3];
|
254
250
|
dx[i__ + 4] = *da * dx[i__ + 4];
|
255
251
|
}
|
256
|
-
return
|
252
|
+
return;
|
257
253
|
}
|
data/ext/lbfgsb/src/blas.h
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
#ifndef LBFGSB_RB_BLAS_H_
|
2
2
|
#define LBFGSB_RB_BLAS_H_
|
3
3
|
|
4
|
-
#include
|
4
|
+
#include "common.h"
|
5
5
|
|
6
|
-
extern
|
7
|
-
extern
|
8
|
-
extern double
|
9
|
-
extern
|
6
|
+
extern void daxpy_(F77_int* n, double* da, double* dx, F77_int* incx, double* dy, F77_int* incy);
|
7
|
+
extern void dcopy_(F77_int* n, double* dx, F77_int* incx, double* dy, F77_int* incy);
|
8
|
+
extern double ddot_(F77_int* n, double* dx, F77_int* incx, double* dy, F77_int* incy);
|
9
|
+
extern void dscal_(F77_int* n, double* da, double* dx, F77_int* incx);
|
10
10
|
|
11
11
|
#endif /* LBFGSB_RB_BLAS_H_ */
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#ifndef LBFGSB_RB_COMMON_H_
|
2
|
+
#define LBFGSB_RB_COMMON_H_
|
3
|
+
|
4
|
+
#include <stdint.h>
|
5
|
+
#include <inttypes.h>
|
6
|
+
#include <math.h>
|
7
|
+
|
8
|
+
#ifdef USE_INT64
|
9
|
+
typedef int64_t F77_int;
|
10
|
+
#define PRIdF77INT PRId64
|
11
|
+
#else
|
12
|
+
typedef int32_t F77_int;
|
13
|
+
#define PRIdF77INT PRId32
|
14
|
+
#endif
|
15
|
+
|
16
|
+
#endif /* LBFGSB_RB_COMMON_H_ */
|