From 4383fdfc00af6a6d912e76af9fd450c498a758a7 Mon Sep 17 00:00:00 2001 From: Angelos Chatzimparmpas Date: Tue, 28 Jul 2020 14:07:39 +0200 Subject: [PATCH] fixed first views --- __pycache__/run.cpython-37.pyc | Bin 29504 -> 32511 bytes frontend/src/components/Ensemble.vue | 16 +-- frontend/src/components/Main.vue | 61 +++++++++- frontend/src/components/Predictions.vue | 4 +- run.py | 142 ++++++++++++++++++++++-- 5 files changed, 202 insertions(+), 21 deletions(-) diff --git a/__pycache__/run.cpython-37.pyc b/__pycache__/run.cpython-37.pyc index af482ba8bfbf15dcd8dc9ea89698f7937ae3ca86..2e50a1db3200283b9f8957191b7fe645729039fa 100644 GIT binary patch literal 32511 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 delta 11803 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 J') - 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