rb-libsvm 1.1.4 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -3
- data/README.md +2 -2
- data/ext/libsvm/svm.cpp +77 -71
- data/ext/libsvm/svm.h +1 -1
- data/lib/libsvm/version.rb +1 -1
- data/rb-libsvm.gemspec +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50ef30c4d3cfe8e3785f6c408a48a34b5ff585b2
|
4
|
+
data.tar.gz: 80bbaef88fe9e9738b61fde4804c592e4e053367
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b8a9ff101bdc72026634f744583f858f1963b7241a18068a22fdd3ac0d84413937ed23093a34507a10f42052e9a73b79c396e85bf6e4b542c8c6c96249ea79a
|
7
|
+
data.tar.gz: 13de67e9c95836e814cc88077f8e9c59977f27dd9fa4e4171591c60f93059216046676a4ecc933ab9e37a47fb2e6b795e1aed45ccf82e0b0a8ef29bb8abd3ebb
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -21,7 +21,7 @@ this gem. You should install the original package if you need them.
|
|
21
21
|
It is helpful to consult the [README][] of the LIBSVM package for
|
22
22
|
reference when configuring the training parameters.
|
23
23
|
|
24
|
-
Currently this package includes libsvm version 3.
|
24
|
+
Currently this package includes libsvm version 3.18.
|
25
25
|
|
26
26
|
## Dependencies
|
27
27
|
|
@@ -110,4 +110,4 @@ http://www.igvita.com/2008/01/07/support-vector-machines-svm-in-ruby/
|
|
110
110
|
|
111
111
|
[ruby-svm]: http://sourceforge.net/projects/rubysvm/
|
112
112
|
|
113
|
-
[README]: https://github.com/
|
113
|
+
[README]: https://github.com/cjlin1/libsvm/blob/master/README
|
data/ext/libsvm/svm.cpp
CHANGED
@@ -74,7 +74,7 @@ public:
|
|
74
74
|
// return some position p where [p,len) need to be filled
|
75
75
|
// (p >= len if nothing needs to be filled)
|
76
76
|
int get_data(const int index, Qfloat **data, int len);
|
77
|
-
void swap_index(int i, int j);
|
77
|
+
void swap_index(int i, int j);
|
78
78
|
private:
|
79
79
|
int l;
|
80
80
|
long int size;
|
@@ -444,7 +444,7 @@ protected:
|
|
444
444
|
virtual double calculate_rho();
|
445
445
|
virtual void do_shrinking();
|
446
446
|
private:
|
447
|
-
bool be_shrunk(int i, double Gmax1, double Gmax2);
|
447
|
+
bool be_shrunk(int i, double Gmax1, double Gmax2);
|
448
448
|
};
|
449
449
|
|
450
450
|
void Solver::swap_index(int i, int j)
|
@@ -833,7 +833,7 @@ int Solver::select_working_set(int &out_i, int &out_j)
|
|
833
833
|
Gmax2 = G[j];
|
834
834
|
if (grad_diff > 0)
|
835
835
|
{
|
836
|
-
double obj_diff;
|
836
|
+
double obj_diff;
|
837
837
|
double quad_coef = QD[i]+QD[j]-2.0*y[i]*Q_i[j];
|
838
838
|
if (quad_coef > 0)
|
839
839
|
obj_diff = -(grad_diff*grad_diff)/quad_coef;
|
@@ -857,7 +857,7 @@ int Solver::select_working_set(int &out_i, int &out_j)
|
|
857
857
|
Gmax2 = -G[j];
|
858
858
|
if (grad_diff > 0)
|
859
859
|
{
|
860
|
-
double obj_diff;
|
860
|
+
double obj_diff;
|
861
861
|
double quad_coef = QD[i]+QD[j]+2.0*y[i]*Q_i[j];
|
862
862
|
if (quad_coef > 0)
|
863
863
|
obj_diff = -(grad_diff*grad_diff)/quad_coef;
|
@@ -1085,7 +1085,7 @@ int Solver_NU::select_working_set(int &out_i, int &out_j)
|
|
1085
1085
|
Gmaxp2 = G[j];
|
1086
1086
|
if (grad_diff > 0)
|
1087
1087
|
{
|
1088
|
-
double obj_diff;
|
1088
|
+
double obj_diff;
|
1089
1089
|
double quad_coef = QD[ip]+QD[j]-2*Q_ip[j];
|
1090
1090
|
if (quad_coef > 0)
|
1091
1091
|
obj_diff = -(grad_diff*grad_diff)/quad_coef;
|
@@ -1109,7 +1109,7 @@ int Solver_NU::select_working_set(int &out_i, int &out_j)
|
|
1109
1109
|
Gmaxn2 = -G[j];
|
1110
1110
|
if (grad_diff > 0)
|
1111
1111
|
{
|
1112
|
-
double obj_diff;
|
1112
|
+
double obj_diff;
|
1113
1113
|
double quad_coef = QD[in]+QD[j]-2*Q_in[j];
|
1114
1114
|
if (quad_coef > 0)
|
1115
1115
|
obj_diff = -(grad_diff*grad_diff)/quad_coef;
|
@@ -1641,7 +1641,7 @@ static void solve_nu_svr(
|
|
1641
1641
|
struct decision_function
|
1642
1642
|
{
|
1643
1643
|
double *alpha;
|
1644
|
-
double rho;
|
1644
|
+
double rho;
|
1645
1645
|
};
|
1646
1646
|
|
1647
1647
|
static decision_function svm_train_one(
|
@@ -1722,7 +1722,7 @@ static void sigmoid_train(
|
|
1722
1722
|
double *t=Malloc(double,l);
|
1723
1723
|
double fApB,p,q,h11,h22,h21,g1,g2,det,dA,dB,gd,stepsize;
|
1724
1724
|
double newA,newB,newf,d1,d2;
|
1725
|
-
int iter;
|
1725
|
+
int iter;
|
1726
1726
|
|
1727
1727
|
// Initial Point and Initial Fun Value
|
1728
1728
|
A=0.0; B=log((prior0+1.0)/(prior1+1.0));
|
@@ -1961,7 +1961,7 @@ static void svm_binary_svc_probability(
|
|
1961
1961
|
struct svm_model *submodel = svm_train(&subprob,&subparam);
|
1962
1962
|
for(j=begin;j<end;j++)
|
1963
1963
|
{
|
1964
|
-
svm_predict_values(submodel,prob->x[perm[j]],&(dec_values[perm[j]]));
|
1964
|
+
svm_predict_values(submodel,prob->x[perm[j]],&(dec_values[perm[j]]));
|
1965
1965
|
// ensure +1 -1 order; reason not using CV subroutine
|
1966
1966
|
dec_values[perm[j]] *= submodel->label[0];
|
1967
1967
|
}
|
@@ -2018,7 +2018,7 @@ static void svm_group_classes(const svm_problem *prob, int *nr_class_ret, int **
|
|
2018
2018
|
int nr_class = 0;
|
2019
2019
|
int *label = Malloc(int,max_nr_class);
|
2020
2020
|
int *count = Malloc(int,max_nr_class);
|
2021
|
-
int *data_label = Malloc(int,l);
|
2021
|
+
int *data_label = Malloc(int,l);
|
2022
2022
|
int i;
|
2023
2023
|
|
2024
2024
|
for(i=0;i<l;i++)
|
@@ -2394,9 +2394,9 @@ void svm_cross_validation(const svm_problem *prob, const svm_parameter *param, i
|
|
2394
2394
|
fold_start[0]=0;
|
2395
2395
|
for (i=1;i<=nr_fold;i++)
|
2396
2396
|
fold_start[i] = fold_start[i-1]+fold_count[i-1];
|
2397
|
-
free(start);
|
2397
|
+
free(start);
|
2398
2398
|
free(label);
|
2399
|
-
free(count);
|
2399
|
+
free(count);
|
2400
2400
|
free(index);
|
2401
2401
|
free(fold_count);
|
2402
2402
|
}
|
@@ -2443,7 +2443,7 @@ void svm_cross_validation(const svm_problem *prob, const svm_parameter *param, i
|
|
2443
2443
|
double *prob_estimates=Malloc(double,svm_get_nr_class(submodel));
|
2444
2444
|
for(j=begin;j<end;j++)
|
2445
2445
|
target[perm[j]] = svm_predict_probability(submodel,prob->x[perm[j]],prob_estimates);
|
2446
|
-
free(prob_estimates);
|
2446
|
+
free(prob_estimates);
|
2447
2447
|
}
|
2448
2448
|
else
|
2449
2449
|
for(j=begin;j<end;j++)
|
@@ -2453,7 +2453,7 @@ void svm_cross_validation(const svm_problem *prob, const svm_parameter *param, i
|
|
2453
2453
|
free(subprob.y);
|
2454
2454
|
}
|
2455
2455
|
free(fold_start);
|
2456
|
-
free(perm);
|
2456
|
+
free(perm);
|
2457
2457
|
}
|
2458
2458
|
|
2459
2459
|
|
@@ -2621,7 +2621,7 @@ double svm_predict_probability(
|
|
2621
2621
|
for(i=0;i<nr_class;i++)
|
2622
2622
|
free(pairwise_prob[i]);
|
2623
2623
|
free(dec_values);
|
2624
|
-
free(pairwise_prob);
|
2624
|
+
free(pairwise_prob);
|
2625
2625
|
return model->label[prob_max_idx];
|
2626
2626
|
}
|
2627
2627
|
else
|
@@ -2753,33 +2753,25 @@ static char* readline(FILE *input)
|
|
2753
2753
|
return line;
|
2754
2754
|
}
|
2755
2755
|
|
2756
|
-
|
2756
|
+
//
|
2757
|
+
// FSCANF helps to handle fscanf failures.
|
2758
|
+
// Its do-while block avoids the ambiguity when
|
2759
|
+
// if (...)
|
2760
|
+
// FSCANF();
|
2761
|
+
// is used
|
2762
|
+
//
|
2763
|
+
#define FSCANF(_stream, _format, _var) do{ if (fscanf(_stream, _format, _var) != 1) return false; }while(0)
|
2764
|
+
bool read_model_header(FILE *fp, svm_model* model)
|
2757
2765
|
{
|
2758
|
-
FILE *fp = fopen(model_file_name,"rb");
|
2759
|
-
if(fp==NULL) return NULL;
|
2760
|
-
|
2761
|
-
char *old_locale = strdup(setlocale(LC_ALL, NULL));
|
2762
|
-
setlocale(LC_ALL, "C");
|
2763
|
-
|
2764
|
-
// read parameters
|
2765
|
-
|
2766
|
-
svm_model *model = Malloc(svm_model,1);
|
2767
2766
|
svm_parameter& param = model->param;
|
2768
|
-
model->rho = NULL;
|
2769
|
-
model->probA = NULL;
|
2770
|
-
model->probB = NULL;
|
2771
|
-
model->sv_indices = NULL;
|
2772
|
-
model->label = NULL;
|
2773
|
-
model->nSV = NULL;
|
2774
|
-
|
2775
2767
|
char cmd[81];
|
2776
2768
|
while(1)
|
2777
2769
|
{
|
2778
|
-
|
2770
|
+
FSCANF(fp,"%80s",cmd);
|
2779
2771
|
|
2780
2772
|
if(strcmp(cmd,"svm_type")==0)
|
2781
2773
|
{
|
2782
|
-
|
2774
|
+
FSCANF(fp,"%80s",cmd);
|
2783
2775
|
int i;
|
2784
2776
|
for(i=0;svm_type_table[i];i++)
|
2785
2777
|
{
|
@@ -2792,19 +2784,12 @@ svm_model *svm_load_model(const char *model_file_name)
|
|
2792
2784
|
if(svm_type_table[i] == NULL)
|
2793
2785
|
{
|
2794
2786
|
fprintf(stderr,"unknown svm type.\n");
|
2795
|
-
|
2796
|
-
setlocale(LC_ALL, old_locale);
|
2797
|
-
free(old_locale);
|
2798
|
-
free(model->rho);
|
2799
|
-
free(model->label);
|
2800
|
-
free(model->nSV);
|
2801
|
-
free(model);
|
2802
|
-
return NULL;
|
2787
|
+
return false;
|
2803
2788
|
}
|
2804
2789
|
}
|
2805
2790
|
else if(strcmp(cmd,"kernel_type")==0)
|
2806
2791
|
{
|
2807
|
-
|
2792
|
+
FSCANF(fp,"%80s",cmd);
|
2808
2793
|
int i;
|
2809
2794
|
for(i=0;kernel_type_table[i];i++)
|
2810
2795
|
{
|
@@ -2816,85 +2801,106 @@ svm_model *svm_load_model(const char *model_file_name)
|
|
2816
2801
|
}
|
2817
2802
|
if(kernel_type_table[i] == NULL)
|
2818
2803
|
{
|
2819
|
-
fprintf(stderr,"unknown kernel function.\n");
|
2820
|
-
|
2821
|
-
setlocale(LC_ALL, old_locale);
|
2822
|
-
free(old_locale);
|
2823
|
-
free(model->rho);
|
2824
|
-
free(model->label);
|
2825
|
-
free(model->nSV);
|
2826
|
-
free(model);
|
2827
|
-
return NULL;
|
2804
|
+
fprintf(stderr,"unknown kernel function.\n");
|
2805
|
+
return false;
|
2828
2806
|
}
|
2829
2807
|
}
|
2830
2808
|
else if(strcmp(cmd,"degree")==0)
|
2831
|
-
|
2809
|
+
FSCANF(fp,"%d",¶m.degree);
|
2832
2810
|
else if(strcmp(cmd,"gamma")==0)
|
2833
|
-
|
2811
|
+
FSCANF(fp,"%lf",¶m.gamma);
|
2834
2812
|
else if(strcmp(cmd,"coef0")==0)
|
2835
|
-
|
2813
|
+
FSCANF(fp,"%lf",¶m.coef0);
|
2836
2814
|
else if(strcmp(cmd,"nr_class")==0)
|
2837
|
-
|
2815
|
+
FSCANF(fp,"%d",&model->nr_class);
|
2838
2816
|
else if(strcmp(cmd,"total_sv")==0)
|
2839
|
-
|
2817
|
+
FSCANF(fp,"%d",&model->l);
|
2840
2818
|
else if(strcmp(cmd,"rho")==0)
|
2841
2819
|
{
|
2842
2820
|
int n = model->nr_class * (model->nr_class-1)/2;
|
2843
2821
|
model->rho = Malloc(double,n);
|
2844
2822
|
for(int i=0;i<n;i++)
|
2845
|
-
|
2823
|
+
FSCANF(fp,"%lf",&model->rho[i]);
|
2846
2824
|
}
|
2847
2825
|
else if(strcmp(cmd,"label")==0)
|
2848
2826
|
{
|
2849
2827
|
int n = model->nr_class;
|
2850
2828
|
model->label = Malloc(int,n);
|
2851
2829
|
for(int i=0;i<n;i++)
|
2852
|
-
|
2830
|
+
FSCANF(fp,"%d",&model->label[i]);
|
2853
2831
|
}
|
2854
2832
|
else if(strcmp(cmd,"probA")==0)
|
2855
2833
|
{
|
2856
2834
|
int n = model->nr_class * (model->nr_class-1)/2;
|
2857
2835
|
model->probA = Malloc(double,n);
|
2858
2836
|
for(int i=0;i<n;i++)
|
2859
|
-
|
2837
|
+
FSCANF(fp,"%lf",&model->probA[i]);
|
2860
2838
|
}
|
2861
2839
|
else if(strcmp(cmd,"probB")==0)
|
2862
2840
|
{
|
2863
2841
|
int n = model->nr_class * (model->nr_class-1)/2;
|
2864
2842
|
model->probB = Malloc(double,n);
|
2865
2843
|
for(int i=0;i<n;i++)
|
2866
|
-
|
2844
|
+
FSCANF(fp,"%lf",&model->probB[i]);
|
2867
2845
|
}
|
2868
2846
|
else if(strcmp(cmd,"nr_sv")==0)
|
2869
2847
|
{
|
2870
2848
|
int n = model->nr_class;
|
2871
2849
|
model->nSV = Malloc(int,n);
|
2872
2850
|
for(int i=0;i<n;i++)
|
2873
|
-
|
2851
|
+
FSCANF(fp,"%d",&model->nSV[i]);
|
2874
2852
|
}
|
2875
2853
|
else if(strcmp(cmd,"SV")==0)
|
2876
2854
|
{
|
2877
2855
|
while(1)
|
2878
2856
|
{
|
2879
2857
|
int c = getc(fp);
|
2880
|
-
if(c==EOF || c=='\n') break;
|
2858
|
+
if(c==EOF || c=='\n') break;
|
2881
2859
|
}
|
2882
2860
|
break;
|
2883
2861
|
}
|
2884
2862
|
else
|
2885
2863
|
{
|
2886
2864
|
fprintf(stderr,"unknown text in model file: [%s]\n",cmd);
|
2887
|
-
|
2888
|
-
setlocale(LC_ALL, old_locale);
|
2889
|
-
free(old_locale);
|
2890
|
-
free(model->rho);
|
2891
|
-
free(model->label);
|
2892
|
-
free(model->nSV);
|
2893
|
-
free(model);
|
2894
|
-
return NULL;
|
2865
|
+
return false;
|
2895
2866
|
}
|
2896
2867
|
}
|
2897
2868
|
|
2869
|
+
return true;
|
2870
|
+
|
2871
|
+
}
|
2872
|
+
|
2873
|
+
svm_model *svm_load_model(const char *model_file_name)
|
2874
|
+
{
|
2875
|
+
FILE *fp = fopen(model_file_name,"rb");
|
2876
|
+
if(fp==NULL) return NULL;
|
2877
|
+
|
2878
|
+
char *old_locale = strdup(setlocale(LC_ALL, NULL));
|
2879
|
+
setlocale(LC_ALL, "C");
|
2880
|
+
|
2881
|
+
// read parameters
|
2882
|
+
|
2883
|
+
svm_model *model = Malloc(svm_model,1);
|
2884
|
+
model->rho = NULL;
|
2885
|
+
model->probA = NULL;
|
2886
|
+
model->probB = NULL;
|
2887
|
+
model->sv_indices = NULL;
|
2888
|
+
model->label = NULL;
|
2889
|
+
model->nSV = NULL;
|
2890
|
+
|
2891
|
+
// read header
|
2892
|
+
if (!read_model_header(fp, model))
|
2893
|
+
{
|
2894
|
+
fprintf(stderr, "ERROR: fscanf failed to read model\n");
|
2895
|
+
setlocale(LC_ALL, old_locale);
|
2896
|
+
free(old_locale);
|
2897
|
+
free(model->rho);
|
2898
|
+
free(model->label);
|
2899
|
+
free(model->nSV);
|
2900
|
+
free(model);
|
2901
|
+
return NULL;
|
2902
|
+
}
|
2903
|
+
|
2898
2904
|
// read sv_coef and SV
|
2899
2905
|
|
2900
2906
|
int elements = 0;
|
data/ext/libsvm/svm.h
CHANGED
data/lib/libsvm/version.rb
CHANGED
data/rb-libsvm.gemspec
CHANGED
@@ -10,6 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.homepage = "https://github.com/febeling/rb-libsvm"
|
11
11
|
s.summary = %q{Ruby language bindings for LIBSVM}
|
12
12
|
s.description = %q{libsvm and ruby without using swig}
|
13
|
+
s.required_ruby_version = '>= 1.8.7'
|
13
14
|
|
14
15
|
s.rubyforge_project = "rb-libsvm"
|
15
16
|
|
@@ -18,7 +19,6 @@ Gem::Specification.new do |s|
|
|
18
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
20
|
s.require_paths = ["lib"]
|
20
21
|
|
21
|
-
# specify any dependencies here; for example:
|
22
22
|
s.add_development_dependency('rake-compiler')
|
23
23
|
s.add_development_dependency('rspec', '>= 2.7.0')
|
24
24
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rb-libsvm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- C. Florian Ebeling
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-04-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake-compiler
|
@@ -85,7 +85,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
85
85
|
requirements:
|
86
86
|
- - ">="
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
88
|
+
version: 1.8.7
|
89
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
90
|
requirements:
|
91
91
|
- - ">="
|
@@ -104,3 +104,4 @@ test_files:
|
|
104
104
|
- spec/problem_spec.rb
|
105
105
|
- spec/spec_helper.rb
|
106
106
|
- spec/usage_spec.rb
|
107
|
+
has_rdoc:
|