liblinear-ruby 0.0.2 → 0.0.3
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/README.md +141 -10
- data/{liblinear-1.93/ruby → ext}/liblinear.i +0 -0
- data/ext/linear.cpp +30 -7
- data/ext/tron.cpp +4 -4
- data/lib/liblinear/model.rb +3 -3
- data/lib/liblinear/parameter.rb +2 -2
- data/lib/liblinear/problem.rb +4 -17
- data/lib/liblinear/version.rb +1 -1
- data/lib/liblinear.rb +46 -13
- data/{liblinear-1.93 → liblinear-1.94}/COPYRIGHT +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/Makefile +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/Makefile.win +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/README +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/blas/Makefile +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/blas/blas.h +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/blas/blasp.h +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/blas/daxpy.c +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/blas/ddot.c +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/blas/dnrm2.c +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/blas/dscal.c +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/heart_scale +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/linear.cpp +30 -7
- data/{liblinear-1.93 → liblinear-1.94}/linear.def +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/linear.h +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/matlab/Makefile +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/matlab/README +2 -1
- data/{liblinear-1.93 → liblinear-1.94}/matlab/libsvmread.c +25 -24
- data/{liblinear-1.93 → liblinear-1.94}/matlab/libsvmwrite.c +15 -1
- data/{liblinear-1.93 → liblinear-1.94}/matlab/linear_model_matlab.c +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/matlab/linear_model_matlab.h +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/matlab/make.m +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/matlab/predict.c +37 -25
- data/{liblinear-1.93 → liblinear-1.94}/matlab/train.c +16 -7
- data/{liblinear-1.93 → liblinear-1.94}/predict.c +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/python/Makefile +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/python/README +1 -1
- data/{liblinear-1.93 → liblinear-1.94}/python/liblinear.py +1 -1
- data/{liblinear-1.93 → liblinear-1.94}/python/liblinearutil.py +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/train.c +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/tron.cpp +4 -4
- data/{liblinear-1.93 → liblinear-1.94}/tron.h +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/windows/liblinear.dll +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/windows/libsvmread.mexw64 +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/windows/libsvmwrite.mexw64 +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/windows/predict.exe +0 -0
- data/liblinear-1.94/windows/predict.mexw64 +0 -0
- data/{liblinear-1.93 → liblinear-1.94}/windows/train.exe +0 -0
- data/liblinear-1.94/windows/train.mexw64 +0 -0
- data/spec/liblinear/model_spec.rb +56 -0
- data/spec/liblinear/parameter_spec.rb +57 -0
- data/spec/liblinear/problem_spec.rb +23 -0
- data/spec/liblinear_spec.rb +104 -0
- metadata +51 -56
- data/ext/linear.rb +0 -357
- data/liblinear-1.93/blas/blas.a +0 -0
- data/liblinear-1.93/blas/daxpy.o +0 -0
- data/liblinear-1.93/blas/ddot.o +0 -0
- data/liblinear-1.93/blas/dnrm2.o +0 -0
- data/liblinear-1.93/blas/dscal.o +0 -0
- data/liblinear-1.93/linear.o +0 -0
- data/liblinear-1.93/predict +0 -0
- data/liblinear-1.93/ruby/liblinear_wrap.cxx +0 -4646
- data/liblinear-1.93/ruby/linear.h +0 -74
- data/liblinear-1.93/ruby/linear.o +0 -0
- data/liblinear-1.93/train +0 -0
- data/liblinear-1.93/tron.o +0 -0
- data/liblinear-1.93/windows/predict.mexw64 +0 -0
- data/liblinear-1.93/windows/train.mexw64 +0 -0
@@ -25,10 +25,11 @@ void exit_with_help()
|
|
25
25
|
);
|
26
26
|
}
|
27
27
|
|
28
|
-
static void fake_answer(mxArray *plhs[])
|
28
|
+
static void fake_answer(int nlhs, mxArray *plhs[])
|
29
29
|
{
|
30
|
-
|
31
|
-
|
30
|
+
int i;
|
31
|
+
for(i=0;i<nlhs;i++)
|
32
|
+
plhs[i] = mxCreateDoubleMatrix(0, 0, mxREAL);
|
32
33
|
}
|
33
34
|
|
34
35
|
static char *line;
|
@@ -53,7 +54,7 @@ static char* readline(FILE *input)
|
|
53
54
|
}
|
54
55
|
|
55
56
|
// read in a problem (in libsvm format)
|
56
|
-
void read_problem(const char *filename, mxArray *plhs[])
|
57
|
+
void read_problem(const char *filename, int nlhs, mxArray *plhs[])
|
57
58
|
{
|
58
59
|
int max_index, min_index, inst_max_index, i;
|
59
60
|
long elements, k;
|
@@ -66,7 +67,7 @@ void read_problem(const char *filename, mxArray *plhs[])
|
|
66
67
|
if(fp == NULL)
|
67
68
|
{
|
68
69
|
mexPrintf("can't open input file %s\n",filename);
|
69
|
-
fake_answer(plhs);
|
70
|
+
fake_answer(nlhs, plhs);
|
70
71
|
return;
|
71
72
|
}
|
72
73
|
|
@@ -96,7 +97,7 @@ void read_problem(const char *filename, mxArray *plhs[])
|
|
96
97
|
if(endptr == idx || errno != 0 || *endptr != '\0' || index <= inst_max_index)
|
97
98
|
{
|
98
99
|
mexPrintf("Wrong input format at line %d\n",l+1);
|
99
|
-
fake_answer(plhs);
|
100
|
+
fake_answer(nlhs, plhs);
|
100
101
|
return;
|
101
102
|
}
|
102
103
|
else
|
@@ -135,14 +136,14 @@ void read_problem(const char *filename, mxArray *plhs[])
|
|
135
136
|
if(label == NULL)
|
136
137
|
{
|
137
138
|
mexPrintf("Empty line at line %d\n",i+1);
|
138
|
-
fake_answer(plhs);
|
139
|
+
fake_answer(nlhs, plhs);
|
139
140
|
return;
|
140
141
|
}
|
141
142
|
labels[i] = strtod(label,&endptr);
|
142
143
|
if(endptr == label || *endptr != '\0')
|
143
144
|
{
|
144
145
|
mexPrintf("Wrong input format at line %d\n",i+1);
|
145
|
-
fake_answer(plhs);
|
146
|
+
fake_answer(nlhs, plhs);
|
146
147
|
return;
|
147
148
|
}
|
148
149
|
|
@@ -161,7 +162,7 @@ void read_problem(const char *filename, mxArray *plhs[])
|
|
161
162
|
if (endptr == val || errno != 0 || (*endptr != '\0' && !isspace(*endptr)))
|
162
163
|
{
|
163
164
|
mexPrintf("Wrong input format at line %d\n",i+1);
|
164
|
-
fake_answer(plhs);
|
165
|
+
fake_answer(nlhs, plhs);
|
165
166
|
return;
|
166
167
|
}
|
167
168
|
++k;
|
@@ -178,7 +179,7 @@ void read_problem(const char *filename, mxArray *plhs[])
|
|
178
179
|
if(mexCallMATLAB(1, lhs, 1, rhs, "transpose"))
|
179
180
|
{
|
180
181
|
mexPrintf("Error: cannot transpose problem\n");
|
181
|
-
fake_answer(plhs);
|
182
|
+
fake_answer(nlhs, plhs);
|
182
183
|
return;
|
183
184
|
}
|
184
185
|
plhs[1] = lhs[0];
|
@@ -188,25 +189,25 @@ void read_problem(const char *filename, mxArray *plhs[])
|
|
188
189
|
void mexFunction( int nlhs, mxArray *plhs[],
|
189
190
|
int nrhs, const mxArray *prhs[] )
|
190
191
|
{
|
191
|
-
|
192
|
+
char filename[256];
|
193
|
+
|
194
|
+
if(nrhs != 1 || nlhs != 2)
|
192
195
|
{
|
193
|
-
|
196
|
+
exit_with_help();
|
197
|
+
fake_answer(nlhs, plhs);
|
198
|
+
return;
|
199
|
+
}
|
194
200
|
|
195
|
-
|
201
|
+
mxGetString(prhs[0], filename, mxGetN(prhs[0]) + 1);
|
196
202
|
|
197
|
-
|
198
|
-
{
|
199
|
-
mexPrintf("Error: filename is NULL\n");
|
200
|
-
return;
|
201
|
-
}
|
202
|
-
|
203
|
-
read_problem(filename, plhs);
|
204
|
-
}
|
205
|
-
else
|
203
|
+
if(filename == NULL)
|
206
204
|
{
|
207
|
-
|
208
|
-
fake_answer(plhs);
|
205
|
+
mexPrintf("Error: filename is NULL\n");
|
209
206
|
return;
|
210
207
|
}
|
208
|
+
|
209
|
+
read_problem(filename, nlhs, plhs);
|
210
|
+
|
211
|
+
return;
|
211
212
|
}
|
212
213
|
|
@@ -16,6 +16,13 @@ void exit_with_help()
|
|
16
16
|
);
|
17
17
|
}
|
18
18
|
|
19
|
+
static void fake_answer(int nlhs, mxArray *plhs[])
|
20
|
+
{
|
21
|
+
int i;
|
22
|
+
for(i=0;i<nlhs;i++)
|
23
|
+
plhs[i] = mxCreateDoubleMatrix(0, 0, mxREAL);
|
24
|
+
}
|
25
|
+
|
19
26
|
void libsvmwrite(const char *filename, const mxArray *label_vec, const mxArray *instance_mat)
|
20
27
|
{
|
21
28
|
FILE *fp = fopen(filename,"w");
|
@@ -77,7 +84,14 @@ void libsvmwrite(const char *filename, const mxArray *label_vec, const mxArray *
|
|
77
84
|
|
78
85
|
void mexFunction( int nlhs, mxArray *plhs[],
|
79
86
|
int nrhs, const mxArray *prhs[] )
|
80
|
-
{
|
87
|
+
{
|
88
|
+
if(nlhs > 0)
|
89
|
+
{
|
90
|
+
exit_with_help();
|
91
|
+
fake_answer(nlhs, plhs);
|
92
|
+
return;
|
93
|
+
}
|
94
|
+
|
81
95
|
// Transform the input Matrix to libsvm format
|
82
96
|
if(nrhs == 3)
|
83
97
|
{
|
File without changes
|
File without changes
|
File without changes
|
@@ -49,14 +49,14 @@ void read_sparse_instance(const mxArray *prhs, int index, struct feature_node *x
|
|
49
49
|
x[j].index = -1;
|
50
50
|
}
|
51
51
|
|
52
|
-
static void fake_answer(mxArray *plhs[])
|
52
|
+
static void fake_answer(int nlhs, mxArray *plhs[])
|
53
53
|
{
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
int i;
|
55
|
+
for(i=0;i<nlhs;i++)
|
56
|
+
plhs[i] = mxCreateDoubleMatrix(0, 0, mxREAL);
|
57
57
|
}
|
58
58
|
|
59
|
-
void do_predict(mxArray *plhs[], const mxArray *prhs[], struct model *model_, const int predict_probability_flag)
|
59
|
+
void do_predict(int nlhs, mxArray *plhs[], const mxArray *prhs[], struct model *model_, const int predict_probability_flag)
|
60
60
|
{
|
61
61
|
int label_vector_row_num, label_vector_col_num;
|
62
62
|
int feature_number, testing_instance_number;
|
@@ -65,6 +65,7 @@ void do_predict(mxArray *plhs[], const mxArray *prhs[], struct model *model_, co
|
|
65
65
|
double *ptr_prob_estimates, *ptr_dec_values, *ptr;
|
66
66
|
struct feature_node *x;
|
67
67
|
mxArray *pplhs[1]; // instance sparse matrix in row format
|
68
|
+
mxArray *tplhs[3]; // temporary storage for plhs[]
|
68
69
|
|
69
70
|
int correct = 0;
|
70
71
|
int total = 0;
|
@@ -95,13 +96,13 @@ void do_predict(mxArray *plhs[], const mxArray *prhs[], struct model *model_, co
|
|
95
96
|
if(label_vector_row_num!=testing_instance_number)
|
96
97
|
{
|
97
98
|
mexPrintf("Length of label vector does not match # of instances.\n");
|
98
|
-
fake_answer(plhs);
|
99
|
+
fake_answer(nlhs, plhs);
|
99
100
|
return;
|
100
101
|
}
|
101
102
|
if(label_vector_col_num!=1)
|
102
103
|
{
|
103
104
|
mexPrintf("label (1st argument) should be a vector (# of column is 1).\n");
|
104
|
-
fake_answer(plhs);
|
105
|
+
fake_answer(nlhs, plhs);
|
105
106
|
return;
|
106
107
|
}
|
107
108
|
|
@@ -117,7 +118,7 @@ void do_predict(mxArray *plhs[], const mxArray *prhs[], struct model *model_, co
|
|
117
118
|
if(mexCallMATLAB(1, pplhs, 1, pprhs, "transpose"))
|
118
119
|
{
|
119
120
|
mexPrintf("Error: cannot transpose testing instance matrix\n");
|
120
|
-
fake_answer(plhs);
|
121
|
+
fake_answer(nlhs, plhs);
|
121
122
|
return;
|
122
123
|
}
|
123
124
|
}
|
@@ -125,15 +126,15 @@ void do_predict(mxArray *plhs[], const mxArray *prhs[], struct model *model_, co
|
|
125
126
|
|
126
127
|
prob_estimates = Malloc(double, nr_class);
|
127
128
|
|
128
|
-
|
129
|
+
tplhs[0] = mxCreateDoubleMatrix(testing_instance_number, 1, mxREAL);
|
129
130
|
if(predict_probability_flag)
|
130
|
-
|
131
|
+
tplhs[2] = mxCreateDoubleMatrix(testing_instance_number, nr_class, mxREAL);
|
131
132
|
else
|
132
|
-
|
133
|
+
tplhs[2] = mxCreateDoubleMatrix(testing_instance_number, nr_w, mxREAL);
|
133
134
|
|
134
|
-
ptr_predict_label = mxGetPr(
|
135
|
-
ptr_prob_estimates = mxGetPr(
|
136
|
-
ptr_dec_values = mxGetPr(
|
135
|
+
ptr_predict_label = mxGetPr(tplhs[0]);
|
136
|
+
ptr_prob_estimates = mxGetPr(tplhs[2]);
|
137
|
+
ptr_dec_values = mxGetPr(tplhs[2]);
|
137
138
|
x = Malloc(struct feature_node, feature_number+2);
|
138
139
|
for(instance_index=0;instance_index<testing_instance_number;instance_index++)
|
139
140
|
{
|
@@ -189,8 +190,8 @@ void do_predict(mxArray *plhs[], const mxArray *prhs[], struct model *model_, co
|
|
189
190
|
info("Accuracy = %g%% (%d/%d)\n", (double) correct/total*100,correct,total);
|
190
191
|
|
191
192
|
// return accuracy, mean squared error, squared correlation coefficient
|
192
|
-
|
193
|
-
ptr = mxGetPr(
|
193
|
+
tplhs[1] = mxCreateDoubleMatrix(3, 1, mxREAL);
|
194
|
+
ptr = mxGetPr(tplhs[1]);
|
194
195
|
ptr[0] = (double)correct/total*100;
|
195
196
|
ptr[1] = error/total;
|
196
197
|
ptr[2] = ((total*sumpt-sump*sumt)*(total*sumpt-sump*sumt))/
|
@@ -199,12 +200,23 @@ void do_predict(mxArray *plhs[], const mxArray *prhs[], struct model *model_, co
|
|
199
200
|
free(x);
|
200
201
|
if(prob_estimates != NULL)
|
201
202
|
free(prob_estimates);
|
203
|
+
|
204
|
+
switch(nlhs)
|
205
|
+
{
|
206
|
+
case 3:
|
207
|
+
plhs[2] = tplhs[2];
|
208
|
+
plhs[1] = tplhs[1];
|
209
|
+
case 1:
|
210
|
+
case 0:
|
211
|
+
plhs[0] = tplhs[0];
|
212
|
+
}
|
202
213
|
}
|
203
214
|
|
204
215
|
void exit_with_help()
|
205
216
|
{
|
206
217
|
mexPrintf(
|
207
218
|
"Usage: [predicted_label, accuracy, decision_values/prob_estimates] = predict(testing_label_vector, testing_instance_matrix, model, 'liblinear_options','col')\n"
|
219
|
+
" [predicted_label] = predict(testing_label_vector, testing_instance_matrix, model, 'liblinear_options','col')\n"
|
208
220
|
"liblinear_options:\n"
|
209
221
|
"-b probability_estimates: whether to output probability estimates, 0 or 1 (default 0); currently for logistic regression only\n"
|
210
222
|
"-q quiet mode (no outputs)\n"
|
@@ -225,10 +237,10 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
225
237
|
info = &mexPrintf;
|
226
238
|
col_format_flag = 0;
|
227
239
|
|
228
|
-
if(nrhs > 5 || nrhs < 3)
|
240
|
+
if(nlhs == 2 || nlhs > 3 || nrhs > 5 || nrhs < 3)
|
229
241
|
{
|
230
242
|
exit_with_help();
|
231
|
-
fake_answer(plhs);
|
243
|
+
fake_answer(nlhs, plhs);
|
232
244
|
return;
|
233
245
|
}
|
234
246
|
if(nrhs == 5)
|
@@ -242,7 +254,7 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
242
254
|
|
243
255
|
if(!mxIsDouble(prhs[0]) || !mxIsDouble(prhs[1])) {
|
244
256
|
mexPrintf("Error: label vector and instance matrix must be double\n");
|
245
|
-
fake_answer(plhs);
|
257
|
+
fake_answer(nlhs, plhs);
|
246
258
|
return;
|
247
259
|
}
|
248
260
|
|
@@ -269,7 +281,7 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
269
281
|
if(i>=argc && argv[i-1][1] != 'q')
|
270
282
|
{
|
271
283
|
exit_with_help();
|
272
|
-
fake_answer(plhs);
|
284
|
+
fake_answer(nlhs, plhs);
|
273
285
|
return;
|
274
286
|
}
|
275
287
|
switch(argv[i-1][1])
|
@@ -284,7 +296,7 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
284
296
|
default:
|
285
297
|
mexPrintf("unknown option\n");
|
286
298
|
exit_with_help();
|
287
|
-
fake_answer(plhs);
|
299
|
+
fake_answer(nlhs, plhs);
|
288
300
|
return;
|
289
301
|
}
|
290
302
|
}
|
@@ -296,7 +308,7 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
296
308
|
{
|
297
309
|
mexPrintf("Error: can't read model: %s\n", error_msg);
|
298
310
|
free_and_destroy_model(&model_);
|
299
|
-
fake_answer(plhs);
|
311
|
+
fake_answer(nlhs, plhs);
|
300
312
|
return;
|
301
313
|
}
|
302
314
|
|
@@ -310,12 +322,12 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
310
322
|
}
|
311
323
|
|
312
324
|
if(mxIsSparse(prhs[1]))
|
313
|
-
do_predict(plhs, prhs, model_, prob_estimate_flag);
|
325
|
+
do_predict(nlhs, plhs, prhs, model_, prob_estimate_flag);
|
314
326
|
else
|
315
327
|
{
|
316
328
|
mexPrintf("Testing_instance_matrix must be sparse; "
|
317
329
|
"use sparse(Testing_instance_matrix) first\n");
|
318
|
-
fake_answer(plhs);
|
330
|
+
fake_answer(nlhs, plhs);
|
319
331
|
}
|
320
332
|
|
321
333
|
// destroy model_
|
@@ -324,7 +336,7 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
324
336
|
else
|
325
337
|
{
|
326
338
|
mexPrintf("model file should be a struct array\n");
|
327
|
-
fake_answer(plhs);
|
339
|
+
fake_answer(nlhs, plhs);
|
328
340
|
}
|
329
341
|
|
330
342
|
return;
|
@@ -243,9 +243,11 @@ int parse_command_line(int nrhs, const mxArray *prhs[], char *model_file_name)
|
|
243
243
|
return 0;
|
244
244
|
}
|
245
245
|
|
246
|
-
static void fake_answer(mxArray *plhs[])
|
246
|
+
static void fake_answer(int nlhs, mxArray *plhs[])
|
247
247
|
{
|
248
|
-
|
248
|
+
int i;
|
249
|
+
for(i=0;i<nlhs;i++)
|
250
|
+
plhs[i] = mxCreateDoubleMatrix(0, 0, mxREAL);
|
249
251
|
}
|
250
252
|
|
251
253
|
int read_problem_sparse(const mxArray *label_vec, const mxArray *instance_mat)
|
@@ -342,6 +344,13 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
342
344
|
// (for cross validation)
|
343
345
|
srand(1);
|
344
346
|
|
347
|
+
if(nlhs > 1)
|
348
|
+
{
|
349
|
+
exit_with_help();
|
350
|
+
fake_answer(nlhs, plhs);
|
351
|
+
return;
|
352
|
+
}
|
353
|
+
|
345
354
|
// Transform the input Matrix to libsvm format
|
346
355
|
if(nrhs > 1 && nrhs < 5)
|
347
356
|
{
|
@@ -349,7 +358,7 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
349
358
|
|
350
359
|
if(!mxIsDouble(prhs[0]) || !mxIsDouble(prhs[1])) {
|
351
360
|
mexPrintf("Error: label vector and instance matrix must be double\n");
|
352
|
-
fake_answer(plhs);
|
361
|
+
fake_answer(nlhs, plhs);
|
353
362
|
return;
|
354
363
|
}
|
355
364
|
|
@@ -357,7 +366,7 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
357
366
|
{
|
358
367
|
exit_with_help();
|
359
368
|
destroy_param(¶m);
|
360
|
-
fake_answer(plhs);
|
369
|
+
fake_answer(nlhs, plhs);
|
361
370
|
return;
|
362
371
|
}
|
363
372
|
|
@@ -368,7 +377,7 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
368
377
|
mexPrintf("Training_instance_matrix must be sparse; "
|
369
378
|
"use sparse(Training_instance_matrix) first\n");
|
370
379
|
destroy_param(¶m);
|
371
|
-
fake_answer(plhs);
|
380
|
+
fake_answer(nlhs, plhs);
|
372
381
|
return;
|
373
382
|
}
|
374
383
|
|
@@ -383,7 +392,7 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
383
392
|
free(prob.y);
|
384
393
|
free(prob.x);
|
385
394
|
free(x_space);
|
386
|
-
fake_answer(plhs);
|
395
|
+
fake_answer(nlhs, plhs);
|
387
396
|
return;
|
388
397
|
}
|
389
398
|
|
@@ -412,7 +421,7 @@ void mexFunction( int nlhs, mxArray *plhs[],
|
|
412
421
|
else
|
413
422
|
{
|
414
423
|
exit_with_help();
|
415
|
-
fake_answer(plhs);
|
424
|
+
fake_answer(nlhs, plhs);
|
416
425
|
return;
|
417
426
|
}
|
418
427
|
}
|
File without changes
|
File without changes
|
@@ -56,7 +56,7 @@ in liblinearutil.py and the usage is the same as the LIBLINEAR MATLAB interface.
|
|
56
56
|
# Sparse data
|
57
57
|
>>> y, x = [1,-1], [{1:1, 3:1}, {1:-1,3:-1}]
|
58
58
|
>>> prob = problem(y, x)
|
59
|
-
>>> param = parameter('-c 4 -B 1')
|
59
|
+
>>> param = parameter('-s 0 -c 4 -B 1')
|
60
60
|
>>> m = train(prob, param)
|
61
61
|
|
62
62
|
# Other utility functions
|
@@ -147,7 +147,7 @@ class parameter(Structure):
|
|
147
147
|
self.bias = -1
|
148
148
|
self.cross_validation = False
|
149
149
|
self.nr_fold = 0
|
150
|
-
self.print_func = None
|
150
|
+
self.print_func = cast(None, PRINT_STRING_FUN)
|
151
151
|
|
152
152
|
def parse_options(self, options):
|
153
153
|
if isinstance(options, list):
|
File without changes
|
File without changes
|
@@ -74,7 +74,7 @@ void TRON::tron(double *w)
|
|
74
74
|
for (i=0; i<n; i++)
|
75
75
|
w[i] = 0;
|
76
76
|
|
77
|
-
|
77
|
+
f = fun_obj->fun(w);
|
78
78
|
fun_obj->grad(w, g);
|
79
79
|
delta = dnrm2_(&n, g, &inc);
|
80
80
|
double gnorm1 = delta;
|
@@ -94,10 +94,10 @@ void TRON::tron(double *w)
|
|
94
94
|
|
95
95
|
gs = ddot_(&n, g, &inc, s, &inc);
|
96
96
|
prered = -0.5*(gs-ddot_(&n, s, &inc, r, &inc));
|
97
|
-
|
97
|
+
fnew = fun_obj->fun(w_new);
|
98
98
|
|
99
99
|
// Compute the actual reduction.
|
100
|
-
|
100
|
+
actred = f - fnew;
|
101
101
|
|
102
102
|
// On the first iteration, adjust the initial step bound.
|
103
103
|
snorm = dnrm2_(&n, s, &inc);
|
@@ -127,7 +127,7 @@ void TRON::tron(double *w)
|
|
127
127
|
iter++;
|
128
128
|
memcpy(w, w_new, sizeof(double)*n);
|
129
129
|
f = fnew;
|
130
|
-
|
130
|
+
fun_obj->grad(w, g);
|
131
131
|
|
132
132
|
gnorm = dnrm2_(&n, g, &inc);
|
133
133
|
if (gnorm <= eps*gnorm1)
|
File without changes
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,56 @@
|
|
1
|
+
$: << File.expand_path(File.join(__FILE__, '..', '..', '..', 'lib'))
|
2
|
+
require 'liblinear'
|
3
|
+
|
4
|
+
describe Liblinear::Model do
|
5
|
+
before do
|
6
|
+
@prob = Liblinear::Problem.new([1, 2], [[1],[2]])
|
7
|
+
@param = Liblinear::Parameter.new
|
8
|
+
@model = Liblinear::Model.new(@prob, @param)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#initialize' do
|
12
|
+
it 'raise ArgumentError when arg_1 not equal [Liblinear::Problem] or arg_2 not equal [Liblinear::Parameter]' do
|
13
|
+
expect{
|
14
|
+
Liblinear::Model.new(1, 2)
|
15
|
+
}.to raise_error(ArgumentError, 'arguments must be [Liblinear::Problem] and [Liblinear::Parameter]')
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'raise Liblinear::InvalidParameter when parameter is invalid' do
|
19
|
+
param = Liblinear::Parameter.new
|
20
|
+
param.C = -1
|
21
|
+
expect{
|
22
|
+
Liblinear::Model.new(@prob, param)
|
23
|
+
}.to raise_error(Liblinear::InvalidParameter, 'C <= 0')
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'raise ArgumentError when argument is not [String]' do
|
27
|
+
expect{
|
28
|
+
Liblinear::Model.new(1)
|
29
|
+
}.to raise_error(ArgumentError, 'argument must be [String]')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#nr_class' do
|
34
|
+
it 'returns the number of classes' do
|
35
|
+
expect(@model.nr_class).to eq(2)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#labels' do
|
40
|
+
it 'returns labels' do
|
41
|
+
expect(@model.labels).to eq([1, 2])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#predict' do
|
46
|
+
it 'return predicted class' do
|
47
|
+
expect(@model.predict([1]).class).to eq(Float)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#predict_probability' do
|
52
|
+
it 'return predict_probability' do
|
53
|
+
expect(@model.predict_probability([1]).class).to eq(Hash)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
$: << File.expand_path(File.join(__FILE__, '..', '..', '..', 'lib'))
|
2
|
+
require 'liblinear'
|
3
|
+
|
4
|
+
describe Liblinear::Parameter do
|
5
|
+
before do
|
6
|
+
@param = Liblinear::Parameter.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#solver_type' do
|
10
|
+
it 'returns solver type' do
|
11
|
+
@param.solver_type = 0
|
12
|
+
expect(@param.solver_type).to eq(Liblinear::L2R_LR)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#c' do
|
17
|
+
it 'returns C' do
|
18
|
+
@param.C = 2
|
19
|
+
expect(@param.C).to eq(2)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#eps' do
|
24
|
+
it 'returns eps' do
|
25
|
+
@param.eps = 0.0
|
26
|
+
expect(@param.eps).to eq(0.0)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#p' do
|
31
|
+
it 'returns p' do
|
32
|
+
@param.p = 0.0
|
33
|
+
expect(@param.p).to eq(0.0)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#nr_weight' do
|
38
|
+
it 'returns nr_weight' do
|
39
|
+
@param.nr_weight = 3
|
40
|
+
expect(@param.nr_weight).to eq(3)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#weight_label' do
|
45
|
+
it 'returns weight_label' do
|
46
|
+
@param.weight_label = [1, 2, 3]
|
47
|
+
expect(@param.weight_label.class).to eq(SWIG::TYPE_p_int)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#weight' do
|
52
|
+
it 'returns weight' do
|
53
|
+
@param.weight = [1.0, 2.0, 3.0]
|
54
|
+
expect(@param.weight.class).to eq(SWIG::TYPE_p_double)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
$: << File.expand_path(File.join(__FILE__, '..', '..', '..', 'lib'))
|
2
|
+
require 'liblinear'
|
3
|
+
|
4
|
+
describe Liblinear::Problem do
|
5
|
+
include Liblinearswig
|
6
|
+
before do
|
7
|
+
@problem = Liblinear::Problem.new([1, 2], [[1],[2]])
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#initialize' do
|
11
|
+
it 'raise ArgumentError when size of labels is different from that of examples' do
|
12
|
+
expect{
|
13
|
+
Liblinear::Problem.new([1, 2], [[1]])
|
14
|
+
}.to raise_error(ArgumentError, 'labels and examples must be same size')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#prob' do
|
19
|
+
it 'returns an instance of [Liblinearswig::Problem]' do
|
20
|
+
expect(@problem.prob.class).to eq(Liblinearswig::Problem)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|