From db8cfdd644511f47bf473d8f9efd6f6cebc65519 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Tue, 17 May 2022 22:16:31 +0200 Subject: Zabranjeno korisniku da prelazi na sledece korake ukoliko ne ispuni prethodni. --- frontend/src/app/_pages/experiment/experiment.component.ts | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'frontend/src/app/_pages/experiment/experiment.component.ts') diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index abf4b697..ee9cca8c 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.ts +++ b/frontend/src/app/_pages/experiment/experiment.component.ts @@ -32,6 +32,12 @@ export class ExperimentComponent implements AfterViewInit { @ViewChild("folderModel") folderModel!: FolderComponent; @ViewChild("metricView") metricView!: MetricViewComponent; + step1:boolean=false; + //step2:boolean=false; + step3:boolean=false; + step4:boolean=false; + + constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService, private signalRService: SignalRService) { this.experiment = new Experiment("exp1"); } @@ -49,6 +55,7 @@ export class ExperimentComponent implements AfterViewInit { Shared.openDialog('Greška', 'Morate odabrati konfiguraciju neuronske mreže'); } else { this.modelsService.trainModel(this.modelToTrain._id, this.experiment._id).subscribe(() => { console.log("pocelo treniranje") }); + this.step4=true; } } @@ -157,6 +164,7 @@ export class ExperimentComponent implements AfterViewInit { this.dataset = d; this.columnTable.loadDataset(this.dataset); + this.step1=true; } @@ -165,5 +173,6 @@ export class ExperimentComponent implements AfterViewInit { setModel(model: FolderFile) { const m = model; this.modelToTrain = m; + this.step3=true; } } -- cgit v1.2.3 From 9233e6f193f68a0477e2900ac7a82928ab7f4adc Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Wed, 18 May 2022 13:52:29 +0200 Subject: Ispravljen bag: kad se izmeni dataset, refreshuje se 2. korak na eksperiment strani. Dodata ruta kako bi se eksperiment iz kolekcije otvorio na eksperiment strani. Sredjivanje otvaranja - pocetak --- .../api/api/Controllers/ExperimentController.cs | 2 +- .../column-table/column-table.component.html | 4 +- .../column-table/column-table.component.ts | 3 +- .../src/app/_elements/folder/folder.component.html | 6 +-- .../src/app/_elements/folder/folder.component.ts | 8 +++- .../app/_pages/experiment/experiment.component.ts | 44 +++++++++++++++++++--- frontend/src/app/_services/datasets.service.ts | 3 ++ frontend/src/app/_services/experiments.service.ts | 4 ++ frontend/src/app/app-routing.module.ts | 2 +- 9 files changed, 61 insertions(+), 15 deletions(-) (limited to 'frontend/src/app/_pages/experiment/experiment.component.ts') diff --git a/backend/api/api/Controllers/ExperimentController.cs b/backend/api/api/Controllers/ExperimentController.cs index 08354615..b599ca4e 100644 --- a/backend/api/api/Controllers/ExperimentController.cs +++ b/backend/api/api/Controllers/ExperimentController.cs @@ -61,7 +61,7 @@ namespace api.Controllers return Ok(experiment); } - [HttpGet("get")] + [HttpGet("get/{id}")] [Authorize(Roles = "User,Guest")] public async Task> Get(string id) { diff --git a/frontend/src/app/_elements/column-table/column-table.component.html b/frontend/src/app/_elements/column-table/column-table.component.html index 3256ffee..8af56c43 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.html +++ b/frontend/src/app/_elements/column-table/column-table.component.html @@ -45,10 +45,10 @@
- +
{{(this.begin/10)+1}}
- +
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 a3469d90..7c2f8cef 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -41,14 +41,12 @@ export class ColumnTableComponent implements AfterViewInit { columnsChecked: boolean[] = []; //niz svih kolona loaded: boolean = false; - begin:number=0; step:number=10; constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog) { - //ovo mi nece trebati jer primam dataset iz druge komponente } resetPagging(){ this.begin=0; @@ -98,6 +96,7 @@ export class ColumnTableComponent implements AfterViewInit { this.dataset = dataset; this.setColumnTypeInitial(); + this.columnsChecked = []; this.dataset.columnInfo.forEach(column => { this.columnsChecked.push(true); }); diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html index db4f28f0..84946697 100644 --- a/frontend/src/app/_elements/folder/folder.component.html +++ b/frontend/src/app/_elements/folder/folder.component.html @@ -78,12 +78,12 @@
+
- +
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index d26ac999..4e2209a0 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -105,7 +105,7 @@ export class FolderComponent implements AfterViewInit { this.selectedFile = file; this.fileToDisplay = file; if (this.type == FolderType.Experiment && file) { - this.router.navigate(['/experiment'/*, file._id*/]) + this.router.navigate(['/experiment/', file._id]); } this.newFileSelected = false; this.listView = false; @@ -116,6 +116,12 @@ export class FolderComponent implements AfterViewInit { if (this.type == FolderType.Dataset) this.formDataset.loadExisting(); } + /* + goToExperimentPage(file: FolderFile) { + console.log(file); + //this.router.navigate(['/experiment/', this.experiment._id]); + } + */ createNewFile() { if (this.type == FolderType.Dataset) { diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index abf4b697..62ef9257 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.ts +++ b/frontend/src/app/_pages/experiment/experiment.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, ViewChild, ViewChildren, Input } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, ViewChild, ViewChildren, Input, OnInit } from '@angular/core'; import { StepperSelectionEvent } from '@angular/cdk/stepper'; import { MatStepper } from '@angular/material/stepper'; import Shared from 'src/app/Shared'; @@ -12,13 +12,15 @@ import Dataset from 'src/app/_data/Dataset'; import { ColumnTableComponent } from 'src/app/_elements/column-table/column-table.component'; import { SignalRService } from 'src/app/_services/signal-r.service'; import { MetricViewComponent } from 'src/app/_elements/metric-view/metric-view.component'; +import { ActivatedRoute, Router } from '@angular/router'; +import { DatasetsService } from 'src/app/_services/datasets.service'; @Component({ selector: 'app-experiment', templateUrl: './experiment.component.html', styleUrls: ['./experiment.component.css'] }) -export class ExperimentComponent implements AfterViewInit { +export class ExperimentComponent implements AfterViewInit, OnInit { @ViewChild(MatStepper) stepper!: MatStepper; @ViewChild('stepsContainer') stepsContainer!: ElementRef; @@ -32,9 +34,36 @@ export class ExperimentComponent implements AfterViewInit { @ViewChild("folderModel") folderModel!: FolderComponent; @ViewChild("metricView") metricView!: MetricViewComponent; - constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService, private signalRService: SignalRService) { + constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService, private datasetsService: DatasetsService, private signalRService: SignalRService, private route: ActivatedRoute) { this.experiment = new Experiment("exp1"); } + ngOnInit(): void { + this.route.queryParams.subscribe(params => { + let experimentId = this.route.snapshot.paramMap.get("id"); + console.log("EXPID u exp.comp:", experimentId); + if (experimentId == null) + return; + + this.experimentsService.getExperimentById(experimentId).subscribe((response) => { + this.experiment = response; + console.log(this.experiment); //OTKUD MI NAME + this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { + this.dataset = response; + console.log("EXP u exp.comp:", this.experiment); + console.log("DATASET u exp.comp:", this.dataset); + this.folderDataset.forExperiment = this.experiment; + this.folderDataset.fileToDisplay = this.experiment; + this.folderDataset.selectFile(); + this.columnTable.experiment = this.experiment; + this.columnTable.dataset = this.dataset; + //this.columnTable.loadDataset(this.dataset); + + //this.setDataset(); + //this.experimentChangedEvent(); + }); + }); + }); + } /*updateExperiment(){ @@ -151,13 +180,18 @@ export class ExperimentComponent implements AfterViewInit { this.folderModel.updateExperiment(); } - setDataset(dataset: FolderFile) { + setDataset(dataset: FolderFile | null) { + if (dataset == null) { + this.columnTable.loaded = false; + this.dataset = undefined; + this.experiment.datasetId = ''; + return; + } const d = dataset; this.experiment.datasetId = d._id; this.dataset = d; this.columnTable.loadDataset(this.dataset); - } modelToTrain?: Model; diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 1b961442..11a6ee5e 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -40,6 +40,9 @@ export class DatasetsService { getDatasetFilePartial(fileId: any, startRow: number, rowNum: number): Observable { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${startRow}/${rowNum}`, { headers: this.authService.authHeader(), responseType: 'text' }); } + getDatasetById(datasetId: string): Observable { + return this.http.get(`${Configuration.settings.apiURL}/dataset/${datasetId}`, { headers: this.authService.authHeader() }); + } editDataset(dataset: Dataset): Observable { return this.http.put(`${Configuration.settings.apiURL}/dataset/` + dataset._id, dataset, { headers: this.authService.authHeader() }); diff --git a/frontend/src/app/_services/experiments.service.ts b/frontend/src/app/_services/experiments.service.ts index 29569fca..f4473c8c 100644 --- a/frontend/src/app/_services/experiments.service.ts +++ b/frontend/src/app/_services/experiments.service.ts @@ -20,6 +20,10 @@ export class ExperimentsService { return this.http.get(`${Configuration.settings.apiURL}/experiment/getmyexperiments`, { headers: this.authService.authHeader() }); } + getExperimentById(id: string): Observable { + return this.http.get(`${Configuration.settings.apiURL}/experiment/get/${id}`, { headers: this.authService.authHeader() }); + } + updateExperiment(experiment: Experiment): Observable { return this.http.put(`${Configuration.settings.apiURL}/experiment/` + experiment._id, experiment, { headers: this.authService.authHeader() }); } diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index f5f1ccae..9f8c623d 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -12,11 +12,11 @@ import { TestComponent } from './_pages/test/test.component'; const routes: Routes = [ { path: '', component: HomeComponent, data: { title: 'Početna strana' } }, + { path: 'experiment/:id', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'experiment', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'archive', component: ArchiveComponent, data: { title: 'Arhiva' } }, { path: 'profile', component: ProfileComponent, canActivate: [AuthGuardService], data: { title: 'Profil' } }, { path: 'playground', component: PlaygroundComponent, data: { title: 'Zabava' } }, - { path: 'sonja', component: ColumnTableComponent }, { path: 'test', component: TestComponent, data: { title: 'Test' } } ]; -- cgit v1.2.3 From 2834795337f81e895c3b39948b5b04f7bc662071 Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Wed, 18 May 2022 17:22:09 +0200 Subject: Omogucen pristup glavnoj eksperiment strani odabirom eksperimenta iz kolekcije - automatski popunjeni prvi i drugi korak (forma za dataset i column-table). Korisnik moze da pocne od kreiranja modela (i prethodno izmeni sta zeli). --- .../column-table/column-table.component.ts | 65 +++++++++++++++------- .../src/app/_elements/folder/folder.component.ts | 5 +- .../app/_pages/experiment/experiment.component.ts | 16 +----- frontend/src/app/_services/datasets.service.ts | 2 +- 4 files changed, 52 insertions(+), 36 deletions(-) (limited to 'frontend/src/app/_pages/experiment/experiment.component.ts') 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 8824ecf4..9fdb6936 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -14,6 +14,7 @@ import { AlertDialogComponent } from 'src/app/_modals/alert-dialog/alert-dialog. import Shared from 'src/app/Shared'; import { PieChartComponent } from '../_charts/pie-chart/pie-chart.component'; import { BoxPlotComponent } from '../_charts/box-plot/box-plot.component'; +import { ActivatedRoute } from '@angular/router'; @Component({ selector: 'app-column-table', @@ -46,7 +47,7 @@ export class ColumnTableComponent implements AfterViewInit { - constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog) { + constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog, private route: ActivatedRoute) { } resetPagging(){ this.begin=0; @@ -105,23 +106,51 @@ export class ColumnTableComponent implements AfterViewInit { loadDataset(dataset: Dataset) { console.log("LOADED DATASET"); - this.dataset = dataset; - this.setColumnTypeInitial(); - this.columnsChecked = []; - this.dataset.columnInfo.forEach(column => { - this.columnsChecked.push(true); - }); - - this.resetInputColumns(); - this.resetOutputColumn(); - this.resetColumnEncodings(Encoding.Label); - this.setDeleteRowsForMissingValTreatment(); - - this.nullValOption = []; - this.dataset.columnInfo.forEach(colInfo => { - this.nullValOption.push(`Obriši redove (${colInfo.numNulls})`); - }); + if (this.route.snapshot.paramMap.get("id") == null) { + this.dataset = dataset; + this.setColumnTypeInitial(); + + this.columnsChecked = []; + this.dataset.columnInfo.forEach(column => { + this.columnsChecked.push(true); + }); + + this.resetInputColumns(); + this.resetOutputColumn(); + this.resetColumnEncodings(Encoding.Label); + this.setDeleteRowsForMissingValTreatment(); + + this.nullValOption = []; + this.dataset.columnInfo.forEach(colInfo => { + this.nullValOption.push(`Obriši redove (${colInfo.numNulls})`); + }); + } + else { + this.dataset = dataset; + this.columnsChecked = []; + this.dataset.columnInfo.forEach(column => { + if (this.experiment.inputColumns.find(x => x == column.columnName) != undefined) + this.columnsChecked.push(true); + else + this.columnsChecked.push(false); + }); + this.nullValOption = []; + for (let i = 0; i < this.dataset!.columnInfo.length; i++) { + let nullValRep = this.experiment.nullValuesReplacers.find(x => x.column == this.dataset!.columnInfo[i].columnName); + if (nullValRep != undefined) { + if (nullValRep.option == NullValueOptions.DeleteRows) + this.nullValOption.push(`Obriši redove (${this.dataset.columnInfo[i].numNulls})`); + else if (nullValRep.option == NullValueOptions.DeleteColumns) + this.nullValOption.push(`Obriši kolonu`); + else { + this.nullValOption.push(`Popuni sa ${nullValRep.value}`); + } + } + else + this.nullValOption.push(`Obriši redove (${this.dataset.columnInfo[i].numNulls})`); + } + } this.resetPagging(); this.loadData(); this.loaded = true; @@ -140,8 +169,6 @@ export class ColumnTableComponent implements AfterViewInit { } ngAfterViewInit(): void { - console.log(this.dataset?.columnInfo); - } setColumnTypeInitial() { diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index 4e2209a0..2b6f9aa7 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -11,7 +11,7 @@ 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 { ActivatedRoute, Router } from '@angular/router'; import Predictor from 'src/app/_data/Predictor'; @Component({ @@ -42,11 +42,12 @@ export class FolderComponent implements AfterViewInit { fileToDisplay?: FolderFile; @Output() selectedFileChanged: EventEmitter = new EventEmitter(); + @Output() fileFromRoute: EventEmitter = new EventEmitter(); @Output() okPressed: EventEmitter = new EventEmitter(); searchTerm: string = ''; - constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService, private signalRService: SignalRService, private router: Router) { + constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService, private signalRService: SignalRService, private router: Router, private route: ActivatedRoute) { this.tabsToShow.forEach(tab => this.folders[tab] = []); } diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index 6345307c..9af2a305 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.ts +++ b/frontend/src/app/_pages/experiment/experiment.component.ts @@ -46,26 +46,15 @@ export class ExperimentComponent implements AfterViewInit, OnInit { ngOnInit(): void { this.route.queryParams.subscribe(params => { let experimentId = this.route.snapshot.paramMap.get("id"); - console.log("EXPID u exp.comp:", experimentId); if (experimentId == null) return; - this.experimentsService.getExperimentById(experimentId).subscribe((response) => { this.experiment = response; - console.log(this.experiment); //OTKUD MI NAME this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { this.dataset = response; - console.log("EXP u exp.comp:", this.experiment); - console.log("DATASET u exp.comp:", this.dataset); + this.folderDataset.forExperiment = this.experiment; - this.folderDataset.fileToDisplay = this.experiment; - this.folderDataset.selectFile(); - this.columnTable.experiment = this.experiment; - this.columnTable.dataset = this.dataset; - //this.columnTable.loadDataset(this.dataset); - - //this.setDataset(); - //this.experimentChangedEvent(); + this.folderDataset.selectFile(this.dataset); }); }); }); @@ -200,7 +189,6 @@ export class ExperimentComponent implements AfterViewInit, OnInit { this.columnTable.loadDataset(this.dataset); this.step1=true; - } modelToTrain?: Model; diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 11a6ee5e..8d07674d 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -41,7 +41,7 @@ export class DatasetsService { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${startRow}/${rowNum}`, { headers: this.authService.authHeader(), responseType: 'text' }); } getDatasetById(datasetId: string): Observable { - return this.http.get(`${Configuration.settings.apiURL}/dataset/${datasetId}`, { headers: this.authService.authHeader() }); + return this.http.get(`${Configuration.settings.apiURL}/dataset/get/${datasetId}`, { headers: this.authService.authHeader() }); } editDataset(dataset: Dataset): Observable { -- cgit v1.2.3 From 7c0c09c94246441bca36d873769fc420feb00937 Mon Sep 17 00:00:00 2001 From: Danijel Anđelković Date: Wed, 18 May 2022 20:49:57 +0200 Subject: Podesio korake eksperimenta tako da korisnik ne moze da skroluje do koraka koje nije otkljucao. Promenio slajdere za trening, test, validacione skupove tako da se vide minimumi od 10%. Popravio skrolove koji nisu trebali da se pojavljuju, i dimenzije nekih elemenata. --- .../src/app/_elements/folder/folder.component.css | 9 +++--- .../src/app/_elements/folder/folder.component.ts | 4 ++- .../_elements/form-model/form-model.component.css | 34 +++++++++++++++++--- .../_elements/form-model/form-model.component.html | 37 ++++++++++++++-------- .../src/app/_elements/graph/graph.component.html | 2 +- .../app/_pages/experiment/experiment.component.css | 16 ++++++---- .../_pages/experiment/experiment.component.html | 6 ++-- .../app/_pages/experiment/experiment.component.ts | 25 +++++++++------ 8 files changed, 88 insertions(+), 45 deletions(-) (limited to 'frontend/src/app/_pages/experiment/experiment.component.ts') diff --git a/frontend/src/app/_elements/folder/folder.component.css b/frontend/src/app/_elements/folder/folder.component.css index 3ecba343..4a06faa4 100644 --- a/frontend/src/app/_elements/folder/folder.component.css +++ b/frontend/src/app/_elements/folder/folder.component.css @@ -1,7 +1,5 @@ #folder { - /*position: absolute; - left: 50%; - transform: translateX(-50%);*/ + width: 100%; } #tabs { @@ -167,12 +165,13 @@ align-items: center; flex-grow: 1; height: 100%; + padding: 50px; } .folder-inside { width: 100%; - height: 40rem; - overflow-y: auto; + min-height: 40rem; + max-height: 100%; } .file-content { diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index b09cb543..735bfdaa 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -434,7 +434,9 @@ export class FolderComponent implements AfterViewInit { updateExperiment() { if (this.formModel) { - this.formModel.updateGraph(); + setTimeout(() => { + this.formModel.updateGraph(); + }); } } diff --git a/frontend/src/app/_elements/form-model/form-model.component.css b/frontend/src/app/_elements/form-model/form-model.component.css index 95ace1ef..34c1a5c5 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.css +++ b/frontend/src/app/_elements/form-model/form-model.component.css @@ -86,12 +86,12 @@ hr { max-height: 20 rem; } -mat-slider { - width: 50%; -} - .slider { background-color: transparent; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; } .center-center { @@ -102,3 +102,29 @@ mat-slider { font-size: 20px !important; font-weight: 600; } + +.slider-pad { + min-width: 10%; + background-color: gray; + height: 2px; +} + +.slider-pad:first-child { + margin-right: -8px; +} + +.slider-pad:last-child { + margin-left: -8px; +} + +.slider-extended { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + width: 95%; +} + +.slide { + width: 80%; +} \ No newline at end of file diff --git a/frontend/src/app/_elements/form-model/form-model.component.html b/frontend/src/app/_elements/form-model/form-model.component.html index 1b4eb834..c7a9d5ca 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.html +++ b/frontend/src/app/_elements/form-model/form-model.component.html @@ -91,24 +91,33 @@
-
-
+
+ +
+
+ Trening {{testSetDistribution}}% : Test i validacija {{100-testSetDistribution}}% +
+
+
+ +
+
+
+ Test {{validationSize}}% : Validacija {{100-validationSize}}% +
+
+
+ +
+
-
-
- {{validationSize}} % - +
+ Nasumični redosled podataka
- -
diff --git a/frontend/src/app/_elements/graph/graph.component.html b/frontend/src/app/_elements/graph/graph.component.html index 35753d40..411e8b53 100644 --- a/frontend/src/app/_elements/graph/graph.component.html +++ b/frontend/src/app/_elements/graph/graph.component.html @@ -1,4 +1,4 @@ -
+
-
-
- - - - -
-
-
- - - -
-
-
-

Nema rezultata

-
-
- -
- - - - - -
diff --git a/frontend/src/app/_pages/my-models/my-models.component.ts b/frontend/src/app/_pages/my-models/my-models.component.ts deleted file mode 100644 index d379fa69..00000000 --- a/frontend/src/app/_pages/my-models/my-models.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import shared from 'src/app/Shared'; -import Model from 'src/app/_data/Model'; -import { ModelsService } from 'src/app/_services/models.service'; - -@Component({ - selector: 'app-my-models', - templateUrl: './my-models.component.html', - styleUrls: ['./my-models.component.css'] -}) -export class MyModelsComponent implements OnInit { - myModels: Model[] = []; - //myModel: Model; - - constructor(private modelsS : ModelsService, private router : Router) { - - - - } - - ngOnInit(): void { - this.getAllMyModels(); - - } -/* - editModel(): void{ - this.modelsS.editModel().subscribe(m => { - this.myModel = m; - - }) - } -*/ - -deleteThisModel(model: Model): void{ - shared.openYesNoDialog('Brisanje seta podataka','Da li ste sigurni da želite da obrišete model?',() => { - this.modelsS.deleteModel(model).subscribe((response) => { - this.getAllMyModels(); - }, (error) =>{ - if (error.error == "Model with name = {name} deleted") { - shared.openDialog("Obaveštenje", "Greška prilikom brisanja modela."); - } - }); - }); -} - - -useThisModel(model: Model): void{ - - this.router.navigate(['/training']) - -} - getAllMyModels(): void{ - this.modelsS.getMyModels().subscribe(m => { - this.myModels = m; - }); - } - -} diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index 56442842..d5552ce9 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -12,7 +12,7 @@ import { TestComponent } from './_pages/test/test.component'; const routes: Routes = [ { path: '', component: HomeComponent, data: { title: 'Početna strana' } }, - { path: 'experiment/:id/:predictorId', component: ExperimentComponent, data: { title: 'Eksperiment' } }, + { path: 'experiment/p/:predictorId', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'experiment/:id', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'experiment', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'archive', component: ArchiveComponent, data: { title: 'Arhiva' } }, -- cgit v1.2.3 From 8c7273e0383e2fac27247000d62a3edde704294c Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 19 May 2022 22:57:10 +0200 Subject: Ukoliko korisnik trenira model za vise od 100 epoha. Notifikacije se salju na svakih sqrt(totalEpochs). Time aplikacija vise ne zabada. --- backend/api/api/Controllers/ModelController.cs | 3 +- frontend/package-lock.json | 166 ++++++++------------- .../_elements/metric-view/metric-view.component.ts | 12 +- .../app/_pages/experiment/experiment.component.ts | 2 +- 4 files changed, 72 insertions(+), 111 deletions(-) (limited to 'frontend/src/app/_pages/experiment/experiment.component.ts') diff --git a/backend/api/api/Controllers/ModelController.cs b/backend/api/api/Controllers/ModelController.cs index be30ae6f..c574de28 100644 --- a/backend/api/api/Controllers/ModelController.cs +++ b/backend/api/api/Controllers/ModelController.cs @@ -81,10 +81,9 @@ namespace api.Controllers [ServiceFilter(typeof(MlApiCheckActionFilter))] public async Task> Epoch([FromBody] Epoch info) { - var model=_modelService.GetOneModel(info.ModelId); var user = _userService.GetUserById(model.uploaderId); - + if((model.epochs>100 && info.EpochNum%Math.Round(Math.Sqrt(model.epochs))==0) || model.epochs<=100 ||model.epochs-1==info.EpochNum) if (ChatHub.CheckUser(user._id)) foreach (var connection in ChatHub.getAllConnectionsOfUser(user._id)) await _ichat.Clients.Client(connection).SendAsync("NotifyEpoch",model.name,info.ModelId,info.Stat,model.epochs,info.EpochNum); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5029a126..7a0f7b3a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -437,7 +437,6 @@ }, "node_modules/@angular/compiler-cli": { "version": "13.2.5", - "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.17.2", @@ -466,7 +465,6 @@ }, "node_modules/@angular/compiler-cli/node_modules/@ampproject/remapping": { "version": "2.1.2", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/trace-mapping": "^0.3.0" @@ -477,7 +475,6 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { "version": "7.17.5", - "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.1.0", @@ -506,7 +503,6 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -514,7 +510,6 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { "version": "7.17.3", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.17.0", @@ -527,7 +522,6 @@ }, "node_modules/@angular/compiler-cli/node_modules/source-map": { "version": "0.5.7", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -750,7 +744,6 @@ }, "node_modules/@babel/core": { "version": "7.16.12", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", @@ -779,7 +772,6 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -787,7 +779,6 @@ }, "node_modules/@babel/core/node_modules/source-map": { "version": "0.5.7", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -795,7 +786,6 @@ }, "node_modules/@babel/generator": { "version": "7.16.8", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.16.8", @@ -808,7 +798,6 @@ }, "node_modules/@babel/generator/node_modules/source-map": { "version": "0.5.7", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3271,7 +3260,6 @@ }, "node_modules/anymatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -3522,7 +3510,6 @@ }, "node_modules/binary-extensions": { "version": "2.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3610,7 +3597,6 @@ }, "node_modules/braces": { "version": "3.0.2", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.0.1" @@ -3788,7 +3774,6 @@ }, "node_modules/chokidar": { "version": "3.5.3", - "dev": true, "funding": [ { "type": "individual", @@ -4731,7 +4716,6 @@ }, "node_modules/dependency-graph": { "version": "0.11.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -4878,7 +4862,6 @@ }, "node_modules/encoding": { "version": "0.1.13", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -4887,7 +4870,6 @@ }, "node_modules/encoding/node_modules/iconv-lite": { "version": "0.6.3", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -5363,7 +5345,6 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -5612,7 +5593,6 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -6150,7 +6130,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -6200,7 +6179,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6215,7 +6193,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -6239,7 +6216,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -7033,7 +7009,6 @@ }, "node_modules/lru-cache": { "version": "6.0.0", - "dev": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7044,7 +7019,6 @@ }, "node_modules/magic-string": { "version": "0.25.7", - "dev": true, "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.4" @@ -7587,7 +7561,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8224,7 +8197,6 @@ }, "node_modules/picomatch": { "version": "2.3.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -8975,7 +8947,6 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -9250,7 +9221,7 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/sass": { @@ -9370,7 +9341,6 @@ }, "node_modules/semver": { "version": "7.3.5", - "dev": true, "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" @@ -9720,7 +9690,6 @@ }, "node_modules/sourcemap-codec": { "version": "1.4.8", - "dev": true, "license": "MIT" }, "node_modules/spdy": { @@ -10099,7 +10068,6 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -10181,7 +10149,6 @@ }, "node_modules/typescript": { "version": "4.5.5", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -10803,7 +10770,6 @@ }, "node_modules/yallist": { "version": "4.0.0", - "dev": true, "license": "ISC" }, "node_modules/yaml": { @@ -11089,7 +11055,6 @@ }, "@angular/compiler-cli": { "version": "13.2.5", - "dev": true, "requires": { "@babel/core": "^7.17.2", "chokidar": "^3.0.0", @@ -11105,14 +11070,12 @@ "dependencies": { "@ampproject/remapping": { "version": "2.1.2", - "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.0" } }, "@babel/core": { "version": "7.17.5", - "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -11132,14 +11095,12 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "dev": true + "version": "6.3.0" } } }, "@babel/generator": { "version": "7.17.3", - "dev": true, "requires": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -11147,8 +11108,7 @@ } }, "source-map": { - "version": "0.5.7", - "dev": true + "version": "0.5.7" } } }, @@ -11259,7 +11219,6 @@ }, "@babel/core": { "version": "7.16.12", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -11279,18 +11238,15 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "dev": true + "version": "6.3.0" }, "source-map": { - "version": "0.5.7", - "dev": true + "version": "0.5.7" } } }, "@babel/generator": { "version": "7.16.8", - "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -11298,8 +11254,7 @@ }, "dependencies": { "source-map": { - "version": "0.5.7", - "dev": true + "version": "0.5.7" } } }, @@ -12232,7 +12187,8 @@ }, "dependencies": { "ws": { - "version": "7.5.7" + "version": "7.5.7", + "requires": {} } } }, @@ -12244,7 +12200,8 @@ }, "@ngtools/webpack": { "version": "13.2.5", - "dev": true + "dev": true, + "requires": {} }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -12811,7 +12768,8 @@ }, "acorn-import-assertions": { "version": "1.8.0", - "dev": true + "dev": true, + "requires": {} }, "adjust-sourcemap-loader": { "version": "4.0.0", @@ -12909,7 +12867,6 @@ }, "anymatch": { "version": "3.1.2", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -13061,8 +13018,7 @@ "dev": true }, "binary-extensions": { - "version": "2.2.0", - "dev": true + "version": "2.2.0" }, "bl": { "version": "4.1.0", @@ -13119,7 +13075,8 @@ "dev": true }, "bootstrap": { - "version": "5.1.3" + "version": "5.1.3", + "requires": {} }, "brace-expansion": { "version": "1.1.11", @@ -13130,7 +13087,6 @@ }, "braces": { "version": "3.0.2", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -13239,7 +13195,6 @@ }, "chokidar": { "version": "3.5.3", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -13261,7 +13216,8 @@ }, "circular-dependency-plugin": { "version": "5.2.2", - "dev": true + "dev": true, + "requires": {} }, "clean-stack": { "version": "2.2.0", @@ -13632,7 +13588,8 @@ }, "css-prefers-color-scheme": { "version": "6.0.3", - "dev": true + "dev": true, + "requires": {} }, "css-select": { "version": "4.2.1", @@ -13832,8 +13789,7 @@ "dev": true }, "dependency-graph": { - "version": "0.11.0", - "dev": true + "version": "0.11.0" }, "destroy": { "version": "1.0.4", @@ -13932,7 +13888,6 @@ }, "encoding": { "version": "0.1.13", - "dev": true, "optional": true, "requires": { "iconv-lite": "^0.6.2" @@ -13940,7 +13895,6 @@ "dependencies": { "iconv-lite": { "version": "0.6.3", - "dev": true, "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -14253,7 +14207,6 @@ }, "fill-range": { "version": "7.0.1", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -14402,7 +14355,6 @@ }, "glob-parent": { "version": "5.1.2", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -14599,7 +14551,8 @@ }, "icss-utils": { "version": "5.1.0", - "dev": true + "dev": true, + "requires": {} }, "ieee754": { "version": "1.2.1", @@ -14746,7 +14699,6 @@ }, "is-binary-path": { "version": "2.1.0", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -14770,15 +14722,13 @@ "dev": true }, "is-extglob": { - "version": "2.1.1", - "dev": true + "version": "2.1.1" }, "is-fullwidth-code-point": { "version": "3.0.0" }, "is-glob": { "version": "4.0.3", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -14792,8 +14742,7 @@ "dev": true }, "is-number": { - "version": "7.0.0", - "dev": true + "version": "7.0.0" }, "is-path-cwd": { "version": "2.2.0", @@ -15117,7 +15066,8 @@ }, "karma-jasmine-html-reporter": { "version": "1.7.0", - "dev": true + "dev": true, + "requires": {} }, "karma-source-map-support": { "version": "1.4.0", @@ -15290,14 +15240,12 @@ }, "lru-cache": { "version": "6.0.0", - "dev": true, "requires": { "yallist": "^4.0.0" } }, "magic-string": { "version": "0.25.7", - "dev": true, "requires": { "sourcemap-codec": "^1.4.4" } @@ -15632,8 +15580,7 @@ } }, "normalize-path": { - "version": "3.0.0", - "dev": true + "version": "3.0.0" }, "normalize-range": { "version": "0.1.2", @@ -16048,8 +15995,7 @@ "version": "1.0.0" }, "picomatch": { - "version": "2.3.1", - "dev": true + "version": "2.3.1" }, "pify": { "version": "2.3.0", @@ -16139,7 +16085,8 @@ }, "postcss-custom-media": { "version": "8.0.0", - "dev": true + "dev": true, + "requires": {} }, "postcss-custom-properties": { "version": "12.1.4", @@ -16193,11 +16140,13 @@ }, "postcss-font-variant": { "version": "5.0.0", - "dev": true + "dev": true, + "requires": {} }, "postcss-gap-properties": { "version": "3.0.3", - "dev": true + "dev": true, + "requires": {} }, "postcss-image-set-function": { "version": "4.0.6", @@ -16217,7 +16166,8 @@ }, "postcss-initial": { "version": "4.0.1", - "dev": true + "dev": true, + "requires": {} }, "postcss-lab-function": { "version": "4.1.1", @@ -16238,15 +16188,18 @@ }, "postcss-logical": { "version": "5.0.4", - "dev": true + "dev": true, + "requires": {} }, "postcss-media-minmax": { "version": "5.0.0", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-extract-imports": { "version": "3.0.0", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -16280,11 +16233,13 @@ }, "postcss-overflow-shorthand": { "version": "3.0.3", - "dev": true + "dev": true, + "requires": {} }, "postcss-page-break": { "version": "3.0.4", - "dev": true + "dev": true, + "requires": {} }, "postcss-place": { "version": "7.0.4", @@ -16341,7 +16296,8 @@ }, "postcss-replace-overflow-wrap": { "version": "4.0.0", - "dev": true + "dev": true, + "requires": {} }, "postcss-selector-not": { "version": "5.0.0", @@ -16469,7 +16425,6 @@ }, "readdirp": { "version": "3.6.0", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -16641,7 +16596,7 @@ }, "safer-buffer": { "version": "2.1.2", - "dev": true + "devOptional": true }, "sass": { "version": "1.49.0", @@ -16685,7 +16640,8 @@ }, "ajv-keywords": { "version": "3.5.2", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -16706,7 +16662,6 @@ }, "semver": { "version": "7.3.5", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -16952,8 +16907,7 @@ } }, "sourcemap-codec": { - "version": "1.4.8", - "dev": true + "version": "1.4.8" }, "spdy": { "version": "4.0.2", @@ -17123,7 +17077,8 @@ }, "ajv-keywords": { "version": "3.5.2", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -17177,7 +17132,6 @@ }, "to-regex-range": { "version": "5.0.1", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -17226,8 +17180,7 @@ "dev": true }, "typescript": { - "version": "4.5.5", - "dev": true + "version": "4.5.5" }, "ua-parser-js": { "version": "0.7.31", @@ -17386,7 +17339,8 @@ }, "ajv-keywords": { "version": "3.5.2", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -17580,7 +17534,8 @@ }, "ws": { "version": "8.2.3", - "dev": true + "dev": true, + "requires": {} }, "xlsx": { "version": "0.18.5", @@ -17598,8 +17553,7 @@ "version": "5.0.8" }, "yallist": { - "version": "4.0.0", - "dev": true + "version": "4.0.0" }, "yaml": { "version": "1.10.2", diff --git a/frontend/src/app/_elements/metric-view/metric-view.component.ts b/frontend/src/app/_elements/metric-view/metric-view.component.ts index fbca2edf..65b1ef9b 100644 --- a/frontend/src/app/_elements/metric-view/metric-view.component.ts +++ b/frontend/src/app/_elements/metric-view/metric-view.component.ts @@ -16,7 +16,7 @@ export class MetricViewComponent implements OnInit { history: any[] = []; - update(history: any[]) { + update(history: any[],totalEpochs:number) { const myAcc: number[] = []; const myMae: number[] = []; const myMse: number[] = []; @@ -29,7 +29,15 @@ export class MetricViewComponent implements OnInit { const myEpochs: number[] = []; this.history = history; this.history.forEach((metrics, epoch) => { - myEpochs.push(epoch + 1); + if(totalEpochs>100) + { + let epochEstimate=epoch*Math.round(Math.sqrt(totalEpochs)) + if(epochEstimate>totalEpochs) + epochEstimate=totalEpochs; + myEpochs.push(epochEstimate); + } + else + myEpochs.push(epoch + 1); for (let key in metrics) { let value = metrics[key]; //console.log(key, ':::', value, epoch); diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index 7cb5e7cd..398321f2 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.ts +++ b/frontend/src/app/_pages/experiment/experiment.component.ts @@ -91,7 +91,7 @@ export class ExperimentComponent implements AfterViewInit { stat = stat.replace(/'/g, '"'); //console.log('JSON', this.trainingResult); this.history.push(JSON.parse(stat)); - this.metricView.update(this.history); + this.metricView.update(this.history,this.modelToTrain.epochs); } }); -- cgit v1.2.3