protected double getDividendAmount(int i)
        {
            Dividend dividend = events_[i] as Dividend;

            if (dividend != null)
            {
                return(dividend.amount());
            }
            else
            {
                return(0.0);
            }
        }
        protected override void setGridLimits()
        {
            double underlying = process_.stateVariable().link.value();

            for (int i = 0; i < events_.Count; i++)
            {
                Dividend dividend = events_[i] as Dividend;
                if (dividend == null)
                {
                    continue;
                }
                if (getDividendTime(i) < 0.0)
                {
                    continue;
                }
                underlying -= dividend.amount(underlying);
            }

            base.setGridLimits(underlying, getResidualTime());
            ensureStrikeInGrid();
        }
        public Vector adjustedGrid()
        {
            double t    = time();
            Vector grid = method().grid(t);

            // add back all dividend amounts in the future
            for (var i = 0; i < arguments_.dividends.Count; i++)
            {
                double dividendTime = dividendTimes_[i];
                if (dividendTime >= t || Utils.close(dividendTime, t))
                {
                    Dividend d = arguments_.dividends[i];
                    double   dividendDiscount = process_.riskFreeRate().currentLink().discount(dividendTime) /
                                                process_.riskFreeRate().currentLink().discount(t);
                    for (var j = 0; j < grid.size(); j++)
                    {
                        grid[j] += d.amount(grid[j]) * dividendDiscount;
                    }
                }
            }

            return(grid);
        }
 public double value(double x)
 {
     return(x + dividend.amount(x));
 }