00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "common.h"
00020 #include "SVMClassifier.h"
00021 #define Malloc(type,n) (type *)malloc((n)*sizeof(type))
00022
00023 using namespace std;
00024 using namespace Marsyas;
00025
00026 SVMClassifier::SVMClassifier(mrs_string name) :
00027 MarSystem("SVMClassifier", name) {
00028 training_ = true;
00029 was_training_ = false;
00030 trained_ = false;
00031 kernel_ = LINEAR;
00032 svm_ = C_SVC;
00033 svm_model_ = NULL;
00034 num_nodes = 0;
00035
00036 addControls();
00037 }
00038
00039 SVMClassifier::SVMClassifier(const SVMClassifier& a) :
00040 MarSystem(a) {
00041 training_ = true;
00042 was_training_ = false;
00043 trained_ = false;
00044 kernel_ = LINEAR;
00045 svm_ = C_SVC;
00046 svm_model_ = NULL;
00047 num_nodes = 0;
00048
00049 ctrl_nClasses_ = getctrl("mrs_natural/nClasses");
00050 ctrl_sv_coef_ = getctrl("mrs_realvec/sv_coef");
00051 ctrl_SV_ = getctrl("mrs_realvec/SV");
00052 ctrl_rho_ = getctrl("mrs_realvec/rho");
00053 ctrl_probA_ = getctrl("mrs_realvec/probA");
00054 ctrl_probB_ = getctrl("mrs_realvec/probB");
00055 ctrl_label_ = getctrl("mrs_realvec/label");
00056 ctrl_nSV_ = getctrl("mrs_realvec/nSV");
00057 ctrl_nr_class_ = getctrl("mrs_natural/nr_class");
00058 ctrl_weight_ = getctrl("mrs_realvec/weight");
00059 ctrl_weight_label_ = getctrl("mrs_realvec/weight_label");
00060 ctrl_minimums_ = getctrl("mrs_realvec/minimums");
00061 ctrl_maximums_ = getctrl("mrs_realvec/maximums");
00062 ctrl_mode_ = getctrl("mrs_string/mode");
00063 ctrl_l_ = getctrl("mrs_natural/l");
00064 ctrl_svm_ = getctrl("mrs_string/svm");
00065 ctrl_kernel_ = getctrl("mrs_string/kernel");
00066 ctrl_degree_ = getctrl("mrs_natural/degree");
00067 ctrl_gamma_ = getctrl("mrs_natural/gamma");
00068 ctrl_coef0_ = getctrl("mrs_natural/coef0");
00069 ctrl_nu_ = getctrl("mrs_real/nu");
00070 ctrl_cache_size_ = getctrl("mrs_natural/cache_size");
00071 ctrl_C_ = getctrl("mrs_real/C");
00072 ctrl_eps_ = getctrl("mrs_real/eps");
00073 ctrl_p_ = getctrl("mrs_real/p");
00074 ctrl_shrinking_ = getctrl("mrs_bool/shrinking");
00075 ctrl_probability_ = getctrl("mrs_bool/probability");
00076 ctrl_nr_weight_ = getctrl("mrs_natural/nr_weight");
00077 ctrl_classPerms_ = getctrl("mrs_realvec/classPerms");
00078
00079 }
00080
00081 SVMClassifier::~SVMClassifier() {
00082 if (svm_model_ != NULL)
00083 {
00084 free(svm_model_->rho);
00085 free(svm_model_->probA);
00086 free(svm_model_->probB);
00087 free(svm_model_->label);
00088 free(svm_model_->nSV);
00089 for (int i=0; i < num_nodes; ++i)
00090 free(svm_model_->SV[i]);
00091 free(svm_model_->SV);
00092
00093 for (int i=0; i < svm_model_->nr_class-1; ++i)
00094 free(svm_model_->sv_coef[i]);
00095
00096 free(svm_model_->sv_coef);
00097 mrs_natural nInstances = instances_.getRows();
00098
00099 for (int i=0; i < nInstances; ++i)
00100 delete [] svm_prob_.x[i];
00101
00102 delete [] svm_prob_.x;
00103 delete [] svm_prob_.y;
00104 }
00105
00106 free(svm_model_);
00107 }
00108
00109 MarSystem* SVMClassifier::clone() const {
00110 return new SVMClassifier(*this);
00111 }
00112
00113 void SVMClassifier::addControls() {
00114 addctrl("mrs_string/mode", "train", ctrl_mode_);
00115 setctrlState("mrs_string/mode", true);
00116
00117 addctrl("mrs_natural/nClasses", 1, ctrl_nClasses_);
00118 setctrlState("mrs_natural/nClasses", true);
00119
00120 addctrl("mrs_realvec/minimums", realvec(), ctrl_minimums_);
00121 addctrl("mrs_realvec/maximums", realvec(), ctrl_maximums_);
00122 addctrl("mrs_realvec/sv_coef", realvec(), ctrl_sv_coef_);
00123 addctrl("mrs_realvec/SV", realvec(), ctrl_SV_);
00124 addctrl("mrs_realvec/rho", realvec(), ctrl_rho_);
00125 addctrl("mrs_realvec/probA", realvec(), ctrl_probA_);
00126 addctrl("mrs_realvec/probB", realvec(), ctrl_probB_);
00127 addctrl("mrs_realvec/label", realvec(), ctrl_label_);
00128 addctrl("mrs_realvec/nSV", realvec(), ctrl_nSV_);
00129 addctrl("mrs_natural/nr_class", (mrs_natural)0, ctrl_nr_class_);
00130 addctrl("mrs_natural/l", (mrs_natural)0, ctrl_l_);
00131 addctrl("mrs_realvec/weight_label", realvec(), ctrl_weight_label_);
00132 addctrl("mrs_realvec/weight", realvec(), ctrl_weight_);
00133 addctrl("mrs_string/svm", "C_SVC", ctrl_svm_);
00134 setctrlState("mrs_string/svm", true);
00135 addctrl("mrs_string/kernel", "LINEAR", ctrl_kernel_);;
00136 setctrlState("mrs_string/kernel", true);
00137 addctrl("mrs_natural/degree", (mrs_natural)3, ctrl_degree_);
00138 addctrl("mrs_natural/gamma", (mrs_natural)4, ctrl_gamma_);
00139 addctrl("mrs_natural/coef0", (mrs_natural)0, ctrl_coef0_);
00140 addctrl("mrs_real/nu", (mrs_real)0.5, ctrl_nu_);
00141 addctrl("mrs_natural/cache_size", (mrs_natural)100, ctrl_cache_size_);
00142 addctrl("mrs_real/C", (mrs_real)1.0, ctrl_C_);
00143 addctrl("mrs_real/eps", (mrs_real)0.001, ctrl_eps_);
00144 addctrl("mrs_real/p", (mrs_real)0.1, ctrl_p_);
00145 addctrl("mrs_bool/shrinking", true, ctrl_shrinking_);
00146 addctrl("mrs_bool/probability", true, ctrl_probability_);
00147 addctrl("mrs_natural/nr_weight", (mrs_natural)0, ctrl_nr_weight_);
00148 addctrl("mrs_realvec/classPerms", realvec(), ctrl_classPerms_);
00149
00150
00151 addctrl("mrs_bool/output_classPerms", true);
00152 }
00153
00154 void SVMClassifier::myUpdate(MarControlPtr sender) {
00155 (void) sender;
00156 MRSDIAG("SVMClassifier.cpp - SVMClassifier:myUpdate");
00157
00158 ctrl_onSamples_->setValue(ctrl_inSamples_, NOUPDATE);
00159 mrs_natural nClasses = getctrl("mrs_natural/nClasses")->to<mrs_natural>();
00160 ctrl_onObservations_->setValue(2 + nClasses, NOUPDATE);
00161
00162 if (ctrl_mode_->to<mrs_string>() == "train") {
00163 training_ = true;
00164 } else if (ctrl_mode_->to<mrs_string>() == "predict") {
00165 training_ = false;
00166 } else {
00167 cerr << "SVMClassifier.cpp, mode not supported"<<endl;
00168 exit(1);
00169 }
00170
00171
00172 if (ctrl_svm_->to<mrs_string>() == "C_SVC")
00173 svm_ = C_SVC;
00174 else if (ctrl_svm_->to<mrs_string>() == "ONE_CLASS")
00175 svm_ = ONE_CLASS;
00176 else if (ctrl_svm_->to<mrs_string>() == "EPSILON_SVR")
00177 svm_ = EPSILON_SVR;
00178 else if (ctrl_svm_->to<mrs_string>() == "NU_SVR")
00179 svm_ = NU_SVR;
00180 else
00181 {
00182 cerr << "SVMClassifier.cpp, SVM not supported"<<endl;
00183 exit(1);
00184 }
00185
00186 if (ctrl_kernel_->to<mrs_string>() == "LINEAR")
00187 kernel_ = LINEAR;
00188 else if (ctrl_kernel_->to<mrs_string>() == "POLY")
00189 kernel_ = POLY;
00190 else if (ctrl_kernel_->to<mrs_string>() == "RBF")
00191 kernel_ = RBF;
00192 else if (ctrl_kernel_->to<mrs_string>() == "SIGMOID")
00193 kernel_ = SIGMOID;
00194 else if (ctrl_kernel_->to<mrs_string>() == "PRECOMPUTED")
00195 kernel_ = PRECOMPUTED;
00196 else
00197 {
00198 cerr << "SVMClassifier.cpp, kernel not supported"<<endl;
00199 exit(1);
00200 }
00201
00202 if (!training_) {
00203 if (!trained_ && was_training_) {
00204
00205
00206
00207
00208
00209 svm_param_.svm_type = svm_;
00210 svm_param_.kernel_type = kernel_;
00211 svm_param_.degree = ctrl_degree_->to<mrs_natural>();
00212 svm_param_.gamma = ctrl_gamma_->to<mrs_natural>();
00213 svm_param_.coef0 = ctrl_coef0_->to<mrs_natural>();
00214 svm_param_.nu = ctrl_nu_->to<mrs_real>();
00215 svm_param_.cache_size = ctrl_cache_size_->to<mrs_natural>();
00216 svm_param_.C = ctrl_C_->to<mrs_real>();
00217 svm_param_.eps = ctrl_eps_->to<mrs_real>();
00218 svm_param_.p = ctrl_p_->to<mrs_real>();
00219 svm_param_.shrinking = ctrl_shrinking_->to<mrs_bool>();
00220 svm_param_.probability = ctrl_probability_->to<mrs_bool>();
00221 svm_param_.nr_weight = ctrl_nr_weight_->to<mrs_natural>();
00222
00223 if (svm_param_.nr_weight) {
00224 svm_param_.weight_label = Malloc(int,svm_param_.nr_weight);
00225 svm_param_.weight = Malloc(double,svm_param_.nr_weight);
00226 for (int i=0; i < svm_param_.nr_weight-1; ++i) {
00227 svm_param_.weight_label[i]
00228 = (int)ctrl_weight_label_->to<realvec>()(i);
00229 svm_param_.weight[i]
00230 = (double)ctrl_weight_->to<realvec>()(i);
00231 }
00232 } else {
00233 svm_param_.weight_label = NULL;
00234 svm_param_.weight = NULL;
00235 }
00236
00237
00238 instances_.NormMaxMin();
00239
00240
00241 mrs_natural nInstances = instances_.getRows();
00242 svm_prob_.l = nInstances;
00243 svm_prob_.y = new double[svm_prob_.l];
00244 svm_prob_.x = new svm_node*[nInstances];
00245 int l;
00246 mrs_bool seen;
00247
00248 for (int i=0; i < nInstances; ++i)
00249 {
00250
00251 l = instances_.GetClass(i);
00252 svm_prob_.y[i] = l;
00253
00254
00255 seen = false;
00256 for (size_t j=0; j < classPerms_.size(); j++)
00257 {
00258 if (l == classPerms_[j])
00259 seen = true;
00260 }
00261 if (!seen)
00262 classPerms_.push_back(l);
00263 }
00264
00265
00266 {
00267 MarControlAccessor acc_classPerms(ctrl_classPerms_);
00268 realvec& classPerms = acc_classPerms.to<mrs_realvec>();
00269 classPerms.create(classPerms_.size());
00270
00271 for (size_t i=0; i < classPerms_.size(); ++i)
00272 {
00273 classPerms(i) = classPerms_[i];
00274 }
00275 }
00276
00277
00278 for (int i=0; i < nInstances; ++i) {
00279 svm_prob_.x[i] = new svm_node[inObservations_];
00280 for (int j=0; j < inObservations_; j++) {
00281 if (j < inObservations_ -1) {
00282 svm_prob_.x[i][j].index = j+1;
00283 svm_prob_.x[i][j].value = instances_.at(i)->at(j);
00284 } else {
00285 svm_prob_.x[i][j].index = -1;
00286 svm_prob_.x[i][j].value = 0.0;
00287 }
00288 }
00289 }
00290
00291 const char *error_msg;
00292 error_msg = svm_check_parameter(&svm_prob_, &svm_param_);
00293 if (error_msg) {
00294 cerr << "SVMClassifier.cpp libsvm error: " << error_msg
00295 << endl;
00296 exit(1);
00297 }
00298
00299
00300 svm_model_ = svm_train(&svm_prob_, &svm_param_);
00301
00302 trained_ = true;
00303
00304 MRSDEBUG ("SVMCLassifier train ... done");
00305 MRSDEBUG ("svm_model_->nr_class = " << svm_model_->nr_class);
00306 MRSDEBUG ("svm_model_->l = " << svm_model_->l);
00307 MRSDEBUG ("svm_model_->free_sv = " << svm_model_->free_sv);
00308 MRSDEBUG ("svm_model_->SV = " << svm_model_->SV);
00309
00310 int n = 0;
00311
00312
00314 ctrl_minimums_->setValue(instances_.GetMinimums(), NOUPDATE);
00315 ctrl_maximums_->setValue(instances_.GetMaximums(), NOUPDATE);
00316
00317
00319 MarControlAccessor acc_sv_coef(ctrl_sv_coef_, NOUPDATE);
00320 realvec& sv_coef = acc_sv_coef.to<mrs_realvec>();
00321 MarControlAccessor acc_SV(ctrl_SV_, NOUPDATE);
00322 realvec& SV = acc_SV.to<mrs_realvec>();
00323 n = svm_model_->l;
00324 sv_coef.stretch(svm_model_->nr_class-1,n);
00325 SV.stretch(n, (inObservations_-1));
00326
00327 for (int i=0; i<n; ++i) {
00328 for (int j=0; j<svm_model_->nr_class-1; j++)
00329 sv_coef(j, i)=svm_model_->sv_coef[j][i];
00330 const svm_node *p = svm_model_->SV[i];
00331 int ind = 0;
00332 while (p->index != -1) {
00333 SV(i, ind)=p->value;
00334 p++;
00335 ind++;
00336 }
00337 }
00338
00340
00341
00342 {
00343 MarControlAccessor acc_rho(ctrl_rho_, NOUPDATE);
00344 realvec& rho = acc_rho.to<mrs_realvec>();
00345 n = svm_model_->nr_class*(svm_model_->nr_class-1)/2;
00346 rho.stretch(n);
00347 for (int i=0; i<n; ++i)
00348 rho(i)=svm_model_->rho[i];
00349 }
00350
00351
00352 if (svm_model_->probA) {
00353 MarControlAccessor acc_probA(ctrl_probA_, NOUPDATE);
00354 realvec& probA = acc_probA.to<mrs_realvec>();
00355 n = svm_model_->nr_class*(svm_model_->nr_class-1)/2;
00356 probA.stretch(n);
00357 for (int i=0; i<n; ++i)
00358 probA(i)=svm_model_->probA[i];
00359 }
00360
00361
00362 if (svm_model_->probB) {
00363 MarControlAccessor acc_probB(ctrl_probB_, NOUPDATE);
00364 realvec& probB = acc_probB.to<mrs_realvec>();
00365 n = svm_model_->nr_class*(svm_model_->nr_class-1)/2;
00366 probB.stretch(n+1);
00367 for (int i=0; i<n; ++i)
00368 probB(i)=svm_model_->probB[i];
00369 }
00370
00371
00372 if (svm_model_->label) {
00373 MarControlAccessor acc_label(ctrl_label_, NOUPDATE);
00374 realvec& label = acc_label.to<mrs_realvec>();
00375 n = svm_model_->nr_class;
00376 label.stretch(n);
00377 for (int i=0; i<n; ++i)
00378 label(i)=svm_model_->label[i];
00379 }
00380
00381
00382 if (svm_model_->nSV) {
00383 MarControlAccessor acc_nSV(ctrl_nSV_, NOUPDATE);
00384 realvec& nSV = acc_nSV.to<mrs_realvec>();
00385 n = svm_model_->nr_class;
00386 nSV.stretch(n);
00387 for (int i=0; i<n; ++i)
00388 nSV(i)=svm_model_->nSV[i];
00389 }
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401 ctrl_nr_class_->setValue(svm_model_->nr_class, NOUPDATE);
00402
00403
00404 ctrl_l_->setValue(svm_model_->l, NOUPDATE);
00405 }
00406 }
00407 }
00408
00409
00410
00411
00412
00413 void SVMClassifier::myProcess(realvec& in, realvec& out)
00414 {
00415
00416 if (training_) {
00417
00418
00419
00420
00421 if (!was_training_) {
00422 instances_.Create(inObservations_);
00423 trained_ = false;
00424
00425 }
00426
00427 instances_.Append(in);
00428 out(0,0) = in(inObservations_-1, 0);
00429 out(1,0) = in(inObservations_-1, 0);
00430
00431
00432 } else {
00433
00434 if (!trained_) {
00435 if (was_training_) {
00436 ;
00437 } else {
00438
00439
00440
00441 svm_prob_.y = NULL;
00442 svm_prob_.x = NULL;
00443 svm_model_ = Malloc(svm_model,1);
00444 svm_model_->param.svm_type = svm_;
00445 svm_model_->param.weight_label = NULL;
00446 svm_model_->param.weight = NULL;
00447 svm_model_->param.kernel_type = kernel_;
00448 svm_model_->param.degree = ctrl_degree_->to<mrs_natural>();
00449 svm_model_->param.gamma = ctrl_gamma_->to<mrs_natural>();
00450 svm_model_->param.coef0 = ctrl_coef0_->to<mrs_natural>();
00451 svm_model_->param.nu = ctrl_nu_->to<mrs_real>();
00452 svm_model_->param.cache_size = ctrl_cache_size_->to<mrs_natural>();
00453 svm_model_->param.C = ctrl_C_->to<mrs_real>();
00454 svm_model_->param.eps = ctrl_eps_->to<mrs_real>();
00455 svm_model_->param.p = ctrl_p_->to<mrs_real>();
00456 svm_model_->param.shrinking = ctrl_shrinking_->to<mrs_bool>();
00457 svm_model_->param.probability = ctrl_probability_->to<mrs_bool>();
00458 svm_model_->param.nr_weight = ctrl_nr_weight_->to<mrs_natural>();
00459
00460 {
00461 MarControlAccessor acc_classPerms(ctrl_classPerms_);
00462 realvec& classPerms = acc_classPerms.to<mrs_realvec>();
00463 classPerms_.clear();
00464 for (mrs_natural i=0; i < classPerms.getSize(); ++i)
00465 {
00466 classPerms_.push_back((mrs_natural)classPerms(i));
00467 }
00468 }
00469
00470 MRSDEBUG ("svm_model_->param.svm_type = " << svm_model_->param.svm_type);
00471 MRSDEBUG ("svm_model_->param.kernel_type = " << svm_model_->param.kernel_type);
00472 MRSDEBUG ("svm_model_->param.degree = " << svm_model_->param.degree);
00473 MRSDEBUG ("svm_model_->param.gamma = " << svm_model_->param.gamma);
00474 MRSDEBUG ("svm_model_->param.coef0 = " << svm_model_->param.coef0);
00475 MRSDEBUG ("svm_model_->param.nu = " << svm_model_->param.nu);
00476 MRSDEBUG ("svm_model_->param.cache_size = " << svm_model_->param.cache_size);
00477 MRSDEBUG ("svm_model_->param.C = " << svm_model_->param.C);
00478 MRSDEBUG ("svm_model_->param.eps = " << svm_model_->param.eps);
00479 MRSDEBUG ("svm_model_->param.p = " << svm_model_->param.p);
00480 MRSDEBUG ("svm_model_->param.shrinking = " << svm_model_->param.shrinking);
00481 MRSDEBUG ("svm_model_->param.probability = " << svm_model_->param.probability);
00482 MRSDEBUG ("svm_model_->param.nr_weight = " << svm_model_->param.nr_weight);
00483 MRSDEBUG ("svm_model_->param.weight_label = " << svm_model_->param.weight_label);
00484 MRSDEBUG ("svm_model_->param.weight = " << svm_model_->param.weight);
00485
00486 int n = ctrl_nr_class_->to<mrs_natural>();
00487 int l = ctrl_l_->to<mrs_natural>();
00488 int m = n*(n-1)/2;
00489
00490 svm_model_->nr_class = n;
00491 svm_model_->l = l;
00492
00493 MRSDEBUG ("svm_model_->nr_class = " << svm_model_->nr_class);
00494 MRSDEBUG ("svm_model_->l = " << svm_model_->l);
00495
00496
00497
00499
00500 if (ctrl_rho_->to<realvec>().getSize())
00501 {
00502 svm_model_->rho = Malloc(double,m);
00503 for (int i=0; i<m; ++i)
00504 svm_model_->rho[i]= ctrl_rho_->to<realvec>()(i);
00505 }
00506 else
00507 svm_model_->rho = NULL;
00508
00509 if (ctrl_probA_->to<realvec>().getSize())
00510 {
00511 svm_model_->probA = Malloc(double,m);
00512 for (int i=0; i<m; ++i)
00513 svm_model_->probA[i] = ctrl_probA_->to<realvec>()(i);
00514 }
00515 else
00516 svm_model_->probA = NULL;
00517
00518 if (ctrl_probB_->to<realvec>().getSize())
00519 {
00520 svm_model_->probB = Malloc(double,m);
00521 for (int i=0; i<m; ++i)
00522 svm_model_->probB[i]=ctrl_probB_->to<realvec>()(i);
00523 }
00524 else
00525 svm_model_->probB = NULL;
00526
00527 if (ctrl_label_->to<realvec>().getSize())
00528 {
00529 svm_model_->label = Malloc(int,n);
00530 for (int i=0; i<n; ++i)
00531 svm_model_->label[i]
00532 = (int)ctrl_label_->to<realvec>()(i);
00533 }
00534 else
00535 svm_model_->label = NULL;
00536
00537 if (ctrl_nSV_->to<realvec>().getSize())
00538 {
00539 svm_model_->nSV = Malloc(int,n);
00540 for (int i=0; i<n; ++i)
00541 svm_model_->nSV[i]=(int)ctrl_nSV_->to<realvec>()(i);
00542 }
00543 else
00544 svm_model_->nSV = NULL;
00545
00546 #ifdef MARSYAS_LOG_DEBUGS
00547 if (svm_model_->rho) {
00548 MRSDEBUG("svm_model_->rho =");
00549 for (int i=0; i<m; ++i)
00550 cout << " "<< svm_model_->rho[i];
00551 cout << endl;;
00552 }
00553
00554 if (svm_model_->probA) {
00555 MRSDEBUG("svm_model_->probA =");
00556 for (int i=0; i<m; ++i)
00557 cout << " " << svm_model_->probA[i];
00558 cout << endl;;
00559 }
00560
00561 if (svm_model_->probB) {
00562 MRSDEBUG("svm_model_->probB =");
00563 for (int i=0; i<m; ++i)
00564 cout << " " << svm_model_->probB[i];
00565 cout << endl;;
00566 }
00567
00568 if (svm_model_->label) {
00569 MRSDEBUG("svm_model_->label =");
00570 for (int i=0; i<n; ++i)
00571 cout << " " << svm_model_->label[i];
00572 cout << endl;;
00573 }
00574
00575 if (svm_model_->nSV) {
00576 MRSDEBUG("svm_model_->nSV =");
00577 for (int i=0; i<n; ++i)
00578 cout << " " << svm_model_->nSV[i];
00579 cout << endl;;
00580 }
00581
00582 #endif
00583 --n;
00584 m = ctrl_SV_->to<realvec>().getCols();
00585
00586 if (ctrl_sv_coef_->to<realvec>().getSize())
00587 {
00588 svm_model_->sv_coef = Malloc(double *,n);
00589 for (int i=0; i<n; ++i)
00590 svm_model_->sv_coef[i] = Malloc(double,l);
00591 for (int i=0; i<l; ++i)
00592 for (int k=0; k<n; k++)
00593 svm_model_->sv_coef[k][i]
00594 =ctrl_sv_coef_->to<realvec>()(k, i);
00595 }
00596
00597 if (ctrl_SV_->to<realvec>().getSize())
00598 {
00599 svm_model_->SV = Malloc(svm_node*,l);
00600 svm_node *x_space=NULL;
00601 if (l>0) {
00602 x_space = Malloc(svm_node, 2*m*l);
00603 num_nodes++;
00604 }
00605 int j=0;
00606 for (int i=0; i<l; ++i) {
00607 svm_model_->SV[i] = &x_space[j];
00608 for (int k = 0; k < m; k++) {
00609 x_space[j].index = k+1;
00610 x_space[j].value = ctrl_SV_->to<realvec>()(i, k);
00611 ++j;
00612 }
00613 x_space[j++].index = -1;
00614 }
00615 }
00616
00617 #ifdef MARSYAS_LOG_DEBUGS
00618
00619 MRSDEBUG ("svm_model_->SV = ");
00620
00621 {
00622 for (int i=0; i<l; ++i) {
00623 for (int j=0; j<n; j++) {
00624 if (svm_model_->sv_coef)
00625 cout <<svm_model_->sv_coef[j][i] << " ";
00626 if (svm_model_->SV) {
00627 const svm_node *p = svm_model_->SV[i];
00628 while (p->index != -1) {
00629 cout << p->index << ":";
00630 cout << p->value << " ";
00631 p++;
00632 }
00633 }
00634 cout << endl;;
00635 }
00636 }
00637 }
00638 #endif
00639 svm_model_->free_sv = 1;
00640 MRSDEBUG ("svm_model_->free_sv = " << svm_model_->free_sv);
00641 trained_ = true;
00642
00643 #ifdef MARSYAS_LOG_DEBUGS
00644 {
00645 MRSDEBUG ("mini/maxi : ");
00646 realvec mini = ctrl_minimums_->to<mrs_realvec>();
00647 realvec maxi = ctrl_maximums_->to<mrs_realvec>();
00648 for (int i=0; i<inObservations_ -1; ++i)
00649 cout << "mini(" << i << ")" << mini(i) << " maxi("
00650 << i << ")" << maxi(i) << endl;
00651 }
00652 #endif
00653 }
00654 }
00655
00656
00658
00659 struct svm_node* xv = new svm_node[inObservations_];
00660 double* probs = new double[svm_model_->nr_class];
00661
00662
00663
00664 realvec mini = ctrl_minimums_->to<mrs_realvec>();
00665 realvec maxi = ctrl_maximums_->to<mrs_realvec>();
00666
00667
00668 for (int i=0; i<inObservations_ -1; ++i)
00669 in(i, 0) = (in(i, 0) - mini(i)) / (maxi(i) - mini(i));
00670
00671
00672 for (int j=0; j < inObservations_; ++j) {
00673 if (j < inObservations_ -1) {
00674 xv[j].index = j+1;
00675 xv[j].value = in(j, 0);
00676 } else {
00677
00678 xv[j].index = -1;
00679 xv[j].value = 0.0;
00680 }
00681 }
00682
00683 double prediction = 0.0;
00684
00685 if (ctrl_probability_->to<mrs_bool>())
00686 prediction = svm_predict_probability(svm_model_, xv, probs);
00687 else
00688 prediction = svm_predict(svm_model_, xv);
00689
00690
00691
00692 if (getctrl("mrs_bool/output_classPerms")->isTrue()) {
00693 for (int i=0; i < svm_model_->nr_class; ++i) {
00694 out(2 + classPerms_[i], 0) = probs[i];
00695 }
00696 }
00697
00698 out(0,0) = (mrs_real)prediction;
00699 out(1,0) = in(inObservations_-1,0);
00700
00701
00702
00703 delete [] xv;
00704 delete [] probs;
00705 }
00706 was_training_ = training_;
00707 }