diff --git a/src/inport/Main.java b/src/inport/Main.java index 7d6026c15a1bdc1c78ddccbf29752323e984338d..b79c4be5867cc42d75135e4d33fe8047b32d3448 100644 --- a/src/inport/Main.java +++ b/src/inport/Main.java @@ -4,29 +4,38 @@ import java.io.*; import java.util.ArrayList; import java.util.Map; import java.util.TreeMap; -import java.util.function.BiFunction; +import java.util.function.Supplier; import static inport.Testing.*; import inport.ConversionUtils.MZnResultsResolver; import inport.ConversionUtils.ParserException; +import inport.ConversionUtils.Solver; import inport.ConversionUtils.Task; +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.CmdLineParser; +import org.kohsuke.args4j.Option; + public class Main { private static final int DEFAULT_TIME_LIMIT_S = 3600; + @Option(name="-fzs", aliases="--flat_zinc_solver", usage="Path to executable file of flat zinc solver.") + private String flatZincSolver = ""; + private enum ConversionType { - Undefined ("", (TaskCase t, Integer i) -> ""), - WithoutSplitting("Without splitting", Testing::solveTask_2), - WithSplitting ("With splitting", Testing::solveTaskWithPartialCargoOp), - Greedy ("Greedy", Testing::solveTaskWithGreedyConstraints), - Greedy_v2 ("Greedy v2", Testing::solveTaskWithGreedyConstraintsV2); + Undefined ("", Testing::getTask_2_Solver), + WithoutSplitting("Without splitting", Testing::getTask_2_Solver), + WithSplitting ("With splitting", Testing::getTaskWithPartialCargoOp_Solver), + Greedy ("Greedy", Testing::getTaskWithGreedyConstraints_Solver), + Greedy_v2 ("Greedy v2", Testing::getTaskWithGreedyConstraintsV2_Solver); private final String text; - private final BiFunction solver; - ConversionType(String text, BiFunction solver) { + private final Supplier solversGetter; + + ConversionType(String text, Supplier solversGerrer) { this.text = text; - this.solver = solver; + this.solversGetter = solversGerrer; } public static ConversionType fromString(String text) { for (ConversionType t : ConversionType.values()) { @@ -50,11 +59,21 @@ public class Main { return s.toString(); } - public static void main(String[] args) { - if (args.length == 0) { - System.out.println("To few arguments."); - return; + private void doMain(final String[] args) throws IOException { + final CmdLineParser parser = new CmdLineParser(this); + if (args.length < 1) { + parser.printUsage(System.out); + System.exit(-1); } + /* TODO + try { + parser.parseArgument(args); + } catch (CmdLineException clEx) { + System.out.println("ERROR: Unable to parse command-line options: " + clEx); + } +*/ +// flatZincSolver = "external_tools/or-tools_flatzinc_Ubuntu-18.04-64bit_v7.2.6977/bin/fzn-or-tools"; + String type = args[0]; switch (type) { @@ -63,26 +82,27 @@ public class Main { long start = System.currentTimeMillis(); TaskCase task = new TaskCase(); - try { - task.deserialize(fileName); - } catch (IOException e) { - System.out.println(e.getMessage()); - break; - } + task.deserialize(fileName); - String error; + Solver solver; if (!task.isTypified()) { - error = solveTask_1(task, DEFAULT_TIME_LIMIT_S); + solver = getTask_2_Solver(); } else { ConversionType t = (args.length == 2) ? ConversionType.WithoutSplitting - : ConversionType.fromString(args[2]); + : ConversionType.fromString(args[2]); if (t.equals(ConversionType.Undefined)) { System.out.println(undefinedTypeErrorMess(args[2])); return; } - error = t.solver.apply(task, DEFAULT_TIME_LIMIT_S); + solver = t.solversGetter.get(); } + solver.setTask(task); + solver.setTimeLimitS(DEFAULT_TIME_LIMIT_S); + solver.setTempDir("temp_data"); + + String error = solver.solve(); + long finish = System.currentTimeMillis(); System.out.println((finish - start) + " milliseconds"); @@ -97,24 +117,17 @@ public class Main { String input = args[1]; String output = args[2]; TaskCase task = new TaskCase(); - try { - task.deserialize(input); - Task.portToMiniZinc_0(task, output); - } catch (IOException ex) { - System.out.println(ex.getMessage()); - } + + task.deserialize(input); + Task.portToMiniZinc_0(task, output); break; } case "to_MiniZinc_1" : { String input = args[1]; String output = args[2]; TaskCase task = new TaskCase(); - try { - task.deserialize(input); - Task.portToMiniZinc_1(task, output); - } catch (IOException ex) { - System.out.println(ex.getMessage()); - } + task.deserialize(input); + Task.portToMiniZinc_1(task, output); break; } case "resolve_result" : { @@ -129,20 +142,24 @@ public class Main { MZnResultsResolver.resolveMiniZincResults(task, fileWIthResult); task.serialize(output); - } catch (IOException | ParserException ex) { + } catch (ParserException ex) { System.out.println(ex.getMessage()); } break; } case "debug" : { ConversionType t = (args.length == 1) ? ConversionType.WithoutSplitting - : ConversionType.fromString(args[1]); + : ConversionType.fromString(args[1]); if (t.equals(ConversionType.Undefined)) { System.out.println(undefinedTypeErrorMess(args[1])); return; } - System.out.println(t.text); - debug(t.solver, DEFAULT_TIME_LIMIT_S); + Solver s = t.solversGetter.get(); + + System.out.println(args[1] + " " + t.text + " " + s.getFlatZincSolver()); + + s.setFlatZincSolver(flatZincSolver); + debug(s, DEFAULT_TIME_LIMIT_S); break; } case "debug read-write" : { @@ -151,41 +168,44 @@ public class Main { } case "testing" : ConversionType t = (args.length == 1) ? ConversionType.WithoutSplitting - : ConversionType.fromString(args[1]); + : ConversionType.fromString(args[1]); if (t.equals(ConversionType.Undefined)) { System.out.println(undefinedTypeErrorMess(args[1])); return; } - testGroup("with_typing", t.solver, DEFAULT_TIME_LIMIT_S); - test_2(DEFAULT_TIME_LIMIT_S); + testGroup("with_typing", t.solversGetter.get(), DEFAULT_TIME_LIMIT_S); break; case "test_experiment": - testGroup("experiments", Testing::solveTask_2, DEFAULT_TIME_LIMIT_S); + testGroup("experiments", getTask_2_Solver(), DEFAULT_TIME_LIMIT_S); break; case "different_parameters": - try { - testingWithDiffParameters( - "tests/with_typing/Case2.tipp", - 1, 30, - 16, 35, - 1.1, 30); + testingWithDiffParameters( + "tests/with_typing/Case2.tipp", + 1, 30, + 16, 35, + 1.1, 30); // testingWithDiffParameters( // "tests/with_typing/TaskT.tipp", // 10, 10, // 32, 32, // 1.1, 10); - - } catch (IOException ex) { - System.out.println(ex.getMessage()); - } break; default: System.out.println("Unknown type \"" + type + "\""); } } - private static void debug(BiFunction solver, int timeLimitS) { + public static void main(String[] args) { + final Main instance = new Main(); + try { + instance.doMain(args); + } catch (IOException ioEx) { + System.out.println("ERROR: I/O Exception encountered: " + ioEx); + } + } + + private static void debug(Solver solver, int timeLimitS) { String fileName = "experiment/in.ipp"; String solverResults = "temp_data/solver_results.txt"; String output = "experiment/debug_info.txt"; @@ -200,7 +220,10 @@ public class Main { long start = System.currentTimeMillis(); - String error = solver.apply(task, timeLimitS); + solver.setTimeLimitS(timeLimitS); + solver.setTempDir("temp_data"); + solver.setTask(task); + String error = solver.solve(); long finish = System.currentTimeMillis(); System.out.println(" " + (finish - start) / 1000.0 + " s"); @@ -212,7 +235,8 @@ public class Main { task.serialize(fileName); } - debugInfo(task, solverResults, output); +// TODO переделать для or-tools +// debugInfo(task, solverResults, output); } private static void debugReadWrite() {