ext/main.cpp in feedbackmine-libsvm-ruby-0.1.0 vs ext/main.cpp in feedbackmine-libsvm-ruby-0.1.1
- old
+ new
@@ -49,19 +49,38 @@
struct svm_node *n;
int i;
int len = RARRAY(xs)->len;
n = (struct svm_node *) calloc(sizeof(struct svm_node), len+1);
for (i = 0; i < len; ++i) {
+ n[i].value = NUM2DBL(rb_ary_entry(xs, i));
+ n[i].index = i;
+ }
+ n[i].value = 0;
+ n[i].index = -1;
+
+ return n;
+}
+
+/*value is harcoded as 1, array is sorted features*/
+struct svm_node *rubyArrayToNodelist2(VALUE xs)
+{
+ //struct obstack xso;
+ struct svm_node *n;
+ int i;
+ int len = RARRAY(xs)->len;
+ n = (struct svm_node *) calloc(sizeof(struct svm_node), len+1);
+ for (i = 0; i < len; ++i) {
n[i].value = 1;
n[i].index = NUM2DBL(rb_ary_entry(xs, i));
}
n[i].value = 0;
n[i].index = -1;
return n;
}
+
/*
* Serializes an SVMParameter object
*/
VALUE svmpa_svm_dump(VALUE self, VALUE limit)
{
@@ -537,10 +556,24 @@
result = svm_predict(rp->m, x);
free(x);
return rb_float_new(result);
}
+/*
+ * Predicts a value (regression or classification) based on an input vector
+ */
+static VALUE svmpm_predict2(VALUE self, VALUE xs)
+{
+ double result;
+ struct RSVM_Model *rp;
+ Data_Get_Struct(self, struct RSVM_Model, rp);
+ struct svm_node *x = rubyArrayToNodelist2(xs);
+ result = svm_predict(rp->m, x);
+ free(x);
+ return rb_float_new(result);
+}
+
static VALUE svmpm_save(VALUE self, VALUE filename)
{
int result;
struct RSVM_Model *rp;
Data_Get_Struct(self, struct RSVM_Model, rp);
@@ -617,10 +650,23 @@
addExample(rp, yd, fini);
if (rp->k == 0) rp->k = RARRAY(xs)->len;
return Qnil;
}
+static VALUE svmpr_addex2(VALUE self, VALUE y, VALUE xs)
+{
+ struct RSVM_Problem *rp;
+ struct svm_node *fini;
+ double yd;
+ Data_Get_Struct(self, struct RSVM_Problem, rp);
+ yd = NUM2DBL(y);
+ fini = rubyArrayToNodelist2(xs);
+ addExample(rp, yd, fini);
+ if (rp->k == 0) rp->k = RARRAY(xs)->len;
+ return Qnil;
+}
+
/* To be removed in next version */
struct svm_model
{
svm_parameter param; // parameter
int nr_class; // number of classes, = 2 in regression/one class svm
@@ -661,10 +707,11 @@
rb_define_singleton_method(cSVMProblem, "new", (VALUE (*) (...))svmpr_new, 0);
rb_define_method(cSVMProblem, "initialize", (VALUE (*) (...))svmpr_init, 0);
rb_define_method(cSVMProblem, "size", (VALUE (*) (...))svmpr_size, 0);
rb_define_method(cSVMProblem, "addExample", (VALUE (*) (...))svmpr_addex, 2);
+ rb_define_method(cSVMProblem, "addExample2", (VALUE (*) (...))svmpr_addex2, 2);
rb_define_const(mSVM, "C_SVC", INT2FIX(C_SVC));
rb_define_const(mSVM, "NU_SVC", INT2FIX(NU_SVC));
rb_define_const(mSVM, "ONE_CLASS", INT2FIX(ONE_CLASS));
rb_define_const(mSVM, "EPSILON_SVR", INT2FIX(EPSILON_SVR));
@@ -715,9 +762,10 @@
rb_define_singleton_method(cSVMModel, "_alloc", (VALUE (*) (...))svmpa_allocate, 1);
*/
rb_define_singleton_method(cSVMModel, "new", (VALUE (*) (...))svmpm_new, 2);
rb_define_method(cSVMModel, "predict", (VALUE (*) (...))svmpm_predict, 1);
+ rb_define_method(cSVMModel, "predict2", (VALUE (*) (...))svmpm_predict2, 1);
rb_define_method(cSVMModel, "predict_probability", (VALUE (*) (...))svmpm_predict_probability, 1);
rb_define_method(cSVMModel, "predict_values", (VALUE (*) (...))svmpm_predict_values, 1);
rb_define_method(cSVMModel, "svcount", (VALUE (*) (...))svmpm_svcount, 0);
rb_define_method(cSVMModel, "save", (VALUE (*) (...))svmpm_save, 1);
rb_define_singleton_method(cSVMModel, "load", (VALUE (*) (...))svmpm_load, 1);