Skip to content

Commit

Permalink
fix #19
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolaspanel committed Feb 9, 2015
1 parent ff350a7 commit 4168c8f
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 82 deletions.
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
language: node_js
node_js:
- 0.10
- 0.11
- 0.12
script:
- grunt travis
2 changes: 0 additions & 2 deletions src/addon.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

extern "C" {
void InitAll(Handle<Object> exports) {
//Isolate* isolate = Isolate::GetCurrent();
//HandleScope scope(isolate);
NodeSvm::Init(exports);
}
}
Expand Down
79 changes: 20 additions & 59 deletions src/node-svm/node-svm.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ NAN_METHOD(NodeSvm::New) {
// Invoked as constructor: `new MyObject(...)`
NodeSvm* obj = new NodeSvm();
obj->Wrap(args.This());
return args.This();
NanReturnValue(args.This());
}
else {
// Invoked as plain function `MyObject(...)`, turn into construct call.
Expand All @@ -34,7 +34,8 @@ NAN_METHOD(NodeSvm::New) {
#else
Local<Value> argv[argc];
#endif
return scope.Close(constructor->NewInstance(argc, argv));
Local<Function> cons = NanNew<Function>(constructor);
NanReturnValue(cons->NewInstance(argc, argv));
}
}

Expand All @@ -43,7 +44,7 @@ NAN_METHOD(NodeSvm::SetParameters) {
NodeSvm *obj = node::ObjectWrap::Unwrap<NodeSvm>(args.This());

assert(args[0]->IsObject());
Local<Object> params = *args[0]->ToObject();
Local<Object> params = args[0].As<Object>();
obj->setParameters(params);

NanReturnUndefined();
Expand All @@ -58,7 +59,7 @@ NAN_METHOD(NodeSvm::Train) {
// chech params
assert(args[0]->IsObject());

Local<Array> dataset = Array::Cast(*args[0]->ToObject());
Local<Array> dataset = args[0].As<Array>();
obj->setSvmProblem(dataset);
obj->train();

Expand All @@ -84,7 +85,7 @@ NAN_METHOD(NodeSvm::TrainAsync) {
assert(args[0]->IsObject());
assert(args[1]->IsFunction());

Local<Array> dataset = Array::Cast(*args[0]->ToObject());
Local<Array> dataset = args[0].As<Array>();
NanCallback *callback = new NanCallback(args[1].As<Function>());

NanAsyncQueueWorker(new TrainingWorker(obj, dataset, callback));
Expand All @@ -96,22 +97,22 @@ NAN_METHOD(NodeSvm::GetKernelType) {
NodeSvm *obj = node::ObjectWrap::Unwrap<NodeSvm>(args.This());
// check obj
assert(obj->hasParameters());
NanReturnValue(Number::New(obj->getKernelType()));
NanReturnValue(NanNew<Number>(obj->getKernelType()));
}

NAN_METHOD(NodeSvm::GetSvmType) {
NanScope();
NodeSvm *obj = node::ObjectWrap::Unwrap<NodeSvm>(args.This());
// check obj
assert(obj->hasParameters());
NanReturnValue(Number::New(obj->getSvmType()));
NanReturnValue(NanNew<Number>(obj->getSvmType()));
}

NAN_METHOD(NodeSvm::IsTrained) {
NanScope();
NodeSvm *obj = node::ObjectWrap::Unwrap<NodeSvm>(args.This());
// check obj
NanReturnValue(Boolean::New(obj->isTrained()));
NanReturnValue(NanNew<Boolean>(obj->isTrained()));
}

NAN_METHOD(NodeSvm::GetLabels) {
Expand All @@ -125,53 +126,18 @@ NAN_METHOD(NodeSvm::GetLabels) {
int nbClasses = obj->getClassNumber();
Handle<Array> labels = NanNew<Array>(nbClasses);
for (int j=0; j < nbClasses; j++){
labels->Set(j, Number::New(obj->getLabel(j)));
labels->Set(j, NanNew<Number>(obj->getLabel(j)));
}
NanReturnValue(labels);
}

// NAN_METHOD(NodeSvm::SaveToFile) {
// NanScope();
// NodeSvm *obj = node::ObjectWrap::Unwrap<NodeSvm>(args.This());
// if (args.Length() != 1 || !args[0]->IsString())
// return ThrowException(Exception::Error(String::New("usage: NodeSvm.saveToFile(\'filename.model\'')")));
// // check obj
// assert(obj->isTrained());

// char *name = new char[4096];
// String::Cast(*args[0])->WriteAscii(name, 0, 4096);
// name[4095] = 0;

// // Create a new empty array.
// int result = obj->saveModel(name);
// delete[] name;
// NanReturnValue(Number::New(result));
// }

// NAN_METHOD(NodeSvm::LoadFromFile) {
// NanScope();
// NodeSvm *obj = node::ObjectWrap::Unwrap<NodeSvm>(args.This());
// if (args.Length() != 1 || !args[0]->IsString()){
// return ThrowException(Exception::Error(String::New("usage: NodeSvm.loadFromFile(\'filename.model\'')")));
// }

// char *name = new char[4096];
// String::Cast(*args[0])->WriteAscii(name, 0, 4096);
// name[4095] = 0;

// // Create a new empty array.
// obj->loadModelFromFile(name);
// delete[] name;
// NanReturnUndefined();
// }

NAN_METHOD(NodeSvm::SetModel) {
NanScope();
NodeSvm *obj = node::ObjectWrap::Unwrap<NodeSvm>(args.This());
assert(args.Length() == 1);
assert(args[0]->IsObject());

Local<Array> model = Array::Cast(*args[0]->ToObject());
Local<Array> model = args[0].As<Array>();
obj->setModel(model);
NanReturnUndefined();
}
Expand All @@ -185,14 +151,14 @@ NAN_METHOD(NodeSvm::Predict) {
// chech params
assert(args[0]->IsObject());

Local<Array> inputs = Array::Cast(*args[0]->ToObject());
Local<Array> inputs = args[0].As<Array>();
assert(inputs->IsArray());
assert(inputs->Length() > 0);
svm_node *x = new svm_node[inputs->Length() + 1];
obj->getSvmNodes(inputs, x);
double prediction = obj->predict(x);
delete[] x;
NanReturnValue(Number::New(prediction));
NanReturnValue(NanNew<Number>(prediction));
}

NAN_METHOD(NodeSvm::PredictAsync) {
Expand All @@ -203,7 +169,7 @@ NAN_METHOD(NodeSvm::PredictAsync) {
assert(obj->isTrained());
// chech params
assert(args[0]->IsObject());
Local<Array> inputs = Array::Cast(*args[0]->ToObject());
Local<Array> inputs = args[0].As<Array>();
assert(inputs->IsArray());
assert(inputs->Length() > 0);
assert(args[1]->IsFunction());
Expand All @@ -223,7 +189,7 @@ NAN_METHOD(NodeSvm::PredictProbabilities) {
// chech params
assert(args[0]->IsObject());

Local<Array> inputs = Array::Cast(*args[0]->ToObject());
Local<Array> inputs = args[0].As<Array>();
assert(inputs->IsArray());
assert(inputs->Length() > 0);
svm_node *x = new svm_node[inputs->Length() + 1];
Expand All @@ -237,7 +203,7 @@ NAN_METHOD(NodeSvm::PredictProbabilities) {
// Create the result array
Handle<Array> probs = NanNew<Array>(nbClass);
for (int j=0; j < nbClass; j++){
probs->Set(j, Number::New(prob_estimates[j]));
probs->Set(j, NanNew<Number>(prob_estimates[j]));
}
delete[] prob_estimates;
delete[] x;
Expand All @@ -252,7 +218,7 @@ NAN_METHOD(NodeSvm::PredictProbabilitiesAsync) {
assert(obj->isTrained());
// chech params
assert(args[0]->IsObject());
Local<Array> inputs = Array::Cast(*args[0]->ToObject());
Local<Array> inputs = args[0].As<Array>();
assert(inputs->IsArray());
assert(inputs->Length() > 0);
assert(args[1]->IsFunction());
Expand Down Expand Up @@ -301,19 +267,14 @@ void NodeSvm::Init(Handle<Object> exports){

tpl->PrototypeTemplate()->Set(NanNew<String>("predictProbabilitiesAsync"),
NanNew<FunctionTemplate>(NodeSvm::PredictProbabilitiesAsync)->GetFunction());

// tpl->PrototypeTemplate()->Set(NanNew<String>("saveToFile"),
// NanNew<FunctionTemplate>(NodeSvm::SaveToFile)->GetFunction());

// tpl->PrototypeTemplate()->Set(NanNew<String>("loadFromFile"),
// NanNew<FunctionTemplate>(NodeSvm::LoadFromFile)->GetFunction());

tpl->PrototypeTemplate()->Set(NanNew<String>("loadFromModel"),
NanNew<FunctionTemplate>(NodeSvm::SetModel)->GetFunction());

tpl->PrototypeTemplate()->Set(NanNew<String>("getModel"),
NanNew<FunctionTemplate>(NodeSvm::GetModel)->GetFunction());

constructor = Persistent<Function>::New(tpl->GetFunction());
exports->Set(NanNew<String>("NodeSvm"), constructor);
//constructor = Persistent<Function>::New(tpl->GetFunction());
exports->Set(NanNew<String>("NodeSvm"), tpl->GetFunction());
NanAssignPersistent(constructor, tpl->GetFunction());
}
30 changes: 14 additions & 16 deletions src/node-svm/node-svm.h
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ class NodeSvm : public node::ObjectWrap
// rho
assert(obj->Has(NanNew<String>("rho")));
assert(obj->Get(NanNew<String>("rho"))->IsArray());
Local<Array> rho = Array::Cast(*obj->Get(NanNew<String>("rho"))->ToObject());
Local<Array> rho = obj->Get(NanNew<String>("rho")).As<Array>();
assert(rho->Length()==n);
new_model->rho = new double[n];
for(unsigned int i=0;i<n;i++){
Expand All @@ -203,7 +203,7 @@ class NodeSvm : public node::ObjectWrap
// classes
if (obj->Has(NanNew<String>("labels"))){
assert(obj->Get(NanNew<String>("labels"))->IsArray());
Local<Array> labels = Array::Cast(*obj->Get(NanNew<String>("labels"))->ToObject());
Local<Array> labels = obj->Get(NanNew<String>("labels")).As<Array>();
//assert(labels->Length()==new_model->nr_class);
new_model->label = new int[new_model->nr_class];
for(int i=0;i<new_model->nr_class;i++){
Expand All @@ -214,7 +214,7 @@ class NodeSvm : public node::ObjectWrap
// nSV
assert(obj->Has(NanNew<String>("nbSupportVectors")));
assert(obj->Get(NanNew<String>("nbSupportVectors"))->IsArray());
Local<Array> nbSupportVectors = Array::Cast(*obj->Get(NanNew<String>("nbSupportVectors"))->ToObject());
Local<Array> nbSupportVectors = obj->Get(NanNew<String>("nbSupportVectors")).As<Array>();
assert((int)nbSupportVectors->Length() == new_model->nr_class);
new_model->nSV = new int[new_model->nr_class];
for (int i=0;i<new_model->nr_class;i++){
Expand All @@ -227,7 +227,7 @@ class NodeSvm : public node::ObjectWrap
// probA
if (obj->Has(NanNew<String>("probA"))){
assert(obj->Get(NanNew<String>("probA"))->IsArray());
Local<Array> probA = Array::Cast(*obj->Get(NanNew<String>("probA"))->ToObject());
Local<Array> probA = obj->Get(NanNew<String>("probA")).As<Array>();
assert(probA->Length()==n);
new_model->probA = new double[n];
for(unsigned int i=0;i<n;i++){
Expand All @@ -240,7 +240,7 @@ class NodeSvm : public node::ObjectWrap
// probB
if (obj->Has(NanNew<String>("probB"))){
assert(obj->Get(NanNew<String>("probB"))->IsArray());
Local<Array> probB = Array::Cast(*obj->Get(NanNew<String>("probB"))->ToObject());
Local<Array> probB = obj->Get(NanNew<String>("probB")).As<Array>();
assert(probB->Length()==n);
new_model->probB = new double[n];
for(unsigned int i=0;i<n;i++){
Expand All @@ -255,7 +255,7 @@ class NodeSvm : public node::ObjectWrap
// SV
assert(obj->Has(NanNew<String>("supportVectors")));
assert(obj->Get(NanNew<String>("supportVectors"))->IsArray());
Local<Array> supportVectors = Array::Cast(*obj->Get(NanNew<String>("supportVectors"))->ToObject());
Local<Array> supportVectors = obj->Get(NanNew<String>("supportVectors")).As<Array>();
assert((int)supportVectors->Length() == new_model->l);
int m = new_model->nr_class - 1;
int l = new_model->l;
Expand All @@ -265,10 +265,10 @@ class NodeSvm : public node::ObjectWrap

new_model->SV = new svm_node*[l];
for(int i = 0; i < l; i++) {
Local<Array> ex = Array::Cast(*supportVectors->Get(i));
Local<Array> ex = supportVectors->Get(i).As<Array>();
assert(ex->Length()==2);
Local<Array> x = Array::Cast(*ex->Get(0));
Local<Array> y = Array::Cast(*ex->Get(1));
Local<Array> x = ex->Get(0).As<Array>();
Local<Array> y = ex->Get(1).As<Array>();

new_model->SV[i] = new svm_node[x->Length() + 1];
for(unsigned j = 0; j < x->Length(); ++j) {
Expand All @@ -287,7 +287,7 @@ class NodeSvm : public node::ObjectWrap
assert(model!=NULL);
};

Handle<Value> setSvmProblem(Local<Array> dataset){
void setSvmProblem(Local<Array> dataset){
NanScope();
struct svm_problem *prob = new svm_problem();
prob->l = 0;
Expand All @@ -301,15 +301,15 @@ class NodeSvm : public node::ObjectWrap
for (unsigned i=0; i < dataset->Length(); i++) {
Local<Value> t = dataset->Get(i);
assert(t->IsArray());
Local<Array> ex = Array::Cast(*t);
Local<Array> ex = t.As<Array>();
assert(ex->Length() == 2);

Local<Value> tin = ex->Get(0);
Local<Value> tout = ex->Get(1);
assert(tin->IsArray());
assert(tout->IsNumber());

Local<Array> x = Array::Cast(*tin);
Local<Array> x = tin.As<Array>();
if (nb_features == -1){
nb_features = x->Length();
}
Expand All @@ -322,8 +322,8 @@ class NodeSvm : public node::ObjectWrap
prob->x = new svm_node*[dataset->Length()];
for (unsigned i = 0; i < dataset->Length(); i++) {
prob->x[i] = new svm_node[nb_features + 1];
Local<Array> ex = Array::Cast(*dataset->Get(i));
Local<Array> x = Array::Cast(*ex->Get(0));
Local<Array> ex = dataset->Get(i).As<Array>();
Local<Array> x = ex->Get(0).As<Array>();
for (unsigned j = 0; j < x->Length(); ++j) {
double xi = x->Get(j)->NumberValue();
prob->x[i][j].index = j+1;
Expand All @@ -335,7 +335,6 @@ class NodeSvm : public node::ObjectWrap
prob->y[i] = y;
}
trainingProblem = prob;
NanReturnUndefined();
};

void train(){
Expand Down Expand Up @@ -478,7 +477,6 @@ class NodeSvm : public node::ObjectWrap
model->param.kernel_type == SIGMOID){
parameters->Set(NanNew<String>("r"), NanNew<Number>(model->param.coef0));
}


// Handle<Array> weightLabels = NanNew<Array>(model->param.nr_weight);
// Handle<Array> weights = NanNew<Array>(model->param.nr_weight);
Expand Down
2 changes: 1 addition & 1 deletion src/node-svm/prediction-worker.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class PredictionWorker : public NanAsyncWorker {
void HandleOKCallback () {
NanScope();
Local<Value> argv[] = {
Number::New(prediction)
NanNew<Number>(prediction)
};
callback->Call(1, argv);
};
Expand Down
6 changes: 3 additions & 3 deletions src/node-svm/probability-prediction-worker.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ class ProbabilityPredictionWorker : public NanAsyncWorker {
void HandleOKCallback () {
NanScope();
// Create the result array
Handle<Array> probs = Array::New(nbClass);
Handle<Array> probs = NanNew<Array>(nbClass);
for (int j=0; j < nbClass; j++){
probs->Set(j, Number::New(prob_estimates[j]));
probs->Set(j, NanNew<Number>(prob_estimates[j]));
}
Local<Value> argv[] = {
Local<Value>::New(probs)
NanNew<Value>(probs)
};
callback->Call(1, argv);
};
Expand Down
1 change: 0 additions & 1 deletion src/node-svm/training-worker.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ class TrainingWorker : public NanAsyncWorker {
Local<Value> argv[0];
#endif


callback->Call(0, argv);
};

Expand Down

0 comments on commit 4168c8f

Please sign in to comment.