Disposable<Array> FdmExtOUJumpOp::integro(const Array& r) const { Array integral(r.size()); const boost::shared_ptr<FdmLinearOpLayout> layout = mesher_->layout(); const Size extraDims=layout->size()/(layout->dim()[0]*layout->dim()[1]); std::vector<Array> y(extraDims, Array(layout->dim()[1])); std::vector<Matrix> f(extraDims, Matrix(layout->dim()[1], layout->dim()[0])); const FdmLinearOpIterator endIter = layout->end(); for (FdmLinearOpIterator iter = layout->begin(); iter != endIter; ++iter) { const Size i = iter.coordinates()[0]; const Size j = iter.coordinates()[1]; const Size k = iter.index() / (layout->dim()[0]*layout->dim()[1]); y[k][j] = mesher_->location(iter, 1); f[k][j][i] = r[iter.index()]; } std::vector<std::vector<boost::shared_ptr<LinearInterpolation> > > interpl(extraDims, std::vector< boost::shared_ptr<LinearInterpolation> >(f[0].columns())); for (Size k=0; k < extraDims; ++k) { for (Size i=0; i < f[k].columns(); ++i) { interpl[k][i] = boost::shared_ptr<LinearInterpolation>( new LinearInterpolation(y[k].begin(), y[k].end(), f[k].column_begin(i))); } } const Real eta = process_->eta(); for (FdmLinearOpIterator iter=layout->begin(); iter!=endIter; ++iter) { const Size i = iter.coordinates()[0]; const Size j = iter.coordinates()[1]; const Size k = iter.index() / (layout->dim()[0]*layout->dim()[1]); integral[iter.index()] = gaussLaguerreIntegration_( IntegroIntegrand(interpl[k][i], bcSet_, y[k][j], eta)); } return process_->jumpIntensity()*(integral-r); }
Disposable<Array> FdmBatesOp::integro(const Array& r) const { const shared_ptr<FdmLinearOpLayout> layout = mesher_->layout(); QL_REQUIRE(layout->dim().size() == 2, "invalid layout dimension"); Array x(layout->dim()[0]); Matrix f(layout->dim()[1], layout->dim()[0]); const FdmLinearOpIterator endIter = layout->end(); for (FdmLinearOpIterator iter = layout->begin(); iter != endIter; ++iter) { const Size i = iter.coordinates()[0]; const Size j = iter.coordinates()[1]; x[i] = mesher_->location(iter, 0); f[j][i] = r[iter.index()]; } std::vector<shared_ptr<LinearInterpolation> > interpl(f.rows()); for (Size i=0; i < f.rows(); ++i) { interpl[i] = shared_ptr<LinearInterpolation>( new LinearInterpolation(x.begin(), x.end(), f.row_begin(i))); } Array integral(r.size()); for (FdmLinearOpIterator iter=layout->begin(); iter!=endIter; ++iter) { const Size i = iter.coordinates()[0]; const Size j = iter.coordinates()[1]; integral[iter.index()] = M_1_SQRTPI* gaussHermiteIntegration_( IntegroIntegrand(interpl[j], bcSet_, x[i], delta_, nu_)); } return lambda_*(integral-r); }