From 1725542a48f3bd34f93739a46f2127ac817e9d3f Mon Sep 17 00:00:00 2001 From: zaibod Date: Mon, 11 Nov 2024 00:27:33 +0100 Subject: [PATCH 01/20] Added solution quality estimation --- .../java/edu/kit/provideq/toolbox/Bound.java | 11 ++ .../edu/kit/provideq/toolbox/BoundType.java | 15 +++ .../toolbox/api/EstimationRouter.java | 120 ++++++++++++++++++ .../kit/provideq/toolbox/api/ProblemDto.java | 8 ++ .../kit/provideq/toolbox/meta/Problem.java | 19 +++ .../provideq/toolbox/meta/ProblemType.java | 16 ++- 6 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 src/main/java/edu/kit/provideq/toolbox/Bound.java create mode 100644 src/main/java/edu/kit/provideq/toolbox/BoundType.java create mode 100644 src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java diff --git a/src/main/java/edu/kit/provideq/toolbox/Bound.java b/src/main/java/edu/kit/provideq/toolbox/Bound.java new file mode 100644 index 00000000..bdf59cfa --- /dev/null +++ b/src/main/java/edu/kit/provideq/toolbox/Bound.java @@ -0,0 +1,11 @@ +package edu.kit.provideq.toolbox; + +/** + * Represents a bound estimation for the solution of a problem. + * + * @param bound the bound value + * @param boundType the type of the bound + * @param executionTime the time it took to estimate the bound + */ +public record Bound(String bound, BoundType boundType, long executionTime) { +} diff --git a/src/main/java/edu/kit/provideq/toolbox/BoundType.java b/src/main/java/edu/kit/provideq/toolbox/BoundType.java new file mode 100644 index 00000000..bf0c9de4 --- /dev/null +++ b/src/main/java/edu/kit/provideq/toolbox/BoundType.java @@ -0,0 +1,15 @@ +package edu.kit.provideq.toolbox; + +/** + * Represents the bound type of a bound. + */ +public enum BoundType { + /** + * An upper bound. + */ + UPPER, + /** + * A lower bound. + */ + LOWER +} diff --git a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java new file mode 100644 index 00000000..6674995a --- /dev/null +++ b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java @@ -0,0 +1,120 @@ +package edu.kit.provideq.toolbox.api; + +import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; +import static org.springdoc.core.fn.builders.content.Builder.contentBuilder; +import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; +import static org.springdoc.core.fn.builders.schema.Builder.schemaBuilder; +import static org.springdoc.webflux.core.fn.SpringdocRouteBuilder.route; +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +import static org.springframework.web.reactive.function.server.RequestPredicates.accept; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import edu.kit.provideq.toolbox.Bound; +import edu.kit.provideq.toolbox.meta.Problem; +import edu.kit.provideq.toolbox.meta.ProblemManager; +import edu.kit.provideq.toolbox.meta.ProblemManagerProvider; +import edu.kit.provideq.toolbox.meta.ProblemType; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import java.util.UUID; +import org.springdoc.core.fn.builders.operation.Builder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpStatus; +import org.springframework.web.reactive.config.EnableWebFlux; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.ResponseStatusException; +import reactor.core.publisher.Mono; + +/** + * This router handles requests regarding {@link Problem} instance solution bound estimations. + */ +@Configuration +@EnableWebFlux +public class EstimationRouter { + public static final String PROBLEM_ID_PARAM_NAME = "problemId"; + private ProblemManagerProvider managerProvider; + + @Bean + RouterFunction getEstimationRoutes() { + return managerProvider.getProblemManagers().stream() + .map(this::defineGetRoute) + .reduce(RouterFunction::and) + .orElseThrow(); + } + + private RouterFunction defineGetRoute(ProblemManager manager) { + return route().GET( + getEstimationRouteForProblemType(manager.getType()), + accept(APPLICATION_JSON), + req -> handleGet(manager, req), + ops -> handleGetDocumentation(manager, ops) + ).build(); + } + + private Mono handleGet( + ProblemManager manager, + ServerRequest req + ) { + var problemId = req.pathVariable(PROBLEM_ID_PARAM_NAME); + var problem = findProblemOrThrow(manager, problemId); + var bound = problem.estimateBound(); + + return ok().body(bound, new ParameterizedTypeReference<>() { + }); + } + + private void handleGetDocumentation( + ProblemManager manager, + Builder ops + ) { + ProblemType problemType = manager.getType(); + ops + .operationId(getEstimationRouteForProblemType(problemType)) + .tag(problemType.getId()) + .description("Estimates the solution bound for the problem with the given ID.") + .parameter(parameterBuilder().in(ParameterIn.PATH).name(PROBLEM_ID_PARAM_NAME)) + .response(responseBuilder() + .responseCode(String.valueOf(HttpStatus.OK.value())) + .content(getOkResponseContent(manager)) + ); + } + + private static org.springdoc.core.fn.builders.content.Builder getOkResponseContent( + ProblemManager manager + ) { + return contentBuilder() + .mediaType(APPLICATION_JSON_VALUE) + .schema(schemaBuilder().implementation(Bound.class)); + } + + private Problem findProblemOrThrow( + ProblemManager manager, + String id + ) { + UUID uuid; + try { + uuid = UUID.fromString(id); + } catch (IllegalArgumentException e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid problem ID"); + } + + return manager.findInstanceById(uuid) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, + "Could not find a problem for this type with this problem ID!")); + } + + private String getEstimationRouteForProblemType(ProblemType type) { + return "/problems/%s/{%s}/bound".formatted(type.getId(), PROBLEM_ID_PARAM_NAME); + } + + @Autowired + void setManagerProvider(ProblemManagerProvider managerProvider) { + this.managerProvider = managerProvider; + } + +} diff --git a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java index ca5ffa72..31a4a643 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.api; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.Solution; import edu.kit.provideq.toolbox.meta.Problem; import edu.kit.provideq.toolbox.meta.ProblemSolver; @@ -16,6 +17,7 @@ public class ProblemDto { private String typeId; private InputT input; private Solution solution; + private Bound bound; private ProblemState state; private String solverId; private List solverSettings; @@ -38,6 +40,7 @@ public static ProblemDto fromProblem( dto.typeId = problem.getType().getId(); dto.input = problem.getInput().orElse(null); dto.solution = problem.getSolution(); + dto.bound = problem.getBound(); dto.state = problem.getState(); dto.solverId = problem.getSolver() .map(ProblemSolver::getId) @@ -67,6 +70,10 @@ public Solution getSolution() { return solution; } + public Bound getBound() { + return bound; + } + public ProblemState getState() { return state; } @@ -100,6 +107,7 @@ public String toString() { + ", solverId=" + solverId + ", input=" + input + ", solution=" + solution + + ", bound=" + bound + ", solverSettings=" + solverSettings + ", subProblems=" + subProblems + '}'; diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java index f26ed241..6b22fe85 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.meta; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.Solution; import edu.kit.provideq.toolbox.meta.setting.SolverSetting; import java.util.Collections; @@ -29,6 +30,7 @@ public class Problem { private InputT input; private Solution solution; + private Bound bound; private ProblemState state; private ProblemSolver solver; private List solverSettings; @@ -82,6 +84,19 @@ public Mono> solve() { }); } + public Mono estimateBound() { + if (this.bound != null) { + return Mono.just(this.bound); + } + + if (this.input == null) { + throw new IllegalStateException("Cannot estimate bound without input!"); + } + + return Mono.just(this.type.getEstimator().apply(this.input)) + .doOnNext(bound -> this.bound = bound); + } + public UUID getId() { return id; } @@ -208,4 +223,8 @@ public String toString() { + ", solver=" + solver + '}'; } + + public Bound getBound() { + return bound; + } } diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java index a3278f44..b31c82e3 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java @@ -1,5 +1,9 @@ package edu.kit.provideq.toolbox.meta; +import edu.kit.provideq.toolbox.Bound; + +import java.util.function.Function; + /** * The type of problem to solve. */ @@ -7,6 +11,7 @@ public class ProblemType { private final String id; private final Class inputClass; private final Class resultClass; + private final Function estimator; /** * Defines a new problem type. @@ -18,11 +23,13 @@ public class ProblemType { public ProblemType( String id, Class inputClass, - Class resultClass + Class resultClass, + Function estimator ) { this.id = id; this.inputClass = inputClass; this.resultClass = resultClass; + this.estimator = estimator; } /** @@ -46,6 +53,13 @@ public Class getResultClass() { return resultClass; } + /** + * Returns the bound estimator for this problem type. + */ + public Function getEstimator() { + return estimator; + } + @Override public String toString() { return "ProblemType{" From ad66f4a02767c8648577112781ecceb13591ad8e Mon Sep 17 00:00:00 2001 From: zaibod Date: Mon, 11 Nov 2024 00:27:47 +0100 Subject: [PATCH 02/20] added dummy estimators for all types --- .../demonstrators/DemonstratorConfiguration.java | 9 ++++++++- .../anomaly/dead/DeadFeatureConfiguration.java | 10 +++++++++- .../anomaly/voidmodel/VoidModelConfiguration.java | 9 ++++++++- .../toolbox/knapsack/KnapsackConfiguration.java | 10 +++++++++- .../provideq/toolbox/maxcut/MaxCutConfiguration.java | 9 ++++++++- .../kit/provideq/toolbox/qubo/QuboConfiguration.java | 10 +++++++++- .../edu/kit/provideq/toolbox/sat/SatConfiguration.java | 9 ++++++++- .../edu/kit/provideq/toolbox/tsp/TspConfiguration.java | 9 ++++++++- .../edu/kit/provideq/toolbox/vrp/VrpConfiguration.java | 9 ++++++++- .../vrp/clusterer/VrpClustererConfiguration.java | 9 ++++++++- 10 files changed, 83 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java index 5767fe52..1f7f10c5 100644 --- a/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java @@ -1,9 +1,11 @@ package edu.kit.provideq.toolbox.demonstrators; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.meta.Problem; import edu.kit.provideq.toolbox.meta.ProblemManager; import edu.kit.provideq.toolbox.meta.ProblemType; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,9 +18,14 @@ public class DemonstratorConfiguration { public static final ProblemType DEMONSTRATOR = new ProblemType<>( "demonstrator", String.class, - String.class + String.class, + demonstratorEstimator() ); + private static Function demonstratorEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported"); + } + @Bean ProblemManager getDemonstratorManager( CplexMipDemonstrator cplexMipDemonstrator diff --git a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java index 54f15dad..7a819fda 100644 --- a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.featuremodel.anomaly.dead; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -8,6 +9,7 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -26,7 +28,8 @@ public class DeadFeatureConfiguration { public static final ProblemType FEATURE_MODEL_ANOMALY_DEAD = new ProblemType<>( "feature-model-anomaly-dead", String.class, - String.class + String.class, + deadFeatureEstimator() ); @Bean @@ -41,6 +44,11 @@ ProblemManager getDeadFeatureManager( ); } + + private static Function deadFeatureEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java index cc07a31a..3ac20661 100644 --- a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.featuremodel.anomaly.voidmodel; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -8,6 +9,7 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -26,7 +28,8 @@ public class VoidModelConfiguration { public static final ProblemType FEATURE_MODEL_ANOMALY_VOID = new ProblemType<>( "feature-model-anomaly-void", String.class, - String.class + String.class, + voidModelEstimator() ); @Bean @@ -41,6 +44,10 @@ ProblemManager getVoidModelManager( ); } + private static Function voidModelEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java index 309558e4..b26f8891 100644 --- a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.knapsack; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.knapsack.solvers.PythonKnapsackSolver; @@ -10,6 +11,8 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -27,7 +30,8 @@ public class KnapsackConfiguration { public static final ProblemType KNAPSACK = new ProblemType<>( "knapsack", String.class, - String.class + String.class, + knapsackEstimator() ); @Bean @@ -43,6 +47,10 @@ ProblemManager getKnapsackManager( ); } + private static Function knapsackEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java index bb3fc354..e35aa699 100644 --- a/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.maxcut; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.maxcut.solvers.CirqMaxCutSolver; @@ -11,6 +12,7 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -27,7 +29,8 @@ public class MaxCutConfiguration { public static final ProblemType MAX_CUT = new ProblemType<>( "max-cut", String.class, - String.class + String.class, + maxCutEstimator() ); @Bean @@ -44,6 +47,10 @@ ProblemManager getMaxCutManager( ); } + private static Function maxCutEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java index 6c58be28..92e64dd8 100644 --- a/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.qubo; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -11,9 +12,11 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; + /** * Definition and registration of the "Quadratic Unconstrained Binary Optimization" problem. */ @@ -28,7 +31,8 @@ public class QuboConfiguration { public static final ProblemType QUBO = new ProblemType<>( "qubo", String.class, - String.class + String.class, + quboEstimator() ); @Bean @@ -45,6 +49,10 @@ ProblemManager getQuboManager( ); } + private static Function quboEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java index dc17ea49..107e4fa8 100644 --- a/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.sat; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.format.cnf.dimacs.DimacsCnfSolution; @@ -10,6 +11,7 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -25,7 +27,8 @@ public class SatConfiguration { public static final ProblemType SAT = new ProblemType<>( "sat", String.class, - DimacsCnfSolution.class + DimacsCnfSolution.class, + satEstimator() ); @Bean @@ -40,6 +43,10 @@ ProblemManager getSatManager( ); } + private static Function satEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java index da9d146b..6096e054 100644 --- a/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.tsp; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -11,6 +12,7 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -25,7 +27,8 @@ public class TspConfiguration { public static final ProblemType TSP = new ProblemType<>( "tsp", String.class, - String.class + String.class, + tspEstimator() ); @Bean @@ -39,6 +42,10 @@ ProblemManager getTspManager( loadExampleProblems(provider)); } + private static Function tspEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems(ResourceProvider provider) { try { String[] problemNames = new String[] { diff --git a/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java index 1fac13ad..7ee64e0d 100644 --- a/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.vrp; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -13,6 +14,7 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -27,7 +29,8 @@ public class VrpConfiguration { public static final ProblemType VRP = new ProblemType<>( "vrp", String.class, - String.class + String.class, + vrpEstimator() ); @Bean @@ -47,6 +50,10 @@ ProblemManager getVrpManager( ); } + private static Function vrpEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java index 79ce124f..0b8905d9 100644 --- a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.vrp.clusterer; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -8,6 +9,7 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -19,7 +21,8 @@ public class VrpClustererConfiguration { public static final ProblemType CLUSTER_VRP = new ProblemType<>( "cluster-vrp", String.class, - String.class + String.class, + clusterVrpEstimator() ); @Bean @@ -34,6 +37,10 @@ ProblemManager getClusterVrpManager( ); } + private static Function clusterVrpEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems( ResourceProvider resourceProvider ) { From c28ff171052d8ad6c77e6facdcf6412353e1692a Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:48:16 +0100 Subject: [PATCH 03/20] added execution time calculation --- .../toolbox/knapsack/KnapsackConfiguration.java | 1 - .../edu/kit/provideq/toolbox/meta/Problem.java | 16 ++++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java index b26f8891..a65e8292 100644 --- a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java @@ -12,7 +12,6 @@ import java.util.Objects; import java.util.Set; import java.util.function.Function; - import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java index 6b22fe85..1748324c 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java @@ -92,9 +92,21 @@ public Mono estimateBound() { if (this.input == null) { throw new IllegalStateException("Cannot estimate bound without input!"); } + + if (this.type.getEstimator() == null) { + throw new IllegalStateException("Cannot estimate bound without an estimator!"); + } + + long start = System.currentTimeMillis(); + + var bound = this.type.getEstimator().apply(this.input); + long finish = System.currentTimeMillis(); + var executionTime = finish - start; + var boundWithExecutionTime = new Bound(bound.bound(), bound.boundType(), executionTime); + + return Mono.just(boundWithExecutionTime) + .doOnNext(boundValue -> this.bound = boundValue); - return Mono.just(this.type.getEstimator().apply(this.input)) - .doOnNext(bound -> this.bound = bound); } public UUID getId() { From 2fef8c2da091f20fa7cad14999e79cce62e6a94e Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:38:08 +0100 Subject: [PATCH 04/20] missing demonstrator now indicated by null in ProblemType field . --- .../provideq/toolbox/api/EstimationRouter.java | 18 ++++++++++++------ .../DemonstratorConfiguration.java | 5 +++-- .../anomaly/dead/DeadFeatureConfiguration.java | 9 +-------- .../voidmodel/VoidModelConfiguration.java | 8 +------- .../knapsack/KnapsackConfiguration.java | 8 +------- .../toolbox/maxcut/MaxCutConfiguration.java | 8 +------- .../edu/kit/provideq/toolbox/meta/Problem.java | 5 ----- .../kit/provideq/toolbox/meta/ProblemType.java | 8 +++++--- .../toolbox/qubo/QuboConfiguration.java | 8 +------- .../provideq/toolbox/sat/SatConfiguration.java | 8 +------- .../provideq/toolbox/tsp/TspConfiguration.java | 8 +------- .../provideq/toolbox/vrp/VrpConfiguration.java | 8 +------- .../clusterer/VrpClustererConfiguration.java | 8 +------- 13 files changed, 29 insertions(+), 80 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java index 6674995a..2dd71b68 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java @@ -32,6 +32,7 @@ /** * This router handles requests regarding {@link Problem} instance solution bound estimations. + * The /bound endpoint is only available for problem types that have an estimator. */ @Configuration @EnableWebFlux @@ -42,9 +43,10 @@ public class EstimationRouter { @Bean RouterFunction getEstimationRoutes() { return managerProvider.getProblemManagers().stream() + .filter(manager -> manager.getType().getEstimator() != null) .map(this::defineGetRoute) .reduce(RouterFunction::and) - .orElseThrow(); + .orElse(null); } private RouterFunction defineGetRoute(ProblemManager manager) { @@ -62,7 +64,13 @@ private Mono handleGet( ) { var problemId = req.pathVariable(PROBLEM_ID_PARAM_NAME); var problem = findProblemOrThrow(manager, problemId); - var bound = problem.estimateBound(); + + Mono bound; + try { + bound = problem.estimateBound(); + } catch (IllegalStateException e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage()); + } return ok().body(bound, new ParameterizedTypeReference<>() { }); @@ -80,13 +88,11 @@ private void handleGetDocumentation( .parameter(parameterBuilder().in(ParameterIn.PATH).name(PROBLEM_ID_PARAM_NAME)) .response(responseBuilder() .responseCode(String.valueOf(HttpStatus.OK.value())) - .content(getOkResponseContent(manager)) + .content(getOkResponseContent()) ); } - private static org.springdoc.core.fn.builders.content.Builder getOkResponseContent( - ProblemManager manager - ) { + private static org.springdoc.core.fn.builders.content.Builder getOkResponseContent() { return contentBuilder() .mediaType(APPLICATION_JSON_VALUE) .schema(schemaBuilder().implementation(Bound.class)); diff --git a/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java index 1f7f10c5..5abfe916 100644 --- a/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java @@ -1,6 +1,7 @@ package edu.kit.provideq.toolbox.demonstrators; import edu.kit.provideq.toolbox.Bound; +import edu.kit.provideq.toolbox.BoundType; import edu.kit.provideq.toolbox.meta.Problem; import edu.kit.provideq.toolbox.meta.ProblemManager; import edu.kit.provideq.toolbox.meta.ProblemType; @@ -19,10 +20,10 @@ public class DemonstratorConfiguration { "demonstrator", String.class, String.class, - demonstratorEstimator() + null ); - private static Function demonstratorEstimator() { + private Function demonstratorEstimator() { throw new UnsupportedOperationException("Estimation of this problem type is not supported"); } diff --git a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java index 7a819fda..9b29ca0b 100644 --- a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.featuremodel.anomaly.dead; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -9,7 +8,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -29,7 +27,7 @@ public class DeadFeatureConfiguration { "feature-model-anomaly-dead", String.class, String.class, - deadFeatureEstimator() + null ); @Bean @@ -44,11 +42,6 @@ ProblemManager getDeadFeatureManager( ); } - - private static Function deadFeatureEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java index 3ac20661..d1edc2a3 100644 --- a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.featuremodel.anomaly.voidmodel; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -9,7 +8,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -29,7 +27,7 @@ public class VoidModelConfiguration { "feature-model-anomaly-void", String.class, String.class, - voidModelEstimator() + null ); @Bean @@ -44,10 +42,6 @@ ProblemManager getVoidModelManager( ); } - private static Function voidModelEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java index a65e8292..f7bf9c72 100644 --- a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.knapsack; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.knapsack.solvers.PythonKnapsackSolver; @@ -11,7 +10,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,7 +28,7 @@ public class KnapsackConfiguration { "knapsack", String.class, String.class, - knapsackEstimator() + null ); @Bean @@ -46,10 +44,6 @@ ProblemManager getKnapsackManager( ); } - private static Function knapsackEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java index e35aa699..1117f38b 100644 --- a/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.maxcut; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.maxcut.solvers.CirqMaxCutSolver; @@ -12,7 +11,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,7 +28,7 @@ public class MaxCutConfiguration { "max-cut", String.class, String.class, - maxCutEstimator() + null ); @Bean @@ -47,10 +45,6 @@ ProblemManager getMaxCutManager( ); } - private static Function maxCutEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java index 1748324c..1a539268 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java @@ -85,10 +85,6 @@ public Mono> solve() { } public Mono estimateBound() { - if (this.bound != null) { - return Mono.just(this.bound); - } - if (this.input == null) { throw new IllegalStateException("Cannot estimate bound without input!"); } @@ -106,7 +102,6 @@ public Mono estimateBound() { return Mono.just(boundWithExecutionTime) .doOnNext(boundValue -> this.bound = boundValue); - } public UUID getId() { diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java index b31c82e3..4027c9b9 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java @@ -1,7 +1,6 @@ package edu.kit.provideq.toolbox.meta; import edu.kit.provideq.toolbox.Bound; - import java.util.function.Function; /** @@ -16,9 +15,11 @@ public class ProblemType { /** * Defines a new problem type. * - * @param id a unique string identifier for this type of problem. - * @param inputClass the Java class object corresponding to the {@link InputT} type parameter. + * @param id a unique string identifier for this type of problem. + * @param inputClass the Java class object corresponding to the {@link InputT} type parameter. * @param resultClass the Java class object corresponding to the {@link ResultT} type parameter. + * @param estimator the bound estimator for this problem type. + * null if estimation is not supported. */ public ProblemType( String id, @@ -66,6 +67,7 @@ public String toString() { + "id='%s'".formatted(id) + ", inputClass=%s".formatted(inputClass) + ", resultClass=%s".formatted(resultClass) + + ", estimator?=%s".formatted(estimator != null) + '}'; } } diff --git a/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java index 92e64dd8..42e3f91a 100644 --- a/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.qubo; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -12,7 +11,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -32,7 +30,7 @@ public class QuboConfiguration { "qubo", String.class, String.class, - quboEstimator() + null ); @Bean @@ -49,10 +47,6 @@ ProblemManager getQuboManager( ); } - private static Function quboEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java index 107e4fa8..6d819683 100644 --- a/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.sat; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.format.cnf.dimacs.DimacsCnfSolution; @@ -11,7 +10,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -28,7 +26,7 @@ public class SatConfiguration { "sat", String.class, DimacsCnfSolution.class, - satEstimator() + null ); @Bean @@ -43,10 +41,6 @@ ProblemManager getSatManager( ); } - private static Function satEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java index 6096e054..4bc63594 100644 --- a/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.tsp; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -12,7 +11,6 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -28,7 +26,7 @@ public class TspConfiguration { "tsp", String.class, String.class, - tspEstimator() + null ); @Bean @@ -42,10 +40,6 @@ ProblemManager getTspManager( loadExampleProblems(provider)); } - private static Function tspEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems(ResourceProvider provider) { try { String[] problemNames = new String[] { diff --git a/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java index 7ee64e0d..cfd099f5 100644 --- a/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.vrp; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -14,7 +13,6 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,7 +28,7 @@ public class VrpConfiguration { "vrp", String.class, String.class, - vrpEstimator() + null ); @Bean @@ -50,10 +48,6 @@ ProblemManager getVrpManager( ); } - private static Function vrpEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java index 0b8905d9..e7918160 100644 --- a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.vrp.clusterer; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -9,7 +8,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -22,7 +20,7 @@ public class VrpClustererConfiguration { "cluster-vrp", String.class, String.class, - clusterVrpEstimator() + null ); @Bean @@ -37,10 +35,6 @@ ProblemManager getClusterVrpManager( ); } - private static Function clusterVrpEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems( ResourceProvider resourceProvider ) { From ebe31b864c6b1d4dc3543c056c29223284290110 Mon Sep 17 00:00:00 2001 From: zaibod Date: Mon, 11 Nov 2024 00:27:33 +0100 Subject: [PATCH 05/20] Added solution quality estimation --- .../java/edu/kit/provideq/toolbox/Bound.java | 11 ++ .../edu/kit/provideq/toolbox/BoundType.java | 15 +++ .../toolbox/api/EstimationRouter.java | 120 ++++++++++++++++++ .../kit/provideq/toolbox/api/ProblemDto.java | 8 ++ .../kit/provideq/toolbox/meta/Problem.java | 19 +++ .../provideq/toolbox/meta/ProblemType.java | 16 ++- 6 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 src/main/java/edu/kit/provideq/toolbox/Bound.java create mode 100644 src/main/java/edu/kit/provideq/toolbox/BoundType.java create mode 100644 src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java diff --git a/src/main/java/edu/kit/provideq/toolbox/Bound.java b/src/main/java/edu/kit/provideq/toolbox/Bound.java new file mode 100644 index 00000000..bdf59cfa --- /dev/null +++ b/src/main/java/edu/kit/provideq/toolbox/Bound.java @@ -0,0 +1,11 @@ +package edu.kit.provideq.toolbox; + +/** + * Represents a bound estimation for the solution of a problem. + * + * @param bound the bound value + * @param boundType the type of the bound + * @param executionTime the time it took to estimate the bound + */ +public record Bound(String bound, BoundType boundType, long executionTime) { +} diff --git a/src/main/java/edu/kit/provideq/toolbox/BoundType.java b/src/main/java/edu/kit/provideq/toolbox/BoundType.java new file mode 100644 index 00000000..bf0c9de4 --- /dev/null +++ b/src/main/java/edu/kit/provideq/toolbox/BoundType.java @@ -0,0 +1,15 @@ +package edu.kit.provideq.toolbox; + +/** + * Represents the bound type of a bound. + */ +public enum BoundType { + /** + * An upper bound. + */ + UPPER, + /** + * A lower bound. + */ + LOWER +} diff --git a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java new file mode 100644 index 00000000..6674995a --- /dev/null +++ b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java @@ -0,0 +1,120 @@ +package edu.kit.provideq.toolbox.api; + +import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; +import static org.springdoc.core.fn.builders.content.Builder.contentBuilder; +import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; +import static org.springdoc.core.fn.builders.schema.Builder.schemaBuilder; +import static org.springdoc.webflux.core.fn.SpringdocRouteBuilder.route; +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +import static org.springframework.web.reactive.function.server.RequestPredicates.accept; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import edu.kit.provideq.toolbox.Bound; +import edu.kit.provideq.toolbox.meta.Problem; +import edu.kit.provideq.toolbox.meta.ProblemManager; +import edu.kit.provideq.toolbox.meta.ProblemManagerProvider; +import edu.kit.provideq.toolbox.meta.ProblemType; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import java.util.UUID; +import org.springdoc.core.fn.builders.operation.Builder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpStatus; +import org.springframework.web.reactive.config.EnableWebFlux; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.ResponseStatusException; +import reactor.core.publisher.Mono; + +/** + * This router handles requests regarding {@link Problem} instance solution bound estimations. + */ +@Configuration +@EnableWebFlux +public class EstimationRouter { + public static final String PROBLEM_ID_PARAM_NAME = "problemId"; + private ProblemManagerProvider managerProvider; + + @Bean + RouterFunction getEstimationRoutes() { + return managerProvider.getProblemManagers().stream() + .map(this::defineGetRoute) + .reduce(RouterFunction::and) + .orElseThrow(); + } + + private RouterFunction defineGetRoute(ProblemManager manager) { + return route().GET( + getEstimationRouteForProblemType(manager.getType()), + accept(APPLICATION_JSON), + req -> handleGet(manager, req), + ops -> handleGetDocumentation(manager, ops) + ).build(); + } + + private Mono handleGet( + ProblemManager manager, + ServerRequest req + ) { + var problemId = req.pathVariable(PROBLEM_ID_PARAM_NAME); + var problem = findProblemOrThrow(manager, problemId); + var bound = problem.estimateBound(); + + return ok().body(bound, new ParameterizedTypeReference<>() { + }); + } + + private void handleGetDocumentation( + ProblemManager manager, + Builder ops + ) { + ProblemType problemType = manager.getType(); + ops + .operationId(getEstimationRouteForProblemType(problemType)) + .tag(problemType.getId()) + .description("Estimates the solution bound for the problem with the given ID.") + .parameter(parameterBuilder().in(ParameterIn.PATH).name(PROBLEM_ID_PARAM_NAME)) + .response(responseBuilder() + .responseCode(String.valueOf(HttpStatus.OK.value())) + .content(getOkResponseContent(manager)) + ); + } + + private static org.springdoc.core.fn.builders.content.Builder getOkResponseContent( + ProblemManager manager + ) { + return contentBuilder() + .mediaType(APPLICATION_JSON_VALUE) + .schema(schemaBuilder().implementation(Bound.class)); + } + + private Problem findProblemOrThrow( + ProblemManager manager, + String id + ) { + UUID uuid; + try { + uuid = UUID.fromString(id); + } catch (IllegalArgumentException e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid problem ID"); + } + + return manager.findInstanceById(uuid) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, + "Could not find a problem for this type with this problem ID!")); + } + + private String getEstimationRouteForProblemType(ProblemType type) { + return "/problems/%s/{%s}/bound".formatted(type.getId(), PROBLEM_ID_PARAM_NAME); + } + + @Autowired + void setManagerProvider(ProblemManagerProvider managerProvider) { + this.managerProvider = managerProvider; + } + +} diff --git a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java index ca5ffa72..31a4a643 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.api; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.Solution; import edu.kit.provideq.toolbox.meta.Problem; import edu.kit.provideq.toolbox.meta.ProblemSolver; @@ -16,6 +17,7 @@ public class ProblemDto { private String typeId; private InputT input; private Solution solution; + private Bound bound; private ProblemState state; private String solverId; private List solverSettings; @@ -38,6 +40,7 @@ public static ProblemDto fromProblem( dto.typeId = problem.getType().getId(); dto.input = problem.getInput().orElse(null); dto.solution = problem.getSolution(); + dto.bound = problem.getBound(); dto.state = problem.getState(); dto.solverId = problem.getSolver() .map(ProblemSolver::getId) @@ -67,6 +70,10 @@ public Solution getSolution() { return solution; } + public Bound getBound() { + return bound; + } + public ProblemState getState() { return state; } @@ -100,6 +107,7 @@ public String toString() { + ", solverId=" + solverId + ", input=" + input + ", solution=" + solution + + ", bound=" + bound + ", solverSettings=" + solverSettings + ", subProblems=" + subProblems + '}'; diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java index f26ed241..6b22fe85 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.meta; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.Solution; import edu.kit.provideq.toolbox.meta.setting.SolverSetting; import java.util.Collections; @@ -29,6 +30,7 @@ public class Problem { private InputT input; private Solution solution; + private Bound bound; private ProblemState state; private ProblemSolver solver; private List solverSettings; @@ -82,6 +84,19 @@ public Mono> solve() { }); } + public Mono estimateBound() { + if (this.bound != null) { + return Mono.just(this.bound); + } + + if (this.input == null) { + throw new IllegalStateException("Cannot estimate bound without input!"); + } + + return Mono.just(this.type.getEstimator().apply(this.input)) + .doOnNext(bound -> this.bound = bound); + } + public UUID getId() { return id; } @@ -208,4 +223,8 @@ public String toString() { + ", solver=" + solver + '}'; } + + public Bound getBound() { + return bound; + } } diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java index a3278f44..b31c82e3 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java @@ -1,5 +1,9 @@ package edu.kit.provideq.toolbox.meta; +import edu.kit.provideq.toolbox.Bound; + +import java.util.function.Function; + /** * The type of problem to solve. */ @@ -7,6 +11,7 @@ public class ProblemType { private final String id; private final Class inputClass; private final Class resultClass; + private final Function estimator; /** * Defines a new problem type. @@ -18,11 +23,13 @@ public class ProblemType { public ProblemType( String id, Class inputClass, - Class resultClass + Class resultClass, + Function estimator ) { this.id = id; this.inputClass = inputClass; this.resultClass = resultClass; + this.estimator = estimator; } /** @@ -46,6 +53,13 @@ public Class getResultClass() { return resultClass; } + /** + * Returns the bound estimator for this problem type. + */ + public Function getEstimator() { + return estimator; + } + @Override public String toString() { return "ProblemType{" From 186b9df0e66fa9552061c7f7713897f1e925480a Mon Sep 17 00:00:00 2001 From: zaibod Date: Mon, 11 Nov 2024 00:27:47 +0100 Subject: [PATCH 06/20] added dummy estimators for all types --- .../demonstrators/DemonstratorConfiguration.java | 9 ++++++++- .../anomaly/dead/DeadFeatureConfiguration.java | 10 +++++++++- .../anomaly/voidmodel/VoidModelConfiguration.java | 9 ++++++++- .../toolbox/knapsack/KnapsackConfiguration.java | 10 +++++++++- .../provideq/toolbox/maxcut/MaxCutConfiguration.java | 9 ++++++++- .../kit/provideq/toolbox/qubo/QuboConfiguration.java | 10 +++++++++- .../edu/kit/provideq/toolbox/sat/SatConfiguration.java | 9 ++++++++- .../edu/kit/provideq/toolbox/tsp/TspConfiguration.java | 9 ++++++++- .../edu/kit/provideq/toolbox/vrp/VrpConfiguration.java | 9 ++++++++- .../vrp/clusterer/VrpClustererConfiguration.java | 9 ++++++++- 10 files changed, 83 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java index 5767fe52..1f7f10c5 100644 --- a/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java @@ -1,9 +1,11 @@ package edu.kit.provideq.toolbox.demonstrators; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.meta.Problem; import edu.kit.provideq.toolbox.meta.ProblemManager; import edu.kit.provideq.toolbox.meta.ProblemType; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,9 +18,14 @@ public class DemonstratorConfiguration { public static final ProblemType DEMONSTRATOR = new ProblemType<>( "demonstrator", String.class, - String.class + String.class, + demonstratorEstimator() ); + private static Function demonstratorEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported"); + } + @Bean ProblemManager getDemonstratorManager( CplexMipDemonstrator cplexMipDemonstrator diff --git a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java index 54f15dad..7a819fda 100644 --- a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.featuremodel.anomaly.dead; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -8,6 +9,7 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -26,7 +28,8 @@ public class DeadFeatureConfiguration { public static final ProblemType FEATURE_MODEL_ANOMALY_DEAD = new ProblemType<>( "feature-model-anomaly-dead", String.class, - String.class + String.class, + deadFeatureEstimator() ); @Bean @@ -41,6 +44,11 @@ ProblemManager getDeadFeatureManager( ); } + + private static Function deadFeatureEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java index cc07a31a..3ac20661 100644 --- a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.featuremodel.anomaly.voidmodel; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -8,6 +9,7 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -26,7 +28,8 @@ public class VoidModelConfiguration { public static final ProblemType FEATURE_MODEL_ANOMALY_VOID = new ProblemType<>( "feature-model-anomaly-void", String.class, - String.class + String.class, + voidModelEstimator() ); @Bean @@ -41,6 +44,10 @@ ProblemManager getVoidModelManager( ); } + private static Function voidModelEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java index 309558e4..b26f8891 100644 --- a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.knapsack; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.knapsack.solvers.PythonKnapsackSolver; @@ -10,6 +11,8 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -27,7 +30,8 @@ public class KnapsackConfiguration { public static final ProblemType KNAPSACK = new ProblemType<>( "knapsack", String.class, - String.class + String.class, + knapsackEstimator() ); @Bean @@ -43,6 +47,10 @@ ProblemManager getKnapsackManager( ); } + private static Function knapsackEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java index bb3fc354..e35aa699 100644 --- a/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.maxcut; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.maxcut.solvers.CirqMaxCutSolver; @@ -11,6 +12,7 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -27,7 +29,8 @@ public class MaxCutConfiguration { public static final ProblemType MAX_CUT = new ProblemType<>( "max-cut", String.class, - String.class + String.class, + maxCutEstimator() ); @Bean @@ -44,6 +47,10 @@ ProblemManager getMaxCutManager( ); } + private static Function maxCutEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java index 6c58be28..92e64dd8 100644 --- a/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.qubo; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -11,9 +12,11 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; + /** * Definition and registration of the "Quadratic Unconstrained Binary Optimization" problem. */ @@ -28,7 +31,8 @@ public class QuboConfiguration { public static final ProblemType QUBO = new ProblemType<>( "qubo", String.class, - String.class + String.class, + quboEstimator() ); @Bean @@ -45,6 +49,10 @@ ProblemManager getQuboManager( ); } + private static Function quboEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java index dc17ea49..107e4fa8 100644 --- a/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.sat; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.format.cnf.dimacs.DimacsCnfSolution; @@ -10,6 +11,7 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -25,7 +27,8 @@ public class SatConfiguration { public static final ProblemType SAT = new ProblemType<>( "sat", String.class, - DimacsCnfSolution.class + DimacsCnfSolution.class, + satEstimator() ); @Bean @@ -40,6 +43,10 @@ ProblemManager getSatManager( ); } + private static Function satEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java index da9d146b..6096e054 100644 --- a/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.tsp; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -11,6 +12,7 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -25,7 +27,8 @@ public class TspConfiguration { public static final ProblemType TSP = new ProblemType<>( "tsp", String.class, - String.class + String.class, + tspEstimator() ); @Bean @@ -39,6 +42,10 @@ ProblemManager getTspManager( loadExampleProblems(provider)); } + private static Function tspEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems(ResourceProvider provider) { try { String[] problemNames = new String[] { diff --git a/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java index ca47c505..7dc57afc 100644 --- a/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.vrp; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -12,6 +13,7 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -26,7 +28,8 @@ public class VrpConfiguration { public static final ProblemType VRP = new ProblemType<>( "vrp", String.class, - String.class + String.class, + vrpEstimator() ); @Bean @@ -44,6 +47,10 @@ ProblemManager getVrpManager( ); } + private static Function vrpEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java index 79ce124f..0b8905d9 100644 --- a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java @@ -1,5 +1,6 @@ package edu.kit.provideq.toolbox.vrp.clusterer; +import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -8,6 +9,7 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -19,7 +21,8 @@ public class VrpClustererConfiguration { public static final ProblemType CLUSTER_VRP = new ProblemType<>( "cluster-vrp", String.class, - String.class + String.class, + clusterVrpEstimator() ); @Bean @@ -34,6 +37,10 @@ ProblemManager getClusterVrpManager( ); } + private static Function clusterVrpEstimator() { + throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); + } + private Set> loadExampleProblems( ResourceProvider resourceProvider ) { From 60900acade0275c7ffb094ed61f1362f8224372e Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:48:16 +0100 Subject: [PATCH 07/20] added execution time calculation --- .../toolbox/knapsack/KnapsackConfiguration.java | 1 - .../edu/kit/provideq/toolbox/meta/Problem.java | 16 ++++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java index b26f8891..a65e8292 100644 --- a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java @@ -12,7 +12,6 @@ import java.util.Objects; import java.util.Set; import java.util.function.Function; - import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java index 6b22fe85..1748324c 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java @@ -92,9 +92,21 @@ public Mono estimateBound() { if (this.input == null) { throw new IllegalStateException("Cannot estimate bound without input!"); } + + if (this.type.getEstimator() == null) { + throw new IllegalStateException("Cannot estimate bound without an estimator!"); + } + + long start = System.currentTimeMillis(); + + var bound = this.type.getEstimator().apply(this.input); + long finish = System.currentTimeMillis(); + var executionTime = finish - start; + var boundWithExecutionTime = new Bound(bound.bound(), bound.boundType(), executionTime); + + return Mono.just(boundWithExecutionTime) + .doOnNext(boundValue -> this.bound = boundValue); - return Mono.just(this.type.getEstimator().apply(this.input)) - .doOnNext(bound -> this.bound = bound); } public UUID getId() { From 6d56bc3a60d718793bcd684d63988485a5a7fede Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:38:08 +0100 Subject: [PATCH 08/20] missing demonstrator now indicated by null in ProblemType field . --- .../provideq/toolbox/api/EstimationRouter.java | 18 ++++++++++++------ .../DemonstratorConfiguration.java | 5 +++-- .../anomaly/dead/DeadFeatureConfiguration.java | 9 +-------- .../voidmodel/VoidModelConfiguration.java | 8 +------- .../knapsack/KnapsackConfiguration.java | 8 +------- .../toolbox/maxcut/MaxCutConfiguration.java | 8 +------- .../edu/kit/provideq/toolbox/meta/Problem.java | 5 ----- .../kit/provideq/toolbox/meta/ProblemType.java | 8 +++++--- .../toolbox/qubo/QuboConfiguration.java | 8 +------- .../provideq/toolbox/sat/SatConfiguration.java | 8 +------- .../provideq/toolbox/tsp/TspConfiguration.java | 8 +------- .../provideq/toolbox/vrp/VrpConfiguration.java | 8 +------- .../clusterer/VrpClustererConfiguration.java | 8 +------- 13 files changed, 29 insertions(+), 80 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java index 6674995a..2dd71b68 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java @@ -32,6 +32,7 @@ /** * This router handles requests regarding {@link Problem} instance solution bound estimations. + * The /bound endpoint is only available for problem types that have an estimator. */ @Configuration @EnableWebFlux @@ -42,9 +43,10 @@ public class EstimationRouter { @Bean RouterFunction getEstimationRoutes() { return managerProvider.getProblemManagers().stream() + .filter(manager -> manager.getType().getEstimator() != null) .map(this::defineGetRoute) .reduce(RouterFunction::and) - .orElseThrow(); + .orElse(null); } private RouterFunction defineGetRoute(ProblemManager manager) { @@ -62,7 +64,13 @@ private Mono handleGet( ) { var problemId = req.pathVariable(PROBLEM_ID_PARAM_NAME); var problem = findProblemOrThrow(manager, problemId); - var bound = problem.estimateBound(); + + Mono bound; + try { + bound = problem.estimateBound(); + } catch (IllegalStateException e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage()); + } return ok().body(bound, new ParameterizedTypeReference<>() { }); @@ -80,13 +88,11 @@ private void handleGetDocumentation( .parameter(parameterBuilder().in(ParameterIn.PATH).name(PROBLEM_ID_PARAM_NAME)) .response(responseBuilder() .responseCode(String.valueOf(HttpStatus.OK.value())) - .content(getOkResponseContent(manager)) + .content(getOkResponseContent()) ); } - private static org.springdoc.core.fn.builders.content.Builder getOkResponseContent( - ProblemManager manager - ) { + private static org.springdoc.core.fn.builders.content.Builder getOkResponseContent() { return contentBuilder() .mediaType(APPLICATION_JSON_VALUE) .schema(schemaBuilder().implementation(Bound.class)); diff --git a/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java index 1f7f10c5..5abfe916 100644 --- a/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java @@ -1,6 +1,7 @@ package edu.kit.provideq.toolbox.demonstrators; import edu.kit.provideq.toolbox.Bound; +import edu.kit.provideq.toolbox.BoundType; import edu.kit.provideq.toolbox.meta.Problem; import edu.kit.provideq.toolbox.meta.ProblemManager; import edu.kit.provideq.toolbox.meta.ProblemType; @@ -19,10 +20,10 @@ public class DemonstratorConfiguration { "demonstrator", String.class, String.class, - demonstratorEstimator() + null ); - private static Function demonstratorEstimator() { + private Function demonstratorEstimator() { throw new UnsupportedOperationException("Estimation of this problem type is not supported"); } diff --git a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java index 7a819fda..9b29ca0b 100644 --- a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/dead/DeadFeatureConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.featuremodel.anomaly.dead; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -9,7 +8,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -29,7 +27,7 @@ public class DeadFeatureConfiguration { "feature-model-anomaly-dead", String.class, String.class, - deadFeatureEstimator() + null ); @Bean @@ -44,11 +42,6 @@ ProblemManager getDeadFeatureManager( ); } - - private static Function deadFeatureEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java index 3ac20661..d1edc2a3 100644 --- a/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/featuremodel/anomaly/voidmodel/VoidModelConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.featuremodel.anomaly.voidmodel; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -9,7 +8,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -29,7 +27,7 @@ public class VoidModelConfiguration { "feature-model-anomaly-void", String.class, String.class, - voidModelEstimator() + null ); @Bean @@ -44,10 +42,6 @@ ProblemManager getVoidModelManager( ); } - private static Function voidModelEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java index a65e8292..f7bf9c72 100644 --- a/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/knapsack/KnapsackConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.knapsack; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.knapsack.solvers.PythonKnapsackSolver; @@ -11,7 +10,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,7 +28,7 @@ public class KnapsackConfiguration { "knapsack", String.class, String.class, - knapsackEstimator() + null ); @Bean @@ -46,10 +44,6 @@ ProblemManager getKnapsackManager( ); } - private static Function knapsackEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java index e35aa699..1117f38b 100644 --- a/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/maxcut/MaxCutConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.maxcut; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.maxcut.solvers.CirqMaxCutSolver; @@ -12,7 +11,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,7 +28,7 @@ public class MaxCutConfiguration { "max-cut", String.class, String.class, - maxCutEstimator() + null ); @Bean @@ -47,10 +45,6 @@ ProblemManager getMaxCutManager( ); } - private static Function maxCutEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java index 1748324c..1a539268 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java @@ -85,10 +85,6 @@ public Mono> solve() { } public Mono estimateBound() { - if (this.bound != null) { - return Mono.just(this.bound); - } - if (this.input == null) { throw new IllegalStateException("Cannot estimate bound without input!"); } @@ -106,7 +102,6 @@ public Mono estimateBound() { return Mono.just(boundWithExecutionTime) .doOnNext(boundValue -> this.bound = boundValue); - } public UUID getId() { diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java index b31c82e3..4027c9b9 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java @@ -1,7 +1,6 @@ package edu.kit.provideq.toolbox.meta; import edu.kit.provideq.toolbox.Bound; - import java.util.function.Function; /** @@ -16,9 +15,11 @@ public class ProblemType { /** * Defines a new problem type. * - * @param id a unique string identifier for this type of problem. - * @param inputClass the Java class object corresponding to the {@link InputT} type parameter. + * @param id a unique string identifier for this type of problem. + * @param inputClass the Java class object corresponding to the {@link InputT} type parameter. * @param resultClass the Java class object corresponding to the {@link ResultT} type parameter. + * @param estimator the bound estimator for this problem type. + * null if estimation is not supported. */ public ProblemType( String id, @@ -66,6 +67,7 @@ public String toString() { + "id='%s'".formatted(id) + ", inputClass=%s".formatted(inputClass) + ", resultClass=%s".formatted(resultClass) + + ", estimator?=%s".formatted(estimator != null) + '}'; } } diff --git a/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java index 92e64dd8..42e3f91a 100644 --- a/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.qubo; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -12,7 +11,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -32,7 +30,7 @@ public class QuboConfiguration { "qubo", String.class, String.class, - quboEstimator() + null ); @Bean @@ -49,10 +47,6 @@ ProblemManager getQuboManager( ); } - private static Function quboEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems(ResourceProvider resourceProvider) { try { var problemInputStream = Objects.requireNonNull( diff --git a/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java index 107e4fa8..6d819683 100644 --- a/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/sat/SatConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.sat; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.format.cnf.dimacs.DimacsCnfSolution; @@ -11,7 +10,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -28,7 +26,7 @@ public class SatConfiguration { "sat", String.class, DimacsCnfSolution.class, - satEstimator() + null ); @Bean @@ -43,10 +41,6 @@ ProblemManager getSatManager( ); } - private static Function satEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java index 6096e054..4bc63594 100644 --- a/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/tsp/TspConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.tsp; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -12,7 +11,6 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -28,7 +26,7 @@ public class TspConfiguration { "tsp", String.class, String.class, - tspEstimator() + null ); @Bean @@ -42,10 +40,6 @@ ProblemManager getTspManager( loadExampleProblems(provider)); } - private static Function tspEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems(ResourceProvider provider) { try { String[] problemNames = new String[] { diff --git a/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java index 7dc57afc..d2499741 100644 --- a/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/vrp/VrpConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.vrp; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -13,7 +12,6 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -29,7 +27,7 @@ public class VrpConfiguration { "vrp", String.class, String.class, - vrpEstimator() + null ); @Bean @@ -47,10 +45,6 @@ ProblemManager getVrpManager( ); } - private static Function vrpEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems( ResourceProvider resourceProvider ) { diff --git a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java index 0b8905d9..e7918160 100644 --- a/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/vrp/clusterer/VrpClustererConfiguration.java @@ -1,6 +1,5 @@ package edu.kit.provideq.toolbox.vrp.clusterer; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.ResourceProvider; import edu.kit.provideq.toolbox.exception.MissingExampleException; import edu.kit.provideq.toolbox.meta.Problem; @@ -9,7 +8,6 @@ import java.io.IOException; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -22,7 +20,7 @@ public class VrpClustererConfiguration { "cluster-vrp", String.class, String.class, - clusterVrpEstimator() + null ); @Bean @@ -37,10 +35,6 @@ ProblemManager getClusterVrpManager( ); } - private static Function clusterVrpEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported yet"); - } - private Set> loadExampleProblems( ResourceProvider resourceProvider ) { From 8acbab3b806ec6d6dc77b9f98bbd28f000e3ed18 Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:00:16 +0100 Subject: [PATCH 09/20] implemented requested changes --- src/main/java/edu/kit/provideq/toolbox/Bound.java | 3 +++ .../toolbox/demonstrators/DemonstratorConfiguration.java | 7 ------- src/main/java/edu/kit/provideq/toolbox/meta/Problem.java | 7 +++++-- .../java/edu/kit/provideq/toolbox/meta/ProblemType.java | 6 ++++-- .../edu/kit/provideq/toolbox/qubo/QuboConfiguration.java | 1 - 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/Bound.java b/src/main/java/edu/kit/provideq/toolbox/Bound.java index bdf59cfa..42b8e29f 100644 --- a/src/main/java/edu/kit/provideq/toolbox/Bound.java +++ b/src/main/java/edu/kit/provideq/toolbox/Bound.java @@ -8,4 +8,7 @@ * @param executionTime the time it took to estimate the bound */ public record Bound(String bound, BoundType boundType, long executionTime) { + public Bound(String bound, BoundType boundType) { + this(bound, boundType, -1); + } } diff --git a/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java index 5abfe916..f1875365 100644 --- a/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/demonstrators/DemonstratorConfiguration.java @@ -1,12 +1,9 @@ package edu.kit.provideq.toolbox.demonstrators; -import edu.kit.provideq.toolbox.Bound; -import edu.kit.provideq.toolbox.BoundType; import edu.kit.provideq.toolbox.meta.Problem; import edu.kit.provideq.toolbox.meta.ProblemManager; import edu.kit.provideq.toolbox.meta.ProblemType; import java.util.Set; -import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -23,10 +20,6 @@ public class DemonstratorConfiguration { null ); - private Function demonstratorEstimator() { - throw new UnsupportedOperationException("Estimation of this problem type is not supported"); - } - @Bean ProblemManager getDemonstratorManager( CplexMipDemonstrator cplexMipDemonstrator diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java index 1a539268..67503713 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java @@ -10,6 +10,7 @@ import java.util.Set; import java.util.UUID; import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; import reactor.core.publisher.Mono; @@ -89,13 +90,15 @@ public Mono estimateBound() { throw new IllegalStateException("Cannot estimate bound without input!"); } - if (this.type.getEstimator() == null) { + Function estimator; + if (this.type.getEstimator().isEmpty()) { throw new IllegalStateException("Cannot estimate bound without an estimator!"); } + estimator = this.type.getEstimator().get(); long start = System.currentTimeMillis(); - var bound = this.type.getEstimator().apply(this.input); + var bound = estimator.apply(this.input); long finish = System.currentTimeMillis(); var executionTime = finish - start; var boundWithExecutionTime = new Bound(bound.bound(), bound.boundType(), executionTime); diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java index 4027c9b9..588368e3 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java @@ -1,6 +1,8 @@ package edu.kit.provideq.toolbox.meta; import edu.kit.provideq.toolbox.Bound; + +import java.util.Optional; import java.util.function.Function; /** @@ -57,8 +59,8 @@ public Class getResultClass() { /** * Returns the bound estimator for this problem type. */ - public Function getEstimator() { - return estimator; + public Optional> getEstimator() { + return Optional.ofNullable(estimator); } @Override diff --git a/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java b/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java index 42e3f91a..9681f1ff 100644 --- a/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java +++ b/src/main/java/edu/kit/provideq/toolbox/qubo/QuboConfiguration.java @@ -14,7 +14,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - /** * Definition and registration of the "Quadratic Unconstrained Binary Optimization" problem. */ From 505c86ffce351948647df16d865bb4d0cab2ea3c Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:03:27 +0100 Subject: [PATCH 10/20] updated estimation router for optional --- .../java/edu/kit/provideq/toolbox/api/EstimationRouter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java index 2dd71b68..04f91c7e 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java @@ -43,7 +43,7 @@ public class EstimationRouter { @Bean RouterFunction getEstimationRoutes() { return managerProvider.getProblemManagers().stream() - .filter(manager -> manager.getType().getEstimator() != null) + .filter(manager -> manager.getType().getEstimator().isPresent()) .map(this::defineGetRoute) .reduce(RouterFunction::and) .orElse(null); From 72f79feae959998284c7df89c88d31253b0e8705 Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:52:46 +0100 Subject: [PATCH 11/20] refactored Bounds --- src/main/java/edu/kit/provideq/toolbox/Bound.java | 10 +++------- .../java/edu/kit/provideq/toolbox/BoundType.java | 2 +- .../edu/kit/provideq/toolbox/BoundWithInfo.java | 10 ++++++++++ .../java/edu/kit/provideq/toolbox/api/BoundDto.java | 13 +++++++++++++ .../kit/provideq/toolbox/api/EstimationRouter.java | 10 +++++----- .../edu/kit/provideq/toolbox/api/ProblemDto.java | 2 +- .../java/edu/kit/provideq/toolbox/meta/Problem.java | 12 ++++++------ .../edu/kit/provideq/toolbox/meta/ProblemType.java | 1 - 8 files changed, 39 insertions(+), 21 deletions(-) create mode 100644 src/main/java/edu/kit/provideq/toolbox/BoundWithInfo.java create mode 100644 src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java diff --git a/src/main/java/edu/kit/provideq/toolbox/Bound.java b/src/main/java/edu/kit/provideq/toolbox/Bound.java index 42b8e29f..b1aabf62 100644 --- a/src/main/java/edu/kit/provideq/toolbox/Bound.java +++ b/src/main/java/edu/kit/provideq/toolbox/Bound.java @@ -1,14 +1,10 @@ package edu.kit.provideq.toolbox; /** - * Represents a bound estimation for the solution of a problem. + * Represents a bound value with its type. * - * @param bound the bound value + * @param value the estimated value * @param boundType the type of the bound - * @param executionTime the time it took to estimate the bound */ -public record Bound(String bound, BoundType boundType, long executionTime) { - public Bound(String bound, BoundType boundType) { - this(bound, boundType, -1); - } +public record Bound(String value, BoundType boundType) { } diff --git a/src/main/java/edu/kit/provideq/toolbox/BoundType.java b/src/main/java/edu/kit/provideq/toolbox/BoundType.java index bf0c9de4..3cf2a81a 100644 --- a/src/main/java/edu/kit/provideq/toolbox/BoundType.java +++ b/src/main/java/edu/kit/provideq/toolbox/BoundType.java @@ -1,7 +1,7 @@ package edu.kit.provideq.toolbox; /** - * Represents the bound type of a bound. + * Represents the bound type of bounds. */ public enum BoundType { /** diff --git a/src/main/java/edu/kit/provideq/toolbox/BoundWithInfo.java b/src/main/java/edu/kit/provideq/toolbox/BoundWithInfo.java new file mode 100644 index 00000000..9aacc7e9 --- /dev/null +++ b/src/main/java/edu/kit/provideq/toolbox/BoundWithInfo.java @@ -0,0 +1,10 @@ +package edu.kit.provideq.toolbox; + +/** + * Represents a bound estimation for the solution of a problem. + * + * @param bound the value + * @param executionTime the time it took to estimate the value + */ +public record BoundWithInfo(Bound bound, long executionTime) { +} diff --git a/src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java b/src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java new file mode 100644 index 00000000..ca4b9c15 --- /dev/null +++ b/src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java @@ -0,0 +1,13 @@ +package edu.kit.provideq.toolbox.api; + +import edu.kit.provideq.toolbox.BoundType; +import edu.kit.provideq.toolbox.BoundWithInfo; + +public record BoundDto(String bound, BoundType boundType, long executionTime) { + public BoundDto(BoundWithInfo boundWithInfo) { + this( + boundWithInfo.bound().value(), + boundWithInfo.bound().boundType(), + boundWithInfo.executionTime()); + } +} diff --git a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java index 04f91c7e..ed3e2633 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java @@ -10,12 +10,12 @@ import static org.springframework.web.reactive.function.server.RequestPredicates.accept; import static org.springframework.web.reactive.function.server.ServerResponse.ok; -import edu.kit.provideq.toolbox.Bound; import edu.kit.provideq.toolbox.meta.Problem; import edu.kit.provideq.toolbox.meta.ProblemManager; import edu.kit.provideq.toolbox.meta.ProblemManagerProvider; import edu.kit.provideq.toolbox.meta.ProblemType; import io.swagger.v3.oas.annotations.enums.ParameterIn; +import java.util.Objects; import java.util.UUID; import org.springdoc.core.fn.builders.operation.Builder; import org.springframework.beans.factory.annotation.Autowired; @@ -65,10 +65,10 @@ private Mono handleGet( var problemId = req.pathVariable(PROBLEM_ID_PARAM_NAME); var problem = findProblemOrThrow(manager, problemId); - Mono bound; + Mono bound; try { - bound = problem.estimateBound(); - } catch (IllegalStateException e) { + bound = Mono.just(new BoundDto(Objects.requireNonNull(problem.estimateBound().block()))); + } catch (IllegalStateException | NullPointerException e) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage()); } @@ -95,7 +95,7 @@ private void handleGetDocumentation( private static org.springdoc.core.fn.builders.content.Builder getOkResponseContent() { return contentBuilder() .mediaType(APPLICATION_JSON_VALUE) - .schema(schemaBuilder().implementation(Bound.class)); + .schema(schemaBuilder().implementation(BoundDto.class)); } private Problem findProblemOrThrow( diff --git a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java index 31a4a643..138a0d87 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java @@ -1,6 +1,6 @@ package edu.kit.provideq.toolbox.api; -import edu.kit.provideq.toolbox.Bound; +import edu.kit.provideq.toolbox.BoundWithInfo; import edu.kit.provideq.toolbox.Solution; import edu.kit.provideq.toolbox.meta.Problem; import edu.kit.provideq.toolbox.meta.ProblemSolver; diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java index 67503713..4f0ef36d 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java @@ -1,6 +1,6 @@ package edu.kit.provideq.toolbox.meta; -import edu.kit.provideq.toolbox.Bound; +import edu.kit.provideq.toolbox.BoundWithInfo; import edu.kit.provideq.toolbox.Solution; import edu.kit.provideq.toolbox.meta.setting.SolverSetting; import java.util.Collections; @@ -10,7 +10,6 @@ import java.util.Set; import java.util.UUID; import java.util.function.Consumer; -import java.util.function.Function; import java.util.stream.Collectors; import reactor.core.publisher.Mono; @@ -31,7 +30,7 @@ public class Problem { private InputT input; private Solution solution; - private Bound bound; + private BoundWithInfo bound; private ProblemState state; private ProblemSolver solver; private List solverSettings; @@ -85,9 +84,9 @@ public Mono> solve() { }); } - public Mono estimateBound() { + public Mono estimateBound() { if (this.input == null) { - throw new IllegalStateException("Cannot estimate bound without input!"); + throw new IllegalStateException("Cannot estimate value without input!"); } Function estimator; @@ -101,7 +100,8 @@ public Mono estimateBound() { var bound = estimator.apply(this.input); long finish = System.currentTimeMillis(); var executionTime = finish - start; - var boundWithExecutionTime = new Bound(bound.bound(), bound.boundType(), executionTime); + + var boundWithExecutionTime = new BoundWithInfo(bound, executionTime); return Mono.just(boundWithExecutionTime) .doOnNext(boundValue -> this.bound = boundValue); diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java index 588368e3..17edd9ab 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/ProblemType.java @@ -1,7 +1,6 @@ package edu.kit.provideq.toolbox.meta; import edu.kit.provideq.toolbox.Bound; - import java.util.Optional; import java.util.function.Function; From eb779ee88bba3971d38f6b507799ec1866ced163 Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:54:35 +0100 Subject: [PATCH 12/20] more and better usage of optionals --- .../edu/kit/provideq/toolbox/api/ProblemDto.java | 7 ++++--- .../edu/kit/provideq/toolbox/meta/Problem.java | 14 +++++++------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java index 138a0d87..6dc6bce2 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java @@ -8,6 +8,7 @@ import edu.kit.provideq.toolbox.meta.setting.SolverSetting; import java.util.Collections; import java.util.List; +import java.util.Optional; /** * Data transfer object for {@link Problem problems}, used in REST API request bodies and responses. @@ -17,7 +18,7 @@ public class ProblemDto { private String typeId; private InputT input; private Solution solution; - private Bound bound; + private Optional bound; private ProblemState state; private String solverId; private List solverSettings; @@ -70,7 +71,7 @@ public Solution getSolution() { return solution; } - public Bound getBound() { + public Optional getBound() { return bound; } @@ -107,7 +108,7 @@ public String toString() { + ", solverId=" + solverId + ", input=" + input + ", solution=" + solution - + ", bound=" + bound + + ", value=" + bound + ", solverSettings=" + solverSettings + ", subProblems=" + subProblems + '}'; diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java index 4f0ef36d..ba222ae1 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java @@ -88,12 +88,12 @@ public Mono estimateBound() { if (this.input == null) { throw new IllegalStateException("Cannot estimate value without input!"); } - - Function estimator; - if (this.type.getEstimator().isEmpty()) { - throw new IllegalStateException("Cannot estimate bound without an estimator!"); + + var optionalEstimator = this.type.getEstimator(); + if (optionalEstimator.isEmpty()) { + throw new IllegalStateException("Cannot estimate value without an estimator!"); } - estimator = this.type.getEstimator().get(); + var estimator = optionalEstimator.get(); long start = System.currentTimeMillis(); @@ -234,7 +234,7 @@ public String toString() { + '}'; } - public Bound getBound() { - return bound; + public Optional getBound() { + return Optional.ofNullable(bound); } } From c3b6187cc84813c142b20acbe2684f3be37b2537 Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:18:01 +0100 Subject: [PATCH 13/20] improved BoundDto creation --- .../edu/kit/provideq/toolbox/api/EstimationRouter.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java index ed3e2633..d29fb3c0 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java @@ -49,6 +49,9 @@ RouterFunction getEstimationRoutes() { .orElse(null); } + /** + * Estimate Operation: GET /problems/TYPE/{problemId}/bound. + */ private RouterFunction defineGetRoute(ProblemManager manager) { return route().GET( getEstimationRouteForProblemType(manager.getType()), @@ -67,8 +70,9 @@ private Mono handleGet( Mono bound; try { - bound = Mono.just(new BoundDto(Objects.requireNonNull(problem.estimateBound().block()))); - } catch (IllegalStateException | NullPointerException e) { + problem.estimateBound(); + bound = Mono.just(new BoundDto(problem.getBound().orElseThrow())); + } catch (IllegalStateException | NoSuchElementException e) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage()); } From 88990e4de272226cba2209b77da30b749770f208 Mon Sep 17 00:00:00 2001 From: zaibod Date: Sun, 24 Nov 2024 17:36:12 +0100 Subject: [PATCH 14/20] . --- src/main/java/edu/kit/provideq/toolbox/meta/Problem.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java index ba222ae1..478c9523 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java @@ -84,7 +84,7 @@ public Mono> solve() { }); } - public Mono estimateBound() { + public void estimateBound() { if (this.input == null) { throw new IllegalStateException("Cannot estimate value without input!"); } @@ -101,10 +101,7 @@ public Mono estimateBound() { long finish = System.currentTimeMillis(); var executionTime = finish - start; - var boundWithExecutionTime = new BoundWithInfo(bound, executionTime); - - return Mono.just(boundWithExecutionTime) - .doOnNext(boundValue -> this.bound = boundValue); + this.bound = new BoundWithInfo(bound, executionTime); } public UUID getId() { From ed644b0ef4f56272f6e63e4082b2bfad75abbd10 Mon Sep 17 00:00:00 2001 From: zaibod Date: Sun, 24 Nov 2024 17:36:55 +0100 Subject: [PATCH 15/20] removed optional from dto --- src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java index 6dc6bce2..6485d170 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java @@ -18,7 +18,7 @@ public class ProblemDto { private String typeId; private InputT input; private Solution solution; - private Optional bound; + private BoundWithInfo bound; private ProblemState state; private String solverId; private List solverSettings; @@ -41,7 +41,7 @@ public static ProblemDto fromProblem( dto.typeId = problem.getType().getId(); dto.input = problem.getInput().orElse(null); dto.solution = problem.getSolution(); - dto.bound = problem.getBound(); + dto.bound = problem.getBound().orElse(null); dto.state = problem.getState(); dto.solverId = problem.getSolver() .map(ProblemSolver::getId) @@ -71,7 +71,7 @@ public Solution getSolution() { return solution; } - public Optional getBound() { + public BoundWithInfo getBound() { return bound; } From 96c082c725d70e2494224c043e53bc7aa01199e4 Mon Sep 17 00:00:00 2001 From: zaibod Date: Sun, 24 Nov 2024 17:50:27 +0100 Subject: [PATCH 16/20] fixed forgotten import --- .../java/edu/kit/provideq/toolbox/api/EstimationRouter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java index d29fb3c0..08e6b34b 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/EstimationRouter.java @@ -15,7 +15,7 @@ import edu.kit.provideq.toolbox.meta.ProblemManagerProvider; import edu.kit.provideq.toolbox.meta.ProblemType; import io.swagger.v3.oas.annotations.enums.ParameterIn; -import java.util.Objects; +import java.util.NoSuchElementException; import java.util.UUID; import org.springdoc.core.fn.builders.operation.Builder; import org.springframework.beans.factory.annotation.Autowired; From 35647f54b242a5cb9f600df3cbe4f03f1c3531b9 Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:29:34 +0100 Subject: [PATCH 17/20] renamed variable to distinction --- src/main/java/edu/kit/provideq/toolbox/meta/Problem.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java index 478c9523..8d33afef 100644 --- a/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java +++ b/src/main/java/edu/kit/provideq/toolbox/meta/Problem.java @@ -97,11 +97,11 @@ public void estimateBound() { long start = System.currentTimeMillis(); - var bound = estimator.apply(this.input); + var estimatedBound = estimator.apply(this.input); long finish = System.currentTimeMillis(); var executionTime = finish - start; - this.bound = new BoundWithInfo(bound, executionTime); + this.bound = new BoundWithInfo(estimatedBound, executionTime); } public UUID getId() { From aeacc2f9cc7c4b09f9cf2c5237ace02596d4b6e6 Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 25 Nov 2024 13:21:36 +0100 Subject: [PATCH 18/20] refactor: bound value type is now Float --- src/main/java/edu/kit/provideq/toolbox/Bound.java | 2 +- src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/Bound.java b/src/main/java/edu/kit/provideq/toolbox/Bound.java index b1aabf62..6a813cf4 100644 --- a/src/main/java/edu/kit/provideq/toolbox/Bound.java +++ b/src/main/java/edu/kit/provideq/toolbox/Bound.java @@ -6,5 +6,5 @@ * @param value the estimated value * @param boundType the type of the bound */ -public record Bound(String value, BoundType boundType) { +public record Bound(Float value, BoundType boundType) { } diff --git a/src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java b/src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java index ca4b9c15..18350ee9 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java @@ -3,7 +3,7 @@ import edu.kit.provideq.toolbox.BoundType; import edu.kit.provideq.toolbox.BoundWithInfo; -public record BoundDto(String bound, BoundType boundType, long executionTime) { +public record BoundDto(Float bound, BoundType boundType, long executionTime) { public BoundDto(BoundWithInfo boundWithInfo) { this( boundWithInfo.bound().value(), From 2fc4daca53f2b6a1eac26c4e2a60e35ee6ade02f Mon Sep 17 00:00:00 2001 From: zaibod <92274292+zaibod@users.noreply.github.com> Date: Mon, 25 Nov 2024 13:29:17 +0100 Subject: [PATCH 19/20] refactor: bound type is now float --- src/main/java/edu/kit/provideq/toolbox/Bound.java | 2 +- src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/Bound.java b/src/main/java/edu/kit/provideq/toolbox/Bound.java index 6a813cf4..d59b15e6 100644 --- a/src/main/java/edu/kit/provideq/toolbox/Bound.java +++ b/src/main/java/edu/kit/provideq/toolbox/Bound.java @@ -6,5 +6,5 @@ * @param value the estimated value * @param boundType the type of the bound */ -public record Bound(Float value, BoundType boundType) { +public record Bound(float value, BoundType boundType) { } diff --git a/src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java b/src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java index 18350ee9..e23356fa 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/BoundDto.java @@ -3,7 +3,7 @@ import edu.kit.provideq.toolbox.BoundType; import edu.kit.provideq.toolbox.BoundWithInfo; -public record BoundDto(Float bound, BoundType boundType, long executionTime) { +public record BoundDto(float bound, BoundType boundType, long executionTime) { public BoundDto(BoundWithInfo boundWithInfo) { this( boundWithInfo.bound().value(), From dc926c398c7c655a27f83be11182a5fe8e4e2832 Mon Sep 17 00:00:00 2001 From: Elscrux Date: Tue, 26 Nov 2024 20:01:13 +0100 Subject: [PATCH 20/20] chore: Remove redundant import --- src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java index 6485d170..e53db2f5 100644 --- a/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java +++ b/src/main/java/edu/kit/provideq/toolbox/api/ProblemDto.java @@ -8,7 +8,6 @@ import edu.kit.provideq.toolbox.meta.setting.SolverSetting; import java.util.Collections; import java.util.List; -import java.util.Optional; /** * Data transfer object for {@link Problem problems}, used in REST API request bodies and responses.