numo-libsvm 0.5.0 → 1.1.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 +5 -5
- data/.github/workflows/build.yml +28 -0
- data/.gitmodules +3 -0
- data/CHANGELOG.md +19 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +1 -1
- data/README.md +5 -13
- data/Steepfile +20 -0
- data/ext/numo/libsvm/converter.c +8 -0
- data/ext/numo/libsvm/extconf.rb +7 -11
- data/ext/numo/libsvm/libsvm/svm.cpp +3182 -0
- data/ext/numo/libsvm/libsvm/svm.h +104 -0
- data/ext/numo/libsvm/libsvmext.c +16 -0
- data/ext/numo/libsvm/svm_parameter.c +2 -2
- data/ext/numo/libsvm/svm_problem.c +3 -0
- data/lib/numo/libsvm/version.rb +1 -1
- data/numo-libsvm.gemspec +8 -5
- data/sig/numo/libsvm.rbs +65 -0
- data/sig/patch.rbs +8 -0
- metadata +12 -63
- data/.travis.yml +0 -14
@@ -0,0 +1,104 @@
|
|
1
|
+
#ifndef _LIBSVM_H
|
2
|
+
#define _LIBSVM_H
|
3
|
+
|
4
|
+
#define LIBSVM_VERSION 324
|
5
|
+
|
6
|
+
#ifdef __cplusplus
|
7
|
+
extern "C" {
|
8
|
+
#endif
|
9
|
+
|
10
|
+
extern int libsvm_version;
|
11
|
+
|
12
|
+
struct svm_node
|
13
|
+
{
|
14
|
+
int index;
|
15
|
+
double value;
|
16
|
+
};
|
17
|
+
|
18
|
+
struct svm_problem
|
19
|
+
{
|
20
|
+
int l;
|
21
|
+
double *y;
|
22
|
+
struct svm_node **x;
|
23
|
+
};
|
24
|
+
|
25
|
+
enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR }; /* svm_type */
|
26
|
+
enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED }; /* kernel_type */
|
27
|
+
|
28
|
+
struct svm_parameter
|
29
|
+
{
|
30
|
+
int svm_type;
|
31
|
+
int kernel_type;
|
32
|
+
int degree; /* for poly */
|
33
|
+
double gamma; /* for poly/rbf/sigmoid */
|
34
|
+
double coef0; /* for poly/sigmoid */
|
35
|
+
|
36
|
+
/* these are for training only */
|
37
|
+
double cache_size; /* in MB */
|
38
|
+
double eps; /* stopping criteria */
|
39
|
+
double C; /* for C_SVC, EPSILON_SVR and NU_SVR */
|
40
|
+
int nr_weight; /* for C_SVC */
|
41
|
+
int *weight_label; /* for C_SVC */
|
42
|
+
double* weight; /* for C_SVC */
|
43
|
+
double nu; /* for NU_SVC, ONE_CLASS, and NU_SVR */
|
44
|
+
double p; /* for EPSILON_SVR */
|
45
|
+
int shrinking; /* use the shrinking heuristics */
|
46
|
+
int probability; /* do probability estimates */
|
47
|
+
};
|
48
|
+
|
49
|
+
//
|
50
|
+
// svm_model
|
51
|
+
//
|
52
|
+
struct svm_model
|
53
|
+
{
|
54
|
+
struct svm_parameter param; /* parameter */
|
55
|
+
int nr_class; /* number of classes, = 2 in regression/one class svm */
|
56
|
+
int l; /* total #SV */
|
57
|
+
struct svm_node **SV; /* SVs (SV[l]) */
|
58
|
+
double **sv_coef; /* coefficients for SVs in decision functions (sv_coef[k-1][l]) */
|
59
|
+
double *rho; /* constants in decision functions (rho[k*(k-1)/2]) */
|
60
|
+
double *probA; /* pariwise probability information */
|
61
|
+
double *probB;
|
62
|
+
int *sv_indices; /* sv_indices[0,...,nSV-1] are values in [1,...,num_traning_data] to indicate SVs in the training set */
|
63
|
+
|
64
|
+
/* for classification only */
|
65
|
+
|
66
|
+
int *label; /* label of each class (label[k]) */
|
67
|
+
int *nSV; /* number of SVs for each class (nSV[k]) */
|
68
|
+
/* nSV[0] + nSV[1] + ... + nSV[k-1] = l */
|
69
|
+
/* XXX */
|
70
|
+
int free_sv; /* 1 if svm_model is created by svm_load_model*/
|
71
|
+
/* 0 if svm_model is created by svm_train */
|
72
|
+
};
|
73
|
+
|
74
|
+
struct svm_model *svm_train(const struct svm_problem *prob, const struct svm_parameter *param);
|
75
|
+
void svm_cross_validation(const struct svm_problem *prob, const struct svm_parameter *param, int nr_fold, double *target);
|
76
|
+
|
77
|
+
int svm_save_model(const char *model_file_name, const struct svm_model *model);
|
78
|
+
struct svm_model *svm_load_model(const char *model_file_name);
|
79
|
+
|
80
|
+
int svm_get_svm_type(const struct svm_model *model);
|
81
|
+
int svm_get_nr_class(const struct svm_model *model);
|
82
|
+
void svm_get_labels(const struct svm_model *model, int *label);
|
83
|
+
void svm_get_sv_indices(const struct svm_model *model, int *sv_indices);
|
84
|
+
int svm_get_nr_sv(const struct svm_model *model);
|
85
|
+
double svm_get_svr_probability(const struct svm_model *model);
|
86
|
+
|
87
|
+
double svm_predict_values(const struct svm_model *model, const struct svm_node *x, double* dec_values);
|
88
|
+
double svm_predict(const struct svm_model *model, const struct svm_node *x);
|
89
|
+
double svm_predict_probability(const struct svm_model *model, const struct svm_node *x, double* prob_estimates);
|
90
|
+
|
91
|
+
void svm_free_model_content(struct svm_model *model_ptr);
|
92
|
+
void svm_free_and_destroy_model(struct svm_model **model_ptr_ptr);
|
93
|
+
void svm_destroy_param(struct svm_parameter *param);
|
94
|
+
|
95
|
+
const char *svm_check_parameter(const struct svm_problem *prob, const struct svm_parameter *param);
|
96
|
+
int svm_check_probability_model(const struct svm_model *model);
|
97
|
+
|
98
|
+
void svm_set_print_string_function(void (*print_func)(const char *));
|
99
|
+
|
100
|
+
#ifdef __cplusplus
|
101
|
+
}
|
102
|
+
#endif
|
103
|
+
|
104
|
+
#endif /* _LIBSVM_H */
|
data/ext/numo/libsvm/libsvmext.c
CHANGED
@@ -114,6 +114,9 @@ VALUE train(VALUE self, VALUE x_val, VALUE y_val, VALUE param_hash)
|
|
114
114
|
xfree_svm_problem(problem);
|
115
115
|
xfree_svm_parameter(param);
|
116
116
|
|
117
|
+
RB_GC_GUARD(x_val);
|
118
|
+
RB_GC_GUARD(y_val);
|
119
|
+
|
117
120
|
return model_hash;
|
118
121
|
}
|
119
122
|
|
@@ -229,6 +232,9 @@ VALUE cross_validation(VALUE self, VALUE x_val, VALUE y_val, VALUE param_hash, V
|
|
229
232
|
xfree_svm_problem(problem);
|
230
233
|
xfree_svm_parameter(param);
|
231
234
|
|
235
|
+
RB_GC_GUARD(x_val);
|
236
|
+
RB_GC_GUARD(y_val);
|
237
|
+
|
232
238
|
return t_val;
|
233
239
|
}
|
234
240
|
|
@@ -295,6 +301,8 @@ VALUE predict(VALUE self, VALUE x_val, VALUE param_hash, VALUE model_hash)
|
|
295
301
|
xfree_svm_model(model);
|
296
302
|
xfree_svm_parameter(param);
|
297
303
|
|
304
|
+
RB_GC_GUARD(x_val);
|
305
|
+
|
298
306
|
return y_val;
|
299
307
|
}
|
300
308
|
|
@@ -385,6 +393,8 @@ VALUE decision_function(VALUE self, VALUE x_val, VALUE param_hash, VALUE model_h
|
|
385
393
|
xfree_svm_model(model);
|
386
394
|
xfree_svm_parameter(param);
|
387
395
|
|
396
|
+
RB_GC_GUARD(x_val);
|
397
|
+
|
388
398
|
return y_val;
|
389
399
|
}
|
390
400
|
|
@@ -460,6 +470,8 @@ VALUE predict_proba(VALUE self, VALUE x_val, VALUE param_hash, VALUE model_hash)
|
|
460
470
|
xfree_svm_model(model);
|
461
471
|
xfree_svm_parameter(param);
|
462
472
|
|
473
|
+
RB_GC_GUARD(x_val);
|
474
|
+
|
463
475
|
return y_val;
|
464
476
|
}
|
465
477
|
|
@@ -493,6 +505,8 @@ VALUE load_svm_model(VALUE self, VALUE filename)
|
|
493
505
|
rb_ary_store(res, 0, param_hash);
|
494
506
|
rb_ary_store(res, 1, model_hash);
|
495
507
|
|
508
|
+
RB_GC_GUARD(filename);
|
509
|
+
|
496
510
|
return res;
|
497
511
|
}
|
498
512
|
|
@@ -527,6 +541,8 @@ VALUE save_svm_model(VALUE self, VALUE filename, VALUE param_hash, VALUE model_h
|
|
527
541
|
return Qfalse;
|
528
542
|
}
|
529
543
|
|
544
|
+
RB_GC_GUARD(filename);
|
545
|
+
|
530
546
|
return Qtrue;
|
531
547
|
}
|
532
548
|
|
@@ -35,13 +35,13 @@ struct svm_parameter* rb_hash_to_svm_parameter(VALUE param_hash)
|
|
35
35
|
param->weight_label = NULL;
|
36
36
|
if (!NIL_P(el)) {
|
37
37
|
param->weight_label = ALLOC_N(int, param->nr_weight);
|
38
|
-
memcpy(param->weight_label, (int32_t*)na_get_pointer_for_read(el), param->nr_weight);
|
38
|
+
memcpy(param->weight_label, (int32_t*)na_get_pointer_for_read(el), param->nr_weight * sizeof(int32_t));
|
39
39
|
}
|
40
40
|
el = rb_hash_aref(param_hash, ID2SYM(rb_intern("weight")));
|
41
41
|
param->weight = NULL;
|
42
42
|
if (!NIL_P(el)) {
|
43
43
|
param->weight = ALLOC_N(double, param->nr_weight);
|
44
|
-
memcpy(param->weight, (double*)na_get_pointer_for_read(el), param->nr_weight);
|
44
|
+
memcpy(param->weight, (double*)na_get_pointer_for_read(el), param->nr_weight * sizeof(double));
|
45
45
|
}
|
46
46
|
return param;
|
47
47
|
}
|
data/lib/numo/libsvm/version.rb
CHANGED
data/numo-libsvm.gemspec
CHANGED
@@ -28,6 +28,13 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
29
29
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
30
30
|
end
|
31
|
+
|
32
|
+
gem_dir = File.expand_path(__dir__) + '/'
|
33
|
+
submodule_path = `git submodule --quiet foreach pwd`.split($OUTPUT_RECORD_SEPARATOR).first
|
34
|
+
submodule_relative_path = submodule_path.sub gem_dir, ''
|
35
|
+
spec.files << "#{submodule_relative_path}/svm.cpp"
|
36
|
+
spec.files << "#{submodule_relative_path}/svm.h"
|
37
|
+
|
31
38
|
spec.bindir = 'exe'
|
32
39
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
33
40
|
spec.require_paths = ['lib']
|
@@ -39,9 +46,5 @@ Gem::Specification.new do |spec|
|
|
39
46
|
'documentation_uri' => 'https://yoshoku.github.io/numo-libsvm/doc/'
|
40
47
|
}
|
41
48
|
|
42
|
-
spec.add_runtime_dependency 'numo-narray', '
|
43
|
-
spec.add_development_dependency 'bundler', '~> 2.0'
|
44
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
45
|
-
spec.add_development_dependency 'rake-compiler', '~> 1.0'
|
46
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
49
|
+
spec.add_runtime_dependency 'numo-narray', '>= 0.9.1'
|
47
50
|
end
|
data/sig/numo/libsvm.rbs
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
module Numo
|
2
|
+
module Libsvm
|
3
|
+
module SvmType
|
4
|
+
C_SVC: Integer
|
5
|
+
NU_SVC: Integer
|
6
|
+
ONE_CLASS: Integer
|
7
|
+
EPSILON_SVR: Integer
|
8
|
+
NU_SVR: Integer
|
9
|
+
end
|
10
|
+
|
11
|
+
module KenelType
|
12
|
+
LINEAR: Integer
|
13
|
+
POLY: Integer
|
14
|
+
RBF: Integer
|
15
|
+
SIGMOID: Integer
|
16
|
+
PRECOMPUTED: Integer
|
17
|
+
end
|
18
|
+
|
19
|
+
LIBSVM_VERSION: Integer
|
20
|
+
VERSION: String
|
21
|
+
|
22
|
+
type model = {
|
23
|
+
nr_class: Integer,
|
24
|
+
l: Integer,
|
25
|
+
SV: Numo::DFloat,
|
26
|
+
sv_coef: Numo::DFloat,
|
27
|
+
rho: Numo::DFloat,
|
28
|
+
probA: Numo::DFloat,
|
29
|
+
probB: Numo::DFloat,
|
30
|
+
sv_indices: Numo::Int32,
|
31
|
+
label: Numo::Int32,
|
32
|
+
nSV: Numo::Int32,
|
33
|
+
free_sv: Integer
|
34
|
+
}
|
35
|
+
|
36
|
+
type param = {
|
37
|
+
svm_type: Integer?,
|
38
|
+
kernel_type: Integer?,
|
39
|
+
degree: Integer?,
|
40
|
+
gamma: Float?,
|
41
|
+
coef0: Float?,
|
42
|
+
cache_size: Float?,
|
43
|
+
eps: Float?,
|
44
|
+
C: Float?,
|
45
|
+
nr_weight: Integer?,
|
46
|
+
weight_label: Numo::Int32?,
|
47
|
+
weight: Numo::DFloat?,
|
48
|
+
nu: Float?,
|
49
|
+
p: Float?,
|
50
|
+
shrinking: bool?,
|
51
|
+
probability: bool?,
|
52
|
+
verbose: bool?,
|
53
|
+
random_seed: Integer?
|
54
|
+
}
|
55
|
+
|
56
|
+
def self?.cv: (Numo::DFloat x, Numo::DFloat y, param, Integer n_folds) -> Numo::DFloat
|
57
|
+
def self?.train: (Numo::DFloat x, Numo::DFloat y, param) -> model
|
58
|
+
def self?.predict: (Numo::DFloat x, param, model) -> Numo::DFloat
|
59
|
+
def self?.predict_proba: (Numo::DFloat x, param, model) -> Numo::DFloat
|
60
|
+
def self?.decision_function: (Numo::DFloat x, param, model) -> Numo::DFloat
|
61
|
+
def self?.save_svm_model: (String filename, param, model) -> bool
|
62
|
+
def self?.load_svm_model: (String filename) -> [param, model]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
data/sig/patch.rbs
ADDED
metadata
CHANGED
@@ -1,85 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: numo-libsvm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshoku
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.9.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.9.1
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '2.0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '2.0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rake
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '10.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '10.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rake-compiler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '1.0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '1.0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rspec
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '3.0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '3.0'
|
83
27
|
description: |
|
84
28
|
Numo::Libsvm is a Ruby gem binding to the LIBSVM library.
|
85
29
|
LIBSVM is one of the famous libraries that implemented Support Vector Machines,
|
@@ -92,20 +36,24 @@ extensions:
|
|
92
36
|
- ext/numo/libsvm/extconf.rb
|
93
37
|
extra_rdoc_files: []
|
94
38
|
files:
|
39
|
+
- ".github/workflows/build.yml"
|
95
40
|
- ".gitignore"
|
41
|
+
- ".gitmodules"
|
96
42
|
- ".rspec"
|
97
|
-
- ".travis.yml"
|
98
43
|
- CHANGELOG.md
|
99
44
|
- CODE_OF_CONDUCT.md
|
100
45
|
- Gemfile
|
101
46
|
- LICENSE.txt
|
102
47
|
- README.md
|
103
48
|
- Rakefile
|
49
|
+
- Steepfile
|
104
50
|
- ext/numo/libsvm/converter.c
|
105
51
|
- ext/numo/libsvm/converter.h
|
106
52
|
- ext/numo/libsvm/extconf.rb
|
107
53
|
- ext/numo/libsvm/kernel_type.c
|
108
54
|
- ext/numo/libsvm/kernel_type.h
|
55
|
+
- ext/numo/libsvm/libsvm/svm.cpp
|
56
|
+
- ext/numo/libsvm/libsvm/svm.h
|
109
57
|
- ext/numo/libsvm/libsvmext.c
|
110
58
|
- ext/numo/libsvm/libsvmext.h
|
111
59
|
- ext/numo/libsvm/svm_model.c
|
@@ -119,6 +67,8 @@ files:
|
|
119
67
|
- lib/numo/libsvm.rb
|
120
68
|
- lib/numo/libsvm/version.rb
|
121
69
|
- numo-libsvm.gemspec
|
70
|
+
- sig/numo/libsvm.rbs
|
71
|
+
- sig/patch.rbs
|
122
72
|
homepage: https://github.com/yoshoku/numo-libsvm
|
123
73
|
licenses:
|
124
74
|
- BSD-3-Clause
|
@@ -141,8 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
141
91
|
- !ruby/object:Gem::Version
|
142
92
|
version: '0'
|
143
93
|
requirements: []
|
144
|
-
|
145
|
-
rubygems_version: 2.6.14.4
|
94
|
+
rubygems_version: 3.2.21
|
146
95
|
signing_key:
|
147
96
|
specification_version: 4
|
148
97
|
summary: Numo::Libsvm is a Ruby gem binding to the LIBSVM library. Numo::Libsvm makes
|