From 7aa1719639bb0a90114cca2c9a95e58bef22eef0 Mon Sep 17 00:00:00 2001 From: Danijel Andjelkovic Date: Wed, 16 Mar 2022 23:05:56 +0100 Subject: Dodao upload file zahtev u ModelsService. --- .../app/_pages/add-model/add-model.component.ts | 35 ++++++++++++++-------- 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'frontend/src/app/_pages/add-model/add-model.component.ts') diff --git a/frontend/src/app/_pages/add-model/add-model.component.ts b/frontend/src/app/_pages/add-model/add-model.component.ts index c18ad324..ac513738 100644 --- a/frontend/src/app/_pages/add-model/add-model.component.ts +++ b/frontend/src/app/_pages/add-model/add-model.component.ts @@ -32,15 +32,26 @@ export class AddModelComponent implements OnInit { } addModel() { - if (this.datasetLoadComponent) - this.models.addDataset(this.datasetLoadComponent?.dataset); - - this.getCheckedInputCols(); - this.getCheckedOutputCol(); - if (this.validationInputsOutput()) - this.models.addModel(this.newModel).subscribe((response) => { - console.log(response); + console.log('ADD MODEL: STEP 1 - UPLOAD FILE'); + if (this.datasetLoadComponent) { + this.models.uploadData(this.datasetLoadComponent.files[0]).subscribe((fileId) => { + console.log('ADD MODEL: STEP 2 - ADD DATASET WITH FILE ID ' + fileId); + if (this.datasetLoadComponent) { + this.datasetLoadComponent.dataset.fileId = fileId; + this.models.addDataset(this.datasetLoadComponent.dataset).subscribe((datasetId) => { + console.log('ADD MODEL: STEP 3 - ADD MODEL WITH DATASET ID ' + datasetId); + this.newModel.datasetId = datasetId; + this.getCheckedInputCols(); + this.getCheckedOutputCol(); + if (this.validationInputsOutput()) + this.models.addModel(this.newModel).subscribe((response) => { + console.log('ADD MODEL: DONE! REPLY:\n' + response); + }); + } + ); + } }); + } } getCheckedInputCols() { @@ -62,17 +73,17 @@ export class AddModelComponent implements OnInit { let thatRb = radiobuttons[i]; if (thatRb.checked) { this.newModel.columnToPredict = thatRb.value; - break; + break; } } //console.log(this.checkedOutputCol); } - validationInputsOutput() : boolean { + validationInputsOutput(): boolean { if (this.newModel.inputColumns.length == 0) { alert("Molimo Vas da izaberete ulaznu kolonu/kolone za mrežu.") return false; - } - for (let i = 0; i < this.newModel.inputColumns.length; i++) { + } + for (let i = 0; i < this.newModel.inputColumns.length; i++) { if (this.newModel.inputColumns[i] == this.newModel.columnToPredict) { let colName = this.newModel.columnToPredict; alert("Izabrali ste istu kolonu (" + colName + ") kao ulaznu i izlaznu iz mreže. Korigujte izbor."); -- cgit v1.2.3 From 1c90c87522971d3ff2ba55c2a37b5a538abec315 Mon Sep 17 00:00:00 2001 From: Danijel Andjelkovic Date: Wed, 16 Mar 2022 23:27:40 +0100 Subject: File upload fix --- .../dataset-load/dataset-load.component.ts | 41 +++++++++++----------- .../app/_pages/add-model/add-model.component.ts | 2 +- frontend/src/app/_services/models.service.ts | 3 +- 3 files changed, 24 insertions(+), 22 deletions(-) (limited to 'frontend/src/app/_pages/add-model/add-model.component.ts') 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 8465c3d6..913592eb 100644 --- a/frontend/src/app/_elements/dataset-load/dataset-load.component.ts +++ b/frontend/src/app/_elements/dataset-load/dataset-load.component.ts @@ -19,7 +19,7 @@ export class DatasetLoadComponent { slice: string = ""; csvRecords: any[] = []; - files: any[] = []; + files: File[] = []; rowsNumber: number = 0; colsNumber: number = 0; @@ -33,6 +33,7 @@ export class DatasetLoadComponent { changeListener($event: any): void { this.files = $event.srcElement.files; + console.log(this.files); this.update(); } @@ -41,25 +42,25 @@ export class DatasetLoadComponent { if (this.files.length < 1) return; - this.ngxCsvParser.parse(this.files[0], { header: false, delimiter: (this.delimiter == "razmak") ? " " : (this.delimiter == "") ? "," : this.delimiter}) - .pipe().subscribe((result) => { - - console.log('Result', result); - if (result.constructor === Array) { - this.csvRecords = result; - if (this.hasHeader) - this.rowsNumber = this.csvRecords.length - 1; - else - this.rowsNumber = this.csvRecords.length; - this.colsNumber = this.csvRecords[0].length; - - this.dataset.header = this.csvRecords[0]; - - this.loaded.emit("loaded"); - } - }, (error: NgxCSVParserError) => { - console.log('Error', error); - }); + this.ngxCsvParser.parse(this.files[0], { header: false, delimiter: (this.delimiter == "razmak") ? " " : (this.delimiter == "") ? "," : this.delimiter }) + .pipe().subscribe((result) => { + + console.log('Result', result); + if (result.constructor === Array) { + this.csvRecords = result; + if (this.hasHeader) + this.rowsNumber = this.csvRecords.length - 1; + else + this.rowsNumber = this.csvRecords.length; + this.colsNumber = this.csvRecords[0].length; + + this.dataset.header = this.csvRecords[0]; + + this.loaded.emit("loaded"); + } + }, (error: NgxCSVParserError) => { + console.log('Error', error); + }); } } diff --git a/frontend/src/app/_pages/add-model/add-model.component.ts b/frontend/src/app/_pages/add-model/add-model.component.ts index 4e315510..76a09782 100644 --- a/frontend/src/app/_pages/add-model/add-model.component.ts +++ b/frontend/src/app/_pages/add-model/add-model.component.ts @@ -33,7 +33,7 @@ export class AddModelComponent implements OnInit { } addModel() { - this.saveModel(false).subscribe(); //trajno cuvanje + this.saveModel(false); //trajno cuvanje } trainModel() { diff --git a/frontend/src/app/_services/models.service.ts b/frontend/src/app/_services/models.service.ts index 25a37e3a..e9a5ee18 100644 --- a/frontend/src/app/_services/models.service.ts +++ b/frontend/src/app/_services/models.service.ts @@ -23,6 +23,7 @@ export class ModelsService { const options = { params: params, reportProgress: true, + headers: this.authService.authHeader() }; const req = new HttpRequest('POST', `${API_SETTINGS.apiURL}/file/csv`, formData, options); @@ -30,7 +31,7 @@ export class ModelsService { } addModel(model: Model) { - return this.http.post(`${API_SETTINGS.apiURL}/model/add`, model, { headers: this.authService.authHeader(), responseType: 'text' }); + return this.http.post(`${API_SETTINGS.apiURL}/model/add`, model, { headers: this.authService.authHeader() }); } addDataset(dataset: Dataset) { return this.http.post(`${API_SETTINGS.apiURL}/dataset/add`, dataset, { headers: this.authService.authHeader(), responseType: 'text' }); -- cgit v1.2.3 From e22b83919e6442dfb55d7953d9227268c850adf8 Mon Sep 17 00:00:00 2001 From: Danijel Andjelkovic Date: Thu, 17 Mar 2022 00:32:49 +0100 Subject: Napravio neophodne izmene tako da backend i frontend komuniciraju uspesno. --- backend/api/api/Data/UserStoreDatabaseSettings.cs | 1 + .../api/Interfaces/IUserStoreDatabaseSettings.cs | 3 +- backend/api/api/Models/Dataset.cs | 2 +- backend/api/api/Models/Model.cs | 8 +- backend/api/api/Models/Predictor.cs | 1 - backend/api/api/Services/ModelService.cs | 2 +- backend/api/api/api.csproj | 1 + frontend/src/app/Shared.ts | 3 +- frontend/src/app/_data/Dataset.ts | 4 +- frontend/src/app/_data/Model.ts | 4 +- frontend/src/app/_data/Predictor.ts | 1 + .../app/_pages/add-model/add-model.component.html | 147 +++++++++++---------- .../app/_pages/add-model/add-model.component.ts | 37 +++--- frontend/src/app/_services/auth.service.ts | 3 +- frontend/src/app/_services/models.service.ts | 15 +-- 15 files changed, 129 insertions(+), 103 deletions(-) (limited to 'frontend/src/app/_pages/add-model/add-model.component.ts') diff --git a/backend/api/api/Data/UserStoreDatabaseSettings.cs b/backend/api/api/Data/UserStoreDatabaseSettings.cs index 6841a3e0..e83d2b54 100644 --- a/backend/api/api/Data/UserStoreDatabaseSettings.cs +++ b/backend/api/api/Data/UserStoreDatabaseSettings.cs @@ -11,6 +11,7 @@ namespace api.Data public string CollectionName { get; set; } = String.Empty; public string DatasetCollectionName { get; set; } = String.Empty; public string PredictorCollectionName { get; set; } = String.Empty; + public string ModelCollectionName { get; set; } = String.Empty; public string FilesCollectionName { get; set; } = String.Empty; } } diff --git a/backend/api/api/Interfaces/IUserStoreDatabaseSettings.cs b/backend/api/api/Interfaces/IUserStoreDatabaseSettings.cs index 94d3e1fc..a5b5f5eb 100644 --- a/backend/api/api/Interfaces/IUserStoreDatabaseSettings.cs +++ b/backend/api/api/Interfaces/IUserStoreDatabaseSettings.cs @@ -6,7 +6,8 @@ string DatabaseName { get; set; } string CollectionName { get; set; } string DatasetCollectionName { get; set; } - string PredictorCollectionName { get; } + string PredictorCollectionName { get; set; } + string ModelCollectionName { get; set; } string FilesCollectionName { get; set; } } } diff --git a/backend/api/api/Models/Dataset.cs b/backend/api/api/Models/Dataset.cs index 70092bd2..d4649c17 100644 --- a/backend/api/api/Models/Dataset.cs +++ b/backend/api/api/Models/Dataset.cs @@ -6,7 +6,7 @@ namespace api.Models { public class Dataset { - public string username; + public string username { get; set; } [BsonId] [BsonRepresentation(BsonType.ObjectId)]//mongo data type to .net diff --git a/backend/api/api/Models/Model.cs b/backend/api/api/Models/Model.cs index 7b22ded8..dfc4336a 100644 --- a/backend/api/api/Models/Model.cs +++ b/backend/api/api/Models/Model.cs @@ -21,11 +21,11 @@ namespace api.Models public string datasetId { get; set; } //Test set settings - public int[] inputColumns { get; set; } - public int columnToPredict { get; set; } - public bool radnomOrder {get;set;} + public string[] inputColumns { get; set; } + public string columnToPredict { get; set; } + public bool randomOrder {get;set;} public bool randomTestSet { get; set; } - public int randomTestSetDistribution { get; set; } + public float randomTestSetDistribution { get; set; } //Neural net training public string type { get; set; } diff --git a/backend/api/api/Models/Predictor.cs b/backend/api/api/Models/Predictor.cs index 638495bd..cd2f4557 100644 --- a/backend/api/api/Models/Predictor.cs +++ b/backend/api/api/Models/Predictor.cs @@ -10,7 +10,6 @@ namespace api.Models [BsonRepresentation(BsonType.ObjectId)]//mongo data type to .net public string _id { get; set; } public string username { get; set; } - public string name { get; set; } public string description { get; set; } public string[] inputs { get; set; } diff --git a/backend/api/api/Services/ModelService.cs b/backend/api/api/Services/ModelService.cs index a3939b29..2ba3c54d 100644 --- a/backend/api/api/Services/ModelService.cs +++ b/backend/api/api/Services/ModelService.cs @@ -13,7 +13,7 @@ namespace api.Services public ModelService(IUserStoreDatabaseSettings settings, IMongoClient mongoClient) { var database = mongoClient.GetDatabase(settings.DatabaseName); - _model = database.GetCollection(settings.PredictorCollectionName); + _model = database.GetCollection(settings.ModelCollectionName); } public Model Create(Model model) diff --git a/backend/api/api/api.csproj b/backend/api/api/api.csproj index f38621ca..f63407ca 100644 --- a/backend/api/api/api.csproj +++ b/backend/api/api/api.csproj @@ -22,6 +22,7 @@ + diff --git a/frontend/src/app/Shared.ts b/frontend/src/app/Shared.ts index 126dc846..0adcd4d6 100644 --- a/frontend/src/app/Shared.ts +++ b/frontend/src/app/Shared.ts @@ -1,6 +1,7 @@ class Shared { constructor( - public loggedIn: boolean + public loggedIn: boolean, + public username: string = '' ) { } } diff --git a/frontend/src/app/_data/Dataset.ts b/frontend/src/app/_data/Dataset.ts index aaee50eb..6e6cbffe 100644 --- a/frontend/src/app/_data/Dataset.ts +++ b/frontend/src/app/_data/Dataset.ts @@ -1,4 +1,5 @@ export default class Dataset { + _id: string = ''; constructor( public name: string = 'Novi izvor podataka', public description: string = '', @@ -8,6 +9,7 @@ export default class Dataset { public isPublic: boolean = false, public accessibleByLink: boolean = false, public dateCreated: Date = new Date(), - public lastUpdated: Date = new Date() + public lastUpdated: Date = new Date(), + public username: string = 'tester1' ) { } } \ No newline at end of file diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts index c0bc339d..a891c10c 100644 --- a/frontend/src/app/_data/Model.ts +++ b/frontend/src/app/_data/Model.ts @@ -1,4 +1,5 @@ export default class Model { + _id: string = ''; constructor( public name: string = 'Novi model', public description: string = '', @@ -24,7 +25,8 @@ export default class Model { public batchSize: number = 5, public inputLayerActivationFunction: ActivationFunction = ActivationFunction.Sigmoid, public hiddenLayerActivationFunction: ActivationFunction = ActivationFunction.Sigmoid, - public outputLayerActivationFunction: ActivationFunction = ActivationFunction.Sigmoid + public outputLayerActivationFunction: ActivationFunction = ActivationFunction.Sigmoid, + public username: string = '' ) { } } diff --git a/frontend/src/app/_data/Predictor.ts b/frontend/src/app/_data/Predictor.ts index 05b993f1..7e902eae 100644 --- a/frontend/src/app/_data/Predictor.ts +++ b/frontend/src/app/_data/Predictor.ts @@ -1,4 +1,5 @@ export default class Predictor { + _id: string = ''; constructor( public name: string = 'Novi prediktor', public description: string = '', diff --git a/frontend/src/app/_pages/add-model/add-model.component.html b/frontend/src/app/_pages/add-model/add-model.component.html index 004f308b..c6f21f1e 100644 --- a/frontend/src/app/_pages/add-model/add-model.component.html +++ b/frontend/src/app/_pages/add-model/add-model.component.html @@ -3,15 +3,15 @@
- +
- -
+ +
+

Nov model:

- - + +
@@ -25,7 +25,7 @@ value="{{newModel.dateCreated | date: 'dd/MM/yyyy'}}" readonly>
- +

Izvor podataka:

@@ -33,37 +33,41 @@
-
-

Izaberite ulazne kolone:

-
-
-
- -   - -
-
-
-
-

Izaberite izlaznu kolonu:

-
-
-
- -   - -
-
-
+
+

Izaberite ulazne kolone:

+
+
+
+ +   + +
+
+
+
+

Izaberite izlaznu kolonu:

+
+
+
+ +   + +
+
+
- - + +

Parametri treniranja:

@@ -87,7 +91,8 @@
- +
@@ -111,7 +116,8 @@
- +
@@ -123,7 +129,8 @@
- @@ -157,7 +166,8 @@
- +
@@ -167,17 +177,18 @@
- +
- +
@@ -188,7 +199,7 @@      test + [disabled]="!newModel.randomTestSet" [(ngModel)]="newModel.randomTestSetDistribution"> trening @@ -200,16 +211,17 @@
- +
- +
@@ -222,11 +234,12 @@
- +
-
-
- - + \ No newline at end of file diff --git a/frontend/src/app/_pages/add-model/add-model.component.ts b/frontend/src/app/_pages/add-model/add-model.component.ts index 76a09782..a4cabb82 100644 --- a/frontend/src/app/_pages/add-model/add-model.component.ts +++ b/frontend/src/app/_pages/add-model/add-model.component.ts @@ -4,6 +4,7 @@ import Model from 'src/app/_data/Model'; import { ANNType, Encoding, ActivationFunction, LossFunction, Optimizer } from 'src/app/_data/Model'; import { DatasetLoadComponent } from 'src/app/_elements/dataset-load/dataset-load.component'; import { ModelsService } from 'src/app/_services/models.service'; +import shared from 'src/app/Shared'; @Component({ @@ -24,6 +25,7 @@ export class AddModelComponent implements OnInit { LossFunction = LossFunction; Optimizer = Optimizer; Object = Object; + shared = shared; constructor(private models: ModelsService) { this.newModel = new Model(); @@ -44,24 +46,27 @@ export class AddModelComponent implements OnInit { } saveModel(temporary: boolean): any { - console.log('ADD MODEL: STEP 1 - UPLOAD FILE'); - if (this.datasetLoadComponent) { - this.models.uploadData(this.datasetLoadComponent.files[0]).subscribe((fileId) => { - console.log('ADD MODEL: STEP 2 - ADD DATASET WITH FILE ID ' + fileId); - if (this.datasetLoadComponent) { - this.datasetLoadComponent.dataset.fileId = fileId; - this.models.addDataset(this.datasetLoadComponent.dataset).subscribe((datasetId) => { - console.log('ADD MODEL: STEP 3 - ADD MODEL WITH DATASET ID ' + datasetId); - this.newModel.datasetId = datasetId; - this.getCheckedInputCols(); - this.getCheckedOutputCol(); - if (this.validationInputsOutput()) + this.getCheckedInputCols(); + this.getCheckedOutputCol(); + if (this.validationInputsOutput()) { + console.log('ADD MODEL: STEP 1 - UPLOAD FILE'); + if (this.datasetLoadComponent) { + this.models.uploadData(this.datasetLoadComponent.files[0]).subscribe((file) => { + console.log('ADD MODEL: STEP 2 - ADD DATASET WITH FILE ID ' + file._id); + if (this.datasetLoadComponent) { + this.datasetLoadComponent.dataset.fileId = file._id; + this.datasetLoadComponent.dataset.username = shared.username; + this.models.addDataset(this.datasetLoadComponent.dataset).subscribe((dataset) => { + console.log('ADD MODEL: STEP 3 - ADD MODEL WITH DATASET ID ', dataset._id); + this.newModel.datasetId = dataset._id; + this.newModel.username = shared.username; this.models.addModel(this.newModel).subscribe((response) => { - console.log('ADD MODEL: DONE! REPLY:\n' + response); + console.log('ADD MODEL: DONE! REPLY:\n', response); }); - }); - } - }); + }); + } + }); + } } } diff --git a/frontend/src/app/_services/auth.service.ts b/frontend/src/app/_services/auth.service.ts index afc1567b..20ff45f3 100644 --- a/frontend/src/app/_services/auth.service.ts +++ b/frontend/src/app/_services/auth.service.ts @@ -46,7 +46,7 @@ export class AuthService { this.http.post(`${API_SETTINGS.apiURL}/auth/renewJwt`, {}, { headers: this.authHeader(), responseType: 'text' }).subscribe((response) => { this.authenticate(response); }); - }, exp.getTime() - new Date().getTime()); + }, exp.getTime() - new Date().getTime() - 60000); } authenticate(token: string) { @@ -62,6 +62,7 @@ export class AuthService { if (this.cookie.check('token')) { const token = this.cookie.get('token'); this.shared.loggedIn = this.isAuthenticated(); + this.shared.username = jwtHelper.decodeToken(token).name; this.enableAutoRefresh(); } } diff --git a/frontend/src/app/_services/models.service.ts b/frontend/src/app/_services/models.service.ts index e9a5ee18..8299016b 100644 --- a/frontend/src/app/_services/models.service.ts +++ b/frontend/src/app/_services/models.service.ts @@ -22,21 +22,20 @@ export class ModelsService { const options = { params: params, - reportProgress: true, + reportProgress: false, headers: this.authService.authHeader() }; - const req = new HttpRequest('POST', `${API_SETTINGS.apiURL}/file/csv`, formData, options); - return this.http.request(req); + return this.http.post(`${API_SETTINGS.apiURL}/file/csv`, formData, options); } - addModel(model: Model) { + addModel(model: Model): Observable { return this.http.post(`${API_SETTINGS.apiURL}/model/add`, model, { headers: this.authService.authHeader() }); } - addDataset(dataset: Dataset) { - return this.http.post(`${API_SETTINGS.apiURL}/dataset/add`, dataset, { headers: this.authService.authHeader(), responseType: 'text' }); + addDataset(dataset: Dataset): Observable { + return this.http.post(`${API_SETTINGS.apiURL}/dataset/add`, dataset, { headers: this.authService.authHeader() }); } - trainModel(modelId: string) { - return this.http.post(`${API_SETTINGS.apiURL}/model/train`, modelId, { headers: this.authService.authHeader(), responseType: 'text' }); + trainModel(modelId: string): Observable { + return this.http.post(`${API_SETTINGS.apiURL}/model/train`, modelId, { headers: this.authService.authHeader() }); } } -- cgit v1.2.3