/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* Copyright (C) 2001, 2002, 2003 Sadruddin Rejeb This file is part of QuantLib, a free-software/open-source library for financial quantitative analysts and developers - http://quantlib.org/ QuantLib is free software: you can redistribute it and/or modify it under the terms of the QuantLib license. You should have received a copy of the license along with this program; if not, please email . The license is also available online at . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the license for more details. */ #include #include namespace QuantLib { namespace { void no_deletion(CalibratedModel*) {} } CalibratedModel::CalibratedModel(Size nArguments) : arguments_(nArguments), constraint_(new PrivateConstraint(arguments_)) {} class CalibratedModel::CalibrationFunction : public CostFunction { public: CalibrationFunction( CalibratedModel* model, const std::vector >& instruments, const std::vector& weights) : model_(model, no_deletion), instruments_(instruments), weights_(weights) {} virtual ~CalibrationFunction() {} virtual Real value(const Array& params) const { model_->setParams(params); Real value = 0.0; for (Size i=0; icalibrationError(); value += diff*diff*weights_[i]; } return std::sqrt(value); } virtual Disposable values(const Array& params) const { model_->setParams(params); Array values(instruments_.size()); for (Size i=0; icalibrationError() *std::sqrt(weights_[i]); } return values; } virtual Real finiteDifferenceEpsilon() const { return 1e-6; } private: boost::shared_ptr model_; const std::vector >& instruments_; std::vector weights_; }; void CalibratedModel::calibrate( const std::vector >& instruments, OptimizationMethod& method, const EndCriteria& endCriteria, const Constraint& additionalConstraint, const std::vector& weights) { QL_REQUIRE(weights.empty() || weights.size() == instruments.size(), "mismatch between number of instruments and weights"); Constraint c; if (additionalConstraint.empty()) c = *constraint_; else c = CompositeConstraint(*constraint_,additionalConstraint); std::vector w = weights.empty() ? std::vector(instruments.size(), 1.0): weights; CalibrationFunction f(this, instruments, w); Problem prob(f, c, params()); method.minimize(prob, endCriteria); Array result(prob.currentValue()); setParams(result); } Disposable CalibratedModel::params() const { Size size = 0, i; for (i=0; i