Algorithm-SVM
view release on metacpan or search on metacpan
bindings.cpp view on Meta::CPAN
#include "bindings.h"
#include <errno.h>
#ifdef DEBUG
#include <stdarg.h>
void printf_dbg(const char *a, ...) {
va_list alist;
va_start(alist,a);
vfprintf(stdout,a,alist);
va_end(alist);
fflush(NULL);
}
#else
void printf_dbg(const char *a, ...) {}
#endif
DataSet::DataSet(double l) {
label = l;
realigned=false;
n=0;
max_n=16;
attributes = (struct svm_node *)malloc(sizeof(struct svm_node) * max_n);
assert(attributes!=NULL);
attributes[0].index=-1; // insert end-of-data marker
max_i=-1;
}
DataSet::~DataSet() {
printf_dbg("destructor DS called\n");
if (realigned) {
attributes[n].value=-1; // notify svm that dataset is destroyed
} else {
free(attributes);
}
}
void DataSet::realign(struct svm_node *address) {
assert(address!=NULL);
memcpy(address,attributes,sizeof(struct svm_node)*(n+1));
free(attributes); attributes=address;
max_n=n+1; realigned=true; attributes[n].value=0;
}
void DataSet::setAttribute(int k, double v) {
if (realigned) {
printf_dbg("set Attr with realigned k=%d, v=%lf\n",k,v);
max_n=n+2; attributes[n].value=-1; // notify svm to not care about allocating memory for this dataset
struct svm_node *address=(struct svm_node *)malloc(sizeof(struct svm_node)*max_n);
assert(address!=NULL);
memcpy(address,attributes,sizeof(struct svm_node)*(n+1));
attributes=address; realigned=false; if (k==-1) { return; }
} else {
printf_dbg("set Attr without realigned k=%d, v=%lf\n",k,v);
}
if (k>max_i) {
max_i=k;
if (v!=0) {
attributes[n].index=k;
attributes[n].value=v; n++; attributes[n].index=-1;
}
( run in 0.876 second using v1.01-cache-2.11-cpan-2398b32b56e )