diff options
author | Danijel Andjelkovic <adanijel99@gmail.com> | 2022-03-17 00:32:49 +0100 |
---|---|---|
committer | Danijel Andjelkovic <adanijel99@gmail.com> | 2022-03-17 00:32:49 +0100 |
commit | e22b83919e6442dfb55d7953d9227268c850adf8 (patch) | |
tree | ca922587fd336293b4af2ecf2a61d47bd6d1dfd1 | |
parent | eceb0d7b3623646875b0ca34162fb619a455af15 (diff) |
Napravio neophodne izmene tako da backend i frontend komuniciraju uspesno.
-rw-r--r-- | backend/api/api/Data/UserStoreDatabaseSettings.cs | 1 | ||||
-rw-r--r-- | backend/api/api/Interfaces/IUserStoreDatabaseSettings.cs | 3 | ||||
-rw-r--r-- | backend/api/api/Models/Dataset.cs | 2 | ||||
-rw-r--r-- | backend/api/api/Models/Model.cs | 8 | ||||
-rw-r--r-- | backend/api/api/Models/Predictor.cs | 1 | ||||
-rw-r--r-- | backend/api/api/Services/ModelService.cs | 2 | ||||
-rw-r--r-- | backend/api/api/api.csproj | 1 | ||||
-rw-r--r-- | frontend/src/app/Shared.ts | 3 | ||||
-rw-r--r-- | frontend/src/app/_data/Dataset.ts | 4 | ||||
-rw-r--r-- | frontend/src/app/_data/Model.ts | 4 | ||||
-rw-r--r-- | frontend/src/app/_data/Predictor.ts | 1 | ||||
-rw-r--r-- | frontend/src/app/_pages/add-model/add-model.component.html | 147 | ||||
-rw-r--r-- | frontend/src/app/_pages/add-model/add-model.component.ts | 37 | ||||
-rw-r--r-- | frontend/src/app/_services/auth.service.ts | 3 | ||||
-rw-r--r-- | frontend/src/app/_services/models.service.ts | 15 |
15 files changed, 129 insertions, 103 deletions
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<Model>(settings.PredictorCollectionName); + _model = database.GetCollection<Model>(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 @@ <ItemGroup> <Folder Include="UploadedFiles\" /> + <Folder Include="UploadedFiles\tester1\" /> </ItemGroup> </Project> 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 @@ </div> <div id="wrapper"> - + <div id="container" class="container p-5" style="background-color: white; min-height: 100%;"> - - <div class="form-group row mb-4 d-flex justify-content-center"> <!--justify-content-center--> + + <div class="form-group row mb-4 d-flex justify-content-center"> + <!--justify-content-center--> <h2 class="col-2"> Nov model: </h2> <div class="col-3"> - <label for="name" class="col-form-label">Naziv modela:</label> - <input type="text" class="form-control" name="name" placeholder="Naziv..." - [(ngModel)]="newModel.name"> + <label for="name" class="col-form-label">Naziv modela:</label> + <input type="text" class="form-control" name="name" placeholder="Naziv..." [(ngModel)]="newModel.name"> </div> <div class="col-5"> <label for="desc" class="col-sm-2 col-form-label">Opis:</label> @@ -25,7 +25,7 @@ value="{{newModel.dateCreated | date: 'dd/MM/yyyy'}}" readonly> </div> </div> - + <div class="mt-5 justify-content-center"> <h2>Izvor podataka:</h2> <app-dataset-load id="dataset" (loaded)="datasetLoaded = true"></app-dataset-load> @@ -33,37 +33,41 @@ <div *ngIf="datasetLoaded"> <div *ngIf="datasetLoadComponent" class="row"> - <div class="col d-flex justify-content-center"> - <h3>Izaberite ulazne kolone:</h3> - <div id="divInputs" class="form-check mt-2"> - <br> - <div *ngFor="let item of datasetLoadComponent.dataset.header; let i = index"> - <input *ngIf="i == 0" class="form-check-input" type="checkbox" value="{{item}}" id="cb_{{item}}" name="cbs" checked> - <input *ngIf="i != 0" class="form-check-input" type="checkbox" value="{{item}}" id="cb_{{item}}" name="cbs"> - <label class="form-check-label" for="cb_{{item}}"> - {{item}} - </label> - </div> - </div> - </div> - <div class="col d-flex justify-content-left"> - <h3>Izaberite izlaznu kolonu:</h3> - <div id="divOutputs" class="form-check mt-2"> - <br> - <div *ngFor="let item of datasetLoadComponent.dataset.header; let i = index"> - <input *ngIf="i == 0" class="form-check-input" type="radio" value="{{item}}" id="rb_{{item}}" name="rbs" checked> - <input *ngIf="i != 0" class="form-check-input" type="radio" value="{{item}}" id="rb_{{item}}" name="rbs"> - <label class="form-check-label" for="rb_{{item}}"> - {{item}} - </label> - </div> - </div> - </div> + <div class="col d-flex justify-content-center"> + <h3>Izaberite ulazne kolone:</h3> + <div id="divInputs" class="form-check mt-2"> + <br> + <div *ngFor="let item of datasetLoadComponent.dataset.header; let i = index"> + <input *ngIf="i == 0" class="form-check-input" type="checkbox" value="{{item}}" + id="cb_{{item}}" name="cbs" checked> + <input *ngIf="i != 0" class="form-check-input" type="checkbox" value="{{item}}" + id="cb_{{item}}" name="cbs"> + <label class="form-check-label" for="cb_{{item}}"> + {{item}} + </label> + </div> + </div> + </div> + <div class="col d-flex justify-content-left"> + <h3>Izaberite izlaznu kolonu:</h3> + <div id="divOutputs" class="form-check mt-2"> + <br> + <div *ngFor="let item of datasetLoadComponent.dataset.header; let i = index"> + <input *ngIf="i == 0" class="form-check-input" type="radio" value="{{item}}" + id="rb_{{item}}" name="rbs" checked> + <input *ngIf="i != 0" class="form-check-input" type="radio" value="{{item}}" + id="rb_{{item}}" name="rbs"> + <label class="form-check-label" for="rb_{{item}}"> + {{item}} + </label> + </div> + </div> + </div> </div> </div> - - + + <h2 class="mt-5 mb-4">Parametri treniranja:</h2> <div> @@ -87,7 +91,8 @@ <label for="hiddenLayers" class="col-form-label">Broj skrivenih slojeva: </label> </div> <div class="col-1"> - <input type="number" min="1" class="form-control" name="hiddenLayers" [(ngModel)]="newModel.hiddenLayers"> + <input type="number" min="1" class="form-control" name="hiddenLayers" + [(ngModel)]="newModel.hiddenLayers"> </div> </div> @@ -111,7 +116,8 @@ <label for="hiddenLayerNeurons" class="col-form-label">Broj neurona skrivenih slojeva: </label> </div> <div class="col-1"> - <input type="number" min="1" class="form-control" name="hiddenLayerNeurons" [(ngModel)]="newModel.hiddenLayerNeurons"> + <input type="number" min="1" class="form-control" name="hiddenLayerNeurons" + [(ngModel)]="newModel.hiddenLayerNeurons"> </div> </div> @@ -123,7 +129,8 @@ </div> <div class="col-2"> <select id=optimizerOptions class="form-control" name="optimizer" [(ngModel)]="newModel.optimizer"> - <option *ngFor="let option of Object.keys(Optimizer); let optionName of Object.values(Optimizer)" + <option + *ngFor="let option of Object.keys(Optimizer); let optionName of Object.values(Optimizer)" [value]="option"> {{ optionName }} </option> @@ -146,8 +153,10 @@ <label for="lossFunction" class="col-form-label">Funkcija obrade gubitka: </label> </div> <div class="col-2"> - <select id=lossFunctionOptions class="form-control" name="lossFunction" [(ngModel)]="newModel.lossFunction"> - <option *ngFor="let option of Object.keys(LossFunction); let optionName of Object.values(LossFunction)" + <select id=lossFunctionOptions class="form-control" name="lossFunction" + [(ngModel)]="newModel.lossFunction"> + <option + *ngFor="let option of Object.keys(LossFunction); let optionName of Object.values(LossFunction)" [value]="option"> {{ optionName }} </option> @@ -157,7 +166,8 @@ </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> + <input class="mx-3 form-check-input" type="checkbox" [(ngModel)]="newModel.randomOrder" + type="checkbox" value="" checked> </div> <div class="col-1"> </div> @@ -167,17 +177,18 @@ <div class="col-1"> </div> <div class="col-3"> - <label for="inputLayerActivationFunction" class="col-form-label">Funkcija aktivacije ulaznog sloja:</label> + <label for="inputLayerActivationFunction" class="col-form-label">Funkcija aktivacije ulaznog + sloja:</label> </div> <div class="col-2"> - <select id=inputLayerActivationFunctionOptions class="form-control" name="inputLayerActivationFunction" - [(ngModel)]="newModel.inputLayerActivationFunction"> - <option - *ngFor="let option of Object.keys(ActivationFunction); let optionName of Object.values(ActivationFunction)" - [value]="option"> - {{ optionName }} - </option> - </select> + <select id=inputLayerActivationFunctionOptions class="form-control" + name="inputLayerActivationFunction" [(ngModel)]="newModel.inputLayerActivationFunction"> + <option + *ngFor="let option of Object.keys(ActivationFunction); let optionName of Object.values(ActivationFunction)" + [value]="option"> + {{ optionName }} + </option> + </select> </div> <div class="col-1"> </div> @@ -188,7 +199,7 @@ </label> test <mat-slider min="0.1" max="0.9" step="0.1" value="0.2" name="randomTestSetDistribution" thumbLabel - [disabled]="!newModel.randomTestSet" [(ngModel)]="newModel.randomTestSetDistribution"> + [disabled]="!newModel.randomTestSet" [(ngModel)]="newModel.randomTestSetDistribution"> </mat-slider> trening </div> @@ -200,16 +211,17 @@ <div class="col-1"> </div> <div class="col-3"> - <label for="hiddenLayerActivationFunction" class="col-form-label">Funkcija aktivacije skrivenih slojeva:</label> + <label for="hiddenLayerActivationFunction" class="col-form-label">Funkcija aktivacije skrivenih + slojeva:</label> </div> <div class="col-2"> - <select id=hiddenLayerActivationFunctionOptions class="form-control" name="hiddenLayerActivationFunction" - [(ngModel)]="newModel.hiddenLayerActivationFunction"> - <option - *ngFor="let option of Object.keys(ActivationFunction); let optionName of Object.values(ActivationFunction)" - [value]="option"> - {{ optionName }} - </option> + <select id=hiddenLayerActivationFunctionOptions class="form-control" + name="hiddenLayerActivationFunction" [(ngModel)]="newModel.hiddenLayerActivationFunction"> + <option + *ngFor="let option of Object.keys(ActivationFunction); let optionName of Object.values(ActivationFunction)" + [value]="option"> + {{ optionName }} + </option> </select> </div> <div class="col"> @@ -222,11 +234,12 @@ <div class="col-1"> </div> <div class="col-3"> - <label for="outputLayerActivationFunction" class="col-form-label">Funkcija aktivacije izlaznog sloja:</label> + <label for="outputLayerActivationFunction" class="col-form-label">Funkcija aktivacije izlaznog + sloja:</label> </div> <div class="col-2"> - <select id=outputLayerActivationFunctionOptions class="form-control" name="outputLayerActivationFunction" - [(ngModel)]="newModel.outputLayerActivationFunction"> + <select id=outputLayerActivationFunctionOptions class="form-control" + name="outputLayerActivationFunction" [(ngModel)]="newModel.outputLayerActivationFunction"> <option *ngFor="let option of Object.keys(ActivationFunction); let optionName of Object.values(ActivationFunction)" [value]="option"> @@ -245,13 +258,13 @@ <br><br> <div class="form-group row mt-5 mb-3"> <div class="col"></div> - <button class="btn btn-lg col-4" style="background-color:#003459; color:white;" (click)="addModel();">Sačuvaj model</button> + <button class="btn btn-lg col-4" style="background-color:#003459; color:white;" + (click)="addModel();">Sačuvaj model</button> <div class="col"></div> - <button class="btn btn-lg col-4" style="background-color:#003459; color:white;" (click)="trainModel();">Treniraj model</button> + <button class="btn btn-lg col-4 disabled" style="background-color:#003459; color:white;" + (click)="trainModel();">Treniraj model</button> <div class="col"></div> </div> </div> -</div> - - +</div>
\ 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<any> { 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<any> { + 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<any> { + return this.http.post(`${API_SETTINGS.apiURL}/model/train`, modelId, { headers: this.authService.authHeader() }); } } |