aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/app
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/app')
-rw-r--r--frontend/src/app/Shared.ts13
-rw-r--r--frontend/src/app/_data/Dataset.ts1
-rw-r--r--frontend/src/app/_data/Experiment.ts37
-rw-r--r--frontend/src/app/_data/Model.ts31
-rw-r--r--frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.html4
-rw-r--r--frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.ts86
-rw-r--r--frontend/src/app/_elements/dataset-load/dataset-load.component.html2
-rw-r--r--frontend/src/app/_elements/dataset-load/dataset-load.component.ts45
-rw-r--r--frontend/src/app/_elements/datatable/datatable.component.html70
-rw-r--r--frontend/src/app/_elements/datatable/datatable.component.ts18
-rw-r--r--frontend/src/app/_elements/item-dataset/item-dataset.component.css23
-rw-r--r--frontend/src/app/_elements/item-dataset/item-dataset.component.html53
-rw-r--r--frontend/src/app/_elements/item-dataset/item-dataset.component.ts27
-rw-r--r--frontend/src/app/_elements/item-experiment/item-experiment.component.css0
-rw-r--r--frontend/src/app/_elements/item-experiment/item-experiment.component.html10
-rw-r--r--frontend/src/app/_elements/item-experiment/item-experiment.component.spec.ts25
-rw-r--r--frontend/src/app/_elements/item-experiment/item-experiment.component.ts15
-rw-r--r--frontend/src/app/_elements/item-model/item-model.component.css23
-rw-r--r--frontend/src/app/_elements/item-model/item-model.component.html59
-rw-r--r--frontend/src/app/_elements/item-model/item-model.component.ts15
-rw-r--r--frontend/src/app/_elements/model-load/model-load.component.html49
-rw-r--r--frontend/src/app/_elements/model-load/model-load.component.ts5
-rw-r--r--frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.css0
-rw-r--r--frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.html8
-rw-r--r--frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.spec.ts25
-rw-r--r--frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.ts33
-rw-r--r--frontend/src/app/_pages/my-datasets/my-datasets.component.css8
-rw-r--r--frontend/src/app/_pages/my-datasets/my-datasets.component.html13
-rw-r--r--frontend/src/app/_pages/my-datasets/my-datasets.component.ts8
-rw-r--r--frontend/src/app/_pages/my-models/my-models.component.css12
-rw-r--r--frontend/src/app/_pages/my-models/my-models.component.html17
-rw-r--r--frontend/src/app/_pages/my-models/my-models.component.ts5
-rw-r--r--frontend/src/app/_pages/my-predictors/my-predictors.component.html2
-rw-r--r--frontend/src/app/_services/experiments.service.ts4
-rw-r--r--frontend/src/app/_services/models.service.ts4
-rw-r--r--frontend/src/app/app.module.ts4
-rw-r--r--frontend/src/app/experiment/experiment.component.html129
-rw-r--r--frontend/src/app/experiment/experiment.component.ts57
-rw-r--r--frontend/src/app/training/training.component.css2
-rw-r--r--frontend/src/app/training/training.component.html20
-rw-r--r--frontend/src/app/training/training.component.ts42
41 files changed, 684 insertions, 320 deletions
diff --git a/frontend/src/app/Shared.ts b/frontend/src/app/Shared.ts
index 7be29cbf..59a2716d 100644
--- a/frontend/src/app/Shared.ts
+++ b/frontend/src/app/Shared.ts
@@ -2,6 +2,7 @@ import { ElementRef } from "@angular/core";
import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { AlertDialogComponent } from './_modals/alert-dialog/alert-dialog.component';
+import { YesNoDialogComponent } from './_modals/yes-no-dialog/yes-no-dialog.component';
class Shared {
constructor(
@@ -26,6 +27,18 @@ class Shared {
});
}
}
+ openYesNoDialog(title: string, message: string,yesFunction:Function): void {
+
+ if (this.dialog) {
+ const dialogRef = this.dialog.open(YesNoDialogComponent, {
+ width: '350px',
+ data: { title: title, message: message,yesFunction}
+ });
+ dialogRef.afterClosed().subscribe(res => {
+ //nesto
+ });
+ }
+ }
}
export default new Shared(false); \ No newline at end of file
diff --git a/frontend/src/app/_data/Dataset.ts b/frontend/src/app/_data/Dataset.ts
index 87f27d12..732d1c56 100644
--- a/frontend/src/app/_data/Dataset.ts
+++ b/frontend/src/app/_data/Dataset.ts
@@ -15,6 +15,7 @@ export default class Dataset {
public hasHeader: boolean = true,
public columnInfo: ColumnInfo[] = [],
+ public rowCount: number = 0,
public nullRows: number = 0,
public nullCols: number = 0,
public preview: string[][] = [[]]
diff --git a/frontend/src/app/_data/Experiment.ts b/frontend/src/app/_data/Experiment.ts
index a5aad218..453f6ca0 100644
--- a/frontend/src/app/_data/Experiment.ts
+++ b/frontend/src/app/_data/Experiment.ts
@@ -2,7 +2,7 @@ export default class Experiment {
_id: string = '';
uploaderId: string = '';
constructor(
- public name: string = 'Novi experiment',
+ public name: string = 'Novi eksperiment',
public description: string = '',
public datasetId: string = '',
public inputColumns: string[] = [],
@@ -10,7 +10,16 @@ export default class Experiment {
public nullValues: NullValueOptions = NullValueOptions.DeleteRows,
public nullValuesReplacers: NullValReplacer[] = [],
public dateCreated: Date = new Date(),
- public lastUpdated: Date = new Date()
+ public lastUpdated: Date = new Date(),
+ public modelIds: string[] = [],
+
+ // Test set settings
+ public randomOrder: boolean = true,
+ public randomTestSet: boolean = true,
+ public randomTestSetDistribution: number = 0.1, //0.1-0.9 (10% - 90%) JESTE OVDE ZAKUCANO 10, AL POSLATO JE KAO 0.1 BACK-U
+
+ //TODO - za svaku kolonu se bira enkoding
+ public encoding: Encoding = Encoding.Label
) { }
}
@@ -32,4 +41,28 @@ export class NullValReplacer {
"column": string;
"option": NullValueOptions;
"value": string;
+}
+
+export enum Encoding {
+ Label = 'label',
+ OneHot = 'onehot',
+ Ordinal = 'ordinal',
+ Hashing = 'hashing',
+ Binary = 'binary',
+ BaseN = 'baseN'
+ /*
+ BackwardDifference = 'backward difference',
+ CatBoost = 'cat boost',
+ Count = 'count',
+ GLMM = 'glmm',
+ Target = 'target',
+ Helmert = 'helmert',
+ JamesStein = 'james stein',
+ LeaveOneOut = 'leave one out',
+ MEstimate = 'MEstimate',
+ Sum = 'sum',
+ Polynomial = 'polynomial',
+ WOE = 'woe',
+ Quantile = 'quantile'
+ */
} \ No newline at end of file
diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts
index 9ea437b1..8a85e296 100644
--- a/frontend/src/app/_data/Model.ts
+++ b/frontend/src/app/_data/Model.ts
@@ -7,16 +7,10 @@ export default class Model {
public description: string = '',
public dateCreated: Date = new Date(),
public lastUpdated: Date = new Date(),
- public experimentId: string = '',
-
- // Test set settings
- public randomOrder: boolean = true,
- public randomTestSet: boolean = true,
- public randomTestSetDistribution: number = 0.1, //0.1-0.9 (10% - 90%) JESTE OVDE ZAKUCANO 10, AL POSLATO JE KAO 0.1 BACK-U
+ //public experimentId: string = '',
// Neural net training settings
public type: ProblemType = ProblemType.Regression,
- public encoding: Encoding = Encoding.Label,
public optimizer: Optimizer = Optimizer.Adam,
public lossFunction: LossFunction = LossFunction.MeanSquaredError,
public inputNeurons: number = 1,
@@ -39,29 +33,6 @@ export enum ProblemType {
// replaceMissing srednja vrednost mean, median, najcesca vrednost (mode)
// removeOutliers
-export enum Encoding {
- Label = 'label',
- OneHot = 'onehot',
- Ordinal = 'ordinal',
- Hashing = 'hashing',
- Binary = 'binary',
- BaseN = 'baseN'
- /*
- BackwardDifference = 'backward difference',
- CatBoost = 'cat boost',
- Count = 'count',
- GLMM = 'glmm',
- Target = 'target',
- Helmert = 'helmert',
- JamesStein = 'james stein',
- LeaveOneOut = 'leave one out',
- MEstimate = 'MEstimate',
- Sum = 'sum',
- Polynomial = 'polynomial',
- WOE = 'woe',
- Quantile = 'quantile'
- */
-}
export enum ActivationFunction {
// linear
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 eb68b54c..bff8b022 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
@@ -41,9 +41,9 @@
</div>
<div class="px-5 mt-5">
- <app-datatable [data]="csvRecords" [hasHeader]="dataset.hasHeader"></app-datatable>
+ <app-datatable [tableData]="tableData"></app-datatable>
</div>
-<div class="d-flex flex-row align-items-center justify-content-center w-100">
+<div class="d-flex flex-row align-items-center justify-content-center w-100 my-2">
<button (click)="uploadDataset()" class="btn btn-lg col-4" style="background-color:#003459; color:white;">Dodaj izvor podataka</button>
</div>
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 7421fbcf..3adc16f3 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
@@ -4,7 +4,8 @@ import Dataset from 'src/app/_data/Dataset';
import { DatasetsService } from 'src/app/_services/datasets.service';
import { ModelsService } from 'src/app/_services/models.service';
import shared from 'src/app/Shared';
-import { DatatableComponent } from '../datatable/datatable.component';
+import { DatatableComponent, TableData } from '../datatable/datatable.component';
+import { CsvParseService } from 'src/app/_services/csv-parse.service';
@Component({
selector: 'app-add-new-dataset',
@@ -14,13 +15,10 @@ import { DatatableComponent } from '../datatable/datatable.component';
export class AddNewDatasetComponent {
@Output() newDatasetAdded = new EventEmitter<string>();
- @ViewChild(DatatableComponent) datatable?: DatatableComponent;
+ @ViewChild(DatatableComponent) datatable!: DatatableComponent;
delimiterOptions: Array<string> = [",", ";", "\t", "razmak", "|"]; //podrazumevano ","
- //hasHeader: boolean = true;
- hasInput: boolean = false;
-
csvRecords: any[] = [];
files: File[] = [];
rowsNumber: number = 0;
@@ -28,7 +26,9 @@ export class AddNewDatasetComponent {
dataset: Dataset; //dodaj ! potencijalno
- constructor(private ngxCsvParser: NgxCsvParser, private modelsService: ModelsService, private datasetsService: DatasetsService) {
+ tableData: TableData = new TableData();
+
+ constructor(private modelsService: ModelsService, private datasetsService: DatasetsService, private csv: CsvParseService) {
this.dataset = new Dataset();
}
@@ -39,12 +39,13 @@ export class AddNewDatasetComponent {
if (this.files.length == 0 || this.files[0] == null) {
//console.log("NEMA FAJLA");
//this.loaded.emit("not loaded");
- this.hasInput = false;
+ this.tableData.hasInput = false;
return;
}
else
- this.hasInput = true;
+ this.tableData.hasInput = true;
+ this.tableData.loaded = false;
this.update();
}
@@ -53,34 +54,27 @@ export class AddNewDatasetComponent {
if (this.files.length < 1)
return;
- this.datatable!.loaded = false;
- this.datatable!.hasInput = this.hasInput;
-
- this.ngxCsvParser.parse(this.files[0], { header: false, delimiter: (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "") ? "," : this.dataset.delimiter })
- .pipe().subscribe((result) => {
-
- console.log('Result', result);
- if (result.constructor === Array) {
- if(this.dataset.hasHeader)
- this.csvRecords = result.splice(0,11);
- else
- this.csvRecords=result.splice(0,10);
- if (this.dataset.hasHeader)
- this.rowsNumber = this.csvRecords.length - 1;
- else
- this.rowsNumber = this.csvRecords.length;
- this.colsNumber = this.csvRecords[0].length;
-
- if (this.dataset.hasHeader)
- this.dataset.header = this.csvRecords[0];
-
- this.datatable!.data = this.csvRecords;
- this.datatable!.hasHeader = this.dataset.hasHeader;
- this.datatable!.loaded = true;
- }
- }, (error: NgxCSVParserError) => {
- console.log('Error', error);
- });
+ 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)
+
+ if (this.dataset.hasHeader)
+ this.csvRecords = result.splice(0, 11);
+ else
+ this.csvRecords = result.splice(0, 10);
+
+ this.colsNumber = result[0].length;
+ this.rowsNumber = result.length;
+
+ this.tableData.data = this.csvRecords
+ this.tableData.hasHeader = this.dataset.hasHeader;
+ this.tableData.loaded = true;
+ this.tableData.numCols = this.colsNumber;
+ this.tableData.numRows = this.rowsNumber;
+ }
+ }
+ fileReader.readAsText(this.files[0]);
}
checkAccessible() {
@@ -96,17 +90,17 @@ export class AddNewDatasetComponent {
this.modelsService.uploadData(this.files[0]).subscribe((file) => {
//console.log('ADD MODEL: STEP 2 - ADD DATASET WITH FILE ID ' + file._id);
- this.dataset.fileId = file._id;
- this.dataset.username = shared.username;
-
- 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.");
- }); //kraj addDataset subscribe
+ this.dataset.fileId = file._id;
+ this.dataset.username = shared.username;
+
+ 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.");
+ }); //kraj addDataset subscribe
}, (error) => {
-
+
}); //kraj uploadData subscribe
}
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 09487b3b..6ab58021 100644
--- a/frontend/src/app/_elements/dataset-load/dataset-load.component.html
+++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.html
@@ -30,7 +30,7 @@
</ul>
</div>
<div class="px-5 mt-5">
- <app-datatable [data]="datasetFile" [hasHeader]="datasetHasHeader"></app-datatable>
+ <app-datatable [tableData]="tableData"></app-datatable>
</div>
</div>
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 7329033c..dc78ab77 100644
--- a/frontend/src/app/_elements/dataset-load/dataset-load.component.ts
+++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts
@@ -3,7 +3,7 @@ import { AddNewDatasetComponent } from '../add-new-dataset/add-new-dataset.compo
import { ModelsService } from 'src/app/_services/models.service';
import shared from 'src/app/Shared';
import Dataset from 'src/app/_data/Dataset';
-import { DatatableComponent } from 'src/app/_elements/datatable/datatable.component';
+import { DatatableComponent, TableData } from 'src/app/_elements/datatable/datatable.component';
import { DatasetsService } from 'src/app/_services/datasets.service';
import { CsvParseService } from 'src/app/_services/csv-parse.service';
import { Output, EventEmitter } from '@angular/core';
@@ -17,8 +17,8 @@ export class DatasetLoadComponent {
@Output() selectedDatasetChangeEvent = new EventEmitter<Dataset>();
- @ViewChild(AddNewDatasetComponent) addNewDatasetComponent?: AddNewDatasetComponent;
- @ViewChild(AddNewDatasetComponent) datatable?: DatatableComponent;
+ @ViewChild(AddNewDatasetComponent) addNewDatasetComponent!: AddNewDatasetComponent;
+ @ViewChild(AddNewDatasetComponent) datatable!: DatatableComponent;
datasetLoaded: boolean = false;
selectedDatasetLoaded: boolean = false;
@@ -27,10 +27,8 @@ export class DatasetLoadComponent {
myDatasets?: Dataset[];
existingDatasetSelected: boolean = false;
selectedDataset?: Dataset;
- otherDataset?: Dataset;
- otherDatasetFile?: any[];
- datasetFile?: any[];
- datasetHasHeader?: boolean = true;
+
+ tableData: TableData = new TableData();
term: string = "";
@@ -63,27 +61,20 @@ export class DatasetLoadComponent {
this.selectedDataset = dataset;
this.selectedDatasetLoaded = false;
this.existingDatasetSelected = true;
- this.datasetHasHeader = this.selectedDataset.hasHeader;
+ this.tableData.hasHeader = this.selectedDataset.hasHeader;
+
+ this.tableData.hasInput = true;
+ this.tableData.loaded = false;
this.datasets.getDatasetFile(dataset.fileId).subscribe((file: string | undefined) => {
if (file) {
- console.log(file);
- this.datatable!.hasInput = true;
- this.datatable!.loaded = true;
- this.datasetFile = this.csv.csvToArray(file, (dataset.delimiter == "razmak") ? " " : (dataset.delimiter == "") ? "," : dataset.delimiter);
- /*for (let i = this.datasetFile.length - 1; i >= 0; i--) { //moguce da je vise redova na kraju fajla prazno i sl.
- if (this.datasetFile[i].length != this.datasetFile[0].length)
- this.datasetFile[i].pop();
- else
- break; //nema potrebe dalje
- }*/
- console.log(this.datatable!.data);
- console.log(this.datasetFile);
- console.log(this.datatable!.hasInput);
+ this.tableData.loaded = true;
+ this.tableData.numRows = this.selectedDataset!.rowCount;
+ this.tableData.numCols = this.selectedDataset!.columnInfo.length;
+ this.tableData.data = this.csv.csvToArray(file, (dataset.delimiter == "razmak") ? " " : (dataset.delimiter == "") ? "," : dataset.delimiter);
//this.resetCbsAndRbs(); //TREBA DA SE DESI
//this.refreshThreeNullValueRadioOptions(); //TREBA DA SE DESI
this.selectedDatasetLoaded = true;
- //this.scrollToNextForm();
this.selectedDatasetChangeEvent.emit(this.selectedDataset);
}
@@ -91,17 +82,7 @@ export class DatasetLoadComponent {
}
resetSelectedDataset(): boolean {
- const temp = this.selectedDataset;
- this.selectedDataset = this.otherDataset;
- this.otherDataset = temp;
- const tempFile = this.datasetFile;
- this.datasetFile = this.otherDatasetFile;
- this.otherDatasetFile = tempFile;
-
this.selectedDatasetChangeEvent.emit(this.selectedDataset);
-
return true;
}
-
-
}
diff --git a/frontend/src/app/_elements/datatable/datatable.component.html b/frontend/src/app/_elements/datatable/datatable.component.html
index b6cbd303..8db62aff 100644
--- a/frontend/src/app/_elements/datatable/datatable.component.html
+++ b/frontend/src/app/_elements/datatable/datatable.component.html
@@ -1,39 +1,43 @@
-PRE IFA
-{{hasInput}}
-<div *ngIf="data && hasInput">
- PROSLO IF
- <div class="table-responsive" style="height: 34rem; overflow: auto; border-radius: 5px;" class="mh-5">
- <div *ngIf="!loaded" style="background-color: #003459; width: 100%; height: 100%;"
+<div *ngIf="tableData.hasInput">
+ <div>
+ <div *ngIf="!tableData.loaded" backgroundColor="secondary" style="width: 100%; height: 100%;"
class="d-flex justify-content-center align-items-center">
<app-loading></app-loading>
</div>
- <div *ngIf="loaded">
- <table *ngIf="data.length > 0 && hasHeader && data[0].length > 0" class="table table-bordered table-light">
- <thead>
- <tr>
- <th *ngFor="let item of data[0]; let i = index">{{item}}</th>
- </tr>
- </thead>
- <tbody>
- <tr *ngFor="let row of data | slice:1">
- <td *ngFor="let col of row">{{col}}</td>
- </tr>
- </tbody>
- </table>
-
- <table *ngIf="data.length > 0 && !hasHeader && data[0].length > 0" class="table table-bordered table-light">
- <tbody>
- <tr *ngFor="let row of data">
- <td *ngFor="let col of row">{{col}}</td>
- </tr>
- </tbody>
- </table>
+ <div *ngIf="tableData.loaded && tableData.data">
+ <div id="info" *ngIf="tableData.data.length > 0 && tableData.data[0].length > 0"
+ class="d-flex flex-row justify-content-center align-items-center">
+ <div class="fs-5 mb-3">
+ Tabela {{tableData.numCols}}x{{tableData.numRows}}
+ </div>
+ </div>
+ <div class="table-responsive" style="overflow: auto; border-radius: 5px;">
+ <table *ngIf="tableData.data.length > 0 && tableData.hasHeader && tableData.data[0].length > 0" class="table table-bordered table-light">
+ <thead>
+ <tr>
+ <th *ngFor="let item of tableData.data[0]; let i = index">{{item}}</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr *ngFor="let row of tableData.data | slice:1">
+ <td *ngFor="let col of row">{{col}}</td>
+ </tr>
+ <tr>
+ <td colspan="100" class="text-lg-center fs-6">+ {{tableData.numRows - 11}} redova...</td>
+ </tr>
+ </tbody>
+ </table>
+ <table *ngIf="tableData.data.length > 0 && !tableData.hasHeader && tableData.data[0].length > 0" class="table table-bordered table-light">
+ <tbody>
+ <tr *ngFor="let row of tableData.data">
+ <td *ngFor="let col of row">{{col}}</td>
+ </tr>
+ <tr>
+ <td colspan="100" class="text-lg-center fs-6">+ {{tableData.numRows - 10}} redova...</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
</div>
</div>
-
- <div id="info" *ngIf="data.length > 0 && data[0].length > 0">
- <br>
- <span *ngIf="hasHeader">{{data.length - 1}} x {{data[0].length}}</span>
- <span *ngIf="!hasHeader">{{data.length}} x {{data[0].length}}</span>
- </div>
</div> \ No newline at end of file
diff --git a/frontend/src/app/_elements/datatable/datatable.component.ts b/frontend/src/app/_elements/datatable/datatable.component.ts
index 19fb204e..82374f4d 100644
--- a/frontend/src/app/_elements/datatable/datatable.component.ts
+++ b/frontend/src/app/_elements/datatable/datatable.component.ts
@@ -7,12 +7,7 @@ import { Component, Input, OnInit } from '@angular/core';
})
export class DatatableComponent implements OnInit {
- @Input() hasHeader?: boolean = true;
-
- @Input() data?: any[] = [];
-
- hasInput = false;
- loaded = false;
+ @Input() tableData!: TableData;
constructor() { }
@@ -20,3 +15,14 @@ export class DatatableComponent implements OnInit {
}
}
+
+export class TableData {
+ constructor(
+ public hasHeader = true,
+ public hasInput = false,
+ public loaded = false,
+ public numRows = 0,
+ public numCols = 0,
+ public data?: any[][]
+ ) { }
+}
diff --git a/frontend/src/app/_elements/item-dataset/item-dataset.component.css b/frontend/src/app/_elements/item-dataset/item-dataset.component.css
index e69de29b..dc851671 100644
--- a/frontend/src/app/_elements/item-dataset/item-dataset.component.css
+++ b/frontend/src/app/_elements/item-dataset/item-dataset.component.css
@@ -0,0 +1,23 @@
+.card{
+ margin-top:0;
+ padding: 0;
+}
+.p-2{
+ margin: 0;
+ padding: 0;
+}
+hr{
+ margin: 0;
+ padding: 0;
+}
+b{
+ margin-left: 5px;
+ margin-right: 10px;
+}
+th{
+ margin: 10px;
+ padding: 10px;
+}
+p{
+ text-align: justify;
+} \ No newline at end of file
diff --git a/frontend/src/app/_elements/item-dataset/item-dataset.component.html b/frontend/src/app/_elements/item-dataset/item-dataset.component.html
index dc4221f4..11ff61c3 100644
--- a/frontend/src/app/_elements/item-dataset/item-dataset.component.html
+++ b/frontend/src/app/_elements/item-dataset/item-dataset.component.html
@@ -1,16 +1,41 @@
<div class="card" style="min-width: 12rem;">
- <div class="card-header">
- {{dataset.name}}
+<div class="card-header d-flex mb-2 justify-content-" style="padding: 0;margin: 0;">
+
+ <div class=" p-2 float-left "><b style="color: gray;">Naziv</b></div>
+ <div class=" p-2 float-left"><b>{{dataset.name}}</b></div>
+</div>
+<div class="card-body overflow-hidden">
+ <b style="color: gray;">Opis</b>
+ <hr style="width: 20%;"> <p> {{dataset.description}}</p>
+ <hr>
+ <div class="d-flex justify-content-center">
+ <div class=" p-2" >
+ <h4><span class="badge bg-secondary">{{dataset.extension}}</span></h4>
+ </div>
+ <div class="p-2">
+ <span class="material-icons">{{visibleicon}}</span>
+ </div>
+ <div class="p-2">
+ <span class="material-icons">{{accessibleicon}}</span>
+ </div>
</div>
- <div class="card-body overflow-hidden">
- <p class="card-text">
- {{dataset.description}}
- </p>
- <table class="table table-bordered table-sm">
- <thead>
- <th scope="col" *ngFor="let column of dataset.header">{{column}}</th>
- <!-- treba da se namesti da kad nema hedere, da korisnik unese nazive kolona pa da se taj heder prikaze -->
- </thead>
- </table>
- </div>
-</div> \ No newline at end of file
+ <hr>
+ <div class="col text-center">
+<button (click)=toggleDisplayDiv() class="btn btn-primary btn-sm active " mat-raised-button color="primary" style="margin: 0.5rem;">Kolone</button>
+ <div [hidden]="isShowDiv" style="overflow: scroll; overflow-y: hidden;">
+ <table class="table table-bordered table-md" >
+ <thead>
+ <th scope="col" *ngFor="let column of dataset.columnInfo" >{{column.columnName}}</th>
+ </thead>
+ </table>
+ </div>
+</div>
+ <table>
+ <tr><td><span class="material-icons">calendar_today</span></td><td><span style="color: grey;"> <b> Kreirano</b></span></td><td>{{dataset.dateCreated |date}}</td></tr>
+ <tr><td><span class="material-icons">edit_calendar</span></td><td><span style="color: grey;"> <b> Poslednja izmena</b></span></td><td>{{dataset.lastUpdated |date}}</td></tr>
+ </table>
+
+</div>
+<div class="card-footer">
+
+ </div> \ No newline at end of file
diff --git a/frontend/src/app/_elements/item-dataset/item-dataset.component.ts b/frontend/src/app/_elements/item-dataset/item-dataset.component.ts
index e12de34d..44b95310 100644
--- a/frontend/src/app/_elements/item-dataset/item-dataset.component.ts
+++ b/frontend/src/app/_elements/item-dataset/item-dataset.component.ts
@@ -9,7 +9,32 @@ import Dataset from 'src/app/_data/Dataset';
export class ItemDatasetComponent {
@Input() dataset: Dataset = new Dataset();
-
+ visibleicon='';
+ accessibleicon='';
+ isShowDiv = true;
+ toggleDisplayDiv() {
+ this.isShowDiv = !this.isShowDiv;
+ }
constructor() {
}
+ ngOnInit(): void {
+ if(this.dataset.isPublic==true)
+ {
+ this.visibleicon='visibility'
+ }
+ else
+ {
+ this.visibleicon='visibility_off';
+ }
+
+ if(this.dataset.accessibleByLink==true)
+ {
+ this.accessibleicon='link'
+ }
+ else
+ {
+ this.accessibleicon='link_off';
+ }
+ }
}
+
diff --git a/frontend/src/app/_elements/item-experiment/item-experiment.component.css b/frontend/src/app/_elements/item-experiment/item-experiment.component.css
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/frontend/src/app/_elements/item-experiment/item-experiment.component.css
diff --git a/frontend/src/app/_elements/item-experiment/item-experiment.component.html b/frontend/src/app/_elements/item-experiment/item-experiment.component.html
new file mode 100644
index 00000000..51fbfef3
--- /dev/null
+++ b/frontend/src/app/_elements/item-experiment/item-experiment.component.html
@@ -0,0 +1,10 @@
+<div class="card" style="min-width: 12rem;">
+ <div class="card-header">
+ Naziv eksperimenta: <b>{{experiment.name}}</b>
+ </div>
+ <div class="card-body overflow-hidden">
+ <p class="card-text">
+ Opis: {{experiment.description}}
+ </p>
+ </div>
+</div> \ No newline at end of file
diff --git a/frontend/src/app/_elements/item-experiment/item-experiment.component.spec.ts b/frontend/src/app/_elements/item-experiment/item-experiment.component.spec.ts
new file mode 100644
index 00000000..1da7d05d
--- /dev/null
+++ b/frontend/src/app/_elements/item-experiment/item-experiment.component.spec.ts
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ItemExperimentComponent } from './item-experiment.component';
+
+describe('ItemExperimentComponent', () => {
+ let component: ItemExperimentComponent;
+ let fixture: ComponentFixture<ItemExperimentComponent>;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ declarations: [ ItemExperimentComponent ]
+ })
+ .compileComponents();
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(ItemExperimentComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/frontend/src/app/_elements/item-experiment/item-experiment.component.ts b/frontend/src/app/_elements/item-experiment/item-experiment.component.ts
new file mode 100644
index 00000000..31900d35
--- /dev/null
+++ b/frontend/src/app/_elements/item-experiment/item-experiment.component.ts
@@ -0,0 +1,15 @@
+import { Component, Input, OnInit } from '@angular/core';
+import Experiment from 'src/app/_data/Experiment';
+
+@Component({
+ selector: 'app-item-experiment',
+ templateUrl: './item-experiment.component.html',
+ styleUrls: ['./item-experiment.component.css']
+})
+export class ItemExperimentComponent{
+
+ @Input() experiment: Experiment = new Experiment();
+
+ constructor() { }
+
+}
diff --git a/frontend/src/app/_elements/item-model/item-model.component.css b/frontend/src/app/_elements/item-model/item-model.component.css
index e69de29b..5ea24c72 100644
--- a/frontend/src/app/_elements/item-model/item-model.component.css
+++ b/frontend/src/app/_elements/item-model/item-model.component.css
@@ -0,0 +1,23 @@
+.card{
+ margin: 0.5rem;
+ padding: 0;
+}
+.p-2{
+ margin: 0;
+ padding: 0;
+}
+hr{
+ margin: 0;
+ padding: 0;
+}
+b{
+ margin-left: 5px;
+ margin-right: 10px;
+}
+th{
+ margin: 10px;
+ padding: 10px;
+}
+p{
+ text-align: justify;
+} \ No newline at end of file
diff --git a/frontend/src/app/_elements/item-model/item-model.component.html b/frontend/src/app/_elements/item-model/item-model.component.html
index 695c580e..447f023e 100644
--- a/frontend/src/app/_elements/item-model/item-model.component.html
+++ b/frontend/src/app/_elements/item-model/item-model.component.html
@@ -1,13 +1,58 @@
<div class="card" style="min-width: 12rem;">
- <div class="card-header">
- {{model.name}}
+ <div class="card-header d-flex mb-2 justify-content-" style="padding: 0;margin: 0;">
+
+ <div class=" p-2 float-left "><b style="color: gray;">Naziv</b></div>
+ <div class=" p-2 float-left"><b>{{model.name}}</b></div>
</div>
- <div class="card-body overflow-hidden">
+ <div class="card-body overflow-hidden">
+ <app-graph [model]="model"></app-graph>
+ <br>
+ <b style="color: gray;">Opis</b><hr style="width: 20%;">
<p class="card-text">
- {{"Opis: "+ model.description}}<br>
- {{"Datum kreiranja: " + model.dateCreated}}<br>
- {{"Poslednje ažuriranje: " + model.lastUpdated}}<br>
+ {{model.description}}
</p>
- <app-graph [model]="model"></app-graph>
+ <hr>
+
+ <div>
+ <table>
+ <tr><td><span class="material-icons">calendar_today</span></td><td><span style="color: grey;"> <b> Kreirano</b></span></td><td>{{model.dateCreated |date}}</td></tr>
+ <tr><td><span class="material-icons">edit_calendar</span></td><td><span style="color: grey;"> <b> Poslednja izmena</b></span></td><td>{{model.lastUpdated |date}}</td></tr>
+ </table>
+ </div>
+
</div>
+ <button (click)=toggleDisplayDiv() class="btn btn-default btn-lg " mat-raised-button color="primary" style="margin: 0.5rem;">Parametri</button>
+ <div [hidden]="isShowDiv">
+ <!-- <table>
+ <tr>
+ <td><span style="color: grey;"> <b> Nasumično raspoređivanje podataka</b></span></td><td>{{randomOrd}}</td>
+ </tr>
+ <tr>
+ <td><span style="color: grey;"> <b> Podela podataka na trening i test skup</b></span></td><td>{{randomOrd}}</td>
+ </tr>
+ <tr>
+ <td><span style="color: grey;"> <b> Veličina skupa za treniranje</b></span></td><td>{{randomOrd}}</td>
+ </tr>
+ </table>-->
+ <hr>
+ <table>
+ <tr>
+ <td><span style="color: grey;"> <b> Tip problema</b></span></td><td>{{model.type}}</td>
+ </tr>
+ <tr>
+ <td><span style="color: grey;"> <b> Optimizator</b></span></td><td>{{model.optimizer}}</td>
+ </tr>
+ <tr>
+ <td> <span style="color: grey;"> <b> Funkcija gubitka</b></span></td><td>{{model.lossFunction}}</td>
+ </tr>
+ <tr>
+ <td><span style="color: grey;"> <b> Batch size</b></span></td><td>{{model.batchSize}}</td>
+ </tr>
+ <tr>
+ <td><span style="color: grey;"> <b> Broj epoha</b></span></td><td>{{model.epochs}}</td>
+ </tr>
+
+ </table>
+
+ </div>
</div> \ No newline at end of file
diff --git a/frontend/src/app/_elements/item-model/item-model.component.ts b/frontend/src/app/_elements/item-model/item-model.component.ts
index 7f85f43f..b837667b 100644
--- a/frontend/src/app/_elements/item-model/item-model.component.ts
+++ b/frontend/src/app/_elements/item-model/item-model.component.ts
@@ -9,10 +9,25 @@ import Model from 'src/app/_data/Model';
export class ItemModelComponent implements OnInit {
@Input() model: Model = new Model();
+ isShowDiv = true;
+ randomOrd='';
+ toggleDisplayDiv() {
+ this.isShowDiv = !this.isShowDiv;
+ }
+
constructor() { }
ngOnInit(): void {
+ /*if(this.model.randomOrder)
+ {
+ this.randomOrd='Da';
+ }
+ else
+ {
+ this.randomOrd='Ne';
+ }
+*/
}
}
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 0923c895..833b7181 100644
--- a/frontend/src/app/_elements/model-load/model-load.component.html
+++ b/frontend/src/app/_elements/model-load/model-load.component.html
@@ -85,18 +85,6 @@
<div class="row p-2">
<div class="col-1">
</div>
- <div class="col-3">
- <label for="encoding" class="col-form-label">Enkoding: </label>
- </div>
- <div class="col-2">
- <select id=encodingOptions class="form-control" name="encoding" [(ngModel)]="newModel.encoding">
- <option *ngFor="let option of Object.keys(Encoding); let optionName of Object.values(Encoding)"
- [value]="option">
- {{ optionName }}
- </option>
- </select>
- </div>
-
<div class="col-1">
</div>
<div class="col-3">
@@ -149,43 +137,6 @@
</select>
</div>
<div class="col-1"></div>
- <div class="col-3 mt-2">
- <label for="type" class="form-check-label">Nasumičan redosled podataka?</label>
- <input class="mx-3 form-check-input" type="checkbox" [(ngModel)]="newModel.randomOrder"
- type="checkbox" value="" checked>
- </div>
- </div>
- <div class="border m-3">
- <div class="row p-2 m-2">
- <div class="col-4">
- <label for="splitYesNo" class="form-check-label">
- <h3>Podela test skupa:&nbsp;&nbsp;
- <input id="splitYesNo" class="form-check-input" type="checkbox"
- [checked]="newModel.randomTestSet"
- (change)="newModel.randomTestSet = !newModel.randomTestSet">
- </h3>
- </label>
- </div>
- <div class="col-8">
- trening
- <mat-slider style="width: 85%;" min="10" max="90" step="10" value="10"
- name="randomTestSetDistribution" thumbLabel [disabled]="!newModel.randomTestSet"
- [(ngModel)]="tempTestSetDistribution">
- </mat-slider>
- test
- </div>
- </div>
-
- <div class="row p-2 mx-2">
- <div class="col-4">
- <label for="percentage" class="form-label">Procenat podataka koji se uzima za trening
- skup:</label>
- </div>
- <div class="col-2">
- <input id="percentage" type="number" class="form-control" min="10" max="90" step="10" value="90"
- [(ngModel)]="tempTestSetDistribution" [disabled]="!newModel.randomTestSet">
- </div>
- </div>
</div>
<h3>Aktivacione funkcije:</h3>
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 ca6b8ea5..abf19d75 100644
--- a/frontend/src/app/_elements/model-load/model-load.component.ts
+++ b/frontend/src/app/_elements/model-load/model-load.component.ts
@@ -1,6 +1,6 @@
import { Component, OnInit, ViewChild, Output, EventEmitter } from '@angular/core';
import Shared from 'src/app/Shared';
-import Model, { ActivationFunction, Encoding, LossFunction, LossFunctionBinaryClassification, LossFunctionMultiClassification, LossFunctionRegression, Metrics, MetricsBinaryClassification, MetricsMultiClassification, MetricsRegression, NullValueOptions, Optimizer, ProblemType } from 'src/app/_data/Model';
+import Model, { ActivationFunction, LossFunction, LossFunctionBinaryClassification, LossFunctionMultiClassification, LossFunctionRegression, Metrics, MetricsBinaryClassification, MetricsMultiClassification, MetricsRegression, NullValueOptions, Optimizer, ProblemType } from 'src/app/_data/Model';
import { ModelsService } from 'src/app/_services/models.service';
import { GraphComponent } from '../graph/graph.component';
@@ -20,7 +20,6 @@ export class ModelLoadComponent implements OnInit {
selectedModel?: Model;
ProblemType = ProblemType;
- Encoding = Encoding;
ActivationFunction = ActivationFunction;
metrics: any = Metrics;
LossFunction = LossFunction;
@@ -32,7 +31,6 @@ export class ModelLoadComponent implements OnInit {
term: string = "";
selectedProblemType: string = '';
selectedMetrics = [];
- tempTestSetDistribution = 90;
lossFunction: any = LossFunction;
showMyModels: boolean = true;
@@ -64,7 +62,6 @@ export class ModelLoadComponent implements OnInit {
uploadModel() { //console.log(this.selectedModel);
this.getMetrics();
- this.newModel.randomTestSetDistribution = 1 - Math.round(this.tempTestSetDistribution / 100 * 10) / 10;
this.newModel.username = Shared.username;
this.modelsService.addModel(this.newModel).subscribe((response) => {
diff --git a/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.css b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.css
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.css
diff --git a/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.html b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.html
new file mode 100644
index 00000000..06e74093
--- /dev/null
+++ b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.html
@@ -0,0 +1,8 @@
+<h2 mat-dialog-title class="text-muted">{{data.title}}</h2>
+<div mat-dialog-content class="mt-4" style="color: rgb(81, 76, 76);">
+ {{data.message}}
+</div>
+<div mat-dialog-actions class="d-flex justify-content-center mt-4">
+ <button mat-button cdkFocusInitial (click)="onYesClick()" style="background-color: lightgray;">Da</button>
+ <button mat-button cdkFocusInitial (click)="onNoClick()" style="background-color: lightgray;">Ne</button>
+</div> \ No newline at end of file
diff --git a/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.spec.ts b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.spec.ts
new file mode 100644
index 00000000..eecf6468
--- /dev/null
+++ b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.spec.ts
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import {YesNoDialogComponent } from './yes-no-dialog.component';
+
+describe('AlertDialogComponent', () => {
+ let component: YesNoDialogComponent;
+ let fixture: ComponentFixture<YesNoDialogComponent>;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ declarations: [ YesNoDialogComponent ]
+ })
+ .compileComponents();
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(YesNoDialogComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.ts b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.ts
new file mode 100644
index 00000000..de1cdd4f
--- /dev/null
+++ b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.ts
@@ -0,0 +1,33 @@
+import { Component, OnInit } from '@angular/core';
+import { Inject} from '@angular/core';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
+
+interface DialogData {
+ title: string;
+ message: string;
+ yesFunction:Function;
+}
+
+@Component({
+ selector: 'app-yes-no-dialog',
+ templateUrl: './yes-no-dialog.component.html',
+ styleUrls: ['./yes-no-dialog.component.css']
+})
+export class YesNoDialogComponent {
+
+ constructor(
+ public dialogRef: MatDialogRef<YesNoDialogComponent>,
+ @Inject(MAT_DIALOG_DATA) public data: DialogData,
+ //public dialog: MatDialog
+ ) {}
+
+ onNoClick(): void {
+ this.dialogRef.close();
+ }
+ onYesClick():void{
+ this.data.yesFunction();
+ this.dialogRef.close();
+ }
+
+
+}
diff --git a/frontend/src/app/_pages/my-datasets/my-datasets.component.css b/frontend/src/app/_pages/my-datasets/my-datasets.component.css
index e69de29b..57889937 100644
--- a/frontend/src/app/_pages/my-datasets/my-datasets.component.css
+++ b/frontend/src/app/_pages/my-datasets/my-datasets.component.css
@@ -0,0 +1,8 @@
+#header {
+ background-color: #003459;
+ padding-top: 20px;
+ padding-bottom: 15px;
+ text-align: center;
+ color: white;
+ border-radius: 5px;
+} \ No newline at end of file
diff --git a/frontend/src/app/_pages/my-datasets/my-datasets.component.html b/frontend/src/app/_pages/my-datasets/my-datasets.component.html
index d996bf31..0c83dc85 100644
--- a/frontend/src/app/_pages/my-datasets/my-datasets.component.html
+++ b/frontend/src/app/_pages/my-datasets/my-datasets.component.html
@@ -1,5 +1,8 @@
+<div id="header">
+ <h1>Moji setovi podataka</h1>
+</div>
<div id="wrapper">
- <div id="container" class="container p-5" style="background-color: white; min-height: 100%;">
+ <div id="container" class="container p-5" style="background-color: rgba(255, 255, 255, 0.8); min-height: 100%;">
<div class="row mt-3 mb-2 d-flex justify-content-center">
<div class="col-sm-6" style="margin-bottom: 10px;">
@@ -12,9 +15,10 @@
<div class="panel-footer row"><!-- panel-footer -->
<div class="col-xs-6 text-center">
<div>
- <button type="button" class="btn btn-default btn-lg" mat-raised-button color="primary" (click)="deleteThisDataset(dataset)">Obriši
- <span class="glyphicon glyphicon-chevron-right"></span>
- </button>
+ <div>
+ <button (click)="deleteThisDataset(dataset)" mat-raised-button color="warn" style="min-width: 10rem;float: right" ><mat-icon>delete</mat-icon></button>
+ </div>
+
</div>
</div>
</div><!-- end panel-footer -->
@@ -24,6 +28,7 @@
<h2>Nema rezultata</h2>
</div>
</div>
+
</div>
diff --git a/frontend/src/app/_pages/my-datasets/my-datasets.component.ts b/frontend/src/app/_pages/my-datasets/my-datasets.component.ts
index 1551a3c8..19a6832b 100644
--- a/frontend/src/app/_pages/my-datasets/my-datasets.component.ts
+++ b/frontend/src/app/_pages/my-datasets/my-datasets.component.ts
@@ -5,6 +5,7 @@ import Dataset from 'src/app/_data/Dataset';
import { JwtHelperService } from '@auth0/angular-jwt';
import { CookieService } from 'ngx-cookie-service';
import shared from 'src/app/Shared';
+import { share } from 'rxjs';
@Component({
selector: 'app-my-datasets',
@@ -41,17 +42,17 @@ export class MyDatasetsComponent implements OnInit {
*/
deleteThisDataset(dataset: Dataset): void{
- console.log("OK");
+ shared.openYesNoDialog('Brisanje seta podataka','Da li ste sigurni da želite da obrišete ovaj set podataka?',() => {
this.datasetsS.deleteDataset(dataset).subscribe((response) => {
console.log("OBRISANO JE", response);
//na kraju uspesnog
this.getAllMyDatasets();
}, (error) =>{
if (error.error == "Dataset with name = {name} deleted") {
- alert("Greška pri brisanju dataseta!");
+ shared.openDialog("Greška","Greška pri brisanju dataseta!");
}
});
-
+ });
}
getAllMyDatasets(): void{
@@ -61,5 +62,6 @@ deleteThisDataset(dataset: Dataset): void{
console.log(this.myDatasets);
});
}
+
}
diff --git a/frontend/src/app/_pages/my-models/my-models.component.css b/frontend/src/app/_pages/my-models/my-models.component.css
index e69de29b..19d29595 100644
--- a/frontend/src/app/_pages/my-models/my-models.component.css
+++ b/frontend/src/app/_pages/my-models/my-models.component.css
@@ -0,0 +1,12 @@
+button{
+ margin-left: 5%;
+ margin-right: 5%;
+}
+#header {
+ background-color: #003459;
+ padding-top: 20px;
+ padding-bottom: 15px;
+ text-align: center;
+ color: white;
+ border-radius: 5px;
+} \ No newline at end of file
diff --git a/frontend/src/app/_pages/my-models/my-models.component.html b/frontend/src/app/_pages/my-models/my-models.component.html
index 4aebc1f2..b0e9c4ef 100644
--- a/frontend/src/app/_pages/my-models/my-models.component.html
+++ b/frontend/src/app/_pages/my-models/my-models.component.html
@@ -1,5 +1,8 @@
+<div id="header">
+ <h1>Moji modeli</h1>
+</div>
<div id="wrapper">
- <div id="container" class="container p-5" style="background-color: white; min-height: 100%;">
+ <div id="container" class="container p-5" style="background-color: rgba(255, 255, 255, 0.8); min-height: 100%;">
<div class="row mt-3 mb-2 d-flex justify-content-center">
<div class="col-sm-6" style="margin-bottom: 10px;">
@@ -12,12 +15,12 @@
<div class="panel-footer row"><!-- panel-footer -->
<div class="col-xs-6 text-center">
<div>
- <button type="button" class="btn btn-default btn-lg" (click)="deleteThisModel(model)" mat-raised-button color="primary">Koristi
- <span class="glyphicon glyphicon-search"></span>
- </button>
- <button type="button" class="btn btn-default btn-lg" mat-raised-button color="primary" (click)="deleteThisModel(model)">Obriši
- <span class="glyphicon glyphicon-chevron-right"></span>
- </button>
+ <button type="button" class="btn btn-default btn-lg"style="min-width: 7rem;float: left;" (click)="deleteThisModel(model)" mat-raised-button color="primary">Koristi
+ <span class="glyphicon glyphicon-search"></span>
+ </button>
+ <button (click)="deleteThisModel(model)" mat-raised-button color="warn" style="min-width: 7rem;float: right" ><mat-icon>delete</mat-icon></button>
+
+
</div>
</div>
</div><!-- end panel-footer -->
diff --git a/frontend/src/app/_pages/my-models/my-models.component.ts b/frontend/src/app/_pages/my-models/my-models.component.ts
index 6086b1b1..f3877e2d 100644
--- a/frontend/src/app/_pages/my-models/my-models.component.ts
+++ b/frontend/src/app/_pages/my-models/my-models.component.ts
@@ -32,7 +32,7 @@ export class MyModelsComponent implements OnInit {
*/
deleteThisModel(model: Model): void{
- console.log("OK");
+ shared.openYesNoDialog('Brisanje seta podataka','Da li ste sigurni da želite da obrišete model?',() => {
this.modelsS.deleteModel(model).subscribe((response) => {
console.log("OBRISANOOO JEE", response);
//na kraju uspesnog
@@ -42,9 +42,10 @@ deleteThisModel(model: Model): void{
shared.openDialog("Obaveštenje", "Greška prilikom brisanja modela.");
}
});
-
+ });
}
+
getAllMyModels(): void{
this.modelsS.getMyModels().subscribe(m => {
diff --git a/frontend/src/app/_pages/my-predictors/my-predictors.component.html b/frontend/src/app/_pages/my-predictors/my-predictors.component.html
index 3746d35e..d38f93e4 100644
--- a/frontend/src/app/_pages/my-predictors/my-predictors.component.html
+++ b/frontend/src/app/_pages/my-predictors/my-predictors.component.html
@@ -1,7 +1,7 @@
<div id="header">
<h1>Trenirani modeli</h1>
</div>
-<div id="container" style="background-color:rgba(255, 255, 255, 0.747);">
+<div id="container" style="background-color:rgba(255, 255, 255, 0.8);">
<div class="row" *ngFor="let predictor of predictors">
<div class="left">
<app-item-predictor [predictor]="predictor"></app-item-predictor>
diff --git a/frontend/src/app/_services/experiments.service.ts b/frontend/src/app/_services/experiments.service.ts
index 60d1bfb2..ecb3e262 100644
--- a/frontend/src/app/_services/experiments.service.ts
+++ b/frontend/src/app/_services/experiments.service.ts
@@ -15,4 +15,8 @@ export class ExperimentsService {
addExperiment(experiment: Experiment): Observable<any> {
return this.http.post(`${API_SETTINGS.apiURL}/experiment/add`, experiment, { headers: this.authService.authHeader() });
}
+
+ getMyExperiments(): Observable<Experiment[]> {
+ return this.http.get<Experiment[]>(`${API_SETTINGS.apiURL}/experiment/getmyexperiments`, { headers: this.authService.authHeader() });
+ }
}
diff --git a/frontend/src/app/_services/models.service.ts b/frontend/src/app/_services/models.service.ts
index 3fbad109..9a1e71da 100644
--- a/frontend/src/app/_services/models.service.ts
+++ b/frontend/src/app/_services/models.service.ts
@@ -35,8 +35,8 @@ export class ModelsService {
addDataset(dataset: Dataset): Observable<any> {
return this.http.post(`${API_SETTINGS.apiURL}/dataset/add`, dataset, { headers: this.authService.authHeader() });
}
- trainModel(model: Model): Observable<any> {
- return this.http.post(`${API_SETTINGS.apiURL}/model/sendmodel`, model, { headers: this.authService.authHeader(), responseType: 'text' });
+ trainModel(modelId: string, experimentId: string): Observable<any> {
+ return this.http.post(`${API_SETTINGS.apiURL}/model/trainmodel`, { ModelId: modelId, ExperimentId: experimentId }, { headers: this.authService.authHeader(), responseType: 'text' });
}
getMyDatasets(): Observable<Dataset[]> {
diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts
index 1b91a1ac..f57441c0 100644
--- a/frontend/src/app/app.module.ts
+++ b/frontend/src/app/app.module.ts
@@ -45,6 +45,8 @@ import { AlertDialogComponent } from './_modals/alert-dialog/alert-dialog.compon
import { AddNewDatasetComponent } from './_elements/add-new-dataset/add-new-dataset.component';
import { GraphComponent } from './_elements/graph/graph.component';
import { TrainingComponent } from './training/training.component';
+import { ItemExperimentComponent } from './_elements/item-experiment/item-experiment.component';
+import { YesNoDialogComponent } from './_modals/yes-no-dialog/yes-no-dialog.component';
@NgModule({
declarations: [
@@ -80,6 +82,8 @@ import { TrainingComponent } from './training/training.component';
AddNewDatasetComponent,
GraphComponent,
TrainingComponent,
+ ItemExperimentComponent,
+ YesNoDialogComponent
],
imports: [
BrowserModule,
diff --git a/frontend/src/app/experiment/experiment.component.html b/frontend/src/app/experiment/experiment.component.html
index 42797579..36cf9eda 100644
--- a/frontend/src/app/experiment/experiment.component.html
+++ b/frontend/src/app/experiment/experiment.component.html
@@ -13,7 +13,7 @@
</div>
<div id="carouselExampleControls" class="carousel slide" data-bs-wrap="false" data-bs-ride="carousel" data-bs-interval="false">
- <div class="carousel-inner border">
+ <div class="carousel-inner">
<div class="carousel-item active">
<h2>1. Izvor podataka</h2>
<app-dataset-load (selectedDatasetChangeEvent)="updateDataset($event)"></app-dataset-load>
@@ -21,7 +21,16 @@
<div class="carousel-item">
<h2>2. Preprocesiranje</h2>
- <h3>Biranje ulaznih i izlaznih kolona:</h3>
+
+ <label for="name" class="col-form-label">Naziv eksperimenta:</label>
+ <input type="text" class="form-control mb-1" name="name" placeholder="Naziv..." [(ngModel)]="experiment.name">
+
+ <label for="desc" class="col-sm-2 col-form-label">Opis:</label>
+ <div>
+ <textarea class="form-control" name="desc" rows="3" [(ngModel)]="experiment.description"></textarea>
+ </div>
+
+ <h3 class="mt-3">Biranje ulaznih i izlaznih kolona:</h3>
<div *ngIf="selectedDataset">
<div class="row">
<div class="col d-flex justify-content-center">
@@ -31,8 +40,9 @@
<div *ngFor="let item of selectedDataset.columnInfo; let i = index">
<input class="form-check-input" type="checkbox" value="{{item.columnName}}"
id="cb_{{item.columnName}}" name="cbsNew"
- [checked]="this.selectedOutputColumnVal != item.columnName"
- [disabled]="this.selectedOutputColumnVal == item.columnName">&nbsp;
+ [checked]="experiment.outputColumn != item.columnName"
+ [disabled]="experiment.outputColumn == item.columnName"
+ (click)="checkedColumnsChanged(item, 0)">&nbsp;
<label class="form-check-label" for="cb_{{item.columnName}}">
{{item.columnName}}
</label>
@@ -44,8 +54,11 @@
<div id="divOutputs" class="form-check mt-2">
<br>
<div *ngFor="let item of selectedDataset.columnInfo; let i = index">
- <input class="form-check-input" type="radio" value="{{item.columnName}}" id="rb_{{item.columnName}}"
- name="rbsNew" (change)="this.selectedOutputColumnVal = item.columnName">&nbsp;
+ <input class="form-check-input" type="radio" value="{{item.columnName}}"
+ id="rb_{{item.columnName}}" name="rbsNew"
+ [(ngModel)]="this.experiment.outputColumn"
+ (change)="experiment.outputColumn = item.columnName"
+ (click)="checkedColumnsChanged(item, 1);">&nbsp;
<label class="form-check-label" for="rb_{{item.columnName}}">
{{item.columnName}}
</label>
@@ -54,11 +67,12 @@
</div>
</div>
</div>
+ <br>
<h3>Popunjavanje nedostajućih vrednosti:</h3>
<div class="form-check" *ngIf="selectedDataset">
<input type="radio" [(ngModel)]="experiment.nullValues" [value]="NullValueOptions.DeleteRows"
- class="form-check-input" value="deleteRows" name="fillMissing" id="delRows" checked data-bs-toggle="collapse"
- data-bs-target="#fillMissingCustom.show">
+ class="form-check-input" value="deleteRows" name="fillMissing" id="delRows" checked
+ data-bs-toggle="collapse" data-bs-target="#fillMissingCustom.show">
<label for="delRows" class="form-check-label">Obriši sve
redove sa nedostajućim vrednostima ({{selectedDataset.nullRows}} / TODO)</label><br>
<input type="radio" [(ngModel)]="experiment.nullValues" [value]="NullValueOptions.DeleteColumns"
@@ -66,29 +80,38 @@
data-bs-target="#fillMissingCustom.show">
<label for="delCols" class="form-check-label">Obriši sve
kolone sa nedostajućim vrednostima ({{selectedDataset.nullCols}} / TODO)</label><br>
- <input type="radio" [(ngModel)]="experiment.nullValues" [value]="NullValueOptions.Replace" class="form-check-input"
- name="fillMissing" id="replace" data-bs-toggle="collapse" data-bs-target="#fillMissingCustom:not(.show)">
+ <input type="radio" [(ngModel)]="experiment.nullValues" [value]="NullValueOptions.Replace"
+ class="form-check-input" name="fillMissing" id="replace" data-bs-toggle="collapse"
+ data-bs-target="#fillMissingCustom:not(.show)">
<label for="replace" class="form-check-label">Izabraću
vrednosti koje će da zamene nedostajuće vrednosti za svaku kolonu...</label><br><br>
<div class="collapse" id="fillMissingCustom">
<div>
<label for="columnReplacers" class="form-label">Unesite zamenu za svaku kolonu:</label>
+ <div class="my-3" *ngIf="getSelectedNullColumnsArray().length > 0" >
+ <label class="text-center form-control mx-3 text-secondary">
+ Kolone <span style="font-style: italic;" *ngFor="let colname of getSelectedNullColumnsArray(); let i = index">
+ <span *ngIf="i != getSelectedNullColumnsArray().length - 1">{{colname}}, </span>
+ <span *ngIf="i == getSelectedNullColumnsArray().length - 1">{{colname}} </span>
+ </span>
+ nemaju nedostajućih vrednosti za popunjavanje.
+ </label>
+ </div>
<div id="columnReplacers">
- <div *ngFor="let column of selectedDataset.columnInfo; let i = index" class="my-3">
- <div *ngIf="getInputById('cb_'+column.columnName).checked || selectedOutputColumnVal == column.columnName"
- class="">
+ <div *ngFor="let column of selectedColumnsInfoArray; let i = index" class="my-3">
+ <div *ngIf="column.numNulls > 0">
<span class="w-20 mx-3">
- {{column.columnName}}&nbsp;<span class="small" style="color:gray;">({{column.numNulls}}
- null)
+ {{column.columnName}}&nbsp;<span class="small" style="color:gray;">({{column.numNulls}} null)
</span>
</span>
-
- <label *ngIf="column.numNulls <= 0" class="text-center form-control mx-3 text-secondary">
+
+ <label *ngIf="column.numNulls <= 0"
+ class="text-center form-control mx-3 text-secondary">
Ova kolona nema
nedostajućih
vrednosti.
</label>
-
+
<div *ngIf="column.numNulls > 0" class="d-flex flex-row justify-content-end">
<div class="flex-grow-3 mx-3 me-auto">
<div class="input-group">
@@ -100,20 +123,22 @@
</label>
</div>
<input type="text" class="form-control" [id]="'fillText_'+column.columnName"
- (keyup)="checkFillColRadio(column.columnName)" placeholder="Unesi vrednost...">
-
+ (keyup)="checkFillColRadio(column.columnName)"
+ placeholder="Unesi vrednost...">
+
<div class="input-group-append">
<select [id]="'replaceOptions'+i" class="form-control btn-primary"
- *ngIf="column.isNumber" (change)="replace($event, column);">
+ *ngIf="column.isNumber" (change)="replace($event, column); checkFillColRadio(column.columnName);">
<option
*ngFor="let option of Object.keys(ReplaceWith); let optionName of Object.values(ReplaceWith)"
[value]="option">
{{ optionName }}
</option>
</select>
- <select [id]="'replaceOptions'+i" class="form-control btn-outline-primary"
+ <select [id]="'replaceOptions'+i"
+ class="form-control btn-outline-primary"
*ngIf="!column.isNumber && column.numNulls > 0"
- (change)="replace($event, column);">
+ (change)="replace($event, column); checkFillColRadio(column.columnName);">
<option *ngFor="let option of column.uniqueValues" [value]="option">
{{ option }}
</option>
@@ -121,7 +146,7 @@
</div>
</div>
</div>
-
+
<div class="flex-shrink-1 mx-3">
<div class="input-group">
<label class="form-control" [for]="'delCol_'+column.columnName">Izbriši
@@ -131,7 +156,7 @@
(change)="emptyFillTextInput(column.columnName)"></label>
</div>
</div>
-
+
<div class="flex-shrink-1 mx-3">
<div class="input-group">
<label class="form-control" [for]="'delRows_'+column.columnName">Izbriši
@@ -196,6 +221,60 @@
</div>
</div>
+ <div id="randomOptions">
+ <div class="col-3 mt-2">
+ <label for="type" class="form-check-label">Nasumičan redosled podataka?</label>
+ <input class="mx-3 form-check-input" type="checkbox" [(ngModel)]="experiment.randomOrder"
+ type="checkbox" value="" checked>
+ </div>
+ <div class="border m-3">
+ <div class="row p-2 m-2">
+ <div class="col-4">
+ <label for="splitYesNo" class="form-check-label">
+ <h3>Podela test skupa:&nbsp;&nbsp;
+ <input id="splitYesNo" class="form-check-input" type="checkbox"
+ [checked]="experiment.randomTestSet"
+ (change)="experiment.randomTestSet = !experiment.randomTestSet">
+ </h3>
+ </label>
+ </div>
+ <div class="col-8">
+ trening
+ <mat-slider style="width: 85%;" min="10" max="90" step="10" value="10"
+ name="randomTestSetDistribution" thumbLabel [disabled]="!experiment.randomTestSet"
+ [(ngModel)]="tempTestSetDistribution">
+ </mat-slider>
+ test
+ </div>
+ </div>
+
+ <div class="row p-2 mx-2">
+ <div class="col-4">
+ <label for="percentage" class="form-label">Procenat podataka koji se uzima za trening
+ skup:</label>
+ </div>
+ <div class="col-2">
+ <input id="percentage" type="number" class="form-control" min="10" max="90" step="10" value="90"
+ [(ngModel)]="tempTestSetDistribution" [disabled]="!experiment.randomTestSet">
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div id="encodingForColumns">
+ <div class="col-3">
+ <label for="encoding" class="col-form-label">Enkoding: </label>
+ </div>
+ <div class="col-2">
+ <select id=encodingOptions class="form-control" name="encoding" [(ngModel)]="experiment.encoding">
+ <option *ngFor="let option of Object.keys(Encoding); let optionName of Object.values(Encoding)"
+ [value]="option">
+ {{ optionName }}
+ </option>
+ </select>
+ </div>
+ </div>
+
</div>
diff --git a/frontend/src/app/experiment/experiment.component.ts b/frontend/src/app/experiment/experiment.component.ts
index 7ccca528..8a1b7d70 100644
--- a/frontend/src/app/experiment/experiment.component.ts
+++ b/frontend/src/app/experiment/experiment.component.ts
@@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core';
-import Experiment, { NullValReplacer, NullValueOptions, ReplaceWith } from '../_data/Experiment';
+import Experiment, { NullValReplacer, NullValueOptions, ReplaceWith, Encoding } from '../_data/Experiment';
import Model from '../_data/Model';
import Dataset, { ColumnInfo } from '../_data/Dataset';
import { ModelsService } from '../_services/models.service';
@@ -20,12 +20,15 @@ export class ExperimentComponent implements OnInit {
NullValueOptions = NullValueOptions;
ReplaceWith = ReplaceWith;
+ Encoding = Encoding;
Object = Object;
selectedColumnsInfoArray: ColumnInfo[] = [];
- selectedOutputColumnVal: string = '';
+ //selectedOutputColumnVal: string = '';
selectedNullColumnsArray: string[] = [];
+ tempTestSetDistribution = 90;
+
constructor(private modelsService: ModelsService, private experimentsService: ExperimentsService) { }
ngOnInit(): void {
@@ -36,12 +39,7 @@ export class ExperimentComponent implements OnInit {
this.selectedDataset = dataset;
this.selectedColumnsInfoArray = this.selectedDataset.columnInfo;
this.selectedNullColumnsArray = [];
- console.log("array:", this.selectedColumnsInfoArray);
- }
-
- updateModel(model: Model) {
- //console.log(model);
- this.selectedModel = model;
+ //console.log("array:", this.selectedColumnsInfoArray);
}
getInputById(id: string): HTMLInputElement {
@@ -71,9 +69,9 @@ export class ExperimentComponent implements OnInit {
checkedColumnsChanged(checkedColumnInfo: ColumnInfo, buttonType: number) { //0-input,1-output
let col = this.selectedColumnsInfoArray.find(x => x.columnName == checkedColumnInfo.columnName);
if (buttonType == 0) { //inputCol
- if (col == undefined)
+ if (col == undefined)
this.selectedColumnsInfoArray.push(checkedColumnInfo);
- else
+ else
this.selectedColumnsInfoArray = this.selectedColumnsInfoArray.filter(x => x.columnName != checkedColumnInfo.columnName);
}
else { //outputCol
@@ -81,7 +79,7 @@ export class ExperimentComponent implements OnInit {
this.selectedColumnsInfoArray.push(checkedColumnInfo);
}
//console.log(this.selectedColumnsInfoArray);
- }
+ }
replace(event: Event, column: ColumnInfo) {
let option = (<HTMLInputElement>event.target).value;
@@ -170,21 +168,24 @@ export class ExperimentComponent implements OnInit {
Shared.openDialog("Greška", "Molimo Vas da izaberete ulazne kolone.");
return;
}
-
+
this.experiment._id = '';
this.experiment.uploaderId = '';
this.experiment.datasetId = this.selectedDataset._id;
-
+
let pom = this.selectedColumnsInfoArray.filter(x => x.columnName != this.experiment.outputColumn);
for (let i = 0; i < pom.length; i++)
this.experiment.inputColumns.push(pom[i].columnName);
- this.selectedColumnsInfoArray = this.selectedColumnsInfoArray.filter(x => x.numNulls > 0);
- //TREBAJU MI NULLVALUESREPLACERI
+ //this.experiment.outputColumn = this.selectedOutputColumnVal;
+
+ this.selectedColumnsInfoArray = this.selectedColumnsInfoArray.filter(x => x.numNulls > 0); //obavezno
this.experiment.nullValuesReplacers = this.getNullValuesReplacersArray();
- console.log("Eksperiment:", this.experiment);
-
+ this.experiment.randomTestSetDistribution = 1 - Math.round(this.tempTestSetDistribution / 100 * 10) / 10;
+
+ //console.log("Eksperiment:", this.experiment);
+
this.experimentsService.addExperiment(this.experiment).subscribe((response) => {
this.experiment = response;
@@ -193,25 +194,9 @@ export class ExperimentComponent implements OnInit {
Shared.openDialog("Obaveštenje", "Eksperiment je uspešno kreiran.");
}, (error) => {
-
- });
- }
-
- trainModel() {
- this.trainingResult = undefined;
- //console.log('Training model...', this.selectedModel);
- if (!this.selectedDataset) {
- Shared.openDialog('Greška', 'Izvor podataka nije izabran!');
- return;
- }
- // TODO proveri nullValues
- if (!this.selectedModel) {
- Shared.openDialog('Greška', 'Model nije izabran!');
- return;
- }
- this.modelsService.trainModel(this.selectedModel).subscribe((response: any) => {
- console.log('Train model complete!', response);
- this.trainingResult = response;
+ if (error.error == "Experiment with this name exists") {
+ Shared.openDialog("Greška", "Eksperiment sa unetim nazivom već postoji u Vašoj kolekciji. Unesite neki drugi naziv.");
+ }
});
}
}
diff --git a/frontend/src/app/training/training.component.css b/frontend/src/app/training/training.component.css
index ee4b0448..490c56b5 100644
--- a/frontend/src/app/training/training.component.css
+++ b/frontend/src/app/training/training.component.css
@@ -29,7 +29,7 @@
border-color: #003459;
}
-.selectedDatasetClass {
+.selectedExperimentClass {
/*border-color: 2px solid #003459;*/
background-color: lightblue;
}
diff --git a/frontend/src/app/training/training.component.html b/frontend/src/app/training/training.component.html
index 1939d3cf..2e574c12 100644
--- a/frontend/src/app/training/training.component.html
+++ b/frontend/src/app/training/training.component.html
@@ -4,13 +4,25 @@
<div id="wrapper">
<div id="container" class="container p-5" style="background-color: white; min-height: 100%;">
-<h2>1. Izaberi eksperiment</h2>
-TODO
+<h2>1. Izaberite eksperiment iz kolekcije</h2>
+<div class="px-5 my-2">
+ <input type="text" class="form-control" placeholder="Pretraga"
+ [(ngModel)]="term">
+</div>
+<div class="overflow-auto" style="max-height: 500px;">
+ <ul class="list-group">
+ <li class="list-group-item p-3" *ngFor="let experiment of myExperiments|filter:term"
+ [ngClass]="{'selectedExperimentClass': this.selectedExperiment == experiment}">
+ <app-item-experiment [experiment]="experiment"
+ (click)="selectThisExperiment(experiment);"></app-item-experiment>
+ </li>
+ </ul>
+</div>
-<h2>2.Izaberi model</h2>
+<h2>2.Izaberite model</h2>
<app-model-load (selectedModelChangeEvent)="selectModel($event)"></app-model-load>
-<h2>3. Treniraj model</h2>
+<h2>3. Trenirajte model</h2>
<button class="btn btn-lg col-4" style="background-color:#003459; color:white;" (click)="trainModel();">Treniraj
model</button>
diff --git a/frontend/src/app/training/training.component.ts b/frontend/src/app/training/training.component.ts
index cb6c304c..4f20bc87 100644
--- a/frontend/src/app/training/training.component.ts
+++ b/frontend/src/app/training/training.component.ts
@@ -1,29 +1,55 @@
import { Component, OnInit } from '@angular/core';
+import Shared from '../Shared';
import Experiment from '../_data/Experiment';
import Model from '../_data/Model';
+import { DatasetsService } from '../_services/datasets.service';
+import { ExperimentsService } from '../_services/experiments.service';
+import { ModelsService } from '../_services/models.service';
@Component({
selector: 'app-training',
templateUrl: './training.component.html',
styleUrls: ['./training.component.css']
})
-export class TrainingComponent implements OnInit {
-
- constructor() { }
-
- ngOnInit(): void {
- }
+export class TrainingComponent{
+ myExperiments?: Experiment[];
selectedExperiment?: Experiment;
selectedModel?: Model;
trainingResult: any;
- selectModel($model: Model) {
+ term: string = "";
+
+ constructor(private modelsService: ModelsService, private datasetsService: DatasetsService, private experimentsService: ExperimentsService) {
+ this.experimentsService.getMyExperiments().subscribe((experiments) => {
+ this.myExperiments = experiments;
+ console.log(this.myExperiments);
+ });
+ }
+
+ selectThisExperiment(experiment: Experiment) {
+ this.selectedExperiment = experiment;
+ }
+ selectModel(model: Model) {
+ this.selectedModel = model;
}
trainModel() {
- //eksperiment i model moraju da budu izabrani
+ this.trainingResult = undefined;
+
+ if (this.selectedExperiment == undefined) {
+ Shared.openDialog("Greška", "Molimo Vas da izaberete eksperiment iz kolekcije.");
+ return;
+ }
+ if (this.selectedModel == undefined) {
+ Shared.openDialog("Greška", "Molimo Vas da izaberete model.");
+ return;
+ }
+ this.modelsService.trainModel(this.selectedModel._id, this.selectedExperiment._id).subscribe((response: any) => {
+ console.log('Train model complete!', response);
+ this.trainingResult = response;
+ });
}
}