Fix treatment of cpu, memory, replicas in AMPL
Even when the UI claims that these are of type "float", treat them as integers. Also fix a crash when either of `lower_bound`, `higher_bound` are missing in the constraints. Change-Id: I67349e6d163fbec38f6a71208490997e318e57ea
This commit is contained in:
@@ -3,6 +3,7 @@ package eu.nebulouscloud.optimiser.controller;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.Spliterator;
|
||||
import java.util.Spliterators;
|
||||
@@ -197,16 +198,39 @@ public class AMPLGenerator {
|
||||
out.println("# Variables");
|
||||
for (final JsonNode p : app.getKubevelaVariables().values()) {
|
||||
ObjectNode param = (ObjectNode) p;
|
||||
String param_name = param.get("key").textValue();
|
||||
String param_path = param.get("path").textValue();
|
||||
String param_type = param.get("type").textValue();
|
||||
// Even if these variables are sent over as "float", we know they
|
||||
// have to be treated as integers for kubevela (replicas, memory)
|
||||
// or SAL (cpu). I.e., paramMeaning overrides paramType.
|
||||
List<String> integerVariables = List.of("cpu", "memory", "replicas");
|
||||
String paramName = param.get("key").textValue();
|
||||
String paramPath = param.get("path").textValue();
|
||||
String paramType = param.get("type").textValue();
|
||||
String paramMeaning = param.get("meaning").textValue();
|
||||
ObjectNode value = (ObjectNode)param.get("value");
|
||||
if (param_type.equals("float")) {
|
||||
out.format("var %s", param_name);
|
||||
if (paramType.equals("int") || integerVariables.contains(paramMeaning)) {
|
||||
out.format("var %s integer", paramName);
|
||||
if (value != null) {
|
||||
String separator = "";
|
||||
JsonNode lower = value.get("lower_bound");
|
||||
JsonNode upper = value.get("higher_bound");
|
||||
JsonNode lower = value.at("/lower_bound");
|
||||
JsonNode upper = value.at("/higher_bound");
|
||||
// TODO: What if the constraints are given as float?
|
||||
// Round up or down? Emit as floats and hope for the
|
||||
// best? Leave out illegal constraints?
|
||||
if (lower.isIntegralNumber()) {
|
||||
out.format(" >= %s", lower.longValue());
|
||||
separator = ", ";
|
||||
}
|
||||
if (upper.isIntegralNumber()) {
|
||||
out.format("%s<= %s", separator, upper.longValue());
|
||||
}
|
||||
}
|
||||
out.println(";");
|
||||
} else if (paramType.equals("float")) {
|
||||
out.format("var %s", paramName);
|
||||
if (value != null) {
|
||||
String separator = "";
|
||||
JsonNode lower = value.at("/lower_bound");
|
||||
JsonNode upper = value.at("/higher_bound");
|
||||
// `isNumber` because the constraint might be given as integer
|
||||
if (lower.isNumber()) {
|
||||
out.format(" >= %s", lower.doubleValue());
|
||||
@@ -217,28 +241,13 @@ public class AMPLGenerator {
|
||||
}
|
||||
}
|
||||
out.println(";");
|
||||
} else if (param_type.equals("int")) {
|
||||
out.format("var %s integer", param_name);
|
||||
if (value != null) {
|
||||
String separator = "";
|
||||
JsonNode lower = value.get("lower_bound");
|
||||
JsonNode upper = value.get("higher_bound");
|
||||
if (lower.isIntegralNumber()) {
|
||||
out.format(" >= %s", lower.longValue());
|
||||
separator = ", ";
|
||||
}
|
||||
if (upper.isIntegralNumber()) {
|
||||
out.format("%s<= %s", separator, upper.longValue());
|
||||
}
|
||||
}
|
||||
out.format("; # %s%n", param_path);
|
||||
} else if (param_type.equals("string")) {
|
||||
} else if (paramType.equals("string")) {
|
||||
out.println("# TODO not sure how to specify a string variable");
|
||||
out.format("var %s symbolic; # %s%n", param_name, param_path);
|
||||
} else if (param_type.equals("array")) {
|
||||
out.format("# TODO generate entries for map '%s' at %s%n", param_name, param_path);
|
||||
out.format("var %s symbolic;%n", paramName);
|
||||
} else if (paramType.equals("array")) {
|
||||
out.format("# TODO generate entries for map '%s' at %s%n", paramName, paramPath);
|
||||
} else {
|
||||
log.info("Unknown variable parameter type: {}", param_type,
|
||||
log.info("Unknown variable parameter type: {}", paramType,
|
||||
keyValue("appId", app.getUUID()));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user