1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 3 /* 4 Copyright (C) 2006 Mark Joshi 5 6 This file is part of QuantLib, a free-software/open-source library 7 for financial quantitative analysts and developers - http://quantlib.org/ 8 9 QuantLib is free software: you can redistribute it and/or modify it 10 under the terms of the QuantLib license. You should have received a 11 copy of the license along with this program; if not, please email 12 <quantlib-dev@lists.sf.net>. The license is also available online at 13 <http://quantlib.org/license.shtml>. 14 15 This program is distributed in the hope that it will be useful, but WITHOUT 16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 17 FOR A PARTICULAR PURPOSE. See the license for more details. 18 */ 19 20 #include <ql/models/marketmodels/products/onestep/onestepforwards.hpp> 21 #include <ql/models/marketmodels/curvestate.hpp> 22 #include <ql/models/marketmodels/utilities.hpp> 23 #include <ql/auto_ptr.hpp> 24 25 namespace QuantLib { 26 OneStepForwards(const std::vector<Time> & rateTimes,const std::vector<Real> & accruals,const std::vector<Time> & paymentTimes,const std::vector<Rate> & strikes)27 OneStepForwards::OneStepForwards(const std::vector<Time>& rateTimes, 28 const std::vector<Real>& accruals, 29 const std::vector<Time>& paymentTimes, 30 const std::vector<Rate>& strikes) 31 : MultiProductOneStep(rateTimes), accruals_(accruals), 32 paymentTimes_(paymentTimes), strikes_(strikes) { 33 checkIncreasingTimes(paymentTimes); 34 } 35 nextTimeStep(const CurveState & currentState,std::vector<Size> & numberCashFlowsThisStep,std::vector<std::vector<MarketModelMultiProduct::CashFlow>> & genCashFlows)36 bool OneStepForwards::nextTimeStep( 37 const CurveState& currentState, 38 std::vector<Size>& numberCashFlowsThisStep, 39 std::vector<std::vector<MarketModelMultiProduct::CashFlow> >& 40 genCashFlows) { 41 for (Size i=0; i<strikes_.size(); ++i) { 42 Rate liborRate = currentState.forwardRate(i); 43 genCashFlows[i][0].timeIndex = i; 44 genCashFlows[i][0].amount = 45 (liborRate-strikes_[i])*accruals_[i]; 46 } 47 48 std::fill(numberCashFlowsThisStep.begin(), 49 numberCashFlowsThisStep.end(), 1); 50 return true; 51 } 52 53 QL_UNIQUE_OR_AUTO_PTR<MarketModelMultiProduct> clone() const54 OneStepForwards::clone() const { 55 return QL_UNIQUE_OR_AUTO_PTR<MarketModelMultiProduct>( 56 new OneStepForwards(*this)); 57 } 58 59 } 60 61