public int forward(int bdd_initial) {

    int qkk, qk = manager.ref(bdd_initial);

    do {
      qkk = qk;
      int next = image(qk);
      qk = manager.orTo(qk, next);
      manager.deref(next);
    } while (qkk != qk);

    return qk;
  }
  public int image(int from) {
    int cube = manager.getBDDCubeS();
    Permutation perm = manager.getPermSp2S();

    int sum = 0;
    for (int i = 0; i < dp.getSize(); i++) {
      int tmp = manager.ref(manager.relProd(from, dp.getBDDTWave(i), cube));
      sum = manager.orTo(sum, tmp);
      manager.deref(tmp);
    }

    int next = manager.ref(manager.replace(sum, perm));
    manager.deref(sum);
    return next;
  }