diff options
-rw-r--r-- | backend/api/api/appsettings.json | 18 | ||||
-rw-r--r-- | frontend/src/app/_data/Dataset.ts | 1 | ||||
-rw-r--r-- | frontend/src/app/_data/Experiment.ts | 14 | ||||
-rw-r--r-- | frontend/src/app/_data/FolderFile.ts | 1 | ||||
-rw-r--r-- | frontend/src/app/_data/Model.ts | 7 | ||||
-rw-r--r-- | frontend/src/app/_elements/column-table/column-table.component.ts | 21 | ||||
-rw-r--r-- | frontend/src/app/_elements/folder/folder.component.ts | 117 | ||||
-rw-r--r-- | frontend/src/app/app.component.html | 2 | ||||
-rw-r--r-- | frontend/src/styles/helper.css | 3 |
9 files changed, 92 insertions, 92 deletions
diff --git a/backend/api/api/appsettings.json b/backend/api/api/appsettings.json index 56d1861c..ec8f7dd8 100644 --- a/backend/api/api/appsettings.json +++ b/backend/api/api/appsettings.json @@ -24,14 +24,14 @@ "PredictorCollectionName": "Predictor", "FilesCollectionName": "Files", "ExperimentCollectionName": "Experiment" - /* - "ConnectionString": "mongodb+srv://si_user:si_user@sidatabase.twtfm.mongodb.net/myFirstDatabase?retryWrites=true&w=majority", - "DatabaseName": "si_db", - "CollectionName": "users", - "DatasetCollectionName": "Dataset", - "ModelCollectionName": "Model", - "PredictorCollectionName": "Predictor", - "FilesCollectionName": "Files", - "ExperimentCollectionName": "Experiment" */ + + /*"ConnectionString": "mongodb+srv://si_user:si_user@sidatabase.twtfm.mongodb.net/myFirstDatabase?retryWrites=true&w=majority", + "DatabaseName": "si_db", + "CollectionName": "users", + "DatasetCollectionName": "Dataset", + "ModelCollectionName": "Model", + "PredictorCollectionName": "Predictor", + "FilesCollectionName": "Files", + "ExperimentCollectionName": "Experiment" */ } }
\ No newline at end of file diff --git a/frontend/src/app/_data/Dataset.ts b/frontend/src/app/_data/Dataset.ts index 87b09c6f..a962fe6b 100644 --- a/frontend/src/app/_data/Dataset.ts +++ b/frontend/src/app/_data/Dataset.ts @@ -1,7 +1,6 @@ import { FolderFile } from "./FolderFile"; export default class Dataset extends FolderFile { - _id: string = ''; constructor( name: string = 'Novi izvor podataka', public description: string = '', diff --git a/frontend/src/app/_data/Experiment.ts b/frontend/src/app/_data/Experiment.ts index cff77535..c140e100 100644 --- a/frontend/src/app/_data/Experiment.ts +++ b/frontend/src/app/_data/Experiment.ts @@ -1,9 +1,9 @@ +import { FolderFile } from "./FolderFile"; import { ProblemType } from "./Model"; -export default class Experiment { - _id: string = ''; +export default class Experiment extends FolderFile { uploaderId: string = ''; constructor( - public name: string = 'Novi eksperiment', + name: string = 'Novi eksperiment', public description: string = '', public type: ProblemType = ProblemType.Regression, public datasetId: string = '', @@ -11,12 +11,14 @@ export default class Experiment { public outputColumn: string = '', public nullValues: NullValueOptions = NullValueOptions.DeleteRows, public nullValuesReplacers: NullValReplacer[] = [], - public dateCreated: Date = new Date(), - public lastUpdated: Date = new Date(), + dateCreated: Date = new Date(), + lastUpdated: Date = new Date(), public modelIds: string[] = [], public columnTypes: ColumnType[] = [], public encodings: ColumnEncoding[] = []//[{columnName: "", columnEncoding: Encoding.Label}] - ) { } + ) { + super(name, dateCreated, lastUpdated) + } _columnsSelected: boolean = false; } diff --git a/frontend/src/app/_data/FolderFile.ts b/frontend/src/app/_data/FolderFile.ts index c228f25e..4d1844fd 100644 --- a/frontend/src/app/_data/FolderFile.ts +++ b/frontend/src/app/_data/FolderFile.ts @@ -1,4 +1,5 @@ export class FolderFile { + public _id: string = ""; constructor( public name: string, public dateCreated: Date, diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts index d1e89e84..cc25c91b 100644 --- a/frontend/src/app/_data/Model.ts +++ b/frontend/src/app/_data/Model.ts @@ -2,7 +2,6 @@ import { NgIf } from "@angular/common"; import { FolderFile } from "./FolderFile"; export default class Model extends FolderFile { - _id: string = ''; constructor( name: string = 'Novi model', public description: string = '', @@ -132,10 +131,10 @@ export enum LossFunction { MeanSquaredLogarithmicError = 'mean_squared_logarithmic_error', HuberLoss = 'Huber' } -export const LossFunctionRegression =[LossFunction.MeanAbsoluteError,LossFunction.MeanSquaredError,LossFunction.MeanSquaredLogarithmicError] -export const LossFunctionBinaryClassification=[LossFunction.BinaryCrossEntropy,LossFunction.SquaredHingeLoss,LossFunction.HingeLoss] +export const LossFunctionRegression = [LossFunction.MeanAbsoluteError, LossFunction.MeanSquaredError, LossFunction.MeanSquaredLogarithmicError] +export const LossFunctionBinaryClassification = [LossFunction.BinaryCrossEntropy, LossFunction.SquaredHingeLoss, LossFunction.HingeLoss] -export const LossFunctionMultiClassification=[LossFunction.CategoricalCrossEntropy,LossFunction.SparseCategoricalCrossEntropy,LossFunction.KLDivergence] +export const LossFunctionMultiClassification = [LossFunction.CategoricalCrossEntropy, LossFunction.SparseCategoricalCrossEntropy, LossFunction.KLDivergence] export enum Optimizer { Adam = 'Adam', diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts index d61c2537..217eda30 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -60,17 +60,16 @@ export class ColumnTableComponent implements AfterViewInit { }); } - updatePieChart(){ + updatePieChart() { //min: number, max: number, q1: number, q3: number, median: number - let i=0; + let i = 0; const pieChart = this.piechartComp.toArray(); - this.dataset?.columnInfo.forEach(colInfo => - { if (this.experiment.columnTypes[i] == ColumnType.categorical) - { - pieChart[i].updatePieChart(colInfo!.uniqueValues, colInfo.uniqueValuesPercent); - i++; - } - }); + this.dataset?.columnInfo.forEach(colInfo => { + if (this.experiment.columnTypes[i] == ColumnType.categorical) { + pieChart[i].updatePieChart(colInfo!.uniqueValues, colInfo.uniqueValuesPercent); + i++; + } + }); } loadDataset(dataset: Dataset) { @@ -213,7 +212,7 @@ export class ColumnTableComponent implements AfterViewInit { if (this.experiment != undefined && this.dataset != undefined) { for (let i = 0; i < this.dataset.columnInfo.length; i++) { if (this.experiment.columnTypes[i] == ColumnType.categorical && this.dataset.columnInfo[i].columnName != this.experiment.outputColumn) //promeni - this.experiment.encodings[i].encoding = encodingType; + this.experiment.encodings[i].encoding = encodingType; } this.columnTableChangeDetected(); } @@ -380,10 +379,8 @@ export class ColumnTableComponent implements AfterViewInit { hoverOverTab(index: number) { if (index < 0) { this.hoveringOverTab = null; - this.tabToDisplay = this.selectedTab.value; } else { this.hoveringOverTab = this.tabs[index]; - this.tabToDisplay = this.tabs[index].value; } } diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index e60f041e..dbbc55e7 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -11,6 +11,8 @@ import { ExperimentsService } from 'src/app/_services/experiments.service'; import { PredictorsService } from 'src/app/_services/predictors.service'; import { SignalRService } from 'src/app/_services/signal-r.service'; import { FormModelComponent } from '../form-model/form-model.component'; +import { Router } from '@angular/router'; +import Predictor from 'src/app/_data/Predictor'; @Component({ selector: 'app-folder', @@ -44,7 +46,7 @@ export class FolderComponent implements AfterViewInit { searchTerm: string = ''; - constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService, private signalRService: SignalRService) { + constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService, private signalRService: SignalRService, private router: Router) { this.tabsToShow.forEach(tab => this.folders[tab] = []); } @@ -91,20 +93,23 @@ export class FolderComponent implements AfterViewInit { this.newFileSelected = true; this.listView = false; this.displayFile(); - if(this.type == FolderType.Dataset) + if (this.type == FolderType.Dataset) this.formDataset.clear(); } selectFile(file?: FolderFile) { this.selectedFile = file; this.fileToDisplay = file; + if (this.type == FolderType.Experiment && file) { + this.router.navigate(['/experiment'/*, file._id*/]) + } this.newFileSelected = false; this.listView = false; this.selectedFileChanged.emit(this.selectedFile); this.selectTab(TabType.File); this.displayFile(); - if(this.type == FolderType.Dataset) + if (this.type == FolderType.Dataset) this.formDataset.loadExisting(); } @@ -122,7 +127,7 @@ export class FolderComponent implements AfterViewInit { _initialized: boolean = false; - refreshFiles(selectedDatasetId: string | null) { + refreshFiles(selectedDatasetId: string | null = null, selectedModelId: string | null = null) { this.files = [] this.filteredFiles.length = 0; this.folders[TabType.NewFile] = []; @@ -131,33 +136,45 @@ export class FolderComponent implements AfterViewInit { this.folders[tab] = []; }); - this.datasetsService.getMyDatasets().subscribe((datasets) => { - this.folders[TabType.MyDatasets] = datasets; - if (selectedDatasetId) { - this.selectFile(datasets.filter(x => x._id == selectedDatasetId)[0]); - } - }); - - this.experimentsService.getMyExperiments().subscribe((experiments) => { - this.folders[TabType.MyExperiments] = experiments; - }); - - this.datasetsService.getPublicDatasets().subscribe((datasets) => { - this.folders[TabType.PublicDatasets] = datasets; - }); - - this.modelsService.getMyModels().subscribe((models) => { - this.folders[TabType.MyModels] = models; - }); + switch (this.type) { + case FolderType.Dataset: + this.datasetsService.getMyDatasets().subscribe((datasets) => { + this.folders[TabType.MyDatasets] = datasets; + if (selectedDatasetId) { + this.selectFile(datasets.filter(x => x._id == selectedDatasetId)[0]); + } + }); + this.datasetsService.getPublicDatasets().subscribe((datasets) => { + this.folders[TabType.PublicDatasets] = datasets; + }); + break; - /*this.modelsService.getMyModels().subscribe((models) => { - this.folders[TabType.PublicModels] = models; - });*/ - this.folders[TabType.PublicModels] = []; + case FolderType.Model: + this.modelsService.getMyModels().subscribe((models) => { + this.folders[TabType.MyModels] = models; + if (selectedModelId) { + this.selectFile(models.filter(x => x._id == selectedModelId)[0]); + } + }); + /*this.modelsService.getMyModels().subscribe((models) => { + this.folders[TabType.PublicModels] = models; + });*/ + this.folders[TabType.PublicModels] = []; + break; - this.experimentsService.getMyExperiments().subscribe((experiments) => { - this.folders[TabType.MyExperiments] = experiments; - }); + case FolderType.Experiment: + this.experimentsService.getMyExperiments().subscribe((experiments) => { + this.folders[TabType.MyExperiments] = experiments; + }); + this.predictorsService.getMyPredictors().subscribe((predictors) => { + this.predictors = predictors; + console.log(predictors); + }); + break; + default: + console.error("Bad folder type."); + break; + } if (!this._initialized) { this.files = this.folders[this.startingTab]; @@ -169,13 +186,15 @@ export class FolderComponent implements AfterViewInit { this.searchTermsChanged(); } + predictors: Predictor[] = []; + saveNewFile() { switch (this.type) { case FolderType.Dataset: this.formDataset!.uploadDataset((dataset: Dataset) => { this.newFile = undefined; Shared.openDialog("Obaveštenje", "Uspešno ste dodali novi izvor podataka u kolekciju. Molimo sačekajte par trenutaka da se procesira."); - this.refreshFiles(null); + this.refreshFiles(); }, () => { Shared.openDialog("Neuspeo pokušaj!", "Izvor podataka sa unetim nazivom već postoji u Vašoj kolekciji. Izmenite naziv ili iskoristite postojeći dataset."); @@ -185,7 +204,7 @@ export class FolderComponent implements AfterViewInit { this.modelsService.addModel(this.formModel.newModel).subscribe(model => { this.newFile = undefined; Shared.openDialog("Obaveštenje", "Uspešno ste dodali novu konfiguraciju neuronske mreže u kolekciju."); - this.refreshFiles(null); // todo select model + this.refreshFiles(null, model._id); // todo select model }, (err) => { Shared.openDialog("Neuspeo pokušaj!", "Konfiguracija neuronske mreže sa unetim nazivom već postoji u Vašoj kolekciji. Izmenite naziv ili iskoristite postojeću konfiguraciju."); }); @@ -193,20 +212,6 @@ export class FolderComponent implements AfterViewInit { } } - - /*calcZIndex(i: number) { - let zIndex = (this.files.length - i - 1) - if (this.selectedFileIndex == i) - zIndex = this.files.length + 2; - if (this.hoveringOverFileIndex == i) - zIndex = this.files.length + 3; - return zIndex; - } - - newFileZIndex() { - return (this.files.length + 1); - }*/ - clearSearchTerm() { this.searchTerm = ''; this.searchTermsChanged(); @@ -232,10 +237,6 @@ export class FolderComponent implements AfterViewInit { listView: boolean = true; - toggleListView() { - this.listView = !this.listView; - } - deleteFile(file: FolderFile, event: Event) { event.stopPropagation(); //console.log('delete'); @@ -349,16 +350,16 @@ export class FolderComponent implements AfterViewInit { } hoverOverTab(tab: TabType) { - this.listView = this.getListView(tab); - this.privacy = this.getPrivacy(tab); + // this.listView = this.getListView(tab); + // this.privacy = this.getPrivacy(tab); this.hoverTab = tab; - if (tab == TabType.None) { - this.listView = this.getListView(this.selectedTab); - this.files = this.folders[this.selectedTab]; - } else { - this.files = this.folders[tab]; - } - this.searchTermsChanged(); + // if (tab == TabType.None) { + // this.listView = this.getListView(this.selectedTab); + // this.files = this.folders[this.selectedTab]; + // } else { + // this.files = this.folders[tab]; + // } + // this.searchTermsChanged(); } updateExperiment() { diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html index d15793e7..fb0b0223 100644 --- a/frontend/src/app/app.component.html +++ b/frontend/src/app/app.component.html @@ -7,7 +7,7 @@ </app-reactive-background> <app-navbar></app-navbar> <a class="bg-controls" style="z-index: 1000;" routerLink="playground"> - <mat-icon color="accent">settings_suggest</mat-icon> + <mat-icon color="primary">settings_suggest</mat-icon> </a> <router-outlet></router-outlet> <app-notifications></app-notifications>
\ No newline at end of file diff --git a/frontend/src/styles/helper.css b/frontend/src/styles/helper.css index 1c172058..971a2ed6 100644 --- a/frontend/src/styles/helper.css +++ b/frontend/src/styles/helper.css @@ -17,7 +17,8 @@ .bg-controls { position: fixed; bottom: 10px; - right: 10px; + left: 50%; + right: 50%; } .center-horizontal { |