From e98b52a945f236e8eeacabf01c9395893af47b0f Mon Sep 17 00:00:00 2001 From: Manuel Spuhler <manuel.spuhler@chuv.ch> Date: Wed, 18 Apr 2018 15:13:42 +0200 Subject: [PATCH] I/O for Exareme K_MEANS - wip --- .../eu/hbp/mip/controllers/ExperimentApi.java | 24 ++-- .../java/eu/hbp/mip/model/Experiment.java | 123 ++++++++++++------ 2 files changed, 88 insertions(+), 59 deletions(-) diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java index c1639df2d..3ede8eef8 100644 --- a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java +++ b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java @@ -6,6 +6,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import eu.hbp.mip.akka.WokenClientController; import eu.hbp.mip.configuration.SecurityConfiguration; +import eu.hbp.mip.model.AlgorithmParam; import eu.hbp.mip.model.Experiment; import eu.hbp.mip.model.ExperimentQuery; import eu.hbp.mip.model.User; @@ -83,12 +84,12 @@ public class ExperimentApi extends WokenClientController { LOGGER.info("Experiment saved"); - if (isExaremeAlgo(expQuery)) { - String algoCode = expQuery.getAlgorithms().get(0).getCode(); - sendExaremeExperiment(experiment, algoCode); - } - else { + if (!experiment.isExaremeAlgorithm()) { sendExperiment(experiment); + } else { + String algoCode = expQuery.getAlgorithms().get(0).getCode(); + List<AlgorithmParam> params = expQuery.getAlgorithms().get(0).getParameters(); + sendExaremeExperiment(experiment, algoCode, params); } return new ResponseEntity<>(gsonOnlyExposed.toJson(experiment.jsonify()), HttpStatus.OK); @@ -286,11 +287,11 @@ public class ExperimentApi extends WokenClientController { }, ec); } - private void sendExaremeExperiment(Experiment experiment, String algoCode) { + private void sendExaremeExperiment(Experiment experiment, String algoCode, List <AlgorithmParam> params) { // >> Temporary: we should integrate exareme in a proper way in the future // this runs in the background. For future optimization: use a thread pool new Thread(() -> { - String query = experiment.computeExaremeQuery(); + String query = experiment.computeExaremeQuery(params); String url = miningExaremeQueryUrl + "/" + algoCode; // Results are stored in the experiment object try { @@ -322,13 +323,4 @@ public class ExperimentApi extends WokenClientController { LOGGER.info("Experiment updated (finished)"); } - - private static boolean isExaremeAlgo(ExperimentQuery expQuery) { - String code = expQuery.getAlgorithms().get(0).getCode(); - return expQuery.getAlgorithms().size() > 0 - && ("WP_".equals(code.substring(0, 3)) - || "glm_exareme".equals(code) - || "K_MEANS".equals(code)); - } - } diff --git a/src/main/java/eu/hbp/mip/model/Experiment.java b/src/main/java/eu/hbp/mip/model/Experiment.java index 38e535cb5..f4880376f 100644 --- a/src/main/java/eu/hbp/mip/model/Experiment.java +++ b/src/main/java/eu/hbp/mip/model/Experiment.java @@ -1,10 +1,7 @@ package eu.hbp.mip.model; import ch.chuv.lren.mip.portal.WokenConversions; -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; +import com.google.gson.*; import com.google.gson.annotations.Expose; import com.google.gson.reflect.TypeToken; import ch.chuv.lren.woken.messages.datasets.DatasetId; @@ -21,10 +18,7 @@ import scala.collection.JavaConversions; import javax.persistence.*; import java.lang.reflect.Type; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; +import java.util.*; /** @@ -137,44 +131,60 @@ public class Experiment { } - public String computeExaremeQuery() { + public String computeExaremeQuery(List<AlgorithmParam> params) { List<ExaremeQueryElement> queryElements = new LinkedList<>(); - for (Variable var : model.getQuery().getVariables()) + + // columns + List<String> columns = new ArrayList<>(); + for (Variable var : model.getQuery().getVariables()) { columns.add(var.getCode()); } + for (Variable var : model.getQuery().getCovariables()) { columns.add(var.getCode()); } + for (Variable var : model.getQuery().getGrouping()) { columns.add(var.getCode()); } + StringBuilder sb = new StringBuilder(); + int i = 0; + for (String s : columns) { - ExaremeQueryElement el = new ExaremeQueryElement(); - el.setName("variable"); - el.setDesc(""); - el.setValue(var.getCode()); - queryElements.add(el); + i++; + sb.append(s); + if (i < columns.size()) { + sb.append(","); + } } - for (Variable var : model.getQuery().getCovariables()) - { - ExaremeQueryElement el = new ExaremeQueryElement(); - el.setName("covariables"); - el.setDesc(""); - el.setValue(var.getCode()); - queryElements.add(el); + ExaremeQueryElement columnsEl = new ExaremeQueryElement(); + columnsEl.setName("columns"); + columnsEl.setDesc(""); + columnsEl.setValue(sb.toString()); + queryElements.add(columnsEl); + + // parameters + if (params != null) { + for (AlgorithmParam p : params) + { + ExaremeQueryElement paramEl = new ExaremeQueryElement(); + paramEl.setName(p.getCode()); + paramEl.setDesc(""); + paramEl.setValue(p.getValue()); + queryElements.add(paramEl); + } } - for (Variable var : model.getQuery().getGrouping()) + + // datasets + StringBuilder datasets = new StringBuilder(); + List<Variable> trainingDatasets = model.getQuery().getTrainingDatasets(); + int j = 0; + for (Variable var : trainingDatasets) { - ExaremeQueryElement el = new ExaremeQueryElement(); - el.setName("groupings"); - el.setDesc(""); - el.setValue(var.getCode()); - queryElements.add(el); + j++; + datasets.append(var.getCode()); + if (j < trainingDatasets.size() ) { + datasets.append(","); + } } - ExaremeQueryElement tableEl = new ExaremeQueryElement(); - tableEl.setName("showtable"); - tableEl.setDesc(""); - tableEl.setValue("TotalResults"); - queryElements.add(tableEl); - - ExaremeQueryElement formatEl = new ExaremeQueryElement(); - formatEl.setName("format"); - formatEl.setDesc(""); - formatEl.setValue("True"); - queryElements.add(formatEl); + ExaremeQueryElement datasetsEl = new ExaremeQueryElement(); + datasetsEl.setName("dataset"); + datasetsEl.setDesc(""); + datasetsEl.setValue(datasets.toString()); + queryElements.add(datasetsEl); return gson.toJson(queryElements); } @@ -197,11 +207,30 @@ public class Experiment { exp.add("validations", jsonValidations); } - if (this.result != null && !this.hasServerError) - { + if (this.result != null && !this.hasServerError) { exp.remove("result"); - JsonArray jsonResult = parser.parse(this.result).getAsJsonArray(); - exp.add("result", jsonResult); + + if (!this.isExaremeAlgorithm()) { + JsonArray jsonResult = parser.parse(this.result).getAsJsonArray(); + exp.add("result", jsonResult); + } else { + JsonArray jsonArrayResult = new JsonArray(); + JsonObject jsonObjectResult = new JsonObject(); + exp.remove("result"); + + JsonObject jsonData = parser.parse(this.result).getAsJsonArray().get(0).getAsJsonObject(); + jsonObjectResult.add("data", jsonData); + + JsonObject algoObject = parser.parse(this.algorithms).getAsJsonArray().get(0).getAsJsonObject(); + jsonObjectResult.add("algorithm", algoObject.get("name")); + jsonObjectResult.add("code", algoObject.get("code")); + + jsonObjectResult.add("type", new JsonPrimitive("application/vnd.highcharts+json")); + + jsonArrayResult.add(jsonObjectResult); + + exp.add("result", jsonArrayResult); + } } return exp; @@ -310,4 +339,12 @@ public class Experiment { public void setShared(boolean shared) { this.shared = shared; } + + public boolean isExaremeAlgorithm() { + String algorithms = this.algorithms; + Boolean isExareme = algorithms.contains("WP_") + || algorithms.contains("K_MEANS"); + + return isExareme; + } } -- GitLab