diff options
Diffstat (limited to 'frontend/src/app/_pages/experiment')
3 files changed, 139 insertions, 57 deletions
diff --git a/frontend/src/app/_pages/experiment/experiment.component.css b/frontend/src/app/_pages/experiment/experiment.component.css index 4c063f87..59e004e9 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.css +++ b/frontend/src/app/_pages/experiment/experiment.component.css @@ -36,32 +36,42 @@ mat-stepper { display: flex; flex-direction: column; width: 100%; + height: 100%; overflow-y: auto; } .step-content { position: relative; - width: 100%; + width: 98%; + min-height: 100%; display: flex; flex-direction: row; justify-content: center; align-items: center; + /*margin-bottom: 100px;*/ } .step-content-inside { width: 98%; height: 98%; - overflow-y: auto; } -.ekspName{ + +.ekspName { font-weight: bold; font-size: large; } - -.addedElement{ - color:var(--ns-accent); +.addedElement { + color: var(--ns-accent); } + .text-overflow { overflow-wrap: break-word; + width: 170px; + display: inline-block; + text-align: left; } + +.text-overflow-experiment-name { + overflow-wrap: break-word; +}
\ No newline at end of file diff --git a/frontend/src/app/_pages/experiment/experiment.component.html b/frontend/src/app/_pages/experiment/experiment.component.html index a2ede838..17a6539d 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.html +++ b/frontend/src/app/_pages/experiment/experiment.component.html @@ -1,47 +1,52 @@ <div class="container-fluid p-0 text-offwhite holder" style="height: calc(100vh - 64px); text-align: center;"> <div class="d-flex flex-colum align-items-center sidenav"> <div> - <div class="ekspName " style="width: 250px;"> - <div class="text-overflow" *ngIf="experiment.name=='exp1'" style="width: 250px;"> - Novi Eksperiment - </div> - <div class="text-overflow" *ngIf="experiment.name!='exp1'" style="width: 250px;"> - {{experiment.name}} - </div> + <div class="ekspName " style="width: 250px;"> + <div class="text-overflow-experiment-name" *ngIf="experiment.name=='exp1'" style="width: 250px;"> + Novi Eksperiment + </div> + <div class="text-overflow-experiment-name" *ngIf="experiment.name!='exp1'" style="width: 250px;"> + {{experiment.name}} + </div> - </div> - <mat-stepper orientation="vertical" (selectionChange)="changePage($event)"> - <mat-step> - <!--editable="false"--> - <ng-template matStepLabel> - <span class="label" *ngIf="dataset==undefined">Izvor podataka</span> - <span class="label addedElement" *ngIf="dataset!=undefined">{{dataset.name}}</span> - </ng-template> - <ng-template matStepContent> - <p class="text-left">Izaberite vas izvor podataka</p> - </ng-template> - </mat-step> - <mat-step> - <ng-template matStepLabel> - <span class="label addedElement" *ngIf="experiment.name!='exp1'">Predvideti:{{experiment.outputColumn}}</span> - <span class="label" *ngIf="experiment.name=='exp1'">Odabir kolona</span> - </ng-template> - <ng-template matStepContent> - <p class="text-left">Pripremite podatke i izaberite izlazne kolone</p> - </ng-template> - </mat-step> - <mat-step> - <ng-template matStepLabel> - <span class="label addedElement" *ngIf="modelToTrain!=undefined">{{modelToTrain.name}}</span> - <span class="label" *ngIf="modelToTrain==undefined">Treniranje</span> - </ng-template> - <p class="text-left">Odaberite parametre i trenirajte model</p> - </mat-step> - <mat-step> - <ng-template matStepLabel><span class="label">Pregled rezultata treniranja</span></ng-template> - <p class="text-left">Pregledajte tok treniranja i grafički prikaz rezultata</p> - </mat-step> - </mat-stepper> + </div> + <mat-stepper orientation="vertical" (selectionChange)="changePage($event)" [linear]="true"> + <mat-step [completed]="this.step1"> + <!--editable="false"--> + <ng-template matStepLabel> + <span class="label text-overflow" *ngIf="dataset==undefined">Izvor podataka </span> + <span class="label addedElement text-overflow" *ngIf="dataset!=undefined">{{dataset.name}}</span> + </ng-template> + <ng-template matStepContent> + <p class="text-left text-overflow">Izaberite izvor podataka</p> + </ng-template> + </mat-step> + <mat-step [completed]="experiment._id!=''"> + <ng-template matStepLabel> + <span class="label addedElement text-overflow" *ngIf="experiment._id!=''">Predvideti:{{experiment.outputColumn}}</span> + <span *ngIf="!this.step1" class="align-middle"><mat-icon>lock</mat-icon></span> + <span class="label text-overflow" *ngIf="experiment._id==''">Odabir kolona </span> + </ng-template> + <ng-template matStepContent> + <p class="text-left text-overflow">Pripremite podatke i izaberite izlazne kolone</p> + </ng-template> + </mat-step> + <mat-step [completed]="this.step3"> + <ng-template matStepLabel> + <span *ngIf="experiment._id==''" class="align-middle"><mat-icon>lock</mat-icon></span> + <span class="label addedElement text-overflow" *ngIf="modelToTrain!=undefined">{{modelToTrain.name}}</span> + <span class="label text-overflow" *ngIf="modelToTrain==undefined">Treniranje</span> + </ng-template> + <p class="text-left text-overflow">Odaberite parametre i trenirajte model</p> + </mat-step> + <mat-step [completed]="this.step4"> + <ng-template matStepLabel> + <span *ngIf="!this.step3" class="align-middle"><mat-icon>lock</mat-icon></span> + <span class="label text-overflow align-middle">Pregled rezultata<br> treniranja</span> + </ng-template> + <p class="text-left text-overflow">Pregledajte tok treniranja i<br> grafički prikaz rezultata</p> + </mat-step> + </mat-stepper> </div> </div> <div #stepsContainer class="steps-container"> @@ -50,20 +55,20 @@ <app-folder #folderDataset [type]="FolderType.Dataset" [forExperiment]="experiment" [startingTab]="TabType.NewFile" [tabsToShow]="[TabType.MyDatasets, TabType.PublicDatasets]" (okPressed)="goToPage(1)" (selectedFileChanged)="setDataset($event)"></app-folder> </div> </div> - <div #steps id="step_2" class="step-content"> + <div #steps id="step_2" class="step-content" *ngIf="step1"> <div class="step-content-inside"> <app-column-table (okPressed)="goToPage(2); experiment._columnsSelected = true;" (columnTableChanged)="columnTableChangedEvent()" (experimentChanged)="experimentChangedEvent()" [experiment]="experiment" [dataset]="dataset"></app-column-table> </div> </div> - <div #steps id="step_3" class="step-content"> + <div #steps id="step_3" class="step-content" *ngIf="step2"> <div class="step-content-inside"> <app-folder #folderModel [type]="FolderType.Model" [forExperiment]="experiment" [startingTab]="TabType.NewFile" [tabsToShow]="[TabType.MyModels]" (okPressed)="goToPage(3); trainModel();" (selectedFileChanged)="setModel($event)"></app-folder> </div> </div> - <div #steps id="step_4" class="step-content"> + <div #steps id="step_4" class="step-content" *ngIf="step3"> <div class="step-content-inside"> <app-metric-view #metricView></app-metric-view> </div> </div> </div> -</div> +</div>
\ No newline at end of file diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index abf4b697..398321f2 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,6 +12,9 @@ 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'; +import { PredictorsService } from 'src/app/_services/predictors.service'; @Component({ selector: 'app-experiment', @@ -32,7 +35,12 @@ export class ExperimentComponent implements AfterViewInit { @ViewChild("folderModel") folderModel!: FolderComponent; @ViewChild("metricView") metricView!: MetricViewComponent; - constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService, private signalRService: SignalRService) { + step1: boolean = false; + step2: boolean = false; + step3: boolean = false; + step4: boolean = false; + + constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService, private datasetsService: DatasetsService, private predictorsService: PredictorsService, private signalRService: SignalRService, private route: ActivatedRoute) { this.experiment = new Experiment("exp1"); } @@ -49,6 +57,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; } } @@ -82,11 +91,57 @@ 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); } }); } + + this.route.queryParams.subscribe(params => { + + let experimentId = this.route.snapshot.paramMap.get("id"); + let predictorId = this.route.snapshot.paramMap.get("predictorId"); + console.log("paramexp: ", experimentId, ", parampredictor: ", predictorId); + if (predictorId != null) { + this.predictorsService.getPredictor(predictorId!).subscribe((response) => { + let predictor = response; + //console.log("predictor: ", predictor); + this.experimentsService.getExperimentById(predictor.experimentId).subscribe((response) => { + this.experiment = response; + //console.log("experiment: ", this.experiment); + this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { + this.dataset = response; + //console.log("dataset: ", this.dataset); + this.folderDataset.forExperiment = this.experiment; + this.folderDataset.selectFile(this.dataset); //sad 3. i 4. korak da se ucitaju + + this.modelsService.getModelById(predictor.modelId).subscribe((response) => { + let model = response; + //console.log("model: ", model); + this.folderModel.formModel.newModel = model; + this.step3 = true; + let numOfEpochsArray = Array.from({length: model.epochs}, (_, i) => i + 1); + //console.log("metric view1:", this.metricView); + setTimeout(() => { + this.metricView.linechartComponent.update(numOfEpochsArray, predictor.metricsAcc, predictor.metricsLoss, predictor.metricsMae, predictor.metricsMse, predictor.metricsValAcc, predictor.metricsValLoss, predictor.metricsValMae, predictor.metricsValMse); + }) + }); + }); + }); + }); + } + else if (experimentId != null) { + this.experimentsService.getExperimentById(experimentId).subscribe((response) => { + this.experiment = response; + this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { + this.dataset = response; + this.folderDataset.forExperiment = this.experiment; + this.folderDataset.selectFile(this.dataset); + }); + }); + } + + }); } history: any[] = []; @@ -148,16 +203,27 @@ export class ExperimentComponent implements AfterViewInit { } experimentChangedEvent() { - this.folderModel.updateExperiment(); + this.step2 = true; + setTimeout(() => { + 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>dataset; this.experiment.datasetId = d._id; this.dataset = d; - this.columnTable.loadDataset(this.dataset); - + this.step1 = true; + setTimeout(() => { + this.columnTable.loadDataset(d); + }); } modelToTrain?: Model; @@ -165,5 +231,6 @@ export class ExperimentComponent implements AfterViewInit { setModel(model: FolderFile) { const m = <Model>model; this.modelToTrain = m; + this.step3 = true; } } |