aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/app/_pages/experiment
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/app/_pages/experiment')
-rw-r--r--frontend/src/app/_pages/experiment/experiment.component.css22
-rw-r--r--frontend/src/app/_pages/experiment/experiment.component.html93
-rw-r--r--frontend/src/app/_pages/experiment/experiment.component.ts81
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;
}
}