numo-libsvm 2.1.1 → 2.3.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 +6 -0
- data/LICENSE.txt +1 -1
- data/ext/numo/libsvm/libsvmext.cpp +1 -1
- data/ext/numo/libsvm/libsvmext.hpp +1 -1
- data/ext/numo/libsvm/src/COPYRIGHT +1 -1
- data/ext/numo/libsvm/src/svm.cpp +31 -17
- data/ext/numo/libsvm/src/svm.h +1 -1
- data/lib/numo/libsvm/version.rb +1 -1
- metadata +3 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b29c8702582263f5465fc49e1d3ba7b7efedaa895d3eb988a7167393b64d98e0
|
|
4
|
+
data.tar.gz: 90906818ef9c3b8120a98961da0a845acdfd4c079d5ed5266c1df7706fa39db1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e50f643d7b4b4ff55a61abeb2c297a8caebe60adb214f172da17bd569705edc71883aae780ecb5dbca3999571fffcd9cffb1057efcf23c697cb531c1cad17609
|
|
7
|
+
data.tar.gz: b1e45d76573c025deb93c7a29360320a1fe89172a79738a76f6f7561bd91e4443a49f4a108ab5e2cc99048b6e9132756c592915b92257ac6d7abff6f936ddb35
|
data/CHANGELOG.md
CHANGED
data/LICENSE.txt
CHANGED
data/ext/numo/libsvm/src/svm.cpp
CHANGED
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
#include <limits.h>
|
|
9
9
|
#include <locale.h>
|
|
10
10
|
#include "svm.h"
|
|
11
|
+
#ifdef _OPENMP
|
|
12
|
+
#include <omp.h>
|
|
13
|
+
#endif
|
|
14
|
+
|
|
11
15
|
int libsvm_version = LIBSVM_VERSION;
|
|
12
16
|
typedef float Qfloat;
|
|
13
17
|
typedef signed char schar;
|
|
@@ -50,7 +54,7 @@ static void info(const char *fmt,...)
|
|
|
50
54
|
char buf[BUFSIZ];
|
|
51
55
|
va_list ap;
|
|
52
56
|
va_start(ap,fmt);
|
|
53
|
-
|
|
57
|
+
vsnprintf(buf,BUFSIZ,fmt,ap);
|
|
54
58
|
va_end(ap);
|
|
55
59
|
(*svm_print_string)(buf);
|
|
56
60
|
}
|
|
@@ -67,7 +71,7 @@ static void info(const char *fmt,...) {}
|
|
|
67
71
|
class Cache
|
|
68
72
|
{
|
|
69
73
|
public:
|
|
70
|
-
Cache(int l,
|
|
74
|
+
Cache(int l,size_t size);
|
|
71
75
|
~Cache();
|
|
72
76
|
|
|
73
77
|
// request data [0,len)
|
|
@@ -77,7 +81,7 @@ public:
|
|
|
77
81
|
void swap_index(int i, int j);
|
|
78
82
|
private:
|
|
79
83
|
int l;
|
|
80
|
-
|
|
84
|
+
size_t size;
|
|
81
85
|
struct head_t
|
|
82
86
|
{
|
|
83
87
|
head_t *prev, *next; // a circular list
|
|
@@ -91,12 +95,12 @@ private:
|
|
|
91
95
|
void lru_insert(head_t *h);
|
|
92
96
|
};
|
|
93
97
|
|
|
94
|
-
Cache::Cache(int l_,
|
|
98
|
+
Cache::Cache(int l_,size_t size_):l(l_),size(size_)
|
|
95
99
|
{
|
|
96
100
|
head = (head_t *)calloc(l,sizeof(head_t)); // initialized to 0
|
|
97
101
|
size /= sizeof(Qfloat);
|
|
98
|
-
|
|
99
|
-
size = max(size, 2 * (
|
|
102
|
+
size_t header_size = l * sizeof(head_t) / sizeof(Qfloat);
|
|
103
|
+
size = max(size, 2 * (size_t) l + header_size) - header_size; // cache must be large enough for two columns
|
|
100
104
|
lru_head.next = lru_head.prev = &lru_head;
|
|
101
105
|
}
|
|
102
106
|
|
|
@@ -132,7 +136,7 @@ int Cache::get_data(const int index, Qfloat **data, int len)
|
|
|
132
136
|
if(more > 0)
|
|
133
137
|
{
|
|
134
138
|
// free old space
|
|
135
|
-
while(size < more)
|
|
139
|
+
while(size < (size_t)more)
|
|
136
140
|
{
|
|
137
141
|
head_t *old = lru_head.next;
|
|
138
142
|
lru_delete(old);
|
|
@@ -144,7 +148,7 @@ int Cache::get_data(const int index, Qfloat **data, int len)
|
|
|
144
148
|
|
|
145
149
|
// allocate new space
|
|
146
150
|
h->data = (Qfloat *)realloc(h->data,sizeof(Qfloat)*len);
|
|
147
|
-
size -= more;
|
|
151
|
+
size -= more; // previous while loop guarantees size >= more and subtraction of size_t variable will not underflow
|
|
148
152
|
swap(h->len,len);
|
|
149
153
|
}
|
|
150
154
|
|
|
@@ -1270,7 +1274,7 @@ public:
|
|
|
1270
1274
|
:Kernel(prob.l, prob.x, param)
|
|
1271
1275
|
{
|
|
1272
1276
|
clone(y,y_,prob.l);
|
|
1273
|
-
cache = new Cache(prob.l,(
|
|
1277
|
+
cache = new Cache(prob.l,(size_t)(param.cache_size*(1<<20)));
|
|
1274
1278
|
QD = new double[prob.l];
|
|
1275
1279
|
for(int i=0;i<prob.l;i++)
|
|
1276
1280
|
QD[i] = (this->*kernel_function)(i,i);
|
|
@@ -1282,6 +1286,9 @@ public:
|
|
|
1282
1286
|
int start, j;
|
|
1283
1287
|
if((start = cache->get_data(i,&data,len)) < len)
|
|
1284
1288
|
{
|
|
1289
|
+
#ifdef _OPENMP
|
|
1290
|
+
#pragma omp parallel for private(j) schedule(guided)
|
|
1291
|
+
#endif
|
|
1285
1292
|
for(j=start;j<len;j++)
|
|
1286
1293
|
data[j] = (Qfloat)(y[i]*y[j]*(this->*kernel_function)(i,j));
|
|
1287
1294
|
}
|
|
@@ -1319,7 +1326,7 @@ public:
|
|
|
1319
1326
|
ONE_CLASS_Q(const svm_problem& prob, const svm_parameter& param)
|
|
1320
1327
|
:Kernel(prob.l, prob.x, param)
|
|
1321
1328
|
{
|
|
1322
|
-
cache = new Cache(prob.l,(
|
|
1329
|
+
cache = new Cache(prob.l,(size_t)(param.cache_size*(1<<20)));
|
|
1323
1330
|
QD = new double[prob.l];
|
|
1324
1331
|
for(int i=0;i<prob.l;i++)
|
|
1325
1332
|
QD[i] = (this->*kernel_function)(i,i);
|
|
@@ -1366,7 +1373,7 @@ public:
|
|
|
1366
1373
|
:Kernel(prob.l, prob.x, param)
|
|
1367
1374
|
{
|
|
1368
1375
|
l = prob.l;
|
|
1369
|
-
cache = new Cache(l,(
|
|
1376
|
+
cache = new Cache(l,(size_t)(param.cache_size*(1<<20)));
|
|
1370
1377
|
QD = new double[2*l];
|
|
1371
1378
|
sign = new schar[2*l];
|
|
1372
1379
|
index = new int[2*l];
|
|
@@ -1397,6 +1404,9 @@ public:
|
|
|
1397
1404
|
int j, real_i = index[i];
|
|
1398
1405
|
if(cache->get_data(real_i,&data,l) < l)
|
|
1399
1406
|
{
|
|
1407
|
+
#ifdef _OPENMP
|
|
1408
|
+
#pragma omp parallel for private(j) schedule(guided)
|
|
1409
|
+
#endif
|
|
1400
1410
|
for(j=0;j<l;j++)
|
|
1401
1411
|
data[j] = (Qfloat)(this->*kernel_function)(real_i,j);
|
|
1402
1412
|
}
|
|
@@ -2219,11 +2229,9 @@ svm_model *svm_train(const svm_problem *prob, const svm_parameter *param)
|
|
|
2219
2229
|
double *prob_density_marks = Malloc(double,nr_marks);
|
|
2220
2230
|
|
|
2221
2231
|
if(svm_one_class_probability(prob,model,prob_density_marks) == 0)
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
model->prob_density_marks[i] = prob_density_marks[i];
|
|
2226
|
-
}
|
|
2232
|
+
model->prob_density_marks = prob_density_marks;
|
|
2233
|
+
else
|
|
2234
|
+
free(prob_density_marks);
|
|
2227
2235
|
}
|
|
2228
2236
|
|
|
2229
2237
|
free(f.alpha);
|
|
@@ -2436,8 +2444,8 @@ void svm_cross_validation(const svm_problem *prob, const svm_parameter *param, i
|
|
|
2436
2444
|
int nr_class;
|
|
2437
2445
|
if (nr_fold > l)
|
|
2438
2446
|
{
|
|
2447
|
+
fprintf(stderr,"WARNING: # folds (%d) > # data (%d). Will use # folds = # data instead (i.e., leave-one-out cross validation)\n", nr_fold, l);
|
|
2439
2448
|
nr_fold = l;
|
|
2440
|
-
fprintf(stderr,"WARNING: # folds > # data. Will use # folds = # data instead (i.e., leave-one-out cross validation)\n");
|
|
2441
2449
|
}
|
|
2442
2450
|
fold_start = Malloc(int,nr_fold+1);
|
|
2443
2451
|
// stratified cv may not give leave-one-out rate
|
|
@@ -2598,6 +2606,9 @@ double svm_predict_values(const svm_model *model, const svm_node *x, double* dec
|
|
|
2598
2606
|
{
|
|
2599
2607
|
double *sv_coef = model->sv_coef[0];
|
|
2600
2608
|
double sum = 0;
|
|
2609
|
+
#ifdef _OPENMP
|
|
2610
|
+
#pragma omp parallel for private(i) reduction(+:sum) schedule(guided)
|
|
2611
|
+
#endif
|
|
2601
2612
|
for(i=0;i<model->l;i++)
|
|
2602
2613
|
sum += sv_coef[i] * Kernel::k_function(x,model->SV[i],model->param);
|
|
2603
2614
|
sum -= model->rho[0];
|
|
@@ -2614,6 +2625,9 @@ double svm_predict_values(const svm_model *model, const svm_node *x, double* dec
|
|
|
2614
2625
|
int l = model->l;
|
|
2615
2626
|
|
|
2616
2627
|
double *kvalue = Malloc(double,l);
|
|
2628
|
+
#ifdef _OPENMP
|
|
2629
|
+
#pragma omp parallel for private(i) schedule(guided)
|
|
2630
|
+
#endif
|
|
2617
2631
|
for(i=0;i<l;i++)
|
|
2618
2632
|
kvalue[i] = Kernel::k_function(x,model->SV[i],model->param);
|
|
2619
2633
|
|
data/ext/numo/libsvm/src/svm.h
CHANGED
data/lib/numo/libsvm/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: numo-libsvm
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- yoshoku
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 2024-12-29 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: numo-narray
|
|
@@ -56,7 +55,6 @@ metadata:
|
|
|
56
55
|
source_code_uri: https://github.com/yoshoku/numo-libsvm
|
|
57
56
|
documentation_uri: https://yoshoku.github.io/numo-libsvm/doc/
|
|
58
57
|
rubygems_mfa_required: 'true'
|
|
59
|
-
post_install_message:
|
|
60
58
|
rdoc_options: []
|
|
61
59
|
require_paths:
|
|
62
60
|
- lib
|
|
@@ -71,8 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
71
69
|
- !ruby/object:Gem::Version
|
|
72
70
|
version: '0'
|
|
73
71
|
requirements: []
|
|
74
|
-
rubygems_version: 3.
|
|
75
|
-
signing_key:
|
|
72
|
+
rubygems_version: 3.6.2
|
|
76
73
|
specification_version: 4
|
|
77
74
|
summary: Numo::Libsvm is a Ruby gem binding to the LIBSVM library. Numo::Libsvm makes
|
|
78
75
|
to use the LIBSVM functions with dataset represented by Numo::NArray.
|