Update of /cvsroot/quantlibaddin/QuantLibAddin/qlo
In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv3331/qlo
Modified Files:
ratehelpers.cpp ratehelpers.hpp
Log Message:
bug fix
Index: ratehelpers.hpp
===================================================================
RCS file: /cvsroot/quantlibaddin/QuantLibAddin/qlo/ratehelpers.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** ratehelpers.hpp 18 Jun 2006 18:54:32 -0000 1.3
--- ratehelpers.hpp 22 Jun 2006 15:18:13 -0000 1.4
***************
*** 81,85 ****
std::vector<std::string> qlRateHelperSelection(
! const std::vector<std::string>& instrumentHandles,
const std::vector<bool>& includeFlag,
const std::vector<long>& priority,
--- 81,85 ----
std::vector<std::string> qlRateHelperSelection(
! const std::vector<std::string>& instrumentIDs,
const std::vector<bool>& includeFlag,
const std::vector<long>& priority,
Index: ratehelpers.cpp
===================================================================
RCS file: /cvsroot/quantlibaddin/QuantLibAddin/qlo/ratehelpers.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** ratehelpers.cpp 20 Jun 2006 09:44:18 -0000 1.4
--- ratehelpers.cpp 22 Jun 2006 15:18:13 -0000 1.5
***************
*** 127,138 ****
struct RateHelperItem {
! QuantLib::Date latestDate;
! long priority;
std::string instanceName;
! RateHelperItem(
! const QuantLib::Date& latestDate,
! const long& priority,
! const std::string& instanceName)
! : latestDate(latestDate), priority(priority), instanceName(instanceName) {}
};
--- 127,145 ----
struct RateHelperItem {
! bool isFutures;
std::string instanceName;
! bool includeFlag;
! long priority;
! QuantLib::Date earliestDate;
! QuantLib::Date latestDate;
! RateHelperItem(bool isFutures,
! const std::string& instanceName,
! const bool includeFlag,
! const long& priority,
! const QuantLib::Date& earliestDate,
! const QuantLib::Date& latestDate)
! : isFutures(isFutures), instanceName(instanceName),
! includeFlag(includeFlag), priority(priority),
! earliestDate(earliestDate), latestDate(latestDate) {}
};
***************
*** 161,165 ****
std::vector<std::string> qlRateHelperSelection(
! const std::vector<std::string>& instrumentHandles,
const std::vector<bool>& includeFlag,
const std::vector<long>& priority,
--- 168,172 ----
std::vector<std::string> qlRateHelperSelection(
! const std::vector<std::string>& instrumentID,
const std::vector<bool>& includeFlag,
const std::vector<long>& priority,
***************
*** 167,176 ****
const long frontContractRollingDays)
{
! QL_REQUIRE(!instrumentHandles.empty(), "no instrument given");
QL_REQUIRE(frontContractRollingDays>=0,
"negative (" << frontContractRollingDays <<
")frontContractRollingDays");
! QuantLib::Size nInstruments = instrumentHandles.size();
QL_REQUIRE(includeFlag.size()==nInstruments,
"includeFlag / instruments mismatch");
--- 174,183 ----
const long frontContractRollingDays)
{
! QL_REQUIRE(!instrumentID.empty(), "no instrument given");
QL_REQUIRE(frontContractRollingDays>=0,
"negative (" << frontContractRollingDays <<
")frontContractRollingDays");
! QuantLib::Size nInstruments = instrumentID.size();
QL_REQUIRE(includeFlag.size()==nInstruments,
"includeFlag / instruments mismatch");
***************
*** 178,213 ****
"priority / instruments mismatch");
! std::vector<boost::shared_ptr<RateHelper> > instruments;
! for (std::vector<std::string>::const_iterator it = instrumentHandles.begin();
! it != instrumentHandles.end(); it++) {
! OH_GET_OBJECT(objectPointer, *it, RateHelper)
! instruments.push_back(objectPointer);
}
// purge input rate helpers according to their includeFlag,
// their expiration, and maximum number of allowed futures
- std::vector<detail::RateHelperItem> rhs;
- QuantLib::Size i;
long futuresCounter = 0;
! QuantLib::Date earliestDate, evalDate = QuantLib::Settings::instance().evaluationDate();
for (i=0; i<nInstruments; i++) {
! const boost::shared_ptr < QuantLib::RateHelper > temp =
! instruments[i]->getLibraryObject < QuantLib::RateHelper >();
! earliestDate = temp->earliestDate();
! if (includeFlag[i]) {
! if (!boost::dynamic_pointer_cast<FuturesRateHelper>(instruments[i]) &&
! (earliestDate >= evalDate)) {
! rhs.push_back(detail::RateHelperItem(temp->latestDate(),
! priority[i], instrumentHandles[i]));
} else if (futuresCounter<nFutures &&
! (earliestDate-2-frontContractRollingDays >= evalDate)) {
futuresCounter++;
! rhs.push_back(detail::RateHelperItem(temp->latestDate(),
! priority[i], instrumentHandles[i]));
}
}
}
! std::vector<std::string> instanceNames;
// zero or one rate helper left
--- 185,233 ----
"priority / instruments mismatch");
! // RateHelperItem
! std::vector<detail::RateHelperItem> rhsAll;
! boost::shared_ptr<QuantLib::RateHelper> qlrh;
! QuantLib::Size i;
! for (i=0; i<nInstruments; i++)
! {
! OH_GET_OBJECT(qlarh, instrumentID[i], RateHelper);
! bool isFutures;
! if (boost::dynamic_pointer_cast<FuturesRateHelper>(qlarh))
! isFutures = true;
! else
! isFutures = false;
!
! qlrh = qlarh->getLibraryObject<QuantLib::RateHelper>();
! rhsAll.push_back(detail::RateHelperItem(isFutures,
! instrumentID[i],
! includeFlag[i],
! priority[i],
! qlrh->earliestDate(),
! qlrh->latestDate()));
}
+ // preliminary sort RateHelperItems according to
+ // their latest date and priority
+ std::sort(rhsAll.begin(), rhsAll.end(),
+ detail::RateHelperPrioritySorter());
+
// purge input rate helpers according to their includeFlag,
// their expiration, and maximum number of allowed futures
long futuresCounter = 0;
! QuantLib::Date evalDate = QuantLib::Settings::instance().evaluationDate();
! std::vector<detail::RateHelperItem> rhs;
for (i=0; i<nInstruments; i++) {
! if (rhsAll[i].includeFlag) {
! if (!rhsAll[i].isFutures && (rhsAll[i].earliestDate >= evalDate)) {
! rhs.push_back(rhsAll[i]);
} else if (futuresCounter<nFutures &&
! (rhsAll[i].earliestDate-2-frontContractRollingDays >= evalDate)) {
futuresCounter++;
! rhs.push_back(rhsAll[i]);
}
}
}
! std::vector<std::string> result;
// zero or one rate helper left
***************
*** 215,220 ****
std::vector<detail::RateHelperItem>::const_iterator i;
for (i = rhs.begin(); i != rhs.end(); i++)
! instanceNames.push_back(i->instanceName);
! return instanceNames;
}
--- 235,240 ----
std::vector<detail::RateHelperItem>::const_iterator i;
for (i = rhs.begin(); i != rhs.end(); i++)
! result.push_back(i->instanceName);
! return result;
}
***************
*** 222,233 ****
std::sort(rhs.begin(), rhs.end(), detail::RateHelperPrioritySorter());
for (i=0; i<rhs.size()-1; i++) {
if (rhs[i].latestDate < rhs[i+1].latestDate)
! instanceNames.push_back(rhs[i].instanceName);
}
// add the last one in any case
! instanceNames.push_back(rhs[i].instanceName);
! return instanceNames;
}
--- 242,254 ----
std::sort(rhs.begin(), rhs.end(), detail::RateHelperPrioritySorter());
+ // remove RateHelpers with duplicate latestDate
for (i=0; i<rhs.size()-1; i++) {
if (rhs[i].latestDate < rhs[i+1].latestDate)
! result.push_back(rhs[i].instanceName);
}
// add the last one in any case
! result.push_back(rhs[i].instanceName);
! return result;
}
|