diff --git a/__pycache__/run.cpython-37.pyc b/__pycache__/run.cpython-37.pyc index af482ba..2e50a1d 100644 Binary files a/__pycache__/run.cpython-37.pyc and b/__pycache__/run.cpython-37.pyc differ diff --git a/frontend/src/components/Ensemble.vue b/frontend/src/components/Ensemble.vue index 830989b..1012603 100644 --- a/frontend/src/components/Ensemble.vue +++ b/frontend/src/components/Ensemble.vue @@ -287,25 +287,25 @@ export default { var allModels = JSON.parse(this.ScatterPlotResults[0]) OverviewPlotly.on('plotly_selected', function (evt) { if (typeof evt !== 'undefined') { - var pushModelsRemainingTemp = [] - const ClassifierIDsList = [] + var pushModelsRemainingTempCM = [] + const ClassifierIDsListCM = [] for (let i = 0; evt.points.length; i++) { if (evt.points[i] === undefined) { break } else { const OnlyId = evt.points[i].text.split(' ')[2] const OnlyIdCleared = OnlyId.split('
') - ClassifierIDsList.push(OnlyIdCleared[0]) + ClassifierIDsListCM.push(OnlyIdCleared[0]) } } for (let i = 0; i < allModels.length; i++) { - if (ClassifierIDsList.indexOf((allModels[i])) < 0) { - pushModelsRemainingTemp.push(allModels[i]) + if (ClassifierIDsListCM.indexOf((allModels[i])) < 0) { + pushModelsRemainingTempCM.push(allModels[i]) } } - EventBus.$emit('RemainingPointsCM', pushModelsRemainingTemp) - EventBus.$emit('SendSelectedPointsUpdateIndicatorCM', ClassifierIDsList) - EventBus.$emit('SendSelectedPointsToServerEventCM', ClassifierIDsList) + EventBus.$emit('RemainingPointsCM', pushModelsRemainingTempCM) + EventBus.$emit('SendSelectedPointsUpdateIndicatorCM', ClassifierIDsListCM) + EventBus.$emit('SendSelectedPointsToServerEventCM', ClassifierIDsListCM) } }) }, diff --git a/frontend/src/components/Main.vue b/frontend/src/components/Main.vue index 1bce59b..70c9018 100755 --- a/frontend/src/components/Main.vue +++ b/frontend/src/components/Main.vue @@ -144,7 +144,7 @@ - Hyper-Parameters Predictions + Hyper-Parameters' Predictions @@ -155,7 +155,7 @@ - Majority-Voting Ensemble Predictions + Majority-Voting Ensemble's Predictions @@ -217,8 +217,10 @@ export default Vue.extend({ data () { return { storeEnsemble: [], + PredictSelEnsem: [], firstTimeExec: true, unselectedRemainingPoints: [], + unselectedRemainingPointsEnsem: [], Collection: 0, OverviewResults: 0, preDataResults: '', @@ -321,6 +323,8 @@ export default Vue.extend({ EventBus.$emit('emittedEventCallingGridSelection', this.OverviewResults) this.firstTimeExec = false } else { + this.PredictSelEnsem = [] + EventBus.$emit('SendSelectedPointsToServerEventCM', this.PredictSelEnsem) EventBus.$emit('emittedEventCallingCrossoverMutation', this.OverviewResults) EventBus.$emit('emittedEventCallingGridCrossoverMutation', this.OverviewResults) EventBus.$emit('emittedEventCallingGridSelectionCrossoverMutation', this.OverviewResults) @@ -346,6 +350,8 @@ export default Vue.extend({ .then(response => { this.OverviewResultsCM = response.data.OverviewResultsCM console.log('Server successfully sent all the data related to visualizations!') + this.PredictSel = [] + EventBus.$emit('SendSelectedPointsToServerEvent', this.PredictSel) EventBus.$emit('emittedEventCallingScatterPlot', this.OverviewResultsCM) EventBus.$emit('emittedEventCallingGrid', this.OverviewResultsCM) EventBus.$emit('emittedEventCallingGridSelection', this.OverviewResultsCM) @@ -423,8 +429,52 @@ export default Vue.extend({ console.log(error) }) }, + SendSelectedIDsEnsemble () { + const path = `http://127.0.0.1:5000/data/SendtoSeverSelIDsEnsem` + const postData = { + predictSelectionIDsCM: this.ClassifierIDsListCM + } + const axiosConfig = { + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token', + 'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS' + } + } + axios.post(path, postData, axiosConfig) + .then(response => { + console.log('Sent the selected IDs to compute predictions!') + this.retrievePredictionsSelEnsemble() + }) + .catch(error => { + console.log(error) + }) + }, + retrievePredictionsSelEnsemble () { + const path = `http://localhost:5000/data/RetrievePredictionsEnsem` + + const axiosConfig = { + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token', + 'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS' + } + } + axios.get(path, axiosConfig) + .then(response => { + this.PredictSelEnsem = response.data.PredictSelEnsem + console.log('Server successfully sent the predictions!') + EventBus.$emit('SendSelectedPointsToServerEventCM', this.PredictSelEnsem) + }) + .catch(error => { + console.log(error) + }) + }, SelectedPointsCM () { this.OverSelLengthCM = this.ClassifierIDsListCM.length + this.SendSelectedIDsEnsemble() }, SendSelectedPointsToServer () { if (this.ClassifierIDsList === ''){ @@ -818,9 +868,12 @@ export default Vue.extend({ const path = `http://127.0.0.1:5000/data/CrossoverMutation` EventBus.$emit('SendStoredEnsemble', this.storeEnsemble) + + var mergedStoreEnsembleLoc = [].concat.apply([], this.storeEnsemble) const postData = { - RemainingPoints: this.unselectedRemainingPoints + RemainingPoints: this.unselectedRemainingPoints, + StoreEnsemble: mergedStoreEnsembleLoc } const axiosConfig = { headers: { @@ -885,6 +938,8 @@ export default Vue.extend({ EventBus.$on('RemainingPoints', data => { this.unselectedRemainingPoints = data }) EventBus.$on('InitializeCrossoverMutation', this.sendPointsCrossMutat) + EventBus.$on('RemainingPointsCM', data => { this.unselectedRemainingPointsEnsem = data }) + EventBus.$on('ChangeKey', data => { this.keyNow = data }) EventBus.$on('SendSelectedPointsUpdateIndicator', data => { this.ClassifierIDsList = data; this.storeEnsemble.push(this.ClassifierIDsList)}) EventBus.$on('SendSelectedPointsUpdateIndicator', this.SelectedPoints) diff --git a/frontend/src/components/Predictions.vue b/frontend/src/components/Predictions.vue index 885297b..97d0d13 100644 --- a/frontend/src/components/Predictions.vue +++ b/frontend/src/components/Predictions.vue @@ -61,8 +61,6 @@ export default { var KNNPred = predictions[0] var LRPred = predictions[1] var PredAver = predictions[2] - console.log(PredAver) - var dataAver = [] var dataAverGetResults = [] var dataKNN = [] @@ -125,7 +123,7 @@ export default { } var classStore = [].concat.apply([], classArray); - console.log(classStore) + // === Set up canvas === // var width = 1200, diff --git a/run.py b/run.py index b139c2c..1763c20 100644 --- a/run.py +++ b/run.py @@ -76,6 +76,9 @@ def reset(): global yData yData = [] + global EnsembleActive + EnsembleActive = [] + global addKNN addKNN = 0 @@ -205,6 +208,9 @@ def retrieveFileName(): global detailsParams detailsParams = [] + + global EnsembleActive + EnsembleActive = [] global addKNN addKNN = 0 @@ -652,6 +658,53 @@ def PreprocessingPred(): return [predictionsKNN, predictionsLR, predictions] +def PreprocessingPredEnsemble(): + + global EnsembleActive + + numberIDKNN = [] + numberIDLR = [] + for el in EnsembleActive: + match = re.match(r"([a-z]+)([0-9]+)", el, re.I) + if match: + items = match.groups() + if (items[0] == 'KNN'): + numberIDKNN.append(int(items[1])) + else: + numberIDLR.append(int(items[1])) + + dicKNN = allParametersPerformancePerModel[3] + dicLR = allParametersPerformancePerModel[7] + + dfKNN = pd.DataFrame.from_dict(dicKNN) + dfLR = pd.DataFrame.from_dict(dicLR) + df_concatProbs = pd.concat([dfKNN, dfLR]) + df_concatProbs = df_concatProbs.reset_index(drop=True) + + dfKNN = df_concatProbs.loc[numberIDKNN] + dfLR = df_concatProbs.loc[numberIDLR] + + df_concatProbs = pd.DataFrame() + df_concatProbs = df_concatProbs.iloc[0:0] + df_concatProbs = pd.concat([dfKNN, dfLR]) + + predictionsKNN = [] + for column, content in dfKNN.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictionsKNN.append(el) + + predictionsLR = [] + for column, content in dfLR.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictionsLR.append(el) + + predictions = [] + for column, content in df_concatProbs.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictions.append(el) + + return [predictionsKNN, predictionsLR, predictions] + def PreprocessingParam(): dicKNN = allParametersPerformancePerModel[1] dicLR = allParametersPerformancePerModel[5] @@ -765,6 +818,7 @@ def InitializeEnsemble(): global ModelSpaceMDS global ModelSpaceTSNE global allParametersPerformancePerModel + global EnsembleActive XModels = XModels.fillna(0) @@ -773,7 +827,10 @@ def InitializeEnsemble(): ModelSpaceTSNE = ModelSpaceTSNE.tolist() ModelSpaceUMAP = FunUMAP(XModels) - PredictionProbSel = PreprocessingPred() + if (len(EnsembleActive) == 0): + PredictionProbSel = PreprocessingPred() + else: + PredictionProbSel = PreprocessingPredEnsemble() returnResults(ModelSpaceMDS,ModelSpaceTSNE,ModelSpaceUMAP,PredictionProbSel) @@ -820,6 +877,13 @@ def CrossoverMutateFun(): RemainingIds = RemainingIds['RemainingPoints'] + global EnsembleActive + + EnsembleActive = request.get_data().decode('utf8').replace("'", '"') + EnsembleActive = json.loads(EnsembleActive) + + EnsembleActive = EnsembleActive['StoreEnsemble'] + global XData global yData global LRModelsCount @@ -1377,28 +1441,25 @@ def PreprocessingPredSel(SelectedIDs): numberIDKNN = [] numberIDLR = [] - print(SelectedIDs) for el in SelectedIDs: match = re.match(r"([a-z]+)([0-9]+)", el, re.I) if match: items = match.groups() if (items[0] == 'KNN'): - numberIDKNN.append(int(items[1]) - addKNN) + numberIDKNN.append(int(items[1]) -addKNN) else: numberIDLR.append(int(items[1]) - addLR) - print(numberIDKNN) + dicKNN = allParametersPerformancePerModel[3] dicLR = allParametersPerformancePerModel[7] dfKNN = pd.DataFrame.from_dict(dicKNN) - print(dfKNN) + dfKNN = dfKNN.loc[numberIDKNN] dfLR = pd.DataFrame.from_dict(dicLR) dfLR = dfLR.loc[numberIDLR] - print(dfLR) dfLR.index += addKNN df_concatProbs = pd.concat([dfKNN, dfLR]) - print(df_concatProbs) predictionsKNN = [] for column, content in dfKNN.items(): @@ -1436,4 +1497,71 @@ def SendPredictSel(): response = { 'PredictSel': ResultsSelPred } + return jsonify(response) + +def PreprocessingPredSelEnsem(SelectedIDsEnsem): + + numberIDKNN = [] + numberIDLR = [] + for el in SelectedIDsEnsem: + match = re.match(r"([a-z]+)([0-9]+)", el, re.I) + if match: + items = match.groups() + if (items[0] == 'KNN'): + numberIDKNN.append(int(items[1])) + else: + numberIDLR.append(int(items[1])) + + dicKNN = allParametersPerformancePerModel[3] + dicLR = allParametersPerformancePerModel[7] + + dfKNN = pd.DataFrame.from_dict(dicKNN) + dfLR = pd.DataFrame.from_dict(dicLR) + df_concatProbs = pd.concat([dfKNN, dfLR]) + df_concatProbs = df_concatProbs.reset_index(drop=True) + + dfKNN = df_concatProbs.loc[numberIDKNN] + + dfLR = df_concatProbs.loc[numberIDLR] + + df_concatProbs = pd.DataFrame() + df_concatProbs = df_concatProbs.iloc[0:0] + df_concatProbs = pd.concat([dfKNN, dfLR]) + + predictionsKNN = [] + for column, content in dfKNN.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictionsKNN.append(el) + + predictionsLR = [] + for column, content in dfLR.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictionsLR.append(el) + + predictions = [] + for column, content in df_concatProbs.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictions.append(el) + + return [predictionsKNN, predictionsLR, predictions] + +@cross_origin(origin='localhost',headers=['Content-Type','Authorization']) +@app.route('/data/SendtoSeverSelIDsEnsem', methods=["GET", "POST"]) +def RetrieveSelIDsPredictEnsem(): + global ResultsSelPredEnsem + ResultsSelPredEnsem = [] + RetrieveIDsSelectionEnsem = request.get_data().decode('utf8').replace("'", '"') + RetrieveIDsSelectionEnsem = json.loads(RetrieveIDsSelectionEnsem) + RetrieveIDsSelectionEnsem = RetrieveIDsSelectionEnsem['predictSelectionIDsCM'] + + ResultsSelPredEnsem = PreprocessingPredSelEnsem(RetrieveIDsSelectionEnsem) + + return 'Everything Okay' + +@app.route('/data/RetrievePredictionsEnsem', methods=["GET", "POST"]) +def SendPredictSelEnsem(): + global ResultsSelPredEnsem + response = { + 'PredictSelEnsem': ResultsSelPredEnsem + } return jsonify(response) \ No newline at end of file