FdmAddPayoffCondition:: FdmAddPayoffCondition(const boost::shared_ptr<FdmExprInnerValue>& payoffGrid, const std::vector<boost::shared_ptr<Domain>>& domain, Time t) : domain_(domain), t_(t) { const boost::shared_ptr<Mesher>& mesher = payoffGrid->mesher(); const boost::shared_ptr<FdmLinearOpLayout> layout = mesher->layout(); const FdmLinearOpIterator endIter = layout->end(); Array x(mesher_->layout()->dim().size()); for (FdmLinearOpIterator iter = layout->begin(); iter != endIter; ++iter) { for (Size i=0 ; i < x.size(); ++i) { x[i] = mesher_->location(iter, i); } if(domain[j](x)) { locationIndexes_.push_back(iter.index()); payoffValues_.push_back(innerValue(iter)); } } }
Real FdmLogInnerValue::avgInnerValueCalc(const FdmLinearOpIterator& iter) { const Size dim = mesher_->layout()->dim()[direction_]; const Size coord = iter.coordinates()[direction_]; const Real loc = mesher_->location(iter,direction_); Real a = loc; Real b = loc; if (coord > 0) { a -= mesher_->dminus(iter, direction_)/2.0; } if (coord < dim-1) { b += mesher_->dplus(iter, direction_)/2.0; } boost::function1<Real, Real> f = compose( std::bind1st(std::mem_fun(&Payoff::operator()), payoff_.get()), std::ptr_fun<Real,Real>(std::exp)); Real retVal; try { const Real acc = ((f(a) != 0.0 || f(b) != 0.0) ? (f(a)+f(b))*5e-5 : 1e-4); retVal = SimpsonIntegral(acc, 8)(f, a, b)/(b-a); } catch (Error&) { // use default value retVal = innerValue(iter); } return retVal; }
Real avgInnerValue(const FdmLinearOpIterator& iter, Time t) { return innerValue(iter, t); }