From 80a9c0058e7dc7f59689c76bbedfd7007ccd3bfd Mon Sep 17 00:00:00 2001 From: Vlad_kv Date: Sun, 11 Aug 2019 22:29:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/inport/ConversionUtils/Solver.java | 104 ++++++++++---- src/inport/Main.java | 188 ++++++++++++++++++------- 2 files changed, 216 insertions(+), 76 deletions(-) diff --git a/src/inport/ConversionUtils/Solver.java b/src/inport/ConversionUtils/Solver.java index c807640..a82ef2b 100644 --- a/src/inport/ConversionUtils/Solver.java +++ b/src/inport/ConversionUtils/Solver.java @@ -13,6 +13,27 @@ import java.util.function.BiConsumer; import java.util.stream.Collectors; public class Solver { + public enum SolverName { + Undefined(""), + Chuffed ("Chuffed"), + OrTools ("OrTools"); + + public final String text; + public static final String legalValues = "\"Chuffed\", \"OrTools\""; + + SolverName(String text) { + this.text = text; + } + public static Solver.SolverName fromString(String text) { + for (Solver.SolverName t : Solver.SolverName.values()) { + if (t.text.equalsIgnoreCase(text)) { + return t; + } + } + return Undefined; + } + } + private final Lock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); private Boolean isDestroyed; @@ -24,6 +45,7 @@ public class Solver { private String tempDir = "temp_data"; private int timeLimitS; private String flatZincSolver = ""; + private SolverName solverName = SolverName.Undefined; private String solverResults = ""; @@ -42,6 +64,9 @@ public class Solver { public void setFlatZincSolver(String flatZincSolver) { this.flatZincSolver = flatZincSolver; } + public void setSolverName(String solverName) { + this.solverName = SolverName.fromString(solverName); + } public String getFlatZincSolver() { return flatZincSolver; @@ -102,34 +127,61 @@ public class Solver { ProcessBuilder pb; boolean isResultsInOutput; - if (flatZincSolver.isEmpty()) { - pb = new ProcessBuilder("minizinc", - "--solver", "Chuffed", - constraints, minizincData, - "-o", solverResults); - isResultsInOutput = false; - } else { - isResultsInOutput = true; - { - ProcessBuilder lPB = new ProcessBuilder("mzn2fzn", - "-o", flatZincConstraints, - constraints, - minizincData); - Process process = lPB.start(); - process.waitFor(); - - BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); - String output = br.lines().collect(Collectors.joining("\n")); - - if (output.trim().equals("=====UNSATISFIABLE=====")) { - task.setSolution(new ArrayList<>()); - task.setSolution_result(-1); - return ""; + switch (solverName) { + case Chuffed: { + pb = new ProcessBuilder("minizinc", + "--solver", "Chuffed", + constraints, minizincData, + "-o", solverResults); + isResultsInOutput = false; + break; + } + case OrTools: { + isResultsInOutput = true; + { + ProcessBuilder lPB = new ProcessBuilder("mzn2fzn", + "-o", flatZincConstraints, + constraints, + minizincData); + Process process = lPB.start(); + process.waitFor(); + + BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); + String output = br.lines().collect(Collectors.joining("\n")); + + if (output.trim().equals("=====UNSATISFIABLE=====")) { + task.setSolution(new ArrayList<>()); + task.setSolution_result(-1); + return ""; + } } + pb = new ProcessBuilder("external_tools/or-tools_flatzinc_Ubuntu-18.04-64bit_v7.2.6977/bin/fzn-or-tools", + flatZincConstraints); } - pb = new ProcessBuilder("external_tools/or-tools_flatzinc_Ubuntu-18.04-64bit_v7.2.6977/bin/fzn-or-tools", - flatZincConstraints); - + case Undefined: { + if (flatZincSolver.isEmpty()) { + return "FlatZinc solver not defined!"; + } + isResultsInOutput = true; + { + ProcessBuilder lPB = new ProcessBuilder("mzn2fzn", "-o", flatZincConstraints, + constraints, minizincData); + Process process = lPB.start(); + process.waitFor(); + + BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); + String output = br.lines().collect(Collectors.joining("\n")); + + if (output.trim().equals("=====UNSATISFIABLE=====")) { + task.setSolution(new ArrayList<>()); + task.setSolution_result(-1); + return ""; + } + } + pb = new ProcessBuilder(flatZincSolver, flatZincConstraints); + } + default: + return "Undefined solver."; } lock.lock(); diff --git a/src/inport/Main.java b/src/inport/Main.java index 736a4d8..f84bda0 100644 --- a/src/inport/Main.java +++ b/src/inport/Main.java @@ -1,17 +1,13 @@ package inport; import java.io.*; -import java.util.ArrayList; -import java.util.Map; -import java.util.TreeMap; +import java.util.*; +import java.util.function.Consumer; 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 inport.ConversionUtils.*; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; @@ -20,9 +16,6 @@ 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 ("", Testing::getTask_2_Solver), WithoutSplitting("Without splitting", Testing::getTask_2_Solver), @@ -33,6 +26,8 @@ public class Main { private final String text; private final Supplier solversGetter; + static final String legalValues = "\"Without splitting\", \"With splitting\", \"Greedy\", \"Greedy v2\""; + ConversionType(String text, Supplier solversGerrer) { this.text = text; this.solversGetter = solversGerrer; @@ -59,58 +54,150 @@ public class Main { return s.toString(); } - 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); + private static class MainCommandsData { + Boolean isHidden; + String description; + Consumer> command; + + MainCommandsData(Boolean isHidden, String description, Consumer> command) { + this.isHidden = isHidden; + this.description = description; + this.command = command; } - /* TODO + } + + private void solve(Collection args) { try { + class Arguments { + @Option(name = "-fzs", aliases = "--flat_zinc_solver", usage = "Путь к исполняемому файлу flatZinc solver-а.", forbids = {"-s"}) + private String flatZincSolver = ""; + + @Option(name = "-p", usage = "Путь к задаче.", required = true) + private String pathToTask = ""; + + @Option(name = "-ct", usage = "Тип сведения, один из " + ConversionType.legalValues + ".") + private String conversionType = ConversionType.WithoutSplitting.text; + + @Option(name = "-s", aliases = "--solver", usage = "Тип solver-а из предопределённого списка : " + Solver.SolverName.legalValues + ".", + forbids = {"-fzs"}) + private String solverName = Solver.SolverName.Chuffed.text; + } + + + Arguments arguments = new Arguments(); + CmdLineParser parser = new CmdLineParser(arguments); + + if (args.isEmpty()) { + parser.printUsage(System.out); + return; + } 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]; + long start = System.currentTimeMillis(); - switch (type) { - case "solve" : { - String fileName = args[1]; - long start = System.currentTimeMillis(); + TaskCase task = new TaskCase(); + task.deserialize(arguments.pathToTask); - TaskCase task = new TaskCase(); - task.deserialize(fileName); - - Solver solver; - if (!task.isTypified()) { - solver = getTask_2_Solver(); - } else { - ConversionType t = (args.length == 2) ? ConversionType.WithoutSplitting - : ConversionType.fromString(args[2]); - if (t.equals(ConversionType.Undefined)) { - System.out.println(undefinedTypeErrorMess(args[2])); - return; - } - solver = t.solversGetter.get(); + Solver solver; + if (! task.isTypified()) { + solver = getTask_2_Solver(); + } else { + ConversionType t = ConversionType.fromString(arguments.conversionType); + if (t.equals(ConversionType.Undefined)) { + System.out.println(undefinedTypeErrorMess(arguments.conversionType)); + return; } + solver = t.solversGetter.get(); + } - solver.setTask(task); - solver.setTimeLimitS(DEFAULT_TIME_LIMIT_S); - solver.setTempDir("temp_data"); + solver.setTask(task); + solver.setTimeLimitS(DEFAULT_TIME_LIMIT_S); + solver.setTempDir("temp_data"); - String error = solver.solve(); + if (arguments.flatZincSolver.isEmpty()) { + solver.setSolverName(arguments.solverName); + } else { + solver.setFlatZincSolver(arguments.flatZincSolver); + } + + String error = solver.solve(); - long finish = System.currentTimeMillis(); - System.out.println((finish - start) + " milliseconds"); + long finish = System.currentTimeMillis(); + System.out.println((finish - start) + " milliseconds"); - if (!error.isEmpty()) { - System.out.println("Error : " + error); - } else { - task.serialize(fileName); + if (!error.isEmpty()) { + System.out.println("Error : " + error); + } else { + task.serialize(arguments.pathToTask); + } + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } catch (CmdLineException ex) { + System.out.println("Illegal arguments: " + ex.getLocalizedMessage()); + } + } + + private void doMain(final String[] args) throws IOException { + final CmdLineParser parser = new CmdLineParser(this); + + Map mainCommands = new TreeMap<>(); + + Consumer c = (Boolean b) -> {}; + + mainCommands.put("solve", + new MainCommandsData(false, "Решение задачи.", this::solve)); + + mainCommands.put("tippToMzn", + new MainCommandsData( + false + , "Сводит задачу к формату MiniZinc-а используя заданное сведение. " + + "Производит два файла - conversion.mzn и minizinc_data.dzn ." + , (Collection a) -> + { +// try { +// // TODO реализовать +// } catch (IOException ex) { +// throw new UncheckedIOException(ex); +// } + })); + + + if (args.length < 1) { + System.out.println("usage: java -jar Conversion.jar []"); + System.out.println("Стандартные команды: "); + + int maxLength = 0; + for (String name : mainCommands.keySet()) { + if (! mainCommands.get(name).isHidden) { + maxLength = Math.max(maxLength, name.length()); } + } + + for (String name : mainCommands.keySet()) { + MainCommandsData data = mainCommands.get(name); + if (! data.isHidden) { + System.out.print(name); + for (int i = maxLength - name.length(); i > 0; i--) { + System.out.print(" "); + } + System.out.println(" " + data.description); + } + } + return; + } + + MainCommandsData data = mainCommands.get(args[0]); + if (data == null) { + System.out.println("Unknown type \"" + args[0] + "\""); + return; + } + data.command.accept(Arrays.asList(args).subList(1, args.length)); +/* + String type = args[0]; + // TODO переделать + switch (type) { + case "solve" : { + break; } case "to_MiniZinc_0" : { @@ -194,6 +281,7 @@ public class Main { default: System.out.println("Unknown type \"" + type + "\""); } + */ } public static void main(String[] args) { -- GitLab