/**
   * uy.edu.fing.mina.omega.tffst.test 8. it shows determinization of a union
   *
   * @param args
   */
  public static void main(String[] args) {

    Tffst.setMinimizeAlways(false);

    // tffst1
    Tffst tffst1 = new Tffst();

    State s0 = new State();
    tffst1.setInitialState(s0);
    State s1 = new State();
    State s2 = new State();
    s2.setAccept(true);

    SimpleTf tfd = new SimpleTf();
    tfd.setName("D");
    Transition trans1 = new Transition(tfd, tfd, s1, 1);
    s0.addOutTran(trans1);

    SimpleTf tfall = new SimpleTf();
    tfall.setAcceptAll();
    SimpleTf tfc = new SimpleTf();
    tfc.setName("C");
    TfI tfall_c = tfall.and(tfc.not());

    Transition trans2 = new Transition(tfall_c, tfall_c, s1, 1);
    s1.addOutTran(trans2);

    SimpleTf tfk = new SimpleTf();
    tfk.setName("K");
    TfString sec = new TfString(tfc);
    TfString seck = new TfString(tfc);
    seck.add(tfk);
    Transition trans3 = new Transition(sec, seck, s2);
    s1.addOutTran(trans3);

    Utils.showDot(tffst1.toDot("tffst1"));

    tffst1 = tffst1.toSingleLabelTransitions(); // FIXME
    Utils.showDot(tffst1.toDot("tffst1 simple"));

    tffst1.removeInputEpsilonLabel();
    Utils.showDot(tffst1.toDot("tffst1 without epsilons"));

    //      tffst1.removeDeadTransitions();
    //      Utils.showDot(tffst1.toDot("tffst1 without dead transitions"));
  }
  /**
   * uy.edu.fing.mina.omega.tffst.test 5, is the very example of the policy's paper. it works well
   * but A <-> B and B <-> A must be unified
   *
   * @param args
   */
  public static void main(String[] args) {

    Tffst.setMinimizeAlways(false);

    Tffst tffst1 = new Tffst();

    State s0 = new State();
    tffst1.setInitialState(s0);

    State s4 = new State();
    s4.setAccept(true);

    SimpleTf tf1 = new SimpleTf();
    tf1.setSLabel("A");

    SimpleTf tf2 = new SimpleTf();
    tf2.setSLabel("C");

    SimpleTf tf7 = new SimpleTf();
    tf7.setSLabel("I");

    SimpleTf tf8 = new SimpleTf();
    tf8.setSLabel("J");

    Transition trans1 = new Transition(tf1, tf2, s4);
    Transition trans5 = new Transition(tf7, tf8, s4);

    s0.addTransition(trans1);
    s4.addTransition(trans5);

    Utils.showDot(tffst1.toDot(""));

    tffst1.setDeterministic(false);
    tffst1.determinize();

    Utils.showDot(tffst1.toDot(""));

    Utils.showDot(tffst1.toSimpleTransitions().toDot(""));
  }
  /**
   * uy.edu.fing.mina.omega.tffst.test 5, is the very example of the Policy 2004's paper.
   *
   * @param args
   */
  public static void main(String[] args) {

    Tffst.setMinimizeAlways(false);

    Tffst tffst1 = new Tffst();

    State s0 = new State();
    tffst1.setInitialState(s0);

    State s1 = new State();

    State s2 = new State();

    State s3 = new State();

    State s4 = new State();
    s4.setAccept(true);

    SimpleTf tf1 = new SimpleTf();
    tf1.setName("A");

    SimpleTf tf2 = new SimpleTf();
    tf2.setName("C");

    SimpleTf tf3 = new SimpleTf();
    tf3.setName("D");

    SimpleTf tf4 = new SimpleTf();
    tf4.setName("E");

    SimpleTf tf5 = new SimpleTf();
    tf5.setName("F");

    SimpleTf tf6 = new SimpleTf();
    tf6.setName("G");

    SimpleTf tf7 = new SimpleTf();
    tf7.setName("I");

    SimpleTf tf8 = new SimpleTf();
    tf8.setName("J");

    Transition trans1 = new Transition(tf1, tf2, s1);
    Transition trans2 = new Transition(tf1, tf3, s2);
    Transition trans3 = new Transition(tf4, tf5, s3);
    Transition trans4 = new Transition(tf6, tf5, s3);
    Transition trans5 = new Transition(tf7, tf8, s4);
    Transition trans6 = new Transition(tf7, tf8, s4);

    s0.addOutTran(trans1);
    s0.addOutTran(trans2);
    s1.addOutTran(trans3);
    s2.addOutTran(trans4);
    s3.addOutTran(trans5);
    s4.addOutTran(trans6);

    Utils.showDot(tffst1.toDot("START"));

    tffst1.setDeterministic(false);
    tffst1.determinize();

    Utils.showDot(tffst1.toDot("FIN"));
  }