protected void init() {
    super.init();
    if (observationTimesSet) {

      // Quantities for gamma bridge process
      bMu2dtOverNuL = new double[d + 1];
      bMu2dtOverNuR = new double[d + 1];
      wIndexList = new int[3 * d];

      int[] ptIndex = new int[d + 1];
      int indexCounter = 0;
      int newIndex, oldLeft, oldRight;

      ptIndex[0] = 0;
      ptIndex[1] = d;

      mu2OverNu = mu * mu / nu;
      mu2dTOverNu = mu2OverNu * (t[d] - t[0]);

      for (int powOfTwo = 1; powOfTwo <= d / 2; powOfTwo *= 2) {
        /* Make room in the indexing array "ptIndex" */
        for (int j = powOfTwo; j >= 1; j--) {
          ptIndex[2 * j] = ptIndex[j];
        }

        /* Insert new indices and Calculate constants */
        for (int j = 1; j <= powOfTwo; j++) {
          oldLeft = 2 * j - 2;
          oldRight = 2 * j;
          newIndex = (int) (0.5 * (ptIndex[oldLeft] + ptIndex[oldRight]));

          bMu2dtOverNuL[newIndex] = mu * mu * (t[newIndex] - t[ptIndex[oldLeft]]) / nu;
          bMu2dtOverNuR[newIndex] = mu * mu * (t[ptIndex[oldRight]] - t[newIndex]) / nu;

          ptIndex[oldLeft + 1] = newIndex;
          wIndexList[indexCounter] = ptIndex[oldLeft];
          wIndexList[indexCounter + 1] = newIndex;
          wIndexList[indexCounter + 2] = ptIndex[oldRight];

          indexCounter += 3;
        }
      }
      /* Check if there are holes remaining and fill them */
      for (int k = 1; k < d; k++) {
        if (ptIndex[k - 1] + 1 < ptIndex[k]) {
          // there is a hole between (k-1) and k.

          bMu2dtOverNuL[ptIndex[k - 1] + 1] =
              mu * mu * (t[ptIndex[k - 1] + 1] - t[ptIndex[k - 1]]) / nu;
          bMu2dtOverNuR[ptIndex[k - 1] + 1] =
              mu * mu * (t[ptIndex[k]] - t[ptIndex[k - 1] + 1]) / nu;

          wIndexList[indexCounter] = ptIndex[k] - 2;
          wIndexList[indexCounter + 1] = ptIndex[k] - 1;
          wIndexList[indexCounter + 2] = ptIndex[k];
          indexCounter += 3;
        }
      }
    }
  }
 /**
  * Resets the {@link umontreal.iro.lecuyer.rng.RandomStream RandomStream} of the {@link
  * umontreal.iro.lecuyer.randvar.GammaGen GammaGen} and the {@link
  * umontreal.iro.lecuyer.randvar.BetaGen BetaGen} to <TT>stream</TT>.
  */
 public void setStream(RandomStream stream) {
   super.setStream(stream);
   this.Bgen.setStream(stream);
   this.stream = stream;
 }