numo-optimize 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/LICENSE.txt +27 -0
- data/README.md +77 -0
- data/Rakefile +35 -0
- data/ext/numo/optimize/extconf.rb +45 -0
- data/ext/numo/optimize/optimize.c +228 -0
- data/ext/numo/optimize/optimize.h +13 -0
- data/ext/numo/optimize/src/License.txt +71 -0
- data/ext/numo/optimize/src/blas.c +253 -0
- data/ext/numo/optimize/src/blas.h +11 -0
- data/ext/numo/optimize/src/common.h +16 -0
- data/ext/numo/optimize/src/lbfgsb.c +3995 -0
- data/ext/numo/optimize/src/lbfgsb.h +83 -0
- data/ext/numo/optimize/src/linpack.c +237 -0
- data/ext/numo/optimize/src/linpack.h +9 -0
- data/lib/numo/optimize/version.rb +10 -0
- data/lib/numo/optimize.rb +110 -0
- metadata +78 -0
@@ -0,0 +1,253 @@
|
|
1
|
+
/**
|
2
|
+
* L-BFGS-B is released under the “New BSD License” (aka “Modified BSD License”
|
3
|
+
* or “3-clause license”)
|
4
|
+
* Please read attached file License.txt
|
5
|
+
*/
|
6
|
+
#include "blas.h"
|
7
|
+
|
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;
|
11
|
+
|
12
|
+
--dy;
|
13
|
+
--dx;
|
14
|
+
|
15
|
+
/* constant times a vector plus a vector. */
|
16
|
+
/* uses unrolled loops for increments equal to one. */
|
17
|
+
/* jack dongarra, linpack, 3/11/78. */
|
18
|
+
if (*n <= 0) {
|
19
|
+
return;
|
20
|
+
}
|
21
|
+
if (*da == 0.) {
|
22
|
+
return;
|
23
|
+
}
|
24
|
+
if (*incx == 1 && *incy == 1) {
|
25
|
+
goto L20;
|
26
|
+
}
|
27
|
+
|
28
|
+
/* code for unequal increments or equal increments */
|
29
|
+
/* not equal to 1 */
|
30
|
+
ix = 1;
|
31
|
+
iy = 1;
|
32
|
+
if (*incx < 0) {
|
33
|
+
ix = (-(*n) + 1) * *incx + 1;
|
34
|
+
}
|
35
|
+
if (*incy < 0) {
|
36
|
+
iy = (-(*n) + 1) * *incy + 1;
|
37
|
+
}
|
38
|
+
i__1 = *n;
|
39
|
+
for (i__ = 1; i__ <= i__1; ++i__) {
|
40
|
+
dy[iy] += *da * dx[ix];
|
41
|
+
ix += *incx;
|
42
|
+
iy += *incy;
|
43
|
+
}
|
44
|
+
return;
|
45
|
+
|
46
|
+
/* code for both increments equal to 1 */
|
47
|
+
/* clean-up loop */
|
48
|
+
L20:
|
49
|
+
m = *n % 4;
|
50
|
+
if (m == 0) {
|
51
|
+
goto L40;
|
52
|
+
}
|
53
|
+
i__1 = m;
|
54
|
+
for (i__ = 1; i__ <= i__1; ++i__) {
|
55
|
+
dy[i__] += *da * dx[i__];
|
56
|
+
}
|
57
|
+
if (*n < 4) {
|
58
|
+
return;
|
59
|
+
}
|
60
|
+
L40:
|
61
|
+
mp1 = m + 1;
|
62
|
+
i__1 = *n;
|
63
|
+
for (i__ = mp1; i__ <= i__1; i__ += 4) {
|
64
|
+
dy[i__] += *da * dx[i__];
|
65
|
+
dy[i__ + 1] += *da * dx[i__ + 1];
|
66
|
+
dy[i__ + 2] += *da * dx[i__ + 2];
|
67
|
+
dy[i__ + 3] += *da * dx[i__ + 3];
|
68
|
+
}
|
69
|
+
return;
|
70
|
+
}
|
71
|
+
|
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;
|
75
|
+
|
76
|
+
--dy;
|
77
|
+
--dx;
|
78
|
+
|
79
|
+
/* copies a vector, x, to a vector, y. */
|
80
|
+
/* uses unrolled loops for increments equal to one. */
|
81
|
+
/* jack dongarra, linpack, 3/11/78. */
|
82
|
+
if (*n <= 0) {
|
83
|
+
return;
|
84
|
+
}
|
85
|
+
if (*incx == 1 && *incy == 1) {
|
86
|
+
goto L20;
|
87
|
+
}
|
88
|
+
|
89
|
+
/* code for unequal increments or equal increments */
|
90
|
+
/* not equal to 1 */
|
91
|
+
ix = 1;
|
92
|
+
iy = 1;
|
93
|
+
if (*incx < 0) {
|
94
|
+
ix = (-(*n) + 1) * *incx + 1;
|
95
|
+
}
|
96
|
+
if (*incy < 0) {
|
97
|
+
iy = (-(*n) + 1) * *incy + 1;
|
98
|
+
}
|
99
|
+
i__1 = *n;
|
100
|
+
for (i__ = 1; i__ <= i__1; ++i__) {
|
101
|
+
dy[iy] = dx[ix];
|
102
|
+
ix += *incx;
|
103
|
+
iy += *incy;
|
104
|
+
}
|
105
|
+
return;
|
106
|
+
|
107
|
+
/* code for both increments equal to 1 */
|
108
|
+
/* clean-up loop */
|
109
|
+
L20:
|
110
|
+
m = *n % 7;
|
111
|
+
if (m == 0) {
|
112
|
+
goto L40;
|
113
|
+
}
|
114
|
+
i__1 = m;
|
115
|
+
for (i__ = 1; i__ <= i__1; ++i__) {
|
116
|
+
dy[i__] = dx[i__];
|
117
|
+
}
|
118
|
+
if (*n < 7) {
|
119
|
+
return;
|
120
|
+
}
|
121
|
+
L40:
|
122
|
+
mp1 = m + 1;
|
123
|
+
i__1 = *n;
|
124
|
+
for (i__ = mp1; i__ <= i__1; i__ += 7) {
|
125
|
+
dy[i__] = dx[i__];
|
126
|
+
dy[i__ + 1] = dx[i__ + 1];
|
127
|
+
dy[i__ + 2] = dx[i__ + 2];
|
128
|
+
dy[i__ + 3] = dx[i__ + 3];
|
129
|
+
dy[i__ + 4] = dx[i__ + 4];
|
130
|
+
dy[i__ + 5] = dx[i__ + 5];
|
131
|
+
dy[i__ + 6] = dx[i__ + 6];
|
132
|
+
}
|
133
|
+
return;
|
134
|
+
}
|
135
|
+
|
136
|
+
double ddot_(F77_int* n, double* dx, F77_int* incx, double* dy, F77_int* incy) {
|
137
|
+
F77_int i__1;
|
138
|
+
double ret_val;
|
139
|
+
static F77_int i__, m, ix, iy, mp1;
|
140
|
+
static double dtemp;
|
141
|
+
|
142
|
+
--dy;
|
143
|
+
--dx;
|
144
|
+
|
145
|
+
/* forms the dot product of two vectors. */
|
146
|
+
/* uses unrolled loops for increments equal to one. */
|
147
|
+
/* jack dongarra, linpack, 3/11/78. */
|
148
|
+
ret_val = 0.;
|
149
|
+
dtemp = 0.;
|
150
|
+
if (*n <= 0) {
|
151
|
+
return ret_val;
|
152
|
+
}
|
153
|
+
if (*incx == 1 && *incy == 1) {
|
154
|
+
goto L20;
|
155
|
+
}
|
156
|
+
|
157
|
+
/* code for unequal increments or equal increments */
|
158
|
+
/* not equal to 1 */
|
159
|
+
ix = 1;
|
160
|
+
iy = 1;
|
161
|
+
if (*incx < 0) {
|
162
|
+
ix = (-(*n) + 1) * *incx + 1;
|
163
|
+
}
|
164
|
+
if (*incy < 0) {
|
165
|
+
iy = (-(*n) + 1) * *incy + 1;
|
166
|
+
}
|
167
|
+
i__1 = *n;
|
168
|
+
for (i__ = 1; i__ <= i__1; ++i__) {
|
169
|
+
dtemp += dx[ix] * dy[iy];
|
170
|
+
ix += *incx;
|
171
|
+
iy += *incy;
|
172
|
+
}
|
173
|
+
ret_val = dtemp;
|
174
|
+
return ret_val;
|
175
|
+
|
176
|
+
/* code for both increments equal to 1 */
|
177
|
+
/* clean-up loop */
|
178
|
+
L20:
|
179
|
+
m = *n % 5;
|
180
|
+
if (m == 0) {
|
181
|
+
goto L40;
|
182
|
+
}
|
183
|
+
i__1 = m;
|
184
|
+
for (i__ = 1; i__ <= i__1; ++i__) {
|
185
|
+
dtemp += dx[i__] * dy[i__];
|
186
|
+
}
|
187
|
+
if (*n < 5) {
|
188
|
+
goto L60;
|
189
|
+
}
|
190
|
+
L40:
|
191
|
+
mp1 = m + 1;
|
192
|
+
i__1 = *n;
|
193
|
+
for (i__ = mp1; i__ <= i__1; i__ += 5) {
|
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];
|
196
|
+
}
|
197
|
+
L60:
|
198
|
+
ret_val = dtemp;
|
199
|
+
return ret_val;
|
200
|
+
}
|
201
|
+
|
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;
|
205
|
+
|
206
|
+
--dx;
|
207
|
+
|
208
|
+
/* scales a vector by a constant. */
|
209
|
+
/* uses unrolled loops for increment equal to one. */
|
210
|
+
/* jack dongarra, linpack, 3/11/78. */
|
211
|
+
/* modified 3/93 to return if incx .le. 0. */
|
212
|
+
if (*n <= 0 || *incx <= 0) {
|
213
|
+
return;
|
214
|
+
}
|
215
|
+
if (*incx == 1) {
|
216
|
+
goto L20;
|
217
|
+
}
|
218
|
+
|
219
|
+
/* code for increment not equal to 1 */
|
220
|
+
nincx = *n * *incx;
|
221
|
+
i__1 = nincx;
|
222
|
+
i__2 = *incx;
|
223
|
+
for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
|
224
|
+
dx[i__] = *da * dx[i__];
|
225
|
+
}
|
226
|
+
return;
|
227
|
+
|
228
|
+
/* code for increment equal to 1 */
|
229
|
+
/* clean-up loop */
|
230
|
+
L20:
|
231
|
+
m = *n % 5;
|
232
|
+
if (m == 0) {
|
233
|
+
goto L40;
|
234
|
+
}
|
235
|
+
i__2 = m;
|
236
|
+
for (i__ = 1; i__ <= i__2; ++i__) {
|
237
|
+
dx[i__] = *da * dx[i__];
|
238
|
+
}
|
239
|
+
if (*n < 5) {
|
240
|
+
return;
|
241
|
+
}
|
242
|
+
L40:
|
243
|
+
mp1 = m + 1;
|
244
|
+
i__2 = *n;
|
245
|
+
for (i__ = mp1; i__ <= i__2; i__ += 5) {
|
246
|
+
dx[i__] = *da * dx[i__];
|
247
|
+
dx[i__ + 1] = *da * dx[i__ + 1];
|
248
|
+
dx[i__ + 2] = *da * dx[i__ + 2];
|
249
|
+
dx[i__ + 3] = *da * dx[i__ + 3];
|
250
|
+
dx[i__ + 4] = *da * dx[i__ + 4];
|
251
|
+
}
|
252
|
+
return;
|
253
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
#ifndef NUMO_OPTIMIZE_BLAS_H_
|
2
|
+
#define NUMO_OPTIMIZE_BLAS_H_ 1
|
3
|
+
|
4
|
+
#include "common.h"
|
5
|
+
|
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
|
+
|
11
|
+
#endif /* NUMO_OPTIMIZE_BLAS_H_ */
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#ifndef NUMO_OPTIMIZE_COMMON_H_
|
2
|
+
#define NUMO_OPTIMIZE_COMMON_H_
|
3
|
+
|
4
|
+
#include <inttypes.h>
|
5
|
+
#include <math.h>
|
6
|
+
#include <stdint.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 /* NUMO_OPTIMIZE_COMMON_H_ */
|