/* Copyright (C) 2016 -2017 Jerry Jin */ #include #include #include "cmsmarket.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../loop.hpp" void CmsMarketWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes std::vector SwapLengthsLib; // convert object IDs into library objects std::vector< boost::shared_ptr > SwapIndexesLibObjPtr = ObjectHandler::getLibraryObjectVector(mSwapIndexes); // convert object IDs into library objects OH_GET_REFERENCE(IborIndexLibObjPtr, mIborIndex, QuantLibAddin::IborIndex, QuantLib::IborIndex) // convert object IDs into library objects std::vector< std::vector< QuantLib::Handle > > BidAskSpreadsLibObj = ObjectHandler::matrix::convert2< QuantLib::Handle >(mBidAskSpreads, "BidAskSpreads"); // convert object IDs into library objects std::vector< boost::shared_ptr > CmsCouponPricersLibObjPtr = ObjectHandler::getLibraryObjectVector(mCmsCouponPricers); // convert object IDs into library objects OH_GET_OBJECT(YieldCurveCoerce, mYieldCurve, ObjectHandler::Object) QuantLib::Handle YieldCurveLibObj = QuantLibAddin::CoerceHandle< QuantLibAddin::YieldTermStructure, QuantLib::YieldTermStructure>()( YieldCurveCoerce); // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlCmsMarket( mObjectID, mSwapLengths, mSwapIndexes, mIborIndex, mBidAskSpreads, mCmsCouponPricers, mYieldCurve, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::CmsMarket( valueObject, SwapLengthsLib, SwapIndexesLibObjPtr, IborIndexLibObjPtr, BidAskSpreadsLibObj, CmsCouponPricersLibObjPtr, YieldCurveLibObj, 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"; } } void CmsMarketWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::CmsMarket) { // 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("SwapLengths is required."); } if (info.Length() == 2 || !info[2]->IsArray()) { return Nan::ThrowError("SwapIndexes is required."); } if (info.Length() == 3 || !info[3]->IsString()) { return Nan::ThrowError("IborIndex is required."); } if (info.Length() == 4 || !info[4]->IsArray()) { return Nan::ThrowError("BidAskSpreads is required."); } if (info.Length() == 5 || !info[5]->IsArray()) { return Nan::ThrowError("CmsCouponPricers 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::vectorSwapLengthsCpp; Local SwapLengthsArray = info[1].As(); for (unsigned int i = 0; i < SwapLengthsArray->Length(); i++){ ObjectHandler::property_t tmp = ObjectHandler::property_t(static_cast(Nan::To(Nan::Get(SwapLengthsArray, i).ToLocalChecked()).FromJust())); SwapLengthsCpp.push_back(tmp); } // convert js argument to c++ type std::vectorSwapIndexesCpp; Local SwapIndexesArray = info[2].As(); for (unsigned int i = 0; i < SwapIndexesArray->Length(); i++){ String::Utf8Value strSwapIndexes(Nan::Get(SwapIndexesArray, i).ToLocalChecked()->ToString()); SwapIndexesCpp.push_back(strdup(*strSwapIndexes)); } // convert js argument to c++ type String::Utf8Value strIborIndex(info[3]->ToString()); string IborIndexCpp(strdup(*strIborIndex)); // convert js argument to c++ type std::vector< std::vector >BidAskSpreadsCpp; Local BidAskSpreadsMatrix = info[4].As(); for (unsigned int i = 0; i < BidAskSpreadsMatrix->Length(); i++){ Local BidAskSpreadsArray = BidAskSpreadsMatrix->Get(i).As(); std::vector tmp; for (unsigned int j = 0; j < BidAskSpreadsArray->Length(); j++){ ObjectHandler::property_t temp = ObjectHandler::property_t(static_cast(Nan::To(Nan::Get(BidAskSpreadsArray, j).ToLocalChecked()).FromJust())); tmp.push_back(temp); } BidAskSpreadsCpp.push_back(tmp); } // convert js argument to c++ type std::vectorCmsCouponPricersCpp; Local CmsCouponPricersArray = info[5].As(); for (unsigned int i = 0; i < CmsCouponPricersArray->Length(); i++){ String::Utf8Value strCmsCouponPricers(Nan::Get(CmsCouponPricersArray, i).ToLocalChecked()->ToString()); CmsCouponPricersCpp.push_back(strdup(*strCmsCouponPricers)); } // convert js argument to c++ type ObjectHandler::property_t YieldCurveCpp = ObjectHandler::property_t(static_cast(Nan::To(info[6]).FromJust())); // declare callback Nan::Callback *callback = new Nan::Callback(info[7].As()); // launch Async worker Nan::AsyncQueueWorker(new CmsMarketWorker( callback ,ObjectIDCpp ,SwapLengthsCpp ,SwapIndexesCpp ,IborIndexCpp ,BidAskSpreadsCpp ,CmsCouponPricersCpp ,YieldCurveCpp )); } //CmsMarketWorker::~CmsMarketWorker(){ // //} //void CmsMarketWorker::Destroy(){ // //} void BrowseCmsMarketWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_OBJECT(ObjectIDObjPtr, mObjectID, QuantLibAddin::CmsMarket) std::vector< std::vector > returnValue; // invoke the member function returnValue = ObjectIDObjPtr->getCmsMarket( ); mReturnValue = ObjectHandler::matrix::convert2(returnValue,"returnValue"); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void BrowseCmsMarketWorker::HandleOKCallback(){ Nan::HandleScope scope; Local tmpMatrix = Nan::New(mReturnValue.size()); for (unsigned int i = 0; i < mReturnValue.size(); i++) { Local tmpArray = Nan::New(mReturnValue[i].size()); for (unsigned int j = 0; j < mReturnValue[i].size(); j++) { Nan::Set(tmpArray,j,Nan::New(mReturnValue[i][j]).ToLocalChecked()); } Nan::Set(tmpMatrix,i,tmpArray); } Local argv[2] = { Nan::New(mError).ToLocalChecked(), tmpMatrix }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::BrowseCmsMarket) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new BrowseCmsMarketWorker( callback ,ObjectIDCpp )); } //BrowseCmsMarketWorker::~BrowseCmsMarketWorker(){ // //} //void BrowseCmsMarketWorker::Destroy(){ // //}