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);
 }