From 07b11e07fc62d9ea9765595812ab68209be99a3a Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Mon, 18 Apr 2022 00:20:08 +0200 Subject: Omogucen izbor enkodiranja za svaku kolonu. Izmenjena klasa Experiment da sadrzi niz parova naziv kolone - enkoding. Ispravljen bag kod menjanja dugmica "izaberi" i "dodaj dataset". --- frontend/src/app/_elements/dataset-load/dataset-load.component.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'frontend/src/app/_elements/dataset-load/dataset-load.component.ts') diff --git a/frontend/src/app/_elements/dataset-load/dataset-load.component.ts b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts index 62cca456..73dbf2d2 100644 --- a/frontend/src/app/_elements/dataset-load/dataset-load.component.ts +++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts @@ -41,12 +41,14 @@ export class DatasetLoadComponent implements OnInit { viewMyDatasetsForm() { this.showMyDatasets = true; - this.resetSelectedDataset(); + if (this.selectedDataset != undefined) + this.resetSelectedDataset(); //this.resetCbsAndRbs(); //TREBA DA SE DESI } viewNewDatasetForm() { this.showMyDatasets = false; - this.resetSelectedDataset(); + if (this.selectedDataset != undefined) + this.resetSelectedDataset(); //this.resetCbsAndRbs(); //TREBA DA SE DESI } -- cgit v1.2.3 From 32d776709f2b5df14dbcfd3f610306a899959851 Mon Sep 17 00:00:00 2001 From: Danijel Anđelković Date: Tue, 19 Apr 2022 21:44:08 +0200 Subject: Dodao event kada se korisnik uloguje tako da komponente koje treba da osveze vrednost mogu da osveze svoje vrednosti tako sto se prijave na taj event. --- .../dataset-load/dataset-load.component.ts | 11 ++++++- .../_elements/model-load/model-load.component.ts | 27 ++++++++++------- .../src/app/_elements/navbar/navbar.component.html | 34 ++++++++------------- frontend/src/app/_services/auth.service.ts | 7 +++-- frontend/src/app/training/training.component.ts | 35 +++++++++++++++++----- 5 files changed, 72 insertions(+), 42 deletions(-) (limited to 'frontend/src/app/_elements/dataset-load/dataset-load.component.ts') diff --git a/frontend/src/app/_elements/dataset-load/dataset-load.component.ts b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts index 73dbf2d2..74640782 100644 --- a/frontend/src/app/_elements/dataset-load/dataset-load.component.ts +++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts @@ -8,6 +8,7 @@ import { DatasetsService } from 'src/app/_services/datasets.service'; import { CsvParseService } from 'src/app/_services/csv-parse.service'; import { Output, EventEmitter } from '@angular/core'; import { SignalRService } from 'src/app/_services/signal-r.service'; +import { AuthService } from 'src/app/_services/auth.service'; @Component({ selector: 'app-dataset-load', @@ -33,7 +34,15 @@ export class DatasetLoadComponent implements OnInit { term: string = ""; - constructor(private models: ModelsService, private datasets: DatasetsService, private csv: CsvParseService, private signalRService: SignalRService) { + constructor(private models: ModelsService, private datasets: DatasetsService, private csv: CsvParseService, private signalRService: SignalRService, private authService: AuthService) { + this.fetchDatasets(); + + authService.loggedInEvent.subscribe(_ => { + this.fetchDatasets(); + }) + } + + fetchDatasets() { this.datasets.getMyDatasets().subscribe((datasets) => { this.myDatasets = datasets; }); diff --git a/frontend/src/app/_elements/model-load/model-load.component.ts b/frontend/src/app/_elements/model-load/model-load.component.ts index 5f9caf9d..8bf8fd93 100644 --- a/frontend/src/app/_elements/model-load/model-load.component.ts +++ b/frontend/src/app/_elements/model-load/model-load.component.ts @@ -2,6 +2,7 @@ import { Component, OnInit, ViewChild, Output, EventEmitter, Input } from '@angu import Shared from 'src/app/Shared'; import Experiment from 'src/app/_data/Experiment'; import Model, { ActivationFunction, LossFunction, LossFunctionBinaryClassification, LossFunctionMultiClassification, LossFunctionRegression, Metrics, MetricsBinaryClassification, MetricsMultiClassification, MetricsRegression, NullValueOptions, Optimizer, ProblemType } from 'src/app/_data/Model'; +import { AuthService } from 'src/app/_services/auth.service'; import { ModelsService } from 'src/app/_services/models.service'; import { GraphComponent } from '../graph/graph.component'; @@ -14,7 +15,7 @@ import { GraphComponent } from '../graph/graph.component'; export class ModelLoadComponent implements OnInit { @ViewChild(GraphComponent) graph!: GraphComponent; - @Input() forExperiment?:Experiment; + @Input() forExperiment?: Experiment; @Output() selectedModelChangeEvent = new EventEmitter(); newModel: Model = new Model(); @@ -38,13 +39,20 @@ export class ModelLoadComponent implements OnInit { batchSizePower: number = 2; - constructor(private modelsService: ModelsService) { + constructor(private modelsService: ModelsService, private authService: AuthService) { //console.log("forExperiment = ", this.forExperiment); - + this.fetchModels(); + + this.authService.loggedInEvent.subscribe(_ => { + this.fetchModels(); + }) + } + + fetchModels() { //if (this.forExperiment == undefined) { - this.modelsService.getMyModels().subscribe((models) => { - this.myModels = models; - }); + this.modelsService.getMyModels().subscribe((models) => { + this.myModels = models; + }); /*} else { this.modelsService.getMyModelsByType(ProblemType.Regression).subscribe((models) => { @@ -56,10 +64,9 @@ export class ModelLoadComponent implements OnInit { ngOnInit(): void { } - - updateBatchSize() - { - this.newModel.batchSize=2**this.batchSizePower; + + updateBatchSize() { + this.newModel.batchSize = 2 ** this.batchSizePower; } updateGraph() { diff --git a/frontend/src/app/_elements/navbar/navbar.component.html b/frontend/src/app/_elements/navbar/navbar.component.html index 7d0c4cd8..1988b834 100644 --- a/frontend/src/app/_elements/navbar/navbar.component.html +++ b/frontend/src/app/_elements/navbar/navbar.component.html @@ -6,31 +6,25 @@ diff --git a/frontend/src/app/_services/auth.service.ts b/frontend/src/app/_services/auth.service.ts index ef340684..9e3f9f2f 100644 --- a/frontend/src/app/_services/auth.service.ts +++ b/frontend/src/app/_services/auth.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { EventEmitter, Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { JwtHelperService } from '@auth0/angular-jwt'; import { CookieService } from 'ngx-cookie-service'; @@ -12,6 +12,8 @@ const jwtHelper = new JwtHelperService(); }) export class AuthService { + public loggedInEvent: EventEmitter = new EventEmitter(); + shared = shared; constructor(private http: HttpClient, private cookie: CookieService) { } @@ -52,7 +54,7 @@ export class AuthService { var property = jwtHelper.decodeToken(this.cookie.get('token')); var username = property['name']; if (username != "") { - + this.refresher = setTimeout(() => { this.http.post(`${Configuration.settings.apiURL}/auth/renewJwt`, {}, { headers: this.authHeader(), responseType: 'text' }).subscribe((response) => { this.authenticate(response); @@ -81,6 +83,7 @@ export class AuthService { } this.cookie.set('token', token, exp); this.updateUser(); + this.loggedInEvent.emit(true); } updateUser() { diff --git a/frontend/src/app/training/training.component.ts b/frontend/src/app/training/training.component.ts index c82a6b79..1b85b947 100644 --- a/frontend/src/app/training/training.component.ts +++ b/frontend/src/app/training/training.component.ts @@ -4,15 +4,17 @@ import Shared from '../Shared'; import Experiment from '../_data/Experiment'; import Model, { ProblemType } from '../_data/Model'; import { ModelLoadComponent } from '../_elements/model-load/model-load.component'; +import { AuthService } from '../_services/auth.service'; import { ExperimentsService } from '../_services/experiments.service'; import { ModelsService } from '../_services/models.service'; +import { SignalRService } from '../_services/signal-r.service'; @Component({ selector: 'app-training', templateUrl: './training.component.html', styleUrls: ['./training.component.css'] }) -export class TrainingComponent implements OnInit{ +export class TrainingComponent implements OnInit { @ViewChild(ModelLoadComponent) modelLoadComponent?: ModelLoadComponent; @@ -24,22 +26,39 @@ export class TrainingComponent implements OnInit{ term: string = ""; - constructor(private modelsService: ModelsService, private route: ActivatedRoute, private experimentsService: ExperimentsService) { + constructor(private modelsService: ModelsService, private route: ActivatedRoute, private experimentsService: ExperimentsService, private authService: AuthService, private signalRService: SignalRService) { + if (this.signalRService.hubConnection) { + this.signalRService.hubConnection.on("NotifyEpoch", (mName: string, mId: string, stat: string, totalEpochs: number, currentEpoch: number) => { + if (this.selectedModel?._id == mId) { + this.trainingResult = stat; + } + }); + } } - ngOnInit(): void { + ngOnInit(): void { this.route.queryParams.subscribe(params => { - let experimentId =this.route.snapshot.paramMap.get("id"); + let experimentId = this.route.snapshot.paramMap.get("id"); - this.experimentsService.getMyExperiments().subscribe((experiments) => { - this.myExperiments = experiments; + this.fetchExperiments(experimentId); - this.selectedExperiment = this.myExperiments.filter(x => x._id == experimentId)[0]; - console.log("selektovan exp u training comp: ", this.selectedExperiment); + this.authService.loggedInEvent.subscribe(_ => { + this.fetchExperiments(experimentId); + + this.signalRService.startConnection() }); }); } + fetchExperiments(andSelectWithId: string | null = '') { + this.experimentsService.getMyExperiments().subscribe((experiments) => { + this.myExperiments = experiments; + + this.selectedExperiment = this.myExperiments.filter(x => x._id == andSelectWithId)[0]; + console.log("selektovan exp u training comp: ", this.selectedExperiment); + }); + } + selectThisExperiment(experiment: Experiment) { this.selectedExperiment = experiment; this.modelLoadComponent!.newModel.type = this.selectedExperiment.type; -- cgit v1.2.3 From 923188daa0c90a07c57ecdc6957fcb569b5aa73a Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Tue, 19 Apr 2022 21:56:04 +0200 Subject: Dodavanje novog dataseta: dataset selektovan cim se doda, delimiter input promenjen. Yes/no dijalog kad se eskperiment doda za odlazak na treniranje. Resen error kod selektovanja tipa problema. --- .../add-new-dataset/add-new-dataset.component.html | 50 ++++++++++++---------- .../add-new-dataset/add-new-dataset.component.ts | 9 ++-- .../dataset-load/dataset-load.component.html | 30 ++++++------- .../dataset-load/dataset-load.component.ts | 20 +++++---- .../_elements/model-load/model-load.component.html | 8 ++-- .../yes-no-dialog/yes-no-dialog.component.html | 6 +-- .../src/app/experiment/experiment.component.ts | 6 +-- frontend/src/app/training/training.component.ts | 3 +- 8 files changed, 66 insertions(+), 66 deletions(-) (limited to 'frontend/src/app/_elements/dataset-load/dataset-load.component.ts') diff --git a/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.html b/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.html index bff8b022..e5d4cd23 100644 --- a/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.html +++ b/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.html @@ -2,48 +2,54 @@
- - + + - -
- -
+ +
+ +
-
-
+
- - + + + + -
- +
+
- +
- -
+ + \ No newline at end of file diff --git a/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.ts b/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.ts index 3e1b5c73..1f395105 100644 --- a/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.ts +++ b/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.ts @@ -13,10 +13,9 @@ import { CsvParseService } from 'src/app/_services/csv-parse.service'; }) export class AddNewDatasetComponent { - @Output() newDatasetAdded = new EventEmitter(); @ViewChild(DatatableComponent) datatable!: DatatableComponent; - delimiterOptions: Array = [",", ";", "\t", "razmak", "|"]; //podrazumevano "," + delimiterOptions: Array = [",", ";", "|", "razmak", "novi red"]; //podrazumevano "," csvRecords: any[] = []; files: File[] = []; @@ -29,6 +28,7 @@ export class AddNewDatasetComponent { constructor(private modelsService: ModelsService, private datasetsService: DatasetsService, private csv: CsvParseService) { this.dataset = new Dataset(); + this.dataset.delimiter = ','; } //@ViewChild('fileImportInput', { static: false }) fileImportInput: any; cemu je ovo sluzilo? @@ -36,8 +36,6 @@ export class AddNewDatasetComponent { changeListener($event: any): void { this.files = $event.srcElement.files; if (this.files.length == 0 || this.files[0] == null) { - //console.log("NEMA FAJLA"); - //this.loaded.emit("not loaded"); this.tableData.hasInput = false; return; } @@ -56,7 +54,7 @@ export class AddNewDatasetComponent { const fileReader = new FileReader(); fileReader.onload = (e) => { if (typeof fileReader.result === 'string') { - const result = this.csv.csvToArray(fileReader.result, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "") ? "," : this.dataset.delimiter) + const result = this.csv.csvToArray(fileReader.result, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "novi red") ? "\t" : this.dataset.delimiter) if (this.dataset.hasHeader) this.csvRecords = result.splice(0, 11); @@ -93,7 +91,6 @@ export class AddNewDatasetComponent { this.dataset.uploaderId = shared.userId; this.datasetsService.addDataset(this.dataset).subscribe((dataset) => { - this.newDatasetAdded.emit("added"); shared.openDialog("Obaveštenje", "Uspešno ste dodali novi izvor podataka u kolekciju. Molimo sačekajte par trenutaka da se procesira."); }, (error) => { shared.openDialog("Neuspeo pokušaj!", "Izvor podataka sa unetim nazivom već postoji u Vašoj kolekciji. Izmenite naziv ili iskoristite postojeći dataset."); diff --git a/frontend/src/app/_elements/dataset-load/dataset-load.component.html b/frontend/src/app/_elements/dataset-load/dataset-load.component.html index 56a3b3c9..f244a882 100644 --- a/frontend/src/app/_elements/dataset-load/dataset-load.component.html +++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.html @@ -1,40 +1,34 @@
- +
-

ili

-
-
- -
-
+
+ +
+
    -
  • - +
  • +
-
+
- - + +
\ No newline at end of file diff --git a/frontend/src/app/_elements/dataset-load/dataset-load.component.ts b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts index 73dbf2d2..b2f8857d 100644 --- a/frontend/src/app/_elements/dataset-load/dataset-load.component.ts +++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts @@ -52,13 +52,6 @@ export class DatasetLoadComponent implements OnInit { //this.resetCbsAndRbs(); //TREBA DA SE DESI } - refreshMyDatasets() { - this.datasets.getMyDatasets().subscribe((datasets) => { - this.myDatasets = datasets; - this.showMyDatasets = true; - }); - } - selectThisDataset(dataset: Dataset) { this.selectedDataset = dataset; this.selectedDatasetLoaded = false; @@ -88,10 +81,19 @@ export class DatasetLoadComponent implements OnInit { return true; } + refreshMyDatasets(selectedDatasetId: string | null) { + this.datasets.getMyDatasets().subscribe((datasets) => { + this.myDatasets = datasets.reverse(); + this.showMyDatasets = true; + this.selectedDataset = this.myDatasets.filter(x => x._id == selectedDatasetId)[0]; + this.resetSelectedDataset(); + }); + } + ngOnInit(): void { if (this.signalRService.hubConnection) { - this.signalRService.hubConnection.on("NotifyDataset", _ => { - this.refreshMyDatasets(); + this.signalRService.hubConnection.on("NotifyDataset", (dName: string, dId: string) => { + this.refreshMyDatasets(dId); }); } else { console.warn("Dataset-Load: No connection!"); diff --git a/frontend/src/app/_elements/model-load/model-load.component.html b/frontend/src/app/_elements/model-load/model-load.component.html index a1e6abd6..1afb1ecb 100644 --- a/frontend/src/app/_elements/model-load/model-load.component.html +++ b/frontend/src/app/_elements/model-load/model-load.component.html @@ -51,7 +51,7 @@
-
-
-
-