aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/api/api/Controllers/ModelController.cs3
-rw-r--r--backend/api/api/Models/Model.cs14
-rw-r--r--backend/api/api/Services/FillAnEmptyDb.cs6
-rw-r--r--frontend/src/app/_elements/folder/folder.component.html19
-rw-r--r--frontend/src/app/_elements/folder/folder.component.ts43
-rw-r--r--frontend/src/app/_elements/form-dataset/form-dataset.component.ts20
-rw-r--r--frontend/src/app/_elements/form-model/form-model.component.ts3
7 files changed, 73 insertions, 35 deletions
diff --git a/backend/api/api/Controllers/ModelController.cs b/backend/api/api/Controllers/ModelController.cs
index fb30a7a2..d68e98e2 100644
--- a/backend/api/api/Controllers/ModelController.cs
+++ b/backend/api/api/Controllers/ModelController.cs
@@ -187,8 +187,11 @@ namespace api.Controllers
/*if (_modelService.CheckHyperparameters(1, model.hiddenLayerNeurons, model.hiddenLayers, model.outputNeurons) == false)
return BadRequest("Bad parameters!");*/
+ model.uploaderId = getUserId();
+
var existingModel = _modelService.GetOneModel(model.uploaderId, model.name);
+
if (existingModel != null && !overwrite)
return NotFound($"Model with name = {model.name} exisits");
else
diff --git a/backend/api/api/Models/Model.cs b/backend/api/api/Models/Model.cs
index f89c8e56..d8921713 100644
--- a/backend/api/api/Models/Model.cs
+++ b/backend/api/api/Models/Model.cs
@@ -26,12 +26,11 @@ namespace api.Models
public string optimizer { get; set; }
public string lossFunction { get; set; }
//public int inputNeurons { get; set; }
- public int hiddenLayerNeurons { get; set; }
public int hiddenLayers { get; set; }
public int batchSize { get; set; }
// na izlazu je moguce da bude vise neurona (klasifikacioni problem sa vise od 2 klase)
public int outputNeurons { get; set; }
- public string[] hiddenLayerActivationFunctions { get; set; }
+ public Layer[] layers { get; set; }
public string outputLayerActivationFunction { get; set; }
public string[] metrics { get; set; }
@@ -42,4 +41,15 @@ namespace api.Models
public bool randomTestSet { get; set; }
public float randomTestSetDistribution { get; set; }
}
+
+ public class Layer
+ {
+ public int layerNumber { get; set; }
+ public string activationFunction { get; set; }
+ public int neurons { get; set; }
+ public string regularisation { get; set; }
+ public float regularisationRate { get; set; }
+ }
}
+
+
diff --git a/backend/api/api/Services/FillAnEmptyDb.cs b/backend/api/api/Services/FillAnEmptyDb.cs
index 52f6e854..99bbb91f 100644
--- a/backend/api/api/Services/FillAnEmptyDb.cs
+++ b/backend/api/api/Services/FillAnEmptyDb.cs
@@ -98,11 +98,9 @@ namespace api.Services
model.type = "binarni-klasifikacioni";
model.optimizer = "Adam";
model.lossFunction = "mean_squared_error";
- model.hiddenLayerNeurons = 3;
model.hiddenLayers = 5;
model.batchSize = 8;
model.outputNeurons = 0;
- model.hiddenLayerActivationFunctions = new string[] { "relu", "relu", "relu", "relu", "relu" };
model.outputLayerActivationFunction = "sigmoid";
model.metrics = new string[] { };
model.epochs = 5;
@@ -211,11 +209,9 @@ namespace api.Services
model.type = "regresioni";
model.optimizer = "Adam";
model.lossFunction = "mean_absolute_error";
- model.hiddenLayerNeurons = 2;
model.hiddenLayers = 4;
model.batchSize = 5;
model.outputNeurons = 0;
- model.hiddenLayerActivationFunctions = new string[] { "relu", "relu", "relu", "relu" };
model.outputLayerActivationFunction = "relu";
model.metrics = new string[] { };
model.epochs = 5;
@@ -319,11 +315,9 @@ namespace api.Services
model.type = "multi-klasifikacioni";
model.optimizer = "Adam";
model.lossFunction = "sparse_categorical_crossentropy";
- model.hiddenLayerNeurons = 3;
model.hiddenLayers = 3;
model.batchSize = 4;
model.outputNeurons = 0;
- model.hiddenLayerActivationFunctions = new string[] { "relu", "relu", "softmax" };
model.outputLayerActivationFunction = "softmax";
model.metrics = new string[] { };
model.epochs = 1;
diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html
index 113db616..48b59dc8 100644
--- a/frontend/src/app/_elements/folder/folder.component.html
+++ b/frontend/src/app/_elements/folder/folder.component.html
@@ -30,20 +30,20 @@
</mat-form-field>
</div>
<div id="search-options">
- <div id="collapseFilters" class="collapse collapse-horizontal">
+ <!-- <div id="collapseFilters" class="collapse collapse-horizontal">
<mat-icon class="text-offwhite ">timeline</mat-icon>
Regresioni
<mat-icon class="text-offwhite ">looks_two</mat-icon>
Binarni klasifikacioni
<mat-icon class="text-offwhite ">auto_awesome_motion</mat-icon>
Multiklasifikacioni
- </div>
+ </div> -->
<button class="btn-clear icon-toggle" data-bs-toggle="collapse" data-bs-target="#collapseFilters" aria-expanded="false" aria-controls="collapseFilters">
<mat-icon>filter_alt</mat-icon>
</button>
- <div id="collapseSort" class="collapse collapse-horizontal">
+ <!-- <div id="collapseSort" class="collapse collapse-horizontal">
[sort options here TODO]
- </div>
+ </div> -->
<button class="btn-clear icon-toggle" data-bs-toggle="collapse" data-bs-target="#collapseSort" aria-expanded="false" aria-controls="collapseSort">
<mat-icon>sort</mat-icon>
</button>
@@ -55,16 +55,13 @@
<!--{{fileToDisplay ? fileToDisplay.name : 'No file selected.'}} {{selectedFileIndex}} {{hoveringOverFileIndex}}-->
<div class="folder-inside bg-blur">
<div class="file-content" [ngClass]="{'form-hidden' : listView}">
- <div class="file-bottom-buttons">
- <button class="btn-clear file-button" (click)="deleteFile()">
+ <div class="file-bottom-buttons" *ngIf="selectedTab != TabType.NewFile">
+ <button *ngIf="this.selectedFile && selectedTab == TabType.File" class="btn-clear file-button" (click)="deleteFile(this.selectedFile)">
<mat-icon>delete</mat-icon>
</button>
- <button class="btn-clear file-button">
- <mat-icon>share</mat-icon>
- </button>
- <button class="btn-clear file-button">
+ <!-- <button class="btn-clear file-button">
<mat-icon>zoom_out_map</mat-icon>
- </button>
+ </button> -->
</div>
<app-form-model [ngClass]="{'form-hidden': type != FolderType.Model}"></app-form-model>
<app-form-dataset [ngClass]="{'form-hidden': type != FolderType.Dataset}"></app-form-dataset>
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts
index 1e57fdf1..20ca1121 100644
--- a/frontend/src/app/_elements/folder/folder.component.ts
+++ b/frontend/src/app/_elements/folder/folder.component.ts
@@ -137,6 +137,7 @@ export class FolderComponent implements AfterViewInit {
});
this.modelsService.getMyModels().subscribe((models) => {
+ console.log(models);
this.folders[TabType.MyModels] = models;
});
@@ -160,8 +161,26 @@ export class FolderComponent implements AfterViewInit {
}
saveNewFile() {
- if (this.type == FolderType.Dataset)
- this.formDataset!.uploadDataset();
+ switch (this.type) {
+ case FolderType.Dataset:
+ this.formDataset!.uploadDataset((dataset: Dataset) => {
+ Shared.openDialog("Obaveštenje", "Uspešno ste dodali novi izvor podataka u kolekciju. Molimo sačekajte par trenutaka da se procesira.");
+ this.refreshFiles(dataset._id);
+ },
+ () => {
+ Shared.openDialog("Neuspeo pokušaj!", "Izvor podataka sa unetim nazivom već postoji u Vašoj kolekciji. Izmenite naziv ili iskoristite postojeći dataset.");
+ });
+ break;
+ case FolderType.Model:
+ this.modelsService.addModel(this.formModel.newModel).subscribe(model => {
+ this.formModel.newModel = model;
+ Shared.openDialog("Obaveštenje", "Uspešno ste dodali novu konfiguraciju neuronske mreže u kolekciju.");
+ this.refreshFiles(null); // todo select model
+ }, (err) => {
+ Shared.openDialog("Neuspeo pokušaj!", "Konfiguracija neuronske mreže sa unetim nazivom već postoji u Vašoj kolekciji. Izmenite naziv ili iskoristite postojeću konfiguraciju.");
+ });
+ break;
+ }
}
@@ -207,8 +226,26 @@ export class FolderComponent implements AfterViewInit {
this.listView = !this.listView;
}
- deleteFile() {
+ deleteFile(file: FolderFile) {
console.log('delete');
+ switch (this.type) {
+ case FolderType.Dataset:
+ this.datasetsService.deleteDataset(<Dataset>file).subscribe((response) => {
+ console.log(response);
+ });
+ break;
+ case FolderType.Model:
+ this.modelsService.deleteModel(<Model>file).subscribe((response) => {
+ console.log(response);
+ });
+ break;
+ case FolderType.Experiment:
+ // this.experimentsService.deleteExperiment(<Model>file).subscribe((response) => {
+ // console.log(response);
+ // });
+ //todo delete za predictor
+ break;
+ }
}
folders: { [tab: number]: FolderFile[] } = {};
diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts
index 5e088e46..62afaa47 100644
--- a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts
+++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts
@@ -5,7 +5,7 @@ import { ModelsService } from 'src/app/_services/models.service';
import shared from 'src/app/Shared';
import { DatatableComponent, TableData } from '../datatable/datatable.component';
import { CsvParseService } from 'src/app/_services/csv-parse.service';
-import {FormControl, Validators} from '@angular/forms';
+import { FormControl, Validators } from '@angular/forms';
@Component({
selector: 'app-form-dataset',
@@ -18,7 +18,7 @@ export class FormDatasetComponent {
nameFormControl = new FormControl('', [Validators.required, Validators.email]);
- delimiterOptions: Array<string> = [",", ";", "|", "razmak", "novi red"]; //podrazumevano ","
+ delimiterOptions: Array<string> = [",", ";", "|", "razmak", "novi red"]; //podrazumevano ","
csvRecords: any[] = [];
files: File[] = [];
@@ -29,7 +29,7 @@ export class FormDatasetComponent {
tableData: TableData = new TableData();
- @ViewChild('fileInput') fileInput! : ElementRef
+ @ViewChild('fileInput') fileInput!: ElementRef
filename: String;
@@ -65,7 +65,7 @@ export class FormDatasetComponent {
if (typeof fileReader.result === 'string') {
const result = this.csv.csvToArray(fileReader.result, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "novi red") ? "\t" : this.dataset.delimiter)
-
+
this.csvRecords = result.splice(0, 11);
this.colsNumber = result[0].length;
@@ -91,28 +91,28 @@ export class FormDatasetComponent {
this.dataset.accessibleByLink = true;
}
- uploadDataset() {
+ uploadDataset(onSuccess: Function = (dataset: Dataset) => { }, onError: Function = () => { }) {
if (this.files[0] == undefined) {
shared.openDialog("Greška", "Niste izabrali fajl za učitavanje.");
return;
}
- this.modelsService.uploadData(this.files[0]).subscribe((file) => {
+ return this.modelsService.uploadData(this.files[0]).subscribe((file) => {
//console.log('ADD MODEL: STEP 2 - ADD DATASET WITH FILE ID ' + file._id);
this.dataset._id = "";
this.dataset.fileId = file._id;
this.dataset.uploaderId = shared.userId;
this.datasetsService.addDataset(this.dataset).subscribe((dataset) => {
- shared.openDialog("Obaveštenje", "Uspešno ste dodali novi izvor podataka u kolekciju. Molimo sačekajte par trenutaka da se procesira.");
+ onSuccess();
}, (error) => {
- shared.openDialog("Neuspeo pokušaj!", "Izvor podataka sa unetim nazivom već postoji u Vašoj kolekciji. Izmenite naziv ili iskoristite postojeći dataset.");
+ onError();
}); //kraj addDataset subscribe
}, (error) => {
-
+ onError();
}); //kraj uploadData subscribe
}
-
+
}
diff --git a/frontend/src/app/_elements/form-model/form-model.component.ts b/frontend/src/app/_elements/form-model/form-model.component.ts
index ef456547..71b374b0 100644
--- a/frontend/src/app/_elements/form-model/form-model.component.ts
+++ b/frontend/src/app/_elements/form-model/form-model.component.ts
@@ -135,7 +135,4 @@ export class FormModelComponent implements AfterViewInit {
updateTestSet(event: MatSliderChange) {
this.testSetDistribution = event.value!;
}
-
-
-
}