/* Copyright (C) 2016 -2017 Jerry Jin */ #include #include #include "defaulttermstructures.hpp" #include #include #include #include #include #include #include #include #include "../loop.hpp" void RelinkableHandleDefaultProbabilityTermStructureWorker::Execute(){ try{ // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlRelinkableHandleDefaultProbabilityTermStructure( mObjectID, mCurrentLink, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::RelinkableHandleImpl( valueObject, mCurrentLink, 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::RelinkableHandleDefaultProbabilityTermStructure) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsString()) { return Nan::ThrowError("CurrentLink is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type String::Utf8Value strCurrentLink(info[1]->ToString()); string CurrentLinkCpp(strdup(*strCurrentLink)); // launch worker RelinkableHandleDefaultProbabilityTermStructureWorker* worker = new RelinkableHandleDefaultProbabilityTermStructureWorker( ObjectIDCpp , CurrentLinkCpp ); 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 FlatHazardRateWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes QuantLib::Size NDaysLib; QuantLibAddin::cppToLibrary(mNDays, NDaysLib); // convert input datatypes to QuantLib enumerated datatypes QuantLib::Calendar CalendarEnum = ObjectHandler::Create()(mCalendar); // convert object IDs into library objects QuantLib::Handle RateLibObj = ObjectHandler::convert2< QuantLib::Handle >(mRate, "Rate"); // convert input datatypes to QuantLib enumerated datatypes QuantLib::DayCounter DayCounterEnum = ObjectHandler::Create()(mDayCounter); // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlFlatHazardRate( mObjectID, mNDays, mCalendar, mRate, mDayCounter, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::FlatHazardRate( valueObject, NDaysLib, CalendarEnum, RateLibObj, DayCounterEnum, 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::FlatHazardRate) { // 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("NDays is required."); } if (info.Length() == 2 || !info[2]->IsString()) { return Nan::ThrowError("Calendar is required."); } if (info.Length() == 4 || !info[4]->IsString()) { return Nan::ThrowError("DayCounter 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 NDaysCpp = Nan::To(info[1]).FromJust(); // convert js argument to c++ type String::Utf8Value strCalendar(info[2]->ToString()); string CalendarCpp(strdup(*strCalendar)); // convert js argument to c++ type ObjectHandler::property_t RateCpp = ObjectHandler::property_t(static_cast(Nan::To(info[3]).FromJust())); // convert js argument to c++ type String::Utf8Value strDayCounter(info[4]->ToString()); string DayCounterCpp(strdup(*strDayCounter)); // launch worker FlatHazardRateWorker* worker = new FlatHazardRateWorker( ObjectIDCpp , NDaysCpp , CalendarCpp , RateCpp , DayCounterCpp ); 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 DefaultTSDefaultProbabilityWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_OBJECT(ObjectIDTemp, mObjectID, ObjectHandler::Object) boost::shared_ptr ObjectIDLibObjPtr = QuantLibAddin::CoerceTermStructure< QuantLibAddin::DefaultProbabilityTermStructure, QuantLib::DefaultProbabilityTermStructure>()( ObjectIDTemp); // convert input datatypes to QuantLib datatypes std::vector DatesLib = ObjectHandler::vector::convert2( mDates, "Dates"); // loop on the input parameter and populate the return vector QuantLibAddin::qlDefaultTSDefaultProbabilityBind bindObject = boost::bind((QuantLibAddin::qlDefaultTSDefaultProbabilitySignature) &QuantLib::DefaultProbabilityTermStructure::defaultProbability, ObjectIDLibObjPtr ,_1 ,mAllowExtrapolation ); ObjectHandler::loop (bindObject, DatesLib, mReturnValue ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } NAN_METHOD(QuantLibXL::DefaultTSDefaultProbability) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsArray()) { return Nan::ThrowError("Dates is required."); } if (info.Length() == 2 || !info[2]->IsBoolean()) { return Nan::ThrowError("AllowExtrapolation is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type std::vectorDatesCpp; Local DatesArray = info[1].As(); for (unsigned int i = 0; i < DatesArray->Length(); i++){ ObjectHandler::property_t tmp = ObjectHandler::property_t(static_cast(Nan::To(Nan::Get(DatesArray, i).ToLocalChecked()).FromJust())); DatesCpp.push_back(tmp); } // convert js argument to c++ type bool AllowExtrapolationCpp = Nan::To(info[2]).FromJust(); // launch worker DefaultTSDefaultProbabilityWorker* worker = new DefaultTSDefaultProbabilityWorker( ObjectIDCpp , DatesCpp , AllowExtrapolationCpp ); worker->Execute(); Local tmpArray = Nan::New(worker->mReturnValue.size()); for (unsigned int i = 0; i < worker->mReturnValue.size(); i++) { Nan::Set(tmpArray,i,Nan::New(worker->mReturnValue[i])); } Local argv[2] = { Nan::New(worker->mError).ToLocalChecked(), tmpArray }; v8::Local results = Nan::New(); Nan::Set(results, 0, argv[0]); Nan::Set(results, 1, argv[1]); info.GetReturnValue().Set(results); } void ProbabilityToHRWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes // convert input datatypes to QuantLib datatypes QuantLib::Date DateLib = ObjectHandler::convert2( mDate, "Date"); // convert input datatypes to QuantLib enumerated datatypes QuantLib::DayCounter DayCounterEnum = ObjectHandler::Create()(mDayCounter); // invoke the utility function QuantLib::Real returnValue = QuantLibAddin::probabilityToHazardRate( mProbability , DateLib , DayCounterEnum ); mReturnValue = returnValue; }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } NAN_METHOD(QuantLibXL::ProbabilityToHR) { // validate js arguments if (info.Length() == 0 || !info[0]->IsNumber()) { return Nan::ThrowError("Probability is required."); } if (info.Length() == 2 || !info[2]->IsString()) { return Nan::ThrowError("DayCounter is required."); } // convert js argument to c++ type double ProbabilityCpp = Nan::To(info[0]).FromJust(); // convert js argument to c++ type ObjectHandler::property_t DateCpp = ObjectHandler::property_t(static_cast(Nan::To(info[1]).FromJust())); // convert js argument to c++ type String::Utf8Value strDayCounter(info[2]->ToString()); string DayCounterCpp(strdup(*strDayCounter)); // launch worker ProbabilityToHRWorker* worker = new ProbabilityToHRWorker( ProbabilityCpp , DateCpp , DayCounterCpp ); 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); }