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 )