From 36a3176318b4aed1bd55176968e1ef323b314643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Garrido=20Labrador?= Date: Wed, 2 Sep 2020 14:00:21 +0200 Subject: [PATCH 1/6] Improve navigation in multidatasets --- ubumlaas/experiments/algorithm/__init__.py | 2 +- ubumlaas/experiments/forms.py | 4 +- ubumlaas/experiments/views/dataset.py | 12 +- ubumlaas/experiments/views/experiment.py | 11 +- ubumlaas/static/css/bootstrap-append.css | 12 +- ubumlaas/static/css/custom.css | 11 +- ubumlaas/static/js/config_dataset.js | 20 +- ubumlaas/static/js/multiexperiment.js | 234 +++++++++++++++--- ubumlaas/templates/blocks/dataset_maker.html | 55 ++++ .../blocks/generic_data_uploaded.html | 28 +++ ubumlaas/templates/blocks/select_dataset.html | 12 +- ubumlaas/templates/blocks/show_columns.html | 16 +- .../blocks/show_columns_reduced.html | 61 +---- ubumlaas/templates/experiment_form.html | 95 ++----- 14 files changed, 370 insertions(+), 203 deletions(-) create mode 100644 ubumlaas/templates/blocks/dataset_maker.html create mode 100644 ubumlaas/templates/blocks/generic_data_uploaded.html diff --git a/ubumlaas/experiments/algorithm/__init__.py b/ubumlaas/experiments/algorithm/__init__.py index f3e5f069..4687dbd9 100644 --- a/ubumlaas/experiments/algorithm/__init__.py +++ b/ubumlaas/experiments/algorithm/__init__.py @@ -55,7 +55,7 @@ def task_skeleton(experiment, current_user): rep = exp["exp_config"]["repetition"] res_global = [] state_global=[] - for i in range(rep): + for _ in range(rep): if exp_manager.is_multi: res=[] state=[] diff --git a/ubumlaas/experiments/forms.py b/ubumlaas/experiments/forms.py index 78cdad45..2c2bae05 100644 --- a/ubumlaas/experiments/forms.py +++ b/ubumlaas/experiments/forms.py @@ -34,11 +34,13 @@ class ExperimentForm(FlaskForm): filter_name = SelectField("Select Filter", choices=[("", "---")]) - def __init__(self, id=None): + def __init__(self, id=None, iddata=None): super(ExperimentForm, self).__init__() if id is not None: self.alg_name.id="alg_name_"+str(id) self.filter_name.id="filter_name_"+str(id) + if iddata is not None: + self.data.id="data_"+str(iddata) def alg_list(self, alg_typ): """Generate a list of supported algorithms by type. diff --git a/ubumlaas/experiments/views/dataset.py b/ubumlaas/experiments/views/dataset.py index 95310441..7c4548f3 100644 --- a/ubumlaas/experiments/views/dataset.py +++ b/ubumlaas/experiments/views/dataset.py @@ -1,5 +1,5 @@ from flask import \ - (render_template) + (render_template, request) from ubumlaas.experiments.forms import \ (ExperimentForm, DatasetForm) from flask_login import (current_user, login_required) @@ -24,6 +24,16 @@ def update_dataset_list(): form_e.dataset_list() #log inside dataset_list return render_template("blocks/select_dataset.html", form_e=form_e) +@login_required +@views.experiments.route("/new_dataset_maker", methods=["POST"]) +def new_dataset_maker(): + + iddex = request.form.get("idex", 0) + form_e = ExperimentForm(0, iddex) + form_e.dataset_list() + form_d = DatasetForm() + return render_template("blocks/dataset_maker.html", form_e=form_e, iddex=iddex, form_d=form_d); + @login_required @views.experiments.route("/new_experiment/new_dataset", methods=["POST"]) diff --git a/ubumlaas/experiments/views/experiment.py b/ubumlaas/experiments/views/experiment.py index c651e479..a6ccb2c3 100644 --- a/ubumlaas/experiments/views/experiment.py +++ b/ubumlaas/experiments/views/experiment.py @@ -29,7 +29,7 @@ def new_experiment(): str -- HTTP response with rendered page. """ - form_e = ExperimentForm(0) + form_e = ExperimentForm(0, 0) form_e.dataset_list() form_d = DatasetForm() @@ -45,7 +45,7 @@ def new_experiment(): return render_template("experiment_form.html", form_e=form_e, form_d=form_d, form_p=form_p, - title="New experiment", experiment=experiment, idex=0) + title="New experiment", experiment=experiment, idex=0, iddex=0) @login_required @@ -144,13 +144,14 @@ def change_column_list(): Returns: str -- HTTP response with JSON """ - form_e = ExperimentForm() + iddex = request.form.get("iddex",0) + form_e = ExperimentForm(iddex) filename = form_e.data.data upload_folder = "ubumlaas/datasets/"+current_user.username+"/" df, target_columns = get_dataframe_from_file(upload_folder, filename, target_column=True) - to_return = {"html": render_template("blocks/show_columns.html", data=df), + to_return = {"html": render_template("blocks/show_columns.html", data=df, iddex=iddex), "html2": render_template("blocks/show_columns_reduced.html", - data=df.columns), + data=df.columns, iddex=iddex), "df": generate_df_html(df), "config": target_columns} v.app.logger.info("%d - Get dataset information - %s%s%s", current_user.id, upload_folder,"/",filename) diff --git a/ubumlaas/static/css/bootstrap-append.css b/ubumlaas/static/css/bootstrap-append.css index 742c4b7e..781df5c7 100644 --- a/ubumlaas/static/css/bootstrap-append.css +++ b/ubumlaas/static/css/bootstrap-append.css @@ -208,4 +208,14 @@ footer .main-footer { -ms-transition: all 250ms ease-in-out 0s; -o-transition: all 250ms ease-in-out 0s; transition: all 250ms ease-in-out 0s; - } \ No newline at end of file + } + +.custom-select[multiple], +.custom-select[size]:not([size="1"]) +{ + height: auto; + -webkit-appearance: menulist-textfield; + background-image: none; + /* Fix for excess right padding */ + padding-right: 0.75rem; +} \ No newline at end of file diff --git a/ubumlaas/static/css/custom.css b/ubumlaas/static/css/custom.css index b69b54aa..d040fdeb 100644 --- a/ubumlaas/static/css/custom.css +++ b/ubumlaas/static/css/custom.css @@ -106,17 +106,17 @@ option.list-group-item{ padding: 0.25rem 1rem !important; } -#sel[multiple] option.list-group-item-success:checked{ +.sel[multiple] option.list-group-item-success:checked{ background-color: var(--success) !important; color: #ffffff !important; } -#sel[multiple] option.list-group-item-primary:checked{ +.sel[multiple] option.list-group-item-primary:checked{ background-color: var(--primary) !important; color: #ffffff !important; } -#sel[multiple] option.list-group-item-secondary:checked{ +.sel[multiple] option.list-group-item-secondary:checked{ background-color: var(--secondary) !important; color: #ffffff !important; } @@ -125,14 +125,13 @@ tr.align-middle td{ vertical-align: middle !important; } -#makers{ +#makers, #data-makers{ position: relative !important; display: flex; align-items: stretch; - } -.maker{ +.maker, .data-maker{ position: static; height: 100%; width: 100%; diff --git a/ubumlaas/static/js/config_dataset.js b/ubumlaas/static/js/config_dataset.js index 662f7b81..75b01800 100644 --- a/ubumlaas/static/js/config_dataset.js +++ b/ubumlaas/static/js/config_dataset.js @@ -4,7 +4,7 @@ const MULTITARGET = ["MultiClassification"]; /** - * Possible values of Non-Supervised algorithmsç + * Possible values of Non-Supervised algorithms */ const UNSUPERVISED = ["Clustering"] @@ -12,9 +12,10 @@ const UNSUPERVISED = ["Clustering"] * It guarantees only one target if algorithms is not MULTITARGET * And not target allowed in UNSUPERVISED * - * @param {string} target identifier of target selected + * @param {string} target identifier of target selected + * @param {int} External identifier for dataset */ -function only_one_target(target){ +function only_one_target(target, iddex){ let typ = $("#alg_typ").val(); if(UNSUPERVISED.includes(typ)){ $("#"+target).prop("checked", true); @@ -26,7 +27,7 @@ function only_one_target(target){ target_candidates.each(function(){ if($(this).attr("id")!=target){ $(this).prop("checked",false); - let ido = $("#"+$(this).attr("id").split("_")[0].split("col")[1] + "_opt"); + let ido = $("#"+$(this).attr("id").split("_")[0].split("col")[1] + "_opt_"+iddex); if(ido.hasClass("list-group-item-success")){ ido.removeClass("list-group-item list-group-item-success"); ido.addClass("list-group-item list-group-item-secondary"); @@ -41,21 +42,22 @@ function only_one_target(target){ * * @param {string} identifier of column * @param {string} mode value between target or use + * @param {int} identifier for the dataset in external form */ -function target_or_use(identifier, mode){ +function target_or_use(identifier, mode, iddex){ let typ = $("#alg_typ").val(); if(!UNSUPERVISED.includes(typ) || mode == "use"){ let id = identifier.split("col")[1]; - let use = $("#"+identifier+"_use"); - let target = $("#"+identifier+"_target"); - let v = $("#"+id+"_opt"); + let use = $("#"+identifier+"_use_"+iddex); + let target = $("#"+identifier+"_target_"+iddex); + let v = $("#"+id+"_opt_"+iddex); v.removeClass("list-group-item-primary list-group-item-secondary list-group-item-success"); if (mode == "target"){ if(use.is(":checked")){ use.prop("checked", false); } if(!target.is(":checked")){ - v.addClass("list-group-item-success"); + v.addClass("list-group-item-success") }else{ v.addClass("list-group-item-secondary"); } diff --git a/ubumlaas/static/js/multiexperiment.js b/ubumlaas/static/js/multiexperiment.js index c18d5d31..799cb86c 100644 --- a/ubumlaas/static/js/multiexperiment.js +++ b/ubumlaas/static/js/multiexperiment.js @@ -13,6 +13,46 @@ function me_cidex(){ return me_idexs[me_index]; } +function me_ciddex(){ + return med_idexs[med_index]; +} + +function onClickButton(idb, iddex){ + let lis = $("#sel_"+iddex+" option").filter(":selected"); + let typ = $("#alg_typ").val(); + if(lis.length > 1 && idb==="target" && !MULTITARGET.includes(typ)){ + launch_warning_modal("Only one target", "You can't select more than 1 target in no multilabel algorithms.") + }else{ + lis.each(function(e){ + let v = $(lis[e]); + let ids = "col" + v.attr("id").split("_")[0] + switch(idb){ + case "use": + if(!v.hasClass("list-group-item-primary")){ + $("#"+ids+"_use_label_"+iddex).click(); + } + break; + case "nuse": + if(v.hasClass("list-group-item-success")){ + $("#"+ids+"_target_label_"+iddex).click(); + //v.removeClass("list-group-item-success"); + v.addClass("list-group-item-secondary"); + }else if(v.hasClass("list-group-item-primary")){ + $("#"+ids+"_use_label_"+iddex).click(); + } + break; + case "target": + if(!v.hasClass("list-group-item-success")){ + $("#"+ids+"_target_label_"+iddex).click(); + } + break; + } + v.removeAttr('selected'); + v.prop("selected", false); + }); + } +} + /** * Reset the multiexperiment. */ @@ -48,23 +88,43 @@ $(document).ready(function(){ * Create a new algorithm for a multiexperiment. * Render a new algorithms */ - function me_new_alg(){ + function me_new_alg(algs=true){ + let nidex, block, url, on; + if (algs){ + nidex = me_idexs[me_idexs.length-1]+1; + block = $("
").addClass("maker").attr("data-idex", nidex).css("display","none"); + url = "/new_algorithm_maker" + on = "makers" + }else{ + nidex = med_idexs[med_idexs.length-1]+1; + url = "/new_dataset_maker"; + on = "data-makers" + } // First create a new block - let nidex = me_idexs[me_idexs.length-1]+1; - let block = $("
").addClass("maker").attr("data-idex", nidex).css("display","none"); + $.ajax({ - url: "/new_algorithm_maker", + url: url, type: 'POST', contentType: 'application/x-www-form-urlencoded', data: "alg_type=" + $("#alg_typ").val() + "&idex="+nidex, success: function (result) { - block.html(result); - $("#makers").append(block); - me_idexs.push(nidex); - me_move(); + if(algs){ + block.html(result); + }else{ + block = $(result); + block.css("display","none"); + } - me_sub_clasifiers_count.push(0); - me_sub_filter_count.push(0); + $("#"+on).append(block); + if(algs){ + me_idexs.push(nidex); + me_sub_clasifiers_count.push(0); + me_sub_filter_count.push(0); + }else{ + med_idexs.push(nidex); + } + + me_move(true, false, algs); } }) } @@ -72,28 +132,55 @@ $(document).ready(function(){ /** * Delete the algorithm for the current index */ - function me_delete_alg(){ - if(me_idexs.length == 1){ + function me_delete_alg(algs=true){ + let deletion; + if(algs){ + deletion = "algorithm"; + }else{ + deletion = "dataset"; + } + let idexs, index; + if (algs){ + idexs = me_idexs; + index = me_index; + }else{ + idexs = med_idexs; + index = med_index; + } + + if(idexs.length == 1){ sp_ANIMATION = false; - launch_danger_modal("Delete error","You can't delete an algorithm if only have one"); + launch_danger_modal("Delete error","You can't delete an "+deletion+" if only have one"); }else{ - let index = me_index; - if(me_index == me_idexs.length-1){ - me_move(false, true); + if(index == idexs.length-1){ + me_move(false, true, algs); }else{ - me_move(true, true); + me_move(true, true, algs); } setTimeout(function(){ - $("div[data-idex=\""+me_idexs[index]+"\"]").remove(); - me_idexs = removeItemOnce(me_idexs, me_idexs[index]); - me_sub_clasifiers_count.splice(index,1); - me_sub_filter_count.splice(index,1); + $("div[data-idex=\""+idexs[index]+"\"]").remove(); + idexs = removeItemOnce(idexs, idexs[index]); + if(algs){ + me_sub_clasifiers_count.splice(index,1); + me_sub_filter_count.splice(index,1); + } + // If remove the last algorithm - if(me_index == me_idexs.length){ - me_index--; + if(index == idexs.length){ + if(algs){ + me_index--; + }else{ + med_index--; + } + } - if(me_idexs.length == 1){ - $("#delete_alg").addClass("disabled"); + if(idexs.length == 1){ + if(algs){ + $("#delete_alg").addClass("disabled"); + }else{ + $("#delete_data").addClass("disabled"); + } + } }, 1000); } @@ -103,21 +190,33 @@ $(document).ready(function(){ * Change the current algorithm displayed. By default move to right. * @param {boolean} right Direction for the movement * @param {boolean} deleted If current index will be removed + * @param {boolean} if algorithms of datasets */ - function me_move(right=true, deleted=false){ - let from = me_idexs[me_index]; - let to; - if (right){ - to = me_idexs[me_index+1]; + function me_move(right=true, deleted=false, algs = true) { + let from, to, from_block, to_block; + if (algs) { + from = me_idexs[me_index]; + if (right) { + to = me_idexs[me_index + 1]; + } else { + to = me_idexs[me_index - 1]; + } + + from_block = $("div[data-idex=\"" + from + "\"]"); + to_block = $("div[data-idex=\"" + to + "\"]"); }else{ - to = me_idexs[me_index-1]; + from = med_idexs[med_index]; + if (right) { + to = med_idexs[med_index + 1]; + } else { + to = med_idexs[med_index - 1]; + } + from_block = $("div[data-iddex=\"" + from + "\"]"); + to_block = $("div[data-iddex=\"" + to + "\"]"); } - - let from_block = $("div[data-idex=\""+from+"\"]"); - let to_block = $("div[data-idex=\""+to+"\"]"); - let anim; - + let animIn, animOut; + if (right){ animIn = "right"; animOut = "left"; @@ -133,17 +232,26 @@ $(document).ready(function(){ from_block.promise().done(function(){ sp_ANIMATION=false; }); - to_block.toggle("slide", {direction: animIn}, "slow"); + to_block.toggle("slide", {direction: animIn}, "slow"); to_block.promise().done(function(){ sp_ANIMATION=false; }); if(!deleted){ - if(right){ - me_index++; + if(algs){ + if(right){ + me_index++; + }else{ + me_index--; + } }else{ - me_index--; + if(right){ + med_index++; + }else{ + med_index--; + } } + } } @@ -158,6 +266,16 @@ $(document).ready(function(){ } }); + $("#delete_data").click(function(){ + if(!sp_ANIMATION){ + sp_ANIMATION=true; + me_delete_alg(false); + if(med_idexs.length == 1){ + $(this).addClass("disabled"); + } + } + }); + $("#before_button").click(function(){ if(!sp_ANIMATION){ sp_ANIMATION=true; @@ -176,6 +294,24 @@ $(document).ready(function(){ } }); + $("#before_d_button").click(function(){ + if(!sp_ANIMATION){ + sp_ANIMATION=true; + if(med_index != 0){ + me_move(false, false, false); + } + if(med_index == 0){ + $(this).addClass("disabled"); + } + if(med_idexs.length > 1){ + $("#delete_data").removeClass("disabled"); + } + if(med_index < med_idexs.length-1){ + $("#after_d_button").children(":first").text("arrow_forward_ios"); + } + } + }); + $("#after_button").click(function(){ if(!sp_ANIMATION){ sp_ANIMATION=true; @@ -198,4 +334,22 @@ $(document).ready(function(){ $("#before_button").removeClass("disabled"); } }); + + $("#after_d_button").click(function(){ + if(!sp_ANIMATION){ + sp_ANIMATION=true; + if(med_index == med_idexs.length-1){ + me_new_alg(false); + $("#delete_data").removeClass("disabled"); + }else{ + me_move(true, false, false); + } + if(med_index < med_idexs.length-1){ + $(this).children(":first").text("arrow_forward_ios"); + }else{ + $(this).children(":first").text("add"); + } + $("#before_d_button").removeClass("disabled"); + } + }); }); \ No newline at end of file diff --git a/ubumlaas/templates/blocks/dataset_maker.html b/ubumlaas/templates/blocks/dataset_maker.html new file mode 100644 index 00000000..6209d604 --- /dev/null +++ b/ubumlaas/templates/blocks/dataset_maker.html @@ -0,0 +1,55 @@ +
+
+
+ {% include "blocks/generic_data_uploaded.html" %} +
+
+
+
+
+ {% include 'blocks/select_dataset.html' %} +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ {% include 'blocks/show_columns.html' %} +
+
+ {% include 'blocks/show_dataset.html' %} +
+
+
+
+
+
+
+
+
+
+ {% include 'blocks/show_columns_reduced.html' %} +
+ +
+
+
+
+
+
+
\ No newline at end of file diff --git a/ubumlaas/templates/blocks/generic_data_uploaded.html b/ubumlaas/templates/blocks/generic_data_uploaded.html new file mode 100644 index 00000000..4ab2e725 --- /dev/null +++ b/ubumlaas/templates/blocks/generic_data_uploaded.html @@ -0,0 +1,28 @@ +
+ + {{ form_d.hidden_tag() }} +
+
+ {{ form_d.dataset(class="custom-file-input dataset_upload") }} + {{ form_d.dataset.label(class="custom-file-label") }} +
+ +
+
+ +
+ +
\ No newline at end of file diff --git a/ubumlaas/templates/blocks/select_dataset.html b/ubumlaas/templates/blocks/select_dataset.html index add4d283..a68d0f95 100644 --- a/ubumlaas/templates/blocks/select_dataset.html +++ b/ubumlaas/templates/blocks/select_dataset.html @@ -3,17 +3,17 @@ {{form_e.data(class="form-control selectpicker", **{"data-live-search": "true"}) }}
You must select an uploaded dataset
\ No newline at end of file + + {% endif %} + \ No newline at end of file diff --git a/ubumlaas/templates/experiment_form.html b/ubumlaas/templates/experiment_form.html index 892ef513..13940b2b 100644 --- a/ubumlaas/templates/experiment_form.html +++ b/ubumlaas/templates/experiment_form.html @@ -16,86 +16,26 @@

Configure experiment

-
-
-
-
- {{ form_d.hidden_tag() }} -
-
- {{ form_d.dataset(class="custom-file-input") }} - {{ form_d.dataset.label(class="custom-file-label",id="datasetLabel") }} -
- -
-
- -
-
-
-
-
-
-
-
- {% include 'blocks/select_dataset.html' %} -
-
-
+
+
+
-
-
-
- -
-
-
-
-
-
- {% include 'blocks/show_columns.html' %} -
-
- {% include 'blocks/show_dataset.html' %} -
-
-
-
-
-
-
-
-
-
- {% include 'blocks/show_columns_reduced.html' %} -
- -
-
-
-
+
+
+
+ {% include "blocks/dataset_maker.html" %} +
+
+ +
@@ -152,6 +92,7 @@

Configure experiment

+
From 9b785bb7d9a2c02f51a207ea5a074d671176edb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Miguel=20Ram=C3=ADrez=20Sanz?= Date: Thu, 3 Sep 2020 17:19:38 +0200 Subject: [PATCH 2/6] Backend multidataset --- ubumlaas/experiments/algorithm/__init__.py | 106 +++++++++++++-------- 1 file changed, 66 insertions(+), 40 deletions(-) diff --git a/ubumlaas/experiments/algorithm/__init__.py b/ubumlaas/experiments/algorithm/__init__.py index f3e5f069..5b30ddd4 100644 --- a/ubumlaas/experiments/algorithm/__init__.py +++ b/ubumlaas/experiments/algorithm/__init__.py @@ -22,6 +22,7 @@ from time import time import json import os +from ubumlaas.util import string_is_array import weka.core.jvm as jvm from ubumlaas.util import get_dataframe_from_file @@ -49,55 +50,80 @@ def task_skeleton(experiment, current_user): # Diference sklearn executor and weka executor # Get algorithm type data = experiment["data"] + data = string_is_array(data) + if not isinstance(data,list): + data = [data] if exp_manager.is_multi: rep = exp[0]["exp_config"]["repetition"] else: rep = exp["exp_config"]["repetition"] - res_global = [] - state_global=[] - for i in range(rep): - if exp_manager.is_multi: - res=[] - state=[] - #Seed for no seed experiments, multi experiments should execute with the same data - rand = random.randint(1,1000000000) - for i in range(len(exp)): - r,s = execute_model(exp[i]["alg"]["lib"],data,exp[i],current_user,rand) - if s == 1: - res.append(json.loads(r)) + res_global_data = [] + state_global_data=[] + for j in range(len(data)): + res_global = [] + state_global=[] + for i in range(rep): + if exp_manager.is_multi: + res=[] + state=[] + #Seed for no seed experiments, multi experiments should execute with the same data + rand = random.randint(1,1000000000) + for i in range(len(exp)): + aux_exp = exp[i] + if len(data)>1: + aux_exp["exp_config"]["target"]=aux_exp["exp_config"]["target"][j] + aux_exp["exp_config"]["columns"]=aux_exp["exp_config"]["columns"][j] + r,s = execute_model(exp[i]["alg"]["lib"],data[i],aux_exp,current_user,rand) + if s == 1: + res.append(json.loads(r)) + else: + res.append(r) + state.append(s) + if 2 in state: + state = 2 else: - res.append(r) - state.append(s) - if 2 in state: - state = 2 + state = 1 + res_global.append(res) else: - state = 1 - res_global.append(res) + aux_exp = exp + if len(data)>1: + aux_exp["exp_config"]["target"]=aux_exp["exp_config"]["target"][j] + aux_exp["exp_config"]["columns"]=aux_exp["exp_config"]["columns"][j] + res,state=execute_model(exp["alg"]["lib"],data[i],aux_exp,current_user) + res_global.append(json.loads(res)) + + state_global.append(state) + if 2 in state_global: + state_global = 2 else: - res,state=execute_model(exp["alg"]["lib"],data,exp,current_user) - res_global.append(json.loads(res)) - - state_global.append(state) - if rep == 1: - res_global = res_global[0] + state_global = 1 + if rep == 1: + res_global = res_global[0] + + res_global_data.append(res_global) + state_global_data.append(state_global) #Calculate result means - res = res_global - if rep>1 and 2 not in state_global: - state=1 - if exp_manager.is_multi: - res_mean = [] - for i in range(len(res[0])): - res_aux = [] - for j in range(len(res)): - res_aux.append(res[j][i]) - r_mean = calc_res_mean(res_aux, rep) - res_mean.append(r_mean) - else: - res_mean=calc_res_mean(res, rep) - - res=res_mean - elif 2 not in state_global: + res = res_global_data + res_data=[] + for k in range(len(data)): + if rep>1 and 2 not in state_global_data: + state=1 + if exp_manager.is_multi: + res_mean = [] + for i in range(len(res[k][0])): + res_aux = [] + for j in range(len(res[k])): + res_aux.append(res[k][j][i]) + r_mean = calc_res_mean(res_aux, rep) + res_mean.append(r_mean) + else: + res_mean=calc_res_mean(res[k], rep) + res_data.append(res_mean) + res=res_data + if len(data)==1: + res = res[0] + elif 2 not in state_global_data: state = 1 else: state = 2 From 7dbdad99ff7784843456aca02a7241f216577e9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Garrido=20Labrador?= Date: Thu, 3 Sep 2020 18:29:42 +0200 Subject: [PATCH 3/6] Multidataset suported but without repetitions. Multialgorithm need to test --- lib/wekafiles/packages/new_package_check.txt | 2 +- .../packages/installedPackageCache.ser | Bin 0 -> 8578 bytes .../packages/randomBalance/ADMIRABLE.jar | Bin 10088 -> 0 bytes .../packages/randomBalance/Description.props | 23 ++++------- ubumlaas/experiments/algorithm/__init__.py | 19 ++++++--- ubumlaas/experiments/views/experiment.py | 5 ++- ubumlaas/static/js/config_dataset.js | 38 +++++++++++------- ubumlaas/static/js/jquery.actual | 1 + ubumlaas/static/js/multiexperiment.js | 29 +++++++------ ubumlaas/static/js/validations.js | 4 +- ubumlaas/templates/blocks/dataset_maker.html | 12 +++++- .../templates/blocks/experiment_form_js.html | 36 ++++++++++++++--- ubumlaas/templates/blocks/show_columns.html | 6 ++- .../blocks/show_columns_reduced.html | 9 ++++- ubumlaas/templates/result.html | 4 +- 15 files changed, 124 insertions(+), 64 deletions(-) create mode 100644 lib/wekafiles/packages/packages/installedPackageCache.ser delete mode 100644 lib/wekafiles/packages/packages/randomBalance/ADMIRABLE.jar create mode 120000 ubumlaas/static/js/jquery.actual diff --git a/lib/wekafiles/packages/new_package_check.txt b/lib/wekafiles/packages/new_package_check.txt index 67c4213c..052f9e82 100644 --- a/lib/wekafiles/packages/new_package_check.txt +++ b/lib/wekafiles/packages/new_package_check.txt @@ -1 +1 @@ -1598950809434 +1599120521779 diff --git a/lib/wekafiles/packages/packages/installedPackageCache.ser b/lib/wekafiles/packages/packages/installedPackageCache.ser new file mode 100644 index 0000000000000000000000000000000000000000..5d43bdceaa36be9647e6fac220a9b407bfe360b8 GIT binary patch literal 8578 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 literal 0 HcmV?d00001 diff --git a/lib/wekafiles/packages/packages/randomBalance/ADMIRABLE.jar b/lib/wekafiles/packages/packages/randomBalance/ADMIRABLE.jar deleted file mode 100644 index f83acb3f37d9d3da87e580380033afa6d9a8c1fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10088 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 diff --git a/lib/wekafiles/packages/packages/randomBalance/Description.props b/lib/wekafiles/packages/packages/randomBalance/Description.props index b2ef8741..a7e303da 100644 --- a/lib/wekafiles/packages/packages/randomBalance/Description.props +++ b/lib/wekafiles/packages/packages/randomBalance/Description.props @@ -5,35 +5,28 @@ PackageName=randomBalance Version=1.0.0 #Date (year-month-day) -Date=2020-08-20 +Date=2019-10-18 # Title (required) -Title=ADMIRABLE Algorithms +Title=Random Balance # Author (required) -Author=Juan José Rodríguez -Author=Jesús Maudes -Author=César García-Osorio +Author=José Francisco Diez Pastor # Maintainer (required) -Maintainer=Adrián Arnaiz-González -Maintainer=José Luis Garrido-Labrador -Maintainer=José Miguel Ramírez-Sanz - +Maintainer=José Francisco Diez Pastor # License (required) -License=GPLv2 +License=Custom # Description (required) -Description=Disturbing Neighbors, Linear Oracle and Spherical Oracle +Description=Proportions of the classes for each ensemble member are chosen randomly.Member training data: sub-sample and over-sample through SMOTE.RB-Boost combines Random Balance with AdaBoost.M2.Experiments with 86 data sets demonstrate the advantage of Random Balance. In Machine Learning, a data set is imbalanced when the class proportions are highly skewed. Imbalanced data sets arise routinely in many application domains and pose a challenge to traditional classifiers. We propose a new approach to building ensembles of classifiers for two-class imbalanced data sets, called Random Balance. Each member of the Random Balance ensemble is trained with data sampled from the training set and augmented by artificial instances obtained using SMOTE. The novelty in the approach is that the proportions of the classes for each ensemble member are chosen randomly. The intuition behind the method is that the proposed diversity heuristic will ensure that the ensemble contains classifiers that are specialized for different operating points on the ROC space, thereby leading to larger AUC compared to other ensembles of classifiers. Experiments have been carried out to test the Random Balance approach by itself, and also in combination with standard ensemble methods. As a result, we propose a new ensemble creation method called RB-Boost which combines Random Balance with AdaBoost.M2. This combination involves enforcing random class proportions in addition to instance re-weighting. Experiments with 86 imbalanced data sets from two well known repositories demonstrate the advantage of the Random Balance approach. # Package URL for obtaining the package archive (required) -PackageURL=http://github.com/admirable-ubu/UBUMLaaS +PackageURL=http://example.com # URL for further information -URL=https://link.springer.com/chapter/10.1007%2F978-3-540-72523-7_45 -URL=https://link.springer.com/chapter/10.1007/978-3-642-03999-7_7 -URL=https://ieeexplore.ieee.org/abstract/document/4118707 +URL=https://dl.acm.org/citation.cfm?id=2824739 # Dependencies (format: packageName (equality/inequality version_number) Depends=weka (>=3.7.10) diff --git a/ubumlaas/experiments/algorithm/__init__.py b/ubumlaas/experiments/algorithm/__init__.py index 56f69bf7..b4a15085 100644 --- a/ubumlaas/experiments/algorithm/__init__.py +++ b/ubumlaas/experiments/algorithm/__init__.py @@ -24,6 +24,8 @@ import os from ubumlaas.util import string_is_array +from copy import deepcopy + import weka.core.jvm as jvm from ubumlaas.util import get_dataframe_from_file from ubumlaas.experiments.execute_algorithm._weka import Execute_weka @@ -62,18 +64,18 @@ def task_skeleton(experiment, current_user): for j in range(len(data)): res_global = [] state_global=[] - for _ in range(rep): + for _i in range(rep): if exp_manager.is_multi: res=[] state=[] #Seed for no seed experiments, multi experiments should execute with the same data rand = random.randint(1,1000000000) for i in range(len(exp)): - aux_exp = exp[i] + aux_exp = deepcopy(exp[i]) if len(data)>1: aux_exp["exp_config"]["target"]=aux_exp["exp_config"]["target"][j] aux_exp["exp_config"]["columns"]=aux_exp["exp_config"]["columns"][j] - r,s = execute_model(exp[i]["alg"]["lib"],data[i],aux_exp,current_user,rand) + r,s = execute_model(exp[i]["alg"]["lib"],data[j],aux_exp,current_user,rand) if s == 1: res.append(json.loads(r)) else: @@ -85,11 +87,12 @@ def task_skeleton(experiment, current_user): state = 1 res_global.append(res) else: - aux_exp = exp + aux_exp = deepcopy(exp) if len(data)>1: aux_exp["exp_config"]["target"]=aux_exp["exp_config"]["target"][j] aux_exp["exp_config"]["columns"]=aux_exp["exp_config"]["columns"][j] - res,state=execute_model(exp["alg"]["lib"],data[i],aux_exp,current_user) + res,state=execute_model(exp["alg"]["lib"],data[j],aux_exp,current_user) + res_global.append(json.loads(res)) state_global.append(state) @@ -119,10 +122,14 @@ def task_skeleton(experiment, current_user): res_mean.append(r_mean) else: res_mean=calc_res_mean(res[k], rep) + else: + res_mean=res res_data.append(res_mean) res=res_data if len(data)==1: res = res[0] + if not exp_manager.is_multi: + res = res[0] elif 2 not in state_global_data: state = 1 else: @@ -151,7 +158,7 @@ def calc_res_mean(res, rep): for i in res[0].keys(): aux=[] for j in range(rep): - aux.append(res[j][i]) + aux.append(res[j][i][0]) if isinstance(res[0][i],list): res_mean[i]= np.array(aux).mean(0).tolist() else: diff --git a/ubumlaas/experiments/views/experiment.py b/ubumlaas/experiments/views/experiment.py index a6ccb2c3..7d2d5c62 100644 --- a/ubumlaas/experiments/views/experiment.py +++ b/ubumlaas/experiments/views/experiment.py @@ -74,12 +74,15 @@ def launch_experiment(): if filter_name is not None: filter_name = "["+filter_name+"]" filter_config = "["+filter_config+"]" + data = request.form.get("data") + if "," in data: + data = "["+data+"]" exp = Experiment(user.id, alg_name, unquote(alg_config), json.dumps(exp_config), filter_name, filter_config, - request.form.get("data"), + data, None, time.time(), None, 0) v.app.logger.info("%d - Create experiment", current_user.id) v.db.session.add(exp) diff --git a/ubumlaas/static/js/config_dataset.js b/ubumlaas/static/js/config_dataset.js index 75b01800..c3234652 100644 --- a/ubumlaas/static/js/config_dataset.js +++ b/ubumlaas/static/js/config_dataset.js @@ -8,6 +8,7 @@ const MULTITARGET = ["MultiClassification"]; */ const UNSUPERVISED = ["Clustering"] + /** * It guarantees only one target if algorithms is not MULTITARGET * And not target allowed in UNSUPERVISED @@ -23,7 +24,7 @@ function only_one_target(target, iddex){ "Algorithms of the type "+typ+" are unsupervised, therefore, they not allow targets"); } else if (!MULTITARGET.includes(typ)){ - let target_candidates = $(".col_target"); + let target_candidates = $(".col_target[id$='"+iddex+"']"); target_candidates.each(function(){ if($(this).attr("id")!=target){ $(this).prop("checked",false); @@ -91,24 +92,31 @@ function get_dataset_config(){ dataset_config.train_partition = parseInt($("#train_slider").val()); break; } - let selected_columns = []; - let columns = $(".column-dataset"); - + + dataset_config.columns = []; dataset_config.target = []; - - for(var i=0; i
").addClass("maker").attr("data-idex", 0); @@ -122,6 +124,7 @@ $(document).ready(function(){ me_sub_filter_count.push(0); }else{ med_idexs.push(nidex); + dataset_columns.push([]); } me_move(true, false, algs); @@ -149,7 +152,7 @@ $(document).ready(function(){ } if(idexs.length == 1){ - sp_ANIMATION = false; + //sp_ANIMATION = false; launch_danger_modal("Delete error","You can't delete an "+deletion+" if only have one"); }else{ if(index == idexs.length-1){ @@ -163,6 +166,8 @@ $(document).ready(function(){ if(algs){ me_sub_clasifiers_count.splice(index,1); me_sub_filter_count.splice(index,1); + }else{ + dataset_columns = removeItemOnce(dataset_columns, dataset_columns[index]); } // If remove the last algorithm @@ -230,11 +235,11 @@ $(document).ready(function(){ from_block.toggle("slide", {direction: animOut}, "slow"); from_block.promise().done(function(){ - sp_ANIMATION=false; + //sp_ANIMATION=false; }); to_block.toggle("slide", {direction: animIn}, "slow"); to_block.promise().done(function(){ - sp_ANIMATION=false; + //sp_ANIMATION=false; }); if(!deleted){ @@ -258,7 +263,7 @@ $(document).ready(function(){ $("#delete_alg").click(function(){ if(!sp_ANIMATION){ - sp_ANIMATION=true; + //sp_ANIMATION=true; me_delete_alg(); if(me_idexs.length == 1){ $(this).addClass("disabled"); @@ -268,7 +273,7 @@ $(document).ready(function(){ $("#delete_data").click(function(){ if(!sp_ANIMATION){ - sp_ANIMATION=true; + //sp_ANIMATION=true; me_delete_alg(false); if(med_idexs.length == 1){ $(this).addClass("disabled"); @@ -278,7 +283,7 @@ $(document).ready(function(){ $("#before_button").click(function(){ if(!sp_ANIMATION){ - sp_ANIMATION=true; + //sp_ANIMATION=true; if(me_index != 0){ me_move(false); } @@ -296,7 +301,7 @@ $(document).ready(function(){ $("#before_d_button").click(function(){ if(!sp_ANIMATION){ - sp_ANIMATION=true; + //sp_ANIMATION=true; if(med_index != 0){ me_move(false, false, false); } @@ -314,14 +319,14 @@ $(document).ready(function(){ $("#after_button").click(function(){ if(!sp_ANIMATION){ - sp_ANIMATION=true; + //sp_ANIMATION=true; if(me_index == me_idexs.length-1){ if($("#alg_typ").val()!=""){ me_new_alg(); $("#delete_alg").removeClass("disabled"); }else{ launch_warning_modal("Add a new algorithm is not allowed","Select a algorithm type before add a new algorithm"); - sp_ANIMATION=false; + //sp_ANIMATION=false; } }else{ me_move(); @@ -337,7 +342,7 @@ $(document).ready(function(){ $("#after_d_button").click(function(){ if(!sp_ANIMATION){ - sp_ANIMATION=true; + //sp_ANIMATION=true; if(med_index == med_idexs.length-1){ me_new_alg(false); $("#delete_data").removeClass("disabled"); diff --git a/ubumlaas/static/js/validations.js b/ubumlaas/static/js/validations.js index 6360b7de..ae86337a 100644 --- a/ubumlaas/static/js/validations.js +++ b/ubumlaas/static/js/validations.js @@ -5,7 +5,7 @@ $("document").ready(function(){ function load_verify_elements(){ //Blocks - select_dataset = $("#data"); + select_dataset = $("#data_0"); train_slider = $("#train_slider"); alg_typ = $("#alg_typ"); alg_name = $("#alg_name_0"); @@ -31,7 +31,7 @@ function verify_all(element=null){ let validate = []; let show = []; let hide = []; - select_dataset = $("#data"); //Is necesary reload it + select_dataset = $("#data_0"); //Is necesary reload it let elements = [select_dataset, train_slider, alg_typ, alg_name]; let elements_feedback = [select_dataset_feedback, train_slider_feedback, alg_typ_feedback, alg_name_feedback]; for(let i=0; iNormal
  • - Reduced + Reduced
  • @@ -52,4 +52,12 @@
    -
    \ No newline at end of file +
    + + \ No newline at end of file diff --git a/ubumlaas/templates/blocks/experiment_form_js.html b/ubumlaas/templates/blocks/experiment_form_js.html index 960ba996..7fa07661 100644 --- a/ubumlaas/templates/blocks/experiment_form_js.html +++ b/ubumlaas/templates/blocks/experiment_form_js.html @@ -4,6 +4,9 @@ + \ No newline at end of file diff --git a/ubumlaas/templates/blocks/show_columns_reduced.html b/ubumlaas/templates/blocks/show_columns_reduced.html index 35d37566..38b6d828 100644 --- a/ubumlaas/templates/blocks/show_columns_reduced.html +++ b/ubumlaas/templates/blocks/show_columns_reduced.html @@ -21,9 +21,14 @@ diff --git a/ubumlaas/templates/result.html b/ubumlaas/templates/result.html index c4011e97..a58bec23 100644 --- a/ubumlaas/templates/result.html +++ b/ubumlaas/templates/result.html @@ -551,7 +551,7 @@

    Finished

    let result_val = result[i][z]; switch(i){ case "ROC": - let label = "AUC="+(1-result["AUC"][z]); + let label = "AUC="+(result["AUC"][z]); var canvas = $("", {id:i+"_canvas", width: "100%"}); var ctx = canvas.get(0).getContext('2d'); @@ -619,7 +619,7 @@

    Finished

    div.append(canvas); break; case "AUC": - result_val = 1-result_val; + result_val = result_val; default: let k = $("

    ", {class: "col-md-5 font-weight-bold"}); let v = $("

    ", {class: "col-md-7"}); From 53b4935d4dadd94e0820ba7747b07512982f3eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Garrido=20Labrador?= Date: Fri, 4 Sep 2020 11:06:22 +0200 Subject: [PATCH 4/6] Multidatasets actually works --- lib/wekafiles/packages/new_package_check.txt | 2 +- .../packages/installedPackageCache.ser | Bin 8578 -> 7057 bytes .../packages/randomBalance/ADMIRABLE.jar | Bin 0 -> 10088 bytes .../packages/randomBalance/Description.props | 23 +- test/test_selenium.py | 270 +++++++++--------- ubumlaas/experiments/algorithm/__init__.py | 42 +-- ubumlaas/util.py | 5 +- 7 files changed, 179 insertions(+), 163 deletions(-) create mode 100644 lib/wekafiles/packages/packages/randomBalance/ADMIRABLE.jar diff --git a/lib/wekafiles/packages/new_package_check.txt b/lib/wekafiles/packages/new_package_check.txt index 052f9e82..b290bd57 100644 --- a/lib/wekafiles/packages/new_package_check.txt +++ b/lib/wekafiles/packages/new_package_check.txt @@ -1 +1 @@ -1599120521779 +1599209053791 diff --git a/lib/wekafiles/packages/packages/installedPackageCache.ser b/lib/wekafiles/packages/packages/installedPackageCache.ser index 5d43bdceaa36be9647e6fac220a9b407bfe360b8..ef4f4ddca16e48c4b9966aa242172ed5a7e5f45e 100644 GIT binary patch delta 341 zcmXYs%}T>S6op6pX?5+w<+uqpTnIG;zZni91e%?JdU2b?=M?@(hGz}qaslx^cqBxMpEfB8j1qAqBF(g3@9(w zbXlgLM9j1Qu=;Ks-?UQ1vd>r|Ff~y-mO10=Tqqu8;F!p;)o?WpIbR~#^9`m_Avqm= zJ$=4vyFTG6w*1DOnU+dOI*1ebN7cCLJ{RUf1m+X@nw%Lfg^Z v$vnLCY!X0O{WMQn>`Lldmrg}uAfpSO*TxDq&XN}!I=Ic1w(#NY&yRiqWh-~R delta 1848 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 literal 0 HcmV?d00001 diff --git a/lib/wekafiles/packages/packages/randomBalance/Description.props b/lib/wekafiles/packages/packages/randomBalance/Description.props index a7e303da..b2ef8741 100644 --- a/lib/wekafiles/packages/packages/randomBalance/Description.props +++ b/lib/wekafiles/packages/packages/randomBalance/Description.props @@ -5,28 +5,35 @@ PackageName=randomBalance Version=1.0.0 #Date (year-month-day) -Date=2019-10-18 +Date=2020-08-20 # Title (required) -Title=Random Balance +Title=ADMIRABLE Algorithms # Author (required) -Author=José Francisco Diez Pastor +Author=Juan José Rodríguez +Author=Jesús Maudes +Author=César García-Osorio # Maintainer (required) -Maintainer=José Francisco Diez Pastor +Maintainer=Adrián Arnaiz-González +Maintainer=José Luis Garrido-Labrador +Maintainer=José Miguel Ramírez-Sanz + # License (required) -License=Custom +License=GPLv2 # Description (required) -Description=Proportions of the classes for each ensemble member are chosen randomly.Member training data: sub-sample and over-sample through SMOTE.RB-Boost combines Random Balance with AdaBoost.M2.Experiments with 86 data sets demonstrate the advantage of Random Balance. In Machine Learning, a data set is imbalanced when the class proportions are highly skewed. Imbalanced data sets arise routinely in many application domains and pose a challenge to traditional classifiers. We propose a new approach to building ensembles of classifiers for two-class imbalanced data sets, called Random Balance. Each member of the Random Balance ensemble is trained with data sampled from the training set and augmented by artificial instances obtained using SMOTE. The novelty in the approach is that the proportions of the classes for each ensemble member are chosen randomly. The intuition behind the method is that the proposed diversity heuristic will ensure that the ensemble contains classifiers that are specialized for different operating points on the ROC space, thereby leading to larger AUC compared to other ensembles of classifiers. Experiments have been carried out to test the Random Balance approach by itself, and also in combination with standard ensemble methods. As a result, we propose a new ensemble creation method called RB-Boost which combines Random Balance with AdaBoost.M2. This combination involves enforcing random class proportions in addition to instance re-weighting. Experiments with 86 imbalanced data sets from two well known repositories demonstrate the advantage of the Random Balance approach. +Description=Disturbing Neighbors, Linear Oracle and Spherical Oracle # Package URL for obtaining the package archive (required) -PackageURL=http://example.com +PackageURL=http://github.com/admirable-ubu/UBUMLaaS # URL for further information -URL=https://dl.acm.org/citation.cfm?id=2824739 +URL=https://link.springer.com/chapter/10.1007%2F978-3-540-72523-7_45 +URL=https://link.springer.com/chapter/10.1007/978-3-642-03999-7_7 +URL=https://ieeexplore.ieee.org/abstract/document/4118707 # Dependencies (format: packageName (equality/inequality version_number) Depends=weka (>=3.7.10) diff --git a/test/test_selenium.py b/test/test_selenium.py index 5e754bde..5fbbc541 100644 --- a/test/test_selenium.py +++ b/test/test_selenium.py @@ -109,22 +109,22 @@ def test_31DatasetLoad(self): self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() assert self.driver.find_element(By.CSS_SELECTOR, ".jumbotron > .text-center").text == "Configure experiment" - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - assert self.driver.find_element(By.CSS_SELECTOR, "th:nth-child(3)").text == "Cl.thickness" - self.driver.execute_script("$('#data').val('iris.csv');") - self.driver.execute_script("$('#data').change();") + assert self.driver.find_element(By.CSS_SELECTOR, "#dataset_parameters_0 > div > table > thead > tr > th:nth-child(3)").text == "Cl.thickness" + self.driver.execute_script("$('#data_0').val('iris.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - assert self.driver.find_element(By.CSS_SELECTOR, "th:nth-child(2)").text == "sepal length (cm)" - self.driver.execute_script("$('#data').val('music.csv');") - self.driver.execute_script("$('#data').change();") + assert self.driver.find_element(By.CSS_SELECTOR, "#dataset_parameters_0 > div > table > thead > tr > th:nth-child(2)").text == "sepal length (cm)" + self.driver.execute_script("$('#data_0').val('music.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - assert self.driver.find_element(By.CSS_SELECTOR, "th:nth-child(2)").text == "amazed-suprised" - self.driver.execute_script("$('#data').val('weatherHistory.csv');") - self.driver.execute_script("$('#data').change();") + assert self.driver.find_element(By.CSS_SELECTOR, "#dataset_parameters_0 > div > table > thead > tr > th:nth-child(2)").text == "amazed-suprised" + self.driver.execute_script("$('#data_0').val('weatherHistory.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - assert self.driver.find_element(By.CSS_SELECTOR, "th:nth-child(2)").text == "Temperature (C)" + assert self.driver.find_element(By.CSS_SELECTOR, "#dataset_parameters_0 > div > table > thead > tr > th:nth-child(2)").text == "Temperature (C)" self.logout() def test_321DatasetUseNormal(self): @@ -140,13 +140,13 @@ def test_321DatasetUseNormal(self): """ self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.execute_script("$('#col0_use_label').click();") - self.driver.find_element(By.ID, "reduced_tab_link").click() - WebDriverWait(self.driver, 30000).until(expected_conditions.visibility_of_element_located((By.ID, "0_opt"))) - element = self.driver.find_element(By.ID, "0_opt") + self.driver.execute_script("$('#col0_use_label_0').click();") + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + WebDriverWait(self.driver, 30000).until(expected_conditions.visibility_of_element_located((By.ID, "0_opt_0"))) + element = self.driver.find_element(By.ID, "0_opt_0") assert "list-group-item-secondary" in element.get_attribute('class').split(" ") self.logout() @@ -165,14 +165,14 @@ def test_322DatasetUseReduced(self): """ self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.find_element(By.ID, "reduced_tab_link").click() - self.driver.execute_script('$("#sel option[value=\'Id\']").prop("selected",true)') - self.driver.execute_script('$("#nuse").click()') + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + self.driver.execute_script('$("#sel_0 option[value=\'Id\']").prop("selected",true)') + self.driver.execute_script('$("#nuse_0").click()') self.driver.find_element(By.ID, "normal_tab_link").click() - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col0_use:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col0_use_0:checked") assert len(elements) == 0 self.logout() @@ -190,13 +190,13 @@ def test_331DatasetNotUseNormal(self): """ self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.execute_script("$('#col0_use_label').click();") - self.driver.execute_script("$('#col0_use_label').click();") - self.driver.find_element(By.ID, "reduced_tab_link").click() - element = self.driver.find_element(By.ID, "0_opt") + self.driver.execute_script("$('#col0_use_label_0').click();") + self.driver.execute_script("$('#col0_use_label_0').click();") + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + element = self.driver.find_element(By.ID, "0_opt_0") assert "list-group-item-primary" in element.get_attribute('class').split(" ") self.logout() @@ -215,16 +215,16 @@ def test_332DatasetNotUseReduced(self): """ self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.find_element(By.ID, "reduced_tab_link").click() - self.driver.execute_script('$("#sel option[value=\'Id\']").prop("selected",true)') - self.driver.execute_script('$("#nuse").click()') - self.driver.execute_script('$("#sel option[value=\'Id\']").prop("selected",true)') - self.driver.execute_script('$("#use").click()') - self.driver.find_element(By.ID, "normal_tab_link").click() - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col0_use:checked") + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + self.driver.execute_script('$("#sel_0 option[value=\'Id\']").prop("selected",true)') + self.driver.execute_script('$("#nuse_0").click()') + self.driver.execute_script('$("#sel_0 option[value=\'Id\']").prop("selected",true)') + self.driver.execute_script('$("#use_0").click()') + self.driver.find_element(By.ID, "normal_tab_link_0").click() + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col0_use_0:checked") assert len(elements) > 0 self.logout() @@ -243,16 +243,16 @@ def test_341DatasetNoTargetNormal(self): """ self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.execute_script("$('#col10_target_label').click();") - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use:checked") + self.driver.execute_script("$('#col10_target_label_0').click();") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use_0:checked") assert len(elements) == 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_target:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_target_0:checked") assert len(elements) == 0 - self.driver.find_element(By.ID, "reduced_tab_link").click() - element = self.driver.find_element(By.ID, "10_opt") + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + element = self.driver.find_element(By.ID, "10_opt_0") assert "list-group-item-secondary" in element.get_attribute('class').split(" ") self.logout() @@ -272,16 +272,16 @@ def test_342DatasetNoTargetReduced(self): """ self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.find_element(By.ID, "reduced_tab_link").click() - self.driver.execute_script('$("#sel option[value=\'Class\']").prop("selected",true)') - self.driver.execute_script('$("#nuse").click()') - element = self.driver.find_element(By.ID, "10_opt") + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + self.driver.execute_script('$("#sel_0 option[value=\'Class\']").prop("selected",true)') + self.driver.execute_script('$("#nuse_0").click()') + element = self.driver.find_element(By.ID, "10_opt_0") assert "list-group-item-secondary" in element.get_attribute('class').split(" ") - self.driver.find_element(By.ID, "normal_tab_link").click() - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use:checked") + self.driver.find_element(By.ID, "normal_tab_link_0").click() + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use_0:checked") assert len(elements) == 0 self.logout() @@ -300,16 +300,16 @@ def test_351DatasetNoTargetUseNormal(self): """ self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.execute_script("$('#col10_use_label').click();") - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use:checked") + self.driver.execute_script("$('#col10_use_label_0').click();") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use_0:checked") assert len(elements) > 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_target:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_target_0:checked") assert len(elements) == 0 - self.driver.find_element(By.ID, "reduced_tab_link").click() - element = self.driver.find_element(By.ID, "10_opt") + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + element = self.driver.find_element(By.ID, "10_opt_0") assert "list-group-item-primary" in element.get_attribute('class').split(" ") self.logout() @@ -328,18 +328,18 @@ def test_352DatasetNoTargetUseReduced(self): """ self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.find_element(By.ID, "reduced_tab_link").click() - self.driver.execute_script('$("#sel option[value=\'Class\']").prop("selected",true)') - self.driver.execute_script('$("#use").click()') - element = self.driver.find_element(By.ID, "10_opt") + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + self.driver.execute_script('$("#sel_0 option[value=\'Class\']").prop("selected",true)') + self.driver.execute_script('$("#use_0").click()') + element = self.driver.find_element(By.ID, "10_opt_0") assert "list-group-item-primary" in element.get_attribute('class').split(" ") - self.driver.find_element(By.ID, "normal_tab_link").click() - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use:checked") + self.driver.find_element(By.ID, "normal_tab_link_0").click() + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use_0:checked") assert len(elements) > 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_target:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_target_0:checked") assert len(elements) == 0 self.logout() @@ -358,22 +358,22 @@ def test_361DatasetChangeTargetNormal(self): """ self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.execute_script("$('#col9_target_label').click();") - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use:checked") + self.driver.execute_script("$('#col9_target_label_0').click();") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use_0:checked") assert len(elements) == 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_target:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_target_0:checked") assert len(elements) == 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col9_use:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col9_use_0:checked") assert len(elements) == 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col9_target:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col9_target_0:checked") assert len(elements) > 0 - self.driver.find_element(By.ID, "reduced_tab_link").click() - element = self.driver.find_element(By.ID, "10_opt") + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + element = self.driver.find_element(By.ID, "10_opt_0") assert "list-group-item-secondary" in element.get_attribute('class').split(" ") - element = self.driver.find_element(By.ID, "9_opt") + element = self.driver.find_element(By.ID, "9_opt_0") assert "list-group-item-success" in element.get_attribute('class').split(" ") self.logout() @@ -393,24 +393,24 @@ def test_362DatasetChangeTargetReduced(self): """ self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.find_element(By.ID, "reduced_tab_link").click() - self.driver.execute_script("$('#sel option[value=\"Mitoses\"]').prop('selected',true);") - self.driver.execute_script("$('#target').click();") - element = self.driver.find_element(By.ID, "10_opt") + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + self.driver.execute_script("$('#sel_0 option[value=\"Mitoses\"]').prop('selected',true);") + self.driver.execute_script("$('#target_0').click();") + element = self.driver.find_element(By.ID, "10_opt_0") assert "list-group-item-secondary" in element.get_attribute('class').split(" ") - element = self.driver.find_element(By.ID, "9_opt") + element = self.driver.find_element(By.ID, "9_opt_0") assert "list-group-item-success" in element.get_attribute('class').split(" ") - self.driver.find_element(By.ID, "normal_tab_link").click() - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use:checked") + self.driver.find_element(By.ID, "normal_tab_link_0").click() + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_use_0:checked") assert len(elements) == 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_target:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col10_target_0:checked") assert len(elements) == 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col9_use:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col9_use_0:checked") assert len(elements) == 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col9_target:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col9_target_0:checked") assert len(elements) > 0 self.logout() @@ -428,15 +428,15 @@ def test_37DatasetNoMultiLabelTarget(self): """ self.login("ubumlaas@gmail.com") self.driver.find_element(By.LINK_TEXT, "New Experiment").click() - self.driver.execute_script("$('#data').val('breastCancer.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('breastCancer.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.find_element(By.ID, "reduced_tab_link").click() - self.driver.execute_script("$('#sel option[value=\"Cell.shape\"]').prop('selected',true);") - self.driver.execute_script("$('#sel option[value=\"Marg.adhesion\"]').prop('selected',true);") - self.driver.execute_script("$('#sel option[value=\"Epith.c.size\"]').prop('selected',true);") - self.driver.execute_script("$('#sel option[value=\"Bare.nuclei\"]').prop('selected',true);") - self.driver.execute_script('$("#target").click()') + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + self.driver.execute_script("$('#sel_0 option[value=\"Cell.shape\"]').prop('selected',true);") + self.driver.execute_script("$('#sel_0 option[value=\"Marg.adhesion\"]').prop('selected',true);") + self.driver.execute_script("$('#sel_0 option[value=\"Epith.c.size\"]').prop('selected',true);") + self.driver.execute_script("$('#sel_0 option[value=\"Bare.nuclei\"]').prop('selected',true);") + self.driver.execute_script('$("#target_0").click()') time.sleep(self.wait*2) assert self.driver.find_element(By.CSS_SELECTOR, "#alert_modal_body > p:nth-child(1)").text == "You can't select more than 1 target in no multilabel algorithms." time.sleep(self.wait) @@ -462,25 +462,25 @@ def test_381DatasetMultiLabelTargetNormal(self): self.driver.find_element(By.LINK_TEXT, "New Experiment").click() self.driver.execute_script("$('#alg_typ').val(\"MultiClassification\")") self.driver.execute_script("$('#alg_typ').change();") - self.driver.execute_script("$('#data').val('music.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('music.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) elm = list(range(6)) for e in elm: - self.driver.execute_script("$('#col"+str(e)+"_target_label').click();") - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_use:checked") + self.driver.execute_script("$('#col"+str(e)+"_target_label_0').click();") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_use_0:checked") assert len(elements) == 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_target:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_target_0:checked") assert len(elements) > 0 - self.driver.execute_script("$('#col76_use_label').click();") + self.driver.execute_script("$('#col76_use_label_0').click();") - self.driver.find_element(By.ID, "reduced_tab_link").click() + self.driver.find_element(By.ID, "reduced_tab_link_0").click() - element = self.driver.find_element(By.ID, "76_opt") + element = self.driver.find_element(By.ID, "76_opt_0") assert "list-group-item-primary" in element.get_attribute("class").split(" ") for e in elm: - element = self.driver.find_element(By.ID, str(e)+"_opt") + element = self.driver.find_element(By.ID, str(e)+"_opt_0") assert "list-group-item-success" in element.get_attribute("class").split(" ") self.logout() @@ -504,27 +504,27 @@ def test_382DatasetMultiLabelTargetReduced(self): self.driver.execute_script("$('#alg_typ').val(\"MultiClassification\")") self.driver.execute_script("$('#alg_typ').change();") - self.driver.execute_script("$('#data').val('music.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('music.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.find_element(By.ID, "reduced_tab_link").click() - self.driver.execute_script("$('#sel option[value=\"BHSUM3\"]').prop('selected', true);") - self.driver.execute_script("$('#use').click();") + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + self.driver.execute_script("$('#sel_0 option[value=\"BHSUM3\"]').prop('selected', true);") + self.driver.execute_script("$('#use_0').click();") - assert "list-group-item-primary" in self.driver.find_element(By.ID, "76_opt").get_attribute("class").split(" ") + assert "list-group-item-primary" in self.driver.find_element(By.ID, "76_opt_0").get_attribute("class").split(" ") elm = ['amazed-suprised', 'happy-pleased', 'relaxing-clam', 'quiet-still', 'sad-lonely', 'angry-aggresive'] for e in elm: - self.driver.execute_script("$('#sel option[value=\""+e+"\"]').prop('selected', true);") - self.driver.execute_script("$('#target').click();") + self.driver.execute_script("$('#sel_0 option[value=\""+e+"\"]').prop('selected', true);") + self.driver.execute_script("$('#target_0').click();") for e in range(6): - assert "list-group-item-success" in self.driver.find_element(By.ID, str(e)+"_opt").get_attribute("class").split(" ") + assert "list-group-item-success" in self.driver.find_element(By.ID, str(e)+"_opt_0").get_attribute("class").split(" ") - self.driver.find_element(By.ID, "normal_tab_link").click() + self.driver.find_element(By.ID, "normal_tab_link_0").click() for e in range(6): - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_use:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_use_0:checked") assert len(elements) == 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_target:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_target_0:checked") assert len(elements) > 0 self.logout() @@ -550,35 +550,35 @@ def test_39DatasetFromMultiLabelToMonoLabel(self): self.driver.execute_script("$('#alg_typ').val(\"MultiClassification\")") self.driver.execute_script("$('#alg_typ').change();") - self.driver.execute_script("$('#data').val('music.csv');") - self.driver.execute_script("$('#data').change();") + self.driver.execute_script("$('#data_0').val('music.csv');") + self.driver.execute_script("$('#data_0').change();") time.sleep(self.wait) - self.driver.find_element(By.ID, "reduced_tab_link").click() - self.driver.execute_script("$('#sel option[value=\"BHSUM3\"]').prop('selected', true);") - self.driver.execute_script("$('#use').click();") + self.driver.find_element(By.ID, "reduced_tab_link_0").click() + self.driver.execute_script("$('#sel_0 option[value=\"BHSUM3\"]').prop('selected', true);") + self.driver.execute_script("$('#use_0').click();") elm = ['amazed-suprised', 'happy-pleased', 'relaxing-clam', 'quiet-still', 'sad-lonely', 'angry-aggresive'] for e in elm: - self.driver.execute_script("$('#sel option[value=\""+e+"\"]').prop('selected', true);") - self.driver.execute_script("$('#target').click();") + self.driver.execute_script("$('#sel_0 option[value=\""+e+"\"]').prop('selected', true);") + self.driver.execute_script("$('#target_0').click();") self.driver.execute_script("$('#alg_typ').val(\"Classification\")") self.driver.execute_script("$('#alg_typ').change();") time.sleep(self.wait) - assert "list-group-item-success" in self.driver.find_element(By.ID, "76_opt").get_attribute("class").split(" ") + assert "list-group-item-success" in self.driver.find_element(By.ID, "76_opt_0").get_attribute("class").split(" ") for e in range(6): - assert "list-group-item-primary" in self.driver.find_element(By.ID, str(e)+"_opt").get_attribute("class").split(" ") + assert "list-group-item-primary" in self.driver.find_element(By.ID, str(e)+"_opt_0").get_attribute("class").split(" ") - self.driver.find_element(By.ID, "normal_tab_link").click() + self.driver.find_element(By.ID, "normal_tab_link_0").click() for e in range(6): - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_use:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_use_0:checked") assert len(elements) > 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_target:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col"+str(e)+"_target_0:checked") assert len(elements) == 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col76_use:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col76_use_0:checked") assert len(elements) == 0 - elements = self.driver.find_elements(By.CSS_SELECTOR, "#col76_target:checked") + elements = self.driver.find_elements(By.CSS_SELECTOR, "#col76_target_0:checked") assert len(elements) > 0 self.logout() diff --git a/ubumlaas/experiments/algorithm/__init__.py b/ubumlaas/experiments/algorithm/__init__.py index b4a15085..b56a5a69 100644 --- a/ubumlaas/experiments/algorithm/__init__.py +++ b/ubumlaas/experiments/algorithm/__init__.py @@ -91,9 +91,11 @@ def task_skeleton(experiment, current_user): if len(data)>1: aux_exp["exp_config"]["target"]=aux_exp["exp_config"]["target"][j] aux_exp["exp_config"]["columns"]=aux_exp["exp_config"]["columns"][j] - res,state=execute_model(exp["alg"]["lib"],data[j],aux_exp,current_user) - - res_global.append(json.loads(res)) + res,state=execute_model(exp["alg"]["lib"],data[j],aux_exp,current_user) + if state == 1: + res_global.append(json.loads(res)) + else: + res_global.append(res) state_global.append(state) if 2 in state_global: @@ -110,6 +112,7 @@ def task_skeleton(experiment, current_user): res = res_global_data res_data=[] for k in range(len(data)): + print(data[k]) if rep>1 and 2 not in state_global_data: state=1 if exp_manager.is_multi: @@ -128,8 +131,6 @@ def task_skeleton(experiment, current_user): res=res_data if len(data)==1: res = res[0] - if not exp_manager.is_multi: - res = res[0] elif 2 not in state_global_data: state = 1 else: @@ -154,18 +155,20 @@ def calc_res_mean(res, rep): Returns: dict: Results mean """ + print(res) res_mean={} for i in res[0].keys(): - aux=[] - for j in range(rep): - aux.append(res[j][i][0]) - if isinstance(res[0][i],list): - res_mean[i]= np.array(aux).mean(0).tolist() - else: - res_mean[i]=np.array(aux).mean().tolist() + if i != "ROC": # ROC array incorrect over mean, represent points in space, not value. Use AUC to know the mean. + aux=[] + for j in range(rep): + aux.append(res[j][i][0]) + if isinstance(res[0][i],list): + res_mean[i]= np.array(aux).mean(0).tolist() + else: + res_mean[i]=np.array(aux).mean().tolist() return res_mean -def execute_model(alg_lib,data, exp, current_user,seed_multi=None): +def execute_model(alg_lib, data, exp, current_user,seed_multi=None): type_app = alg_lib execution_lib = None try: @@ -194,7 +197,13 @@ def execute_model(alg_lib,data, exp, current_user,seed_multi=None): y_score_list = [] y_test_list = [] X_test_list = [] - if exp_config.get("mode") == "split" and exp_config["train_partition"] < 100: + + if execution_lib.algorithm_type == "Clustering": + y_pred, y_score = execution_lib.predict(model, X) + y_pred_list.append(y_pred) + y_score_list.append(y_score) + + elif exp_config.get("mode") == "split" and exp_config["train_partition"] < 100: X_train, X_test, y_train, y_test = execution_lib\ .generate_train_test_split(X, y, exp_config["train_partition"],random_state=seed_multi) model = execution_lib.create_model() @@ -218,10 +227,7 @@ def execute_model(alg_lib,data, exp, current_user,seed_multi=None): y_test_list.append(y_test) X_test_list.append(X_test) - elif execution_lib.algorithm_type == "Clustering": - y_pred, y_score = execution_lib.predict(model, X) - y_pred_list.append(y_pred) - y_score_list.append(y_score) + score = {} if exp_config["mode"] == "cross" or exp_config["train_partition"] < 100 or execution_lib.algorithm_type == "Clustering": diff --git a/ubumlaas/util.py b/ubumlaas/util.py index 417addfc..ebf81926 100644 --- a/ubumlaas/util.py +++ b/ubumlaas/util.py @@ -144,7 +144,10 @@ def value_to_bool(y_test, y_pred): [pandas,pandas] -- test output boolean, model output boolean """ un = y_test.unique() - d = {un[0]: True, un[1]: False} + try: + d = {un[0]: True, un[1]: False} + except: + d = {un[0]: True} return y_test.map(d), pd.Series(y_pred).map(d) From ab64d167bc057eb166149ea9ab3abaaff1e2e6f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Garrido=20Labrador?= Date: Fri, 4 Sep 2020 11:21:08 +0200 Subject: [PATCH 5/6] Test selenium repaired --- test/test_selenium.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_selenium.py b/test/test_selenium.py index 5fbbc541..bcfd02f3 100644 --- a/test/test_selenium.py +++ b/test/test_selenium.py @@ -171,7 +171,7 @@ def test_322DatasetUseReduced(self): self.driver.find_element(By.ID, "reduced_tab_link_0").click() self.driver.execute_script('$("#sel_0 option[value=\'Id\']").prop("selected",true)') self.driver.execute_script('$("#nuse_0").click()') - self.driver.find_element(By.ID, "normal_tab_link").click() + self.driver.find_element(By.ID, "normal_tab_link_0").click() elements = self.driver.find_elements(By.CSS_SELECTOR, "#col0_use_0:checked") assert len(elements) == 0 self.logout() From 50383b13879130a091e7f8e8b241f246b17136d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Garrido=20Labrador?= Date: Fri, 4 Sep 2020 16:18:17 +0200 Subject: [PATCH 6/6] Repaired listed results after mean calculation --- ubumlaas/experiments/algorithm/__init__.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ubumlaas/experiments/algorithm/__init__.py b/ubumlaas/experiments/algorithm/__init__.py index b56a5a69..688a754e 100644 --- a/ubumlaas/experiments/algorithm/__init__.py +++ b/ubumlaas/experiments/algorithm/__init__.py @@ -55,10 +55,13 @@ def task_skeleton(experiment, current_user): data = string_is_array(data) if not isinstance(data,list): data = [data] + v.app.logger.debug("%d - %d - Data list know is a list - %s", current_user['id'], experiment['id'], data) + # From here data will be a list if exp_manager.is_multi: rep = exp[0]["exp_config"]["repetition"] else: rep = exp["exp_config"]["repetition"] + v.app.logger.debug("%d - %d - Repetitions: %d", current_user['id'], experiment['id'], rep) res_global_data = [] state_global_data=[] for j in range(len(data)): @@ -112,7 +115,6 @@ def task_skeleton(experiment, current_user): res = res_global_data res_data=[] for k in range(len(data)): - print(data[k]) if rep>1 and 2 not in state_global_data: state=1 if exp_manager.is_multi: @@ -126,7 +128,7 @@ def task_skeleton(experiment, current_user): else: res_mean=calc_res_mean(res[k], rep) else: - res_mean=res + res_mean=res[k] res_data.append(res_mean) res=res_data if len(data)==1: @@ -165,7 +167,8 @@ def calc_res_mean(res, rep): if isinstance(res[0][i],list): res_mean[i]= np.array(aux).mean(0).tolist() else: - res_mean[i]=np.array(aux).mean().tolist() + res_mean[i] = np.array(aux).mean().tolist() + res_mean[i] = [res_mean[i]] return res_mean def execute_model(alg_lib, data, exp, current_user,seed_multi=None):