numo-liblinear 0.4.0 → 0.5.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 +4 -4
- data/CHANGELOG.md +3 -0
- data/ext/numo/liblinear/converter.c +25 -0
- data/ext/numo/liblinear/converter.h +2 -0
- data/ext/numo/liblinear/liblinearext.c +8 -32
- data/ext/numo/liblinear/problem.c +34 -6
- data/lib/numo/liblinear/version.rb +1 -1
- data/numo-liblinear.gemspec +6 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25a456af8f35df53f449634445d25b92acbd3b78
|
4
|
+
data.tar.gz: 803d29787ecbe7c9f97c98924315c45ae8a8eba0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4cc867afc83ea85f816113136b31454edfacd5eb8471341492dd3bf3e618e1ac95a144f58a024625d0c35cc17e726085c43d7a69c4e36acb058b5348cd68846
|
7
|
+
data.tar.gz: 559931664558ca8979493254037dd275bd1e5d5b892f2a9d53f4d4c1e1bc805faf9466c88787ae31fc8103bdd58f5b7bb277f2d3fb9934b37d5d5d739d9d51a5
|
data/CHANGELOG.md
CHANGED
@@ -100,3 +100,28 @@ double** nary_to_dbl_mat(VALUE mat_val)
|
|
100
100
|
|
101
101
|
return mat;
|
102
102
|
}
|
103
|
+
|
104
|
+
struct feature_node* dbl_vec_to_node(double* const arr, int const size)
|
105
|
+
{
|
106
|
+
int i, j;
|
107
|
+
int n_nonzero_elements;
|
108
|
+
struct feature_node* node;
|
109
|
+
|
110
|
+
n_nonzero_elements = 0;
|
111
|
+
for (i = 0; i < size; i++) {
|
112
|
+
if (arr[i] != 0.0) n_nonzero_elements++;
|
113
|
+
}
|
114
|
+
|
115
|
+
node = ALLOC_N(struct feature_node, n_nonzero_elements + 1);
|
116
|
+
for (i = 0, j = 0; i < size; i++) {
|
117
|
+
if (arr[i] != 0.0) {
|
118
|
+
node[j].index = i + 1;
|
119
|
+
node[j].value = arr[i];
|
120
|
+
j++;
|
121
|
+
}
|
122
|
+
}
|
123
|
+
node[n_nonzero_elements].index = -1;
|
124
|
+
node[n_nonzero_elements].value = 0.0;
|
125
|
+
|
126
|
+
return node;
|
127
|
+
}
|
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
#include <string.h>
|
5
5
|
#include <ruby.h>
|
6
|
+
#include <linear.h>
|
6
7
|
#include <numo/narray.h>
|
7
8
|
#include <numo/template.h>
|
8
9
|
|
@@ -12,5 +13,6 @@ VALUE dbl_vec_to_nary(double* const arr, int const size);
|
|
12
13
|
double* nary_to_dbl_vec(VALUE vec_val);
|
13
14
|
VALUE dbl_mat_to_nary(double** const mat, int const n_rows, int const n_cols);
|
14
15
|
double** nary_to_dbl_mat(VALUE mat_val);
|
16
|
+
struct feature_node* dbl_vec_to_node(double* const arr, int const size);
|
15
17
|
|
16
18
|
#endif /* NUMO_LIBLINEAR_CONVERTER_H */
|
@@ -282,18 +282,12 @@ VALUE numo_liblinear_predict(VALUE self, VALUE x_val, VALUE param_hash, VALUE mo
|
|
282
282
|
x_pt = (double*)na_get_pointer_for_read(x_val);
|
283
283
|
|
284
284
|
/* Predict values. */
|
285
|
-
x_nodes = ALLOC_N(struct feature_node, n_features + 1);
|
286
|
-
x_nodes[n_features].index = -1;
|
287
|
-
x_nodes[n_features].value = 0.0;
|
288
285
|
for (i = 0; i < n_samples; i++) {
|
289
|
-
|
290
|
-
x_nodes[j].index = j + 1;
|
291
|
-
x_nodes[j].value = (double)x_pt[i * n_features + j];
|
292
|
-
}
|
286
|
+
x_nodes = dbl_vec_to_node(&x_pt[i * n_features], n_features);
|
293
287
|
y_pt[i] = predict(model, x_nodes);
|
288
|
+
xfree(x_nodes);
|
294
289
|
}
|
295
290
|
|
296
|
-
xfree(x_nodes);
|
297
291
|
xfree_model(model);
|
298
292
|
xfree_parameter(param);
|
299
293
|
|
@@ -365,34 +359,22 @@ VALUE numo_liblinear_decision_function(VALUE self, VALUE x_val, VALUE param_hash
|
|
365
359
|
|
366
360
|
/* Predict values. */
|
367
361
|
if (model->nr_class == 2 && model->param.solver_type != MCSVM_CS) {
|
368
|
-
x_nodes = ALLOC_N(struct feature_node, n_features + 1);
|
369
|
-
x_nodes[n_features].index = -1;
|
370
|
-
x_nodes[n_features].value = 0.0;
|
371
362
|
for (i = 0; i < n_samples; i++) {
|
372
|
-
|
373
|
-
x_nodes[j].index = j + 1;
|
374
|
-
x_nodes[j].value = (double)x_pt[i * n_features + j];
|
375
|
-
}
|
363
|
+
x_nodes = dbl_vec_to_node(&x_pt[i * n_features], n_features);
|
376
364
|
predict_values(model, x_nodes, &y_pt[i]);
|
365
|
+
xfree(x_nodes);
|
377
366
|
}
|
378
|
-
xfree(x_nodes);
|
379
367
|
} else {
|
380
368
|
y_cols = (int)y_shape[1];
|
381
369
|
dec_values = ALLOC_N(double, y_cols);
|
382
|
-
x_nodes = ALLOC_N(struct feature_node, n_features + 1);
|
383
|
-
x_nodes[n_features].index = -1;
|
384
|
-
x_nodes[n_features].value = 0.0;
|
385
370
|
for (i = 0; i < n_samples; i++) {
|
386
|
-
|
387
|
-
x_nodes[j].index = j + 1;
|
388
|
-
x_nodes[j].value = (double)x_pt[i * n_features + j];
|
389
|
-
}
|
371
|
+
x_nodes = dbl_vec_to_node(&x_pt[i * n_features], n_features);
|
390
372
|
predict_values(model, x_nodes, dec_values);
|
373
|
+
xfree(x_nodes);
|
391
374
|
for (j = 0; j < y_cols; j++) {
|
392
375
|
y_pt[i * y_cols + j] = dec_values[j];
|
393
376
|
}
|
394
377
|
}
|
395
|
-
xfree(x_nodes);
|
396
378
|
xfree(dec_values);
|
397
379
|
}
|
398
380
|
|
@@ -461,20 +443,14 @@ VALUE numo_liblinear_predict_proba(VALUE self, VALUE x_val, VALUE param_hash, VA
|
|
461
443
|
|
462
444
|
/* Predict values. */
|
463
445
|
probs = ALLOC_N(double, model->nr_class);
|
464
|
-
x_nodes = ALLOC_N(struct feature_node, n_features + 1);
|
465
|
-
x_nodes[n_features].index = -1;
|
466
|
-
x_nodes[n_features].value = 0.0;
|
467
446
|
for (i = 0; i < n_samples; i++) {
|
468
|
-
|
469
|
-
x_nodes[j].index = j + 1;
|
470
|
-
x_nodes[j].value = (double)x_pt[i * n_features + j];
|
471
|
-
}
|
447
|
+
x_nodes = dbl_vec_to_node(&x_pt[i * n_features], n_features);
|
472
448
|
predict_probability(model, x_nodes, probs);
|
449
|
+
xfree(x_nodes);
|
473
450
|
for (j = 0; j < model->nr_class; j++) {
|
474
451
|
y_pt[i * model->nr_class + j] = probs[j];
|
475
452
|
}
|
476
453
|
}
|
477
|
-
xfree(x_nodes);
|
478
454
|
xfree(probs);
|
479
455
|
}
|
480
456
|
|
@@ -29,9 +29,12 @@ struct problem* dataset_to_problem(VALUE x_val, VALUE y_val)
|
|
29
29
|
narray_t* x_nary;
|
30
30
|
double* x_pt;
|
31
31
|
double* y_pt;
|
32
|
-
int i, j;
|
32
|
+
int i, j, k;
|
33
33
|
int n_samples;
|
34
34
|
int n_features;
|
35
|
+
int n_nonzero_features;
|
36
|
+
int is_padded;
|
37
|
+
int last_feature_id;
|
35
38
|
|
36
39
|
GetNArray(x_val, x_nary);
|
37
40
|
n_samples = (int)NA_SHAPE(x_nary)[0];
|
@@ -46,14 +49,39 @@ struct problem* dataset_to_problem(VALUE x_val, VALUE y_val)
|
|
46
49
|
problem->x = ALLOC_N(struct feature_node*, n_samples);
|
47
50
|
problem->y = ALLOC_N(double, n_samples);
|
48
51
|
|
52
|
+
is_padded = 0;
|
49
53
|
for (i = 0; i < n_samples; i++) {
|
50
|
-
|
54
|
+
n_nonzero_features = 0;
|
51
55
|
for (j = 0; j < n_features; j++) {
|
52
|
-
|
53
|
-
|
56
|
+
if (x_pt[i * n_features + j] != 0.0) {
|
57
|
+
n_nonzero_features++;
|
58
|
+
last_feature_id = j + 1;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
if (is_padded == 0 && last_feature_id == n_features) {
|
62
|
+
is_padded = 1;
|
63
|
+
}
|
64
|
+
if (is_padded == 1) {
|
65
|
+
problem->x[i] = ALLOC_N(struct feature_node, n_nonzero_features + 1);
|
66
|
+
} else {
|
67
|
+
problem->x[i] = ALLOC_N(struct feature_node, n_nonzero_features + 2);
|
68
|
+
}
|
69
|
+
for (j = 0, k = 0; j < n_features; j++) {
|
70
|
+
if (x_pt[i * n_features + j] != 0.0) {
|
71
|
+
problem->x[i][k].index = j + 1;
|
72
|
+
problem->x[i][k].value = x_pt[i * n_features + j];
|
73
|
+
k++;
|
74
|
+
}
|
75
|
+
}
|
76
|
+
if (is_padded == 1) {
|
77
|
+
problem->x[i][n_nonzero_features].index = -1;
|
78
|
+
problem->x[i][n_nonzero_features].value = 0.0;
|
79
|
+
} else {
|
80
|
+
problem->x[i][n_nonzero_features].index = n_features;
|
81
|
+
problem->x[i][n_nonzero_features].value = 0.0;
|
82
|
+
problem->x[i][n_nonzero_features + 1].index = -1;
|
83
|
+
problem->x[i][n_nonzero_features + 1].value = 0.0;
|
54
84
|
}
|
55
|
-
problem->x[i][n_features].index = -1;
|
56
|
-
problem->x[i][n_features].value = 0.0;
|
57
85
|
problem->y[i] = y_pt[i];
|
58
86
|
}
|
59
87
|
|
data/numo-liblinear.gemspec
CHANGED
@@ -32,6 +32,12 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.require_paths = ['lib']
|
33
33
|
spec.extensions = ['ext/numo/liblinear/extconf.rb']
|
34
34
|
|
35
|
+
spec.metadata = {
|
36
|
+
'homepage_uri' => 'https://github.com/yoshoku/numo-liblinear',
|
37
|
+
'source_code_uri' => 'https://github.com/yoshoku/numo-liblinear',
|
38
|
+
'documentation_uri' => 'https://yoshoku.github.io/numo-liblinear/doc/'
|
39
|
+
}
|
40
|
+
|
35
41
|
spec.add_runtime_dependency 'numo-narray', '~> 0.9.1'
|
36
42
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
37
43
|
spec.add_development_dependency 'rake', '~> 10.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: numo-liblinear
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshoku
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|
@@ -119,7 +119,10 @@ files:
|
|
119
119
|
homepage: https://github.com/yoshoku/numo-liblinear
|
120
120
|
licenses:
|
121
121
|
- BSD-3-Clause
|
122
|
-
metadata:
|
122
|
+
metadata:
|
123
|
+
homepage_uri: https://github.com/yoshoku/numo-liblinear
|
124
|
+
source_code_uri: https://github.com/yoshoku/numo-liblinear
|
125
|
+
documentation_uri: https://yoshoku.github.io/numo-liblinear/doc/
|
123
126
|
post_install_message:
|
124
127
|
rdoc_options: []
|
125
128
|
require_paths:
|