/**
  * run Sequential.
  *
  * @param S polynomial list.
  * @param action what to to.
  */
 @SuppressWarnings("unchecked")
 static void runSequential(PolynomialList S, String action, boolean plusextra) {
   List<GenSolvablePolynomial> L = S.list;
   List<GenSolvablePolynomial> G = null;
   long t;
   SolvableReduction sred = new SolvableReductionSeq();
   SolvableGroebnerBase sbb = null;
   if (plusextra) {
     // sbb = new SolvableGroebnerBaseSeqPlusextra();
     // System.out.println("SolvableGroebnerBaseSeqPlusextra not implemented using
     // SolvableGroebnerBaseSeq");
     sbb = new SolvableGroebnerBaseSeq(sred);
   } else {
     sbb = new SolvableGroebnerBaseSeq();
   }
   t = System.currentTimeMillis();
   System.out.println("\nSolvable GB [" + action + "] sequential ...");
   if (action.equals("irr")) {
     G = sred.leftIrreducibleSet(L);
   }
   if (action.equals("left")) {
     G = sbb.leftGB(L);
   }
   if (action.equals("right")) {
     G = sbb.rightGB(L);
   }
   if (action.equals("two")) {
     G = sbb.twosidedGB(L);
   }
   if (G == null) {
     System.out.println("unknown action = " + action + "\n");
     return;
   }
   S = new PolynomialList(S.ring, G);
   System.out.println("G =\n" + S);
   System.out.println("G.size() = " + G.size());
   t = System.currentTimeMillis() - t;
   if (plusextra) {
     System.out.print("seq+, ");
   } else {
     System.out.print("seq, ");
   }
   System.out.println("time = " + t + " milliseconds");
   checkGB(S);
   System.out.println("");
 }
  /**
   * run Parallel.
   *
   * @param S polynomial list.
   * @param action what to to.
   */
  @SuppressWarnings("unchecked")
  static void runParallel(PolynomialList S, int threads, String action, boolean plusextra) {
    List<GenSolvablePolynomial> L = S.list;
    List<GenSolvablePolynomial> G = null;
    long t;
    SolvableReduction sred = new SolvableReductionPar();
    SolvableGroebnerBaseParallel sbb = null;
    SolvableGroebnerBaseSeqPairParallel sbbs = null;
    if (plusextra) {
      sbbs = new SolvableGroebnerBaseSeqPairParallel(threads);
    } else {
      sbb = new SolvableGroebnerBaseParallel(threads);
    }

    t = System.currentTimeMillis();
    System.out.println("\nSolvable GB [" + action + "] parallel " + threads + " threads ...");
    if (action.equals("irr")) {
      G = sred.leftIrreducibleSet(L);
    }
    if (action.equals("left")) {
      if (plusextra) {
        G = sbbs.leftGB(L);
      } else {
        G = sbb.leftGB(L);
      }
    }
    if (action.equals("right")) {
      if (plusextra) {
        G = sbbs.rightGB(L);
      } else {
        G = sbb.rightGB(L);
      }
    }
    if (action.equals("two")) {
      if (plusextra) {
        G = sbbs.twosidedGB(L);
      } else {
        G = sbb.twosidedGB(L);
      }
    }
    if (G == null) {
      System.out.println("unknown action = " + action + "\n");
      return;
    }
    if (G.size() > 0) {
      S = new PolynomialList(G.get(0).ring, G);
    } else {
      S = new PolynomialList(S.ring, G);
    }
    System.out.println("G =\n" + S);
    System.out.println("G.size() = " + G.size());
    t = System.currentTimeMillis() - t;
    if (plusextra) {
      System.out.print("p+ ");
    } else {
      System.out.print("p ");
    }
    System.out.println("= " + threads + ", time = " + t + " milliseconds");
    checkGB(S);
    System.out.println("");
    if (plusextra) {
      sbbs.terminate();
    } else {
      sbb.terminate();
    }
  }