lbfgsb 0.2.0 → 0.4.1
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 +4 -4
- data/.clang-format +149 -0
- data/.github/workflows/build.yml +5 -7
- data/CHANGELOG.md +17 -0
- data/Gemfile +3 -1
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/Steepfile +20 -0
- data/ext/lbfgsb/lbfgsbext.c +25 -29
- data/ext/lbfgsb/lbfgsbext.h +2 -0
- data/ext/lbfgsb/src/blas.c +6 -40
- data/ext/lbfgsb/src/blas.h +4 -5
- data/ext/lbfgsb/src/lbfgsb.c +140 -220
- data/ext/lbfgsb/src/lbfgsb.h +68 -109
- data/ext/lbfgsb/src/linpack.c +55 -53
- data/ext/lbfgsb/src/linpack.h +2 -2
- data/lbfgsb.gemspec +9 -6
- data/lib/lbfgsb/version.rb +1 -1
- data/sig/lbfgsb.rbs +31 -0
- metadata +13 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 771754be56f6a3954337488ed44d237a9d97899c28800916d89ff134e8d2d12d
|
4
|
+
data.tar.gz: 7db51dd7443056af4e174199752ba7ef136c7898bb9bd086b5316a784fb0a70f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1eb043cbdd14c0db2d9bd1a74b934d1719a95ee943281f915a11dbff508cdaf55c501d6ba250cec5569b405ff0ab4702124c1388cc6e14bd7df229727ffbfcf
|
7
|
+
data.tar.gz: db4f459a6b3711415c78d8a94ff0bbc4039581f7923e0bbabd833e2222a0e5462979b2319f3284725411e6542d84f4d319003cf685ccc9c9d4d27b909d79a443
|
data/.clang-format
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
---
|
2
|
+
Language: Cpp
|
3
|
+
# BasedOnStyle: LLVM
|
4
|
+
AccessModifierOffset: -2
|
5
|
+
AlignAfterOpenBracket: Align
|
6
|
+
AlignConsecutiveMacros: false
|
7
|
+
AlignConsecutiveAssignments: false
|
8
|
+
AlignConsecutiveBitFields: false
|
9
|
+
AlignConsecutiveDeclarations: false
|
10
|
+
AlignEscapedNewlines: Right
|
11
|
+
AlignOperands: Align
|
12
|
+
AlignTrailingComments: true
|
13
|
+
AllowAllArgumentsOnNextLine: true
|
14
|
+
AllowAllConstructorInitializersOnNextLine: true
|
15
|
+
AllowAllParametersOfDeclarationOnNextLine: true
|
16
|
+
AllowShortEnumsOnASingleLine: true
|
17
|
+
AllowShortBlocksOnASingleLine: Never
|
18
|
+
AllowShortCaseLabelsOnASingleLine: false
|
19
|
+
AllowShortFunctionsOnASingleLine: All
|
20
|
+
AllowShortLambdasOnASingleLine: All
|
21
|
+
AllowShortIfStatementsOnASingleLine: Never
|
22
|
+
AllowShortLoopsOnASingleLine: false
|
23
|
+
AlwaysBreakAfterDefinitionReturnType: None
|
24
|
+
AlwaysBreakAfterReturnType: None
|
25
|
+
AlwaysBreakBeforeMultilineStrings: false
|
26
|
+
AlwaysBreakTemplateDeclarations: MultiLine
|
27
|
+
BinPackArguments: true
|
28
|
+
BinPackParameters: true
|
29
|
+
BraceWrapping:
|
30
|
+
AfterCaseLabel: false
|
31
|
+
AfterClass: false
|
32
|
+
AfterControlStatement: Never
|
33
|
+
AfterEnum: false
|
34
|
+
AfterFunction: false
|
35
|
+
AfterNamespace: false
|
36
|
+
AfterObjCDeclaration: false
|
37
|
+
AfterStruct: false
|
38
|
+
AfterUnion: false
|
39
|
+
AfterExternBlock: false
|
40
|
+
BeforeCatch: false
|
41
|
+
BeforeElse: false
|
42
|
+
BeforeLambdaBody: false
|
43
|
+
BeforeWhile: false
|
44
|
+
IndentBraces: false
|
45
|
+
SplitEmptyFunction: true
|
46
|
+
SplitEmptyRecord: true
|
47
|
+
SplitEmptyNamespace: true
|
48
|
+
BreakBeforeBinaryOperators: None
|
49
|
+
BreakBeforeBraces: Attach
|
50
|
+
BreakBeforeInheritanceComma: false
|
51
|
+
BreakInheritanceList: BeforeColon
|
52
|
+
BreakBeforeTernaryOperators: true
|
53
|
+
BreakConstructorInitializersBeforeComma: false
|
54
|
+
BreakConstructorInitializers: BeforeColon
|
55
|
+
BreakAfterJavaFieldAnnotations: false
|
56
|
+
BreakStringLiterals: true
|
57
|
+
ColumnLimit: 128
|
58
|
+
CommentPragmas: '^ IWYU pragma:'
|
59
|
+
CompactNamespaces: false
|
60
|
+
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
61
|
+
ConstructorInitializerIndentWidth: 4
|
62
|
+
ContinuationIndentWidth: 4
|
63
|
+
Cpp11BracedListStyle: true
|
64
|
+
DeriveLineEnding: true
|
65
|
+
DerivePointerAlignment: false
|
66
|
+
DisableFormat: false
|
67
|
+
ExperimentalAutoDetectBinPacking: false
|
68
|
+
FixNamespaceComments: true
|
69
|
+
ForEachMacros:
|
70
|
+
- foreach
|
71
|
+
- Q_FOREACH
|
72
|
+
- BOOST_FOREACH
|
73
|
+
IncludeBlocks: Preserve
|
74
|
+
IncludeCategories:
|
75
|
+
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
76
|
+
Priority: 2
|
77
|
+
SortPriority: 0
|
78
|
+
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
|
79
|
+
Priority: 3
|
80
|
+
SortPriority: 0
|
81
|
+
- Regex: '.*'
|
82
|
+
Priority: 1
|
83
|
+
SortPriority: 0
|
84
|
+
IncludeIsMainRegex: '(Test)?$'
|
85
|
+
IncludeIsMainSourceRegex: ''
|
86
|
+
IndentCaseLabels: false
|
87
|
+
IndentCaseBlocks: false
|
88
|
+
IndentGotoLabels: true
|
89
|
+
IndentPPDirectives: None
|
90
|
+
IndentExternBlock: AfterExternBlock
|
91
|
+
IndentWidth: 2
|
92
|
+
IndentWrappedFunctionNames: false
|
93
|
+
InsertTrailingCommas: None
|
94
|
+
JavaScriptQuotes: Leave
|
95
|
+
JavaScriptWrapImports: true
|
96
|
+
KeepEmptyLinesAtTheStartOfBlocks: true
|
97
|
+
MacroBlockBegin: ''
|
98
|
+
MacroBlockEnd: ''
|
99
|
+
MaxEmptyLinesToKeep: 1
|
100
|
+
NamespaceIndentation: None
|
101
|
+
ObjCBinPackProtocolList: Auto
|
102
|
+
ObjCBlockIndentWidth: 2
|
103
|
+
ObjCBreakBeforeNestedBlockParam: true
|
104
|
+
ObjCSpaceAfterProperty: false
|
105
|
+
ObjCSpaceBeforeProtocolList: true
|
106
|
+
PenaltyBreakAssignment: 2
|
107
|
+
PenaltyBreakBeforeFirstCallParameter: 19
|
108
|
+
PenaltyBreakComment: 300
|
109
|
+
PenaltyBreakFirstLessLess: 120
|
110
|
+
PenaltyBreakString: 1000
|
111
|
+
PenaltyBreakTemplateDeclaration: 10
|
112
|
+
PenaltyExcessCharacter: 1000000
|
113
|
+
PenaltyReturnTypeOnItsOwnLine: 60
|
114
|
+
PointerAlignment: Left
|
115
|
+
ReflowComments: true
|
116
|
+
SortIncludes: true
|
117
|
+
SortUsingDeclarations: true
|
118
|
+
SpaceAfterCStyleCast: false
|
119
|
+
SpaceAfterLogicalNot: false
|
120
|
+
SpaceAfterTemplateKeyword: true
|
121
|
+
SpaceBeforeAssignmentOperators: true
|
122
|
+
SpaceBeforeCpp11BracedList: false
|
123
|
+
SpaceBeforeCtorInitializerColon: true
|
124
|
+
SpaceBeforeInheritanceColon: true
|
125
|
+
SpaceBeforeParens: ControlStatements
|
126
|
+
SpaceBeforeRangeBasedForLoopColon: true
|
127
|
+
SpaceInEmptyBlock: false
|
128
|
+
SpaceInEmptyParentheses: false
|
129
|
+
SpacesBeforeTrailingComments: 1
|
130
|
+
SpacesInAngles: false
|
131
|
+
SpacesInConditionalStatement: false
|
132
|
+
SpacesInContainerLiterals: true
|
133
|
+
SpacesInCStyleCastParentheses: false
|
134
|
+
SpacesInParentheses: false
|
135
|
+
SpacesInSquareBrackets: false
|
136
|
+
SpaceBeforeSquareBrackets: false
|
137
|
+
Standard: Latest
|
138
|
+
StatementMacros:
|
139
|
+
- Q_UNUSED
|
140
|
+
- QT_REQUIRE_VERSION
|
141
|
+
TabWidth: 8
|
142
|
+
UseCRLF: false
|
143
|
+
UseTab: Never
|
144
|
+
WhitespaceSensitiveMacros:
|
145
|
+
- STRINGIZE
|
146
|
+
- PP_STRINGIZE
|
147
|
+
- BOOST_PP_STRINGIZE
|
148
|
+
...
|
149
|
+
|
data/.github/workflows/build.yml
CHANGED
@@ -1,21 +1,19 @@
|
|
1
1
|
name: build
|
2
2
|
|
3
|
-
on: [push]
|
3
|
+
on: [push, pull_request]
|
4
4
|
|
5
5
|
jobs:
|
6
6
|
build:
|
7
7
|
runs-on: ubuntu-latest
|
8
8
|
strategy:
|
9
9
|
matrix:
|
10
|
-
ruby: [ '2.
|
10
|
+
ruby: [ '2.6', '2.7', '3.0' ]
|
11
11
|
steps:
|
12
12
|
- uses: actions/checkout@v2
|
13
13
|
- name: Set up Ruby ${{ matrix.ruby }}
|
14
|
-
uses:
|
14
|
+
uses: ruby/setup-ruby@v1
|
15
15
|
with:
|
16
16
|
ruby-version: ${{ matrix.ruby }}
|
17
|
+
bundler-cache: true
|
17
18
|
- name: Build and test with Rake
|
18
|
-
run:
|
19
|
-
gem install bundler
|
20
|
-
bundle install --jobs 4 --retry 3
|
21
|
-
bundle exec rake
|
19
|
+
run: bundle exec rake
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## 0.4.1
|
2
|
+
- Remove dependent gem's type declaration file from installation files.
|
3
|
+
|
4
|
+
## 0.4.0
|
5
|
+
- Add type declaration file: sig/lbfgsb.rbs
|
6
|
+
|
7
|
+
## 0.3.2
|
8
|
+
- Refactor native extension codes.
|
9
|
+
- Update documentations.
|
10
|
+
|
11
|
+
## 0.3.1
|
12
|
+
- Add GC guard to narray given to native extension method.
|
13
|
+
|
14
|
+
## 0.3.0
|
15
|
+
- Add library name prefix to functions derived from blas and linpack
|
16
|
+
to avoid errors due to collision with the blas functions called by numo-linalg.
|
17
|
+
|
1
18
|
## 0.2.0
|
2
19
|
- Add an option to minimize method for calculating both function value and gradient vector using fnc.
|
3
20
|
If true is given to jcb, fnc is assumed to return the function value and gardient vector as [f, g] array.
|
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://github.com/yoshoku/lbfgsb.rb/actions?query=workflow%3Abuild)
|
4
4
|
[](https://badge.fury.io/rb/lbfgsb)
|
5
|
-
[](https://github.com/yoshoku/suika/blob/
|
5
|
+
[](https://github.com/yoshoku/suika/blob/main/LICENSE.txt)
|
6
6
|
[](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/Steepfile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
target :lib do
|
2
|
+
signature "sig", "sig-deps"
|
3
|
+
#
|
4
|
+
check "lib" # Directory name
|
5
|
+
# check "Gemfile" # File name
|
6
|
+
# check "app/models/**/*.rb" # Glob
|
7
|
+
# # ignore "lib/templates/*.rb"
|
8
|
+
#
|
9
|
+
# # library "pathname", "set" # Standard libraries
|
10
|
+
# library "numo-narray" # Gems
|
11
|
+
end
|
12
|
+
|
13
|
+
# target :spec do
|
14
|
+
# signature "sig", "sig-private"
|
15
|
+
#
|
16
|
+
# check "spec"
|
17
|
+
#
|
18
|
+
# # library "pathname", "set" # Standard libraries
|
19
|
+
# # library "rspec"
|
20
|
+
# end
|
data/ext/lbfgsb/lbfgsbext.c
CHANGED
@@ -2,13 +2,8 @@
|
|
2
2
|
|
3
3
|
VALUE rb_mLbfgsb;
|
4
4
|
|
5
|
-
static
|
6
|
-
VALUE
|
7
|
-
VALUE fnc, VALUE x_val, VALUE jcb, VALUE args,
|
8
|
-
VALUE l_val, VALUE u_val, VALUE nbd_val,
|
9
|
-
VALUE maxcor, VALUE ftol, VALUE gtol, VALUE maxiter, VALUE disp)
|
10
|
-
{
|
11
|
-
long i;
|
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) {
|
12
7
|
long n_iter;
|
13
8
|
long n_fev;
|
14
9
|
long n_jev;
|
@@ -19,12 +14,12 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
19
14
|
narray_t* nbd_nary;
|
20
15
|
long n;
|
21
16
|
long m = NUM2LONG(maxcor);
|
22
|
-
double
|
23
|
-
double
|
24
|
-
double
|
25
|
-
long
|
17
|
+
double* x_ptr;
|
18
|
+
double* l_ptr;
|
19
|
+
double* u_ptr;
|
20
|
+
long* nbd_ptr;
|
26
21
|
double f;
|
27
|
-
double
|
22
|
+
double* g;
|
28
23
|
double factr = NUM2DBL(ftol);
|
29
24
|
double pgtol = NUM2DBL(gtol);
|
30
25
|
double* wa;
|
@@ -35,7 +30,6 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
35
30
|
long lsave[4];
|
36
31
|
long isave[44];
|
37
32
|
double dsave[29];
|
38
|
-
double* g_ptr;
|
39
33
|
VALUE g_val;
|
40
34
|
VALUE fg_arr;
|
41
35
|
VALUE ret;
|
@@ -109,17 +103,15 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
109
103
|
wa = ALLOC_N(double, (2 * m + 5) * n + 12 * m * m + 12 * m);
|
110
104
|
iwa = ALLOC_N(long, 3 * n);
|
111
105
|
|
106
|
+
g_val = Qnil;
|
112
107
|
f = 0.0;
|
113
|
-
|
108
|
+
memset(g, 0, n * sizeof(*g));
|
114
109
|
strcpy(task, "START");
|
115
110
|
n_fev = 0;
|
116
111
|
n_jev = 0;
|
117
112
|
|
118
113
|
for (n_iter = 0; n_iter < max_iter;) {
|
119
|
-
setulb_(
|
120
|
-
&n, &m, x_ptr, l_ptr, u_ptr, nbd_ptr, &f, g, &factr, &pgtol, wa, iwa,
|
121
|
-
task, &iprint, csave, lsave, isave, dsave
|
122
|
-
);
|
114
|
+
setulb_(&n, &m, x_ptr, l_ptr, u_ptr, nbd_ptr, &f, g, &factr, &pgtol, wa, iwa, task, &iprint, csave, lsave, isave, dsave);
|
123
115
|
if (strncmp(task, "FG", 2) == 0) {
|
124
116
|
if (RB_TYPE_P(jcb, T_TRUE)) {
|
125
117
|
fg_arr = rb_funcall(self, rb_intern("fnc"), 3, fnc, x_val, args);
|
@@ -129,15 +121,16 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
129
121
|
f = NUM2DBL(rb_funcall(self, rb_intern("fnc"), 3, fnc, x_val, args));
|
130
122
|
g_val = rb_funcall(self, rb_intern("jcb"), 3, jcb, x_val, args);
|
131
123
|
}
|
132
|
-
n_fev
|
133
|
-
n_jev
|
134
|
-
if (CLASS_OF(g_val) != numo_cDFloat)
|
135
|
-
|
136
|
-
|
137
|
-
|
124
|
+
n_fev++;
|
125
|
+
n_jev++;
|
126
|
+
if (CLASS_OF(g_val) != numo_cDFloat)
|
127
|
+
g_val = rb_funcall(numo_cDFloat, rb_intern("cast"), 1, g_val);
|
128
|
+
if (!RTEST(nary_check_contiguous(g_val)))
|
129
|
+
g_val = nary_dup(g_val);
|
130
|
+
memcpy(g, na_get_pointer_for_read(g_val), n * sizeof(*g));
|
131
|
+
RB_GC_GUARD(g_val);
|
138
132
|
} else if (strncmp(task, "NEW_X", 5) == 0) {
|
139
|
-
n_iter
|
140
|
-
continue;
|
133
|
+
n_iter++;
|
141
134
|
} else {
|
142
135
|
break;
|
143
136
|
}
|
@@ -157,12 +150,15 @@ VALUE lbfgsb_min_l_bfgs_b(VALUE self,
|
|
157
150
|
rb_hash_aset(ret, ID2SYM(rb_intern("n_jev")), LONG2NUM(n_jev));
|
158
151
|
rb_hash_aset(ret, ID2SYM(rb_intern("success")), strncmp(task, "CONV", 4) == 0 ? Qtrue : Qfalse);
|
159
152
|
|
153
|
+
RB_GC_GUARD(x_val);
|
154
|
+
RB_GC_GUARD(l_val);
|
155
|
+
RB_GC_GUARD(u_val);
|
156
|
+
RB_GC_GUARD(nbd_val);
|
157
|
+
|
160
158
|
return ret;
|
161
159
|
}
|
162
160
|
|
163
|
-
void
|
164
|
-
Init_lbfgsbext(void)
|
165
|
-
{
|
161
|
+
void Init_lbfgsbext(void) {
|
166
162
|
rb_mLbfgsb = rb_define_module("Lbfgsb");
|
167
163
|
/* The value of double epsilon used in the native extension. */
|
168
164
|
rb_define_const(rb_mLbfgsb, "DBL_EPSILON", DBL2NUM(DBL_EPSILON));
|
data/ext/lbfgsb/lbfgsbext.h
CHANGED
data/ext/lbfgsb/src/blas.c
CHANGED
@@ -5,38 +5,7 @@
|
|
5
5
|
*/
|
6
6
|
#include "blas.h"
|
7
7
|
|
8
|
-
|
9
|
-
{
|
10
|
-
long i__1, i__2;
|
11
|
-
double ret_val, d__1, d__2, d__3;
|
12
|
-
static long i__;
|
13
|
-
static double scale;
|
14
|
-
|
15
|
-
--x;
|
16
|
-
|
17
|
-
ret_val = 0.;
|
18
|
-
scale = 0.;
|
19
|
-
i__1 = *n;
|
20
|
-
i__2 = *incx;
|
21
|
-
for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
|
22
|
-
d__2 = scale, d__3 = (d__1 = x[i__], fabs(d__1));
|
23
|
-
scale = d__2 >= d__3 ? d__2 : d__3;
|
24
|
-
}
|
25
|
-
if (scale == 0.) {
|
26
|
-
return ret_val;
|
27
|
-
}
|
28
|
-
i__2 = *n;
|
29
|
-
i__1 = *incx;
|
30
|
-
for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) {
|
31
|
-
d__1 = x[i__] / scale;
|
32
|
-
ret_val += d__1 * d__1;
|
33
|
-
}
|
34
|
-
ret_val = scale * sqrt(ret_val);
|
35
|
-
return ret_val;
|
36
|
-
}
|
37
|
-
|
38
|
-
int daxpy_(long *n, double *da, double *dx, long *incx, double *dy, long *incy)
|
39
|
-
{
|
8
|
+
int lbfgsb_rb_daxpy_(long* n, double* da, double* dx, long* incx, double* dy, long* incy) {
|
40
9
|
long i__1;
|
41
10
|
static long i__, m, ix, iy, mp1;
|
42
11
|
|
@@ -100,8 +69,7 @@ L40:
|
|
100
69
|
return 0;
|
101
70
|
}
|
102
71
|
|
103
|
-
int
|
104
|
-
{
|
72
|
+
int lbfgsb_rb_dcopy_(long* n, double* dx, long* incx, double* dy, long* incy) {
|
105
73
|
long i__1;
|
106
74
|
static long i__, m, ix, iy, mp1;
|
107
75
|
|
@@ -165,8 +133,7 @@ L40:
|
|
165
133
|
return 0;
|
166
134
|
}
|
167
135
|
|
168
|
-
double
|
169
|
-
{
|
136
|
+
double lbfgsb_rb_ddot_(long* n, double* dx, long* incx, double* dy, long* incy) {
|
170
137
|
long i__1;
|
171
138
|
double ret_val;
|
172
139
|
static long i__, m, ix, iy, mp1;
|
@@ -224,16 +191,15 @@ L40:
|
|
224
191
|
mp1 = m + 1;
|
225
192
|
i__1 = *n;
|
226
193
|
for (i__ = mp1; i__ <= i__1; i__ += 5) {
|
227
|
-
dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1]
|
228
|
-
|
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];
|
229
196
|
}
|
230
197
|
L60:
|
231
198
|
ret_val = dtemp;
|
232
199
|
return ret_val;
|
233
200
|
}
|
234
201
|
|
235
|
-
int
|
236
|
-
{
|
202
|
+
int lbfgsb_rb_dscal_(long* n, double* da, double* dx, long* incx) {
|
237
203
|
long i__1, i__2;
|
238
204
|
static long i__, m, mp1, nincx;
|
239
205
|
|