1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 
3 /*
4  Copyright (C) 2001, 2002, 2003 Sadruddin Rejeb
5  Copyright (C) 2013 Peter Caspers
6 
7  This file is part of QuantLib, a free-software/open-source library
8  for financial quantitative analysts and developers - http://quantlib.org/
9 
10  QuantLib is free software: you can redistribute it and/or modify it
11  under the terms of the QuantLib license.  You should have received a
12  copy of the license along with this program; if not, please email
13  <quantlib-dev@lists.sf.net>. The license is also available online at
14  <http://quantlib.org/license.shtml>.
15 
16  This program is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18  FOR A PARTICULAR PURPOSE.  See the license for more details.
19 */
20 
21 /*! \file jamshidianswaptionengine.hpp
22     \brief Swaption engine using Jamshidian's decomposition
23     Concerning the start delay cf. http://ssrn.com/abstract=2246054
24 */
25 
26 #ifndef quantlib_pricers_jamshidian_swaption_hpp
27 #define quantlib_pricers_jamshidian_swaption_hpp
28 
29 #include <ql/instruments/swaption.hpp>
30 #include <ql/models/shortrate/onefactormodel.hpp>
31 #include <ql/pricingengines/genericmodelengine.hpp>
32 
33 namespace QuantLib {
34 
35     //! Jamshidian swaption engine
36     /*! \ingroup swaptionengines
37         \warning The engine might assume that the exercise date equals the
38                  start date of the passed swap unless the model provides
39                  an implementation of the discountBondOption method with
40                  start delay
41     */
42 
43     class JamshidianSwaptionEngine
44         : public GenericModelEngine<OneFactorAffineModel,
45                                     Swaption::arguments,
46                                     Swaption::results > {
47       public:
48         /*! \note the term structure is only needed when the short-rate
49                   model cannot provide one itself.
50         */
JamshidianSwaptionEngine(const ext::shared_ptr<OneFactorAffineModel> & model,const Handle<YieldTermStructure> & termStructure=Handle<YieldTermStructure> ())51         JamshidianSwaptionEngine(
52                          const ext::shared_ptr<OneFactorAffineModel>& model,
53                          const Handle<YieldTermStructure>& termStructure =
54                                                  Handle<YieldTermStructure>())
55         : GenericModelEngine<OneFactorAffineModel,
56                              Swaption::arguments,
57                              Swaption::results>(model),
58           termStructure_(termStructure) {
59             registerWith(termStructure_);
60         }
61         void calculate() const;
62       private:
63         Handle<YieldTermStructure> termStructure_;
64         class rStarFinder;
65         friend class rStarFinder;
66     };
67 
68 }
69 
70 
71 #endif
72 
73