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);