aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/app/_elements
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/app/_elements')
-rw-r--r--frontend/src/app/_elements/_charts/line-chart/line-chart.component.css12
-rw-r--r--frontend/src/app/_elements/_charts/line-chart/line-chart.component.html26
-rw-r--r--frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts289
-rw-r--r--frontend/src/app/_elements/folder/folder.component.css9
-rw-r--r--frontend/src/app/_elements/folder/folder.component.html35
-rw-r--r--frontend/src/app/_elements/form-dataset/form-dataset.component.html8
-rw-r--r--frontend/src/app/_elements/metric-view/metric-view.component.html21
-rw-r--r--frontend/src/app/_elements/notifications/notifications.component.html2
8 files changed, 339 insertions, 63 deletions
diff --git a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css
index 2eea561e..7dbbde7a 100644
--- a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css
+++ b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css
@@ -1,11 +1,17 @@
canvas{
width:100% !important;
- height:90% !important;
+ height:100% !important;
border: 1px solid var(--ns-primary);
background-color: var(--ns-bg-dark-100);
border-radius: 5px;
- margin: 10px;
+ margin: 0;
font-size: 11 !important;
+ padding: 0;
}
- \ No newline at end of file
+.ns-col{
+ margin: 5px;
+}
+.hide{
+ display: none;
+}
diff --git a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html
index 1c711562..e36d0dcf 100644
--- a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html
+++ b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html
@@ -1,4 +1,24 @@
-<div #wrapper class="position-relative" style="width:100%;height:95%;">
- <canvas id="myChart" #canvas>
- </canvas>
+<div #wrapper class="position-relative " style="width:100%;height:95%;">
+ <div class="ns-row" [ngClass]="{'hide':experiment.type != ProblemType.Regression}">
+ <div class="ns-col" >
+ <canvas id="myChartmae" #canvasmae>
+ </canvas>
+ </div>
+ <div class="ns-col">
+ <canvas id="myChartmse" #canvasmse>
+ </canvas>
+ </div>
+ </div>
+ <div class="ns-row" [ngClass]="{'hide':experiment.type == ProblemType.Regression}">
+ <div class="ns-col" >
+ <canvas id="myChartloss" #canvasloss>
+ </canvas>
+ </div>
+ <div class="ns-col" >
+ <canvas id="myChartacc" #canvasacc>
+ </canvas>
+ </div>
+
+ </div>
+
</div> \ No newline at end of file
diff --git a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts
index 7d21129c..2b97d6b4 100644
--- a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts
+++ b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts
@@ -1,5 +1,7 @@
-import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core';
+import { Component, AfterViewInit, ElementRef, ViewChild, Input } from '@angular/core';
import { Chart } from 'chart.js';
+import Experiment from 'src/app/_data/Experiment';
+import Model, { ProblemType } from 'src/app/_data/Model';
@Component({
selector: 'app-line-chart',
@@ -23,14 +25,18 @@ export class LineChartComponent implements AfterViewInit {
wrapper!: ElementRef;
@ViewChild('canvas')
canvas!: ElementRef;
-
+ @Input() experiment!:Experiment;
constructor() {
}
width = 700;
height = 400;
-
- myChart!: Chart;
+ history: any[] = [];
+ myChartAcc!: Chart;
+ myChartMae!: Chart;
+ myChartMse!: Chart;
+ myChartLoss!: Chart;
+ ProblemType=ProblemType;
resize() {
this.width = this.wrapper.nativeElement.offsetWidth;
this.height = this.wrapper.nativeElement.offsetHeight;
@@ -69,14 +75,69 @@ export class LineChartComponent implements AfterViewInit {
this.dataValMSE.length = 0;
this.dataValMSE.push(...myValMse);
- this.myChart.update();
+ this.myChartAcc.update();
+ this.myChartLoss.update();
+ this.myChartMae.update();
+ this.myChartMse.update();
}
+ updateAll(history: any[],totalEpochs:number) {
+ const myAcc: number[] = [];
+ const myMae: number[] = [];
+ const myMse: number[] = [];
+ const myLoss: number[] = [];
+ const myValLoss: number[] = [];
+ const myValAcc: number[] = [];
+ const myValMAE: number[] = [];
+ const myValMSE: number[] = [];
+ const myEpochs: number[] = [];
+ this.history = history;
+ this.history.forEach((metrics, epoch) => {
+ 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];
+ if (key === 'accuracy') {
+ myAcc.push(parseFloat(value));
+ }
+ else if (key === 'loss') {
+ myLoss.push(parseFloat(value));
+ }
+ else if (key === 'mae') {
+ myMae.push(parseFloat(value));
+ }
+ else if (key === 'mse') {
+ myMse.push(parseFloat(value));
+ }
+ else if (key === 'val_acc') {
+ myValAcc.push(parseFloat(value));
+ }
+ else if (key === 'val_loss') {
+ myValLoss.push(parseFloat(value));
+ }
+ else if (key === 'val_mae') {
+ myValMAE.push(parseFloat(value));
+ }
+ else if (key === 'val_mse') {
+ myValMSE.push(parseFloat(value));
+ }
+ }
+ });
+
+ this.update(myEpochs, myAcc, myLoss, myMae, myMse, myValAcc,myValLoss,myValMAE,myValMSE);
+ }
ngAfterViewInit(): void {
window.addEventListener('resize', () => { this.resize() });
this.resize();
- this.myChart = new Chart("myChart",
+ this.myChartAcc = new Chart("myChartacc",
{
type: 'line',
data: {
@@ -92,7 +153,69 @@ export class LineChartComponent implements AfterViewInit {
label: 'Val_Accuracy',
data: this.dataValAcc,
borderWidth: 1
+ }
+ ]
+ },
+ options: {
+ responsive: true,
+ maintainAspectRatio: true,
+ plugins: {
+ legend: {
+ labels: {
+ // This more specific font property overrides the global property
+ color:'white',
+ font: {
+ size: 10
+ }
+ }
+ }
},
+ scales: {
+ x: {
+ ticks: {
+ color: 'white'
+ },
+ grid: {
+ color: "rgba(0, 99, 171, 0.5)"
+ },
+ title: {
+ display: true,
+ text: 'Epoha',
+ color:"white"
+ }
+ },
+ y: {
+ beginAtZero: true,
+ ticks: {
+ color: 'white'
+
+ },
+ grid: {
+ color: "rgba(0, 99, 171, 0.5)"
+ },
+ title: {
+ display: true,
+ text: 'Vrednost',
+ color:"white"
+ }
+ }
+
+ },
+ animation: {
+ duration: 0
+ }
+
+ }
+ },
+
+ );
+ if(this.experiment.type==ProblemType.BinaryClassification || this.experiment.type==ProblemType.MultiClassification){}
+ this.myChartLoss = new Chart("myChartloss",
+ {
+ type: 'line',
+ data: {
+ labels: this.dataEpoch,
+ datasets: [
{
label: 'Loss',
data: this.dataLOSS,
@@ -103,16 +226,68 @@ export class LineChartComponent implements AfterViewInit {
data: this.dataValLoss,
borderWidth: 1
},
- {
- label: 'MAE',
- data: this.dataMAE,
- borderWidth: 1
+ ]
+ },
+ options: {
+ responsive: true,
+ maintainAspectRatio: true,
+
+ plugins: {
+ legend: {
+ labels: {
+ // This more specific font property overrides the global property
+ color:'white',
+ font: {
+ size: 10
+ }
+ }
+ }
},
- {
- label: 'Val_MAE',
- data: this.dataValMAE,
- borderWidth: 1
+ scales: {
+ x: {
+ ticks: {
+ color: 'white'
+ },
+ grid: {
+ color: "rgba(0, 99, 171, 0.5)"
+ },
+ title: {
+ display: true,
+ text: 'Epoha',
+ color:"white"
+ }
+ },
+ y: {
+ beginAtZero: true,
+ ticks: {
+ color: 'white'
+
+ },
+ grid: {
+ color: "rgba(0, 99, 171, 0.5)"
+ },
+ title: {
+ display: true,
+ text: 'Vrednost',
+ color:"white"
+ }
+ }
+
},
+ animation: {
+ duration: 0
+ }
+
+ }
+ },
+
+ );
+ this.myChartMse = new Chart("myChartmse",
+ {
+ type: 'line',
+ data: {
+ labels: this.dataEpoch,
+ datasets: [
{
label: 'MSE',
data: this.dataMSE,
@@ -148,6 +323,11 @@ export class LineChartComponent implements AfterViewInit {
grid: {
color: "rgba(0, 99, 171, 0.5)"
},
+ title: {
+ display: true,
+ text: 'Epoha',
+ color:"white"
+ }
},
y: {
beginAtZero: true,
@@ -157,6 +337,11 @@ export class LineChartComponent implements AfterViewInit {
},
grid: {
color: "rgba(0, 99, 171, 0.5)"
+ },
+ title: {
+ display: true,
+ text: 'Vrednost',
+ color:"white"
}
}
@@ -166,8 +351,82 @@ export class LineChartComponent implements AfterViewInit {
}
}
- }
+ },
+
);
+ this.myChartMae = new Chart("myChartmae",
+ {
+ type: 'line',
+ data: {
+ labels: this.dataEpoch,
+ datasets: [
+ {
+ label: 'MAE',
+ data: this.dataMAE,
+ borderWidth: 1
+ },
+ {
+ label: 'Val_MAE',
+ data: this.dataValMAE,
+ borderWidth: 1
+ },
+ ]
+ },
+ options: {
+ responsive: true,
+ maintainAspectRatio: true,
+
+ plugins: {
+ legend: {
+ labels: {
+ // This more specific font property overrides the global property
+ color:'white',
+ font: {
+ size: 10
+ }
+ }
+ }
+ },
+ scales: {
+ x: {
+ ticks: {
+ color: 'white'
+ },
+ grid: {
+ color: "rgba(0, 99, 171, 0.5)"
+ },
+ title: {
+ display: true,
+ text: 'Epoha',
+ color:"white"
+ }
+ },
+ y: {
+ beginAtZero: true,
+ ticks: {
+ color: 'white'
+
+ },
+ grid: {
+ color: "rgba(0, 99, 171, 0.5)"
+ },
+ title: {
+ display: true,
+ text: 'Vrednost',
+ color:"white"
+ }
+ }
+
+ },
+ animation: {
+ duration: 0
+ }
+
+ }
+ },
+
+ );
+
}
}
diff --git a/frontend/src/app/_elements/folder/folder.component.css b/frontend/src/app/_elements/folder/folder.component.css
index fe21e7b1..dd984918 100644
--- a/frontend/src/app/_elements/folder/folder.component.css
+++ b/frontend/src/app/_elements/folder/folder.component.css
@@ -184,14 +184,19 @@
.file-bottom-buttons {
position: relative;
- position: relative;
- top: -36px
+ display: flex;
+ flex-direction: row-reverse;
+ height: 0;
+
}
+
.file-bottom-buttons-helper {
position: relative;
display: flex;
flex-direction: row-reverse;
+ width: fit-content;
+ height: 45px;
}
.file-button {
diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html
index 17ed02f8..34cd4693 100644
--- a/frontend/src/app/_elements/folder/folder.component.html
+++ b/frontend/src/app/_elements/folder/folder.component.html
@@ -77,10 +77,10 @@
</div>
<div class="mx-2 hover-show" *ngIf="selectedTab !== TabType.PublicDatasets && selectedTab !== TabType.PublicModels">
<button *ngIf="selectedTab==TabType.MyDatasets" class="btn-clear file-button" (click)="downloadFile(file,$event)" style="display: inline-block;">
- <mat-icon matTooltip="Preuzmi" matTooltipPosition="before">download</mat-icon>
+ <mat-icon matTooltip="Preuzmi" matTooltipPosition="above">download</mat-icon>
</button>
<button class="btn-clear file-button" (click)="deleteFile(file, $event)" style="display: inline-block;">
- <mat-icon matTooltip="Obriši" matTooltipPosition="right">delete</mat-icon>
+ <mat-icon matTooltip="Obriši" matTooltipPosition="above">delete</mat-icon>
</button>
</div>
<div class="mx-2 hover-show" *ngIf="selectedTab == TabType.PublicDatasets || selectedTab == TabType.PublicModels">
@@ -119,6 +119,21 @@
</div>
</div>
</div>
+ <div [ngSwitch]="newFileSelected" *ngIf="!listView">
+ <div class="file-bottom-buttons" *ngIf="selectedTab != TabType.NewFile">
+ <div class="file-bottom-buttons-helper">
+ <button *ngIf="this.selectedFile && selectedTab == TabType.File && privacy != Privacy.Public" class="btn-clear file-button" (click)="deleteFile(this.selectedFile, $event)">
+ <mat-icon matTooltip="Obriši" matTooltipPosition="above">delete</mat-icon>
+ </button>
+ <button *ngIf="this.selectedFile && selectedTab==TabType.File && FolderType.Dataset==this.type" class="btn-clear file-button" (click)="downloadFile(this.selectedFile,$event)" style="display: inline-block;">
+ <mat-icon matTooltip="Preuzmi" matTooltipPosition="above">download</mat-icon>
+ </button>
+ </div>
+ <!-- <button class="btn-clear file-button">
+ <mat-icon>zoom_out_map</mat-icon>
+ </button> -->
+ </div>
+ </div>
<div id="footer" [ngSwitch]="newFileSelected" *ngIf="!listView">
<button mat-button (click)="saveNewFile()" class="bottom-button text-offwhite rounded-bottom" [disabled]="saveDisabled" *ngSwitchCase="true">
<div class="f-row">
@@ -154,20 +169,6 @@
</button>
</ng-container>
</div>
- <div [ngSwitch]="newFileSelected" *ngIf="!listView">
- <div class="file-bottom-buttons" *ngIf="selectedTab != TabType.NewFile">
- <div class="file-bottom-buttons-helper">
- <button *ngIf="this.selectedFile && selectedTab == TabType.File && privacy != Privacy.Public" class="btn-clear file-button" (click)="deleteFile(this.selectedFile, $event)">
- <mat-icon matTooltip="Obriši" matTooltipPosition="right">delete</mat-icon>
- </button>
- <button *ngIf="this.selectedFile && selectedTab==TabType.File && FolderType.Dataset==this.type" class="btn-clear file-button" (click)="downloadFile(this.selectedFile,$event)" style="display: inline-block;">
- <mat-icon matTooltip="Preuzmi" matTooltipPosition="before">download</mat-icon>
- </button>
- </div>
- <!-- <button class="btn-clear file-button">
- <mat-icon>zoom_out_map</mat-icon>
- </button> -->
- </div>
- </div>
+
</div> \ No newline at end of file
diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html
index 6194a1a8..2a956128 100644
--- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html
+++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html
@@ -2,7 +2,11 @@
<div class="topBar">
<div class="kolona mb-3">
<div class="fileButton">
- <button type="button" mat-raised-button (click)="fileInput.click()"><span *ngIf="!firstInput">Dodaj izvor podataka</span><span *ngIf="firstInput">{{filename}}</span></button>
+ <button type="button" mat-raised-button (click)="fileInput.click()" [disabled]="dataset._id != ''" >
+ <span *ngIf="!firstInput && dataset._id == '' ">Dodaj izvor podataka</span>
+ <span *ngIf="firstInput && dataset._id == '' ">{{filename}}</span>
+ <span *ngIf="dataset._id != '' ">Fajl je odabran</span>
+ </button>
</div>
</div>
@@ -38,7 +42,7 @@
<i class="material-icons-outlined icon-display" [ngClass]="{'hidden': tableData.hasInput}">file_upload</i>
- <input class="file" id="file-upload" (change)="changeListener($event)" (valueChange)="dataset.isPreProcess = false; editEvent.emit()" #fileInput type="file" accept=".csv">
+ <input class="file" id="file-upload" [disabled]="dataset._id != ''" (change)="changeListener($event)" (valueChange)="dataset.isPreProcess = false; editEvent.emit()" #fileInput type="file" accept=".csv">
<div class="datatable">
<div [ngClass]="{'hidden': (!existingFlag)}" class="text-center">
diff --git a/frontend/src/app/_elements/metric-view/metric-view.component.html b/frontend/src/app/_elements/metric-view/metric-view.component.html
index 2ab0a425..139597f9 100644
--- a/frontend/src/app/_elements/metric-view/metric-view.component.html
+++ b/frontend/src/app/_elements/metric-view/metric-view.component.html
@@ -1,21 +1,2 @@
- <!--<div class="container" style="margin:auto;">
- <div class="row">
- <div class="col-xl">
- <div class="demo-content"><app-line-chart-acc [dataAcc]="myAcc" [dataEpoch]=""[dataValAcc]=""></app-line-chart-acc></div>
- </div>
- <div class="col-xl">
- <div class="demo-content"><app-line-chart-loss></app-line-chart-loss></div>
- </div>
- </div>
- <div class="row">
- <div class="col-xl">
- <div class="demo-content"><app-line-chart-mae></app-line-chart-mae></div>
- </div>
- <div class="col-xl">
- <div class="demo-content"><app-line-chart-mse></app-line-chart-mse></div>
- </div>
-</div>
-</div>-->
-<app-line-chart></app-line-chart>
-
+
diff --git a/frontend/src/app/_elements/notifications/notifications.component.html b/frontend/src/app/_elements/notifications/notifications.component.html
index 3b2f4eaa..d3218a96 100644
--- a/frontend/src/app/_elements/notifications/notifications.component.html
+++ b/frontend/src/app/_elements/notifications/notifications.component.html
@@ -1,4 +1,4 @@
-<div *ngIf="notifications && notifications.length > 0" class="position-fixed card card-body p-1 m-3" style="bottom: 0; right: 0; width: 18rem;">
+<div *ngIf="notifications && notifications.length > 0" class="position-fixed card card-body p-1 m-3" style="bottom: 0; right: 0; width: 18rem; z-index: 5000;">
<h2 class="m-auto" (click)="closed = !closed;" data-bs-toggle="collapse" href="#collapseNotifs" role="button" aria-expanded="true" aria-controls="collapseNotifs">
Notifikacije
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger">