/* Copyright (C) 2016 -2017 Jerry Jin */ #include #include #include "randomsequencegenerator.hpp" #include #include #include #include #include #include #include "../loop.hpp" void MersenneTwisterRsgWorker::Execute(){ try{ // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlMersenneTwisterRsg( mObjectID, mDimension, mSeed, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::MersenneTwisterRsg( valueObject, mDimension, mSeed, false )); // Store the Object in the Repository mReturnValue = ObjectHandler::Repository::instance().storeObject(mObjectID, object, false, valueObject); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } NAN_METHOD(QuantLibXL::MersenneTwisterRsg) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsNumber()) { return Nan::ThrowError("Dimension is required."); } if (info.Length() == 2 || !info[2]->IsNumber()) { return Nan::ThrowError("Seed is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type long DimensionCpp = Nan::To(info[1]).FromJust(); // convert js argument to c++ type long SeedCpp = Nan::To(info[2]).FromJust(); // launch worker MersenneTwisterRsgWorker* worker = new MersenneTwisterRsgWorker( ObjectIDCpp , DimensionCpp , SeedCpp ); worker->Execute(); Local argv[2] = { Nan::New(worker->mError).ToLocalChecked(), Nan::New(worker->mReturnValue).ToLocalChecked() }; v8::Local results = Nan::New(); Nan::Set(results, 0, argv[0]); Nan::Set(results, 1, argv[1]); info.GetReturnValue().Set(results); } void FaureRsgWorker::Execute(){ try{ // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlFaureRsg( mObjectID, mDimension, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::FaureRsg( valueObject, mDimension, false )); // Store the Object in the Repository mReturnValue = ObjectHandler::Repository::instance().storeObject(mObjectID, object, false, valueObject); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } NAN_METHOD(QuantLibXL::FaureRsg) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsNumber()) { return Nan::ThrowError("Dimension is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type long DimensionCpp = Nan::To(info[1]).FromJust(); // launch worker FaureRsgWorker* worker = new FaureRsgWorker( ObjectIDCpp , DimensionCpp ); worker->Execute(); Local argv[2] = { Nan::New(worker->mError).ToLocalChecked(), Nan::New(worker->mReturnValue).ToLocalChecked() }; v8::Local results = Nan::New(); Nan::Set(results, 0, argv[0]); Nan::Set(results, 1, argv[1]); info.GetReturnValue().Set(results); } void HaltonRsgWorker::Execute(){ try{ // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlHaltonRsg( mObjectID, mDimension, mSeed, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::HaltonRsg( valueObject, mDimension, mSeed, false )); // Store the Object in the Repository mReturnValue = ObjectHandler::Repository::instance().storeObject(mObjectID, object, false, valueObject); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } NAN_METHOD(QuantLibXL::HaltonRsg) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsNumber()) { return Nan::ThrowError("Dimension is required."); } if (info.Length() == 2 || !info[2]->IsNumber()) { return Nan::ThrowError("Seed is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type long DimensionCpp = Nan::To(info[1]).FromJust(); // convert js argument to c++ type long SeedCpp = Nan::To(info[2]).FromJust(); // launch worker HaltonRsgWorker* worker = new HaltonRsgWorker( ObjectIDCpp , DimensionCpp , SeedCpp ); worker->Execute(); Local argv[2] = { Nan::New(worker->mError).ToLocalChecked(), Nan::New(worker->mReturnValue).ToLocalChecked() }; v8::Local results = Nan::New(); Nan::Set(results, 0, argv[0]); Nan::Set(results, 1, argv[1]); info.GetReturnValue().Set(results); } void SobolRsgWorker::Execute(){ try{ // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlSobolRsg( mObjectID, mDimension, mSeed, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::SobolRsg( valueObject, mDimension, mSeed, false )); // Store the Object in the Repository mReturnValue = ObjectHandler::Repository::instance().storeObject(mObjectID, object, false, valueObject); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } NAN_METHOD(QuantLibXL::SobolRsg) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsNumber()) { return Nan::ThrowError("Dimension is required."); } if (info.Length() == 2 || !info[2]->IsNumber()) { return Nan::ThrowError("Seed is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type long DimensionCpp = Nan::To(info[1]).FromJust(); // convert js argument to c++ type long SeedCpp = Nan::To(info[2]).FromJust(); // launch worker SobolRsgWorker* worker = new SobolRsgWorker( ObjectIDCpp , DimensionCpp , SeedCpp ); worker->Execute(); Local argv[2] = { Nan::New(worker->mError).ToLocalChecked(), Nan::New(worker->mReturnValue).ToLocalChecked() }; v8::Local results = Nan::New(); Nan::Set(results, 0, argv[0]); Nan::Set(results, 1, argv[1]); info.GetReturnValue().Set(results); } void VariatesWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_OBJECT(ObjectIDObjPtr, mObjectID, QuantLibAddin::RandomSequenceGenerator) std::vector< std::vector > returnValue; // invoke the member function returnValue = ObjectIDObjPtr->variates( mSamples ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } NAN_METHOD(QuantLibXL::Variates) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsNumber()) { return Nan::ThrowError("Samples is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type long SamplesCpp = Nan::To(info[1]).FromJust(); // launch worker VariatesWorker* worker = new VariatesWorker( ObjectIDCpp , SamplesCpp ); worker->Execute(); Local tmpMatrix = Nan::New(worker->mReturnValue.size()); for (unsigned int i = 0; i < worker->mReturnValue.size(); i++) { Local tmpArray = Nan::New(worker->mReturnValue[i].size()); for (unsigned int j = 0; j < worker->mReturnValue[i].size(); j++) { Nan::Set(tmpArray,j,Nan::New(worker->mReturnValue[i][j])); } Nan::Set(tmpMatrix,i,tmpArray); } Local argv[2] = { Nan::New(worker->mError).ToLocalChecked(), tmpMatrix }; v8::Local results = Nan::New(); Nan::Set(results, 0, argv[0]); Nan::Set(results, 1, argv[1]); info.GetReturnValue().Set(results); } void RandWorker::Execute(){ try{ // invoke the utility function mReturnValue = QuantLibAddin::rand( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } NAN_METHOD(QuantLibXL::Rand) { // validate js arguments // launch worker RandWorker* worker = new RandWorker( ); worker->Execute(); Local argv[2] = { Nan::New(worker->mError).ToLocalChecked(), Nan::New(worker->mReturnValue) }; v8::Local results = Nan::New(); Nan::Set(results, 0, argv[0]); Nan::Set(results, 1, argv[1]); info.GetReturnValue().Set(results); } void RandomizeWorker::Execute(){ try{ // invoke the utility function QuantLibAddin::randomize( mSeed ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } NAN_METHOD(QuantLibXL::Randomize) { // validate js arguments if (info.Length() == 0 || !info[0]->IsNumber()) { return Nan::ThrowError("Seed is required."); } // convert js argument to c++ type long SeedCpp = Nan::To(info[0]).FromJust(); // launch worker RandomizeWorker* worker = new RandomizeWorker( SeedCpp ); worker->Execute(); Local argv[2] = { Nan::New(worker->mError).ToLocalChecked(), Nan::Null() }; v8::Local results = Nan::New(); Nan::Set(results, 0, argv[0]); Nan::Set(results, 1, argv[1]); info.GetReturnValue().Set(results); }