private static double StepVol(double start, double end, OrnsteinUhlenbeck ouProcess)
        {
            var step = end - start;

            Debug.Assert(step >= 0.0);
            var stepIntegralVar = OrnsteinUhlenbeckUtils.IntegratedVariance(ouProcess.Volatility, ouProcess.MeanReversion, start)
                                  .Eval(end);

            return(step > 0.0 ? Math.Sqrt(stepIntegralVar / step) : 0.0);
        }
        public static OrnsteinUhlenbeck1DGenerator Build(double[] dates, OrnsteinUhlenbeck ouProcess)
        {
            var stepSlopes = new double[dates.Length];
            var stepDrifts = new double[dates.Length];
            var stepVols   = new double[dates.Length];

            for (int i = 0; i < dates.Length; i++)
            {
                var previous = (i == 0) ? 0.0 : dates[i - 1];
                var step     = dates[i] - previous;
                stepSlopes[i] = Math.Exp(-ouProcess.MeanReversion * step);
                stepDrifts[i] = StepDrift(previous, dates[i], ouProcess);
                stepVols[i]   = StepVol(previous, dates[i], ouProcess);
            }

            return(new OrnsteinUhlenbeck1DGenerator(dates, ouProcess.Value0, stepSlopes, stepDrifts, stepVols));
        }
 private static double StepDrift(double start, double end, OrnsteinUhlenbeck ouProcess)
 {
     return(OrnsteinUhlenbeckUtils.IntegratedDrift(ouProcess.Drift, ouProcess.MeanReversion, start).Eval(end));
 }