diff --git a/src/main/java/edu/kit/provideq/toolbox/ProblemSolverInfo.java b/src/main/java/edu/kit/provideq/toolbox/ProblemSolverInfo.java index 72f0b170..b588e2a8 100644 --- a/src/main/java/edu/kit/provideq/toolbox/ProblemSolverInfo.java +++ b/src/main/java/edu/kit/provideq/toolbox/ProblemSolverInfo.java @@ -1,5 +1,13 @@ package edu.kit.provideq.toolbox; -public record ProblemSolverInfo(String id, String name, String description) { +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; +import java.util.List; -} \ No newline at end of file +public record ProblemSolverInfo( + String id, + String name, + String description, + List characteristics +) { + +} diff --git a/src/main/java/edu/kit/provideq/toolbox/api/SolversRouter.java b/src/main/java/edu/kit/provideq/toolbox/api/SolversRouter.java index 7c174b4d..36c00bd7 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/SolversRouter.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/SolversRouter.java @@ -66,7 +66,7 @@ private Mono handleSolversRouteForManager(ProblemManager m private static List getAllSolverInfos(ProblemManager manager) { return manager.getSolvers().stream() .map(solver -> new ProblemSolverInfo(solver.getId(), solver.getName(), - solver.getDescription())) + solver.getDescription(), solver.getCharacteristics())) .toList(); } diff --git a/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToExecutionSolver.java b/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToExecutionSolver.java index 20906aa5..a00d1bb2 100644 --- a/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToExecutionSolver.java +++ b/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToExecutionSolver.java @@ -3,6 +3,7 @@ import edu.kit.provideq.toolbox.Solution; import edu.kit.provideq.toolbox.circuit.processing.solvers.executor.ExecutionResult; import edu.kit.provideq.toolbox.circuit.processing.solvers.executor.ExecutorConfiguration; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -29,6 +30,11 @@ public String getDescription() { return "Move QASM input to the executors"; } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.REFORMULATION); + } + @Override public List> getSubRoutines() { return List.of(EXECUTOR_SUBROUTINE); diff --git a/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToMitigationSolver.java b/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToMitigationSolver.java index 6e0133c9..dd86de34 100644 --- a/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToMitigationSolver.java +++ b/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToMitigationSolver.java @@ -2,6 +2,7 @@ import edu.kit.provideq.toolbox.Solution; import edu.kit.provideq.toolbox.circuit.processing.solvers.mitigation.ErrorMitigationConfiguration; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -28,6 +29,11 @@ public String getDescription() { return "Move QASM input to the error mitigators"; } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.REFORMULATION); + } + @Override public List> getSubRoutines() { return List.of(MITIGATOR_SUBROUTINE); diff --git a/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToOptimizationSolver.java b/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToOptimizationSolver.java index 235c943d..91c2c770 100644 --- a/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToOptimizationSolver.java +++ b/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/MoveToOptimizationSolver.java @@ -2,6 +2,7 @@ import edu.kit.provideq.toolbox.Solution; import edu.kit.provideq.toolbox.circuit.processing.solvers.optimization.OptimizationConfiguration; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -28,6 +29,11 @@ public String getDescription() { return "Move QASM input to the optimizers"; } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.REFORMULATION); + } + @Override public List> getSubRoutines() { return List.of(OPTIMIZER_SUBROUTINE); diff --git a/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/optimization/OptimizationSolver.java b/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/optimization/OptimizationSolver.java index 5106a296..312a418a 100644 --- a/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/optimization/OptimizationSolver.java +++ b/src/main/java/edu/kit/provideq/toolbox/circuit/processing/solvers/optimization/OptimizationSolver.java @@ -4,6 +4,7 @@ import edu.kit.provideq.toolbox.circuit.processing.solvers.CircuitProcessingSolver; import edu.kit.provideq.toolbox.meta.ProblemSolver; import edu.kit.provideq.toolbox.meta.ProblemType; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -57,6 +58,11 @@ public String getDescription() { + "Tket compilation passes (e.g. removing redundancies)."; } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.REFORMULATION); + } + @Override public List> getSubRoutines() { return List.of(CircuitProcessingSolver.CIRCUIT_PROCESSING_SUBROUTINE); diff --git a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/SatBasedDeadFeatureSolver.java b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/SatBasedDeadFeatureSolver.java index 03408b50..0fdc72f1 100644 --- a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/SatBasedDeadFeatureSolver.java +++ b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/SatBasedDeadFeatureSolver.java @@ -8,6 +8,7 @@ import edu.kit.provideq.toolbox.format.cnf.dimacs.Variable; import edu.kit.provideq.toolbox.meta.ProblemSolver; import edu.kit.provideq.toolbox.meta.ProblemType; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -45,6 +46,11 @@ public String getDescription() { + " It uses a SAT solver to solve each formula per feature."; } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.DECOMPOSITION); + } + @Override public List> getSubRoutines() { return List.of(SAT_SUBROUTINE); diff --git a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/SatBasedVoidFeatureSolver.java b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/SatBasedVoidFeatureSolver.java index 2e4fbc8c..3b080ea9 100644 --- a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/SatBasedVoidFeatureSolver.java +++ b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/SatBasedVoidFeatureSolver.java @@ -6,6 +6,7 @@ import edu.kit.provideq.toolbox.format.cnf.dimacs.DimacsCnfSolution; import edu.kit.provideq.toolbox.meta.ProblemSolver; import edu.kit.provideq.toolbox.meta.ProblemType; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -37,6 +38,11 @@ public String getName() { return List.of(SAT_SUBROUTINE); } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.REFORMULATION); + } + @Override public String getDescription() { return "This solver builds SAT formulae to determine void features in a feature model. " diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemSolver.java b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemSolver.java index 5fe7e803..ea1b394d 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemSolver.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemSolver.java @@ -36,6 +36,15 @@ default String getId() { */ String getDescription(); + /** + * Return the list of characteristics for the solver. + * + * @return list of characteristics + */ + default List getCharacteristics() { + return List.of(SolverCharacteristic.SOLVE); + } + /** * Returns the sub problems used to solver this problem. * diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/SolverCharacteristic.java b/src/main/java/edu/kit/provideq/toolbox/meta/SolverCharacteristic.java new file mode 100644 index 00000000..6f19e061 --- /dev/null +++ b/src/main/java/edu/kit/provideq/toolbox/meta/SolverCharacteristic.java @@ -0,0 +1,7 @@ +package edu.kit.provideq.toolbox.meta; + +public enum SolverCharacteristic { + SOLVE, + REFORMULATION, + DECOMPOSITION +} diff --git a/src/main/java/edu/kit/provideq/toolbox/sat/solvers/QrispExactGroverSolver.java b/src/main/java/edu/kit/provideq/toolbox/sat/solvers/QrispExactGroverSolver.java index 03202439..31b4567a 100644 --- a/src/main/java/edu/kit/provideq/toolbox/sat/solvers/QrispExactGroverSolver.java +++ b/src/main/java/edu/kit/provideq/toolbox/sat/solvers/QrispExactGroverSolver.java @@ -4,6 +4,7 @@ import edu.kit.provideq.toolbox.exception.ConversionException; import edu.kit.provideq.toolbox.format.cnf.dimacs.DimacsCnf; import edu.kit.provideq.toolbox.format.cnf.dimacs.DimacsCnfSolution; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -57,6 +58,11 @@ public String getDescription() { + "from the SharpSAT solver."; } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.SOLVE); + } + @Override public List> getSubRoutines() { return List.of(SHARPSAT_SUBROUTINE); diff --git a/src/main/java/edu/kit/provideq/toolbox/tsp/solvers/QuboTspSolver.java b/src/main/java/edu/kit/provideq/toolbox/tsp/solvers/QuboTspSolver.java index 548f851c..4040fd66 100644 --- a/src/main/java/edu/kit/provideq/toolbox/tsp/solvers/QuboTspSolver.java +++ b/src/main/java/edu/kit/provideq/toolbox/tsp/solvers/QuboTspSolver.java @@ -2,6 +2,7 @@ import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.Solution; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -60,6 +61,11 @@ public String getDescription() { + "with a QUBO solver."; } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.REFORMULATION); + } + @Override public List> getSubRoutines() { return List.of(QUBO_SUBROUTINE); diff --git a/src/main/java/edu/kit/provideq/toolbox/unsplittablemcf/solvers/GamsUnsplittableMcfQuboSolver.java b/src/main/java/edu/kit/provideq/toolbox/unsplittablemcf/solvers/GamsUnsplittableMcfQuboSolver.java index f1abc5af..00ecced1 100644 --- a/src/main/java/edu/kit/provideq/toolbox/unsplittablemcf/solvers/GamsUnsplittableMcfQuboSolver.java +++ b/src/main/java/edu/kit/provideq/toolbox/unsplittablemcf/solvers/GamsUnsplittableMcfQuboSolver.java @@ -1,6 +1,7 @@ package edu.kit.provideq.toolbox.unsplittablemcf.solvers; import edu.kit.provideq.toolbox.Solution; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -57,6 +58,11 @@ public String getDescription() { + "QUBO problem and solving with a QUBO solver."; } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.REFORMULATION); + } + @Override public List> getSubRoutines() { return List.of(QUBO_SUBROUTINE); diff --git a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/KmeansClusterer.java b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/KmeansClusterer.java index feb944f8..68cb83b4 100644 --- a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/KmeansClusterer.java +++ b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/KmeansClusterer.java @@ -2,6 +2,7 @@ import edu.kit.provideq.toolbox.Solution; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -50,6 +51,11 @@ public String getDescription() { return "Clusters a VRP problem into a set of VRP problems using k-means clustering."; } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.DECOMPOSITION); + } + @Override public List> getSubRoutines() { return List.of(VRP_SUBROUTINE); diff --git a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/TwoPhaseClusterer.java b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/TwoPhaseClusterer.java index 86581db2..a53f6d71 100644 --- a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/TwoPhaseClusterer.java +++ b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/TwoPhaseClusterer.java @@ -1,6 +1,7 @@ package edu.kit.provideq.toolbox.vrp.clusterer; import edu.kit.provideq.toolbox.Solution; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -32,6 +33,11 @@ public TwoPhaseClusterer( super(binaryPath, context); } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.DECOMPOSITION); + } + @Override public List> getSubRoutines() { return List.of(TSP_SUBROUTINE); diff --git a/src/main/java/edu/kit/provideq/toolbox/vrp/solvers/ClusterAndSolveVrpSolver.java b/src/main/java/edu/kit/provideq/toolbox/vrp/solvers/ClusterAndSolveVrpSolver.java index 9b35fdb2..b9a71a25 100644 --- a/src/main/java/edu/kit/provideq/toolbox/vrp/solvers/ClusterAndSolveVrpSolver.java +++ b/src/main/java/edu/kit/provideq/toolbox/vrp/solvers/ClusterAndSolveVrpSolver.java @@ -1,6 +1,7 @@ package edu.kit.provideq.toolbox.vrp.solvers; import edu.kit.provideq.toolbox.Solution; +import edu.kit.provideq.toolbox.meta.SolverCharacteristic; import edu.kit.provideq.toolbox.meta.SolvingProperties; import edu.kit.provideq.toolbox.meta.SubRoutineDefinition; import edu.kit.provideq.toolbox.meta.SubRoutineResolver; @@ -29,6 +30,11 @@ public String getDescription() { + "first."; } + @Override + public List getCharacteristics() { + return List.of(SolverCharacteristic.REFORMULATION); + } + @Override public List> getSubRoutines() { return List.of(CLUSTER_SUBROUTINE);